From cd6099ee802331590160d97238f470f15e384710 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Fri, 11 Nov 2022 11:55:27 +0100 Subject: [PATCH 01/31] Node: Compile TypeScript code on postinstall - Let's remove JavaScript compiled code from the repository. - So move `typescript` dependency from `devDependencies` to `dependencies`. --- .gitattributes | 1 - .gitignore | 1 + CHANGELOG.md | 5 +++++ npm-scripts.js | 2 ++ package.json | 4 ++-- 5 files changed, 10 insertions(+), 3 deletions(-) diff --git a/.gitattributes b/.gitattributes index 9fc99edeb7..49ac7d6723 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,7 +1,6 @@ # Tell GitHub to ignore some folders when detecting the project language. art/* linguist-vendored=true doc/* linguist-vendored=true -node/lib/* linguist-vendored=true node/test/* linguist-vendored=true rust/benches/* linguist-vendored=true rust/examples/* linguist-vendored=true diff --git a/.gitignore b/.gitignore index b6cf3cafc0..af1154fc9c 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ ## Node. /node_modules/ +/node/lib/ ## Rust. /Cargo.lock diff --git a/CHANGELOG.md b/CHANGELOG.md index 1f106bba84..8ae957cce5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,11 @@ # Changelog +### NEXT + +* Node: Compile TypeScript code on `postinstall` (PR #). + + ### 3.11.3 * `ChannelMessageHandlers`: Make `RegisterHandler()` not remove the existing handler if another one with same `id` is given (PR #952). diff --git a/npm-scripts.js b/npm-scripts.js index 1540fb593d..b665411535 100644 --- a/npm-scripts.js +++ b/npm-scripts.js @@ -118,6 +118,8 @@ switch (task) case 'postinstall': { + execute('node npm-scripts.js typescript:build'); + if (!process.env.MEDIASOUP_WORKER_BIN) { execute('node npm-scripts.js worker:build'); diff --git a/package.json b/package.json index 999ceac134..c3efd0e4b1 100644 --- a/package.json +++ b/package.json @@ -73,6 +73,7 @@ "debug": "^4.3.4", "h264-profile-level-id": "^1.0.1", "supports-color": "^9.2.3", + "typescript": "^4.8.4", "uuid": "^9.0.0" }, "devDependencies": { @@ -87,7 +88,6 @@ "open-cli": "^7.1.0", "pick-port": "^1.0.1", "sctp": "^1.0.0", - "tsc-watch": "^5.0.3", - "typescript": "^4.8.4" + "tsc-watch": "^5.0.3" } } From 36ebdd394ad21d7c8df3b1e5da08511ccb839603 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Fri, 11 Nov 2022 11:57:08 +0100 Subject: [PATCH 02/31] Really remove /node/lib/ --- node/lib/ActiveSpeakerObserver.d.ts | 36 - node/lib/ActiveSpeakerObserver.d.ts.map | 1 - node/lib/ActiveSpeakerObserver.js | 44 -- node/lib/AudioLevelObserver.d.ts | 55 -- node/lib/AudioLevelObserver.d.ts.map | 1 - node/lib/AudioLevelObserver.js | 56 -- node/lib/Channel.d.ts | 22 - node/lib/Channel.d.ts.map | 1 - node/lib/Channel.js | 217 ----- node/lib/Consumer.d.ts | 292 ------- node/lib/Consumer.d.ts.map | 1 - node/lib/Consumer.js | 354 --------- node/lib/DataConsumer.d.ts | 158 ---- node/lib/DataConsumer.d.ts.map | 1 - node/lib/DataConsumer.js | 248 ------ node/lib/DataProducer.d.ts | 131 ---- node/lib/DataProducer.d.ts.map | 1 - node/lib/DataProducer.js | 177 ----- node/lib/DirectTransport.d.ts | 95 --- node/lib/DirectTransport.d.ts.map | 1 - node/lib/DirectTransport.js | 119 --- node/lib/EnhancedEventEmitter.d.ts | 24 - node/lib/EnhancedEventEmitter.d.ts.map | 1 - node/lib/EnhancedEventEmitter.js | 70 -- node/lib/Logger.d.ts | 9 - node/lib/Logger.d.ts.map | 1 - node/lib/Logger.js | 37 - node/lib/PayloadChannel.d.ts | 26 - node/lib/PayloadChannel.d.ts.map | 1 - node/lib/PayloadChannel.js | 235 ------ node/lib/PipeTransport.d.ts | 160 ---- node/lib/PipeTransport.d.ts.map | 1 - node/lib/PipeTransport.js | 178 ----- node/lib/PlainTransport.d.ts | 166 ---- node/lib/PlainTransport.d.ts.map | 1 - node/lib/PlainTransport.js | 155 ---- node/lib/Producer.d.ts | 242 ------ node/lib/Producer.d.ts.map | 1 - node/lib/Producer.js | 241 ------ node/lib/Router.d.ts | 191 ----- node/lib/Router.d.ts.map | 1 - node/lib/Router.js | 653 ---------------- node/lib/RtpObserver.d.ts | 95 --- node/lib/RtpObserver.d.ts.map | 1 - node/lib/RtpObserver.js | 159 ---- node/lib/RtpParameters.d.ts | 302 ------- node/lib/RtpParameters.d.ts.map | 1 - node/lib/RtpParameters.js | 2 - node/lib/SctpParameters.d.ts | 82 -- node/lib/SctpParameters.d.ts.map | 1 - node/lib/SctpParameters.js | 2 - node/lib/SrtpParameters.d.ts | 18 - node/lib/SrtpParameters.d.ts.map | 1 - node/lib/SrtpParameters.js | 2 - node/lib/Transport.d.ts | 202 ----- node/lib/Transport.d.ts.map | 1 - node/lib/Transport.js | 581 -------------- node/lib/WebRtcServer.d.ts | 101 --- node/lib/WebRtcServer.d.ts.map | 1 - node/lib/WebRtcServer.js | 127 --- node/lib/WebRtcTransport.d.ts | 240 ------ node/lib/WebRtcTransport.d.ts.map | 1 - node/lib/WebRtcTransport.js | 227 ------ node/lib/Worker.d.ts | 190 ----- node/lib/Worker.d.ts.map | 1 - node/lib/Worker.js | 354 --------- node/lib/errors.d.ts | 13 - node/lib/errors.d.ts.map | 1 - node/lib/errors.js | 31 - node/lib/index.d.ts | 33 - node/lib/index.d.ts.map | 1 - node/lib/index.js | 55 -- node/lib/ortc.d.ts | 130 --- node/lib/ortc.d.ts.map | 1 - node/lib/ortc.js | 869 --------------------- node/lib/scalabilityModes.d.ts | 7 - node/lib/scalabilityModes.d.ts.map | 1 - node/lib/scalabilityModes.js | 22 - node/lib/supportedRtpCapabilities.d.ts | 4 - node/lib/supportedRtpCapabilities.d.ts.map | 1 - node/lib/supportedRtpCapabilities.js | 361 --------- node/lib/types.d.ts | 21 - node/lib/types.d.ts.map | 1 - node/lib/types.js | 35 - node/lib/utils.d.ts | 16 - node/lib/utils.d.ts.map | 1 - node/lib/utils.js | 20 - 87 files changed, 8721 deletions(-) delete mode 100644 node/lib/ActiveSpeakerObserver.d.ts delete mode 100644 node/lib/ActiveSpeakerObserver.d.ts.map delete mode 100644 node/lib/ActiveSpeakerObserver.js delete mode 100644 node/lib/AudioLevelObserver.d.ts delete mode 100644 node/lib/AudioLevelObserver.d.ts.map delete mode 100644 node/lib/AudioLevelObserver.js delete mode 100644 node/lib/Channel.d.ts delete mode 100644 node/lib/Channel.d.ts.map delete mode 100644 node/lib/Channel.js delete mode 100644 node/lib/Consumer.d.ts delete mode 100644 node/lib/Consumer.d.ts.map delete mode 100644 node/lib/Consumer.js delete mode 100644 node/lib/DataConsumer.d.ts delete mode 100644 node/lib/DataConsumer.d.ts.map delete mode 100644 node/lib/DataConsumer.js delete mode 100644 node/lib/DataProducer.d.ts delete mode 100644 node/lib/DataProducer.d.ts.map delete mode 100644 node/lib/DataProducer.js delete mode 100644 node/lib/DirectTransport.d.ts delete mode 100644 node/lib/DirectTransport.d.ts.map delete mode 100644 node/lib/DirectTransport.js delete mode 100644 node/lib/EnhancedEventEmitter.d.ts delete mode 100644 node/lib/EnhancedEventEmitter.d.ts.map delete mode 100644 node/lib/EnhancedEventEmitter.js delete mode 100644 node/lib/Logger.d.ts delete mode 100644 node/lib/Logger.d.ts.map delete mode 100644 node/lib/Logger.js delete mode 100644 node/lib/PayloadChannel.d.ts delete mode 100644 node/lib/PayloadChannel.d.ts.map delete mode 100644 node/lib/PayloadChannel.js delete mode 100644 node/lib/PipeTransport.d.ts delete mode 100644 node/lib/PipeTransport.d.ts.map delete mode 100644 node/lib/PipeTransport.js delete mode 100644 node/lib/PlainTransport.d.ts delete mode 100644 node/lib/PlainTransport.d.ts.map delete mode 100644 node/lib/PlainTransport.js delete mode 100644 node/lib/Producer.d.ts delete mode 100644 node/lib/Producer.d.ts.map delete mode 100644 node/lib/Producer.js delete mode 100644 node/lib/Router.d.ts delete mode 100644 node/lib/Router.d.ts.map delete mode 100644 node/lib/Router.js delete mode 100644 node/lib/RtpObserver.d.ts delete mode 100644 node/lib/RtpObserver.d.ts.map delete mode 100644 node/lib/RtpObserver.js delete mode 100644 node/lib/RtpParameters.d.ts delete mode 100644 node/lib/RtpParameters.d.ts.map delete mode 100644 node/lib/RtpParameters.js delete mode 100644 node/lib/SctpParameters.d.ts delete mode 100644 node/lib/SctpParameters.d.ts.map delete mode 100644 node/lib/SctpParameters.js delete mode 100644 node/lib/SrtpParameters.d.ts delete mode 100644 node/lib/SrtpParameters.d.ts.map delete mode 100644 node/lib/SrtpParameters.js delete mode 100644 node/lib/Transport.d.ts delete mode 100644 node/lib/Transport.d.ts.map delete mode 100644 node/lib/Transport.js delete mode 100644 node/lib/WebRtcServer.d.ts delete mode 100644 node/lib/WebRtcServer.d.ts.map delete mode 100644 node/lib/WebRtcServer.js delete mode 100644 node/lib/WebRtcTransport.d.ts delete mode 100644 node/lib/WebRtcTransport.d.ts.map delete mode 100644 node/lib/WebRtcTransport.js delete mode 100644 node/lib/Worker.d.ts delete mode 100644 node/lib/Worker.d.ts.map delete mode 100644 node/lib/Worker.js delete mode 100644 node/lib/errors.d.ts delete mode 100644 node/lib/errors.d.ts.map delete mode 100644 node/lib/errors.js delete mode 100644 node/lib/index.d.ts delete mode 100644 node/lib/index.d.ts.map delete mode 100644 node/lib/index.js delete mode 100644 node/lib/ortc.d.ts delete mode 100644 node/lib/ortc.d.ts.map delete mode 100644 node/lib/ortc.js delete mode 100644 node/lib/scalabilityModes.d.ts delete mode 100644 node/lib/scalabilityModes.d.ts.map delete mode 100644 node/lib/scalabilityModes.js delete mode 100644 node/lib/supportedRtpCapabilities.d.ts delete mode 100644 node/lib/supportedRtpCapabilities.d.ts.map delete mode 100644 node/lib/supportedRtpCapabilities.js delete mode 100644 node/lib/types.d.ts delete mode 100644 node/lib/types.d.ts.map delete mode 100644 node/lib/types.js delete mode 100644 node/lib/utils.d.ts delete mode 100644 node/lib/utils.d.ts.map delete mode 100644 node/lib/utils.js diff --git a/node/lib/ActiveSpeakerObserver.d.ts b/node/lib/ActiveSpeakerObserver.d.ts deleted file mode 100644 index 1f4010ce5f..0000000000 --- a/node/lib/ActiveSpeakerObserver.d.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { EnhancedEventEmitter } from './EnhancedEventEmitter'; -import { RtpObserver, RtpObserverEvents, RtpObserverObserverEvents, RtpObserverConstructorOptions } from './RtpObserver'; -import { Producer } from './Producer'; -export declare type ActiveSpeakerObserverOptions = { - interval?: number; - /** - * Custom application data. - */ - appData?: Record; -}; -export declare type ActiveSpeakerObserverDominantSpeaker = { - /** - * The audio Producer instance. - */ - producer: Producer; -}; -export declare type ActiveSpeakerObserverEvents = RtpObserverEvents & { - dominantspeaker: [ActiveSpeakerObserverDominantSpeaker]; -}; -export declare type ActiveSpeakerObserverObserverEvents = RtpObserverObserverEvents & { - dominantspeaker: [ActiveSpeakerObserverDominantSpeaker]; -}; -declare type RtpObserverObserverConstructorOptions = RtpObserverConstructorOptions; -export declare class ActiveSpeakerObserver extends RtpObserver { - /** - * @private - */ - constructor(options: RtpObserverObserverConstructorOptions); - /** - * Observer. - */ - get observer(): EnhancedEventEmitter; - private handleWorkerNotifications; -} -export {}; -//# sourceMappingURL=ActiveSpeakerObserver.d.ts.map \ No newline at end of file diff --git a/node/lib/ActiveSpeakerObserver.d.ts.map b/node/lib/ActiveSpeakerObserver.d.ts.map deleted file mode 100644 index 1672a23cce..0000000000 --- a/node/lib/ActiveSpeakerObserver.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ActiveSpeakerObserver.d.ts","sourceRoot":"","sources":["../src/ActiveSpeakerObserver.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EACN,WAAW,EACX,iBAAiB,EACjB,yBAAyB,EACzB,6BAA6B,EAC7B,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,oBAAY,4BAA4B,GACxC;IACC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC,CAAC;AAEF,oBAAY,oCAAoC,GAChD;IACC;;OAEG;IACH,QAAQ,EAAE,QAAQ,CAAC;CACnB,CAAC;AAEF,oBAAY,2BAA2B,GAAG,iBAAiB,GAC3D;IACC,eAAe,EAAE,CAAC,oCAAoC,CAAC,CAAC;CACxD,CAAC;AAEF,oBAAY,mCAAmC,GAAG,yBAAyB,GAC3E;IACC,eAAe,EAAE,CAAC,oCAAoC,CAAC,CAAC;CACxD,CAAC;AAEF,aAAK,qCAAqC,GAAG,6BAA6B,CAAC;AAI3E,qBAAa,qBAAsB,SAAQ,WAAW,CAAC,2BAA2B,CAAC;IAElF;;OAEG;gBACS,OAAO,EAAE,qCAAqC;IAO1D;;OAEG;IACH,IAAI,QAAQ,IAAI,oBAAoB,CAAC,mCAAmC,CAAC,CAGxE;IAED,OAAO,CAAC,yBAAyB;CA+BjC"} \ No newline at end of file diff --git a/node/lib/ActiveSpeakerObserver.js b/node/lib/ActiveSpeakerObserver.js deleted file mode 100644 index ccaffdacff..0000000000 --- a/node/lib/ActiveSpeakerObserver.js +++ /dev/null @@ -1,44 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.ActiveSpeakerObserver = void 0; -const Logger_1 = require("./Logger"); -const RtpObserver_1 = require("./RtpObserver"); -const logger = new Logger_1.Logger('ActiveSpeakerObserver'); -class ActiveSpeakerObserver extends RtpObserver_1.RtpObserver { - /** - * @private - */ - constructor(options) { - super(options); - this.handleWorkerNotifications(); - } - /** - * Observer. - */ - get observer() { - return super.observer; - } - handleWorkerNotifications() { - this.channel.on(this.internal.rtpObserverId, (event, data) => { - switch (event) { - case 'dominantspeaker': - { - const producer = this.getProducerById(data.producerId); - if (!producer) - break; - const dominantSpeaker = { - producer - }; - this.safeEmit('dominantspeaker', dominantSpeaker); - this.observer.safeEmit('dominantspeaker', dominantSpeaker); - break; - } - default: - { - logger.error('ignoring unknown event "%s"', event); - } - } - }); - } -} -exports.ActiveSpeakerObserver = ActiveSpeakerObserver; diff --git a/node/lib/AudioLevelObserver.d.ts b/node/lib/AudioLevelObserver.d.ts deleted file mode 100644 index e9d2a1bd09..0000000000 --- a/node/lib/AudioLevelObserver.d.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { EnhancedEventEmitter } from './EnhancedEventEmitter'; -import { RtpObserver, RtpObserverEvents, RtpObserverObserverEvents, RtpObserverConstructorOptions } from './RtpObserver'; -import { Producer } from './Producer'; -export declare type AudioLevelObserverOptions = { - /** - * Maximum number of entries in the 'volumes”' event. Default 1. - */ - maxEntries?: number; - /** - * Minimum average volume (in dBvo from -127 to 0) for entries in the - * 'volumes' event. Default -80. - */ - threshold?: number; - /** - * Interval in ms for checking audio volumes. Default 1000. - */ - interval?: number; - /** - * Custom application data. - */ - appData?: Record; -}; -export declare type AudioLevelObserverVolume = { - /** - * The audio Producer instance. - */ - producer: Producer; - /** - * The average volume (in dBvo from -127 to 0) of the audio Producer in the - * last interval. - */ - volume: number; -}; -export declare type AudioLevelObserverEvents = RtpObserverEvents & { - volumes: [AudioLevelObserverVolume[]]; - silence: []; -}; -export declare type AudioLevelObserverObserverEvents = RtpObserverObserverEvents & { - volumes: [AudioLevelObserverVolume[]]; - silence: []; -}; -declare type AudioLevelObserverConstructorOptions = RtpObserverConstructorOptions; -export declare class AudioLevelObserver extends RtpObserver { - /** - * @private - */ - constructor(options: AudioLevelObserverConstructorOptions); - /** - * Observer. - */ - get observer(): EnhancedEventEmitter; - private handleWorkerNotifications; -} -export {}; -//# sourceMappingURL=AudioLevelObserver.d.ts.map \ No newline at end of file diff --git a/node/lib/AudioLevelObserver.d.ts.map b/node/lib/AudioLevelObserver.d.ts.map deleted file mode 100644 index 8bd058f070..0000000000 --- a/node/lib/AudioLevelObserver.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"AudioLevelObserver.d.ts","sourceRoot":"","sources":["../src/AudioLevelObserver.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EACN,WAAW,EACX,iBAAiB,EACjB,yBAAyB,EACzB,6BAA6B,EAC7B,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,oBAAY,yBAAyB,GACrC;IACC;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC,CAAC;AAEF,oBAAY,wBAAwB,GACpC;IACC;;OAEG;IACH,QAAQ,EAAE,QAAQ,CAAC;IAEnB;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,oBAAY,wBAAwB,GAAG,iBAAiB,GACxD;IACC,OAAO,EAAE,CAAC,wBAAwB,EAAE,CAAC,CAAC;IACtC,OAAO,EAAE,EAAE,CAAC;CACZ,CAAC;AAEF,oBAAY,gCAAgC,GAAG,yBAAyB,GACxE;IACC,OAAO,EAAE,CAAC,wBAAwB,EAAE,CAAC,CAAC;IACtC,OAAO,EAAE,EAAE,CAAC;CACZ,CAAC;AAEF,aAAK,oCAAoC,GAAG,6BAA6B,CAAC;AAI1E,qBAAa,kBAAmB,SAAQ,WAAW,CAAC,wBAAwB,CAAC;IAE5E;;OAEG;gBACS,OAAO,EAAE,oCAAoC;IAOzD;;OAEG;IACH,IAAI,QAAQ,IAAI,oBAAoB,CAAC,gCAAgC,CAAC,CAGrE;IAED,OAAO,CAAC,yBAAyB;CA+CjC"} \ No newline at end of file diff --git a/node/lib/AudioLevelObserver.js b/node/lib/AudioLevelObserver.js deleted file mode 100644 index 317e34bdd3..0000000000 --- a/node/lib/AudioLevelObserver.js +++ /dev/null @@ -1,56 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.AudioLevelObserver = void 0; -const Logger_1 = require("./Logger"); -const RtpObserver_1 = require("./RtpObserver"); -const logger = new Logger_1.Logger('AudioLevelObserver'); -class AudioLevelObserver extends RtpObserver_1.RtpObserver { - /** - * @private - */ - constructor(options) { - super(options); - this.handleWorkerNotifications(); - } - /** - * Observer. - */ - get observer() { - return super.observer; - } - handleWorkerNotifications() { - this.channel.on(this.internal.rtpObserverId, (event, data) => { - switch (event) { - case 'volumes': - { - // Get the corresponding Producer instance and remove entries with - // no Producer (it may have been closed in the meanwhile). - const volumes = data - .map(({ producerId, volume }) => ({ - producer: this.getProducerById(producerId), - volume - })) - .filter(({ producer }) => producer); - if (volumes.length > 0) { - this.safeEmit('volumes', volumes); - // Emit observer event. - this.observer.safeEmit('volumes', volumes); - } - break; - } - case 'silence': - { - this.safeEmit('silence'); - // Emit observer event. - this.observer.safeEmit('silence'); - break; - } - default: - { - logger.error('ignoring unknown event "%s"', event); - } - } - }); - } -} -exports.AudioLevelObserver = AudioLevelObserver; diff --git a/node/lib/Channel.d.ts b/node/lib/Channel.d.ts deleted file mode 100644 index fef3fad0a5..0000000000 --- a/node/lib/Channel.d.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { EnhancedEventEmitter } from './EnhancedEventEmitter'; -export declare class Channel extends EnhancedEventEmitter { - #private; - /** - * @private - */ - constructor({ producerSocket, consumerSocket, pid }: { - producerSocket: any; - consumerSocket: any; - pid: number; - }); - /** - * @private - */ - close(): void; - /** - * @private - */ - request(method: string, handlerId?: string, data?: any): Promise; - private processMessage; -} -//# sourceMappingURL=Channel.d.ts.map \ No newline at end of file diff --git a/node/lib/Channel.d.ts.map b/node/lib/Channel.d.ts.map deleted file mode 100644 index 4ffd6f386b..0000000000 --- a/node/lib/Channel.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"Channel.d.ts","sourceRoot":"","sources":["../src/Channel.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAmB9D,qBAAa,OAAQ,SAAQ,oBAAoB;;IAoBhD;;OAEG;gBAEF,EACC,cAAc,EACd,cAAc,EACd,GAAG,EACH,EACD;QACC,cAAc,EAAE,GAAG,CAAC;QACpB,cAAc,EAAE,GAAG,CAAC;QACpB,GAAG,EAAE,MAAM,CAAC;KACZ;IAiIF;;OAEG;IACH,KAAK,IAAI,IAAI;IAmCb;;OAEG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IAoD3E,OAAO,CAAC,cAAc;CA+DtB"} \ No newline at end of file diff --git a/node/lib/Channel.js b/node/lib/Channel.js deleted file mode 100644 index eaafbfc422..0000000000 --- a/node/lib/Channel.js +++ /dev/null @@ -1,217 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.Channel = void 0; -const os = require("os"); -const Logger_1 = require("./Logger"); -const EnhancedEventEmitter_1 = require("./EnhancedEventEmitter"); -const errors_1 = require("./errors"); -const littleEndian = os.endianness() == 'LE'; -const logger = new Logger_1.Logger('Channel'); -// Binary length for a 4194304 bytes payload. -const MESSAGE_MAX_LEN = 4194308; -const PAYLOAD_MAX_LEN = 4194304; -class Channel extends EnhancedEventEmitter_1.EnhancedEventEmitter { - // Closed flag. - #closed = false; - // Unix Socket instance for sending messages to the worker process. - #producerSocket; - // Unix Socket instance for receiving messages to the worker process. - #consumerSocket; - // Next id for messages sent to the worker process. - #nextId = 0; - // Map of pending sent requests. - #sents = new Map(); - // Buffer for reading messages from the worker. - #recvBuffer = Buffer.alloc(0); - /** - * @private - */ - constructor({ producerSocket, consumerSocket, pid }) { - super(); - logger.debug('constructor()'); - this.#producerSocket = producerSocket; - this.#consumerSocket = consumerSocket; - // Read Channel responses/notifications from the worker. - this.#consumerSocket.on('data', (buffer) => { - if (!this.#recvBuffer.length) { - this.#recvBuffer = buffer; - } - else { - this.#recvBuffer = Buffer.concat([this.#recvBuffer, buffer], this.#recvBuffer.length + buffer.length); - } - if (this.#recvBuffer.length > PAYLOAD_MAX_LEN) { - logger.error('receiving buffer is full, discarding all data in it'); - // Reset the buffer and exit. - this.#recvBuffer = Buffer.alloc(0); - return; - } - let msgStart = 0; - while (true) // eslint-disable-line no-constant-condition - { - const readLen = this.#recvBuffer.length - msgStart; - if (readLen < 4) { - // Incomplete data. - break; - } - const dataView = new DataView(this.#recvBuffer.buffer, this.#recvBuffer.byteOffset + msgStart); - const msgLen = dataView.getUint32(0, littleEndian); - if (readLen < 4 + msgLen) { - // Incomplete data. - break; - } - const payload = this.#recvBuffer.subarray(msgStart + 4, msgStart + 4 + msgLen); - msgStart += 4 + msgLen; - try { - // We can receive JSON messages (Channel messages) or log strings. - switch (payload[0]) { - // 123 = '{' (a Channel JSON message). - case 123: - this.processMessage(JSON.parse(payload.toString('utf8'))); - break; - // 68 = 'D' (a debug log). - case 68: - logger.debug(`[pid:${pid}] ${payload.toString('utf8', 1)}`); - break; - // 87 = 'W' (a warn log). - case 87: - logger.warn(`[pid:${pid}] ${payload.toString('utf8', 1)}`); - break; - // 69 = 'E' (an error log). - case 69: - logger.error(`[pid:${pid} ${payload.toString('utf8', 1)}`); - break; - // 88 = 'X' (a dump log). - case 88: - // eslint-disable-next-line no-console - console.log(payload.toString('utf8', 1)); - break; - default: - // eslint-disable-next-line no-console - console.warn(`worker[pid:${pid}] unexpected data: %s`, payload.toString('utf8', 1)); - } - } - catch (error) { - logger.error('received invalid message from the worker process: %s', String(error)); - } - } - if (msgStart != 0) { - this.#recvBuffer = this.#recvBuffer.slice(msgStart); - } - }); - this.#consumerSocket.on('end', () => (logger.debug('Consumer Channel ended by the worker process'))); - this.#consumerSocket.on('error', (error) => (logger.error('Consumer Channel error: %s', String(error)))); - this.#producerSocket.on('end', () => (logger.debug('Producer Channel ended by the worker process'))); - this.#producerSocket.on('error', (error) => (logger.error('Producer Channel error: %s', String(error)))); - } - /** - * @private - */ - close() { - if (this.#closed) - return; - logger.debug('close()'); - this.#closed = true; - // Close every pending sent. - for (const sent of this.#sents.values()) { - sent.close(); - } - // Remove event listeners but leave a fake 'error' hander to avoid - // propagation. - this.#consumerSocket.removeAllListeners('end'); - this.#consumerSocket.removeAllListeners('error'); - this.#consumerSocket.on('error', () => { }); - this.#producerSocket.removeAllListeners('end'); - this.#producerSocket.removeAllListeners('error'); - this.#producerSocket.on('error', () => { }); - // Destroy the socket after a while to allow pending incoming messages. - setTimeout(() => { - try { - this.#producerSocket.destroy(); - } - catch (error) { } - try { - this.#consumerSocket.destroy(); - } - catch (error) { } - }, 200); - } - /** - * @private - */ - async request(method, handlerId, data) { - this.#nextId < 4294967295 ? ++this.#nextId : (this.#nextId = 1); - const id = this.#nextId; - logger.debug('request() [method:%s, id:%s]', method, id); - if (this.#closed) - throw new errors_1.InvalidStateError('Channel closed'); - const request = `${id}:${method}:${handlerId}:${JSON.stringify(data)}`; - if (Buffer.byteLength(request) > MESSAGE_MAX_LEN) - throw new Error('Channel request too big'); - // This may throw if closed or remote side ended. - this.#producerSocket.write(Buffer.from(Uint32Array.of(Buffer.byteLength(request)).buffer)); - this.#producerSocket.write(request); - return new Promise((pResolve, pReject) => { - const sent = { - id: id, - method: method, - resolve: (data2) => { - if (!this.#sents.delete(id)) - return; - pResolve(data2); - }, - reject: (error) => { - if (!this.#sents.delete(id)) - return; - pReject(error); - }, - close: () => { - pReject(new errors_1.InvalidStateError('Channel closed')); - } - }; - // Add sent stuff to the map. - this.#sents.set(id, sent); - }); - } - processMessage(msg) { - // If a response, retrieve its associated request. - if (msg.id) { - const sent = this.#sents.get(msg.id); - if (!sent) { - logger.error('received response does not match any sent request [id:%s]', msg.id); - return; - } - if (msg.accepted) { - logger.debug('request succeeded [method:%s, id:%s]', sent.method, sent.id); - sent.resolve(msg.data); - } - else if (msg.error) { - logger.warn('request failed [method:%s, id:%s]: %s', sent.method, sent.id, msg.reason); - switch (msg.error) { - case 'TypeError': - sent.reject(new TypeError(msg.reason)); - break; - default: - sent.reject(new Error(msg.reason)); - } - } - else { - logger.error('received response is not accepted nor rejected [method:%s, id:%s]', sent.method, sent.id); - } - } - // If a notification emit it to the corresponding entity. - else if (msg.targetId && msg.event) { - // Due to how Promises work, it may happen that we receive a response - // from the worker followed by a notification from the worker. If we - // emit the notification immediately it may reach its target **before** - // the response, destroying the ordered delivery. So we must wait a bit - // here. - // See https://github.com/versatica/mediasoup/issues/510 - setImmediate(() => this.emit(String(msg.targetId), msg.event, msg.data)); - } - // Otherwise unexpected message. - else { - logger.error('received message is not a response nor a notification'); - } - } -} -exports.Channel = Channel; diff --git a/node/lib/Consumer.d.ts b/node/lib/Consumer.d.ts deleted file mode 100644 index 5d1fb4855d..0000000000 --- a/node/lib/Consumer.d.ts +++ /dev/null @@ -1,292 +0,0 @@ -/// -import { EnhancedEventEmitter } from './EnhancedEventEmitter'; -import { Channel } from './Channel'; -import { PayloadChannel } from './PayloadChannel'; -import { TransportInternal } from './Transport'; -import { ProducerStat } from './Producer'; -import { MediaKind, RtpCapabilities, RtpParameters } from './RtpParameters'; -export declare type ConsumerOptions = { - /** - * The id of the Producer to consume. - */ - producerId: string; - /** - * RTP capabilities of the consuming endpoint. - */ - rtpCapabilities: RtpCapabilities; - /** - * Whether the Consumer must start in paused mode. Default false. - * - * When creating a video Consumer, it's recommended to set paused to true, - * then transmit the Consumer parameters to the consuming endpoint and, once - * the consuming endpoint has created its local side Consumer, unpause the - * server side Consumer using the resume() method. This is an optimization - * to make it possible for the consuming endpoint to render the video as far - * as possible. If the server side Consumer was created with paused: false, - * mediasoup will immediately request a key frame to the remote Producer and - * suych a key frame may reach the consuming endpoint even before it's ready - * to consume it, generating “black” video until the device requests a keyframe - * by itself. - */ - paused?: boolean; - /** - * The MID for the Consumer. If not specified, a sequentially growing - * number will be assigned. - */ - mid?: string; - /** - * Preferred spatial and temporal layer for simulcast or SVC media sources. - * If unset, the highest ones are selected. - */ - preferredLayers?: ConsumerLayers; - /** - * Whether this Consumer should ignore DTX packets (only valid for Opus codec). - * If set, DTX packets are not forwarded to the remote Consumer. - */ - ignoreDtx?: Boolean; - /** - * Whether this Consumer should consume all RTP streams generated by the - * Producer. - */ - pipe?: boolean; - /** - * Custom application data. - */ - appData?: Record; -}; -/** - * Valid types for 'trace' event. - */ -export declare type ConsumerTraceEventType = 'rtp' | 'keyframe' | 'nack' | 'pli' | 'fir'; -/** - * 'trace' event data. - */ -export declare type ConsumerTraceEventData = { - /** - * Trace type. - */ - type: ConsumerTraceEventType; - /** - * Event timestamp. - */ - timestamp: number; - /** - * Event direction. - */ - direction: 'in' | 'out'; - /** - * Per type information. - */ - info: any; -}; -export declare type ConsumerScore = { - /** - * The score of the RTP stream of the consumer. - */ - score: number; - /** - * The score of the currently selected RTP stream of the producer. - */ - producerScore: number; - /** - * The scores of all RTP streams in the producer ordered by encoding (just - * useful when the producer uses simulcast). - */ - producerScores: number[]; -}; -export declare type ConsumerLayers = { - /** - * The spatial layer index (from 0 to N). - */ - spatialLayer: number; - /** - * The temporal layer index (from 0 to N). - */ - temporalLayer?: number; -}; -export declare type ConsumerStat = { - type: string; - timestamp: number; - ssrc: number; - rtxSsrc?: number; - kind: string; - mimeType: string; - packetsLost: number; - fractionLost: number; - packetsDiscarded: number; - packetsRetransmitted: number; - packetsRepaired: number; - nackCount: number; - nackPacketCount: number; - pliCount: number; - firCount: number; - score: number; - packetCount: number; - byteCount: number; - bitrate: number; - roundTripTime?: number; -}; -/** - * Consumer type. - */ -export declare type ConsumerType = 'simple' | 'simulcast' | 'svc' | 'pipe'; -export declare type ConsumerEvents = { - transportclose: []; - producerclose: []; - producerpause: []; - producerresume: []; - score: [ConsumerScore]; - layerschange: [ConsumerLayers?]; - trace: [ConsumerTraceEventData]; - rtp: [Buffer]; - '@close': []; - '@producerclose': []; -}; -export declare type ConsumerObserverEvents = { - close: []; - pause: []; - resume: []; - score: [ConsumerScore]; - layerschange: [ConsumerLayers?]; - trace: [ConsumerTraceEventData]; -}; -declare type ConsumerInternal = TransportInternal & { - consumerId: string; -}; -declare type ConsumerData = { - producerId: string; - kind: MediaKind; - rtpParameters: RtpParameters; - type: ConsumerType; -}; -export declare class Consumer extends EnhancedEventEmitter { - #private; - /** - * @private - */ - constructor({ internal, data, channel, payloadChannel, appData, paused, producerPaused, score, preferredLayers }: { - internal: ConsumerInternal; - data: ConsumerData; - channel: Channel; - payloadChannel: PayloadChannel; - appData?: Record; - paused: boolean; - producerPaused: boolean; - score?: ConsumerScore; - preferredLayers?: ConsumerLayers; - }); - /** - * Consumer id. - */ - get id(): string; - /** - * Associated Producer id. - */ - get producerId(): string; - /** - * Whether the Consumer is closed. - */ - get closed(): boolean; - /** - * Media kind. - */ - get kind(): MediaKind; - /** - * RTP parameters. - */ - get rtpParameters(): RtpParameters; - /** - * Consumer type. - */ - get type(): ConsumerType; - /** - * Whether the Consumer is paused. - */ - get paused(): boolean; - /** - * Whether the associate Producer is paused. - */ - get producerPaused(): boolean; - /** - * Current priority. - */ - get priority(): number; - /** - * Consumer score. - */ - get score(): ConsumerScore; - /** - * Preferred video layers. - */ - get preferredLayers(): ConsumerLayers | undefined; - /** - * Current video layers. - */ - get currentLayers(): ConsumerLayers | undefined; - /** - * App custom data. - */ - get appData(): Record; - /** - * Invalid setter. - */ - set appData(appData: Record); - /** - * Observer. - */ - get observer(): EnhancedEventEmitter; - /** - * @private - * Just for testing purposes. - */ - get channelForTesting(): Channel; - /** - * Close the Consumer. - */ - close(): void; - /** - * Transport was closed. - * - * @private - */ - transportClosed(): void; - /** - * Dump Consumer. - */ - dump(): Promise; - /** - * Get Consumer stats. - */ - getStats(): Promise>; - /** - * Pause the Consumer. - */ - pause(): Promise; - /** - * Resume the Consumer. - */ - resume(): Promise; - /** - * Set preferred video layers. - */ - setPreferredLayers({ spatialLayer, temporalLayer }: ConsumerLayers): Promise; - /** - * Set priority. - */ - setPriority(priority: number): Promise; - /** - * Unset priority. - */ - unsetPriority(): Promise; - /** - * Request a key frame to the Producer. - */ - requestKeyFrame(): Promise; - /** - * Enable 'trace' event. - */ - enableTraceEvent(types?: ConsumerTraceEventType[]): Promise; - private handleWorkerNotifications; -} -export {}; -//# sourceMappingURL=Consumer.d.ts.map \ No newline at end of file diff --git a/node/lib/Consumer.d.ts.map b/node/lib/Consumer.d.ts.map deleted file mode 100644 index 75547ebda2..0000000000 --- a/node/lib/Consumer.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"Consumer.d.ts","sourceRoot":"","sources":["../src/Consumer.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node/lib/Consumer.js b/node/lib/Consumer.js deleted file mode 100644 index e3194e0f2b..0000000000 --- a/node/lib/Consumer.js +++ /dev/null @@ -1,354 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.Consumer = void 0; -const Logger_1 = require("./Logger"); -const EnhancedEventEmitter_1 = require("./EnhancedEventEmitter"); -const logger = new Logger_1.Logger('Consumer'); -class Consumer extends EnhancedEventEmitter_1.EnhancedEventEmitter { - // Internal data. - #internal; - // Consumer data. - #data; - // Channel instance. - #channel; - // PayloadChannel instance. - #payloadChannel; - // Closed flag. - #closed = false; - // Custom app data. - #appData; - // Paused flag. - #paused = false; - // Associated Producer paused flag. - #producerPaused = false; - // Current priority. - #priority = 1; - // Current score. - #score; - // Preferred layers. - #preferredLayers; - // Curent layers. - #currentLayers; - // Observer instance. - #observer = new EnhancedEventEmitter_1.EnhancedEventEmitter(); - /** - * @private - */ - constructor({ internal, data, channel, payloadChannel, appData, paused, producerPaused, score = { score: 10, producerScore: 10, producerScores: [] }, preferredLayers }) { - super(); - logger.debug('constructor()'); - this.#internal = internal; - this.#data = data; - this.#channel = channel; - this.#payloadChannel = payloadChannel; - this.#appData = appData || {}; - this.#paused = paused; - this.#producerPaused = producerPaused; - this.#score = score; - this.#preferredLayers = preferredLayers; - this.handleWorkerNotifications(); - } - /** - * Consumer id. - */ - get id() { - return this.#internal.consumerId; - } - /** - * Associated Producer id. - */ - get producerId() { - return this.#data.producerId; - } - /** - * Whether the Consumer is closed. - */ - get closed() { - return this.#closed; - } - /** - * Media kind. - */ - get kind() { - return this.#data.kind; - } - /** - * RTP parameters. - */ - get rtpParameters() { - return this.#data.rtpParameters; - } - /** - * Consumer type. - */ - get type() { - return this.#data.type; - } - /** - * Whether the Consumer is paused. - */ - get paused() { - return this.#paused; - } - /** - * Whether the associate Producer is paused. - */ - get producerPaused() { - return this.#producerPaused; - } - /** - * Current priority. - */ - get priority() { - return this.#priority; - } - /** - * Consumer score. - */ - get score() { - return this.#score; - } - /** - * Preferred video layers. - */ - get preferredLayers() { - return this.#preferredLayers; - } - /** - * Current video layers. - */ - get currentLayers() { - return this.#currentLayers; - } - /** - * App custom data. - */ - get appData() { - return this.#appData; - } - /** - * Invalid setter. - */ - set appData(appData) { - throw new Error('cannot override appData object'); - } - /** - * Observer. - */ - get observer() { - return this.#observer; - } - /** - * @private - * Just for testing purposes. - */ - get channelForTesting() { - return this.#channel; - } - /** - * Close the Consumer. - */ - close() { - if (this.#closed) - return; - logger.debug('close()'); - this.#closed = true; - // Remove notification subscriptions. - this.#channel.removeAllListeners(this.#internal.consumerId); - this.#payloadChannel.removeAllListeners(this.#internal.consumerId); - const reqData = { consumerId: this.#internal.consumerId }; - this.#channel.request('transport.closeConsumer', this.#internal.transportId, reqData) - .catch(() => { }); - this.emit('@close'); - // Emit observer event. - this.#observer.safeEmit('close'); - } - /** - * Transport was closed. - * - * @private - */ - transportClosed() { - if (this.#closed) - return; - logger.debug('transportClosed()'); - this.#closed = true; - // Remove notification subscriptions. - this.#channel.removeAllListeners(this.#internal.consumerId); - this.#payloadChannel.removeAllListeners(this.#internal.consumerId); - this.safeEmit('transportclose'); - // Emit observer event. - this.#observer.safeEmit('close'); - } - /** - * Dump Consumer. - */ - async dump() { - logger.debug('dump()'); - return this.#channel.request('consumer.dump', this.#internal.consumerId); - } - /** - * Get Consumer stats. - */ - async getStats() { - logger.debug('getStats()'); - return this.#channel.request('consumer.getStats', this.#internal.consumerId); - } - /** - * Pause the Consumer. - */ - async pause() { - logger.debug('pause()'); - const wasPaused = this.#paused || this.#producerPaused; - await this.#channel.request('consumer.pause', this.#internal.consumerId); - this.#paused = true; - // Emit observer event. - if (!wasPaused) - this.#observer.safeEmit('pause'); - } - /** - * Resume the Consumer. - */ - async resume() { - logger.debug('resume()'); - const wasPaused = this.#paused || this.#producerPaused; - await this.#channel.request('consumer.resume', this.#internal.consumerId); - this.#paused = false; - // Emit observer event. - if (wasPaused && !this.#producerPaused) - this.#observer.safeEmit('resume'); - } - /** - * Set preferred video layers. - */ - async setPreferredLayers({ spatialLayer, temporalLayer }) { - logger.debug('setPreferredLayers()'); - const reqData = { spatialLayer, temporalLayer }; - const data = await this.#channel.request('consumer.setPreferredLayers', this.#internal.consumerId, reqData); - this.#preferredLayers = data || undefined; - } - /** - * Set priority. - */ - async setPriority(priority) { - logger.debug('setPriority()'); - const reqData = { priority }; - const data = await this.#channel.request('consumer.setPriority', this.#internal.consumerId, reqData); - this.#priority = data.priority; - } - /** - * Unset priority. - */ - async unsetPriority() { - logger.debug('unsetPriority()'); - const reqData = { priority: 1 }; - const data = await this.#channel.request('consumer.setPriority', this.#internal.consumerId, reqData); - this.#priority = data.priority; - } - /** - * Request a key frame to the Producer. - */ - async requestKeyFrame() { - logger.debug('requestKeyFrame()'); - await this.#channel.request('consumer.requestKeyFrame', this.#internal.consumerId); - } - /** - * Enable 'trace' event. - */ - async enableTraceEvent(types = []) { - logger.debug('enableTraceEvent()'); - const reqData = { types }; - await this.#channel.request('consumer.enableTraceEvent', this.#internal.consumerId, reqData); - } - handleWorkerNotifications() { - this.#channel.on(this.#internal.consumerId, (event, data) => { - switch (event) { - case 'producerclose': - { - if (this.#closed) - break; - this.#closed = true; - // Remove notification subscriptions. - this.#channel.removeAllListeners(this.#internal.consumerId); - this.#payloadChannel.removeAllListeners(this.#internal.consumerId); - this.emit('@producerclose'); - this.safeEmit('producerclose'); - // Emit observer event. - this.#observer.safeEmit('close'); - break; - } - case 'producerpause': - { - if (this.#producerPaused) - break; - const wasPaused = this.#paused || this.#producerPaused; - this.#producerPaused = true; - this.safeEmit('producerpause'); - // Emit observer event. - if (!wasPaused) - this.#observer.safeEmit('pause'); - break; - } - case 'producerresume': - { - if (!this.#producerPaused) - break; - const wasPaused = this.#paused || this.#producerPaused; - this.#producerPaused = false; - this.safeEmit('producerresume'); - // Emit observer event. - if (wasPaused && !this.#paused) - this.#observer.safeEmit('resume'); - break; - } - case 'score': - { - const score = data; - this.#score = score; - this.safeEmit('score', score); - // Emit observer event. - this.#observer.safeEmit('score', score); - break; - } - case 'layerschange': - { - const layers = data; - this.#currentLayers = layers; - this.safeEmit('layerschange', layers); - // Emit observer event. - this.#observer.safeEmit('layerschange', layers); - break; - } - case 'trace': - { - const trace = data; - this.safeEmit('trace', trace); - // Emit observer event. - this.#observer.safeEmit('trace', trace); - break; - } - default: - { - logger.error('ignoring unknown event "%s"', event); - } - } - }); - this.#payloadChannel.on(this.#internal.consumerId, (event, data, payload) => { - switch (event) { - case 'rtp': - { - if (this.#closed) - break; - const packet = payload; - this.safeEmit('rtp', packet); - break; - } - default: - { - logger.error('ignoring unknown event "%s"', event); - } - } - }); - } -} -exports.Consumer = Consumer; diff --git a/node/lib/DataConsumer.d.ts b/node/lib/DataConsumer.d.ts deleted file mode 100644 index 1bc170775b..0000000000 --- a/node/lib/DataConsumer.d.ts +++ /dev/null @@ -1,158 +0,0 @@ -/// -import { EnhancedEventEmitter } from './EnhancedEventEmitter'; -import { Channel } from './Channel'; -import { PayloadChannel } from './PayloadChannel'; -import { TransportInternal } from './Transport'; -import { SctpStreamParameters } from './SctpParameters'; -export declare type DataConsumerOptions = { - /** - * The id of the DataProducer to consume. - */ - dataProducerId: string; - /** - * Just if consuming over SCTP. - * Whether data messages must be received in order. If true the messages will - * be sent reliably. Defaults to the value in the DataProducer if it has type - * 'sctp' or to true if it has type 'direct'. - */ - ordered?: boolean; - /** - * Just if consuming over SCTP. - * When ordered is false indicates the time (in milliseconds) after which a - * SCTP packet will stop being retransmitted. Defaults to the value in the - * DataProducer if it has type 'sctp' or unset if it has type 'direct'. - */ - maxPacketLifeTime?: number; - /** - * Just if consuming over SCTP. - * When ordered is false indicates the maximum number of times a packet will - * be retransmitted. Defaults to the value in the DataProducer if it has type - * 'sctp' or unset if it has type 'direct'. - */ - maxRetransmits?: number; - /** - * Custom application data. - */ - appData?: Record; -}; -export declare type DataConsumerStat = { - type: string; - timestamp: number; - label: string; - protocol: string; - messagesSent: number; - bytesSent: number; - bufferedAmount: number; -}; -/** - * DataConsumer type. - */ -export declare type DataConsumerType = 'sctp' | 'direct'; -export declare type DataConsumerEvents = { - transportclose: []; - dataproducerclose: []; - message: [Buffer, number]; - sctpsendbufferfull: []; - bufferedamountlow: [number]; - '@close': []; - '@dataproducerclose': []; -}; -export declare type DataConsumerObserverEvents = { - close: []; -}; -declare type DataConsumerInternal = TransportInternal & { - dataConsumerId: string; -}; -declare type DataConsumerData = { - dataProducerId: string; - type: DataConsumerType; - sctpStreamParameters?: SctpStreamParameters; - label: string; - protocol: string; -}; -export declare class DataConsumer extends EnhancedEventEmitter { - #private; - /** - * @private - */ - constructor({ internal, data, channel, payloadChannel, appData }: { - internal: DataConsumerInternal; - data: DataConsumerData; - channel: Channel; - payloadChannel: PayloadChannel; - appData?: Record; - }); - /** - * DataConsumer id. - */ - get id(): string; - /** - * Associated DataProducer id. - */ - get dataProducerId(): string; - /** - * Whether the DataConsumer is closed. - */ - get closed(): boolean; - /** - * DataConsumer type. - */ - get type(): DataConsumerType; - /** - * SCTP stream parameters. - */ - get sctpStreamParameters(): SctpStreamParameters | undefined; - /** - * DataChannel label. - */ - get label(): string; - /** - * DataChannel protocol. - */ - get protocol(): string; - /** - * App custom data. - */ - get appData(): Record; - /** - * Invalid setter. - */ - set appData(appData: Record); - /** - * Observer. - */ - get observer(): EnhancedEventEmitter; - /** - * Close the DataConsumer. - */ - close(): void; - /** - * Transport was closed. - * - * @private - */ - transportClosed(): void; - /** - * Dump DataConsumer. - */ - dump(): Promise; - /** - * Get DataConsumer stats. - */ - getStats(): Promise; - /** - * Set buffered amount low threshold. - */ - setBufferedAmountLowThreshold(threshold: number): Promise; - /** - * Send data. - */ - send(message: string | Buffer, ppid?: number): Promise; - /** - * Get buffered amount size. - */ - getBufferedAmount(): Promise; - private handleWorkerNotifications; -} -export {}; -//# sourceMappingURL=DataConsumer.d.ts.map \ No newline at end of file diff --git a/node/lib/DataConsumer.d.ts.map b/node/lib/DataConsumer.d.ts.map deleted file mode 100644 index 0eaf8c0728..0000000000 --- a/node/lib/DataConsumer.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"DataConsumer.d.ts","sourceRoot":"","sources":["../src/DataConsumer.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node/lib/DataConsumer.js b/node/lib/DataConsumer.js deleted file mode 100644 index 2af5612f98..0000000000 --- a/node/lib/DataConsumer.js +++ /dev/null @@ -1,248 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.DataConsumer = void 0; -const Logger_1 = require("./Logger"); -const EnhancedEventEmitter_1 = require("./EnhancedEventEmitter"); -const logger = new Logger_1.Logger('DataConsumer'); -class DataConsumer extends EnhancedEventEmitter_1.EnhancedEventEmitter { - // Internal data. - #internal; - // DataConsumer data. - #data; - // Channel instance. - #channel; - // PayloadChannel instance. - #payloadChannel; - // Closed flag. - #closed = false; - // Custom app data. - #appData; - // Observer instance. - #observer = new EnhancedEventEmitter_1.EnhancedEventEmitter(); - /** - * @private - */ - constructor({ internal, data, channel, payloadChannel, appData }) { - super(); - logger.debug('constructor()'); - this.#internal = internal; - this.#data = data; - this.#channel = channel; - this.#payloadChannel = payloadChannel; - this.#appData = appData || {}; - this.handleWorkerNotifications(); - } - /** - * DataConsumer id. - */ - get id() { - return this.#internal.dataConsumerId; - } - /** - * Associated DataProducer id. - */ - get dataProducerId() { - return this.#data.dataProducerId; - } - /** - * Whether the DataConsumer is closed. - */ - get closed() { - return this.#closed; - } - /** - * DataConsumer type. - */ - get type() { - return this.#data.type; - } - /** - * SCTP stream parameters. - */ - get sctpStreamParameters() { - return this.#data.sctpStreamParameters; - } - /** - * DataChannel label. - */ - get label() { - return this.#data.label; - } - /** - * DataChannel protocol. - */ - get protocol() { - return this.#data.protocol; - } - /** - * App custom data. - */ - get appData() { - return this.#appData; - } - /** - * Invalid setter. - */ - set appData(appData) { - throw new Error('cannot override appData object'); - } - /** - * Observer. - */ - get observer() { - return this.#observer; - } - /** - * Close the DataConsumer. - */ - close() { - if (this.#closed) - return; - logger.debug('close()'); - this.#closed = true; - // Remove notification subscriptions. - this.#channel.removeAllListeners(this.#internal.dataConsumerId); - this.#payloadChannel.removeAllListeners(this.#internal.dataConsumerId); - const reqData = { dataConsumerId: this.#internal.dataConsumerId }; - this.#channel.request('transport.closeDataConsumer', this.#internal.transportId, reqData) - .catch(() => { }); - this.emit('@close'); - // Emit observer event. - this.#observer.safeEmit('close'); - } - /** - * Transport was closed. - * - * @private - */ - transportClosed() { - if (this.#closed) - return; - logger.debug('transportClosed()'); - this.#closed = true; - // Remove notification subscriptions. - this.#channel.removeAllListeners(this.#internal.dataConsumerId); - this.#payloadChannel.removeAllListeners(this.#internal.dataConsumerId); - this.safeEmit('transportclose'); - // Emit observer event. - this.#observer.safeEmit('close'); - } - /** - * Dump DataConsumer. - */ - async dump() { - logger.debug('dump()'); - return this.#channel.request('dataConsumer.dump', this.#internal.dataConsumerId); - } - /** - * Get DataConsumer stats. - */ - async getStats() { - logger.debug('getStats()'); - return this.#channel.request('dataConsumer.getStats', this.#internal.dataConsumerId); - } - /** - * Set buffered amount low threshold. - */ - async setBufferedAmountLowThreshold(threshold) { - logger.debug('setBufferedAmountLowThreshold() [threshold:%s]', threshold); - const reqData = { threshold }; - await this.#channel.request('dataConsumer.setBufferedAmountLowThreshold', this.#internal.dataConsumerId, reqData); - } - /** - * Send data. - */ - async send(message, ppid) { - if (typeof message !== 'string' && !Buffer.isBuffer(message)) { - throw new TypeError('message must be a string or a Buffer'); - } - /* - * +-------------------------------+----------+ - * | Value | SCTP | - * | | PPID | - * +-------------------------------+----------+ - * | WebRTC String | 51 | - * | WebRTC Binary Partial | 52 | - * | (Deprecated) | | - * | WebRTC Binary | 53 | - * | WebRTC String Partial | 54 | - * | (Deprecated) | | - * | WebRTC String Empty | 56 | - * | WebRTC Binary Empty | 57 | - * +-------------------------------+----------+ - */ - if (typeof ppid !== 'number') { - ppid = (typeof message === 'string') - ? message.length > 0 ? 51 : 56 - : message.length > 0 ? 53 : 57; - } - // Ensure we honor PPIDs. - if (ppid === 56) - message = ' '; - else if (ppid === 57) - message = Buffer.alloc(1); - const requestData = String(ppid); - await this.#payloadChannel.request('dataConsumer.send', this.#internal.dataConsumerId, requestData, message); - } - /** - * Get buffered amount size. - */ - async getBufferedAmount() { - logger.debug('getBufferedAmount()'); - const { bufferedAmount } = await this.#channel.request('dataConsumer.getBufferedAmount', this.#internal.dataConsumerId); - return bufferedAmount; - } - handleWorkerNotifications() { - this.#channel.on(this.#internal.dataConsumerId, (event, data) => { - switch (event) { - case 'dataproducerclose': - { - if (this.#closed) - break; - this.#closed = true; - // Remove notification subscriptions. - this.#channel.removeAllListeners(this.#internal.dataConsumerId); - this.#payloadChannel.removeAllListeners(this.#internal.dataConsumerId); - this.emit('@dataproducerclose'); - this.safeEmit('dataproducerclose'); - // Emit observer event. - this.#observer.safeEmit('close'); - break; - } - case 'sctpsendbufferfull': - { - this.safeEmit('sctpsendbufferfull'); - break; - } - case 'bufferedamountlow': - { - const { bufferedAmount } = data; - this.safeEmit('bufferedamountlow', bufferedAmount); - break; - } - default: - { - logger.error('ignoring unknown event "%s" in channel listener', event); - } - } - }); - this.#payloadChannel.on(this.#internal.dataConsumerId, (event, data, payload) => { - switch (event) { - case 'message': - { - if (this.#closed) - break; - const ppid = data.ppid; - const message = payload; - this.safeEmit('message', message, ppid); - break; - } - default: - { - logger.error('ignoring unknown event "%s" in payload channel listener', event); - } - } - }); - } -} -exports.DataConsumer = DataConsumer; diff --git a/node/lib/DataProducer.d.ts b/node/lib/DataProducer.d.ts deleted file mode 100644 index b8b9b729d2..0000000000 --- a/node/lib/DataProducer.d.ts +++ /dev/null @@ -1,131 +0,0 @@ -/// -import { EnhancedEventEmitter } from './EnhancedEventEmitter'; -import { Channel } from './Channel'; -import { PayloadChannel } from './PayloadChannel'; -import { TransportInternal } from './Transport'; -import { SctpStreamParameters } from './SctpParameters'; -export declare type DataProducerOptions = { - /** - * DataProducer id (just for Router.pipeToRouter() method). - */ - id?: string; - /** - * SCTP parameters defining how the endpoint is sending the data. - * Just if messages are sent over SCTP. - */ - sctpStreamParameters?: SctpStreamParameters; - /** - * A label which can be used to distinguish this DataChannel from others. - */ - label?: string; - /** - * Name of the sub-protocol used by this DataChannel. - */ - protocol?: string; - /** - * Custom application data. - */ - appData?: Record; -}; -export declare type DataProducerStat = { - type: string; - timestamp: number; - label: string; - protocol: string; - messagesReceived: number; - bytesReceived: number; -}; -/** - * DataProducer type. - */ -export declare type DataProducerType = 'sctp' | 'direct'; -export declare type DataProducerEvents = { - transportclose: []; - '@close': []; -}; -export declare type DataProducerObserverEvents = { - close: []; -}; -declare type DataProducerInternal = TransportInternal & { - dataProducerId: string; -}; -declare type DataProducerData = { - type: DataProducerType; - sctpStreamParameters?: SctpStreamParameters; - label: string; - protocol: string; -}; -export declare class DataProducer extends EnhancedEventEmitter { - #private; - /** - * @private - */ - constructor({ internal, data, channel, payloadChannel, appData }: { - internal: DataProducerInternal; - data: DataProducerData; - channel: Channel; - payloadChannel: PayloadChannel; - appData?: Record; - }); - /** - * DataProducer id. - */ - get id(): string; - /** - * Whether the DataProducer is closed. - */ - get closed(): boolean; - /** - * DataProducer type. - */ - get type(): DataProducerType; - /** - * SCTP stream parameters. - */ - get sctpStreamParameters(): SctpStreamParameters | undefined; - /** - * DataChannel label. - */ - get label(): string; - /** - * DataChannel protocol. - */ - get protocol(): string; - /** - * App custom data. - */ - get appData(): Record; - /** - * Invalid setter. - */ - set appData(appData: Record); - /** - * Observer. - */ - get observer(): EnhancedEventEmitter; - /** - * Close the DataProducer. - */ - close(): void; - /** - * Transport was closed. - * - * @private - */ - transportClosed(): void; - /** - * Dump DataProducer. - */ - dump(): Promise; - /** - * Get DataProducer stats. - */ - getStats(): Promise; - /** - * Send data (just valid for DataProducers created on a DirectTransport). - */ - send(message: string | Buffer, ppid?: number): void; - private handleWorkerNotifications; -} -export {}; -//# sourceMappingURL=DataProducer.d.ts.map \ No newline at end of file diff --git a/node/lib/DataProducer.d.ts.map b/node/lib/DataProducer.d.ts.map deleted file mode 100644 index 4621aa6926..0000000000 --- a/node/lib/DataProducer.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"DataProducer.d.ts","sourceRoot":"","sources":["../src/DataProducer.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node/lib/DataProducer.js b/node/lib/DataProducer.js deleted file mode 100644 index 8df262a40d..0000000000 --- a/node/lib/DataProducer.js +++ /dev/null @@ -1,177 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.DataProducer = void 0; -const Logger_1 = require("./Logger"); -const EnhancedEventEmitter_1 = require("./EnhancedEventEmitter"); -const logger = new Logger_1.Logger('DataProducer'); -class DataProducer extends EnhancedEventEmitter_1.EnhancedEventEmitter { - // Internal data. - #internal; - // DataProducer data. - #data; - // Channel instance. - #channel; - // PayloadChannel instance. - #payloadChannel; - // Closed flag. - #closed = false; - // Custom app data. - #appData; - // Observer instance. - #observer = new EnhancedEventEmitter_1.EnhancedEventEmitter(); - /** - * @private - */ - constructor({ internal, data, channel, payloadChannel, appData }) { - super(); - logger.debug('constructor()'); - this.#internal = internal; - this.#data = data; - this.#channel = channel; - this.#payloadChannel = payloadChannel; - this.#appData = appData || {}; - this.handleWorkerNotifications(); - } - /** - * DataProducer id. - */ - get id() { - return this.#internal.dataProducerId; - } - /** - * Whether the DataProducer is closed. - */ - get closed() { - return this.#closed; - } - /** - * DataProducer type. - */ - get type() { - return this.#data.type; - } - /** - * SCTP stream parameters. - */ - get sctpStreamParameters() { - return this.#data.sctpStreamParameters; - } - /** - * DataChannel label. - */ - get label() { - return this.#data.label; - } - /** - * DataChannel protocol. - */ - get protocol() { - return this.#data.protocol; - } - /** - * App custom data. - */ - get appData() { - return this.#appData; - } - /** - * Invalid setter. - */ - set appData(appData) { - throw new Error('cannot override appData object'); - } - /** - * Observer. - */ - get observer() { - return this.#observer; - } - /** - * Close the DataProducer. - */ - close() { - if (this.#closed) - return; - logger.debug('close()'); - this.#closed = true; - // Remove notification subscriptions. - this.#channel.removeAllListeners(this.#internal.dataProducerId); - this.#payloadChannel.removeAllListeners(this.#internal.dataProducerId); - const reqData = { dataProducerId: this.#internal.dataProducerId }; - this.#channel.request('transport.closeDataProducer', this.#internal.transportId, reqData) - .catch(() => { }); - this.emit('@close'); - // Emit observer event. - this.#observer.safeEmit('close'); - } - /** - * Transport was closed. - * - * @private - */ - transportClosed() { - if (this.#closed) - return; - logger.debug('transportClosed()'); - this.#closed = true; - // Remove notification subscriptions. - this.#channel.removeAllListeners(this.#internal.dataProducerId); - this.#payloadChannel.removeAllListeners(this.#internal.dataProducerId); - this.safeEmit('transportclose'); - // Emit observer event. - this.#observer.safeEmit('close'); - } - /** - * Dump DataProducer. - */ - async dump() { - logger.debug('dump()'); - return this.#channel.request('dataProducer.dump', this.#internal.dataProducerId); - } - /** - * Get DataProducer stats. - */ - async getStats() { - logger.debug('getStats()'); - return this.#channel.request('dataProducer.getStats', this.#internal.dataProducerId); - } - /** - * Send data (just valid for DataProducers created on a DirectTransport). - */ - send(message, ppid) { - if (typeof message !== 'string' && !Buffer.isBuffer(message)) { - throw new TypeError('message must be a string or a Buffer'); - } - /* - * +-------------------------------+----------+ - * | Value | SCTP | - * | | PPID | - * +-------------------------------+----------+ - * | WebRTC String | 51 | - * | WebRTC Binary Partial | 52 | - * | (Deprecated) | | - * | WebRTC Binary | 53 | - * | WebRTC String Partial | 54 | - * | (Deprecated) | | - * | WebRTC String Empty | 56 | - * | WebRTC Binary Empty | 57 | - * +-------------------------------+----------+ - */ - if (typeof ppid !== 'number') { - ppid = (typeof message === 'string') - ? message.length > 0 ? 51 : 56 - : message.length > 0 ? 53 : 57; - } - // Ensure we honor PPIDs. - if (ppid === 56) - message = ' '; - else if (ppid === 57) - message = Buffer.alloc(1); - const notifData = String(ppid); - this.#payloadChannel.notify('dataProducer.send', this.#internal.dataProducerId, notifData, message); - } - handleWorkerNotifications() { - // No need to subscribe to any event. - } -} -exports.DataProducer = DataProducer; diff --git a/node/lib/DirectTransport.d.ts b/node/lib/DirectTransport.d.ts deleted file mode 100644 index c754e3e257..0000000000 --- a/node/lib/DirectTransport.d.ts +++ /dev/null @@ -1,95 +0,0 @@ -/// -import { Transport, TransportEvents, TransportObserverEvents, TransportConstructorOptions } from './Transport'; -import { SctpParameters } from './SctpParameters'; -export declare type DirectTransportOptions = { - /** - * Maximum allowed size for direct messages sent from DataProducers. - * Default 262144. - */ - maxMessageSize: number; - /** - * Custom application data. - */ - appData?: Record; -}; -export declare type DirectTransportStat = { - type: string; - transportId: string; - timestamp: number; - bytesReceived: number; - recvBitrate: number; - bytesSent: number; - sendBitrate: number; - rtpBytesReceived: number; - rtpRecvBitrate: number; - rtpBytesSent: number; - rtpSendBitrate: number; - rtxBytesReceived: number; - rtxRecvBitrate: number; - rtxBytesSent: number; - rtxSendBitrate: number; - probationBytesSent: number; - probationSendBitrate: number; - availableOutgoingBitrate?: number; - availableIncomingBitrate?: number; - maxIncomingBitrate?: number; -}; -export declare type DirectTransportEvents = TransportEvents & { - rtcp: [Buffer]; -}; -export declare type DirectTransportObserverEvents = TransportObserverEvents & { - rtcp: [Buffer]; -}; -declare type DirectTransportConstructorOptions = TransportConstructorOptions & { - data: DirectTransportData; -}; -export declare type DirectTransportData = { - sctpParameters?: SctpParameters; -}; -export declare class DirectTransport extends Transport { - #private; - /** - * @private - */ - constructor(options: DirectTransportConstructorOptions); - /** - * Close the DirectTransport. - * - * @override - */ - close(): void; - /** - * Router was closed. - * - * @private - * @override - */ - routerClosed(): void; - /** - * Get DirectTransport stats. - * - * @override - */ - getStats(): Promise; - /** - * NO-OP method in DirectTransport. - * - * @override - */ - connect(): Promise; - /** - * @override - */ - setMaxIncomingBitrate(bitrate: number): Promise; - /** - * @override - */ - setMaxOutgoingBitrate(bitrate: number): Promise; - /** - * Send RTCP packet. - */ - sendRtcp(rtcpPacket: Buffer): void; - private handleWorkerNotifications; -} -export {}; -//# sourceMappingURL=DirectTransport.d.ts.map \ No newline at end of file diff --git a/node/lib/DirectTransport.d.ts.map b/node/lib/DirectTransport.d.ts.map deleted file mode 100644 index 1080d20f2b..0000000000 --- a/node/lib/DirectTransport.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"DirectTransport.d.ts","sourceRoot":"","sources":["../src/DirectTransport.ts"],"names":[],"mappings":";AAEA,OAAO,EACN,SAAS,EAET,eAAe,EACf,uBAAuB,EACvB,2BAA2B,EAC3B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,oBAAY,sBAAsB,GAClC;IACC;;;OAGG;IACH,cAAc,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC,CAAC;AAEF,oBAAY,mBAAmB,GAC/B;IAEC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,oBAAY,qBAAqB,GAAG,eAAe,GACnD;IACC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC;CACf,CAAC;AAEF,oBAAY,6BAA6B,GAAG,uBAAuB,GACnE;IACC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC;CACf,CAAC;AAEF,aAAK,iCAAiC,GAAG,2BAA2B,GACpE;IACC,IAAI,EAAE,mBAAmB,CAAC;CAC1B,CAAC;AAEF,oBAAY,mBAAmB,GAC/B;IACC,cAAc,CAAC,EAAE,cAAc,CAAC;CAChC,CAAC;AAIF,qBAAa,eAAgB,SAC5B,SAAS,CAAC,qBAAqB,EAAE,6BAA6B,CAAC;;IAK/D;;OAEG;gBACS,OAAO,EAAE,iCAAiC;IActD;;;;OAIG;IACH,KAAK,IAAI,IAAI;IAQb;;;;;OAKG;IACH,YAAY,IAAI,IAAI;IAQpB;;;;OAIG;IACG,QAAQ,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAOhD;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAK9B;;OAEG;IAEG,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3D;;OAEG;IAEG,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3D;;OAEG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM;IAW3B,OAAO,CAAC,yBAAyB;CAkDjC"} \ No newline at end of file diff --git a/node/lib/DirectTransport.js b/node/lib/DirectTransport.js deleted file mode 100644 index cade4262b7..0000000000 --- a/node/lib/DirectTransport.js +++ /dev/null @@ -1,119 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.DirectTransport = void 0; -const Logger_1 = require("./Logger"); -const errors_1 = require("./errors"); -const Transport_1 = require("./Transport"); -const logger = new Logger_1.Logger('DirectTransport'); -class DirectTransport extends Transport_1.Transport { - // DirectTransport data. - #data; - /** - * @private - */ - constructor(options) { - super(options); - logger.debug('constructor()'); - this.#data = - { - // Nothing. - }; - this.handleWorkerNotifications(); - } - /** - * Close the DirectTransport. - * - * @override - */ - close() { - if (this.closed) - return; - super.close(); - } - /** - * Router was closed. - * - * @private - * @override - */ - routerClosed() { - if (this.closed) - return; - super.routerClosed(); - } - /** - * Get DirectTransport stats. - * - * @override - */ - async getStats() { - logger.debug('getStats()'); - return this.channel.request('transport.getStats', this.internal.transportId); - } - /** - * NO-OP method in DirectTransport. - * - * @override - */ - async connect() { - logger.debug('connect()'); - } - /** - * @override - */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars - async setMaxIncomingBitrate(bitrate) { - throw new errors_1.UnsupportedError('setMaxIncomingBitrate() not implemented in DirectTransport'); - } - /** - * @override - */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars - async setMaxOutgoingBitrate(bitrate) { - throw new errors_1.UnsupportedError('setMaxOutgoingBitrate() not implemented in DirectTransport'); - } - /** - * Send RTCP packet. - */ - sendRtcp(rtcpPacket) { - if (!Buffer.isBuffer(rtcpPacket)) { - throw new TypeError('rtcpPacket must be a Buffer'); - } - this.payloadChannel.notify('transport.sendRtcp', this.internal.transportId, undefined, rtcpPacket); - } - handleWorkerNotifications() { - this.channel.on(this.internal.transportId, (event, data) => { - switch (event) { - case 'trace': - { - const trace = data; - this.safeEmit('trace', trace); - // Emit observer event. - this.observer.safeEmit('trace', trace); - break; - } - default: - { - logger.error('ignoring unknown event "%s"', event); - } - } - }); - this.payloadChannel.on(this.internal.transportId, (event, data, payload) => { - switch (event) { - case 'rtcp': - { - if (this.closed) - break; - const packet = payload; - this.safeEmit('rtcp', packet); - break; - } - default: - { - logger.error('ignoring unknown event "%s"', event); - } - } - }); - } -} -exports.DirectTransport = DirectTransport; diff --git a/node/lib/EnhancedEventEmitter.d.ts b/node/lib/EnhancedEventEmitter.d.ts deleted file mode 100644 index b89479e006..0000000000 --- a/node/lib/EnhancedEventEmitter.d.ts +++ /dev/null @@ -1,24 +0,0 @@ -/// -import { EventEmitter } from 'events'; -declare type Events = Record; -export declare class EnhancedEventEmitter extends EventEmitter { - constructor(); - emit(eventName: K, ...args: E[K]): boolean; - /** - * Special addition to the EventEmitter API. - */ - safeEmit(eventName: K, ...args: E[K]): boolean; - on(eventName: K, listener: (...args: E[K]) => void): this; - off(eventName: K, listener: (...args: E[K]) => void): this; - addListener(eventName: K, listener: (...args: E[K]) => void): this; - prependListener(eventName: K, listener: (...args: E[K]) => void): this; - once(eventName: K, listener: (...args: E[K]) => void): this; - prependOnceListener(eventName: K, listener: (...args: E[K]) => void): this; - removeListener(eventName: K, listener: (...args: E[K]) => void): this; - removeAllListeners(eventName?: K): this; - listenerCount(eventName: K): number; - listeners(eventName: K): Function[]; - rawListeners(eventName: K): Function[]; -} -export {}; -//# sourceMappingURL=EnhancedEventEmitter.d.ts.map \ No newline at end of file diff --git a/node/lib/EnhancedEventEmitter.d.ts.map b/node/lib/EnhancedEventEmitter.d.ts.map deleted file mode 100644 index 474aea7f35..0000000000 --- a/node/lib/EnhancedEventEmitter.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"EnhancedEventEmitter.d.ts","sourceRoot":"","sources":["../src/EnhancedEventEmitter.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAKtC,aAAK,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;AAEpC,qBAAa,oBAAoB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,CAAE,SAAQ,YAAY;;IAQhF,IAAI,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO;IAKtE;;OAEG;IACH,QAAQ,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO;IAkB1E,EAAE,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,MAAM,EAC5B,SAAS,EAAE,CAAC,EACZ,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,GAC/B,IAAI;IAOP,GAAG,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,MAAM,EAC7B,SAAS,EAAE,CAAC,EACZ,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,GAC/B,IAAI;IAOP,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,MAAM,EACrC,SAAS,EAAE,CAAC,EACZ,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,GAC/B,IAAI;IAOP,eAAe,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,MAAM,EACzC,SAAS,EAAE,CAAC,EACZ,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,GAC/B,IAAI;IAOP,IAAI,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,MAAM,EAC9B,SAAS,EAAE,CAAC,EACZ,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,GAC/B,IAAI;IAOP,mBAAmB,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,MAAM,EAC7C,SAAS,EAAE,CAAC,EACZ,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,GAC/B,IAAI;IAOP,cAAc,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,MAAM,EACxC,SAAS,EAAE,CAAC,EACZ,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,GAC/B,IAAI;IAOP,kBAAkB,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC,GAAG,IAAI;IAOnE,aAAa,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,MAAM,EAAE,SAAS,EAAE,CAAC,GAAG,MAAM;IAK/D,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,MAAM,EAAE,SAAS,EAAE,CAAC,GAAG,QAAQ,EAAE;IAK/D,YAAY,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,MAAM,EAAE,SAAS,EAAE,CAAC,GAAG,QAAQ,EAAE;CAIlE"} \ No newline at end of file diff --git a/node/lib/EnhancedEventEmitter.js b/node/lib/EnhancedEventEmitter.js deleted file mode 100644 index c18d58d5e9..0000000000 --- a/node/lib/EnhancedEventEmitter.js +++ /dev/null @@ -1,70 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.EnhancedEventEmitter = void 0; -const events_1 = require("events"); -const Logger_1 = require("./Logger"); -const logger = new Logger_1.Logger('EnhancedEventEmitter'); -class EnhancedEventEmitter extends events_1.EventEmitter { - constructor() { - super(); - this.setMaxListeners(Infinity); - } - emit(eventName, ...args) { - return super.emit(eventName, ...args); - } - /** - * Special addition to the EventEmitter API. - */ - safeEmit(eventName, ...args) { - const numListeners = super.listenerCount(eventName); - try { - return super.emit(eventName, ...args); - } - catch (error) { - logger.error('safeEmit() | event listener threw an error [eventName:%s]:%o', eventName, error); - return Boolean(numListeners); - } - } - on(eventName, listener) { - super.on(eventName, listener); - return this; - } - off(eventName, listener) { - super.off(eventName, listener); - return this; - } - addListener(eventName, listener) { - super.on(eventName, listener); - return this; - } - prependListener(eventName, listener) { - super.prependListener(eventName, listener); - return this; - } - once(eventName, listener) { - super.once(eventName, listener); - return this; - } - prependOnceListener(eventName, listener) { - super.prependOnceListener(eventName, listener); - return this; - } - removeListener(eventName, listener) { - super.off(eventName, listener); - return this; - } - removeAllListeners(eventName) { - super.removeAllListeners(eventName); - return this; - } - listenerCount(eventName) { - return super.listenerCount(eventName); - } - listeners(eventName) { - return super.listeners(eventName); - } - rawListeners(eventName) { - return super.rawListeners(eventName); - } -} -exports.EnhancedEventEmitter = EnhancedEventEmitter; diff --git a/node/lib/Logger.d.ts b/node/lib/Logger.d.ts deleted file mode 100644 index 31a32d439d..0000000000 --- a/node/lib/Logger.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -/// -export declare class Logger { - #private; - constructor(prefix?: string); - get debug(): debug.Debugger; - get warn(): debug.Debugger; - get error(): debug.Debugger; -} -//# sourceMappingURL=Logger.d.ts.map \ No newline at end of file diff --git a/node/lib/Logger.d.ts.map b/node/lib/Logger.d.ts.map deleted file mode 100644 index 3f58f70c7b..0000000000 --- a/node/lib/Logger.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"Logger.d.ts","sourceRoot":"","sources":["../src/Logger.ts"],"names":[],"mappings":";AAIA,qBAAa,MAAM;;gBAMN,MAAM,CAAC,EAAE,MAAM;IAsB3B,IAAI,KAAK,IAAI,KAAK,CAAC,QAAQ,CAG1B;IAED,IAAI,IAAI,IAAI,KAAK,CAAC,QAAQ,CAGzB;IAED,IAAI,KAAK,IAAI,KAAK,CAAC,QAAQ,CAG1B;CACD"} \ No newline at end of file diff --git a/node/lib/Logger.js b/node/lib/Logger.js deleted file mode 100644 index 9416440968..0000000000 --- a/node/lib/Logger.js +++ /dev/null @@ -1,37 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.Logger = void 0; -const debug_1 = require("debug"); -const APP_NAME = 'mediasoup'; -class Logger { - #debug; - #warn; - #error; - constructor(prefix) { - if (prefix) { - this.#debug = (0, debug_1.default)(`${APP_NAME}:${prefix}`); - this.#warn = (0, debug_1.default)(`${APP_NAME}:WARN:${prefix}`); - this.#error = (0, debug_1.default)(`${APP_NAME}:ERROR:${prefix}`); - } - else { - this.#debug = (0, debug_1.default)(APP_NAME); - this.#warn = (0, debug_1.default)(`${APP_NAME}:WARN`); - this.#error = (0, debug_1.default)(`${APP_NAME}:ERROR`); - } - /* eslint-disable no-console */ - this.#debug.log = console.info.bind(console); - this.#warn.log = console.warn.bind(console); - this.#error.log = console.error.bind(console); - /* eslint-enable no-console */ - } - get debug() { - return this.#debug; - } - get warn() { - return this.#warn; - } - get error() { - return this.#error; - } -} -exports.Logger = Logger; diff --git a/node/lib/PayloadChannel.d.ts b/node/lib/PayloadChannel.d.ts deleted file mode 100644 index c6de2587a4..0000000000 --- a/node/lib/PayloadChannel.d.ts +++ /dev/null @@ -1,26 +0,0 @@ -/// -import { EnhancedEventEmitter } from './EnhancedEventEmitter'; -export declare class PayloadChannel extends EnhancedEventEmitter { - #private; - /** - * @private - */ - constructor({ producerSocket, consumerSocket }: { - producerSocket: any; - consumerSocket: any; - }); - /** - * @private - */ - close(): void; - /** - * @private - */ - notify(event: string, handlerId: string, data: string | undefined, payload: string | Buffer): void; - /** - * @private - */ - request(method: string, handlerId: string, data: string, payload: string | Buffer): Promise; - private processData; -} -//# sourceMappingURL=PayloadChannel.d.ts.map \ No newline at end of file diff --git a/node/lib/PayloadChannel.d.ts.map b/node/lib/PayloadChannel.d.ts.map deleted file mode 100644 index d9705c7ccd..0000000000 --- a/node/lib/PayloadChannel.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"PayloadChannel.d.ts","sourceRoot":"","sources":["../src/PayloadChannel.ts"],"names":[],"mappings":";AAGA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAmB9D,qBAAa,cAAe,SAAQ,oBAAoB;;IAuBvD;;OAEG;gBAEF,EACC,cAAc,EACd,cAAc,EACd,EACD;QACC,cAAc,EAAE,GAAG,CAAC;QACpB,cAAc,EAAE,GAAG,CAAC;KACpB;IAsFF;;OAEG;IACH,KAAK,IAAI,IAAI;IA6Bb;;OAEG;IACH,MAAM,CACL,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,OAAO,EAAE,MAAM,GAAG,MAAM,GACtB,IAAI;IA2CP;;OAEG;IACG,OAAO,CACZ,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAyDxC,OAAO,CAAC,WAAW;CA8FnB"} \ No newline at end of file diff --git a/node/lib/PayloadChannel.js b/node/lib/PayloadChannel.js deleted file mode 100644 index 87982fd6fd..0000000000 --- a/node/lib/PayloadChannel.js +++ /dev/null @@ -1,235 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.PayloadChannel = void 0; -const os = require("os"); -const Logger_1 = require("./Logger"); -const EnhancedEventEmitter_1 = require("./EnhancedEventEmitter"); -const errors_1 = require("./errors"); -const littleEndian = os.endianness() == 'LE'; -const logger = new Logger_1.Logger('PayloadChannel'); -// Binary length for a 4194304 bytes payload. -const MESSAGE_MAX_LEN = 4194308; -const PAYLOAD_MAX_LEN = 4194304; -class PayloadChannel extends EnhancedEventEmitter_1.EnhancedEventEmitter { - // Closed flag. - #closed = false; - // Unix Socket instance for sending messages to the worker process. - #producerSocket; - // Unix Socket instance for receiving messages to the worker process. - #consumerSocket; - // Next id for messages sent to the worker process. - #nextId = 0; - // Map of pending sent requests. - #sents = new Map(); - // Buffer for reading messages from the worker. - #recvBuffer = Buffer.alloc(0); - // Ongoing notification (waiting for its payload). - #ongoingNotification; - /** - * @private - */ - constructor({ producerSocket, consumerSocket }) { - super(); - logger.debug('constructor()'); - this.#producerSocket = producerSocket; - this.#consumerSocket = consumerSocket; - // Read PayloadChannel notifications from the worker. - this.#consumerSocket.on('data', (buffer) => { - if (!this.#recvBuffer.length) { - this.#recvBuffer = buffer; - } - else { - this.#recvBuffer = Buffer.concat([this.#recvBuffer, buffer], this.#recvBuffer.length + buffer.length); - } - if (this.#recvBuffer.length > PAYLOAD_MAX_LEN) { - logger.error('receiving buffer is full, discarding all data in it'); - // Reset the buffer and exit. - this.#recvBuffer = Buffer.alloc(0); - return; - } - let msgStart = 0; - while (true) // eslint-disable-line no-constant-condition - { - const readLen = this.#recvBuffer.length - msgStart; - if (readLen < 4) { - // Incomplete data. - break; - } - const dataView = new DataView(this.#recvBuffer.buffer, this.#recvBuffer.byteOffset + msgStart); - const msgLen = dataView.getUint32(0, littleEndian); - if (readLen < 4 + msgLen) { - // Incomplete data. - break; - } - const payload = this.#recvBuffer.subarray(msgStart + 4, msgStart + 4 + msgLen); - msgStart += 4 + msgLen; - this.processData(payload); - } - if (msgStart != 0) { - this.#recvBuffer = this.#recvBuffer.slice(msgStart); - } - }); - this.#consumerSocket.on('end', () => (logger.debug('Consumer PayloadChannel ended by the worker process'))); - this.#consumerSocket.on('error', (error) => (logger.error('Consumer PayloadChannel error: %s', String(error)))); - this.#producerSocket.on('end', () => (logger.debug('Producer PayloadChannel ended by the worker process'))); - this.#producerSocket.on('error', (error) => (logger.error('Producer PayloadChannel error: %s', String(error)))); - } - /** - * @private - */ - close() { - if (this.#closed) - return; - logger.debug('close()'); - this.#closed = true; - // Remove event listeners but leave a fake 'error' handler to avoid - // propagation. - this.#consumerSocket.removeAllListeners('end'); - this.#consumerSocket.removeAllListeners('error'); - this.#consumerSocket.on('error', () => { }); - this.#producerSocket.removeAllListeners('end'); - this.#producerSocket.removeAllListeners('error'); - this.#producerSocket.on('error', () => { }); - // Destroy the socket after a while to allow pending incoming messages. - setTimeout(() => { - try { - this.#producerSocket.destroy(); - } - catch (error) { } - try { - this.#consumerSocket.destroy(); - } - catch (error) { } - }, 200); - } - /** - * @private - */ - notify(event, handlerId, data, payload) { - logger.debug('notify() [event:%s]', event); - if (this.#closed) - throw new errors_1.InvalidStateError('PayloadChannel closed'); - const notification = `n:${event}:${handlerId}:${data}`; - if (Buffer.byteLength(notification) > MESSAGE_MAX_LEN) - throw new Error('PayloadChannel notification too big'); - else if (Buffer.byteLength(payload) > MESSAGE_MAX_LEN) - throw new Error('PayloadChannel payload too big'); - try { - // This may throw if closed or remote side ended. - this.#producerSocket.write(Buffer.from(Uint32Array.of(Buffer.byteLength(notification)).buffer)); - this.#producerSocket.write(notification); - } - catch (error) { - logger.warn('notify() | sending notification failed: %s', String(error)); - return; - } - try { - // This may throw if closed or remote side ended. - this.#producerSocket.write(Buffer.from(Uint32Array.of(Buffer.byteLength(payload)).buffer)); - this.#producerSocket.write(payload); - } - catch (error) { - logger.warn('notify() | sending payload failed: %s', String(error)); - return; - } - } - /** - * @private - */ - async request(method, handlerId, data, payload) { - this.#nextId < 4294967295 ? ++this.#nextId : (this.#nextId = 1); - const id = this.#nextId; - logger.debug('request() [method:%s, id:%s]', method, id); - if (this.#closed) - throw new errors_1.InvalidStateError('PayloadChannel closed'); - const request = `r:${id}:${method}:${handlerId}:${data}`; - if (Buffer.byteLength(request) > MESSAGE_MAX_LEN) - throw new Error('PayloadChannel request too big'); - else if (Buffer.byteLength(payload) > MESSAGE_MAX_LEN) - throw new Error('PayloadChannel payload too big'); - // This may throw if closed or remote side ended. - this.#producerSocket.write(Buffer.from(Uint32Array.of(Buffer.byteLength(request)).buffer)); - this.#producerSocket.write(request); - this.#producerSocket.write(Buffer.from(Uint32Array.of(Buffer.byteLength(payload)).buffer)); - this.#producerSocket.write(payload); - return new Promise((pResolve, pReject) => { - const sent = { - id: id, - method: method, - resolve: (data2) => { - if (!this.#sents.delete(id)) - return; - pResolve(data2); - }, - reject: (error) => { - if (!this.#sents.delete(id)) - return; - pReject(error); - }, - close: () => { - pReject(new errors_1.InvalidStateError('PayloadChannel closed')); - } - }; - // Add sent stuff to the map. - this.#sents.set(id, sent); - }); - } - processData(data) { - if (!this.#ongoingNotification) { - let msg; - try { - msg = JSON.parse(data.toString('utf8')); - } - catch (error) { - logger.error('received invalid data from the worker process: %s', String(error)); - return; - } - // If a response, retrieve its associated request. - if (msg.id) { - const sent = this.#sents.get(msg.id); - if (!sent) { - logger.error('received response does not match any sent request [id:%s]', msg.id); - return; - } - if (msg.accepted) { - logger.debug('request succeeded [method:%s, id:%s]', sent.method, sent.id); - sent.resolve(msg.data); - } - else if (msg.error) { - logger.warn('request failed [method:%s, id:%s]: %s', sent.method, sent.id, msg.reason); - switch (msg.error) { - case 'TypeError': - sent.reject(new TypeError(msg.reason)); - break; - default: - sent.reject(new Error(msg.reason)); - } - } - else { - logger.error('received response is not accepted nor rejected [method:%s, id:%s]', sent.method, sent.id); - } - } - // If a notification, create the ongoing notification instance. - else if (msg.targetId && msg.event) { - this.#ongoingNotification = - { - targetId: String(msg.targetId), - event: msg.event, - data: msg.data - }; - } - else { - logger.error('received data is not a notification nor a response'); - return; - } - } - else { - const payload = data; - // Emit the corresponding event. - this.emit(this.#ongoingNotification.targetId, this.#ongoingNotification.event, this.#ongoingNotification.data, payload); - // Unset ongoing notification. - this.#ongoingNotification = undefined; - } - } -} -exports.PayloadChannel = PayloadChannel; diff --git a/node/lib/PipeTransport.d.ts b/node/lib/PipeTransport.d.ts deleted file mode 100644 index b5e796a7b7..0000000000 --- a/node/lib/PipeTransport.d.ts +++ /dev/null @@ -1,160 +0,0 @@ -import { Transport, TransportListenIp, TransportTuple, TransportEvents, TransportObserverEvents, TransportConstructorOptions, SctpState } from './Transport'; -import { Consumer } from './Consumer'; -import { SctpParameters, NumSctpStreams } from './SctpParameters'; -import { SrtpParameters } from './SrtpParameters'; -export declare type PipeTransportOptions = { - /** - * Listening IP address. - */ - listenIp: TransportListenIp | string; - /** - * Fixed port to listen on instead of selecting automatically from Worker's port - * range. - */ - port?: number; - /** - * Create a SCTP association. Default false. - */ - enableSctp?: boolean; - /** - * SCTP streams number. - */ - numSctpStreams?: NumSctpStreams; - /** - * Maximum allowed size for SCTP messages sent by DataProducers. - * Default 268435456. - */ - maxSctpMessageSize?: number; - /** - * Maximum SCTP send buffer used by DataConsumers. - * Default 268435456. - */ - sctpSendBufferSize?: number; - /** - * Enable RTX and NACK for RTP retransmission. Useful if both Routers are - * located in different hosts and there is packet lost in the link. For this - * to work, both PipeTransports must enable this setting. Default false. - */ - enableRtx?: boolean; - /** - * Enable SRTP. Useful to protect the RTP and RTCP traffic if both Routers - * are located in different hosts. For this to work, connect() must be called - * with remote SRTP parameters. Default false. - */ - enableSrtp?: boolean; - /** - * Custom application data. - */ - appData?: Record; -}; -export declare type PipeTransportStat = { - type: string; - transportId: string; - timestamp: number; - sctpState?: SctpState; - bytesReceived: number; - recvBitrate: number; - bytesSent: number; - sendBitrate: number; - rtpBytesReceived: number; - rtpRecvBitrate: number; - rtpBytesSent: number; - rtpSendBitrate: number; - rtxBytesReceived: number; - rtxRecvBitrate: number; - rtxBytesSent: number; - rtxSendBitrate: number; - probationBytesSent: number; - probationSendBitrate: number; - availableOutgoingBitrate?: number; - availableIncomingBitrate?: number; - maxIncomingBitrate?: number; - tuple: TransportTuple; -}; -export declare type PipeConsumerOptions = { - /** - * The id of the Producer to consume. - */ - producerId: string; - /** - * Custom application data. - */ - appData?: Record; -}; -export declare type PipeTransportEvents = TransportEvents & { - sctpstatechange: [SctpState]; -}; -export declare type PipeTransportObserverEvents = TransportObserverEvents & { - sctpstatechange: [SctpState]; -}; -declare type PipeTransportConstructorOptions = TransportConstructorOptions & { - data: PipeTransportData; -}; -export declare type PipeTransportData = { - tuple: TransportTuple; - sctpParameters?: SctpParameters; - sctpState?: SctpState; - rtx: boolean; - srtpParameters?: SrtpParameters; -}; -export declare class PipeTransport extends Transport { - #private; - /** - * @private - */ - constructor(options: PipeTransportConstructorOptions); - /** - * Transport tuple. - */ - get tuple(): TransportTuple; - /** - * SCTP parameters. - */ - get sctpParameters(): SctpParameters | undefined; - /** - * SCTP state. - */ - get sctpState(): SctpState | undefined; - /** - * SRTP parameters. - */ - get srtpParameters(): SrtpParameters | undefined; - /** - * Close the PipeTransport. - * - * @override - */ - close(): void; - /** - * Router was closed. - * - * @private - * @override - */ - routerClosed(): void; - /** - * Get PipeTransport stats. - * - * @override - */ - getStats(): Promise; - /** - * Provide the PipeTransport remote parameters. - * - * @override - */ - connect({ ip, port, srtpParameters }: { - ip: string; - port: number; - srtpParameters?: SrtpParameters; - }): Promise; - /** - * Create a pipe Consumer. - * - * @override - */ - consume({ producerId, appData }: PipeConsumerOptions): Promise; - private handleWorkerNotifications; -} -export {}; -//# sourceMappingURL=PipeTransport.d.ts.map \ No newline at end of file diff --git a/node/lib/PipeTransport.d.ts.map b/node/lib/PipeTransport.d.ts.map deleted file mode 100644 index e6ffc3b340..0000000000 --- a/node/lib/PipeTransport.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"PipeTransport.d.ts","sourceRoot":"","sources":["../src/PipeTransport.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node/lib/PipeTransport.js b/node/lib/PipeTransport.js deleted file mode 100644 index 9250892ea8..0000000000 --- a/node/lib/PipeTransport.js +++ /dev/null @@ -1,178 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.PipeTransport = void 0; -const uuid_1 = require("uuid"); -const Logger_1 = require("./Logger"); -const ortc = require("./ortc"); -const Transport_1 = require("./Transport"); -const Consumer_1 = require("./Consumer"); -const logger = new Logger_1.Logger('PipeTransport'); -class PipeTransport extends Transport_1.Transport { - // PipeTransport data. - #data; - /** - * @private - */ - constructor(options) { - super(options); - logger.debug('constructor()'); - const { data } = options; - this.#data = - { - tuple: data.tuple, - sctpParameters: data.sctpParameters, - sctpState: data.sctpState, - rtx: data.rtx, - srtpParameters: data.srtpParameters - }; - this.handleWorkerNotifications(); - } - /** - * Transport tuple. - */ - get tuple() { - return this.#data.tuple; - } - /** - * SCTP parameters. - */ - get sctpParameters() { - return this.#data.sctpParameters; - } - /** - * SCTP state. - */ - get sctpState() { - return this.#data.sctpState; - } - /** - * SRTP parameters. - */ - get srtpParameters() { - return this.#data.srtpParameters; - } - /** - * Close the PipeTransport. - * - * @override - */ - close() { - if (this.closed) - return; - if (this.#data.sctpState) - this.#data.sctpState = 'closed'; - super.close(); - } - /** - * Router was closed. - * - * @private - * @override - */ - routerClosed() { - if (this.closed) - return; - if (this.#data.sctpState) - this.#data.sctpState = 'closed'; - super.routerClosed(); - } - /** - * Get PipeTransport stats. - * - * @override - */ - async getStats() { - logger.debug('getStats()'); - return this.channel.request('transport.getStats', this.internal.transportId); - } - /** - * Provide the PipeTransport remote parameters. - * - * @override - */ - async connect({ ip, port, srtpParameters }) { - logger.debug('connect()'); - const reqData = { ip, port, srtpParameters }; - const data = await this.channel.request('transport.connect', this.internal.transportId, reqData); - // Update data. - this.#data.tuple = data.tuple; - } - /** - * Create a pipe Consumer. - * - * @override - */ - async consume({ producerId, appData }) { - logger.debug('consume()'); - if (!producerId || typeof producerId !== 'string') - throw new TypeError('missing producerId'); - else if (appData && typeof appData !== 'object') - throw new TypeError('if given, appData must be an object'); - const producer = this.getProducerById(producerId); - if (!producer) - throw Error(`Producer with id "${producerId}" not found`); - // This may throw. - const rtpParameters = ortc.getPipeConsumerRtpParameters(producer.consumableRtpParameters, this.#data.rtx); - const reqData = { - consumerId: (0, uuid_1.v4)(), - producerId, - kind: producer.kind, - rtpParameters, - type: 'pipe', - consumableRtpEncodings: producer.consumableRtpParameters.encodings - }; - const status = await this.channel.request('transport.consume', this.internal.transportId, reqData); - const data = { - producerId, - kind: producer.kind, - rtpParameters, - type: 'pipe' - }; - const consumer = new Consumer_1.Consumer({ - internal: { - ...this.internal, - consumerId: reqData.consumerId - }, - data, - channel: this.channel, - payloadChannel: this.payloadChannel, - appData, - paused: status.paused, - producerPaused: status.producerPaused - }); - this.consumers.set(consumer.id, consumer); - consumer.on('@close', () => this.consumers.delete(consumer.id)); - consumer.on('@producerclose', () => this.consumers.delete(consumer.id)); - // Emit observer event. - this.observer.safeEmit('newconsumer', consumer); - return consumer; - } - handleWorkerNotifications() { - this.channel.on(this.internal.transportId, (event, data) => { - switch (event) { - case 'sctpstatechange': - { - const sctpState = data.sctpState; - this.#data.sctpState = sctpState; - this.safeEmit('sctpstatechange', sctpState); - // Emit observer event. - this.observer.safeEmit('sctpstatechange', sctpState); - break; - } - case 'trace': - { - const trace = data; - this.safeEmit('trace', trace); - // Emit observer event. - this.observer.safeEmit('trace', trace); - break; - } - default: - { - logger.error('ignoring unknown event "%s"', event); - } - } - }); - } -} -exports.PipeTransport = PipeTransport; diff --git a/node/lib/PlainTransport.d.ts b/node/lib/PlainTransport.d.ts deleted file mode 100644 index 21f9bcc45d..0000000000 --- a/node/lib/PlainTransport.d.ts +++ /dev/null @@ -1,166 +0,0 @@ -import { Transport, TransportListenIp, TransportTuple, TransportEvents, TransportObserverEvents, TransportConstructorOptions, SctpState } from './Transport'; -import { SctpParameters, NumSctpStreams } from './SctpParameters'; -import { SrtpParameters, SrtpCryptoSuite } from './SrtpParameters'; -export declare type PlainTransportOptions = { - /** - * Listening IP address. - */ - listenIp: TransportListenIp | string; - /** - * Fixed port to listen on instead of selecting automatically from Worker's port - * range. - */ - port?: number; - /** - * Use RTCP-mux (RTP and RTCP in the same port). Default true. - */ - rtcpMux?: boolean; - /** - * Whether remote IP:port should be auto-detected based on first RTP/RTCP - * packet received. If enabled, connect() method must not be called unless - * SRTP is enabled. If so, it must be called with just remote SRTP parameters. - * Default false. - */ - comedia?: boolean; - /** - * Create a SCTP association. Default false. - */ - enableSctp?: boolean; - /** - * SCTP streams number. - */ - numSctpStreams?: NumSctpStreams; - /** - * Maximum allowed size for SCTP messages sent by DataProducers. - * Default 262144. - */ - maxSctpMessageSize?: number; - /** - * Maximum SCTP send buffer used by DataConsumers. - * Default 262144. - */ - sctpSendBufferSize?: number; - /** - * Enable SRTP. For this to work, connect() must be called - * with remote SRTP parameters. Default false. - */ - enableSrtp?: boolean; - /** - * The SRTP crypto suite to be used if enableSrtp is set. Default - * 'AES_CM_128_HMAC_SHA1_80'. - */ - srtpCryptoSuite?: SrtpCryptoSuite; - /** - * Custom application data. - */ - appData?: Record; -}; -export declare type PlainTransportStat = { - type: string; - transportId: string; - timestamp: number; - sctpState?: SctpState; - bytesReceived: number; - recvBitrate: number; - bytesSent: number; - sendBitrate: number; - rtpBytesReceived: number; - rtpRecvBitrate: number; - rtpBytesSent: number; - rtpSendBitrate: number; - rtxBytesReceived: number; - rtxRecvBitrate: number; - rtxBytesSent: number; - rtxSendBitrate: number; - probationBytesSent: number; - probationSendBitrate: number; - availableOutgoingBitrate?: number; - availableIncomingBitrate?: number; - maxIncomingBitrate?: number; - rtcpMux: boolean; - comedia: boolean; - tuple: TransportTuple; - rtcpTuple?: TransportTuple; -}; -export declare type PlainTransportEvents = TransportEvents & { - tuple: [TransportTuple]; - rtcptuple: [TransportTuple]; - sctpstatechange: [SctpState]; -}; -export declare type PlainTransportObserverEvents = TransportObserverEvents & { - tuple: [TransportTuple]; - rtcptuple: [TransportTuple]; - sctpstatechange: [SctpState]; -}; -declare type PlainTransportConstructorOptions = TransportConstructorOptions & { - data: PlainTransportData; -}; -export declare type PlainTransportData = { - rtcpMux?: boolean; - comedia?: boolean; - tuple: TransportTuple; - rtcpTuple?: TransportTuple; - sctpParameters?: SctpParameters; - sctpState?: SctpState; - srtpParameters?: SrtpParameters; -}; -export declare class PlainTransport extends Transport { - #private; - /** - * @private - */ - constructor(options: PlainTransportConstructorOptions); - /** - * Transport tuple. - */ - get tuple(): TransportTuple; - /** - * Transport RTCP tuple. - */ - get rtcpTuple(): TransportTuple | undefined; - /** - * SCTP parameters. - */ - get sctpParameters(): SctpParameters | undefined; - /** - * SCTP state. - */ - get sctpState(): SctpState | undefined; - /** - * SRTP parameters. - */ - get srtpParameters(): SrtpParameters | undefined; - /** - * Close the PlainTransport. - * - * @override - */ - close(): void; - /** - * Router was closed. - * - * @private - * @override - */ - routerClosed(): void; - /** - * Get PlainTransport stats. - * - * @override - */ - getStats(): Promise; - /** - * Provide the PlainTransport remote parameters. - * - * @override - */ - connect({ ip, port, rtcpPort, srtpParameters }: { - ip?: string; - port?: number; - rtcpPort?: number; - srtpParameters?: SrtpParameters; - }): Promise; - private handleWorkerNotifications; -} -export {}; -//# sourceMappingURL=PlainTransport.d.ts.map \ No newline at end of file diff --git a/node/lib/PlainTransport.d.ts.map b/node/lib/PlainTransport.d.ts.map deleted file mode 100644 index 848f73bc47..0000000000 --- a/node/lib/PlainTransport.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"PlainTransport.d.ts","sourceRoot":"","sources":["../src/PlainTransport.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node/lib/PlainTransport.js b/node/lib/PlainTransport.js deleted file mode 100644 index c328f25cc2..0000000000 --- a/node/lib/PlainTransport.js +++ /dev/null @@ -1,155 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.PlainTransport = void 0; -const Logger_1 = require("./Logger"); -const Transport_1 = require("./Transport"); -const logger = new Logger_1.Logger('PlainTransport'); -class PlainTransport extends Transport_1.Transport { - // PlainTransport data. - #data; - /** - * @private - */ - constructor(options) { - super(options); - logger.debug('constructor()'); - const { data } = options; - this.#data = - { - rtcpMux: data.rtcpMux, - comedia: data.comedia, - tuple: data.tuple, - rtcpTuple: data.rtcpTuple, - sctpParameters: data.sctpParameters, - sctpState: data.sctpState, - srtpParameters: data.srtpParameters - }; - this.handleWorkerNotifications(); - } - /** - * Transport tuple. - */ - get tuple() { - return this.#data.tuple; - } - /** - * Transport RTCP tuple. - */ - get rtcpTuple() { - return this.#data.rtcpTuple; - } - /** - * SCTP parameters. - */ - get sctpParameters() { - return this.#data.sctpParameters; - } - /** - * SCTP state. - */ - get sctpState() { - return this.#data.sctpState; - } - /** - * SRTP parameters. - */ - get srtpParameters() { - return this.#data.srtpParameters; - } - /** - * Close the PlainTransport. - * - * @override - */ - close() { - if (this.closed) - return; - if (this.#data.sctpState) - this.#data.sctpState = 'closed'; - super.close(); - } - /** - * Router was closed. - * - * @private - * @override - */ - routerClosed() { - if (this.closed) - return; - if (this.#data.sctpState) - this.#data.sctpState = 'closed'; - super.routerClosed(); - } - /** - * Get PlainTransport stats. - * - * @override - */ - async getStats() { - logger.debug('getStats()'); - return this.channel.request('transport.getStats', this.internal.transportId); - } - /** - * Provide the PlainTransport remote parameters. - * - * @override - */ - async connect({ ip, port, rtcpPort, srtpParameters }) { - logger.debug('connect()'); - const reqData = { ip, port, rtcpPort, srtpParameters }; - const data = await this.channel.request('transport.connect', this.internal.transportId, reqData); - // Update data. - if (data.tuple) - this.#data.tuple = data.tuple; - if (data.rtcpTuple) - this.#data.rtcpTuple = data.rtcpTuple; - this.#data.srtpParameters = data.srtpParameters; - } - handleWorkerNotifications() { - this.channel.on(this.internal.transportId, (event, data) => { - switch (event) { - case 'tuple': - { - const tuple = data.tuple; - this.#data.tuple = tuple; - this.safeEmit('tuple', tuple); - // Emit observer event. - this.observer.safeEmit('tuple', tuple); - break; - } - case 'rtcptuple': - { - const rtcpTuple = data.rtcpTuple; - this.#data.rtcpTuple = rtcpTuple; - this.safeEmit('rtcptuple', rtcpTuple); - // Emit observer event. - this.observer.safeEmit('rtcptuple', rtcpTuple); - break; - } - case 'sctpstatechange': - { - const sctpState = data.sctpState; - this.#data.sctpState = sctpState; - this.safeEmit('sctpstatechange', sctpState); - // Emit observer event. - this.observer.safeEmit('sctpstatechange', sctpState); - break; - } - case 'trace': - { - const trace = data; - this.safeEmit('trace', trace); - // Emit observer event. - this.observer.safeEmit('trace', trace); - break; - } - default: - { - logger.error('ignoring unknown event "%s"', event); - } - } - }); - } -} -exports.PlainTransport = PlainTransport; diff --git a/node/lib/Producer.d.ts b/node/lib/Producer.d.ts deleted file mode 100644 index 04eef495c4..0000000000 --- a/node/lib/Producer.d.ts +++ /dev/null @@ -1,242 +0,0 @@ -/// -import { EnhancedEventEmitter } from './EnhancedEventEmitter'; -import { Channel } from './Channel'; -import { PayloadChannel } from './PayloadChannel'; -import { TransportInternal } from './Transport'; -import { MediaKind, RtpParameters } from './RtpParameters'; -export declare type ProducerOptions = { - /** - * Producer id (just for Router.pipeToRouter() method). - */ - id?: string; - /** - * Media kind ('audio' or 'video'). - */ - kind: MediaKind; - /** - * RTP parameters defining what the endpoint is sending. - */ - rtpParameters: RtpParameters; - /** - * Whether the producer must start in paused mode. Default false. - */ - paused?: boolean; - /** - * Just for video. Time (in ms) before asking the sender for a new key frame - * after having asked a previous one. Default 0. - */ - keyFrameRequestDelay?: number; - /** - * Custom application data. - */ - appData?: Record; -}; -/** - * Valid types for 'trace' event. - */ -export declare type ProducerTraceEventType = 'rtp' | 'keyframe' | 'nack' | 'pli' | 'fir'; -/** - * 'trace' event data. - */ -export declare type ProducerTraceEventData = { - /** - * Trace type. - */ - type: ProducerTraceEventType; - /** - * Event timestamp. - */ - timestamp: number; - /** - * Event direction. - */ - direction: 'in' | 'out'; - /** - * Per type information. - */ - info: any; -}; -export declare type ProducerScore = { - /** - * SSRC of the RTP stream. - */ - ssrc: number; - /** - * RID of the RTP stream. - */ - rid?: string; - /** - * The score of the RTP stream. - */ - score: number; -}; -export declare type ProducerVideoOrientation = { - /** - * Whether the source is a video camera. - */ - camera: boolean; - /** - * Whether the video source is flipped. - */ - flip: boolean; - /** - * Rotation degrees (0, 90, 180 or 270). - */ - rotation: number; -}; -export declare type ProducerStat = { - type: string; - timestamp: number; - ssrc: number; - rtxSsrc?: number; - rid?: string; - kind: string; - mimeType: string; - packetsLost: number; - fractionLost: number; - packetsDiscarded: number; - packetsRetransmitted: number; - packetsRepaired: number; - nackCount: number; - nackPacketCount: number; - pliCount: number; - firCount: number; - score: number; - packetCount: number; - byteCount: number; - bitrate: number; - roundTripTime?: number; - rtxPacketsDiscarded?: number; - jitter: number; - bitrateByLayer?: any; -}; -/** - * Producer type. - */ -export declare type ProducerType = 'simple' | 'simulcast' | 'svc'; -export declare type ProducerEvents = { - transportclose: []; - score: [ProducerScore[]]; - videoorientationchange: [ProducerVideoOrientation]; - trace: [ProducerTraceEventData]; - '@close': []; -}; -export declare type ProducerObserverEvents = { - close: []; - pause: []; - resume: []; - score: [ProducerScore[]]; - videoorientationchange: [ProducerVideoOrientation]; - trace: [ProducerTraceEventData]; -}; -declare type ProducerInternal = TransportInternal & { - producerId: string; -}; -declare type ProducerData = { - kind: MediaKind; - rtpParameters: RtpParameters; - type: ProducerType; - consumableRtpParameters: RtpParameters; -}; -export declare class Producer extends EnhancedEventEmitter { - #private; - /** - * @private - */ - constructor({ internal, data, channel, payloadChannel, appData, paused }: { - internal: ProducerInternal; - data: ProducerData; - channel: Channel; - payloadChannel: PayloadChannel; - appData?: Record; - paused: boolean; - }); - /** - * Producer id. - */ - get id(): string; - /** - * Whether the Producer is closed. - */ - get closed(): boolean; - /** - * Media kind. - */ - get kind(): MediaKind; - /** - * RTP parameters. - */ - get rtpParameters(): RtpParameters; - /** - * Producer type. - */ - get type(): ProducerType; - /** - * Consumable RTP parameters. - * - * @private - */ - get consumableRtpParameters(): RtpParameters; - /** - * Whether the Producer is paused. - */ - get paused(): boolean; - /** - * Producer score list. - */ - get score(): ProducerScore[]; - /** - * App custom data. - */ - get appData(): Record; - /** - * Invalid setter. - */ - set appData(appData: Record); - /** - * Observer. - */ - get observer(): EnhancedEventEmitter; - /** - * @private - * Just for testing purposes. - */ - get channelForTesting(): Channel; - /** - * Close the Producer. - */ - close(): void; - /** - * Transport was closed. - * - * @private - */ - transportClosed(): void; - /** - * Dump Producer. - */ - dump(): Promise; - /** - * Get Producer stats. - */ - getStats(): Promise; - /** - * Pause the Producer. - */ - pause(): Promise; - /** - * Resume the Producer. - */ - resume(): Promise; - /** - * Enable 'trace' event. - */ - enableTraceEvent(types?: ProducerTraceEventType[]): Promise; - /** - * Send RTP packet (just valid for Producers created on a DirectTransport). - */ - send(rtpPacket: Buffer): void; - private handleWorkerNotifications; -} -export {}; -//# sourceMappingURL=Producer.d.ts.map \ No newline at end of file diff --git a/node/lib/Producer.d.ts.map b/node/lib/Producer.d.ts.map deleted file mode 100644 index d64a89d570..0000000000 --- a/node/lib/Producer.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"Producer.d.ts","sourceRoot":"","sources":["../src/Producer.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAE3D,oBAAY,eAAe,GAC3B;IACC;;OAEG;IACH,EAAE,CAAC,EAAE,MAAM,CAAC;IAEZ;;OAEG;IACH,IAAI,EAAE,SAAS,CAAC;IAEhB;;OAEG;IACH,aAAa,EAAE,aAAa,CAAC;IAE7B;;OAEG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB;;;OAGG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAE9B;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC,CAAC;AAEF;;GAEG;AACH,oBAAY,sBAAsB,GAAG,KAAK,GAAG,UAAU,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC;AAEjF;;GAEG;AACH,oBAAY,sBAAsB,GAClC;IACC;;OAEG;IACH,IAAI,EAAE,sBAAsB,CAAC;IAE7B;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,SAAS,EAAE,IAAI,GAAG,KAAK,CAAC;IAExB;;OAEG;IACH,IAAI,EAAE,GAAG,CAAC;CACV,CAAC;AAEF,oBAAY,aAAa,GACzB;IACC;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,oBAAY,wBAAwB,GACpC;IACC;;OAEG;IACH,MAAM,EAAE,OAAO,CAAC;IAEhB;;OAEG;IACH,IAAI,EAAE,OAAO,CAAC;IAEd;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,oBAAY,YAAY,GACxB;IAEC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAE7B,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,GAAG,CAAC;CACrB,CAAC;AAEF;;GAEG;AACH,oBAAY,YAAY,GAAG,QAAQ,GAAG,WAAW,GAAG,KAAK,CAAC;AAE1D,oBAAY,cAAc,GAC1B;IACC,cAAc,EAAE,EAAE,CAAC;IACnB,KAAK,EAAE,CAAC,aAAa,EAAE,CAAC,CAAC;IACzB,sBAAsB,EAAE,CAAC,wBAAwB,CAAC,CAAC;IACnD,KAAK,EAAE,CAAC,sBAAsB,CAAC,CAAC;IAEhC,QAAQ,EAAE,EAAE,CAAC;CACb,CAAC;AAEF,oBAAY,sBAAsB,GAClC;IACC,KAAK,EAAE,EAAE,CAAC;IACV,KAAK,EAAE,EAAE,CAAC;IACV,MAAM,EAAE,EAAE,CAAC;IACX,KAAK,EAAE,CAAC,aAAa,EAAE,CAAC,CAAC;IACzB,sBAAsB,EAAE,CAAC,wBAAwB,CAAC,CAAC;IACnD,KAAK,EAAE,CAAC,sBAAsB,CAAC,CAAC;CAChC,CAAC;AAEF,aAAK,gBAAgB,GAAG,iBAAiB,GACzC;IACC,UAAU,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,aAAK,YAAY,GACjB;IACC,IAAI,EAAE,SAAS,CAAC;IAChB,aAAa,EAAE,aAAa,CAAC;IAC7B,IAAI,EAAE,YAAY,CAAC;IACnB,uBAAuB,EAAE,aAAa,CAAC;CACvC,CAAC;AAIF,qBAAa,QAAS,SAAQ,oBAAoB,CAAC,cAAc,CAAC;;IA6BjE;;OAEG;gBAEF,EACC,QAAQ,EACR,IAAI,EACJ,OAAO,EACP,cAAc,EACd,OAAO,EACP,MAAM,EACN,EACD;QACC,QAAQ,EAAE,gBAAgB,CAAC;QAC3B,IAAI,EAAE,YAAY,CAAC;QACnB,OAAO,EAAE,OAAO,CAAC;QACjB,cAAc,EAAE,cAAc,CAAC;QAC/B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAClC,MAAM,EAAE,OAAO,CAAC;KAChB;IAiBF;;OAEG;IACH,IAAI,EAAE,IAAI,MAAM,CAGf;IAED;;OAEG;IACH,IAAI,MAAM,IAAI,OAAO,CAGpB;IAED;;OAEG;IACH,IAAI,IAAI,IAAI,SAAS,CAGpB;IAED;;OAEG;IACH,IAAI,aAAa,IAAI,aAAa,CAGjC;IAED;;OAEG;IACH,IAAI,IAAI,IAAI,YAAY,CAGvB;IAED;;;;OAIG;IACH,IAAI,uBAAuB,IAAI,aAAa,CAG3C;IAED;;OAEG;IACH,IAAI,MAAM,IAAI,OAAO,CAGpB;IAED;;OAEG;IACH,IAAI,KAAK,IAAI,aAAa,EAAE,CAG3B;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAGrC;IAED;;OAEG;IACH,IAAI,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAG3C;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,oBAAoB,CAAC,sBAAsB,CAAC,CAG3D;IAED;;;OAGG;IACH,IAAI,iBAAiB,IAAI,OAAO,CAG/B;IAED;;OAEG;IACH,KAAK,IAAI,IAAI;IAwBb;;;;OAIG;IACH,eAAe,IAAI,IAAI;IAmBvB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC;IAO1B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAOzC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAe5B;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAe7B;;OAEG;IACG,gBAAgB,CAAC,KAAK,GAAE,sBAAsB,EAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAU3E;;OAEG;IACH,IAAI,CAAC,SAAS,EAAE,MAAM;IAWtB,OAAO,CAAC,yBAAyB;CAmDjC"} \ No newline at end of file diff --git a/node/lib/Producer.js b/node/lib/Producer.js deleted file mode 100644 index 6a742f87ef..0000000000 --- a/node/lib/Producer.js +++ /dev/null @@ -1,241 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.Producer = void 0; -const Logger_1 = require("./Logger"); -const EnhancedEventEmitter_1 = require("./EnhancedEventEmitter"); -const logger = new Logger_1.Logger('Producer'); -class Producer extends EnhancedEventEmitter_1.EnhancedEventEmitter { - // Internal data. - #internal; - // Producer data. - #data; - // Channel instance. - #channel; - // PayloadChannel instance. - #payloadChannel; - // Closed flag. - #closed = false; - // Custom app data. - #appData; - // Paused flag. - #paused = false; - // Current score. - #score = []; - // Observer instance. - #observer = new EnhancedEventEmitter_1.EnhancedEventEmitter(); - /** - * @private - */ - constructor({ internal, data, channel, payloadChannel, appData, paused }) { - super(); - logger.debug('constructor()'); - this.#internal = internal; - this.#data = data; - this.#channel = channel; - this.#payloadChannel = payloadChannel; - this.#appData = appData || {}; - this.#paused = paused; - this.handleWorkerNotifications(); - } - /** - * Producer id. - */ - get id() { - return this.#internal.producerId; - } - /** - * Whether the Producer is closed. - */ - get closed() { - return this.#closed; - } - /** - * Media kind. - */ - get kind() { - return this.#data.kind; - } - /** - * RTP parameters. - */ - get rtpParameters() { - return this.#data.rtpParameters; - } - /** - * Producer type. - */ - get type() { - return this.#data.type; - } - /** - * Consumable RTP parameters. - * - * @private - */ - get consumableRtpParameters() { - return this.#data.consumableRtpParameters; - } - /** - * Whether the Producer is paused. - */ - get paused() { - return this.#paused; - } - /** - * Producer score list. - */ - get score() { - return this.#score; - } - /** - * App custom data. - */ - get appData() { - return this.#appData; - } - /** - * Invalid setter. - */ - set appData(appData) { - throw new Error('cannot override appData object'); - } - /** - * Observer. - */ - get observer() { - return this.#observer; - } - /** - * @private - * Just for testing purposes. - */ - get channelForTesting() { - return this.#channel; - } - /** - * Close the Producer. - */ - close() { - if (this.#closed) - return; - logger.debug('close()'); - this.#closed = true; - // Remove notification subscriptions. - this.#channel.removeAllListeners(this.#internal.producerId); - this.#payloadChannel.removeAllListeners(this.#internal.producerId); - const reqData = { producerId: this.#internal.producerId }; - this.#channel.request('transport.closeProducer', this.#internal.transportId, reqData) - .catch(() => { }); - this.emit('@close'); - // Emit observer event. - this.#observer.safeEmit('close'); - } - /** - * Transport was closed. - * - * @private - */ - transportClosed() { - if (this.#closed) - return; - logger.debug('transportClosed()'); - this.#closed = true; - // Remove notification subscriptions. - this.#channel.removeAllListeners(this.#internal.producerId); - this.#payloadChannel.removeAllListeners(this.#internal.producerId); - this.safeEmit('transportclose'); - // Emit observer event. - this.#observer.safeEmit('close'); - } - /** - * Dump Producer. - */ - async dump() { - logger.debug('dump()'); - return this.#channel.request('producer.dump', this.#internal.producerId); - } - /** - * Get Producer stats. - */ - async getStats() { - logger.debug('getStats()'); - return this.#channel.request('producer.getStats', this.#internal.producerId); - } - /** - * Pause the Producer. - */ - async pause() { - logger.debug('pause()'); - const wasPaused = this.#paused; - await this.#channel.request('producer.pause', this.#internal.producerId); - this.#paused = true; - // Emit observer event. - if (!wasPaused) - this.#observer.safeEmit('pause'); - } - /** - * Resume the Producer. - */ - async resume() { - logger.debug('resume()'); - const wasPaused = this.#paused; - await this.#channel.request('producer.resume', this.#internal.producerId); - this.#paused = false; - // Emit observer event. - if (wasPaused) - this.#observer.safeEmit('resume'); - } - /** - * Enable 'trace' event. - */ - async enableTraceEvent(types = []) { - logger.debug('enableTraceEvent()'); - const reqData = { types }; - await this.#channel.request('producer.enableTraceEvent', this.#internal.producerId, reqData); - } - /** - * Send RTP packet (just valid for Producers created on a DirectTransport). - */ - send(rtpPacket) { - if (!Buffer.isBuffer(rtpPacket)) { - throw new TypeError('rtpPacket must be a Buffer'); - } - this.#payloadChannel.notify('producer.send', this.#internal.producerId, undefined, rtpPacket); - } - handleWorkerNotifications() { - this.#channel.on(this.#internal.producerId, (event, data) => { - switch (event) { - case 'score': - { - const score = data; - this.#score = score; - this.safeEmit('score', score); - // Emit observer event. - this.#observer.safeEmit('score', score); - break; - } - case 'videoorientationchange': - { - const videoOrientation = data; - this.safeEmit('videoorientationchange', videoOrientation); - // Emit observer event. - this.#observer.safeEmit('videoorientationchange', videoOrientation); - break; - } - case 'trace': - { - const trace = data; - this.safeEmit('trace', trace); - // Emit observer event. - this.#observer.safeEmit('trace', trace); - break; - } - default: - { - logger.error('ignoring unknown event "%s"', event); - } - } - }); - } -} -exports.Producer = Producer; diff --git a/node/lib/Router.d.ts b/node/lib/Router.d.ts deleted file mode 100644 index 25642a9a54..0000000000 --- a/node/lib/Router.d.ts +++ /dev/null @@ -1,191 +0,0 @@ -import { EnhancedEventEmitter } from './EnhancedEventEmitter'; -import { Channel } from './Channel'; -import { PayloadChannel } from './PayloadChannel'; -import { Transport, TransportListenIp } from './Transport'; -import { WebRtcTransport, WebRtcTransportOptions } from './WebRtcTransport'; -import { PlainTransport, PlainTransportOptions } from './PlainTransport'; -import { PipeTransport, PipeTransportOptions } from './PipeTransport'; -import { DirectTransport, DirectTransportOptions } from './DirectTransport'; -import { Producer } from './Producer'; -import { Consumer } from './Consumer'; -import { DataProducer } from './DataProducer'; -import { DataConsumer } from './DataConsumer'; -import { RtpObserver } from './RtpObserver'; -import { ActiveSpeakerObserver, ActiveSpeakerObserverOptions } from './ActiveSpeakerObserver'; -import { AudioLevelObserver, AudioLevelObserverOptions } from './AudioLevelObserver'; -import { RtpCapabilities, RtpCodecCapability } from './RtpParameters'; -import { NumSctpStreams } from './SctpParameters'; -export declare type RouterOptions = { - /** - * Router media codecs. - */ - mediaCodecs?: RtpCodecCapability[]; - /** - * Custom application data. - */ - appData?: Record; -}; -export declare type PipeToRouterOptions = { - /** - * The id of the Producer to consume. - */ - producerId?: string; - /** - * The id of the DataProducer to consume. - */ - dataProducerId?: string; - /** - * Target Router instance. - */ - router: Router; - /** - * IP used in the PipeTransport pair. Default '127.0.0.1'. - */ - listenIp?: TransportListenIp | string; - /** - * Create a SCTP association. Default true. - */ - enableSctp?: boolean; - /** - * SCTP streams number. - */ - numSctpStreams?: NumSctpStreams; - /** - * Enable RTX and NACK for RTP retransmission. - */ - enableRtx?: boolean; - /** - * Enable SRTP. - */ - enableSrtp?: boolean; -}; -export declare type PipeToRouterResult = { - /** - * The Consumer created in the current Router. - */ - pipeConsumer?: Consumer; - /** - * The Producer created in the target Router. - */ - pipeProducer?: Producer; - /** - * The DataConsumer created in the current Router. - */ - pipeDataConsumer?: DataConsumer; - /** - * The DataProducer created in the target Router. - */ - pipeDataProducer?: DataProducer; -}; -declare type PipeTransportPair = { - [key: string]: PipeTransport; -}; -export declare type RouterEvents = { - workerclose: []; - '@close': []; -}; -export declare type RouterObserverEvents = { - close: []; - newtransport: [Transport]; - newrtpobserver: [RtpObserver]; -}; -export declare type RouterInternal = { - routerId: string; -}; -export declare class Router extends EnhancedEventEmitter { - #private; - /** - * @private - */ - constructor({ internal, data, channel, payloadChannel, appData }: { - internal: RouterInternal; - data: any; - channel: Channel; - payloadChannel: PayloadChannel; - appData?: Record; - }); - /** - * Router id. - */ - get id(): string; - /** - * Whether the Router is closed. - */ - get closed(): boolean; - /** - * RTP capabilities of the Router. - */ - get rtpCapabilities(): RtpCapabilities; - /** - * App custom data. - */ - get appData(): Record; - /** - * Invalid setter. - */ - set appData(appData: Record); - /** - * Observer. - */ - get observer(): EnhancedEventEmitter; - /** - * @private - * Just for testing purposes. - */ - get transportsForTesting(): Map; - /** - * Close the Router. - */ - close(): void; - /** - * Worker was closed. - * - * @private - */ - workerClosed(): void; - /** - * Dump Router. - */ - dump(): Promise; - /** - * Create a WebRtcTransport. - */ - createWebRtcTransport({ webRtcServer, listenIps, port, enableUdp, enableTcp, preferUdp, preferTcp, initialAvailableOutgoingBitrate, enableSctp, numSctpStreams, maxSctpMessageSize, sctpSendBufferSize, appData }: WebRtcTransportOptions): Promise; - /** - * Create a PlainTransport. - */ - createPlainTransport({ listenIp, port, rtcpMux, comedia, enableSctp, numSctpStreams, maxSctpMessageSize, sctpSendBufferSize, enableSrtp, srtpCryptoSuite, appData }: PlainTransportOptions): Promise; - /** - * Create a PipeTransport. - */ - createPipeTransport({ listenIp, port, enableSctp, numSctpStreams, maxSctpMessageSize, sctpSendBufferSize, enableRtx, enableSrtp, appData }: PipeTransportOptions): Promise; - /** - * Create a DirectTransport. - */ - createDirectTransport({ maxMessageSize, appData }?: DirectTransportOptions): Promise; - /** - * Pipes the given Producer or DataProducer into another Router in same host. - */ - pipeToRouter({ producerId, dataProducerId, router, listenIp, enableSctp, numSctpStreams, enableRtx, enableSrtp }: PipeToRouterOptions): Promise; - /** - * @private - */ - addPipeTransportPair(pipeTransportPairKey: string, pipeTransportPairPromise: Promise): void; - /** - * Create an ActiveSpeakerObserver - */ - createActiveSpeakerObserver({ interval, appData }?: ActiveSpeakerObserverOptions): Promise; - /** - * Create an AudioLevelObserver. - */ - createAudioLevelObserver({ maxEntries, threshold, interval, appData }?: AudioLevelObserverOptions): Promise; - /** - * Check whether the given RTP capabilities can consume the given Producer. - */ - canConsume({ producerId, rtpCapabilities }: { - producerId: string; - rtpCapabilities: RtpCapabilities; - }): boolean; -} -export {}; -//# sourceMappingURL=Router.d.ts.map \ No newline at end of file diff --git a/node/lib/Router.d.ts.map b/node/lib/Router.d.ts.map deleted file mode 100644 index 8ee3aef282..0000000000 --- a/node/lib/Router.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"Router.d.ts","sourceRoot":"","sources":["../src/Router.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node/lib/Router.js b/node/lib/Router.js deleted file mode 100644 index 785c8cb8b8..0000000000 --- a/node/lib/Router.js +++ /dev/null @@ -1,653 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.Router = void 0; -const uuid_1 = require("uuid"); -const Logger_1 = require("./Logger"); -const EnhancedEventEmitter_1 = require("./EnhancedEventEmitter"); -const ortc = require("./ortc"); -const errors_1 = require("./errors"); -const WebRtcTransport_1 = require("./WebRtcTransport"); -const PlainTransport_1 = require("./PlainTransport"); -const PipeTransport_1 = require("./PipeTransport"); -const DirectTransport_1 = require("./DirectTransport"); -const ActiveSpeakerObserver_1 = require("./ActiveSpeakerObserver"); -const AudioLevelObserver_1 = require("./AudioLevelObserver"); -const logger = new Logger_1.Logger('Router'); -class Router extends EnhancedEventEmitter_1.EnhancedEventEmitter { - // Internal data. - #internal; - // Router data. - #data; - // Channel instance. - #channel; - // PayloadChannel instance. - #payloadChannel; - // Closed flag. - #closed = false; - // Custom app data. - #appData; - // Transports map. - #transports = new Map(); - // Producers map. - #producers = new Map(); - // RtpObservers map. - #rtpObservers = new Map(); - // DataProducers map. - #dataProducers = new Map(); - // Map of PipeTransport pair Promises indexed by the id of the Router in - // which pipeToRouter() was called. - #mapRouterPairPipeTransportPairPromise = new Map(); - // Observer instance. - #observer = new EnhancedEventEmitter_1.EnhancedEventEmitter(); - /** - * @private - */ - constructor({ internal, data, channel, payloadChannel, appData }) { - super(); - logger.debug('constructor()'); - this.#internal = internal; - this.#data = data; - this.#channel = channel; - this.#payloadChannel = payloadChannel; - this.#appData = appData || {}; - } - /** - * Router id. - */ - get id() { - return this.#internal.routerId; - } - /** - * Whether the Router is closed. - */ - get closed() { - return this.#closed; - } - /** - * RTP capabilities of the Router. - */ - get rtpCapabilities() { - return this.#data.rtpCapabilities; - } - /** - * App custom data. - */ - get appData() { - return this.#appData; - } - /** - * Invalid setter. - */ - set appData(appData) { - throw new Error('cannot override appData object'); - } - /** - * Observer. - */ - get observer() { - return this.#observer; - } - /** - * @private - * Just for testing purposes. - */ - get transportsForTesting() { - return this.#transports; - } - /** - * Close the Router. - */ - close() { - if (this.#closed) - return; - logger.debug('close()'); - this.#closed = true; - const reqData = { routerId: this.#internal.routerId }; - this.#channel.request('worker.closeRouter', undefined, reqData) - .catch(() => { }); - // Close every Transport. - for (const transport of this.#transports.values()) { - transport.routerClosed(); - } - this.#transports.clear(); - // Clear the Producers map. - this.#producers.clear(); - // Close every RtpObserver. - for (const rtpObserver of this.#rtpObservers.values()) { - rtpObserver.routerClosed(); - } - this.#rtpObservers.clear(); - // Clear the DataProducers map. - this.#dataProducers.clear(); - this.emit('@close'); - // Emit observer event. - this.#observer.safeEmit('close'); - } - /** - * Worker was closed. - * - * @private - */ - workerClosed() { - if (this.#closed) - return; - logger.debug('workerClosed()'); - this.#closed = true; - // Close every Transport. - for (const transport of this.#transports.values()) { - transport.routerClosed(); - } - this.#transports.clear(); - // Clear the Producers map. - this.#producers.clear(); - // Close every RtpObserver. - for (const rtpObserver of this.#rtpObservers.values()) { - rtpObserver.routerClosed(); - } - this.#rtpObservers.clear(); - // Clear the DataProducers map. - this.#dataProducers.clear(); - this.safeEmit('workerclose'); - // Emit observer event. - this.#observer.safeEmit('close'); - } - /** - * Dump Router. - */ - async dump() { - logger.debug('dump()'); - return this.#channel.request('router.dump', this.#internal.routerId); - } - /** - * Create a WebRtcTransport. - */ - async createWebRtcTransport({ webRtcServer, listenIps, port, enableUdp = true, enableTcp = false, preferUdp = false, preferTcp = false, initialAvailableOutgoingBitrate = 600000, enableSctp = false, numSctpStreams = { OS: 1024, MIS: 1024 }, maxSctpMessageSize = 262144, sctpSendBufferSize = 262144, appData }) { - logger.debug('createWebRtcTransport()'); - if (!webRtcServer && !Array.isArray(listenIps)) - throw new TypeError('missing webRtcServer and listenIps (one of them is mandatory)'); - else if (appData && typeof appData !== 'object') - throw new TypeError('if given, appData must be an object'); - if (listenIps) { - listenIps = listenIps.map((listenIp) => { - if (typeof listenIp === 'string' && listenIp) { - return { ip: listenIp }; - } - else if (typeof listenIp === 'object') { - return { - ip: listenIp.ip, - announcedIp: listenIp.announcedIp || undefined - }; - } - else { - throw new TypeError('wrong listenIp'); - } - }); - } - const reqData = { - transportId: (0, uuid_1.v4)(), - webRtcServerId: webRtcServer ? webRtcServer.id : undefined, - listenIps, - port, - enableUdp, - enableTcp, - preferUdp, - preferTcp, - initialAvailableOutgoingBitrate, - enableSctp, - numSctpStreams, - maxSctpMessageSize, - sctpSendBufferSize, - isDataChannel: true - }; - const data = webRtcServer - ? await this.#channel.request('router.createWebRtcTransportWithServer', this.#internal.routerId, reqData) - : await this.#channel.request('router.createWebRtcTransport', this.#internal.routerId, reqData); - const transport = new WebRtcTransport_1.WebRtcTransport({ - internal: { - ...this.#internal, - transportId: reqData.transportId - }, - data, - channel: this.#channel, - payloadChannel: this.#payloadChannel, - appData, - getRouterRtpCapabilities: () => this.#data.rtpCapabilities, - getProducerById: (producerId) => (this.#producers.get(producerId)), - getDataProducerById: (dataProducerId) => (this.#dataProducers.get(dataProducerId)) - }); - this.#transports.set(transport.id, transport); - transport.on('@close', () => this.#transports.delete(transport.id)); - transport.on('@listenserverclose', () => this.#transports.delete(transport.id)); - transport.on('@newproducer', (producer) => this.#producers.set(producer.id, producer)); - transport.on('@producerclose', (producer) => this.#producers.delete(producer.id)); - transport.on('@newdataproducer', (dataProducer) => (this.#dataProducers.set(dataProducer.id, dataProducer))); - transport.on('@dataproducerclose', (dataProducer) => (this.#dataProducers.delete(dataProducer.id))); - if (webRtcServer) - webRtcServer.handleWebRtcTransport(transport); - // Emit observer event. - this.#observer.safeEmit('newtransport', transport); - return transport; - } - /** - * Create a PlainTransport. - */ - async createPlainTransport({ listenIp, port, rtcpMux = true, comedia = false, enableSctp = false, numSctpStreams = { OS: 1024, MIS: 1024 }, maxSctpMessageSize = 262144, sctpSendBufferSize = 262144, enableSrtp = false, srtpCryptoSuite = 'AES_CM_128_HMAC_SHA1_80', appData }) { - logger.debug('createPlainTransport()'); - if (!listenIp) - throw new TypeError('missing listenIp'); - else if (appData && typeof appData !== 'object') - throw new TypeError('if given, appData must be an object'); - if (typeof listenIp === 'string' && listenIp) { - listenIp = { ip: listenIp }; - } - else if (typeof listenIp === 'object') { - listenIp = - { - ip: listenIp.ip, - announcedIp: listenIp.announcedIp || undefined - }; - } - else { - throw new TypeError('wrong listenIp'); - } - const reqData = { - transportId: (0, uuid_1.v4)(), - listenIp, - port, - rtcpMux, - comedia, - enableSctp, - numSctpStreams, - maxSctpMessageSize, - sctpSendBufferSize, - isDataChannel: false, - enableSrtp, - srtpCryptoSuite - }; - const data = await this.#channel.request('router.createPlainTransport', this.#internal.routerId, reqData); - const transport = new PlainTransport_1.PlainTransport({ - internal: { - ...this.#internal, - transportId: reqData.transportId - }, - data, - channel: this.#channel, - payloadChannel: this.#payloadChannel, - appData, - getRouterRtpCapabilities: () => this.#data.rtpCapabilities, - getProducerById: (producerId) => (this.#producers.get(producerId)), - getDataProducerById: (dataProducerId) => (this.#dataProducers.get(dataProducerId)) - }); - this.#transports.set(transport.id, transport); - transport.on('@close', () => this.#transports.delete(transport.id)); - transport.on('@listenserverclose', () => this.#transports.delete(transport.id)); - transport.on('@newproducer', (producer) => this.#producers.set(producer.id, producer)); - transport.on('@producerclose', (producer) => this.#producers.delete(producer.id)); - transport.on('@newdataproducer', (dataProducer) => (this.#dataProducers.set(dataProducer.id, dataProducer))); - transport.on('@dataproducerclose', (dataProducer) => (this.#dataProducers.delete(dataProducer.id))); - // Emit observer event. - this.#observer.safeEmit('newtransport', transport); - return transport; - } - /** - * Create a PipeTransport. - */ - async createPipeTransport({ listenIp, port, enableSctp = false, numSctpStreams = { OS: 1024, MIS: 1024 }, maxSctpMessageSize = 268435456, sctpSendBufferSize = 268435456, enableRtx = false, enableSrtp = false, appData }) { - logger.debug('createPipeTransport()'); - if (!listenIp) - throw new TypeError('missing listenIp'); - else if (appData && typeof appData !== 'object') - throw new TypeError('if given, appData must be an object'); - if (typeof listenIp === 'string' && listenIp) { - listenIp = { ip: listenIp }; - } - else if (typeof listenIp === 'object') { - listenIp = - { - ip: listenIp.ip, - announcedIp: listenIp.announcedIp || undefined - }; - } - else { - throw new TypeError('wrong listenIp'); - } - const reqData = { - transportId: (0, uuid_1.v4)(), - listenIp, - port, - enableSctp, - numSctpStreams, - maxSctpMessageSize, - sctpSendBufferSize, - isDataChannel: false, - enableRtx, - enableSrtp - }; - const data = await this.#channel.request('router.createPipeTransport', this.#internal.routerId, reqData); - const transport = new PipeTransport_1.PipeTransport({ - internal: { - ...this.#internal, - transportId: reqData.transportId - }, - data, - channel: this.#channel, - payloadChannel: this.#payloadChannel, - appData, - getRouterRtpCapabilities: () => this.#data.rtpCapabilities, - getProducerById: (producerId) => (this.#producers.get(producerId)), - getDataProducerById: (dataProducerId) => (this.#dataProducers.get(dataProducerId)) - }); - this.#transports.set(transport.id, transport); - transport.on('@close', () => this.#transports.delete(transport.id)); - transport.on('@listenserverclose', () => this.#transports.delete(transport.id)); - transport.on('@newproducer', (producer) => this.#producers.set(producer.id, producer)); - transport.on('@producerclose', (producer) => this.#producers.delete(producer.id)); - transport.on('@newdataproducer', (dataProducer) => (this.#dataProducers.set(dataProducer.id, dataProducer))); - transport.on('@dataproducerclose', (dataProducer) => (this.#dataProducers.delete(dataProducer.id))); - // Emit observer event. - this.#observer.safeEmit('newtransport', transport); - return transport; - } - /** - * Create a DirectTransport. - */ - async createDirectTransport({ maxMessageSize = 262144, appData } = { - maxMessageSize: 262144 - }) { - logger.debug('createDirectTransport()'); - const reqData = { - transportId: (0, uuid_1.v4)(), - direct: true, - maxMessageSize - }; - const data = await this.#channel.request('router.createDirectTransport', this.#internal.routerId, reqData); - const transport = new DirectTransport_1.DirectTransport({ - internal: { - ...this.#internal, - transportId: reqData.transportId - }, - data, - channel: this.#channel, - payloadChannel: this.#payloadChannel, - appData, - getRouterRtpCapabilities: () => this.#data.rtpCapabilities, - getProducerById: (producerId) => (this.#producers.get(producerId)), - getDataProducerById: (dataProducerId) => (this.#dataProducers.get(dataProducerId)) - }); - this.#transports.set(transport.id, transport); - transport.on('@close', () => this.#transports.delete(transport.id)); - transport.on('@listenserverclose', () => this.#transports.delete(transport.id)); - transport.on('@newproducer', (producer) => this.#producers.set(producer.id, producer)); - transport.on('@producerclose', (producer) => this.#producers.delete(producer.id)); - transport.on('@newdataproducer', (dataProducer) => (this.#dataProducers.set(dataProducer.id, dataProducer))); - transport.on('@dataproducerclose', (dataProducer) => (this.#dataProducers.delete(dataProducer.id))); - // Emit observer event. - this.#observer.safeEmit('newtransport', transport); - return transport; - } - /** - * Pipes the given Producer or DataProducer into another Router in same host. - */ - async pipeToRouter({ producerId, dataProducerId, router, listenIp = '127.0.0.1', enableSctp = true, numSctpStreams = { OS: 1024, MIS: 1024 }, enableRtx = false, enableSrtp = false }) { - logger.debug('pipeToRouter()'); - if (!producerId && !dataProducerId) - throw new TypeError('missing producerId or dataProducerId'); - else if (producerId && dataProducerId) - throw new TypeError('just producerId or dataProducerId can be given'); - else if (!router) - throw new TypeError('Router not found'); - else if (router === this) - throw new TypeError('cannot use this Router as destination'); - let producer; - let dataProducer; - if (producerId) { - producer = this.#producers.get(producerId); - if (!producer) - throw new TypeError('Producer not found'); - } - else if (dataProducerId) { - dataProducer = this.#dataProducers.get(dataProducerId); - if (!dataProducer) - throw new TypeError('DataProducer not found'); - } - const pipeTransportPairKey = router.id; - let pipeTransportPairPromise = this.#mapRouterPairPipeTransportPairPromise.get(pipeTransportPairKey); - let pipeTransportPair; - let localPipeTransport; - let remotePipeTransport; - if (pipeTransportPairPromise) { - pipeTransportPair = await pipeTransportPairPromise; - localPipeTransport = pipeTransportPair[this.id]; - remotePipeTransport = pipeTransportPair[router.id]; - } - else { - pipeTransportPairPromise = new Promise((resolve, reject) => { - Promise.all([ - this.createPipeTransport({ listenIp, enableSctp, numSctpStreams, enableRtx, enableSrtp }), - router.createPipeTransport({ listenIp, enableSctp, numSctpStreams, enableRtx, enableSrtp }) - ]) - .then((pipeTransports) => { - localPipeTransport = pipeTransports[0]; - remotePipeTransport = pipeTransports[1]; - }) - .then(() => { - return Promise.all([ - localPipeTransport.connect({ - ip: remotePipeTransport.tuple.localIp, - port: remotePipeTransport.tuple.localPort, - srtpParameters: remotePipeTransport.srtpParameters - }), - remotePipeTransport.connect({ - ip: localPipeTransport.tuple.localIp, - port: localPipeTransport.tuple.localPort, - srtpParameters: localPipeTransport.srtpParameters - }) - ]); - }) - .then(() => { - localPipeTransport.observer.on('close', () => { - remotePipeTransport.close(); - this.#mapRouterPairPipeTransportPairPromise.delete(pipeTransportPairKey); - }); - remotePipeTransport.observer.on('close', () => { - localPipeTransport.close(); - this.#mapRouterPairPipeTransportPairPromise.delete(pipeTransportPairKey); - }); - resolve({ - [this.id]: localPipeTransport, - [router.id]: remotePipeTransport - }); - }) - .catch((error) => { - logger.error('pipeToRouter() | error creating PipeTransport pair:%o', error); - if (localPipeTransport) - localPipeTransport.close(); - if (remotePipeTransport) - remotePipeTransport.close(); - reject(error); - }); - }); - this.#mapRouterPairPipeTransportPairPromise.set(pipeTransportPairKey, pipeTransportPairPromise); - router.addPipeTransportPair(this.id, pipeTransportPairPromise); - await pipeTransportPairPromise; - } - if (producer) { - let pipeConsumer; - let pipeProducer; - try { - pipeConsumer = await localPipeTransport.consume({ - producerId: producerId - }); - pipeProducer = await remotePipeTransport.produce({ - id: producer.id, - kind: pipeConsumer.kind, - rtpParameters: pipeConsumer.rtpParameters, - paused: pipeConsumer.producerPaused, - appData: producer.appData - }); - // Ensure that the producer has not been closed in the meanwhile. - if (producer.closed) - throw new errors_1.InvalidStateError('original Producer closed'); - // Ensure that producer.paused has not changed in the meanwhile and, if - // so, sync the pipeProducer. - if (pipeProducer.paused !== producer.paused) { - if (producer.paused) - await pipeProducer.pause(); - else - await pipeProducer.resume(); - } - // Pipe events from the pipe Consumer to the pipe Producer. - pipeConsumer.observer.on('close', () => pipeProducer.close()); - pipeConsumer.observer.on('pause', () => pipeProducer.pause()); - pipeConsumer.observer.on('resume', () => pipeProducer.resume()); - // Pipe events from the pipe Producer to the pipe Consumer. - pipeProducer.observer.on('close', () => pipeConsumer.close()); - return { pipeConsumer, pipeProducer }; - } - catch (error) { - logger.error('pipeToRouter() | error creating pipe Consumer/Producer pair:%o', error); - if (pipeConsumer) - pipeConsumer.close(); - if (pipeProducer) - pipeProducer.close(); - throw error; - } - } - else if (dataProducer) { - let pipeDataConsumer; - let pipeDataProducer; - try { - pipeDataConsumer = await localPipeTransport.consumeData({ - dataProducerId: dataProducerId - }); - pipeDataProducer = await remotePipeTransport.produceData({ - id: dataProducer.id, - sctpStreamParameters: pipeDataConsumer.sctpStreamParameters, - label: pipeDataConsumer.label, - protocol: pipeDataConsumer.protocol, - appData: dataProducer.appData - }); - // Ensure that the dataProducer has not been closed in the meanwhile. - if (dataProducer.closed) - throw new errors_1.InvalidStateError('original DataProducer closed'); - // Pipe events from the pipe DataConsumer to the pipe DataProducer. - pipeDataConsumer.observer.on('close', () => pipeDataProducer.close()); - // Pipe events from the pipe DataProducer to the pipe DataConsumer. - pipeDataProducer.observer.on('close', () => pipeDataConsumer.close()); - return { pipeDataConsumer, pipeDataProducer }; - } - catch (error) { - logger.error('pipeToRouter() | error creating pipe DataConsumer/DataProducer pair:%o', error); - if (pipeDataConsumer) - pipeDataConsumer.close(); - if (pipeDataProducer) - pipeDataProducer.close(); - throw error; - } - } - else { - throw new Error('internal error'); - } - } - /** - * @private - */ - addPipeTransportPair(pipeTransportPairKey, pipeTransportPairPromise) { - if (this.#mapRouterPairPipeTransportPairPromise.has(pipeTransportPairKey)) { - throw new Error('given pipeTransportPairKey already exists in this Router'); - } - this.#mapRouterPairPipeTransportPairPromise.set(pipeTransportPairKey, pipeTransportPairPromise); - pipeTransportPairPromise - .then((pipeTransportPair) => { - const localPipeTransport = pipeTransportPair[this.id]; - // NOTE: No need to do any other cleanup here since that is done by the - // Router calling this method on us. - localPipeTransport.observer.on('close', () => { - this.#mapRouterPairPipeTransportPairPromise.delete(pipeTransportPairKey); - }); - }) - .catch(() => { - this.#mapRouterPairPipeTransportPairPromise.delete(pipeTransportPairKey); - }); - } - /** - * Create an ActiveSpeakerObserver - */ - async createActiveSpeakerObserver({ interval = 300, appData } = {}) { - logger.debug('createActiveSpeakerObserver()'); - if (appData && typeof appData !== 'object') - throw new TypeError('if given, appData must be an object'); - const reqData = { - rtpObserverId: (0, uuid_1.v4)(), - interval - }; - await this.#channel.request('router.createActiveSpeakerObserver', this.#internal.routerId, reqData); - const activeSpeakerObserver = new ActiveSpeakerObserver_1.ActiveSpeakerObserver({ - internal: { - ...this.#internal, - rtpObserverId: reqData.rtpObserverId - }, - channel: this.#channel, - payloadChannel: this.#payloadChannel, - appData, - getProducerById: (producerId) => (this.#producers.get(producerId)) - }); - this.#rtpObservers.set(activeSpeakerObserver.id, activeSpeakerObserver); - activeSpeakerObserver.on('@close', () => { - this.#rtpObservers.delete(activeSpeakerObserver.id); - }); - // Emit observer event. - this.#observer.safeEmit('newrtpobserver', activeSpeakerObserver); - return activeSpeakerObserver; - } - /** - * Create an AudioLevelObserver. - */ - async createAudioLevelObserver({ maxEntries = 1, threshold = -80, interval = 1000, appData } = {}) { - logger.debug('createAudioLevelObserver()'); - if (appData && typeof appData !== 'object') - throw new TypeError('if given, appData must be an object'); - const reqData = { - rtpObserverId: (0, uuid_1.v4)(), - maxEntries, - threshold, - interval - }; - await this.#channel.request('router.createAudioLevelObserver', this.#internal.routerId, reqData); - const audioLevelObserver = new AudioLevelObserver_1.AudioLevelObserver({ - internal: { - ...this.#internal, - rtpObserverId: reqData.rtpObserverId - }, - channel: this.#channel, - payloadChannel: this.#payloadChannel, - appData, - getProducerById: (producerId) => (this.#producers.get(producerId)) - }); - this.#rtpObservers.set(audioLevelObserver.id, audioLevelObserver); - audioLevelObserver.on('@close', () => { - this.#rtpObservers.delete(audioLevelObserver.id); - }); - // Emit observer event. - this.#observer.safeEmit('newrtpobserver', audioLevelObserver); - return audioLevelObserver; - } - /** - * Check whether the given RTP capabilities can consume the given Producer. - */ - canConsume({ producerId, rtpCapabilities }) { - const producer = this.#producers.get(producerId); - if (!producer) { - logger.error('canConsume() | Producer with id "%s" not found', producerId); - return false; - } - try { - return ortc.canConsume(producer.consumableRtpParameters, rtpCapabilities); - } - catch (error) { - logger.error('canConsume() | unexpected error: %s', String(error)); - return false; - } - } -} -exports.Router = Router; diff --git a/node/lib/RtpObserver.d.ts b/node/lib/RtpObserver.d.ts deleted file mode 100644 index 39cc02b755..0000000000 --- a/node/lib/RtpObserver.d.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { EnhancedEventEmitter } from './EnhancedEventEmitter'; -import { Channel } from './Channel'; -import { PayloadChannel } from './PayloadChannel'; -import { RouterInternal } from './Router'; -import { Producer } from './Producer'; -export declare type RtpObserverEvents = { - routerclose: []; - '@close': []; -}; -export declare type RtpObserverObserverEvents = { - close: []; - pause: []; - resume: []; - addproducer: [Producer]; - removeproducer: [Producer]; -}; -export declare type RtpObserverConstructorOptions = { - internal: RtpObserverObserverInternal; - channel: Channel; - payloadChannel: PayloadChannel; - appData?: Record; - getProducerById: (producerId: string) => Producer | undefined; -}; -export declare type RtpObserverObserverInternal = RouterInternal & { - rtpObserverId: string; -}; -export declare type RtpObserverAddRemoveProducerOptions = { - /** - * The id of the Producer to be added or removed. - */ - producerId: string; -}; -export declare class RtpObserver extends EnhancedEventEmitter { - #private; - protected readonly internal: RtpObserverObserverInternal; - protected readonly channel: Channel; - protected readonly payloadChannel: PayloadChannel; - protected readonly getProducerById: (producerId: string) => Producer | undefined; - /** - * @private - * @interface - */ - constructor({ internal, channel, payloadChannel, appData, getProducerById }: RtpObserverConstructorOptions); - /** - * RtpObserver id. - */ - get id(): string; - /** - * Whether the RtpObserver is closed. - */ - get closed(): boolean; - /** - * Whether the RtpObserver is paused. - */ - get paused(): boolean; - /** - * App custom data. - */ - get appData(): Record; - /** - * Invalid setter. - */ - set appData(appData: Record); - /** - * Observer. - */ - get observer(): EnhancedEventEmitter; - /** - * Close the RtpObserver. - */ - close(): void; - /** - * Router was closed. - * - * @private - */ - routerClosed(): void; - /** - * Pause the RtpObserver. - */ - pause(): Promise; - /** - * Resume the RtpObserver. - */ - resume(): Promise; - /** - * Add a Producer to the RtpObserver. - */ - addProducer({ producerId }: RtpObserverAddRemoveProducerOptions): Promise; - /** - * Remove a Producer from the RtpObserver. - */ - removeProducer({ producerId }: RtpObserverAddRemoveProducerOptions): Promise; -} -//# sourceMappingURL=RtpObserver.d.ts.map \ No newline at end of file diff --git a/node/lib/RtpObserver.d.ts.map b/node/lib/RtpObserver.d.ts.map deleted file mode 100644 index a5e5f70c86..0000000000 --- a/node/lib/RtpObserver.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"RtpObserver.d.ts","sourceRoot":"","sources":["../src/RtpObserver.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,oBAAY,iBAAiB,GAC7B;IACC,WAAW,EAAE,EAAE,CAAC;IAEhB,QAAQ,EAAE,EAAE,CAAC;CACb,CAAC;AAEF,oBAAY,yBAAyB,GACrC;IACC,KAAK,EAAE,EAAE,CAAC;IACV,KAAK,EAAE,EAAE,CAAC;IACV,MAAM,EAAE,EAAE,CAAC;IACX,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC;IACxB,cAAc,EAAE,CAAC,QAAQ,CAAC,CAAC;CAC3B,CAAC;AAEF,oBAAY,6BAA6B,GACzC;IACC,QAAQ,EAAE,2BAA2B,CAAC;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,cAAc,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,eAAe,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,QAAQ,GAAG,SAAS,CAAC;CAC9D,CAAC;AAEF,oBAAY,2BAA2B,GAAG,cAAc,GACxD;IACC,aAAa,EAAE,MAAM,CAAC;CACtB,CAAC;AAIF,oBAAY,mCAAmC,GAC/C;IACC;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,qBAAa,WAAW,CAAC,CAAC,SAAS,iBAAiB,GAAG,iBAAiB,CACvE,SAAQ,oBAAoB,CAAC,CAAC,CAAC;;IAG/B,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,2BAA2B,CAAC;IAGzD,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAGpC,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;IAYlD,SAAS,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,QAAQ,GAAG,SAAS,CAAC;IAKjF;;;OAGG;gBAEF,EACC,QAAQ,EACR,OAAO,EACP,cAAc,EACd,OAAO,EACP,eAAe,EACf,EAAE,6BAA6B;IAcjC;;OAEG;IACH,IAAI,EAAE,IAAI,MAAM,CAGf;IAED;;OAEG;IACH,IAAI,MAAM,IAAI,OAAO,CAGpB;IAED;;OAEG;IACH,IAAI,MAAM,IAAI,OAAO,CAGpB;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAGrC;IAED;;OAEG;IACH,IAAI,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAG3C;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,oBAAoB,CAAC,yBAAyB,CAAC,CAG9D;IAED;;OAEG;IACH,KAAK,IAAI,IAAI;IAwBb;;;;OAIG;IACH,YAAY,IAAI,IAAI;IAmBpB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAe5B;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAe7B;;OAEG;IACG,WAAW,CAAC,EAAE,UAAU,EAAE,EAAE,mCAAmC,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBrF;;OAEG;IACG,cAAc,CAAC,EAAE,UAAU,EAAE,EAAE,mCAAmC,GAAG,OAAO,CAAC,IAAI,CAAC;CAgBxF"} \ No newline at end of file diff --git a/node/lib/RtpObserver.js b/node/lib/RtpObserver.js deleted file mode 100644 index 1768beeb82..0000000000 --- a/node/lib/RtpObserver.js +++ /dev/null @@ -1,159 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.RtpObserver = void 0; -const Logger_1 = require("./Logger"); -const EnhancedEventEmitter_1 = require("./EnhancedEventEmitter"); -const logger = new Logger_1.Logger('RtpObserver'); -class RtpObserver extends EnhancedEventEmitter_1.EnhancedEventEmitter { - // Internal data. - internal; - // Channel instance. - channel; - // PayloadChannel instance. - payloadChannel; - // Closed flag. - #closed = false; - // Paused flag. - #paused = false; - // Custom app data. - #appData; - // Method to retrieve a Producer. - getProducerById; - // Observer instance. - #observer = new EnhancedEventEmitter_1.EnhancedEventEmitter(); - /** - * @private - * @interface - */ - constructor({ internal, channel, payloadChannel, appData, getProducerById }) { - super(); - logger.debug('constructor()'); - this.internal = internal; - this.channel = channel; - this.payloadChannel = payloadChannel; - this.#appData = appData || {}; - this.getProducerById = getProducerById; - } - /** - * RtpObserver id. - */ - get id() { - return this.internal.rtpObserverId; - } - /** - * Whether the RtpObserver is closed. - */ - get closed() { - return this.#closed; - } - /** - * Whether the RtpObserver is paused. - */ - get paused() { - return this.#paused; - } - /** - * App custom data. - */ - get appData() { - return this.#appData; - } - /** - * Invalid setter. - */ - set appData(appData) { - throw new Error('cannot override appData object'); - } - /** - * Observer. - */ - get observer() { - return this.#observer; - } - /** - * Close the RtpObserver. - */ - close() { - if (this.#closed) - return; - logger.debug('close()'); - this.#closed = true; - // Remove notification subscriptions. - this.channel.removeAllListeners(this.internal.rtpObserverId); - this.payloadChannel.removeAllListeners(this.internal.rtpObserverId); - const reqData = { rtpObserverId: this.internal.rtpObserverId }; - this.channel.request('router.closeRtpObserver', this.internal.routerId, reqData) - .catch(() => { }); - this.emit('@close'); - // Emit observer event. - this.#observer.safeEmit('close'); - } - /** - * Router was closed. - * - * @private - */ - routerClosed() { - if (this.#closed) - return; - logger.debug('routerClosed()'); - this.#closed = true; - // Remove notification subscriptions. - this.channel.removeAllListeners(this.internal.rtpObserverId); - this.payloadChannel.removeAllListeners(this.internal.rtpObserverId); - this.safeEmit('routerclose'); - // Emit observer event. - this.#observer.safeEmit('close'); - } - /** - * Pause the RtpObserver. - */ - async pause() { - logger.debug('pause()'); - const wasPaused = this.#paused; - await this.channel.request('rtpObserver.pause', this.internal.rtpObserverId); - this.#paused = true; - // Emit observer event. - if (!wasPaused) - this.#observer.safeEmit('pause'); - } - /** - * Resume the RtpObserver. - */ - async resume() { - logger.debug('resume()'); - const wasPaused = this.#paused; - await this.channel.request('rtpObserver.resume', this.internal.rtpObserverId); - this.#paused = false; - // Emit observer event. - if (wasPaused) - this.#observer.safeEmit('resume'); - } - /** - * Add a Producer to the RtpObserver. - */ - async addProducer({ producerId }) { - logger.debug('addProducer()'); - const producer = this.getProducerById(producerId); - if (!producer) - throw Error(`Producer with id "${producerId}" not found`); - const reqData = { producerId }; - await this.channel.request('rtpObserver.addProducer', this.internal.rtpObserverId, reqData); - // Emit observer event. - this.#observer.safeEmit('addproducer', producer); - } - /** - * Remove a Producer from the RtpObserver. - */ - async removeProducer({ producerId }) { - logger.debug('removeProducer()'); - const producer = this.getProducerById(producerId); - if (!producer) - throw Error(`Producer with id "${producerId}" not found`); - const reqData = { producerId }; - await this.channel.request('rtpObserver.removeProducer', this.internal.rtpObserverId, reqData); - // Emit observer event. - this.#observer.safeEmit('removeproducer', producer); - } -} -exports.RtpObserver = RtpObserver; diff --git a/node/lib/RtpParameters.d.ts b/node/lib/RtpParameters.d.ts deleted file mode 100644 index a6072d8a5c..0000000000 --- a/node/lib/RtpParameters.d.ts +++ /dev/null @@ -1,302 +0,0 @@ -/** - * The RTP capabilities define what mediasoup or an endpoint can receive at - * media level. - */ -export declare type RtpCapabilities = { - /** - * Supported media and RTX codecs. - */ - codecs?: RtpCodecCapability[]; - /** - * Supported RTP header extensions. - */ - headerExtensions?: RtpHeaderExtension[]; -}; -/** - * Media kind ('audio' or 'video'). - */ -export declare type MediaKind = 'audio' | 'video'; -/** - * Provides information on the capabilities of a codec within the RTP - * capabilities. The list of media codecs supported by mediasoup and their - * settings is defined in the supportedRtpCapabilities.ts file. - * - * Exactly one RtpCodecCapability will be present for each supported combination - * of parameters that requires a distinct value of preferredPayloadType. For - * example: - * - * - Multiple H264 codecs, each with their own distinct 'packetization-mode' and - * 'profile-level-id' values. - * - Multiple VP9 codecs, each with their own distinct 'profile-id' value. - * - * RtpCodecCapability entries in the mediaCodecs array of RouterOptions do not - * require preferredPayloadType field (if unset, mediasoup will choose a random - * one). If given, make sure it's in the 96-127 range. - */ -export declare type RtpCodecCapability = { - /** - * Media kind. - */ - kind: MediaKind; - /** - * The codec MIME media type/subtype (e.g. 'audio/opus', 'video/VP8'). - */ - mimeType: string; - /** - * The preferred RTP payload type. - */ - preferredPayloadType?: number; - /** - * Codec clock rate expressed in Hertz. - */ - clockRate: number; - /** - * The number of channels supported (e.g. two for stereo). Just for audio. - * Default 1. - */ - channels?: number; - /** - * Codec specific parameters. Some parameters (such as 'packetization-mode' - * and 'profile-level-id' in H264 or 'profile-id' in VP9) are critical for - * codec matching. - */ - parameters?: any; - /** - * Transport layer and codec-specific feedback messages for this codec. - */ - rtcpFeedback?: RtcpFeedback[]; -}; -/** - * Direction of RTP header extension. - */ -export declare type RtpHeaderExtensionDirection = 'sendrecv' | 'sendonly' | 'recvonly' | 'inactive'; -/** - * Provides information relating to supported header extensions. The list of - * RTP header extensions supported by mediasoup is defined in the - * supportedRtpCapabilities.ts file. - * - * mediasoup does not currently support encrypted RTP header extensions. The - * direction field is just present in mediasoup RTP capabilities (retrieved via - * router.rtpCapabilities or mediasoup.getSupportedRtpCapabilities()). It's - * ignored if present in endpoints' RTP capabilities. - */ -export declare type RtpHeaderExtension = { - /** - * Media kind. - */ - kind: MediaKind; - uri: string; - /** - * The preferred numeric identifier that goes in the RTP packet. Must be - * unique. - */ - preferredId: number; - /** - * If true, it is preferred that the value in the header be encrypted as per - * RFC 6904. Default false. - */ - preferredEncrypt?: boolean; - /** - * If 'sendrecv', mediasoup supports sending and receiving this RTP extension. - * 'sendonly' means that mediasoup can send (but not receive) it. 'recvonly' - * means that mediasoup can receive (but not send) it. - */ - direction?: RtpHeaderExtensionDirection; -}; -/** - * The RTP send parameters describe a media stream received by mediasoup from - * an endpoint through its corresponding mediasoup Producer. These parameters - * may include a mid value that the mediasoup transport will use to match - * received RTP packets based on their MID RTP extension value. - * - * mediasoup allows RTP send parameters with a single encoding and with multiple - * encodings (simulcast). In the latter case, each entry in the encodings array - * must include a ssrc field or a rid field (the RID RTP extension value). Check - * the Simulcast and SVC sections for more information. - * - * The RTP receive parameters describe a media stream as sent by mediasoup to - * an endpoint through its corresponding mediasoup Consumer. The mid value is - * unset (mediasoup does not include the MID RTP extension into RTP packets - * being sent to endpoints). - * - * There is a single entry in the encodings array (even if the corresponding - * producer uses simulcast). The consumer sends a single and continuous RTP - * stream to the endpoint and spatial/temporal layer selection is possible via - * consumer.setPreferredLayers(). - * - * As an exception, previous bullet is not true when consuming a stream over a - * PipeTransport, in which all RTP streams from the associated producer are - * forwarded verbatim through the consumer. - * - * The RTP receive parameters will always have their ssrc values randomly - * generated for all of its encodings (and optional rtx: { ssrc: XXXX } if the - * endpoint supports RTX), regardless of the original RTP send parameters in - * the associated producer. This applies even if the producer's encodings have - * rid set. - */ -export declare type RtpParameters = { - /** - * The MID RTP extension value as defined in the BUNDLE specification. - */ - mid?: string; - /** - * Media and RTX codecs in use. - */ - codecs: RtpCodecParameters[]; - /** - * RTP header extensions in use. - */ - headerExtensions?: RtpHeaderExtensionParameters[]; - /** - * Transmitted RTP streams and their settings. - */ - encodings?: RtpEncodingParameters[]; - /** - * Parameters used for RTCP. - */ - rtcp?: RtcpParameters; -}; -/** - * Provides information on codec settings within the RTP parameters. The list - * of media codecs supported by mediasoup and their settings is defined in the - * supportedRtpCapabilities.ts file. - */ -export declare type RtpCodecParameters = { - /** - * The codec MIME media type/subtype (e.g. 'audio/opus', 'video/VP8'). - */ - mimeType: string; - /** - * The value that goes in the RTP Payload Type Field. Must be unique. - */ - payloadType: number; - /** - * Codec clock rate expressed in Hertz. - */ - clockRate: number; - /** - * The number of channels supported (e.g. two for stereo). Just for audio. - * Default 1. - */ - channels?: number; - /** - * Codec-specific parameters available for signaling. Some parameters (such - * as 'packetization-mode' and 'profile-level-id' in H264 or 'profile-id' in - * VP9) are critical for codec matching. - */ - parameters?: any; - /** - * Transport layer and codec-specific feedback messages for this codec. - */ - rtcpFeedback?: RtcpFeedback[]; -}; -/** - * Provides information on RTCP feedback messages for a specific codec. Those - * messages can be transport layer feedback messages or codec-specific feedback - * messages. The list of RTCP feedbacks supported by mediasoup is defined in the - * supportedRtpCapabilities.ts file. - */ -export declare type RtcpFeedback = { - /** - * RTCP feedback type. - */ - type: string; - /** - * RTCP feedback parameter. - */ - parameter?: string; -}; -/** - * Provides information relating to an encoding, which represents a media RTP - * stream and its associated RTX stream (if any). - */ -export declare type RtpEncodingParameters = { - /** - * The media SSRC. - */ - ssrc?: number; - /** - * The RID RTP extension value. Must be unique. - */ - rid?: string; - /** - * Codec payload type this encoding affects. If unset, first media codec is - * chosen. - */ - codecPayloadType?: number; - /** - * RTX stream information. It must contain a numeric ssrc field indicating - * the RTX SSRC. - */ - rtx?: { - ssrc: number; - }; - /** - * It indicates whether discontinuous RTP transmission will be used. Useful - * for audio (if the codec supports it) and for video screen sharing (when - * static content is being transmitted, this option disables the RTP - * inactivity checks in mediasoup). Default false. - */ - dtx?: boolean; - /** - * Number of spatial and temporal layers in the RTP stream (e.g. 'L1T3'). - * See webrtc-svc. - */ - scalabilityMode?: string; - /** - * Others. - */ - scaleResolutionDownBy?: number; - maxBitrate?: number; -}; -/** - * Defines a RTP header extension within the RTP parameters. The list of RTP - * header extensions supported by mediasoup is defined in the - * supportedRtpCapabilities.ts file. - * - * mediasoup does not currently support encrypted RTP header extensions and no - * parameters are currently considered. - */ -export declare type RtpHeaderExtensionParameters = { - /** - * The URI of the RTP header extension, as defined in RFC 5285. - */ - uri: string; - /** - * The numeric identifier that goes in the RTP packet. Must be unique. - */ - id: number; - /** - * If true, the value in the header is encrypted as per RFC 6904. Default false. - */ - encrypt?: boolean; - /** - * Configuration parameters for the header extension. - */ - parameters?: any; -}; -/** - * Provides information on RTCP settings within the RTP parameters. - * - * If no cname is given in a producer's RTP parameters, the mediasoup transport - * will choose a random one that will be used into RTCP SDES messages sent to - * all its associated consumers. - * - * mediasoup assumes reducedSize to always be true. - */ -export declare type RtcpParameters = { - /** - * The Canonical Name (CNAME) used by RTCP (e.g. in SDES messages). - */ - cname?: string; - /** - * Whether reduced size RTCP RFC 5506 is configured (if true) or compound RTCP - * as specified in RFC 3550 (if false). Default true. - */ - reducedSize?: boolean; - /** - * Whether RTCP-mux is used. Default true. - */ - mux?: boolean; -}; -//# sourceMappingURL=RtpParameters.d.ts.map \ No newline at end of file diff --git a/node/lib/RtpParameters.d.ts.map b/node/lib/RtpParameters.d.ts.map deleted file mode 100644 index 349c58a84d..0000000000 --- a/node/lib/RtpParameters.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"RtpParameters.d.ts","sourceRoot":"","sources":["../src/RtpParameters.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node/lib/RtpParameters.js b/node/lib/RtpParameters.js deleted file mode 100644 index c8ad2e549b..0000000000 --- a/node/lib/RtpParameters.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/node/lib/SctpParameters.d.ts b/node/lib/SctpParameters.d.ts deleted file mode 100644 index 2416abe42d..0000000000 --- a/node/lib/SctpParameters.d.ts +++ /dev/null @@ -1,82 +0,0 @@ -export declare type SctpCapabilities = { - numStreams: NumSctpStreams; -}; -/** - * Both OS and MIS are part of the SCTP INIT+ACK handshake. OS refers to the - * initial number of outgoing SCTP streams that the server side transport creates - * (to be used by DataConsumers), while MIS refers to the maximum number of - * incoming SCTP streams that the server side transport can receive (to be used - * by DataProducers). So, if the server side transport will just be used to - * create data producers (but no data consumers), OS can be low (~1). However, - * if data consumers are desired on the server side transport, OS must have a - * proper value and such a proper value depends on whether the remote endpoint - * supports SCTP_ADD_STREAMS extension or not. - * - * libwebrtc (Chrome, Safari, etc) does not enable SCTP_ADD_STREAMS so, if data - * consumers are required, OS should be 1024 (the maximum number of DataChannels - * that libwebrtc enables). - * - * Firefox does enable SCTP_ADD_STREAMS so, if data consumers are required, OS - * can be lower (16 for instance). The mediasoup transport will allocate and - * announce more outgoing SCTM streams when needed. - * - * mediasoup-client provides specific per browser/version OS and MIS values via - * the device.sctpCapabilities getter. - */ -export declare type NumSctpStreams = { - /** - * Initially requested number of outgoing SCTP streams. - */ - OS: number; - /** - * Maximum number of incoming SCTP streams. - */ - MIS: number; -}; -export declare type SctpParameters = { - /** - * Must always equal 5000. - */ - port: number; - /** - * Initially requested number of outgoing SCTP streams. - */ - OS: number; - /** - * Maximum number of incoming SCTP streams. - */ - MIS: number; - /** - * Maximum allowed size for SCTP messages. - */ - maxMessageSize: number; -}; -/** - * SCTP stream parameters describe the reliability of a certain SCTP stream. - * If ordered is true then maxPacketLifeTime and maxRetransmits must be - * false. - * If ordered if false, only one of maxPacketLifeTime or maxRetransmits - * can be true. - */ -export declare type SctpStreamParameters = { - /** - * SCTP stream id. - */ - streamId: number; - /** - * Whether data messages must be received in order. If true the messages will - * be sent reliably. Default true. - */ - ordered?: boolean; - /** - * When ordered is false indicates the time (in milliseconds) after which a - * SCTP packet will stop being retransmitted. - */ - maxPacketLifeTime?: number; - /** - * When ordered is false indicates the maximum number of times a packet will - * be retransmitted. - */ - maxRetransmits?: number; -}; -//# sourceMappingURL=SctpParameters.d.ts.map \ No newline at end of file diff --git a/node/lib/SctpParameters.d.ts.map b/node/lib/SctpParameters.d.ts.map deleted file mode 100644 index e873cf635b..0000000000 --- a/node/lib/SctpParameters.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"SctpParameters.d.ts","sourceRoot":"","sources":["../src/SctpParameters.ts"],"names":[],"mappings":"AAAA,oBAAY,gBAAgB,GAC5B;IACE,UAAU,EAAE,cAAc,CAAC;CAC5B,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,oBAAY,cAAc,GAC1B;IACC;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IAEX;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF,oBAAY,cAAc,GAC1B;IACC;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IAEX;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC;IAEZ;;OAEG;IACH,cAAc,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF;;;;;;GAMG;AACH,oBAAY,oBAAoB,GAChC;IACC;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC"} \ No newline at end of file diff --git a/node/lib/SctpParameters.js b/node/lib/SctpParameters.js deleted file mode 100644 index c8ad2e549b..0000000000 --- a/node/lib/SctpParameters.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/node/lib/SrtpParameters.d.ts b/node/lib/SrtpParameters.d.ts deleted file mode 100644 index f3c5a93c2f..0000000000 --- a/node/lib/SrtpParameters.d.ts +++ /dev/null @@ -1,18 +0,0 @@ -/** - * SRTP parameters. - */ -export declare type SrtpParameters = { - /** - * Encryption and authentication transforms to be used. - */ - cryptoSuite: SrtpCryptoSuite; - /** - * SRTP keying material (master key and salt) in Base64. - */ - keyBase64: string; -}; -/** - * SRTP crypto suite. - */ -export declare type SrtpCryptoSuite = 'AEAD_AES_256_GCM' | 'AEAD_AES_128_GCM' | 'AES_CM_128_HMAC_SHA1_80' | 'AES_CM_128_HMAC_SHA1_32'; -//# sourceMappingURL=SrtpParameters.d.ts.map \ No newline at end of file diff --git a/node/lib/SrtpParameters.d.ts.map b/node/lib/SrtpParameters.d.ts.map deleted file mode 100644 index 4863eb651e..0000000000 --- a/node/lib/SrtpParameters.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"SrtpParameters.d.ts","sourceRoot":"","sources":["../src/SrtpParameters.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,oBAAY,cAAc,GAC1B;IACC;;OAEG;IACH,WAAW,EAAE,eAAe,CAAC;IAE7B;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF;;GAEG;AACH,oBAAY,eAAe,GACxB,kBAAkB,GAClB,kBAAkB,GAClB,yBAAyB,GACzB,yBAAyB,CAAC"} \ No newline at end of file diff --git a/node/lib/SrtpParameters.js b/node/lib/SrtpParameters.js deleted file mode 100644 index c8ad2e549b..0000000000 --- a/node/lib/SrtpParameters.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/node/lib/Transport.d.ts b/node/lib/Transport.d.ts deleted file mode 100644 index df17791c9a..0000000000 --- a/node/lib/Transport.d.ts +++ /dev/null @@ -1,202 +0,0 @@ -import { EnhancedEventEmitter } from './EnhancedEventEmitter'; -import { Channel } from './Channel'; -import { PayloadChannel } from './PayloadChannel'; -import { RouterInternal } from './Router'; -import { WebRtcTransportData } from './WebRtcTransport'; -import { PlainTransportData } from './PlainTransport'; -import { PipeTransportData } from './PipeTransport'; -import { DirectTransportData } from './DirectTransport'; -import { Producer, ProducerOptions } from './Producer'; -import { Consumer, ConsumerOptions } from './Consumer'; -import { DataProducer, DataProducerOptions } from './DataProducer'; -import { DataConsumer, DataConsumerOptions } from './DataConsumer'; -import { RtpCapabilities } from './RtpParameters'; -export declare type TransportListenIp = { - /** - * Listening IPv4 or IPv6. - */ - ip: string; - /** - * Announced IPv4 or IPv6 (useful when running mediasoup behind NAT with - * private IP). - */ - announcedIp?: string; -}; -/** - * Transport protocol. - */ -export declare type TransportProtocol = 'udp' | 'tcp'; -export declare type TransportTuple = { - localIp: string; - localPort: number; - remoteIp?: string; - remotePort?: number; - protocol: TransportProtocol; -}; -/** - * Valid types for 'trace' event. - */ -export declare type TransportTraceEventType = 'probation' | 'bwe'; -/** - * 'trace' event data. - */ -export declare type TransportTraceEventData = { - /** - * Trace type. - */ - type: TransportTraceEventType; - /** - * Event timestamp. - */ - timestamp: number; - /** - * Event direction. - */ - direction: 'in' | 'out'; - /** - * Per type information. - */ - info: any; -}; -export declare type SctpState = 'new' | 'connecting' | 'connected' | 'failed' | 'closed'; -export declare type TransportEvents = { - routerclose: []; - listenserverclose: []; - trace: [TransportTraceEventData]; - '@close': []; - '@newproducer': [Producer]; - '@producerclose': [Producer]; - '@newdataproducer': [DataProducer]; - '@dataproducerclose': [DataProducer]; - '@listenserverclose': []; -}; -export declare type TransportObserverEvents = { - close: []; - newproducer: [Producer]; - newconsumer: [Consumer]; - newdataproducer: [DataProducer]; - newdataconsumer: [DataConsumer]; - trace: [TransportTraceEventData]; -}; -export declare type TransportConstructorOptions = { - internal: TransportInternal; - data: TransportData; - channel: Channel; - payloadChannel: PayloadChannel; - appData?: Record; - getRouterRtpCapabilities: () => RtpCapabilities; - getProducerById: (producerId: string) => Producer | undefined; - getDataProducerById: (dataProducerId: string) => DataProducer | undefined; -}; -export declare type TransportInternal = RouterInternal & { - transportId: string; -}; -declare type TransportData = WebRtcTransportData | PlainTransportData | PipeTransportData | DirectTransportData; -export declare class Transport extends EnhancedEventEmitter { - #private; - protected readonly internal: TransportInternal; - protected readonly channel: Channel; - protected readonly payloadChannel: PayloadChannel; - protected readonly getProducerById: (producerId: string) => Producer | undefined; - protected readonly getDataProducerById: (dataProducerId: string) => DataProducer | undefined; - protected readonly consumers: Map; - protected readonly dataProducers: Map; - protected readonly dataConsumers: Map; - /** - * @private - * @interface - */ - constructor({ internal, data, channel, payloadChannel, appData, getRouterRtpCapabilities, getProducerById, getDataProducerById }: TransportConstructorOptions); - /** - * Transport id. - */ - get id(): string; - /** - * Whether the Transport is closed. - */ - get closed(): boolean; - /** - * App custom data. - */ - get appData(): Record; - /** - * Invalid setter. - */ - set appData(appData: Record); - /** - * Observer. - */ - get observer(): EnhancedEventEmitter; - /** - * @private - * Just for testing purposes. - */ - get channelForTesting(): Channel; - /** - * Close the Transport. - */ - close(): void; - /** - * Router was closed. - * - * @private - * @virtual - */ - routerClosed(): void; - /** - * Listen server was closed (this just happens in WebRtcTransports when their - * associated WebRtcServer is closed). - * - * @private - */ - listenServerClosed(): void; - /** - * Dump Transport. - */ - dump(): Promise; - /** - * Get Transport stats. - * - * @abstract - */ - getStats(): Promise; - /** - * Provide the Transport remote parameters. - * - * @abstract - */ - connect(params: any): Promise; - /** - * Set maximum incoming bitrate for receiving media. - */ - setMaxIncomingBitrate(bitrate: number): Promise; - /** - * Set maximum outgoing bitrate for sending media. - */ - setMaxOutgoingBitrate(bitrate: number): Promise; - /** - * Create a Producer. - */ - produce({ id, kind, rtpParameters, paused, keyFrameRequestDelay, appData }: ProducerOptions): Promise; - /** - * Create a Consumer. - * - * @virtual - */ - consume({ producerId, rtpCapabilities, paused, mid, preferredLayers, ignoreDtx, pipe, appData }: ConsumerOptions): Promise; - /** - * Create a DataProducer. - */ - produceData({ id, sctpStreamParameters, label, protocol, appData }?: DataProducerOptions): Promise; - /** - * Create a DataConsumer. - */ - consumeData({ dataProducerId, ordered, maxPacketLifeTime, maxRetransmits, appData }: DataConsumerOptions): Promise; - /** - * Enable 'trace' event. - */ - enableTraceEvent(types?: TransportTraceEventType[]): Promise; - private getNextSctpStreamId; -} -export {}; -//# sourceMappingURL=Transport.d.ts.map \ No newline at end of file diff --git a/node/lib/Transport.d.ts.map b/node/lib/Transport.d.ts.map deleted file mode 100644 index 7c8381f779..0000000000 --- a/node/lib/Transport.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"Transport.d.ts","sourceRoot":"","sources":["../src/Transport.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node/lib/Transport.js b/node/lib/Transport.js deleted file mode 100644 index 93dcefdc89..0000000000 --- a/node/lib/Transport.js +++ /dev/null @@ -1,581 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.Transport = void 0; -const uuid_1 = require("uuid"); -const Logger_1 = require("./Logger"); -const EnhancedEventEmitter_1 = require("./EnhancedEventEmitter"); -const utils = require("./utils"); -const ortc = require("./ortc"); -const Producer_1 = require("./Producer"); -const Consumer_1 = require("./Consumer"); -const DataProducer_1 = require("./DataProducer"); -const DataConsumer_1 = require("./DataConsumer"); -const logger = new Logger_1.Logger('Transport'); -class Transport extends EnhancedEventEmitter_1.EnhancedEventEmitter { - // Internal data. - internal; - // Transport data. This is set by the subclass. - #data; - // Channel instance. - channel; - // PayloadChannel instance. - payloadChannel; - // Close flag. - #closed = false; - // Custom app data. - #appData; - // Method to retrieve Router RTP capabilities. - #getRouterRtpCapabilities; - // Method to retrieve a Producer. - getProducerById; - // Method to retrieve a DataProducer. - getDataProducerById; - // Producers map. - #producers = new Map(); - // Consumers map. - consumers = new Map(); - // DataProducers map. - dataProducers = new Map(); - // DataConsumers map. - dataConsumers = new Map(); - // RTCP CNAME for Producers. - #cnameForProducers; - // Next MID for Consumers. It's converted into string when used. - #nextMidForConsumers = 0; - // Buffer with available SCTP stream ids. - #sctpStreamIds; - // Next SCTP stream id. - #nextSctpStreamId = 0; - // Observer instance. - #observer = new EnhancedEventEmitter_1.EnhancedEventEmitter(); - /** - * @private - * @interface - */ - constructor({ internal, data, channel, payloadChannel, appData, getRouterRtpCapabilities, getProducerById, getDataProducerById }) { - super(); - logger.debug('constructor()'); - this.internal = internal; - this.#data = data; - this.channel = channel; - this.payloadChannel = payloadChannel; - this.#appData = appData || {}; - this.#getRouterRtpCapabilities = getRouterRtpCapabilities; - this.getProducerById = getProducerById; - this.getDataProducerById = getDataProducerById; - } - /** - * Transport id. - */ - get id() { - return this.internal.transportId; - } - /** - * Whether the Transport is closed. - */ - get closed() { - return this.#closed; - } - /** - * App custom data. - */ - get appData() { - return this.#appData; - } - /** - * Invalid setter. - */ - set appData(appData) { - throw new Error('cannot override appData object'); - } - /** - * Observer. - */ - get observer() { - return this.#observer; - } - /** - * @private - * Just for testing purposes. - */ - get channelForTesting() { - return this.channel; - } - /** - * Close the Transport. - */ - close() { - if (this.#closed) - return; - logger.debug('close()'); - this.#closed = true; - // Remove notification subscriptions. - this.channel.removeAllListeners(this.internal.transportId); - this.payloadChannel.removeAllListeners(this.internal.transportId); - const reqData = { transportId: this.internal.transportId }; - this.channel.request('router.closeTransport', this.internal.routerId, reqData) - .catch(() => { }); - // Close every Producer. - for (const producer of this.#producers.values()) { - producer.transportClosed(); - // Must tell the Router. - this.emit('@producerclose', producer); - } - this.#producers.clear(); - // Close every Consumer. - for (const consumer of this.consumers.values()) { - consumer.transportClosed(); - } - this.consumers.clear(); - // Close every DataProducer. - for (const dataProducer of this.dataProducers.values()) { - dataProducer.transportClosed(); - // Must tell the Router. - this.emit('@dataproducerclose', dataProducer); - } - this.dataProducers.clear(); - // Close every DataConsumer. - for (const dataConsumer of this.dataConsumers.values()) { - dataConsumer.transportClosed(); - } - this.dataConsumers.clear(); - this.emit('@close'); - // Emit observer event. - this.#observer.safeEmit('close'); - } - /** - * Router was closed. - * - * @private - * @virtual - */ - routerClosed() { - if (this.#closed) - return; - logger.debug('routerClosed()'); - this.#closed = true; - // Remove notification subscriptions. - this.channel.removeAllListeners(this.internal.transportId); - this.payloadChannel.removeAllListeners(this.internal.transportId); - // Close every Producer. - for (const producer of this.#producers.values()) { - producer.transportClosed(); - // NOTE: No need to tell the Router since it already knows (it has - // been closed in fact). - } - this.#producers.clear(); - // Close every Consumer. - for (const consumer of this.consumers.values()) { - consumer.transportClosed(); - } - this.consumers.clear(); - // Close every DataProducer. - for (const dataProducer of this.dataProducers.values()) { - dataProducer.transportClosed(); - // NOTE: No need to tell the Router since it already knows (it has - // been closed in fact). - } - this.dataProducers.clear(); - // Close every DataConsumer. - for (const dataConsumer of this.dataConsumers.values()) { - dataConsumer.transportClosed(); - } - this.dataConsumers.clear(); - this.safeEmit('routerclose'); - // Emit observer event. - this.#observer.safeEmit('close'); - } - /** - * Listen server was closed (this just happens in WebRtcTransports when their - * associated WebRtcServer is closed). - * - * @private - */ - listenServerClosed() { - if (this.#closed) - return; - logger.debug('listenServerClosed()'); - this.#closed = true; - // Remove notification subscriptions. - this.channel.removeAllListeners(this.internal.transportId); - this.payloadChannel.removeAllListeners(this.internal.transportId); - // Close every Producer. - for (const producer of this.#producers.values()) { - producer.transportClosed(); - // NOTE: No need to tell the Router since it already knows (it has - // been closed in fact). - } - this.#producers.clear(); - // Close every Consumer. - for (const consumer of this.consumers.values()) { - consumer.transportClosed(); - } - this.consumers.clear(); - // Close every DataProducer. - for (const dataProducer of this.dataProducers.values()) { - dataProducer.transportClosed(); - // NOTE: No need to tell the Router since it already knows (it has - // been closed in fact). - } - this.dataProducers.clear(); - // Close every DataConsumer. - for (const dataConsumer of this.dataConsumers.values()) { - dataConsumer.transportClosed(); - } - this.dataConsumers.clear(); - // Need to emit this event to let the parent Router know since - // transport.listenServerClosed() is called by the listen server. - // NOTE: Currently there is just WebRtcServer for WebRtcTransports. - this.emit('@listenserverclose'); - this.safeEmit('listenserverclose'); - // Emit observer event. - this.#observer.safeEmit('close'); - } - /** - * Dump Transport. - */ - async dump() { - logger.debug('dump()'); - return this.channel.request('transport.dump', this.internal.transportId); - } - /** - * Get Transport stats. - * - * @abstract - */ - async getStats() { - // Should not happen. - throw new Error('method not implemented in the subclass'); - } - /** - * Provide the Transport remote parameters. - * - * @abstract - */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars - async connect(params) { - // Should not happen. - throw new Error('method not implemented in the subclass'); - } - /** - * Set maximum incoming bitrate for receiving media. - */ - async setMaxIncomingBitrate(bitrate) { - logger.debug('setMaxIncomingBitrate() [bitrate:%s]', bitrate); - const reqData = { bitrate }; - await this.channel.request('transport.setMaxIncomingBitrate', this.internal.transportId, reqData); - } - /** - * Set maximum outgoing bitrate for sending media. - */ - async setMaxOutgoingBitrate(bitrate) { - logger.debug('setMaxOutgoingBitrate() [bitrate:%s]', bitrate); - const reqData = { bitrate }; - await this.channel.request('transport.setMaxOutgoingBitrate', this.internal.transportId, reqData); - } - /** - * Create a Producer. - */ - async produce({ id = undefined, kind, rtpParameters, paused = false, keyFrameRequestDelay, appData }) { - logger.debug('produce()'); - if (id && this.#producers.has(id)) - throw new TypeError(`a Producer with same id "${id}" already exists`); - else if (!['audio', 'video'].includes(kind)) - throw new TypeError(`invalid kind "${kind}"`); - else if (appData && typeof appData !== 'object') - throw new TypeError('if given, appData must be an object'); - // This may throw. - ortc.validateRtpParameters(rtpParameters); - // If missing or empty encodings, add one. - if (!rtpParameters.encodings || - !Array.isArray(rtpParameters.encodings) || - rtpParameters.encodings.length === 0) { - rtpParameters.encodings = [{}]; - } - // Don't do this in PipeTransports since there we must keep CNAME value in - // each Producer. - if (this.constructor.name !== 'PipeTransport') { - // If CNAME is given and we don't have yet a CNAME for Producers in this - // Transport, take it. - if (!this.#cnameForProducers && rtpParameters.rtcp && rtpParameters.rtcp.cname) { - this.#cnameForProducers = rtpParameters.rtcp.cname; - } - // Otherwise if we don't have yet a CNAME for Producers and the RTP parameters - // do not include CNAME, create a random one. - else if (!this.#cnameForProducers) { - this.#cnameForProducers = (0, uuid_1.v4)().substr(0, 8); - } - // Override Producer's CNAME. - rtpParameters.rtcp = rtpParameters.rtcp || {}; - rtpParameters.rtcp.cname = this.#cnameForProducers; - } - const routerRtpCapabilities = this.#getRouterRtpCapabilities(); - // This may throw. - const rtpMapping = ortc.getProducerRtpParametersMapping(rtpParameters, routerRtpCapabilities); - // This may throw. - const consumableRtpParameters = ortc.getConsumableRtpParameters(kind, rtpParameters, routerRtpCapabilities, rtpMapping); - const reqData = { - producerId: id || (0, uuid_1.v4)(), - kind, - rtpParameters, - rtpMapping, - keyFrameRequestDelay, - paused - }; - const status = await this.channel.request('transport.produce', this.internal.transportId, reqData); - const data = { - kind, - rtpParameters, - type: status.type, - consumableRtpParameters - }; - const producer = new Producer_1.Producer({ - internal: { - ...this.internal, - producerId: reqData.producerId - }, - data, - channel: this.channel, - payloadChannel: this.payloadChannel, - appData, - paused - }); - this.#producers.set(producer.id, producer); - producer.on('@close', () => { - this.#producers.delete(producer.id); - this.emit('@producerclose', producer); - }); - this.emit('@newproducer', producer); - // Emit observer event. - this.#observer.safeEmit('newproducer', producer); - return producer; - } - /** - * Create a Consumer. - * - * @virtual - */ - async consume({ producerId, rtpCapabilities, paused = false, mid, preferredLayers, ignoreDtx = false, pipe = false, appData }) { - logger.debug('consume()'); - if (!producerId || typeof producerId !== 'string') - throw new TypeError('missing producerId'); - else if (appData && typeof appData !== 'object') - throw new TypeError('if given, appData must be an object'); - else if (mid && (typeof mid !== 'string' || mid.length === 0)) - throw new TypeError('if given, mid must be non empty string'); - // This may throw. - ortc.validateRtpCapabilities(rtpCapabilities); - const producer = this.getProducerById(producerId); - if (!producer) - throw Error(`Producer with id "${producerId}" not found`); - // This may throw. - const rtpParameters = ortc.getConsumerRtpParameters(producer.consumableRtpParameters, rtpCapabilities, pipe); - // Set MID. - if (!pipe) { - if (mid) { - rtpParameters.mid = mid; - } - else { - rtpParameters.mid = `${this.#nextMidForConsumers++}`; - // We use up to 8 bytes for MID (string). - if (this.#nextMidForConsumers === 100000000) { - logger.error(`consume() | reaching max MID value "${this.#nextMidForConsumers}"`); - this.#nextMidForConsumers = 0; - } - } - } - const reqData = { - consumerId: (0, uuid_1.v4)(), - producerId, - kind: producer.kind, - rtpParameters, - type: pipe ? 'pipe' : producer.type, - consumableRtpEncodings: producer.consumableRtpParameters.encodings, - paused, - preferredLayers, - ignoreDtx - }; - const status = await this.channel.request('transport.consume', this.internal.transportId, reqData); - const data = { - producerId, - kind: producer.kind, - rtpParameters, - type: pipe ? 'pipe' : producer.type - }; - const consumer = new Consumer_1.Consumer({ - internal: { - ...this.internal, - consumerId: reqData.consumerId - }, - data, - channel: this.channel, - payloadChannel: this.payloadChannel, - appData, - paused: status.paused, - producerPaused: status.producerPaused, - score: status.score, - preferredLayers: status.preferredLayers - }); - this.consumers.set(consumer.id, consumer); - consumer.on('@close', () => this.consumers.delete(consumer.id)); - consumer.on('@producerclose', () => this.consumers.delete(consumer.id)); - // Emit observer event. - this.#observer.safeEmit('newconsumer', consumer); - return consumer; - } - /** - * Create a DataProducer. - */ - async produceData({ id = undefined, sctpStreamParameters, label = '', protocol = '', appData } = {}) { - logger.debug('produceData()'); - if (id && this.dataProducers.has(id)) - throw new TypeError(`a DataProducer with same id "${id}" already exists`); - else if (appData && typeof appData !== 'object') - throw new TypeError('if given, appData must be an object'); - let type; - // If this is not a DirectTransport, sctpStreamParameters are required. - if (this.constructor.name !== 'DirectTransport') { - type = 'sctp'; - // This may throw. - ortc.validateSctpStreamParameters(sctpStreamParameters); - } - // If this is a DirectTransport, sctpStreamParameters must not be given. - else { - type = 'direct'; - if (sctpStreamParameters) { - logger.warn('produceData() | sctpStreamParameters are ignored when producing data on a DirectTransport'); - } - } - const reqData = { - dataProducerId: id || (0, uuid_1.v4)(), - type, - sctpStreamParameters, - label, - protocol - }; - const data = await this.channel.request('transport.produceData', this.internal.transportId, reqData); - const dataProducer = new DataProducer_1.DataProducer({ - internal: { - ...this.internal, - dataProducerId: reqData.dataProducerId - }, - data, - channel: this.channel, - payloadChannel: this.payloadChannel, - appData - }); - this.dataProducers.set(dataProducer.id, dataProducer); - dataProducer.on('@close', () => { - this.dataProducers.delete(dataProducer.id); - this.emit('@dataproducerclose', dataProducer); - }); - this.emit('@newdataproducer', dataProducer); - // Emit observer event. - this.#observer.safeEmit('newdataproducer', dataProducer); - return dataProducer; - } - /** - * Create a DataConsumer. - */ - async consumeData({ dataProducerId, ordered, maxPacketLifeTime, maxRetransmits, appData }) { - logger.debug('consumeData()'); - if (!dataProducerId || typeof dataProducerId !== 'string') - throw new TypeError('missing dataProducerId'); - else if (appData && typeof appData !== 'object') - throw new TypeError('if given, appData must be an object'); - const dataProducer = this.getDataProducerById(dataProducerId); - if (!dataProducer) - throw Error(`DataProducer with id "${dataProducerId}" not found`); - let type; - let sctpStreamParameters; - let sctpStreamId; - // If this is not a DirectTransport, use sctpStreamParameters from the - // DataProducer (if type 'sctp') unless they are given in method parameters. - if (this.constructor.name !== 'DirectTransport') { - type = 'sctp'; - sctpStreamParameters = - utils.clone(dataProducer.sctpStreamParameters); - // Override if given. - if (ordered !== undefined) - sctpStreamParameters.ordered = ordered; - if (maxPacketLifeTime !== undefined) - sctpStreamParameters.maxPacketLifeTime = maxPacketLifeTime; - if (maxRetransmits !== undefined) - sctpStreamParameters.maxRetransmits = maxRetransmits; - // This may throw. - sctpStreamId = this.getNextSctpStreamId(); - this.#sctpStreamIds[sctpStreamId] = 1; - sctpStreamParameters.streamId = sctpStreamId; - } - // If this is a DirectTransport, sctpStreamParameters must not be used. - else { - type = 'direct'; - if (ordered !== undefined || - maxPacketLifeTime !== undefined || - maxRetransmits !== undefined) { - logger.warn('consumeData() | ordered, maxPacketLifeTime and maxRetransmits are ignored when consuming data on a DirectTransport'); - } - } - const { label, protocol } = dataProducer; - const reqData = { - dataConsumerId: (0, uuid_1.v4)(), - dataProducerId, - type, - sctpStreamParameters, - label, - protocol - }; - const data = await this.channel.request('transport.consumeData', this.internal.transportId, reqData); - const dataConsumer = new DataConsumer_1.DataConsumer({ - internal: { - ...this.internal, - dataConsumerId: reqData.dataConsumerId - }, - data, - channel: this.channel, - payloadChannel: this.payloadChannel, - appData - }); - this.dataConsumers.set(dataConsumer.id, dataConsumer); - dataConsumer.on('@close', () => { - this.dataConsumers.delete(dataConsumer.id); - if (this.#sctpStreamIds) - this.#sctpStreamIds[sctpStreamId] = 0; - }); - dataConsumer.on('@dataproducerclose', () => { - this.dataConsumers.delete(dataConsumer.id); - if (this.#sctpStreamIds) - this.#sctpStreamIds[sctpStreamId] = 0; - }); - // Emit observer event. - this.#observer.safeEmit('newdataconsumer', dataConsumer); - return dataConsumer; - } - /** - * Enable 'trace' event. - */ - async enableTraceEvent(types = []) { - logger.debug('pause()'); - const reqData = { types }; - await this.channel.request('transport.enableTraceEvent', this.internal.transportId, reqData); - } - getNextSctpStreamId() { - if (!this.#data.sctpParameters || - typeof this.#data.sctpParameters.MIS !== 'number') { - throw new TypeError('missing sctpParameters.MIS'); - } - const numStreams = this.#data.sctpParameters.MIS; - if (!this.#sctpStreamIds) - this.#sctpStreamIds = Buffer.alloc(numStreams, 0); - let sctpStreamId; - for (let idx = 0; idx < this.#sctpStreamIds.length; ++idx) { - sctpStreamId = (this.#nextSctpStreamId + idx) % this.#sctpStreamIds.length; - if (!this.#sctpStreamIds[sctpStreamId]) { - this.#nextSctpStreamId = sctpStreamId + 1; - return sctpStreamId; - } - } - throw new Error('no sctpStreamId available'); - } -} -exports.Transport = Transport; diff --git a/node/lib/WebRtcServer.d.ts b/node/lib/WebRtcServer.d.ts deleted file mode 100644 index 3efef73731..0000000000 --- a/node/lib/WebRtcServer.d.ts +++ /dev/null @@ -1,101 +0,0 @@ -import { EnhancedEventEmitter } from './EnhancedEventEmitter'; -import { Channel } from './Channel'; -import { TransportProtocol } from './Transport'; -import { WebRtcTransport } from './WebRtcTransport'; -export declare type WebRtcServerListenInfo = { - /** - * Network protocol. - */ - protocol: TransportProtocol; - /** - * Listening IPv4 or IPv6. - */ - ip: string; - /** - * Announced IPv4 or IPv6 (useful when running mediasoup behind NAT with - * private IP). - */ - announcedIp?: string; - /** - * Listening port. - */ - port?: number; -}; -export declare type WebRtcServerOptions = { - /** - * Listen infos. - */ - listenInfos: WebRtcServerListenInfo[]; - /** - * Custom application data. - */ - appData?: Record; -}; -export declare type WebRtcServerEvents = { - workerclose: []; - '@close': []; -}; -export declare type WebRtcServerObserverEvents = { - close: []; - webrtctransporthandled: [WebRtcTransport]; - webrtctransportunhandled: [WebRtcTransport]; -}; -declare type WebRtcServerInternal = { - webRtcServerId: string; -}; -export declare class WebRtcServer extends EnhancedEventEmitter { - #private; - /** - * @private - */ - constructor({ internal, channel, appData }: { - internal: WebRtcServerInternal; - channel: Channel; - appData?: Record; - }); - /** - * WebRtcServer id. - */ - get id(): string; - /** - * Whether the WebRtcServer is closed. - */ - get closed(): boolean; - /** - * App custom data. - */ - get appData(): Record; - /** - * Invalid setter. - */ - set appData(appData: Record); - /** - * Observer. - */ - get observer(): EnhancedEventEmitter; - /** - * @private - * Just for testing purposes. - */ - get webRtcTransportsForTesting(): Map; - /** - * Close the WebRtcServer. - */ - close(): void; - /** - * Worker was closed. - * - * @private - */ - workerClosed(): void; - /** - * Dump WebRtcServer. - */ - dump(): Promise; - /** - * @private - */ - handleWebRtcTransport(webRtcTransport: WebRtcTransport): void; -} -export {}; -//# sourceMappingURL=WebRtcServer.d.ts.map \ No newline at end of file diff --git a/node/lib/WebRtcServer.d.ts.map b/node/lib/WebRtcServer.d.ts.map deleted file mode 100644 index 87651d6bd7..0000000000 --- a/node/lib/WebRtcServer.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"WebRtcServer.d.ts","sourceRoot":"","sources":["../src/WebRtcServer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,oBAAY,sBAAsB,GAClC;IACC;;OAEG;IACH,QAAQ,EAAE,iBAAiB,CAAC;IAE5B;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IAEX;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,oBAAY,mBAAmB,GAC/B;IACC;;OAEG;IACH,WAAW,EAAE,sBAAsB,EAAE,CAAC;IAEtC;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC,CAAC;AAEF,oBAAY,kBAAkB,GAC9B;IACC,WAAW,EAAE,EAAE,CAAC;IAEhB,QAAQ,EAAE,EAAE,CAAC;CACb,CAAC;AAEF,oBAAY,0BAA0B,GACtC;IACC,KAAK,EAAE,EAAE,CAAC;IACV,sBAAsB,EAAE,CAAC,eAAe,CAAC,CAAC;IAC1C,wBAAwB,EAAE,CAAC,eAAe,CAAC,CAAC;CAC5C,CAAC;AAEF,aAAK,oBAAoB,GACzB;IACC,cAAc,EAAE,MAAM,CAAC;CACvB,CAAC;AAIF,qBAAa,YAAa,SAAQ,oBAAoB,CAAC,kBAAkB,CAAC;;IAoBzE;;OAEG;gBAEF,EACC,QAAQ,EACR,OAAO,EACP,OAAO,EACP,EACD;QACC,QAAQ,EAAE,oBAAoB,CAAC;QAC/B,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAClC;IAYF;;OAEG;IACH,IAAI,EAAE,IAAI,MAAM,CAGf;IAED;;OAEG;IACH,IAAI,MAAM,IAAI,OAAO,CAGpB;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAGrC;IAED;;OAEG;IACH,IAAI,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAG3C;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,oBAAoB,CAAC,0BAA0B,CAAC,CAG/D;IAED;;;OAGG;IACH,IAAI,0BAA0B,IAAI,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAG7D;IAED;;OAEG;IACH,KAAK,IAAI,IAAI;IA8Bb;;;;OAIG;IACH,YAAY,IAAI,IAAI;IAmBpB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC;IAO1B;;OAEG;IACH,qBAAqB,CAAC,eAAe,EAAE,eAAe,GAAG,IAAI;CAe7D"} \ No newline at end of file diff --git a/node/lib/WebRtcServer.js b/node/lib/WebRtcServer.js deleted file mode 100644 index 38b0f2db5e..0000000000 --- a/node/lib/WebRtcServer.js +++ /dev/null @@ -1,127 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.WebRtcServer = void 0; -const Logger_1 = require("./Logger"); -const EnhancedEventEmitter_1 = require("./EnhancedEventEmitter"); -const logger = new Logger_1.Logger('WebRtcServer'); -class WebRtcServer extends EnhancedEventEmitter_1.EnhancedEventEmitter { - // Internal data. - #internal; - // Channel instance. - #channel; - // Closed flag. - #closed = false; - // Custom app data. - #appData; - // Transports map. - #webRtcTransports = new Map(); - // Observer instance. - #observer = new EnhancedEventEmitter_1.EnhancedEventEmitter(); - /** - * @private - */ - constructor({ internal, channel, appData }) { - super(); - logger.debug('constructor()'); - this.#internal = internal; - this.#channel = channel; - this.#appData = appData || {}; - } - /** - * WebRtcServer id. - */ - get id() { - return this.#internal.webRtcServerId; - } - /** - * Whether the WebRtcServer is closed. - */ - get closed() { - return this.#closed; - } - /** - * App custom data. - */ - get appData() { - return this.#appData; - } - /** - * Invalid setter. - */ - set appData(appData) { - throw new Error('cannot override appData object'); - } - /** - * Observer. - */ - get observer() { - return this.#observer; - } - /** - * @private - * Just for testing purposes. - */ - get webRtcTransportsForTesting() { - return this.#webRtcTransports; - } - /** - * Close the WebRtcServer. - */ - close() { - if (this.#closed) - return; - logger.debug('close()'); - this.#closed = true; - const reqData = { webRtcServerId: this.#internal.webRtcServerId }; - this.#channel.request('worker.closeWebRtcServer', undefined, reqData) - .catch(() => { }); - // Close every WebRtcTransport. - for (const webRtcTransport of this.#webRtcTransports.values()) { - webRtcTransport.listenServerClosed(); - // Emit observer event. - this.#observer.safeEmit('webrtctransportunhandled', webRtcTransport); - } - this.#webRtcTransports.clear(); - this.emit('@close'); - // Emit observer event. - this.#observer.safeEmit('close'); - } - /** - * Worker was closed. - * - * @private - */ - workerClosed() { - if (this.#closed) - return; - logger.debug('workerClosed()'); - this.#closed = true; - // NOTE: No need to close WebRtcTransports since they are closed by their - // respective Router parents. - this.#webRtcTransports.clear(); - this.safeEmit('workerclose'); - // Emit observer event. - this.#observer.safeEmit('close'); - } - /** - * Dump WebRtcServer. - */ - async dump() { - logger.debug('dump()'); - return this.#channel.request('webRtcServer.dump', this.#internal.webRtcServerId); - } - /** - * @private - */ - handleWebRtcTransport(webRtcTransport) { - this.#webRtcTransports.set(webRtcTransport.id, webRtcTransport); - // Emit observer event. - this.#observer.safeEmit('webrtctransporthandled', webRtcTransport); - webRtcTransport.on('@close', () => { - this.#webRtcTransports.delete(webRtcTransport.id); - // Emit observer event. - this.#observer.safeEmit('webrtctransportunhandled', webRtcTransport); - }); - } -} -exports.WebRtcServer = WebRtcServer; diff --git a/node/lib/WebRtcTransport.d.ts b/node/lib/WebRtcTransport.d.ts deleted file mode 100644 index 111b7dfb84..0000000000 --- a/node/lib/WebRtcTransport.d.ts +++ /dev/null @@ -1,240 +0,0 @@ -import { Transport, TransportListenIp, TransportProtocol, TransportTuple, TransportEvents, TransportObserverEvents, TransportConstructorOptions, SctpState } from './Transport'; -import { WebRtcServer } from './WebRtcServer'; -import { SctpParameters, NumSctpStreams } from './SctpParameters'; -import { Either } from './utils'; -export declare type WebRtcTransportListenIndividual = { - /** - * Listening IP address or addresses in order of preference (first one is the - * preferred one). Mandatory unless webRtcServer is given. - */ - listenIps: (TransportListenIp | string)[]; - /** - * Fixed port to listen on instead of selecting automatically from Worker's port - * range. - */ - port?: number; -}; -export declare type WebRtcTransportListenServer = { - /** - * Instance of WebRtcServer. Mandatory unless listenIps is given. - */ - webRtcServer: WebRtcServer; -}; -export declare type WebRtcTransportListen = Either; -export declare type WebRtcTransportOptionsBase = { - /** - * Listen in UDP. Default true. - */ - enableUdp?: boolean; - /** - * Listen in TCP. Default false. - */ - enableTcp?: boolean; - /** - * Prefer UDP. Default false. - */ - preferUdp?: boolean; - /** - * Prefer TCP. Default false. - */ - preferTcp?: boolean; - /** - * Initial available outgoing bitrate (in bps). Default 600000. - */ - initialAvailableOutgoingBitrate?: number; - /** - * Create a SCTP association. Default false. - */ - enableSctp?: boolean; - /** - * SCTP streams number. - */ - numSctpStreams?: NumSctpStreams; - /** - * Maximum allowed size for SCTP messages sent by DataProducers. - * Default 262144. - */ - maxSctpMessageSize?: number; - /** - * Maximum SCTP send buffer used by DataConsumers. - * Default 262144. - */ - sctpSendBufferSize?: number; - /** - * Custom application data. - */ - appData?: Record; -}; -export declare type WebRtcTransportOptions = WebRtcTransportOptionsBase & WebRtcTransportListen; -export declare type IceParameters = { - usernameFragment: string; - password: string; - iceLite?: boolean; -}; -export declare type IceCandidate = { - foundation: string; - priority: number; - ip: string; - protocol: TransportProtocol; - port: number; - type: 'host'; - tcpType: 'passive' | undefined; -}; -export declare type DtlsParameters = { - role?: DtlsRole; - fingerprints: DtlsFingerprint[]; -}; -/** - * The hash function algorithm (as defined in the "Hash function Textual Names" - * registry initially specified in RFC 4572 Section 8) and its corresponding - * certificate fingerprint value (in lowercase hex string as expressed utilizing - * the syntax of "fingerprint" in RFC 4572 Section 5). - */ -export declare type DtlsFingerprint = { - algorithm: string; - value: string; -}; -export declare type IceState = 'new' | 'connected' | 'completed' | 'disconnected' | 'closed'; -export declare type DtlsRole = 'auto' | 'client' | 'server'; -export declare type DtlsState = 'new' | 'connecting' | 'connected' | 'failed' | 'closed'; -export declare type WebRtcTransportStat = { - type: string; - transportId: string; - timestamp: number; - sctpState?: SctpState; - bytesReceived: number; - recvBitrate: number; - bytesSent: number; - sendBitrate: number; - rtpBytesReceived: number; - rtpRecvBitrate: number; - rtpBytesSent: number; - rtpSendBitrate: number; - rtxBytesReceived: number; - rtxRecvBitrate: number; - rtxBytesSent: number; - rtxSendBitrate: number; - probationBytesSent: number; - probationSendBitrate: number; - availableOutgoingBitrate?: number; - availableIncomingBitrate?: number; - maxIncomingBitrate?: number; - iceRole: string; - iceState: IceState; - iceSelectedTuple?: TransportTuple; - dtlsState: DtlsState; -}; -export declare type WebRtcTransportEvents = TransportEvents & { - icestatechange: [IceState]; - iceselectedtuplechange: [TransportTuple]; - dtlsstatechange: [DtlsState]; - sctpstatechange: [SctpState]; -}; -export declare type WebRtcTransportObserverEvents = TransportObserverEvents & { - icestatechange: [IceState]; - iceselectedtuplechange: [TransportTuple]; - dtlsstatechange: [DtlsState]; - sctpstatechange: [SctpState]; -}; -declare type WebRtcTransportConstructorOptions = TransportConstructorOptions & { - data: WebRtcTransportData; -}; -export declare type WebRtcTransportData = { - iceRole: 'controlled'; - iceParameters: IceParameters; - iceCandidates: IceCandidate[]; - iceState: IceState; - iceSelectedTuple?: TransportTuple; - dtlsParameters: DtlsParameters; - dtlsState: DtlsState; - dtlsRemoteCert?: string; - sctpParameters?: SctpParameters; - sctpState?: SctpState; -}; -export declare class WebRtcTransport extends Transport { - #private; - /** - * @private - */ - constructor(options: WebRtcTransportConstructorOptions); - /** - * ICE role. - */ - get iceRole(): 'controlled'; - /** - * ICE parameters. - */ - get iceParameters(): IceParameters; - /** - * ICE candidates. - */ - get iceCandidates(): IceCandidate[]; - /** - * ICE state. - */ - get iceState(): IceState; - /** - * ICE selected tuple. - */ - get iceSelectedTuple(): TransportTuple | undefined; - /** - * DTLS parameters. - */ - get dtlsParameters(): DtlsParameters; - /** - * DTLS state. - */ - get dtlsState(): DtlsState; - /** - * Remote certificate in PEM format. - */ - get dtlsRemoteCert(): string | undefined; - /** - * SCTP parameters. - */ - get sctpParameters(): SctpParameters | undefined; - /** - * SCTP state. - */ - get sctpState(): SctpState | undefined; - /** - * Close the WebRtcTransport. - * - * @override - */ - close(): void; - /** - * Router was closed. - * - * @private - * @override - */ - routerClosed(): void; - /** - * Called when closing the associated WebRtcServer. - * - * @private - */ - webRtcServerClosed(): void; - /** - * Get WebRtcTransport stats. - * - * @override - */ - getStats(): Promise; - /** - * Provide the WebRtcTransport remote parameters. - * - * @override - */ - connect({ dtlsParameters }: { - dtlsParameters: DtlsParameters; - }): Promise; - /** - * Restart ICE. - */ - restartIce(): Promise; - private handleWorkerNotifications; -} -export {}; -//# sourceMappingURL=WebRtcTransport.d.ts.map \ No newline at end of file diff --git a/node/lib/WebRtcTransport.d.ts.map b/node/lib/WebRtcTransport.d.ts.map deleted file mode 100644 index 75a2e3164b..0000000000 --- a/node/lib/WebRtcTransport.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"WebRtcTransport.d.ts","sourceRoot":"","sources":["../src/WebRtcTransport.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node/lib/WebRtcTransport.js b/node/lib/WebRtcTransport.js deleted file mode 100644 index 20e96c3452..0000000000 --- a/node/lib/WebRtcTransport.js +++ /dev/null @@ -1,227 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.WebRtcTransport = void 0; -const Logger_1 = require("./Logger"); -const Transport_1 = require("./Transport"); -const logger = new Logger_1.Logger('WebRtcTransport'); -class WebRtcTransport extends Transport_1.Transport { - // WebRtcTransport data. - #data; - /** - * @private - */ - constructor(options) { - super(options); - logger.debug('constructor()'); - const { data } = options; - this.#data = - { - iceRole: data.iceRole, - iceParameters: data.iceParameters, - iceCandidates: data.iceCandidates, - iceState: data.iceState, - iceSelectedTuple: data.iceSelectedTuple, - dtlsParameters: data.dtlsParameters, - dtlsState: data.dtlsState, - dtlsRemoteCert: data.dtlsRemoteCert, - sctpParameters: data.sctpParameters, - sctpState: data.sctpState - }; - this.handleWorkerNotifications(); - } - /** - * ICE role. - */ - get iceRole() { - return this.#data.iceRole; - } - /** - * ICE parameters. - */ - get iceParameters() { - return this.#data.iceParameters; - } - /** - * ICE candidates. - */ - get iceCandidates() { - return this.#data.iceCandidates; - } - /** - * ICE state. - */ - get iceState() { - return this.#data.iceState; - } - /** - * ICE selected tuple. - */ - get iceSelectedTuple() { - return this.#data.iceSelectedTuple; - } - /** - * DTLS parameters. - */ - get dtlsParameters() { - return this.#data.dtlsParameters; - } - /** - * DTLS state. - */ - get dtlsState() { - return this.#data.dtlsState; - } - /** - * Remote certificate in PEM format. - */ - get dtlsRemoteCert() { - return this.#data.dtlsRemoteCert; - } - /** - * SCTP parameters. - */ - get sctpParameters() { - return this.#data.sctpParameters; - } - /** - * SCTP state. - */ - get sctpState() { - return this.#data.sctpState; - } - /** - * Close the WebRtcTransport. - * - * @override - */ - close() { - if (this.closed) - return; - this.#data.iceState = 'closed'; - this.#data.iceSelectedTuple = undefined; - this.#data.dtlsState = 'closed'; - if (this.#data.sctpState) - this.#data.sctpState = 'closed'; - super.close(); - } - /** - * Router was closed. - * - * @private - * @override - */ - routerClosed() { - if (this.closed) - return; - this.#data.iceState = 'closed'; - this.#data.iceSelectedTuple = undefined; - this.#data.dtlsState = 'closed'; - if (this.#data.sctpState) - this.#data.sctpState = 'closed'; - super.routerClosed(); - } - /** - * Called when closing the associated WebRtcServer. - * - * @private - */ - webRtcServerClosed() { - if (this.closed) - return; - this.#data.iceState = 'closed'; - this.#data.iceSelectedTuple = undefined; - this.#data.dtlsState = 'closed'; - if (this.#data.sctpState) - this.#data.sctpState = 'closed'; - super.listenServerClosed(); - } - /** - * Get WebRtcTransport stats. - * - * @override - */ - async getStats() { - logger.debug('getStats()'); - return this.channel.request('transport.getStats', this.internal.transportId); - } - /** - * Provide the WebRtcTransport remote parameters. - * - * @override - */ - async connect({ dtlsParameters }) { - logger.debug('connect()'); - const reqData = { dtlsParameters }; - const data = await this.channel.request('transport.connect', this.internal.transportId, reqData); - // Update data. - this.#data.dtlsParameters.role = data.dtlsLocalRole; - } - /** - * Restart ICE. - */ - async restartIce() { - logger.debug('restartIce()'); - const data = await this.channel.request('transport.restartIce', this.internal.transportId); - const { iceParameters } = data; - this.#data.iceParameters = iceParameters; - return iceParameters; - } - handleWorkerNotifications() { - this.channel.on(this.internal.transportId, (event, data) => { - switch (event) { - case 'icestatechange': - { - const iceState = data.iceState; - this.#data.iceState = iceState; - this.safeEmit('icestatechange', iceState); - // Emit observer event. - this.observer.safeEmit('icestatechange', iceState); - break; - } - case 'iceselectedtuplechange': - { - const iceSelectedTuple = data.iceSelectedTuple; - this.#data.iceSelectedTuple = iceSelectedTuple; - this.safeEmit('iceselectedtuplechange', iceSelectedTuple); - // Emit observer event. - this.observer.safeEmit('iceselectedtuplechange', iceSelectedTuple); - break; - } - case 'dtlsstatechange': - { - const dtlsState = data.dtlsState; - const dtlsRemoteCert = data.dtlsRemoteCert; - this.#data.dtlsState = dtlsState; - if (dtlsState === 'connected') - this.#data.dtlsRemoteCert = dtlsRemoteCert; - this.safeEmit('dtlsstatechange', dtlsState); - // Emit observer event. - this.observer.safeEmit('dtlsstatechange', dtlsState); - break; - } - case 'sctpstatechange': - { - const sctpState = data.sctpState; - this.#data.sctpState = sctpState; - this.safeEmit('sctpstatechange', sctpState); - // Emit observer event. - this.observer.safeEmit('sctpstatechange', sctpState); - break; - } - case 'trace': - { - const trace = data; - this.safeEmit('trace', trace); - // Emit observer event. - this.observer.safeEmit('trace', trace); - break; - } - default: - { - logger.error('ignoring unknown event "%s"', event); - } - } - }); - } -} -exports.WebRtcTransport = WebRtcTransport; diff --git a/node/lib/Worker.d.ts b/node/lib/Worker.d.ts deleted file mode 100644 index 828606e7af..0000000000 --- a/node/lib/Worker.d.ts +++ /dev/null @@ -1,190 +0,0 @@ -import { EnhancedEventEmitter } from './EnhancedEventEmitter'; -import { Router, RouterOptions } from './Router'; -import { WebRtcServer, WebRtcServerOptions } from './WebRtcServer'; -export declare type WorkerLogLevel = 'debug' | 'warn' | 'error' | 'none'; -export declare type WorkerLogTag = 'info' | 'ice' | 'dtls' | 'rtp' | 'srtp' | 'rtcp' | 'rtx' | 'bwe' | 'score' | 'simulcast' | 'svc' | 'sctp' | 'message'; -export declare type WorkerSettings = { - /** - * Logging level for logs generated by the media worker subprocesses (check - * the Debugging documentation). Valid values are 'debug', 'warn', 'error' and - * 'none'. Default 'error'. - */ - logLevel?: WorkerLogLevel; - /** - * Log tags for debugging. Check the meaning of each available tag in the - * Debugging documentation. - */ - logTags?: WorkerLogTag[]; - /** - * Minimun RTC port for ICE, DTLS, RTP, etc. Default 10000. - */ - rtcMinPort?: number; - /** - * Maximum RTC port for ICE, DTLS, RTP, etc. Default 59999. - */ - rtcMaxPort?: number; - /** - * Path to the DTLS public certificate file in PEM format. If unset, a - * certificate is dynamically created. - */ - dtlsCertificateFile?: string; - /** - * Path to the DTLS certificate private key file in PEM format. If unset, a - * certificate is dynamically created. - */ - dtlsPrivateKeyFile?: string; - /** - * Custom application data. - */ - appData?: Record; -}; -export declare type WorkerUpdateableSettings = Pick; -/** - * An object with the fields of the uv_rusage_t struct. - * - * - http://docs.libuv.org/en/v1.x/misc.html#c.uv_rusage_t - * - https://linux.die.net/man/2/getrusage - */ -export declare type WorkerResourceUsage = { - /** - * User CPU time used (in ms). - */ - ru_utime: number; - /** - * System CPU time used (in ms). - */ - ru_stime: number; - /** - * Maximum resident set size. - */ - ru_maxrss: number; - /** - * Integral shared memory size. - */ - ru_ixrss: number; - /** - * Integral unshared data size. - */ - ru_idrss: number; - /** - * Integral unshared stack size. - */ - ru_isrss: number; - /** - * Page reclaims (soft page faults). - */ - ru_minflt: number; - /** - * Page faults (hard page faults). - */ - ru_majflt: number; - /** - * Swaps. - */ - ru_nswap: number; - /** - * Block input operations. - */ - ru_inblock: number; - /** - * Block output operations. - */ - ru_oublock: number; - /** - * IPC messages sent. - */ - ru_msgsnd: number; - /** - * IPC messages received. - */ - ru_msgrcv: number; - /** - * Signals received. - */ - ru_nsignals: number; - /** - * Voluntary context switches. - */ - ru_nvcsw: number; - /** - * Involuntary context switches. - */ - ru_nivcsw: number; -}; -export declare type WorkerEvents = { - died: [Error]; - '@success': []; - '@failure': [Error]; -}; -export declare type WorkerObserverEvents = { - close: []; - newwebrtcserver: [WebRtcServer]; - newrouter: [Router]; -}; -export declare class Worker extends EnhancedEventEmitter { - #private; - /** - * @private - */ - constructor({ logLevel, logTags, rtcMinPort, rtcMaxPort, dtlsCertificateFile, dtlsPrivateKeyFile, appData }: WorkerSettings); - /** - * Worker process identifier (PID). - */ - get pid(): number; - /** - * Whether the Worker is closed. - */ - get closed(): boolean; - /** - * Whether the Worker died. - */ - get died(): boolean; - /** - * App custom data. - */ - get appData(): Record; - /** - * Invalid setter. - */ - set appData(appData: Record); - /** - * Observer. - */ - get observer(): EnhancedEventEmitter; - /** - * @private - * Just for testing purposes. - */ - get webRtcServersForTesting(): Set; - /** - * @private - * Just for testing purposes. - */ - get routersForTesting(): Set; - /** - * Close the Worker. - */ - close(): void; - /** - * Dump Worker. - */ - dump(): Promise; - /** - * Get mediasoup-worker process resource usage. - */ - getResourceUsage(): Promise; - /** - * Update settings. - */ - updateSettings({ logLevel, logTags }?: WorkerUpdateableSettings): Promise; - /** - * Create a WebRtcServer. - */ - createWebRtcServer({ listenInfos, appData }: WebRtcServerOptions): Promise; - /** - * Create a Router. - */ - createRouter({ mediaCodecs, appData }?: RouterOptions): Promise; - private workerDied; -} -//# sourceMappingURL=Worker.d.ts.map \ No newline at end of file diff --git a/node/lib/Worker.d.ts.map b/node/lib/Worker.d.ts.map deleted file mode 100644 index 22901fd259..0000000000 --- a/node/lib/Worker.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"Worker.d.ts","sourceRoot":"","sources":["../src/Worker.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node/lib/Worker.js b/node/lib/Worker.js deleted file mode 100644 index 2612e23fc0..0000000000 --- a/node/lib/Worker.js +++ /dev/null @@ -1,354 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.Worker = void 0; -const process = require("process"); -const path = require("path"); -const child_process_1 = require("child_process"); -const uuid_1 = require("uuid"); -const Logger_1 = require("./Logger"); -const EnhancedEventEmitter_1 = require("./EnhancedEventEmitter"); -const ortc = require("./ortc"); -const Channel_1 = require("./Channel"); -const PayloadChannel_1 = require("./PayloadChannel"); -const Router_1 = require("./Router"); -const WebRtcServer_1 = require("./WebRtcServer"); -// If env MEDIASOUP_WORKER_BIN is given, use it as worker binary. -// Otherwise if env MEDIASOUP_BUILDTYPE is 'Debug' use the Debug binary. -// Otherwise use the Release binary. -const workerBin = process.env.MEDIASOUP_WORKER_BIN - ? process.env.MEDIASOUP_WORKER_BIN - : process.env.MEDIASOUP_BUILDTYPE === 'Debug' - ? path.join(__dirname, '..', '..', 'worker', 'out', 'Debug', 'mediasoup-worker') - : path.join(__dirname, '..', '..', 'worker', 'out', 'Release', 'mediasoup-worker'); -const logger = new Logger_1.Logger('Worker'); -const workerLogger = new Logger_1.Logger('Worker'); -class Worker extends EnhancedEventEmitter_1.EnhancedEventEmitter { - // mediasoup-worker child process. - #child; - // Worker process PID. - #pid; - // Channel instance. - #channel; - // PayloadChannel instance. - #payloadChannel; - // Closed flag. - #closed = false; - // Died dlag. - #died = false; - // Custom app data. - #appData; - // WebRtcServers set. - #webRtcServers = new Set(); - // Routers set. - #routers = new Set(); - // Observer instance. - #observer = new EnhancedEventEmitter_1.EnhancedEventEmitter(); - /** - * @private - */ - constructor({ logLevel, logTags, rtcMinPort, rtcMaxPort, dtlsCertificateFile, dtlsPrivateKeyFile, appData }) { - super(); - logger.debug('constructor()'); - let spawnBin = workerBin; - let spawnArgs = []; - if (process.env.MEDIASOUP_USE_VALGRIND === 'true') { - spawnBin = process.env.MEDIASOUP_VALGRIND_BIN || 'valgrind'; - if (process.env.MEDIASOUP_VALGRIND_OPTIONS) { - spawnArgs = spawnArgs.concat(process.env.MEDIASOUP_VALGRIND_OPTIONS.split(/\s+/)); - } - spawnArgs.push(workerBin); - } - if (typeof logLevel === 'string' && logLevel) - spawnArgs.push(`--logLevel=${logLevel}`); - for (const logTag of (Array.isArray(logTags) ? logTags : [])) { - if (typeof logTag === 'string' && logTag) - spawnArgs.push(`--logTag=${logTag}`); - } - if (typeof rtcMinPort === 'number' && !Number.isNaN(rtcMinPort)) - spawnArgs.push(`--rtcMinPort=${rtcMinPort}`); - if (typeof rtcMaxPort === 'number' && !Number.isNaN(rtcMaxPort)) - spawnArgs.push(`--rtcMaxPort=${rtcMaxPort}`); - if (typeof dtlsCertificateFile === 'string' && dtlsCertificateFile) - spawnArgs.push(`--dtlsCertificateFile=${dtlsCertificateFile}`); - if (typeof dtlsPrivateKeyFile === 'string' && dtlsPrivateKeyFile) - spawnArgs.push(`--dtlsPrivateKeyFile=${dtlsPrivateKeyFile}`); - logger.debug('spawning worker process: %s %s', spawnBin, spawnArgs.join(' ')); - this.#child = (0, child_process_1.spawn)( - // command - spawnBin, - // args - spawnArgs, - // options - { - env: { - MEDIASOUP_VERSION: '3.11.3', - // Let the worker process inherit all environment variables, useful - // if a custom and not in the path GCC is used so the user can set - // LD_LIBRARY_PATH environment variable for runtime. - ...process.env - }, - detached: false, - // fd 0 (stdin) : Just ignore it. - // fd 1 (stdout) : Pipe it for 3rd libraries that log their own stuff. - // fd 2 (stderr) : Same as stdout. - // fd 3 (channel) : Producer Channel fd. - // fd 4 (channel) : Consumer Channel fd. - // fd 5 (channel) : Producer PayloadChannel fd. - // fd 6 (channel) : Consumer PayloadChannel fd. - stdio: ['ignore', 'pipe', 'pipe', 'pipe', 'pipe', 'pipe', 'pipe'], - windowsHide: true - }); - this.#pid = this.#child.pid; - this.#channel = new Channel_1.Channel({ - producerSocket: this.#child.stdio[3], - consumerSocket: this.#child.stdio[4], - pid: this.#pid - }); - this.#payloadChannel = new PayloadChannel_1.PayloadChannel({ - // NOTE: TypeScript does not like more than 5 fds. - // @ts-ignore - producerSocket: this.#child.stdio[5], - // @ts-ignore - consumerSocket: this.#child.stdio[6] - }); - this.#appData = appData || {}; - let spawnDone = false; - // Listen for 'running' notification. - this.#channel.once(String(this.#pid), (event) => { - if (!spawnDone && event === 'running') { - spawnDone = true; - logger.debug('worker process running [pid:%s]', this.#pid); - this.emit('@success'); - } - }); - this.#child.on('exit', (code, signal) => { - this.#child = undefined; - if (!spawnDone) { - spawnDone = true; - if (code === 42) { - logger.error('worker process failed due to wrong settings [pid:%s]', this.#pid); - this.close(); - this.emit('@failure', new TypeError('wrong settings')); - } - else { - logger.error('worker process failed unexpectedly [pid:%s, code:%s, signal:%s]', this.#pid, code, signal); - this.close(); - this.emit('@failure', new Error(`[pid:${this.#pid}, code:${code}, signal:${signal}]`)); - } - } - else { - logger.error('worker process died unexpectedly [pid:%s, code:%s, signal:%s]', this.#pid, code, signal); - this.workerDied(new Error(`[pid:${this.#pid}, code:${code}, signal:${signal}]`)); - } - }); - this.#child.on('error', (error) => { - this.#child = undefined; - if (!spawnDone) { - spawnDone = true; - logger.error('worker process failed [pid:%s]: %s', this.#pid, error.message); - this.close(); - this.emit('@failure', error); - } - else { - logger.error('worker process error [pid:%s]: %s', this.#pid, error.message); - this.workerDied(error); - } - }); - // Be ready for 3rd party worker libraries logging to stdout. - this.#child.stdout.on('data', (buffer) => { - for (const line of buffer.toString('utf8').split('\n')) { - if (line) - workerLogger.debug(`(stdout) ${line}`); - } - }); - // In case of a worker bug, mediasoup will log to stderr. - this.#child.stderr.on('data', (buffer) => { - for (const line of buffer.toString('utf8').split('\n')) { - if (line) - workerLogger.error(`(stderr) ${line}`); - } - }); - } - /** - * Worker process identifier (PID). - */ - get pid() { - return this.#pid; - } - /** - * Whether the Worker is closed. - */ - get closed() { - return this.#closed; - } - /** - * Whether the Worker died. - */ - get died() { - return this.#died; - } - /** - * App custom data. - */ - get appData() { - return this.#appData; - } - /** - * Invalid setter. - */ - set appData(appData) { - throw new Error('cannot override appData object'); - } - /** - * Observer. - */ - get observer() { - return this.#observer; - } - /** - * @private - * Just for testing purposes. - */ - get webRtcServersForTesting() { - return this.#webRtcServers; - } - /** - * @private - * Just for testing purposes. - */ - get routersForTesting() { - return this.#routers; - } - /** - * Close the Worker. - */ - close() { - if (this.#closed) - return; - logger.debug('close()'); - this.#closed = true; - // Kill the worker process. - if (this.#child) { - // Remove event listeners but leave a fake 'error' hander to avoid - // propagation. - this.#child.removeAllListeners('exit'); - this.#child.removeAllListeners('error'); - this.#child.on('error', () => { }); - this.#child.kill('SIGTERM'); - this.#child = undefined; - } - // Close the Channel instance. - this.#channel.close(); - // Close the PayloadChannel instance. - this.#payloadChannel.close(); - // Close every Router. - for (const router of this.#routers) { - router.workerClosed(); - } - this.#routers.clear(); - // Close every WebRtcServer. - for (const webRtcServer of this.#webRtcServers) { - webRtcServer.workerClosed(); - } - this.#webRtcServers.clear(); - // Emit observer event. - this.#observer.safeEmit('close'); - } - /** - * Dump Worker. - */ - async dump() { - logger.debug('dump()'); - return this.#channel.request('worker.dump'); - } - /** - * Get mediasoup-worker process resource usage. - */ - async getResourceUsage() { - logger.debug('getResourceUsage()'); - return this.#channel.request('worker.getResourceUsage'); - } - /** - * Update settings. - */ - async updateSettings({ logLevel, logTags } = {}) { - logger.debug('updateSettings()'); - const reqData = { logLevel, logTags }; - await this.#channel.request('worker.updateSettings', undefined, reqData); - } - /** - * Create a WebRtcServer. - */ - async createWebRtcServer({ listenInfos, appData }) { - logger.debug('createWebRtcServer()'); - if (appData && typeof appData !== 'object') - throw new TypeError('if given, appData must be an object'); - const reqData = { - webRtcServerId: (0, uuid_1.v4)(), - listenInfos - }; - await this.#channel.request('worker.createWebRtcServer', undefined, reqData); - const webRtcServer = new WebRtcServer_1.WebRtcServer({ - internal: { webRtcServerId: reqData.webRtcServerId }, - channel: this.#channel, - appData - }); - this.#webRtcServers.add(webRtcServer); - webRtcServer.on('@close', () => this.#webRtcServers.delete(webRtcServer)); - // Emit observer event. - this.#observer.safeEmit('newwebrtcserver', webRtcServer); - return webRtcServer; - } - /** - * Create a Router. - */ - async createRouter({ mediaCodecs, appData } = {}) { - logger.debug('createRouter()'); - if (appData && typeof appData !== 'object') - throw new TypeError('if given, appData must be an object'); - // This may throw. - const rtpCapabilities = ortc.generateRouterRtpCapabilities(mediaCodecs); - const reqData = { routerId: (0, uuid_1.v4)() }; - await this.#channel.request('worker.createRouter', undefined, reqData); - const data = { rtpCapabilities }; - const router = new Router_1.Router({ - internal: { - routerId: reqData.routerId - }, - data, - channel: this.#channel, - payloadChannel: this.#payloadChannel, - appData - }); - this.#routers.add(router); - router.on('@close', () => this.#routers.delete(router)); - // Emit observer event. - this.#observer.safeEmit('newrouter', router); - return router; - } - workerDied(error) { - if (this.#closed) - return; - logger.debug(`died() [error:${error}]`); - this.#closed = true; - this.#died = true; - // Close the Channel instance. - this.#channel.close(); - // Close the PayloadChannel instance. - this.#payloadChannel.close(); - // Close every Router. - for (const router of this.#routers) { - router.workerClosed(); - } - this.#routers.clear(); - // Close every WebRtcServer. - for (const webRtcServer of this.#webRtcServers) { - webRtcServer.workerClosed(); - } - this.#webRtcServers.clear(); - this.safeEmit('died', error); - // Emit observer event. - this.#observer.safeEmit('close'); - } -} -exports.Worker = Worker; diff --git a/node/lib/errors.d.ts b/node/lib/errors.d.ts deleted file mode 100644 index 57b24c5380..0000000000 --- a/node/lib/errors.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Error indicating not support for something. - */ -export declare class UnsupportedError extends Error { - constructor(message: string); -} -/** - * Error produced when calling a method in an invalid state. - */ -export declare class InvalidStateError extends Error { - constructor(message: string); -} -//# sourceMappingURL=errors.d.ts.map \ No newline at end of file diff --git a/node/lib/errors.d.ts.map b/node/lib/errors.d.ts.map deleted file mode 100644 index a622738928..0000000000 --- a/node/lib/errors.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;gBAE9B,OAAO,EAAE,MAAM;CAW3B;AAED;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;gBAE/B,OAAO,EAAE,MAAM;CAW3B"} \ No newline at end of file diff --git a/node/lib/errors.js b/node/lib/errors.js deleted file mode 100644 index 3b5d4f4c0e..0000000000 --- a/node/lib/errors.js +++ /dev/null @@ -1,31 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.InvalidStateError = exports.UnsupportedError = void 0; -/** - * Error indicating not support for something. - */ -class UnsupportedError extends Error { - constructor(message) { - super(message); - this.name = 'UnsupportedError'; - if (Error.hasOwnProperty('captureStackTrace')) // Just in V8. - Error.captureStackTrace(this, UnsupportedError); - else - this.stack = (new Error(message)).stack; - } -} -exports.UnsupportedError = UnsupportedError; -/** - * Error produced when calling a method in an invalid state. - */ -class InvalidStateError extends Error { - constructor(message) { - super(message); - this.name = 'InvalidStateError'; - if (Error.hasOwnProperty('captureStackTrace')) // Just in V8. - Error.captureStackTrace(this, InvalidStateError); - else - this.stack = (new Error(message)).stack; - } -} -exports.InvalidStateError = InvalidStateError; diff --git a/node/lib/index.d.ts b/node/lib/index.d.ts deleted file mode 100644 index bfecd6d035..0000000000 --- a/node/lib/index.d.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { EnhancedEventEmitter } from './EnhancedEventEmitter'; -import { Worker, WorkerSettings } from './Worker'; -import { RtpCapabilities } from './RtpParameters'; -import * as types from './types'; -/** - * Expose all types. - */ -export { types }; -/** - * Expose mediasoup version. - */ -export declare const version = "3.11.3"; -/** - * Expose parseScalabilityMode() function. - */ -export { parse as parseScalabilityMode } from './scalabilityModes'; -export declare type ObserverEvents = { - newworker: [Worker]; -}; -declare const observer: EnhancedEventEmitter; -/** - * Observer. - */ -export { observer }; -/** - * Create a Worker. - */ -export declare function createWorker({ logLevel, logTags, rtcMinPort, rtcMaxPort, dtlsCertificateFile, dtlsPrivateKeyFile, appData }?: WorkerSettings): Promise; -/** - * Get a cloned copy of the mediasoup supported RTP capabilities. - */ -export declare function getSupportedRtpCapabilities(): RtpCapabilities; -//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/node/lib/index.d.ts.map b/node/lib/index.d.ts.map deleted file mode 100644 index 0ec50c4350..0000000000 --- a/node/lib/index.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAGlD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,KAAK,MAAM,SAAS,CAAC;AAEjC;;GAEG;AACH,OAAO,EAAE,KAAK,EAAE,CAAC;AAEjB;;GAEG;AACH,eAAO,MAAM,OAAO,0BAA0B,CAAC;AAE/C;;GAEG;AACH,OAAO,EAAE,KAAK,IAAI,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAInE,oBAAY,cAAc,GAC1B;IACC,SAAS,EAAE,CAAC,MAAM,CAAC,CAAC;CACpB,CAAC;AAEF,QAAA,MAAM,QAAQ,sCAA6C,CAAC;AAE5D;;GAEG;AACH,OAAO,EAAE,QAAQ,EAAE,CAAC;AAEpB;;GAEG;AACH,wBAAsB,YAAY,CACjC,EACC,QAAkB,EAClB,OAAO,EACP,UAAkB,EAClB,UAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,OAAO,EACP,GAAE,cAAmB,GACpB,OAAO,CAAC,MAAM,CAAC,CA8BjB;AAED;;GAEG;AACH,wBAAgB,2BAA2B,IAAI,eAAe,CAG7D"} \ No newline at end of file diff --git a/node/lib/index.js b/node/lib/index.js deleted file mode 100644 index 86d52fddd8..0000000000 --- a/node/lib/index.js +++ /dev/null @@ -1,55 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.getSupportedRtpCapabilities = exports.createWorker = exports.observer = exports.parseScalabilityMode = exports.version = exports.types = void 0; -const Logger_1 = require("./Logger"); -const EnhancedEventEmitter_1 = require("./EnhancedEventEmitter"); -const Worker_1 = require("./Worker"); -const utils = require("./utils"); -const supportedRtpCapabilities_1 = require("./supportedRtpCapabilities"); -const types = require("./types"); -exports.types = types; -/** - * Expose mediasoup version. - */ -exports.version = '3.11.3'; -/** - * Expose parseScalabilityMode() function. - */ -var scalabilityModes_1 = require("./scalabilityModes"); -Object.defineProperty(exports, "parseScalabilityMode", { enumerable: true, get: function () { return scalabilityModes_1.parse; } }); -const logger = new Logger_1.Logger(); -const observer = new EnhancedEventEmitter_1.EnhancedEventEmitter(); -exports.observer = observer; -/** - * Create a Worker. - */ -async function createWorker({ logLevel = 'error', logTags, rtcMinPort = 10000, rtcMaxPort = 59999, dtlsCertificateFile, dtlsPrivateKeyFile, appData } = {}) { - logger.debug('createWorker()'); - if (appData && typeof appData !== 'object') - throw new TypeError('if given, appData must be an object'); - const worker = new Worker_1.Worker({ - logLevel, - logTags, - rtcMinPort, - rtcMaxPort, - dtlsCertificateFile, - dtlsPrivateKeyFile, - appData - }); - return new Promise((resolve, reject) => { - worker.on('@success', () => { - // Emit observer event. - observer.safeEmit('newworker', worker); - resolve(worker); - }); - worker.on('@failure', reject); - }); -} -exports.createWorker = createWorker; -/** - * Get a cloned copy of the mediasoup supported RTP capabilities. - */ -function getSupportedRtpCapabilities() { - return utils.clone(supportedRtpCapabilities_1.supportedRtpCapabilities); -} -exports.getSupportedRtpCapabilities = getSupportedRtpCapabilities; diff --git a/node/lib/ortc.d.ts b/node/lib/ortc.d.ts deleted file mode 100644 index 9d510ac5cf..0000000000 --- a/node/lib/ortc.d.ts +++ /dev/null @@ -1,130 +0,0 @@ -import { RtpCapabilities, RtpCodecCapability, RtpHeaderExtension, RtpParameters, RtpCodecParameters, RtcpFeedback, RtpEncodingParameters, RtpHeaderExtensionParameters, RtcpParameters } from './RtpParameters'; -import { SctpCapabilities, NumSctpStreams, SctpParameters, SctpStreamParameters } from './SctpParameters'; -declare type RtpMapping = { - codecs: { - payloadType: number; - mappedPayloadType: number; - }[]; - encodings: { - ssrc?: number; - rid?: string; - scalabilityMode?: string; - mappedSsrc: number; - }[]; -}; -/** - * Validates RtpCapabilities. It may modify given data by adding missing - * fields with default values. - * It throws if invalid. - */ -export declare function validateRtpCapabilities(caps: RtpCapabilities): void; -/** - * Validates RtpCodecCapability. It may modify given data by adding missing - * fields with default values. - * It throws if invalid. - */ -export declare function validateRtpCodecCapability(codec: RtpCodecCapability): void; -/** - * Validates RtcpFeedback. It may modify given data by adding missing - * fields with default values. - * It throws if invalid. - */ -export declare function validateRtcpFeedback(fb: RtcpFeedback): void; -/** - * Validates RtpHeaderExtension. It may modify given data by adding missing - * fields with default values. - * It throws if invalid. - */ -export declare function validateRtpHeaderExtension(ext: RtpHeaderExtension): void; -/** - * Validates RtpParameters. It may modify given data by adding missing - * fields with default values. - * It throws if invalid. - */ -export declare function validateRtpParameters(params: RtpParameters): void; -/** - * Validates RtpCodecParameters. It may modify given data by adding missing - * fields with default values. - * It throws if invalid. - */ -export declare function validateRtpCodecParameters(codec: RtpCodecParameters): void; -/** - * Validates RtpHeaderExtensionParameteters. It may modify given data by adding missing - * fields with default values. - * It throws if invalid. - */ -export declare function validateRtpHeaderExtensionParameters(ext: RtpHeaderExtensionParameters): void; -/** - * Validates RtpEncodingParameters. It may modify given data by adding missing - * fields with default values. - * It throws if invalid. - */ -export declare function validateRtpEncodingParameters(encoding: RtpEncodingParameters): void; -/** - * Validates RtcpParameters. It may modify given data by adding missing - * fields with default values. - * It throws if invalid. - */ -export declare function validateRtcpParameters(rtcp: RtcpParameters): void; -/** - * Validates SctpCapabilities. It may modify given data by adding missing - * fields with default values. - * It throws if invalid. - */ -export declare function validateSctpCapabilities(caps: SctpCapabilities): void; -/** - * Validates NumSctpStreams. It may modify given data by adding missing - * fields with default values. - * It throws if invalid. - */ -export declare function validateNumSctpStreams(numStreams: NumSctpStreams): void; -/** - * Validates SctpParameters. It may modify given data by adding missing - * fields with default values. - * It throws if invalid. - */ -export declare function validateSctpParameters(params: SctpParameters): void; -/** - * Validates SctpStreamParameters. It may modify given data by adding missing - * fields with default values. - * It throws if invalid. - */ -export declare function validateSctpStreamParameters(params: SctpStreamParameters): void; -/** - * Generate RTP capabilities for the Router based on the given media codecs and - * mediasoup supported RTP capabilities. - */ -export declare function generateRouterRtpCapabilities(mediaCodecs?: RtpCodecCapability[]): RtpCapabilities; -/** - * Get a mapping of codec payloads and encodings of the given Producer RTP - * parameters as values expected by the Router. - * - * It may throw if invalid or non supported RTP parameters are given. - */ -export declare function getProducerRtpParametersMapping(params: RtpParameters, caps: RtpCapabilities): RtpMapping; -/** - * Generate RTP parameters to be internally used by Consumers given the RTP - * parameters of a Producer and the RTP capabilities of the Router. - */ -export declare function getConsumableRtpParameters(kind: string, params: RtpParameters, caps: RtpCapabilities, rtpMapping: RtpMapping): RtpParameters; -/** - * Check whether the given RTP capabilities can consume the given Producer. - */ -export declare function canConsume(consumableParams: RtpParameters, caps: RtpCapabilities): boolean; -/** - * Generate RTP parameters for a specific Consumer. - * - * It reduces encodings to just one and takes into account given RTP capabilities - * to reduce codecs, codecs' RTCP feedback and header extensions, and also enables - * or disabled RTX. - */ -export declare function getConsumerRtpParameters(consumableParams: RtpParameters, caps: RtpCapabilities, pipe: boolean): RtpParameters; -/** - * Generate RTP parameters for a pipe Consumer. - * - * It keeps all original consumable encodings and removes support for BWE. If - * enableRtx is false, it also removes RTX and NACK support. - */ -export declare function getPipeConsumerRtpParameters(consumableParams: RtpParameters, enableRtx?: boolean): RtpParameters; -export {}; -//# sourceMappingURL=ortc.d.ts.map \ No newline at end of file diff --git a/node/lib/ortc.d.ts.map b/node/lib/ortc.d.ts.map deleted file mode 100644 index f941bdb8af..0000000000 --- a/node/lib/ortc.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ortc.d.ts","sourceRoot":"","sources":["../src/ortc.ts"],"names":[],"mappings":"AAKA,OAAO,EACN,eAAe,EAEf,kBAAkB,EAClB,kBAAkB,EAClB,aAAa,EACb,kBAAkB,EAClB,YAAY,EACZ,qBAAqB,EACrB,4BAA4B,EAC5B,cAAc,EACd,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACN,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,oBAAoB,EACpB,MAAM,kBAAkB,CAAC;AAE1B,aAAK,UAAU,GACf;IACC,MAAM,EACN;QACC,WAAW,EAAE,MAAM,CAAC;QACpB,iBAAiB,EAAE,MAAM,CAAC;KAC1B,EAAE,CAAC;IAEJ,SAAS,EACT;QACC,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,UAAU,EAAE,MAAM,CAAC;KACnB,EAAE,CAAC;CACJ,CAAC;AASF;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI,CA0BnE;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI,CA0E1E;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAY3D;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,kBAAkB,GAAG,IAAI,CA4BxE;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CA+CjE;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI,CAyE1E;AAED;;;;GAIG;AACH,wBAAgB,oCAAoC,CACnD,GAAG,EAAE,4BAA4B,GAC/B,IAAI,CAqCN;AAED;;;;GAIG;AACH,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,qBAAqB,GAAG,IAAI,CAgCnF;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI,CAYjE;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAUrE;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,cAAc,GAAG,IAAI,CAYvE;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAoBnE;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,oBAAoB,GAAG,IAAI,CAwC/E;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAC5C,WAAW,GAAE,kBAAkB,EAAO,GACpC,eAAe,CAuGjB;AAED;;;;;GAKG;AACH,wBAAgB,+BAA+B,CAC9C,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,eAAe,GACnB,UAAU,CA+FZ;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACzC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,eAAe,EACrB,UAAU,EAAE,UAAU,GACpB,aAAa,CAyGf;AAED;;GAEG;AACH,wBAAgB,UAAU,CACzB,gBAAgB,EAAE,aAAa,EAC/B,IAAI,EAAE,eAAe,GACnB,OAAO,CAuBT;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACvC,gBAAgB,EAAE,aAAa,EAC/B,IAAI,EAAE,eAAe,EACrB,IAAI,EAAE,OAAO,GACX,aAAa,CA6Kf;AAED;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAC3C,gBAAgB,EAAE,aAAa,EAC/B,SAAS,UAAQ,GACf,aAAa,CAwDf"} \ No newline at end of file diff --git a/node/lib/ortc.js b/node/lib/ortc.js deleted file mode 100644 index 7e7bc1ad2e..0000000000 --- a/node/lib/ortc.js +++ /dev/null @@ -1,869 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.getPipeConsumerRtpParameters = exports.getConsumerRtpParameters = exports.canConsume = exports.getConsumableRtpParameters = exports.getProducerRtpParametersMapping = exports.generateRouterRtpCapabilities = exports.validateSctpStreamParameters = exports.validateSctpParameters = exports.validateNumSctpStreams = exports.validateSctpCapabilities = exports.validateRtcpParameters = exports.validateRtpEncodingParameters = exports.validateRtpHeaderExtensionParameters = exports.validateRtpCodecParameters = exports.validateRtpParameters = exports.validateRtpHeaderExtension = exports.validateRtcpFeedback = exports.validateRtpCodecCapability = exports.validateRtpCapabilities = void 0; -const h264 = require("h264-profile-level-id"); -const utils = require("./utils"); -const errors_1 = require("./errors"); -const supportedRtpCapabilities_1 = require("./supportedRtpCapabilities"); -const scalabilityModes_1 = require("./scalabilityModes"); -const DynamicPayloadTypes = [ - 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 96, 97, 98, 99 -]; -/** - * Validates RtpCapabilities. It may modify given data by adding missing - * fields with default values. - * It throws if invalid. - */ -function validateRtpCapabilities(caps) { - if (typeof caps !== 'object') - throw new TypeError('caps is not an object'); - // codecs is optional. If unset, fill with an empty array. - if (caps.codecs && !Array.isArray(caps.codecs)) - throw new TypeError('caps.codecs is not an array'); - else if (!caps.codecs) - caps.codecs = []; - for (const codec of caps.codecs) { - validateRtpCodecCapability(codec); - } - // headerExtensions is optional. If unset, fill with an empty array. - if (caps.headerExtensions && !Array.isArray(caps.headerExtensions)) - throw new TypeError('caps.headerExtensions is not an array'); - else if (!caps.headerExtensions) - caps.headerExtensions = []; - for (const ext of caps.headerExtensions) { - validateRtpHeaderExtension(ext); - } -} -exports.validateRtpCapabilities = validateRtpCapabilities; -/** - * Validates RtpCodecCapability. It may modify given data by adding missing - * fields with default values. - * It throws if invalid. - */ -function validateRtpCodecCapability(codec) { - const MimeTypeRegex = new RegExp('^(audio|video)/(.+)', 'i'); - if (typeof codec !== 'object') - throw new TypeError('codec is not an object'); - // mimeType is mandatory. - if (!codec.mimeType || typeof codec.mimeType !== 'string') - throw new TypeError('missing codec.mimeType'); - const mimeTypeMatch = MimeTypeRegex.exec(codec.mimeType); - if (!mimeTypeMatch) - throw new TypeError('invalid codec.mimeType'); - // Just override kind with media component of mimeType. - codec.kind = mimeTypeMatch[1].toLowerCase(); - // preferredPayloadType is optional. - if (codec.preferredPayloadType && typeof codec.preferredPayloadType !== 'number') - throw new TypeError('invalid codec.preferredPayloadType'); - // clockRate is mandatory. - if (typeof codec.clockRate !== 'number') - throw new TypeError('missing codec.clockRate'); - // channels is optional. If unset, set it to 1 (just if audio). - if (codec.kind === 'audio') { - if (typeof codec.channels !== 'number') - codec.channels = 1; - } - else { - delete codec.channels; - } - // parameters is optional. If unset, set it to an empty object. - if (!codec.parameters || typeof codec.parameters !== 'object') - codec.parameters = {}; - for (const key of Object.keys(codec.parameters)) { - let value = codec.parameters[key]; - if (value === undefined) { - codec.parameters[key] = ''; - value = ''; - } - if (typeof value !== 'string' && typeof value !== 'number') { - throw new TypeError(`invalid codec parameter [key:${key}s, value:${value}]`); - } - // Specific parameters validation. - if (key === 'apt') { - if (typeof value !== 'number') - throw new TypeError('invalid codec apt parameter'); - } - } - // rtcpFeedback is optional. If unset, set it to an empty array. - if (!codec.rtcpFeedback || !Array.isArray(codec.rtcpFeedback)) - codec.rtcpFeedback = []; - for (const fb of codec.rtcpFeedback) { - validateRtcpFeedback(fb); - } -} -exports.validateRtpCodecCapability = validateRtpCodecCapability; -/** - * Validates RtcpFeedback. It may modify given data by adding missing - * fields with default values. - * It throws if invalid. - */ -function validateRtcpFeedback(fb) { - if (typeof fb !== 'object') - throw new TypeError('fb is not an object'); - // type is mandatory. - if (!fb.type || typeof fb.type !== 'string') - throw new TypeError('missing fb.type'); - // parameter is optional. If unset set it to an empty string. - if (!fb.parameter || typeof fb.parameter !== 'string') - fb.parameter = ''; -} -exports.validateRtcpFeedback = validateRtcpFeedback; -/** - * Validates RtpHeaderExtension. It may modify given data by adding missing - * fields with default values. - * It throws if invalid. - */ -function validateRtpHeaderExtension(ext) { - if (typeof ext !== 'object') - throw new TypeError('ext is not an object'); - if (ext.kind !== 'audio' && ext.kind !== 'video') - throw new TypeError('invalid ext.kind'); - // uri is mandatory. - if (!ext.uri || typeof ext.uri !== 'string') - throw new TypeError('missing ext.uri'); - // preferredId is mandatory. - if (typeof ext.preferredId !== 'number') - throw new TypeError('missing ext.preferredId'); - // preferredEncrypt is optional. If unset set it to false. - if (ext.preferredEncrypt && typeof ext.preferredEncrypt !== 'boolean') - throw new TypeError('invalid ext.preferredEncrypt'); - else if (!ext.preferredEncrypt) - ext.preferredEncrypt = false; - // direction is optional. If unset set it to sendrecv. - if (ext.direction && typeof ext.direction !== 'string') - throw new TypeError('invalid ext.direction'); - else if (!ext.direction) - ext.direction = 'sendrecv'; -} -exports.validateRtpHeaderExtension = validateRtpHeaderExtension; -/** - * Validates RtpParameters. It may modify given data by adding missing - * fields with default values. - * It throws if invalid. - */ -function validateRtpParameters(params) { - if (typeof params !== 'object') - throw new TypeError('params is not an object'); - // mid is optional. - if (params.mid && typeof params.mid !== 'string') - throw new TypeError('params.mid is not a string'); - // codecs is mandatory. - if (!Array.isArray(params.codecs)) - throw new TypeError('missing params.codecs'); - for (const codec of params.codecs) { - validateRtpCodecParameters(codec); - } - // headerExtensions is optional. If unset, fill with an empty array. - if (params.headerExtensions && !Array.isArray(params.headerExtensions)) - throw new TypeError('params.headerExtensions is not an array'); - else if (!params.headerExtensions) - params.headerExtensions = []; - for (const ext of params.headerExtensions) { - validateRtpHeaderExtensionParameters(ext); - } - // encodings is optional. If unset, fill with an empty array. - if (params.encodings && !Array.isArray(params.encodings)) - throw new TypeError('params.encodings is not an array'); - else if (!params.encodings) - params.encodings = []; - for (const encoding of params.encodings) { - validateRtpEncodingParameters(encoding); - } - // rtcp is optional. If unset, fill with an empty object. - if (params.rtcp && typeof params.rtcp !== 'object') - throw new TypeError('params.rtcp is not an object'); - else if (!params.rtcp) - params.rtcp = {}; - validateRtcpParameters(params.rtcp); -} -exports.validateRtpParameters = validateRtpParameters; -/** - * Validates RtpCodecParameters. It may modify given data by adding missing - * fields with default values. - * It throws if invalid. - */ -function validateRtpCodecParameters(codec) { - const MimeTypeRegex = new RegExp('^(audio|video)/(.+)', 'i'); - if (typeof codec !== 'object') - throw new TypeError('codec is not an object'); - // mimeType is mandatory. - if (!codec.mimeType || typeof codec.mimeType !== 'string') - throw new TypeError('missing codec.mimeType'); - const mimeTypeMatch = MimeTypeRegex.exec(codec.mimeType); - if (!mimeTypeMatch) - throw new TypeError('invalid codec.mimeType'); - // payloadType is mandatory. - if (typeof codec.payloadType !== 'number') - throw new TypeError('missing codec.payloadType'); - // clockRate is mandatory. - if (typeof codec.clockRate !== 'number') - throw new TypeError('missing codec.clockRate'); - const kind = mimeTypeMatch[1].toLowerCase(); - // channels is optional. If unset, set it to 1 (just if audio). - if (kind === 'audio') { - if (typeof codec.channels !== 'number') - codec.channels = 1; - } - else { - delete codec.channels; - } - // parameters is optional. If unset, set it to an empty object. - if (!codec.parameters || typeof codec.parameters !== 'object') - codec.parameters = {}; - for (const key of Object.keys(codec.parameters)) { - let value = codec.parameters[key]; - if (value === undefined) { - codec.parameters[key] = ''; - value = ''; - } - if (typeof value !== 'string' && typeof value !== 'number') { - throw new TypeError(`invalid codec parameter [key:${key}s, value:${value}]`); - } - // Specific parameters validation. - if (key === 'apt') { - if (typeof value !== 'number') - throw new TypeError('invalid codec apt parameter'); - } - } - // rtcpFeedback is optional. If unset, set it to an empty array. - if (!codec.rtcpFeedback || !Array.isArray(codec.rtcpFeedback)) - codec.rtcpFeedback = []; - for (const fb of codec.rtcpFeedback) { - validateRtcpFeedback(fb); - } -} -exports.validateRtpCodecParameters = validateRtpCodecParameters; -/** - * Validates RtpHeaderExtensionParameteters. It may modify given data by adding missing - * fields with default values. - * It throws if invalid. - */ -function validateRtpHeaderExtensionParameters(ext) { - if (typeof ext !== 'object') - throw new TypeError('ext is not an object'); - // uri is mandatory. - if (!ext.uri || typeof ext.uri !== 'string') - throw new TypeError('missing ext.uri'); - // id is mandatory. - if (typeof ext.id !== 'number') - throw new TypeError('missing ext.id'); - // encrypt is optional. If unset set it to false. - if (ext.encrypt && typeof ext.encrypt !== 'boolean') - throw new TypeError('invalid ext.encrypt'); - else if (!ext.encrypt) - ext.encrypt = false; - // parameters is optional. If unset, set it to an empty object. - if (!ext.parameters || typeof ext.parameters !== 'object') - ext.parameters = {}; - for (const key of Object.keys(ext.parameters)) { - let value = ext.parameters[key]; - if (value === undefined) { - ext.parameters[key] = ''; - value = ''; - } - if (typeof value !== 'string' && typeof value !== 'number') - throw new TypeError('invalid header extension parameter'); - } -} -exports.validateRtpHeaderExtensionParameters = validateRtpHeaderExtensionParameters; -/** - * Validates RtpEncodingParameters. It may modify given data by adding missing - * fields with default values. - * It throws if invalid. - */ -function validateRtpEncodingParameters(encoding) { - if (typeof encoding !== 'object') - throw new TypeError('encoding is not an object'); - // ssrc is optional. - if (encoding.ssrc && typeof encoding.ssrc !== 'number') - throw new TypeError('invalid encoding.ssrc'); - // rid is optional. - if (encoding.rid && typeof encoding.rid !== 'string') - throw new TypeError('invalid encoding.rid'); - // rtx is optional. - if (encoding.rtx && typeof encoding.rtx !== 'object') { - throw new TypeError('invalid encoding.rtx'); - } - else if (encoding.rtx) { - // RTX ssrc is mandatory if rtx is present. - if (typeof encoding.rtx.ssrc !== 'number') - throw new TypeError('missing encoding.rtx.ssrc'); - } - // dtx is optional. If unset set it to false. - if (!encoding.dtx || typeof encoding.dtx !== 'boolean') - encoding.dtx = false; - // scalabilityMode is optional. - if (encoding.scalabilityMode && typeof encoding.scalabilityMode !== 'string') - throw new TypeError('invalid encoding.scalabilityMode'); -} -exports.validateRtpEncodingParameters = validateRtpEncodingParameters; -/** - * Validates RtcpParameters. It may modify given data by adding missing - * fields with default values. - * It throws if invalid. - */ -function validateRtcpParameters(rtcp) { - if (typeof rtcp !== 'object') - throw new TypeError('rtcp is not an object'); - // cname is optional. - if (rtcp.cname && typeof rtcp.cname !== 'string') - throw new TypeError('invalid rtcp.cname'); - // reducedSize is optional. If unset set it to true. - if (!rtcp.reducedSize || typeof rtcp.reducedSize !== 'boolean') - rtcp.reducedSize = true; -} -exports.validateRtcpParameters = validateRtcpParameters; -/** - * Validates SctpCapabilities. It may modify given data by adding missing - * fields with default values. - * It throws if invalid. - */ -function validateSctpCapabilities(caps) { - if (typeof caps !== 'object') - throw new TypeError('caps is not an object'); - // numStreams is mandatory. - if (!caps.numStreams || typeof caps.numStreams !== 'object') - throw new TypeError('missing caps.numStreams'); - validateNumSctpStreams(caps.numStreams); -} -exports.validateSctpCapabilities = validateSctpCapabilities; -/** - * Validates NumSctpStreams. It may modify given data by adding missing - * fields with default values. - * It throws if invalid. - */ -function validateNumSctpStreams(numStreams) { - if (typeof numStreams !== 'object') - throw new TypeError('numStreams is not an object'); - // OS is mandatory. - if (typeof numStreams.OS !== 'number') - throw new TypeError('missing numStreams.OS'); - // MIS is mandatory. - if (typeof numStreams.MIS !== 'number') - throw new TypeError('missing numStreams.MIS'); -} -exports.validateNumSctpStreams = validateNumSctpStreams; -/** - * Validates SctpParameters. It may modify given data by adding missing - * fields with default values. - * It throws if invalid. - */ -function validateSctpParameters(params) { - if (typeof params !== 'object') - throw new TypeError('params is not an object'); - // port is mandatory. - if (typeof params.port !== 'number') - throw new TypeError('missing params.port'); - // OS is mandatory. - if (typeof params.OS !== 'number') - throw new TypeError('missing params.OS'); - // MIS is mandatory. - if (typeof params.MIS !== 'number') - throw new TypeError('missing params.MIS'); - // maxMessageSize is mandatory. - if (typeof params.maxMessageSize !== 'number') - throw new TypeError('missing params.maxMessageSize'); -} -exports.validateSctpParameters = validateSctpParameters; -/** - * Validates SctpStreamParameters. It may modify given data by adding missing - * fields with default values. - * It throws if invalid. - */ -function validateSctpStreamParameters(params) { - if (typeof params !== 'object') - throw new TypeError('params is not an object'); - // streamId is mandatory. - if (typeof params.streamId !== 'number') - throw new TypeError('missing params.streamId'); - // ordered is optional. - let orderedGiven = false; - if (typeof params.ordered === 'boolean') - orderedGiven = true; - else - params.ordered = true; - // maxPacketLifeTime is optional. - if (params.maxPacketLifeTime && typeof params.maxPacketLifeTime !== 'number') - throw new TypeError('invalid params.maxPacketLifeTime'); - // maxRetransmits is optional. - if (params.maxRetransmits && typeof params.maxRetransmits !== 'number') - throw new TypeError('invalid params.maxRetransmits'); - if (params.maxPacketLifeTime && params.maxRetransmits) - throw new TypeError('cannot provide both maxPacketLifeTime and maxRetransmits'); - if (orderedGiven && - params.ordered && - (params.maxPacketLifeTime || params.maxRetransmits)) { - throw new TypeError('cannot be ordered with maxPacketLifeTime or maxRetransmits'); - } - else if (!orderedGiven && (params.maxPacketLifeTime || params.maxRetransmits)) { - params.ordered = false; - } -} -exports.validateSctpStreamParameters = validateSctpStreamParameters; -/** - * Generate RTP capabilities for the Router based on the given media codecs and - * mediasoup supported RTP capabilities. - */ -function generateRouterRtpCapabilities(mediaCodecs = []) { - // Normalize supported RTP capabilities. - validateRtpCapabilities(supportedRtpCapabilities_1.supportedRtpCapabilities); - if (!Array.isArray(mediaCodecs)) - throw new TypeError('mediaCodecs must be an Array'); - const clonedSupportedRtpCapabilities = utils.clone(supportedRtpCapabilities_1.supportedRtpCapabilities); - const dynamicPayloadTypes = utils.clone(DynamicPayloadTypes); - const caps = { - codecs: [], - headerExtensions: clonedSupportedRtpCapabilities.headerExtensions - }; - for (const mediaCodec of mediaCodecs) { - // This may throw. - validateRtpCodecCapability(mediaCodec); - const matchedSupportedCodec = clonedSupportedRtpCapabilities - .codecs - .find((supportedCodec) => (matchCodecs(mediaCodec, supportedCodec, { strict: false }))); - if (!matchedSupportedCodec) { - throw new errors_1.UnsupportedError(`media codec not supported [mimeType:${mediaCodec.mimeType}]`); - } - // Clone the supported codec. - const codec = utils.clone(matchedSupportedCodec); - // If the given media codec has preferredPayloadType, keep it. - if (typeof mediaCodec.preferredPayloadType === 'number') { - codec.preferredPayloadType = mediaCodec.preferredPayloadType; - // Also remove the pt from the list of available dynamic values. - const idx = dynamicPayloadTypes.indexOf(codec.preferredPayloadType); - if (idx > -1) - dynamicPayloadTypes.splice(idx, 1); - } - // Otherwise if the supported codec has preferredPayloadType, use it. - else if (typeof codec.preferredPayloadType === 'number') { - // No need to remove it from the list since it's not a dynamic value. - } - // Otherwise choose a dynamic one. - else { - // Take the first available pt and remove it from the list. - const pt = dynamicPayloadTypes.shift(); - if (!pt) - throw new Error('cannot allocate more dynamic codec payload types'); - codec.preferredPayloadType = pt; - } - // Ensure there is not duplicated preferredPayloadType values. - if (caps.codecs.some((c) => c.preferredPayloadType === codec.preferredPayloadType)) - throw new TypeError('duplicated codec.preferredPayloadType'); - // Merge the media codec parameters. - codec.parameters = { ...codec.parameters, ...mediaCodec.parameters }; - // Append to the codec list. - caps.codecs.push(codec); - // Add a RTX video codec if video. - if (codec.kind === 'video') { - // Take the first available pt and remove it from the list. - const pt = dynamicPayloadTypes.shift(); - if (!pt) - throw new Error('cannot allocate more dynamic codec payload types'); - const rtxCodec = { - kind: codec.kind, - mimeType: `${codec.kind}/rtx`, - preferredPayloadType: pt, - clockRate: codec.clockRate, - parameters: { - apt: codec.preferredPayloadType - }, - rtcpFeedback: [] - }; - // Append to the codec list. - caps.codecs.push(rtxCodec); - } - } - return caps; -} -exports.generateRouterRtpCapabilities = generateRouterRtpCapabilities; -/** - * Get a mapping of codec payloads and encodings of the given Producer RTP - * parameters as values expected by the Router. - * - * It may throw if invalid or non supported RTP parameters are given. - */ -function getProducerRtpParametersMapping(params, caps) { - const rtpMapping = { - codecs: [], - encodings: [] - }; - // Match parameters media codecs to capabilities media codecs. - const codecToCapCodec = new Map(); - for (const codec of params.codecs) { - if (isRtxCodec(codec)) - continue; - // Search for the same media codec in capabilities. - const matchedCapCodec = caps.codecs - .find((capCodec) => (matchCodecs(codec, capCodec, { strict: true, modify: true }))); - if (!matchedCapCodec) { - throw new errors_1.UnsupportedError(`unsupported codec [mimeType:${codec.mimeType}, payloadType:${codec.payloadType}]`); - } - codecToCapCodec.set(codec, matchedCapCodec); - } - // Match parameters RTX codecs to capabilities RTX codecs. - for (const codec of params.codecs) { - if (!isRtxCodec(codec)) - continue; - // Search for the associated media codec. - const associatedMediaCodec = params.codecs - .find((mediaCodec) => mediaCodec.payloadType === codec.parameters.apt); - if (!associatedMediaCodec) { - throw new TypeError(`missing media codec found for RTX PT ${codec.payloadType}`); - } - const capMediaCodec = codecToCapCodec.get(associatedMediaCodec); - // Ensure that the capabilities media codec has a RTX codec. - const associatedCapRtxCodec = caps.codecs - .find((capCodec) => (isRtxCodec(capCodec) && - capCodec.parameters.apt === capMediaCodec.preferredPayloadType)); - if (!associatedCapRtxCodec) { - throw new errors_1.UnsupportedError(`no RTX codec for capability codec PT ${capMediaCodec.preferredPayloadType}`); - } - codecToCapCodec.set(codec, associatedCapRtxCodec); - } - // Generate codecs mapping. - for (const [codec, capCodec] of codecToCapCodec) { - rtpMapping.codecs.push({ - payloadType: codec.payloadType, - mappedPayloadType: capCodec.preferredPayloadType - }); - } - // Generate encodings mapping. - let mappedSsrc = utils.generateRandomNumber(); - for (const encoding of params.encodings) { - const mappedEncoding = {}; - mappedEncoding.mappedSsrc = mappedSsrc++; - if (encoding.rid) - mappedEncoding.rid = encoding.rid; - if (encoding.ssrc) - mappedEncoding.ssrc = encoding.ssrc; - if (encoding.scalabilityMode) - mappedEncoding.scalabilityMode = encoding.scalabilityMode; - rtpMapping.encodings.push(mappedEncoding); - } - return rtpMapping; -} -exports.getProducerRtpParametersMapping = getProducerRtpParametersMapping; -/** - * Generate RTP parameters to be internally used by Consumers given the RTP - * parameters of a Producer and the RTP capabilities of the Router. - */ -function getConsumableRtpParameters(kind, params, caps, rtpMapping) { - const consumableParams = { - codecs: [], - headerExtensions: [], - encodings: [], - rtcp: {} - }; - for (const codec of params.codecs) { - if (isRtxCodec(codec)) - continue; - const consumableCodecPt = rtpMapping.codecs - .find((entry) => entry.payloadType === codec.payloadType) - .mappedPayloadType; - const matchedCapCodec = caps.codecs - .find((capCodec) => capCodec.preferredPayloadType === consumableCodecPt); - const consumableCodec = { - mimeType: matchedCapCodec.mimeType, - payloadType: matchedCapCodec.preferredPayloadType, - clockRate: matchedCapCodec.clockRate, - channels: matchedCapCodec.channels, - parameters: codec.parameters, - rtcpFeedback: matchedCapCodec.rtcpFeedback - }; - consumableParams.codecs.push(consumableCodec); - const consumableCapRtxCodec = caps.codecs - .find((capRtxCodec) => (isRtxCodec(capRtxCodec) && - capRtxCodec.parameters.apt === consumableCodec.payloadType)); - if (consumableCapRtxCodec) { - const consumableRtxCodec = { - mimeType: consumableCapRtxCodec.mimeType, - payloadType: consumableCapRtxCodec.preferredPayloadType, - clockRate: consumableCapRtxCodec.clockRate, - parameters: consumableCapRtxCodec.parameters, - rtcpFeedback: consumableCapRtxCodec.rtcpFeedback - }; - consumableParams.codecs.push(consumableRtxCodec); - } - } - for (const capExt of caps.headerExtensions) { - // Just take RTP header extension that can be used in Consumers. - if (capExt.kind !== kind || - (capExt.direction !== 'sendrecv' && capExt.direction !== 'sendonly')) { - continue; - } - const consumableExt = { - uri: capExt.uri, - id: capExt.preferredId, - encrypt: capExt.preferredEncrypt, - parameters: {} - }; - consumableParams.headerExtensions.push(consumableExt); - } - // Clone Producer encodings since we'll mangle them. - const consumableEncodings = utils.clone(params.encodings); - for (let i = 0; i < consumableEncodings.length; ++i) { - const consumableEncoding = consumableEncodings[i]; - const { mappedSsrc } = rtpMapping.encodings[i]; - // Remove useless fields. - delete consumableEncoding.rid; - delete consumableEncoding.rtx; - delete consumableEncoding.codecPayloadType; - // Set the mapped ssrc. - consumableEncoding.ssrc = mappedSsrc; - consumableParams.encodings.push(consumableEncoding); - } - consumableParams.rtcp = - { - cname: params.rtcp.cname, - reducedSize: true, - mux: true - }; - return consumableParams; -} -exports.getConsumableRtpParameters = getConsumableRtpParameters; -/** - * Check whether the given RTP capabilities can consume the given Producer. - */ -function canConsume(consumableParams, caps) { - // This may throw. - validateRtpCapabilities(caps); - const matchingCodecs = []; - for (const codec of consumableParams.codecs) { - const matchedCapCodec = caps.codecs - .find((capCodec) => matchCodecs(capCodec, codec, { strict: true })); - if (!matchedCapCodec) - continue; - matchingCodecs.push(codec); - } - // Ensure there is at least one media codec. - if (matchingCodecs.length === 0 || isRtxCodec(matchingCodecs[0])) - return false; - return true; -} -exports.canConsume = canConsume; -/** - * Generate RTP parameters for a specific Consumer. - * - * It reduces encodings to just one and takes into account given RTP capabilities - * to reduce codecs, codecs' RTCP feedback and header extensions, and also enables - * or disabled RTX. - */ -function getConsumerRtpParameters(consumableParams, caps, pipe) { - const consumerParams = { - codecs: [], - headerExtensions: [], - encodings: [], - rtcp: consumableParams.rtcp - }; - for (const capCodec of caps.codecs) { - validateRtpCodecCapability(capCodec); - } - const consumableCodecs = utils.clone(consumableParams.codecs); - let rtxSupported = false; - for (const codec of consumableCodecs) { - const matchedCapCodec = caps.codecs - .find((capCodec) => matchCodecs(capCodec, codec, { strict: true })); - if (!matchedCapCodec) - continue; - codec.rtcpFeedback = matchedCapCodec.rtcpFeedback; - consumerParams.codecs.push(codec); - } - // Must sanitize the list of matched codecs by removing useless RTX codecs. - for (let idx = consumerParams.codecs.length - 1; idx >= 0; --idx) { - const codec = consumerParams.codecs[idx]; - if (isRtxCodec(codec)) { - // Search for the associated media codec. - const associatedMediaCodec = consumerParams.codecs - .find((mediaCodec) => mediaCodec.payloadType === codec.parameters.apt); - if (associatedMediaCodec) - rtxSupported = true; - else - consumerParams.codecs.splice(idx, 1); - } - } - // Ensure there is at least one media codec. - if (consumerParams.codecs.length === 0 || isRtxCodec(consumerParams.codecs[0])) { - throw new errors_1.UnsupportedError('no compatible media codecs'); - } - consumerParams.headerExtensions = consumableParams.headerExtensions - .filter((ext) => (caps.headerExtensions - .some((capExt) => (capExt.preferredId === ext.id && - capExt.uri === ext.uri)))); - // Reduce codecs' RTCP feedback. Use Transport-CC if available, REMB otherwise. - if (consumerParams.headerExtensions.some((ext) => (ext.uri === 'http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01'))) { - for (const codec of consumerParams.codecs) { - codec.rtcpFeedback = codec.rtcpFeedback - .filter((fb) => fb.type !== 'goog-remb'); - } - } - else if (consumerParams.headerExtensions.some((ext) => (ext.uri === 'http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time'))) { - for (const codec of consumerParams.codecs) { - codec.rtcpFeedback = codec.rtcpFeedback - .filter((fb) => fb.type !== 'transport-cc'); - } - } - else { - for (const codec of consumerParams.codecs) { - codec.rtcpFeedback = codec.rtcpFeedback - .filter((fb) => (fb.type !== 'transport-cc' && - fb.type !== 'goog-remb')); - } - } - if (!pipe) { - const consumerEncoding = { - ssrc: utils.generateRandomNumber() - }; - if (rtxSupported) - consumerEncoding.rtx = { ssrc: consumerEncoding.ssrc + 1 }; - // If any of the consumableParams.encodings has scalabilityMode, process it - // (assume all encodings have the same value). - const encodingWithScalabilityMode = consumableParams.encodings.find((encoding) => encoding.scalabilityMode); - let scalabilityMode = encodingWithScalabilityMode - ? encodingWithScalabilityMode.scalabilityMode - : undefined; - // If there is simulast, mangle spatial layers in scalabilityMode. - if (consumableParams.encodings.length > 1) { - const { temporalLayers } = (0, scalabilityModes_1.parse)(scalabilityMode); - scalabilityMode = `S${consumableParams.encodings.length}T${temporalLayers}`; - } - if (scalabilityMode) - consumerEncoding.scalabilityMode = scalabilityMode; - // Use the maximum maxBitrate in any encoding and honor it in the Consumer's - // encoding. - const maxEncodingMaxBitrate = consumableParams.encodings.reduce((maxBitrate, encoding) => (encoding.maxBitrate && encoding.maxBitrate > maxBitrate - ? encoding.maxBitrate - : maxBitrate), 0); - if (maxEncodingMaxBitrate) { - consumerEncoding.maxBitrate = maxEncodingMaxBitrate; - } - // Set a single encoding for the Consumer. - consumerParams.encodings.push(consumerEncoding); - } - else { - const consumableEncodings = utils.clone(consumableParams.encodings); - const baseSsrc = utils.generateRandomNumber(); - const baseRtxSsrc = utils.generateRandomNumber(); - for (let i = 0; i < consumableEncodings.length; ++i) { - const encoding = consumableEncodings[i]; - encoding.ssrc = baseSsrc + i; - if (rtxSupported) - encoding.rtx = { ssrc: baseRtxSsrc + i }; - else - delete encoding.rtx; - consumerParams.encodings.push(encoding); - } - } - return consumerParams; -} -exports.getConsumerRtpParameters = getConsumerRtpParameters; -/** - * Generate RTP parameters for a pipe Consumer. - * - * It keeps all original consumable encodings and removes support for BWE. If - * enableRtx is false, it also removes RTX and NACK support. - */ -function getPipeConsumerRtpParameters(consumableParams, enableRtx = false) { - const consumerParams = { - codecs: [], - headerExtensions: [], - encodings: [], - rtcp: consumableParams.rtcp - }; - const consumableCodecs = utils.clone(consumableParams.codecs); - for (const codec of consumableCodecs) { - if (!enableRtx && isRtxCodec(codec)) - continue; - codec.rtcpFeedback = codec.rtcpFeedback - .filter((fb) => ((fb.type === 'nack' && fb.parameter === 'pli') || - (fb.type === 'ccm' && fb.parameter === 'fir') || - (enableRtx && fb.type === 'nack' && !fb.parameter))); - consumerParams.codecs.push(codec); - } - // Reduce RTP extensions by disabling transport MID and BWE related ones. - consumerParams.headerExtensions = consumableParams.headerExtensions - .filter((ext) => (ext.uri !== 'urn:ietf:params:rtp-hdrext:sdes:mid' && - ext.uri !== 'http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time' && - ext.uri !== 'http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01')); - const consumableEncodings = utils.clone(consumableParams.encodings); - const baseSsrc = utils.generateRandomNumber(); - const baseRtxSsrc = utils.generateRandomNumber(); - for (let i = 0; i < consumableEncodings.length; ++i) { - const encoding = consumableEncodings[i]; - encoding.ssrc = baseSsrc + i; - if (enableRtx) - encoding.rtx = { ssrc: baseRtxSsrc + i }; - else - delete encoding.rtx; - consumerParams.encodings.push(encoding); - } - return consumerParams; -} -exports.getPipeConsumerRtpParameters = getPipeConsumerRtpParameters; -function isRtxCodec(codec) { - return /.+\/rtx$/i.test(codec.mimeType); -} -function matchCodecs(aCodec, bCodec, { strict = false, modify = false } = {}) { - const aMimeType = aCodec.mimeType.toLowerCase(); - const bMimeType = bCodec.mimeType.toLowerCase(); - if (aMimeType !== bMimeType) - return false; - if (aCodec.clockRate !== bCodec.clockRate) - return false; - if (aCodec.channels !== bCodec.channels) - return false; - // Per codec special checks. - switch (aMimeType) { - case 'audio/multiopus': - { - const aNumStreams = aCodec.parameters['num_streams']; - const bNumStreams = bCodec.parameters['num_streams']; - if (aNumStreams !== bNumStreams) - return false; - const aCoupledStreams = aCodec.parameters['coupled_streams']; - const bCoupledStreams = bCodec.parameters['coupled_streams']; - if (aCoupledStreams !== bCoupledStreams) - return false; - break; - } - case 'video/h264': - case 'video/h264-svc': - { - if (strict) { - const aPacketizationMode = aCodec.parameters['packetization-mode'] || 0; - const bPacketizationMode = bCodec.parameters['packetization-mode'] || 0; - if (aPacketizationMode !== bPacketizationMode) - return false; - if (!h264.isSameProfile(aCodec.parameters, bCodec.parameters)) - return false; - let selectedProfileLevelId; - try { - selectedProfileLevelId = - h264.generateProfileLevelIdForAnswer(aCodec.parameters, bCodec.parameters); - } - catch (error) { - return false; - } - if (modify) { - if (selectedProfileLevelId) - aCodec.parameters['profile-level-id'] = selectedProfileLevelId; - else - delete aCodec.parameters['profile-level-id']; - } - } - break; - } - case 'video/vp9': - { - if (strict) { - const aProfileId = aCodec.parameters['profile-id'] || 0; - const bProfileId = bCodec.parameters['profile-id'] || 0; - if (aProfileId !== bProfileId) - return false; - } - break; - } - } - return true; -} diff --git a/node/lib/scalabilityModes.d.ts b/node/lib/scalabilityModes.d.ts deleted file mode 100644 index f61e08588a..0000000000 --- a/node/lib/scalabilityModes.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -export declare type ScalabilityMode = { - spatialLayers: number; - temporalLayers: number; - ksvc: boolean; -}; -export declare function parse(scalabilityMode?: string): ScalabilityMode; -//# sourceMappingURL=scalabilityModes.d.ts.map \ No newline at end of file diff --git a/node/lib/scalabilityModes.d.ts.map b/node/lib/scalabilityModes.d.ts.map deleted file mode 100644 index 7d8ff95e54..0000000000 --- a/node/lib/scalabilityModes.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"scalabilityModes.d.ts","sourceRoot":"","sources":["../src/scalabilityModes.ts"],"names":[],"mappings":"AAGA,oBAAY,eAAe,GAC3B;IACC,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,OAAO,CAAC;CACd,CAAC;AAEF,wBAAgB,KAAK,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,eAAe,CAoB/D"} \ No newline at end of file diff --git a/node/lib/scalabilityModes.js b/node/lib/scalabilityModes.js deleted file mode 100644 index 569acccdae..0000000000 --- a/node/lib/scalabilityModes.js +++ /dev/null @@ -1,22 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.parse = void 0; -const ScalabilityModeRegex = new RegExp('^[LS]([1-9]\\d{0,1})T([1-9]\\d{0,1})(_KEY)?'); -function parse(scalabilityMode) { - const match = ScalabilityModeRegex.exec(scalabilityMode || ''); - if (match) { - return { - spatialLayers: Number(match[1]), - temporalLayers: Number(match[2]), - ksvc: Boolean(match[3]) - }; - } - else { - return { - spatialLayers: 1, - temporalLayers: 1, - ksvc: false - }; - } -} -exports.parse = parse; diff --git a/node/lib/supportedRtpCapabilities.d.ts b/node/lib/supportedRtpCapabilities.d.ts deleted file mode 100644 index 429015835b..0000000000 --- a/node/lib/supportedRtpCapabilities.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { RtpCapabilities } from './RtpParameters'; -declare const supportedRtpCapabilities: RtpCapabilities; -export { supportedRtpCapabilities }; -//# sourceMappingURL=supportedRtpCapabilities.d.ts.map \ No newline at end of file diff --git a/node/lib/supportedRtpCapabilities.d.ts.map b/node/lib/supportedRtpCapabilities.d.ts.map deleted file mode 100644 index d87ef35129..0000000000 --- a/node/lib/supportedRtpCapabilities.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"supportedRtpCapabilities.d.ts","sourceRoot":"","sources":["../src/supportedRtpCapabilities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,QAAA,MAAM,wBAAwB,EAAE,eA+X/B,CAAC;AAEF,OAAO,EAAE,wBAAwB,EAAE,CAAC"} \ No newline at end of file diff --git a/node/lib/supportedRtpCapabilities.js b/node/lib/supportedRtpCapabilities.js deleted file mode 100644 index cae3e931d4..0000000000 --- a/node/lib/supportedRtpCapabilities.js +++ /dev/null @@ -1,361 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.supportedRtpCapabilities = void 0; -const supportedRtpCapabilities = { - codecs: [ - { - kind: 'audio', - mimeType: 'audio/opus', - clockRate: 48000, - channels: 2, - rtcpFeedback: [ - { type: 'transport-cc' } - ] - }, - { - kind: 'audio', - mimeType: 'audio/multiopus', - clockRate: 48000, - channels: 4, - // Quad channel. - parameters: { - 'channel_mapping': '0,1,2,3', - 'num_streams': 2, - 'coupled_streams': 2 - }, - rtcpFeedback: [ - { type: 'transport-cc' } - ] - }, - { - kind: 'audio', - mimeType: 'audio/multiopus', - clockRate: 48000, - channels: 6, - // 5.1. - parameters: { - 'channel_mapping': '0,4,1,2,3,5', - 'num_streams': 4, - 'coupled_streams': 2 - }, - rtcpFeedback: [ - { type: 'transport-cc' } - ] - }, - { - kind: 'audio', - mimeType: 'audio/multiopus', - clockRate: 48000, - channels: 8, - // 7.1. - parameters: { - 'channel_mapping': '0,6,1,2,3,4,5,7', - 'num_streams': 5, - 'coupled_streams': 3 - }, - rtcpFeedback: [ - { type: 'transport-cc' } - ] - }, - { - kind: 'audio', - mimeType: 'audio/PCMU', - preferredPayloadType: 0, - clockRate: 8000, - rtcpFeedback: [ - { type: 'transport-cc' } - ] - }, - { - kind: 'audio', - mimeType: 'audio/PCMA', - preferredPayloadType: 8, - clockRate: 8000, - rtcpFeedback: [ - { type: 'transport-cc' } - ] - }, - { - kind: 'audio', - mimeType: 'audio/ISAC', - clockRate: 32000, - rtcpFeedback: [ - { type: 'transport-cc' } - ] - }, - { - kind: 'audio', - mimeType: 'audio/ISAC', - clockRate: 16000, - rtcpFeedback: [ - { type: 'transport-cc' } - ] - }, - { - kind: 'audio', - mimeType: 'audio/G722', - preferredPayloadType: 9, - clockRate: 8000, - rtcpFeedback: [ - { type: 'transport-cc' } - ] - }, - { - kind: 'audio', - mimeType: 'audio/iLBC', - clockRate: 8000, - rtcpFeedback: [ - { type: 'transport-cc' } - ] - }, - { - kind: 'audio', - mimeType: 'audio/SILK', - clockRate: 24000, - rtcpFeedback: [ - { type: 'transport-cc' } - ] - }, - { - kind: 'audio', - mimeType: 'audio/SILK', - clockRate: 16000, - rtcpFeedback: [ - { type: 'transport-cc' } - ] - }, - { - kind: 'audio', - mimeType: 'audio/SILK', - clockRate: 12000, - rtcpFeedback: [ - { type: 'transport-cc' } - ] - }, - { - kind: 'audio', - mimeType: 'audio/SILK', - clockRate: 8000, - rtcpFeedback: [ - { type: 'transport-cc' } - ] - }, - { - kind: 'audio', - mimeType: 'audio/CN', - preferredPayloadType: 13, - clockRate: 32000 - }, - { - kind: 'audio', - mimeType: 'audio/CN', - preferredPayloadType: 13, - clockRate: 16000 - }, - { - kind: 'audio', - mimeType: 'audio/CN', - preferredPayloadType: 13, - clockRate: 8000 - }, - { - kind: 'audio', - mimeType: 'audio/telephone-event', - clockRate: 48000 - }, - { - kind: 'audio', - mimeType: 'audio/telephone-event', - clockRate: 32000 - }, - { - kind: 'audio', - mimeType: 'audio/telephone-event', - clockRate: 16000 - }, - { - kind: 'audio', - mimeType: 'audio/telephone-event', - clockRate: 8000 - }, - { - kind: 'video', - mimeType: 'video/VP8', - clockRate: 90000, - rtcpFeedback: [ - { type: 'nack' }, - { type: 'nack', parameter: 'pli' }, - { type: 'ccm', parameter: 'fir' }, - { type: 'goog-remb' }, - { type: 'transport-cc' } - ] - }, - { - kind: 'video', - mimeType: 'video/VP9', - clockRate: 90000, - rtcpFeedback: [ - { type: 'nack' }, - { type: 'nack', parameter: 'pli' }, - { type: 'ccm', parameter: 'fir' }, - { type: 'goog-remb' }, - { type: 'transport-cc' } - ] - }, - { - kind: 'video', - mimeType: 'video/H264', - clockRate: 90000, - parameters: { - 'level-asymmetry-allowed': 1 - }, - rtcpFeedback: [ - { type: 'nack' }, - { type: 'nack', parameter: 'pli' }, - { type: 'ccm', parameter: 'fir' }, - { type: 'goog-remb' }, - { type: 'transport-cc' } - ] - }, - { - kind: 'video', - mimeType: 'video/H264-SVC', - clockRate: 90000, - parameters: { - 'level-asymmetry-allowed': 1 - }, - rtcpFeedback: [ - { type: 'nack' }, - { type: 'nack', parameter: 'pli' }, - { type: 'ccm', parameter: 'fir' }, - { type: 'goog-remb' }, - { type: 'transport-cc' } - ] - }, - { - kind: 'video', - mimeType: 'video/H265', - clockRate: 90000, - parameters: { - 'level-asymmetry-allowed': 1 - }, - rtcpFeedback: [ - { type: 'nack' }, - { type: 'nack', parameter: 'pli' }, - { type: 'ccm', parameter: 'fir' }, - { type: 'goog-remb' }, - { type: 'transport-cc' } - ] - } - ], - headerExtensions: [ - { - kind: 'audio', - uri: 'urn:ietf:params:rtp-hdrext:sdes:mid', - preferredId: 1, - preferredEncrypt: false, - direction: 'sendrecv' - }, - { - kind: 'video', - uri: 'urn:ietf:params:rtp-hdrext:sdes:mid', - preferredId: 1, - preferredEncrypt: false, - direction: 'sendrecv' - }, - { - kind: 'video', - uri: 'urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id', - preferredId: 2, - preferredEncrypt: false, - direction: 'recvonly' - }, - { - kind: 'video', - uri: 'urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id', - preferredId: 3, - preferredEncrypt: false, - direction: 'recvonly' - }, - { - kind: 'audio', - uri: 'http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time', - preferredId: 4, - preferredEncrypt: false, - direction: 'sendrecv' - }, - { - kind: 'video', - uri: 'http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time', - preferredId: 4, - preferredEncrypt: false, - direction: 'sendrecv' - }, - // NOTE: For audio we just enable transport-wide-cc-01 when receiving media. - { - kind: 'audio', - uri: 'http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01', - preferredId: 5, - preferredEncrypt: false, - direction: 'recvonly' - }, - { - kind: 'video', - uri: 'http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01', - preferredId: 5, - preferredEncrypt: false, - direction: 'sendrecv' - }, - // NOTE: Remove this once framemarking draft becomes RFC. - { - kind: 'video', - uri: 'http://tools.ietf.org/html/draft-ietf-avtext-framemarking-07', - preferredId: 6, - preferredEncrypt: false, - direction: 'sendrecv' - }, - { - kind: 'video', - uri: 'urn:ietf:params:rtp-hdrext:framemarking', - preferredId: 7, - preferredEncrypt: false, - direction: 'sendrecv' - }, - { - kind: 'audio', - uri: 'urn:ietf:params:rtp-hdrext:ssrc-audio-level', - preferredId: 10, - preferredEncrypt: false, - direction: 'sendrecv' - }, - { - kind: 'video', - uri: 'urn:3gpp:video-orientation', - preferredId: 11, - preferredEncrypt: false, - direction: 'sendrecv' - }, - { - kind: 'video', - uri: 'urn:ietf:params:rtp-hdrext:toffset', - preferredId: 12, - preferredEncrypt: false, - direction: 'sendrecv' - }, - { - kind: 'audio', - uri: 'http://www.webrtc.org/experiments/rtp-hdrext/abs-capture-time', - preferredId: 13, - preferredEncrypt: false, - direction: 'sendrecv' - }, - { - kind: 'video', - uri: 'http://www.webrtc.org/experiments/rtp-hdrext/abs-capture-time', - preferredId: 13, - preferredEncrypt: false, - direction: 'sendrecv' - } - ] -}; -exports.supportedRtpCapabilities = supportedRtpCapabilities; diff --git a/node/lib/types.d.ts b/node/lib/types.d.ts deleted file mode 100644 index 01ad1c323e..0000000000 --- a/node/lib/types.d.ts +++ /dev/null @@ -1,21 +0,0 @@ -export * from './Worker'; -export * from './WebRtcServer'; -export * from './Router'; -export * from './Transport'; -export * from './WebRtcTransport'; -export * from './PlainTransport'; -export * from './PipeTransport'; -export * from './DirectTransport'; -export * from './Producer'; -export * from './Consumer'; -export * from './DataProducer'; -export * from './DataConsumer'; -export * from './RtpObserver'; -export * from './ActiveSpeakerObserver'; -export * from './AudioLevelObserver'; -export * from './RtpParameters'; -export * from './SctpParameters'; -export * from './SrtpParameters'; -export * from './errors'; -export { ScalabilityMode } from './scalabilityModes'; -//# sourceMappingURL=types.d.ts.map \ No newline at end of file diff --git a/node/lib/types.d.ts.map b/node/lib/types.d.ts.map deleted file mode 100644 index b34a5c6f17..0000000000 --- a/node/lib/types.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,UAAU,CAAC;AACzB,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC"} \ No newline at end of file diff --git a/node/lib/types.js b/node/lib/types.js deleted file mode 100644 index 65d74efd03..0000000000 --- a/node/lib/types.js +++ /dev/null @@ -1,35 +0,0 @@ -"use strict"; -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __exportStar = (this && this.__exportStar) || function(m, exports) { - for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -__exportStar(require("./Worker"), exports); -__exportStar(require("./WebRtcServer"), exports); -__exportStar(require("./Router"), exports); -__exportStar(require("./Transport"), exports); -__exportStar(require("./WebRtcTransport"), exports); -__exportStar(require("./PlainTransport"), exports); -__exportStar(require("./PipeTransport"), exports); -__exportStar(require("./DirectTransport"), exports); -__exportStar(require("./Producer"), exports); -__exportStar(require("./Consumer"), exports); -__exportStar(require("./DataProducer"), exports); -__exportStar(require("./DataConsumer"), exports); -__exportStar(require("./RtpObserver"), exports); -__exportStar(require("./ActiveSpeakerObserver"), exports); -__exportStar(require("./AudioLevelObserver"), exports); -__exportStar(require("./RtpParameters"), exports); -__exportStar(require("./SctpParameters"), exports); -__exportStar(require("./SrtpParameters"), exports); -__exportStar(require("./errors"), exports); diff --git a/node/lib/utils.d.ts b/node/lib/utils.d.ts deleted file mode 100644 index e2df8175f0..0000000000 --- a/node/lib/utils.d.ts +++ /dev/null @@ -1,16 +0,0 @@ -/** - * Clones the given object/array. - */ -export declare function clone(data: any): any; -/** - * Generates a random positive integer. - */ -export declare function generateRandomNumber(): number; -declare type Only = { - [P in keyof T]: T[P]; -} & { - [P in keyof U]?: never; -}; -export declare type Either = Only | Only; -export {}; -//# sourceMappingURL=utils.d.ts.map \ No newline at end of file diff --git a/node/lib/utils.d.ts.map b/node/lib/utils.d.ts.map deleted file mode 100644 index 41ed9756e1..0000000000 --- a/node/lib/utils.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAgB,KAAK,CAAC,IAAI,EAAE,GAAG,GAAG,GAAG,CAMpC;AAED;;GAEG;AACH,wBAAgB,oBAAoB,WAGnC;AAED,aAAK,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI;KAChB,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CACpB,GAAG;KACF,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK;CACtB,CAAC;AAEF,oBAAY,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/node/lib/utils.js b/node/lib/utils.js deleted file mode 100644 index 31383c1da0..0000000000 --- a/node/lib/utils.js +++ /dev/null @@ -1,20 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.generateRandomNumber = exports.clone = void 0; -const crypto_1 = require("crypto"); -/** - * Clones the given object/array. - */ -function clone(data) { - if (typeof data !== 'object') - return {}; - return JSON.parse(JSON.stringify(data)); -} -exports.clone = clone; -/** - * Generates a random positive integer. - */ -function generateRandomNumber() { - return (0, crypto_1.randomInt)(100_000_000, 999_999_999); -} -exports.generateRandomNumber = generateRandomNumber; From 6e0c4f24e66ce1282b96420fb7367d693fd52338 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Fri, 11 Nov 2022 13:34:49 +0100 Subject: [PATCH 03/31] Make Windows happy --- npm-scripts.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/npm-scripts.js b/npm-scripts.js index b665411535..20a34ed8a9 100644 --- a/npm-scripts.js +++ b/npm-scripts.js @@ -27,7 +27,7 @@ switch (task) } else { - execute('rmdir /s /q "node/lib"'); + execute('rmdir /s /q "node/lib"', /*exitOnError*/ false); } execute('tsc --project node'); @@ -46,7 +46,7 @@ switch (task) } else { - execute('rmdir /s /q "node/lib"'); + execute('rmdir /s /q "node/lib"', /*exitOnError*/ false); } const watch = new TscWatchClient(); @@ -178,7 +178,7 @@ function taskReplaceVersion() } } -function execute(command) +function execute(command, exitOnError = true) { // eslint-disable-next-line no-console console.log(`npm-scripts.js [INFO] executing command: ${command}`); From fbfd9707f1df925c3798ba142f76c0976e6f2361 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Fri, 11 Nov 2022 13:37:50 +0100 Subject: [PATCH 04/31] .gitignore: cosmetic --- .gitignore | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index af1154fc9c..d8bcffb478 100644 --- a/.gitignore +++ b/.gitignore @@ -8,7 +8,7 @@ ## Rust. /Cargo.lock -/rust/examples-frontend/*/node_modules +/rust/examples-frontend/*/node_modules/ /rust/examples-frontend/*/package-lock.json ## Worker. @@ -19,7 +19,7 @@ /worker/**/Release/ /worker/.vs/ # clang-fuzzer stuff is too big. -/worker/deps/clang-fuzzer +/worker/deps/clang-fuzzer/ # Ignore all fuzzer generated test inputs. /worker/fuzzer/new-corpus/* !/worker/fuzzer/new-corpus/.placeholder From 896fea1f78beb4de37655d309cd8a5e5ba262c33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Fri, 11 Nov 2022 13:38:42 +0100 Subject: [PATCH 05/31] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8ae957cce5..a31dc02281 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ ### NEXT -* Node: Compile TypeScript code on `postinstall` (PR #). +* Node: Compile TypeScript code on `postinstall` (PR #954). ### 3.11.3 From 912d4d9e36084c484374f019edd4f51b76470c68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Fri, 11 Nov 2022 13:39:44 +0100 Subject: [PATCH 06/31] fix npm-scripts.js --- npm-scripts.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/npm-scripts.js b/npm-scripts.js index 20a34ed8a9..930be589d1 100644 --- a/npm-scripts.js +++ b/npm-scripts.js @@ -189,6 +189,9 @@ function execute(command, exitOnError = true) } catch (error) { - process.exit(1); + if (exitOnError) + { + process.exit(1); + } } } From cdef1a91772b93299a5135d4a0b8cef6be7dd73b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Fri, 11 Nov 2022 13:40:23 +0100 Subject: [PATCH 07/31] npm-scripts.js: fix lint --- npm-scripts.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/npm-scripts.js b/npm-scripts.js index 930be589d1..637c20e153 100644 --- a/npm-scripts.js +++ b/npm-scripts.js @@ -27,7 +27,7 @@ switch (task) } else { - execute('rmdir /s /q "node/lib"', /*exitOnError*/ false); + execute('rmdir /s /q "node/lib"', /* exitOnError */ false); } execute('tsc --project node'); @@ -46,7 +46,7 @@ switch (task) } else { - execute('rmdir /s /q "node/lib"', /*exitOnError*/ false); + execute('rmdir /s /q "node/lib"', /* exitOnError */ false); } const watch = new TscWatchClient(); From 535e8e9a68e7de74c7c6d22202d845dece98cee9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Tue, 15 Nov 2022 14:25:52 +0100 Subject: [PATCH 08/31] Update files in package.json --- package.json | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/package.json b/package.json index c3efd0e4b1..bd8ecc5876 100644 --- a/package.json +++ b/package.json @@ -20,23 +20,19 @@ "main": "node/lib/index.js", "types": "node/lib/index.d.ts", "files": [ - "node/lib", - "worker/deps/libwebrtc", - "worker/fuzzer/include", - "worker/fuzzer/src", + "npm-scripts.js", + "node/src", + "worker/Makefile", + "worker/meson.build", + "worker/meson_options.txt", + "worker/src", "worker/include", + "worker/subprojects/*.wrap", + "worker/deps/libwebrtc", "worker/scripts/*.py", "worker/scripts/*.sh", "worker/scripts/*.js", - "worker/scripts/*.json", - "worker/src", - "worker/subprojects/*.wrap", - "worker/test/include", - "worker/test/src", - "worker/Makefile", - "worker/meson.build", - "worker/meson_options.txt", - "npm-scripts.js" + "worker/scripts/*.json" ], "keywords": [ "webrtc", From 60a7d552d3bcfd81bcadae01e9d3a28d278354c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Tue, 15 Nov 2022 17:13:31 +0100 Subject: [PATCH 09/31] package.json: include node/tsconfig.json in files --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index bd8ecc5876..931b175d3d 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "files": [ "npm-scripts.js", "node/src", + "node/tsconfig.json", "worker/Makefile", "worker/meson.build", "worker/meson_options.txt", From 922883ab31b22de1ccdc3dc513b797a82e58a541 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Tue, 15 Nov 2022 17:24:59 +0100 Subject: [PATCH 10/31] package.json: move dependencies defining TS types from devDependencies to dependencies --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 931b175d3d..31483c05fc 100644 --- a/package.json +++ b/package.json @@ -66,7 +66,9 @@ "testRegex": "node/tests/test.*\\.js" }, "dependencies": { + "@types/debug": "^4.1.7", "@types/node": "^18.11.9", + "@types/uuid": "^8.3.4", "debug": "^4.3.4", "h264-profile-level-id": "^1.0.1", "supports-color": "^9.2.3", @@ -74,8 +76,6 @@ "uuid": "^9.0.0" }, "devDependencies": { - "@types/debug": "^4.1.7", - "@types/uuid": "^8.3.4", "@typescript-eslint/eslint-plugin": "^5.42.0", "@typescript-eslint/parser": "^5.42.0", "eslint": "^8.26.0", From 3077769d6dddebbb6aadc46ba69154693df40cfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Tue, 15 Nov 2022 19:38:07 +0100 Subject: [PATCH 11/31] npm-scripts.js: Make 'test:node' task compile TS to JS --- npm-scripts.js | 1 + 1 file changed, 1 insertion(+) diff --git a/npm-scripts.js b/npm-scripts.js index 637c20e153..29a1f6af4a 100644 --- a/npm-scripts.js +++ b/npm-scripts.js @@ -87,6 +87,7 @@ switch (task) case 'test:node': { + execute('node npm-scripts.js typescript:build'); taskReplaceVersion(); if (!process.env.TEST_FILE) From af81f3a07c4c01de5574a3724e1c318d616298db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Thu, 17 Nov 2022 12:43:05 +0100 Subject: [PATCH 12/31] - Add package-lock.json. - Make NPM postinstall task compile TypeScript code if node/lib/ doesn't exist. - Move back typescript and @type/xxxx dependencies to devDependencies. --- .npmrc | 2 +- npm-scripts.js | 8 +- package-lock.json | 10085 ++++++++++++++++++++++++++++++++++++++++++++ package.json | 21 +- 4 files changed, 10103 insertions(+), 13 deletions(-) create mode 100644 package-lock.json diff --git a/.npmrc b/.npmrc index 43c97e719a..cafe685a11 100644 --- a/.npmrc +++ b/.npmrc @@ -1 +1 @@ -package-lock=false +package-lock=true diff --git a/npm-scripts.js b/npm-scripts.js index 29a1f6af4a..88a41f2838 100644 --- a/npm-scripts.js +++ b/npm-scripts.js @@ -119,7 +119,13 @@ switch (task) case 'postinstall': { - execute('node npm-scripts.js typescript:build'); + // If node/lib/ folder doesn't exist we have to compile TypeScript and + // flatbuffers. + if (!fs.existsSync('node/lib')) { + execute('npm install typescript @types/debug @types/uuid'); + execute('node npm-scripts.js typescript:build'); + // TODO: Compile flatbuffers. + } if (!process.env.MEDIASOUP_WORKER_BIN) { diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000000..cea722e55a --- /dev/null +++ b/package-lock.json @@ -0,0 +1,10085 @@ +{ + "name": "mediasoup", + "version": "3.11.3", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "mediasoup", + "version": "3.11.3", + "hasInstallScript": true, + "license": "ISC", + "dependencies": { + "@types/node": "^18.11.9", + "debug": "^4.3.4", + "h264-profile-level-id": "^1.0.1", + "supports-color": "^9.2.3", + "uuid": "^9.0.0" + }, + "devDependencies": { + "@types/debug": "^4.1.7", + "@types/uuid": "^8.3.4", + "@typescript-eslint/eslint-plugin": "^5.43.0", + "@typescript-eslint/parser": "^5.43.0", + "eslint": "^8.27.0", + "eslint-plugin-jest": "^27.1.5", + "jest": "^29.3.1", + "jest-tobetype": "^1.2.3", + "open-cli": "^7.1.0", + "pick-port": "^1.0.1", + "sctp": "^1.0.0", + "tsc-watch": "^5.0.3", + "typescript": "^4.9.3" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mediasoup" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.1.tgz", + "integrity": "sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.2.tgz", + "integrity": "sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.2", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-module-transforms": "^7.20.2", + "@babel/helpers": "^7.20.1", + "@babel/parser": "^7.20.2", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/@babel/core/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/@babel/generator": { + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.4.tgz", + "integrity": "sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.2", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "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/@babel/helper-compilation-targets": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", + "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.20.0", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/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/@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "dev": true, + "dependencies": { + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz", + "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.1.tgz", + "integrity": "sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/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/@babel/highlight/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/@babel/highlight/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/@babel/highlight/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/@babel/highlight/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/@babel/highlight/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/@babel/parser": { + "version": "7.20.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.3.tgz", + "integrity": "sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", + "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", + "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.1.tgz", + "integrity": "sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.1", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.20.1", + "@babel/types": "^7.20.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/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/@babel/types": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz", + "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@eslint/eslintrc": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", + "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.4.0", + "globals": "^13.15.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.7", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz", + "integrity": "sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "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/load-nyc-config/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/@istanbuljs/load-nyc-config/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/@istanbuljs/load-nyc-config/node_modules/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, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/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/@istanbuljs/load-nyc-config/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/@istanbuljs/load-nyc-config/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/@istanbuljs/load-nyc-config/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/@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, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.3.1.tgz", + "integrity": "sha512-IRE6GD47KwcqA09RIWrabKdHPiKDGgtAL31xDxbi/RjQMsr+lY+ppxmHwY0dUEV3qvvxZzoe5Hl0RXZJOjQNUg==", + "dev": true, + "dependencies": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.3.1", + "jest-util": "^29.3.1", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.3.1.tgz", + "integrity": "sha512-0ohVjjRex985w5MmO5L3u5GR1O30DexhBSpuwx2P+9ftyqHdJXnk7IUWiP80oHMvt7ubHCJHxV0a0vlKVuZirw==", + "dev": true, + "dependencies": { + "@jest/console": "^29.3.1", + "@jest/reporters": "^29.3.1", + "@jest/test-result": "^29.3.1", + "@jest/transform": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.2.0", + "jest-config": "^29.3.1", + "jest-haste-map": "^29.3.1", + "jest-message-util": "^29.3.1", + "jest-regex-util": "^29.2.0", + "jest-resolve": "^29.3.1", + "jest-resolve-dependencies": "^29.3.1", + "jest-runner": "^29.3.1", + "jest-runtime": "^29.3.1", + "jest-snapshot": "^29.3.1", + "jest-util": "^29.3.1", + "jest-validate": "^29.3.1", + "jest-watcher": "^29.3.1", + "micromatch": "^4.0.4", + "pretty-format": "^29.3.1", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.3.1.tgz", + "integrity": "sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/node": "*", + "jest-mock": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.3.1.tgz", + "integrity": "sha512-QivM7GlSHSsIAWzgfyP8dgeExPRZ9BIe2LsdPyEhCGkZkoyA+kGsoIzbKAfZCvvRzfZioKwPtCZIt5SaoxYCvg==", + "dev": true, + "dependencies": { + "expect": "^29.3.1", + "jest-snapshot": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.3.1.tgz", + "integrity": "sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.2.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.3.1.tgz", + "integrity": "sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A==", + "dev": true, + "dependencies": { + "@jest/types": "^29.3.1", + "@sinonjs/fake-timers": "^9.1.2", + "@types/node": "*", + "jest-message-util": "^29.3.1", + "jest-mock": "^29.3.1", + "jest-util": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.3.1.tgz", + "integrity": "sha512-cTicd134vOcwO59OPaB6AmdHQMCtWOe+/DitpTZVxWgMJ+YvXL1HNAmPyiGbSHmF/mXVBkvlm8YYtQhyHPnV6Q==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.3.1", + "@jest/expect": "^29.3.1", + "@jest/types": "^29.3.1", + "jest-mock": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.3.1.tgz", + "integrity": "sha512-GhBu3YFuDrcAYW/UESz1JphEAbvUjaY2vShRZRoRY1mxpCMB3yGSJ4j9n0GxVlEOdCf7qjvUfBCrTUUqhVfbRA==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.3.1", + "@jest/test-result": "^29.3.1", + "@jest/transform": "^29.3.1", + "@jest/types": "^29.3.1", + "@jridgewell/trace-mapping": "^0.3.15", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.3.1", + "jest-util": "^29.3.1", + "jest-worker": "^29.3.1", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.0.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", + "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.24.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.2.0.tgz", + "integrity": "sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.15", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.3.1.tgz", + "integrity": "sha512-qeLa6qc0ddB0kuOZyZIhfN5q0e2htngokyTWsGriedsDhItisW7SDYZ7ceOe57Ii03sL988/03wAcBh3TChMGw==", + "dev": true, + "dependencies": { + "@jest/console": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.3.1.tgz", + "integrity": "sha512-IqYvLbieTv20ArgKoAMyhLHNrVHJfzO6ARZAbQRlY4UGWfdDnLlZEF0BvKOMd77uIiIjSZRwq3Jb3Fa3I8+2UA==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.3.1", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.3.1", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.3.1.tgz", + "integrity": "sha512-8wmCFBTVGYqFNLWfcOWoVuMuKYPUBTnTMDkdvFtAYELwDOl9RGwOsvQWGPFxDJ8AWY9xM/8xCXdqmPK3+Q5Lug==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.3.1", + "@jridgewell/trace-mapping": "^0.3.15", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.3.1", + "jest-regex-util": "^29.2.0", + "jest-util": "^29.3.1", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "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.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.24.51", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.5.tgz", + "integrity": "sha512-rTpCA0wG1wUxglBSFdMMY0oTrKYvgf4fNgv/sXbfCVAdf+FnPBdKJR/7XbpTCwbCrvCbdPYnlWaUUYz4V2fPDA==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", + "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", + "dev": true + }, + "node_modules/@types/babel__core": { + "version": "7.1.20", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.20.tgz", + "integrity": "sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.2.tgz", + "integrity": "sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.3.0" + } + }, + "node_modules/@types/debug": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", + "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", + "dev": true, + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, + "node_modules/@types/minimist": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", + "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", + "dev": true + }, + "node_modules/@types/ms": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", + "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", + "dev": true + }, + "node_modules/@types/node": { + "version": "18.11.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", + "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==" + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "dev": true + }, + "node_modules/@types/prettier": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==", + "dev": true + }, + "node_modules/@types/semver": { + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "dev": true + }, + "node_modules/@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, + "node_modules/@types/uuid": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", + "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", + "dev": true + }, + "node_modules/@types/yargs": { + "version": "17.0.13", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.13.tgz", + "integrity": "sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.43.0.tgz", + "integrity": "sha512-wNPzG+eDR6+hhW4yobEmpR36jrqqQv1vxBq5LJO3fBAktjkvekfr4BRl+3Fn1CM/A+s8/EiGUbOMDoYqWdbtXA==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.43.0", + "@typescript-eslint/type-utils": "5.43.0", + "@typescript-eslint/utils": "5.43.0", + "debug": "^4.3.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.43.0.tgz", + "integrity": "sha512-2iHUK2Lh7PwNUlhFxxLI2haSDNyXvebBO9izhjhMoDC+S3XI9qt2DGFUsiJ89m2k7gGYch2aEpYqV5F/+nwZug==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.43.0", + "@typescript-eslint/types": "5.43.0", + "@typescript-eslint/typescript-estree": "5.43.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.43.0.tgz", + "integrity": "sha512-XNWnGaqAtTJsUiZaoiGIrdJYHsUOd3BZ3Qj5zKp9w6km6HsrjPk/TGZv0qMTWyWj0+1QOqpHQ2gZOLXaGA9Ekw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.43.0", + "@typescript-eslint/visitor-keys": "5.43.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.43.0.tgz", + "integrity": "sha512-K21f+KY2/VvYggLf5Pk4tgBOPs2otTaIHy2zjclo7UZGLyFH86VfUOm5iq+OtDtxq/Zwu2I3ujDBykVW4Xtmtg==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "5.43.0", + "@typescript-eslint/utils": "5.43.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.43.0.tgz", + "integrity": "sha512-jpsbcD0x6AUvV7tyOlyvon0aUsQpF8W+7TpJntfCUWU1qaIKu2K34pMwQKSzQH8ORgUrGYY6pVIh1Pi8TNeteg==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.43.0.tgz", + "integrity": "sha512-BZ1WVe+QQ+igWal2tDbNg1j2HWUkAa+CVqdU79L4HP9izQY6CNhXfkNwd1SS4+sSZAP/EthI1uiCSY/+H0pROg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.43.0", + "@typescript-eslint/visitor-keys": "5.43.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.43.0.tgz", + "integrity": "sha512-8nVpA6yX0sCjf7v/NDfeaOlyaIIqL7OaIGOWSPFqUKK59Gnumd3Wa+2l8oAaYO2lk0sO+SbWFWRSvhu8gLGv4A==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.43.0", + "@typescript-eslint/types": "5.43.0", + "@typescript-eslint/typescript-estree": "5.43.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.43.0.tgz", + "integrity": "sha512-icl1jNH/d18OVHLfcwdL3bWUKsBeIiKYTGxMJCoGe7xFht+E4QgzOqoWYrU8XSLJWhVw8nTacbm03v23J/hFTg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.43.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/acorn": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "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, + "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/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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": "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/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/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/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-jest": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.3.1.tgz", + "integrity": "sha512-aard+xnMoxgjwV70t0L6wkW/3HQQtV+O0PEimxKgzNqCJnbYmroPojdP2tqKSOAt8QAKV/uSZU8851M7B5+fcA==", + "dev": true, + "dependencies": { + "@jest/transform": "^29.3.1", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.2.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.2.0.tgz", + "integrity": "sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.2.0.tgz", + "integrity": "sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^29.2.0", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "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/browserslist": { + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.9" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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/camelcase-keys": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-7.0.2.tgz", + "integrity": "sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==", + "dev": true, + "dependencies": { + "camelcase": "^6.3.0", + "map-obj": "^4.1.0", + "quick-lru": "^5.1.1", + "type-fest": "^1.2.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-keys/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-keys/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001431", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001431.tgz", + "integrity": "sha512-zBUoFU0ZcxpvSt9IU66dXVT/3ctO1cy4y9cscs1szkPlcWb6pasYM144GqrUygUbT+k7cmUCW61cvskjcv0enQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] + }, + "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/chalk/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/chalk/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/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.6.1.tgz", + "integrity": "sha512-up5ggbaDqOqJ4UqLKZ2naVkyqSJQgJi5lwD6b6mM748ysrghDBX0bx/qJTUHzw7zu6Mq4gycviSF5hJnwceD8w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", + "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", + "dev": true + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, + "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/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/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "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/crypto-random-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", + "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", + "dev": true, + "dependencies": { + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/crypto-random-string/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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": "5.0.1", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-5.0.1.tgz", + "integrity": "sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "dev": true, + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decamelize-keys/node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff-sequences": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.3.1.tgz", + "integrity": "sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.4.284", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=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/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "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": "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/eslint": { + "version": "8.27.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.27.0.tgz", + "integrity": "sha512-0y1bfG2ho7mty+SiILVf9PfuRA49ek4Nc60Wmmu62QlobNR+CeXa4xXIJgcuwSQgZiWaPH+5BDsctpIW0PR/wQ==", + "dev": true, + "dependencies": { + "@eslint/eslintrc": "^1.3.3", + "@humanwhocodes/config-array": "^0.11.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.4.0", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.15.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-jest": { + "version": "27.1.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.1.5.tgz", + "integrity": "sha512-CK2dekZ5VBdzsOSOH5Fc1rwC+cWXjkcyrmf1RV714nDUDKu+o73TTJiDxpbILG8PtPPpAAl3ywzh5QA7Ft0mjA==", + "dev": true, + "dependencies": { + "@typescript-eslint/utils": "^5.10.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^5.0.0", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + }, + "jest": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/espree": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", + "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", + "dev": true, + "dependencies": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "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/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/event-stream": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "integrity": "sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==", + "dev": true, + "dependencies": { + "duplexer": "~0.1.1", + "from": "~0", + "map-stream": "~0.1.0", + "pause-stream": "0.0.11", + "split": "0.3", + "stream-combiner": "~0.0.4", + "through": "~2.3.1" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.3.1.tgz", + "integrity": "sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^29.3.1", + "jest-get-type": "^29.2.0", + "jest-matcher-utils": "^29.3.1", + "jest-message-util": "^29.3.1", + "jest-util": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/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/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 + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-type": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-18.0.0.tgz", + "integrity": "sha512-jjMwFpnW8PKofLE/4ohlhqwDk5k0NC6iy0UHAJFKoY1fQeGMN0GDdLgHQrvCbSpMwbqzoCZhRI5dETCZna5qVA==", + "dev": true, + "dependencies": { + "readable-web-to-node-stream": "^3.0.2", + "strtok3": "^7.0.0", + "token-types": "^5.0.1" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/file-type?sponsor=1" + } + }, + "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-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/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "node_modules/from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "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/get-stdin": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz", + "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "13.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.18.0.tgz", + "integrity": "sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, + "node_modules/h264-profile-level-id": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/h264-profile-level-id/-/h264-profile-level-id-1.0.1.tgz", + "integrity": "sha512-D3Rln/jKNjKDW5ZTJTK3niSoOGE+pFqPvRHHVgQN3G7umcn/zWGPUo8Q8VpDj16x3hKz++zVviRNRmXu5cpN+Q==", + "dependencies": { + "debug": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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-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/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "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/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "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/ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "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/ip": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", + "dev": true + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "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-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/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/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.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "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/jest": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.3.1.tgz", + "integrity": "sha512-6iWfL5DTT0Np6UYs/y5Niu7WIfNv/wRTtN5RSXt2DIEft3dx3zPuw/3WJQBCJfmEzvDiEKwoqMbGD9n49+qLSA==", + "dev": true, + "dependencies": { + "@jest/core": "^29.3.1", + "@jest/types": "^29.3.1", + "import-local": "^3.0.2", + "jest-cli": "^29.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.2.0.tgz", + "integrity": "sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA==", + "dev": true, + "dependencies": { + "execa": "^5.0.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.3.1.tgz", + "integrity": "sha512-wpr26sEvwb3qQQbdlmei+gzp6yoSSoSL6GsLPxnuayZSMrSd5Ka7IjAvatpIernBvT2+Ic6RLTg+jSebScmasg==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.3.1", + "@jest/expect": "^29.3.1", + "@jest/test-result": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.3.1", + "jest-matcher-utils": "^29.3.1", + "jest-message-util": "^29.3.1", + "jest-runtime": "^29.3.1", + "jest-snapshot": "^29.3.1", + "jest-util": "^29.3.1", + "p-limit": "^3.1.0", + "pretty-format": "^29.3.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.3.1.tgz", + "integrity": "sha512-TO/ewvwyvPOiBBuWZ0gm04z3WWP8TIK8acgPzE4IxgsLKQgb377NYGrQLc3Wl/7ndWzIH2CDNNsUjGxwLL43VQ==", + "dev": true, + "dependencies": { + "@jest/core": "^29.3.1", + "@jest/test-result": "^29.3.1", + "@jest/types": "^29.3.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^29.3.1", + "jest-util": "^29.3.1", + "jest-validate": "^29.3.1", + "prompts": "^2.0.1", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.3.1.tgz", + "integrity": "sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.3.1", + "@jest/types": "^29.3.1", + "babel-jest": "^29.3.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.3.1", + "jest-environment-node": "^29.3.1", + "jest-get-type": "^29.2.0", + "jest-regex-util": "^29.2.0", + "jest-resolve": "^29.3.1", + "jest-runner": "^29.3.1", + "jest-util": "^29.3.1", + "jest-validate": "^29.3.1", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.3.1", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.3.1.tgz", + "integrity": "sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.3.1", + "jest-get-type": "^29.2.0", + "pretty-format": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.2.0.tgz", + "integrity": "sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.3.1.tgz", + "integrity": "sha512-qrZH7PmFB9rEzCSl00BWjZYuS1BSOH8lLuC0azQE9lQrAx3PWGKHTDudQiOSwIy5dGAJh7KA0ScYlCP7JxvFYA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.3.1", + "chalk": "^4.0.0", + "jest-get-type": "^29.2.0", + "jest-util": "^29.3.1", + "pretty-format": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.3.1.tgz", + "integrity": "sha512-xm2THL18Xf5sIHoU7OThBPtuH6Lerd+Y1NLYiZJlkE3hbE+7N7r8uvHIl/FkZ5ymKXJe/11SQuf3fv4v6rUMag==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.3.1", + "@jest/fake-timers": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/node": "*", + "jest-mock": "^29.3.1", + "jest-util": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.2.0.tgz", + "integrity": "sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.3.1.tgz", + "integrity": "sha512-/FFtvoG1xjbbPXQLFef+WSU4yrc0fc0Dds6aRPBojUid7qlPqZvxdUBA03HW0fnVHXVCnCdkuoghYItKNzc/0A==", + "dev": true, + "dependencies": { + "@jest/types": "^29.3.1", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.2.0", + "jest-util": "^29.3.1", + "jest-worker": "^29.3.1", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.3.1.tgz", + "integrity": "sha512-3DA/VVXj4zFOPagGkuqHnSQf1GZBmmlagpguxEERO6Pla2g84Q1MaVIB3YMxgUaFIaYag8ZnTyQgiZ35YEqAQA==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.2.0", + "pretty-format": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.3.1.tgz", + "integrity": "sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.3.1", + "jest-get-type": "^29.2.0", + "pretty-format": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", + "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.3.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.3.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.3.1.tgz", + "integrity": "sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "jest-util": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.2.0.tgz", + "integrity": "sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.3.1.tgz", + "integrity": "sha512-amXJgH/Ng712w3Uz5gqzFBBjxV8WFLSmNjoreBGMqxgCz5cH7swmBZzgBaCIOsvb0NbpJ0vgaSFdJqMdT+rADw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.3.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.3.1", + "jest-validate": "^29.3.1", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.3.1.tgz", + "integrity": "sha512-Vk0cYq0byRw2WluNmNWGqPeRnZ3p3hHmjJMp2dyyZeYIfiBskwq4rpiuGFR6QGAdbj58WC7HN4hQHjf2mpvrLA==", + "dev": true, + "dependencies": { + "jest-regex-util": "^29.2.0", + "jest-snapshot": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.3.1.tgz", + "integrity": "sha512-oFvcwRNrKMtE6u9+AQPMATxFcTySyKfLhvso7Sdk/rNpbhg4g2GAGCopiInk1OP4q6gz3n6MajW4+fnHWlU3bA==", + "dev": true, + "dependencies": { + "@jest/console": "^29.3.1", + "@jest/environment": "^29.3.1", + "@jest/test-result": "^29.3.1", + "@jest/transform": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.2.0", + "jest-environment-node": "^29.3.1", + "jest-haste-map": "^29.3.1", + "jest-leak-detector": "^29.3.1", + "jest-message-util": "^29.3.1", + "jest-resolve": "^29.3.1", + "jest-runtime": "^29.3.1", + "jest-util": "^29.3.1", + "jest-watcher": "^29.3.1", + "jest-worker": "^29.3.1", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.3.1.tgz", + "integrity": "sha512-jLzkIxIqXwBEOZx7wx9OO9sxoZmgT2NhmQKzHQm1xwR1kNW/dn0OjxR424VwHHf1SPN6Qwlb5pp1oGCeFTQ62A==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.3.1", + "@jest/fake-timers": "^29.3.1", + "@jest/globals": "^29.3.1", + "@jest/source-map": "^29.2.0", + "@jest/test-result": "^29.3.1", + "@jest/transform": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.3.1", + "jest-message-util": "^29.3.1", + "jest-mock": "^29.3.1", + "jest-regex-util": "^29.2.0", + "jest-resolve": "^29.3.1", + "jest-snapshot": "^29.3.1", + "jest-util": "^29.3.1", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.3.1.tgz", + "integrity": "sha512-+3JOc+s28upYLI2OJM4PWRGK9AgpsMs/ekNryUV0yMBClT9B1DF2u2qay8YxcQd338PPYSFNb0lsar1B49sLDA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.3.1", + "@jest/transform": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/babel__traverse": "^7.0.6", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.3.1", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.3.1", + "jest-get-type": "^29.2.0", + "jest-haste-map": "^29.3.1", + "jest-matcher-utils": "^29.3.1", + "jest-message-util": "^29.3.1", + "jest-util": "^29.3.1", + "natural-compare": "^1.4.0", + "pretty-format": "^29.3.1", + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-tobetype": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-tobetype/-/jest-tobetype-1.2.3.tgz", + "integrity": "sha512-9wVkY9lDW4BhcUc0Hpc0hq7n1i/erZW59RbGMl+oAi4IKPi4YtaXHdJgQg0QMDPWtK5PiM82hw6jPbVjH61Z5A==", + "dev": true, + "dependencies": { + "jest-get-type": "^24.3.0", + "jest-matcher-utils": "^24.7.0" + } + }, + "node_modules/jest-tobetype/node_modules/@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-tobetype/node_modules/@types/istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/jest-tobetype/node_modules/@types/yargs": { + "version": "13.0.12", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.12.tgz", + "integrity": "sha512-qCxJE1qgz2y0hA4pIxjBR+PelCH0U5CK1XJXFwCNqfmliatKp47UCXXE9Dyk1OXBDLvsCF57TqQEJaeLfDYEOQ==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-tobetype/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-tobetype/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/jest-tobetype/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/jest-tobetype/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/jest-tobetype/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/jest-tobetype/node_modules/diff-sequences": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", + "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-tobetype/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/jest-tobetype/node_modules/jest-diff": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", + "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", + "dev": true, + "dependencies": { + "chalk": "^2.0.1", + "diff-sequences": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-tobetype/node_modules/jest-get-type": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", + "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-tobetype/node_modules/jest-matcher-utils": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz", + "integrity": "sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==", + "dev": true, + "dependencies": { + "chalk": "^2.0.1", + "jest-diff": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-tobetype/node_modules/pretty-format": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "dev": true, + "dependencies": { + "@jest/types": "^24.9.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-tobetype/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, + "node_modules/jest-tobetype/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/jest-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", + "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.3.1.tgz", + "integrity": "sha512-N9Lr3oYR2Mpzuelp1F8negJR3YE+L1ebk1rYA5qYo9TTY3f9OWdptLoNSPP9itOCBIRBqjt/S5XHlzYglLN67g==", + "dev": true, + "dependencies": { + "@jest/types": "^29.3.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.2.0", + "leven": "^3.1.0", + "pretty-format": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.3.1.tgz", + "integrity": "sha512-RspXG2BQFDsZSRKGCT/NiNa8RkQ1iKAjrO0//soTMWx/QUt+OcxMqMSBxz23PYGqUuWm2+m2mNNsmj0eIoOaFg==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.3.1", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.3.1.tgz", + "integrity": "sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.3.1", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/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/jest-worker/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/js-sdsl": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz", + "integrity": "sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==", + "dev": true + }, + "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": "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/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/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "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 + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "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/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "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-dir/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/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/map-stream": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "integrity": "sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==", + "dev": true + }, + "node_modules/meow": { + "version": "10.1.5", + "resolved": "https://registry.npmjs.org/meow/-/meow-10.1.5.tgz", + "integrity": "sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==", + "dev": true, + "dependencies": { + "@types/minimist": "^1.2.2", + "camelcase-keys": "^7.0.0", + "decamelize": "^5.0.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.2", + "read-pkg-up": "^8.0.0", + "redent": "^4.0.0", + "trim-newlines": "^4.0.2", + "type-fest": "^1.2.2", + "yargs-parser": "^20.2.9" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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/minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, + "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/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, + "node_modules/node-cleanup": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/node-cleanup/-/node-cleanup-2.1.2.tgz", + "integrity": "sha512-qN8v/s2PAJwGUtr1/hYTpNKlD6Y9rc4p8KSmJXyGdYGZsDGKXrGThikLFP9OCHFeLeEpQzPwiAtdIvBLqm//Hw==", + "dev": true + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "dev": true + }, + "node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "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/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "dev": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open-cli": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/open-cli/-/open-cli-7.1.0.tgz", + "integrity": "sha512-Xnn/B7WY9ygV47oK+LlYp5WU8xr0tEL6SEw9jMX8n6ceElOs2AzVXFXI87/O0+b+LwLokQBZVxBMzGZHCYVppw==", + "dev": true, + "dependencies": { + "file-type": "^18.0.0", + "get-stdin": "^9.0.0", + "meow": "^10.1.5", + "open": "^8.4.0", + "tempy": "^3.0.0" + }, + "bin": { + "open-cli": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "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/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/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/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "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.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", + "dev": true, + "dependencies": { + "through": "~2.3" + } + }, + "node_modules/peek-readable": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.0.0.tgz", + "integrity": "sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/pick-port": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pick-port/-/pick-port-1.0.1.tgz", + "integrity": "sha512-JzjRIkfG/4pG3tYLl1LwdmFtnlW+Rsxe200DevHZzZLYDUgfnx8LuOFnLwy5Dt59JY1HIN3JXyMXRbUvERkh/g==", + "dev": true, + "dependencies": { + "debug": "^4.3.1" + } + }, + "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/pirates": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "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/pkg-dir/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/pkg-dir/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/pkg-dir/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/pkg-dir/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/polycrc": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/polycrc/-/polycrc-0.1.0.tgz", + "integrity": "sha512-pBjdz8Gj0ixRkR80acjWl6bxiHf23MTI6chIKbQqphF2SrXXtYSPlftCSL31bD3veSWJCaTsM1QhT6zlIebqlg==", + "dev": true + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-format": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", + "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/ps-tree": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.2.0.tgz", + "integrity": "sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==", + "dev": true, + "dependencies": { + "event-stream": "=3.3.4" + }, + "bin": { + "ps-tree": "bin/ps-tree.js" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "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/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, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/read-pkg": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-6.0.0.tgz", + "integrity": "sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^3.0.2", + "parse-json": "^5.2.0", + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-8.0.0.tgz", + "integrity": "sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==", + "dev": true, + "dependencies": { + "find-up": "^5.0.0", + "read-pkg": "^6.0.0", + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readable-web-to-node-stream": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", + "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", + "dev": true, + "dependencies": { + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/redent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz", + "integrity": "sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==", + "dev": true, + "dependencies": { + "indent-string": "^5.0.0", + "strip-indent": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/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/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve.exports": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", + "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "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/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "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" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/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, + "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/sctp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/sctp/-/sctp-1.0.0.tgz", + "integrity": "sha512-wceaBrz55a0dbYG3c2zfJ1adUASLJhntQYZNVZKlGfKH1ExMckZB0sOxroWgpJLflcAB/k6wMOAPOrmylsRU4A==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "ip": "^1.1.5", + "polycrc": "^0.1.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", + "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", + "dev": true + }, + "node_modules/split": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", + "integrity": "sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==", + "dev": true, + "dependencies": { + "through": "2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "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/stream-combiner": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", + "integrity": "sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==", + "dev": true, + "dependencies": { + "duplexer": "~0.1.1" + } + }, + "node_modules/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, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-argv": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.1.2.tgz", + "integrity": "sha512-mBqPGEOMNJKXRo7z0keX0wlAhbBAjilUdPW13nN0PecVryZxdHIeM7TqbsSUA7VYuS00HGC6mojP7DlQzfa9ZA==", + "dev": true, + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "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-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", + "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/strtok3": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-7.0.0.tgz", + "integrity": "sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==", + "dev": true, + "dependencies": { + "@tokenizer/token": "^0.3.0", + "peek-readable": "^5.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/supports-color": { + "version": "9.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.2.3.tgz", + "integrity": "sha512-aszYUX/DVK/ed5rFLb/dDinVJrQjG/vmU433wtqVSD800rYsJNWxh2R3USV90aLSU+UsyQkbNeffVLzc6B6foA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/tempy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-3.0.0.tgz", + "integrity": "sha512-B2I9X7+o2wOaW4r/CWMkpOO9mdiTRCxXNgob6iGvPmfPWgH/KyUD6Uy5crtWBxIBe3YrNZKR2lSzv1JJKWD4vA==", + "dev": true, + "dependencies": { + "is-stream": "^3.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^2.12.2", + "unique-string": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "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==", + "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/token-types": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-5.0.1.tgz", + "integrity": "sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==", + "dev": true, + "dependencies": { + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/trim-newlines": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.0.2.tgz", + "integrity": "sha512-GJtWyq9InR/2HRiLZgpIKv+ufIKrVrvjQWEj7PxAXNc5dwbNJkqhAUoAGgzRmULAnoOM5EIpveYd3J2VeSAIew==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tsc-watch": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/tsc-watch/-/tsc-watch-5.0.3.tgz", + "integrity": "sha512-Hz2UawwELMSLOf0xHvAFc7anLeMw62cMVXr1flYmhRuOhOyOljwmb1l/O60ZwRyy1k7N1iC1mrn1QYM2zITfuw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "node-cleanup": "^2.1.2", + "ps-tree": "^1.2.0", + "string-argv": "^0.1.1", + "strip-ansi": "^6.0.0" + }, + "bin": { + "tsc-watch": "index.js" + }, + "engines": { + "node": ">=8.17.0" + }, + "peerDependencies": { + "typescript": "*" + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.3.tgz", + "integrity": "sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/unique-string": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", + "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", + "dev": true, + "dependencies": { + "crypto-random-string": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-to-istanbul": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", + "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "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/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "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/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yargs": { + "version": "17.6.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", + "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", + "dev": 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/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs/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, + "engines": { + "node": ">=12" + } + }, + "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.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "requires": { + "@babel/highlight": "^7.18.6" + } + }, + "@babel/compat-data": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.1.tgz", + "integrity": "sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==", + "dev": true + }, + "@babel/core": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.2.tgz", + "integrity": "sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.2", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-module-transforms": "^7.20.2", + "@babel/helpers": "^7.20.1", + "@babel/parser": "^7.20.2", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "dependencies": { + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "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 + } + } + }, + "@babel/generator": { + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.4.tgz", + "integrity": "sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA==", + "dev": true, + "requires": { + "@babel/types": "^7.20.2", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } + } + }, + "@babel/helper-compilation-targets": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", + "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.20.0", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "dev": true + }, + "@babel/helper-function-name": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "dev": true, + "requires": { + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-module-transforms": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz", + "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "dev": true + }, + "@babel/helper-simple-access": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "dev": true, + "requires": { + "@babel/types": "^7.20.2" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "dev": true + }, + "@babel/helpers": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.1.tgz", + "integrity": "sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==", + "dev": true, + "requires": { + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.0" + } + }, + "@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "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": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "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": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "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" + } + } + } + }, + "@babel/parser": { + "version": "7.20.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.3.tgz", + "integrity": "sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==", + "dev": true + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", + "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", + "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.19.0" + } + }, + "@babel/template": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" + } + }, + "@babel/traverse": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.1.tgz", + "integrity": "sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.1", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.20.1", + "@babel/types": "^7.20.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "dependencies": { + "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 + } + } + }, + "@babel/types": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz", + "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "@eslint/eslintrc": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", + "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.4.0", + "globals": "^13.15.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + } + }, + "@humanwhocodes/config-array": { + "version": "0.11.7", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz", + "integrity": "sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + } + }, + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "@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" + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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 + } + } + }, + "@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 + }, + "@jest/console": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.3.1.tgz", + "integrity": "sha512-IRE6GD47KwcqA09RIWrabKdHPiKDGgtAL31xDxbi/RjQMsr+lY+ppxmHwY0dUEV3qvvxZzoe5Hl0RXZJOjQNUg==", + "dev": true, + "requires": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.3.1", + "jest-util": "^29.3.1", + "slash": "^3.0.0" + } + }, + "@jest/core": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.3.1.tgz", + "integrity": "sha512-0ohVjjRex985w5MmO5L3u5GR1O30DexhBSpuwx2P+9ftyqHdJXnk7IUWiP80oHMvt7ubHCJHxV0a0vlKVuZirw==", + "dev": true, + "requires": { + "@jest/console": "^29.3.1", + "@jest/reporters": "^29.3.1", + "@jest/test-result": "^29.3.1", + "@jest/transform": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.2.0", + "jest-config": "^29.3.1", + "jest-haste-map": "^29.3.1", + "jest-message-util": "^29.3.1", + "jest-regex-util": "^29.2.0", + "jest-resolve": "^29.3.1", + "jest-resolve-dependencies": "^29.3.1", + "jest-runner": "^29.3.1", + "jest-runtime": "^29.3.1", + "jest-snapshot": "^29.3.1", + "jest-util": "^29.3.1", + "jest-validate": "^29.3.1", + "jest-watcher": "^29.3.1", + "micromatch": "^4.0.4", + "pretty-format": "^29.3.1", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "@jest/environment": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.3.1.tgz", + "integrity": "sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag==", + "dev": true, + "requires": { + "@jest/fake-timers": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/node": "*", + "jest-mock": "^29.3.1" + } + }, + "@jest/expect": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.3.1.tgz", + "integrity": "sha512-QivM7GlSHSsIAWzgfyP8dgeExPRZ9BIe2LsdPyEhCGkZkoyA+kGsoIzbKAfZCvvRzfZioKwPtCZIt5SaoxYCvg==", + "dev": true, + "requires": { + "expect": "^29.3.1", + "jest-snapshot": "^29.3.1" + } + }, + "@jest/expect-utils": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.3.1.tgz", + "integrity": "sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g==", + "dev": true, + "requires": { + "jest-get-type": "^29.2.0" + } + }, + "@jest/fake-timers": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.3.1.tgz", + "integrity": "sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A==", + "dev": true, + "requires": { + "@jest/types": "^29.3.1", + "@sinonjs/fake-timers": "^9.1.2", + "@types/node": "*", + "jest-message-util": "^29.3.1", + "jest-mock": "^29.3.1", + "jest-util": "^29.3.1" + } + }, + "@jest/globals": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.3.1.tgz", + "integrity": "sha512-cTicd134vOcwO59OPaB6AmdHQMCtWOe+/DitpTZVxWgMJ+YvXL1HNAmPyiGbSHmF/mXVBkvlm8YYtQhyHPnV6Q==", + "dev": true, + "requires": { + "@jest/environment": "^29.3.1", + "@jest/expect": "^29.3.1", + "@jest/types": "^29.3.1", + "jest-mock": "^29.3.1" + } + }, + "@jest/reporters": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.3.1.tgz", + "integrity": "sha512-GhBu3YFuDrcAYW/UESz1JphEAbvUjaY2vShRZRoRY1mxpCMB3yGSJ4j9n0GxVlEOdCf7qjvUfBCrTUUqhVfbRA==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.3.1", + "@jest/test-result": "^29.3.1", + "@jest/transform": "^29.3.1", + "@jest/types": "^29.3.1", + "@jridgewell/trace-mapping": "^0.3.15", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.3.1", + "jest-util": "^29.3.1", + "jest-worker": "^29.3.1", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + } + }, + "@jest/schemas": { + "version": "29.0.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", + "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", + "dev": true, + "requires": { + "@sinclair/typebox": "^0.24.1" + } + }, + "@jest/source-map": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.2.0.tgz", + "integrity": "sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.15", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + } + }, + "@jest/test-result": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.3.1.tgz", + "integrity": "sha512-qeLa6qc0ddB0kuOZyZIhfN5q0e2htngokyTWsGriedsDhItisW7SDYZ7ceOe57Ii03sL988/03wAcBh3TChMGw==", + "dev": true, + "requires": { + "@jest/console": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "@jest/test-sequencer": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.3.1.tgz", + "integrity": "sha512-IqYvLbieTv20ArgKoAMyhLHNrVHJfzO6ARZAbQRlY4UGWfdDnLlZEF0BvKOMd77uIiIjSZRwq3Jb3Fa3I8+2UA==", + "dev": true, + "requires": { + "@jest/test-result": "^29.3.1", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.3.1", + "slash": "^3.0.0" + } + }, + "@jest/transform": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.3.1.tgz", + "integrity": "sha512-8wmCFBTVGYqFNLWfcOWoVuMuKYPUBTnTMDkdvFtAYELwDOl9RGwOsvQWGPFxDJ8AWY9xM/8xCXdqmPK3+Q5Lug==", + "dev": true, + "requires": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.3.1", + "@jridgewell/trace-mapping": "^0.3.15", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.3.1", + "jest-regex-util": "^29.2.0", + "jest-util": "^29.3.1", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.1" + } + }, + "@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dev": true, + "requires": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + } + }, + "@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@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.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@sinclair/typebox": { + "version": "0.24.51", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", + "dev": true + }, + "@sinonjs/commons": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.5.tgz", + "integrity": "sha512-rTpCA0wG1wUxglBSFdMMY0oTrKYvgf4fNgv/sXbfCVAdf+FnPBdKJR/7XbpTCwbCrvCbdPYnlWaUUYz4V2fPDA==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", + "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", + "dev": true + }, + "@types/babel__core": { + "version": "7.1.20", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.20.tgz", + "integrity": "sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.2.tgz", + "integrity": "sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg==", + "dev": true, + "requires": { + "@babel/types": "^7.3.0" + } + }, + "@types/debug": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", + "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", + "dev": true, + "requires": { + "@types/ms": "*" + } + }, + "@types/graceful-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, + "@types/minimist": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", + "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", + "dev": true + }, + "@types/ms": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", + "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", + "dev": true + }, + "@types/node": { + "version": "18.11.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", + "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==" + }, + "@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "dev": true + }, + "@types/prettier": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==", + "dev": true + }, + "@types/semver": { + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "dev": true + }, + "@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, + "@types/uuid": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", + "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", + "dev": true + }, + "@types/yargs": { + "version": "17.0.13", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.13.tgz", + "integrity": "sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, + "@typescript-eslint/eslint-plugin": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.43.0.tgz", + "integrity": "sha512-wNPzG+eDR6+hhW4yobEmpR36jrqqQv1vxBq5LJO3fBAktjkvekfr4BRl+3Fn1CM/A+s8/EiGUbOMDoYqWdbtXA==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.43.0", + "@typescript-eslint/type-utils": "5.43.0", + "@typescript-eslint/utils": "5.43.0", + "debug": "^4.3.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/parser": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.43.0.tgz", + "integrity": "sha512-2iHUK2Lh7PwNUlhFxxLI2haSDNyXvebBO9izhjhMoDC+S3XI9qt2DGFUsiJ89m2k7gGYch2aEpYqV5F/+nwZug==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.43.0", + "@typescript-eslint/types": "5.43.0", + "@typescript-eslint/typescript-estree": "5.43.0", + "debug": "^4.3.4" + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.43.0.tgz", + "integrity": "sha512-XNWnGaqAtTJsUiZaoiGIrdJYHsUOd3BZ3Qj5zKp9w6km6HsrjPk/TGZv0qMTWyWj0+1QOqpHQ2gZOLXaGA9Ekw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.43.0", + "@typescript-eslint/visitor-keys": "5.43.0" + } + }, + "@typescript-eslint/type-utils": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.43.0.tgz", + "integrity": "sha512-K21f+KY2/VvYggLf5Pk4tgBOPs2otTaIHy2zjclo7UZGLyFH86VfUOm5iq+OtDtxq/Zwu2I3ujDBykVW4Xtmtg==", + "dev": true, + "requires": { + "@typescript-eslint/typescript-estree": "5.43.0", + "@typescript-eslint/utils": "5.43.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/types": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.43.0.tgz", + "integrity": "sha512-jpsbcD0x6AUvV7tyOlyvon0aUsQpF8W+7TpJntfCUWU1qaIKu2K34pMwQKSzQH8ORgUrGYY6pVIh1Pi8TNeteg==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.43.0.tgz", + "integrity": "sha512-BZ1WVe+QQ+igWal2tDbNg1j2HWUkAa+CVqdU79L4HP9izQY6CNhXfkNwd1SS4+sSZAP/EthI1uiCSY/+H0pROg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.43.0", + "@typescript-eslint/visitor-keys": "5.43.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/utils": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.43.0.tgz", + "integrity": "sha512-8nVpA6yX0sCjf7v/NDfeaOlyaIIqL7OaIGOWSPFqUKK59Gnumd3Wa+2l8oAaYO2lk0sO+SbWFWRSvhu8gLGv4A==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.43.0", + "@typescript-eslint/types": "5.43.0", + "@typescript-eslint/typescript-estree": "5.43.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0", + "semver": "^7.3.7" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.43.0.tgz", + "integrity": "sha512-icl1jNH/d18OVHLfcwdL3bWUKsBeIiKYTGxMJCoGe7xFht+E4QgzOqoWYrU8XSLJWhVw8nTacbm03v23J/hFTg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.43.0", + "eslint-visitor-keys": "^3.3.0" + } + }, + "acorn": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + }, + "dependencies": { + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + } + } + }, + "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 + }, + "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" + } + }, + "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" + } + }, + "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 + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true + }, + "babel-jest": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.3.1.tgz", + "integrity": "sha512-aard+xnMoxgjwV70t0L6wkW/3HQQtV+O0PEimxKgzNqCJnbYmroPojdP2tqKSOAt8QAKV/uSZU8851M7B5+fcA==", + "dev": true, + "requires": { + "@jest/transform": "^29.3.1", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.2.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + } + }, + "babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + } + }, + "babel-plugin-jest-hoist": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.2.0.tgz", + "integrity": "sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA==", + "dev": true, + "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "requires": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + } + }, + "babel-preset-jest": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.2.0.tgz", + "integrity": "sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA==", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^29.2.0", + "babel-preset-current-node-syntax": "^1.0.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "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" + } + }, + "browserslist": { + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.9" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "camelcase-keys": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-7.0.2.tgz", + "integrity": "sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==", + "dev": true, + "requires": { + "camelcase": "^6.3.0", + "map-obj": "^4.1.0", + "quick-lru": "^5.1.1", + "type-fest": "^1.2.1" + }, + "dependencies": { + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + }, + "type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true + } + } + }, + "caniuse-lite": { + "version": "1.0.30001431", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001431.tgz", + "integrity": "sha512-zBUoFU0ZcxpvSt9IU66dXVT/3ctO1cy4y9cscs1szkPlcWb6pasYM144GqrUygUbT+k7cmUCW61cvskjcv0enQ==", + "dev": true + }, + "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" + }, + "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" + } + } + } + }, + "char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true + }, + "ci-info": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.6.1.tgz", + "integrity": "sha512-up5ggbaDqOqJ4UqLKZ2naVkyqSJQgJi5lwD6b6mM748ysrghDBX0bx/qJTUHzw7zu6Mq4gycviSF5hJnwceD8w==", + "dev": true + }, + "cjs-module-lexer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", + "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", + "dev": true + }, + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true + }, + "collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, + "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 + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "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" + } + }, + "crypto-random-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", + "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", + "dev": true, + "requires": { + "type-fest": "^1.0.1" + }, + "dependencies": { + "type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true + } + } + }, + "debug": { + "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" + } + }, + "decamelize": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-5.0.1.tgz", + "integrity": "sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==", + "dev": true + }, + "decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "dev": true, + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true + } + } + }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true + }, + "define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true + }, + "detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true + }, + "diff-sequences": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.3.1.tgz", + "integrity": "sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ==", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.4.284", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", + "dev": true + }, + "emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "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 + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "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": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "eslint": { + "version": "8.27.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.27.0.tgz", + "integrity": "sha512-0y1bfG2ho7mty+SiILVf9PfuRA49ek4Nc60Wmmu62QlobNR+CeXa4xXIJgcuwSQgZiWaPH+5BDsctpIW0PR/wQ==", + "dev": true, + "requires": { + "@eslint/eslintrc": "^1.3.3", + "@humanwhocodes/config-array": "^0.11.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.4.0", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.15.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "dependencies": { + "eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "eslint-plugin-jest": { + "version": "27.1.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.1.5.tgz", + "integrity": "sha512-CK2dekZ5VBdzsOSOH5Fc1rwC+cWXjkcyrmf1RV714nDUDKu+o73TTJiDxpbILG8PtPPpAAl3ywzh5QA7Ft0mjA==", + "dev": true, + "requires": { + "@typescript-eslint/utils": "^5.10.0" + } + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^2.0.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true + }, + "espree": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", + "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", + "dev": true, + "requires": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + } + }, + "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 + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "event-stream": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "integrity": "sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==", + "dev": true, + "requires": { + "duplexer": "~0.1.1", + "from": "~0", + "map-stream": "~0.1.0", + "pause-stream": "0.0.11", + "split": "0.3", + "stream-combiner": "~0.0.4", + "through": "~2.3.1" + } + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true + }, + "expect": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.3.1.tgz", + "integrity": "sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA==", + "dev": true, + "requires": { + "@jest/expect-utils": "^29.3.1", + "jest-get-type": "^29.2.0", + "jest-matcher-utils": "^29.3.1", + "jest-message-util": "^29.3.1", + "jest-util": "^29.3.1" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "dependencies": { + "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" + } + } + } + }, + "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 + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "requires": { + "bser": "2.1.1" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "file-type": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-18.0.0.tgz", + "integrity": "sha512-jjMwFpnW8PKofLE/4ohlhqwDk5k0NC6iy0UHAJFKoY1fQeGMN0GDdLgHQrvCbSpMwbqzoCZhRI5dETCZna5qVA==", + "dev": true, + "requires": { + "readable-web-to-node-stream": "^3.0.2", + "strtok3": "^7.0.0", + "token-types": "^5.0.1" + } + }, + "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-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" + } + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "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 + }, + "get-stdin": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz", + "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==", + "dev": true + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "globals": { + "version": "13.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.18.0.tgz", + "integrity": "sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, + "h264-profile-level-id": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/h264-profile-level-id/-/h264-profile-level-id-1.0.1.tgz", + "integrity": "sha512-D3Rln/jKNjKDW5ZTJTK3niSoOGE+pFqPvRHHVgQN3G7umcn/zWGPUo8Q8VpDj16x3hKz++zVviRNRmXu5cpN+Q==", + "requires": { + "debug": "^4.1.1" + } + }, + "hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "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-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 + }, + "hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "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 + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, + "indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "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 + }, + "ip": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "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-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true + }, + "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": { + "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-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "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 + }, + "istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "requires": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "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.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + } + }, + "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": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jest": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.3.1.tgz", + "integrity": "sha512-6iWfL5DTT0Np6UYs/y5Niu7WIfNv/wRTtN5RSXt2DIEft3dx3zPuw/3WJQBCJfmEzvDiEKwoqMbGD9n49+qLSA==", + "dev": true, + "requires": { + "@jest/core": "^29.3.1", + "@jest/types": "^29.3.1", + "import-local": "^3.0.2", + "jest-cli": "^29.3.1" + } + }, + "jest-changed-files": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.2.0.tgz", + "integrity": "sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA==", + "dev": true, + "requires": { + "execa": "^5.0.0", + "p-limit": "^3.1.0" + } + }, + "jest-circus": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.3.1.tgz", + "integrity": "sha512-wpr26sEvwb3qQQbdlmei+gzp6yoSSoSL6GsLPxnuayZSMrSd5Ka7IjAvatpIernBvT2+Ic6RLTg+jSebScmasg==", + "dev": true, + "requires": { + "@jest/environment": "^29.3.1", + "@jest/expect": "^29.3.1", + "@jest/test-result": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.3.1", + "jest-matcher-utils": "^29.3.1", + "jest-message-util": "^29.3.1", + "jest-runtime": "^29.3.1", + "jest-snapshot": "^29.3.1", + "jest-util": "^29.3.1", + "p-limit": "^3.1.0", + "pretty-format": "^29.3.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + } + }, + "jest-cli": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.3.1.tgz", + "integrity": "sha512-TO/ewvwyvPOiBBuWZ0gm04z3WWP8TIK8acgPzE4IxgsLKQgb377NYGrQLc3Wl/7ndWzIH2CDNNsUjGxwLL43VQ==", + "dev": true, + "requires": { + "@jest/core": "^29.3.1", + "@jest/test-result": "^29.3.1", + "@jest/types": "^29.3.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^29.3.1", + "jest-util": "^29.3.1", + "jest-validate": "^29.3.1", + "prompts": "^2.0.1", + "yargs": "^17.3.1" + } + }, + "jest-config": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.3.1.tgz", + "integrity": "sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg==", + "dev": true, + "requires": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.3.1", + "@jest/types": "^29.3.1", + "babel-jest": "^29.3.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.3.1", + "jest-environment-node": "^29.3.1", + "jest-get-type": "^29.2.0", + "jest-regex-util": "^29.2.0", + "jest-resolve": "^29.3.1", + "jest-runner": "^29.3.1", + "jest-util": "^29.3.1", + "jest-validate": "^29.3.1", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.3.1", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + } + }, + "jest-diff": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.3.1.tgz", + "integrity": "sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^29.3.1", + "jest-get-type": "^29.2.0", + "pretty-format": "^29.3.1" + } + }, + "jest-docblock": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.2.0.tgz", + "integrity": "sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==", + "dev": true, + "requires": { + "detect-newline": "^3.0.0" + } + }, + "jest-each": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.3.1.tgz", + "integrity": "sha512-qrZH7PmFB9rEzCSl00BWjZYuS1BSOH8lLuC0azQE9lQrAx3PWGKHTDudQiOSwIy5dGAJh7KA0ScYlCP7JxvFYA==", + "dev": true, + "requires": { + "@jest/types": "^29.3.1", + "chalk": "^4.0.0", + "jest-get-type": "^29.2.0", + "jest-util": "^29.3.1", + "pretty-format": "^29.3.1" + } + }, + "jest-environment-node": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.3.1.tgz", + "integrity": "sha512-xm2THL18Xf5sIHoU7OThBPtuH6Lerd+Y1NLYiZJlkE3hbE+7N7r8uvHIl/FkZ5ymKXJe/11SQuf3fv4v6rUMag==", + "dev": true, + "requires": { + "@jest/environment": "^29.3.1", + "@jest/fake-timers": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/node": "*", + "jest-mock": "^29.3.1", + "jest-util": "^29.3.1" + } + }, + "jest-get-type": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.2.0.tgz", + "integrity": "sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==", + "dev": true + }, + "jest-haste-map": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.3.1.tgz", + "integrity": "sha512-/FFtvoG1xjbbPXQLFef+WSU4yrc0fc0Dds6aRPBojUid7qlPqZvxdUBA03HW0fnVHXVCnCdkuoghYItKNzc/0A==", + "dev": true, + "requires": { + "@jest/types": "^29.3.1", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.3.2", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.2.0", + "jest-util": "^29.3.1", + "jest-worker": "^29.3.1", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + } + }, + "jest-leak-detector": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.3.1.tgz", + "integrity": "sha512-3DA/VVXj4zFOPagGkuqHnSQf1GZBmmlagpguxEERO6Pla2g84Q1MaVIB3YMxgUaFIaYag8ZnTyQgiZ35YEqAQA==", + "dev": true, + "requires": { + "jest-get-type": "^29.2.0", + "pretty-format": "^29.3.1" + } + }, + "jest-matcher-utils": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.3.1.tgz", + "integrity": "sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^29.3.1", + "jest-get-type": "^29.2.0", + "pretty-format": "^29.3.1" + } + }, + "jest-message-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", + "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.3.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.3.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + } + }, + "jest-mock": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.3.1.tgz", + "integrity": "sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA==", + "dev": true, + "requires": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "jest-util": "^29.3.1" + } + }, + "jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "requires": {} + }, + "jest-regex-util": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.2.0.tgz", + "integrity": "sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA==", + "dev": true + }, + "jest-resolve": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.3.1.tgz", + "integrity": "sha512-amXJgH/Ng712w3Uz5gqzFBBjxV8WFLSmNjoreBGMqxgCz5cH7swmBZzgBaCIOsvb0NbpJ0vgaSFdJqMdT+rADw==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.3.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.3.1", + "jest-validate": "^29.3.1", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + } + }, + "jest-resolve-dependencies": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.3.1.tgz", + "integrity": "sha512-Vk0cYq0byRw2WluNmNWGqPeRnZ3p3hHmjJMp2dyyZeYIfiBskwq4rpiuGFR6QGAdbj58WC7HN4hQHjf2mpvrLA==", + "dev": true, + "requires": { + "jest-regex-util": "^29.2.0", + "jest-snapshot": "^29.3.1" + } + }, + "jest-runner": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.3.1.tgz", + "integrity": "sha512-oFvcwRNrKMtE6u9+AQPMATxFcTySyKfLhvso7Sdk/rNpbhg4g2GAGCopiInk1OP4q6gz3n6MajW4+fnHWlU3bA==", + "dev": true, + "requires": { + "@jest/console": "^29.3.1", + "@jest/environment": "^29.3.1", + "@jest/test-result": "^29.3.1", + "@jest/transform": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.2.0", + "jest-environment-node": "^29.3.1", + "jest-haste-map": "^29.3.1", + "jest-leak-detector": "^29.3.1", + "jest-message-util": "^29.3.1", + "jest-resolve": "^29.3.1", + "jest-runtime": "^29.3.1", + "jest-util": "^29.3.1", + "jest-watcher": "^29.3.1", + "jest-worker": "^29.3.1", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + } + }, + "jest-runtime": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.3.1.tgz", + "integrity": "sha512-jLzkIxIqXwBEOZx7wx9OO9sxoZmgT2NhmQKzHQm1xwR1kNW/dn0OjxR424VwHHf1SPN6Qwlb5pp1oGCeFTQ62A==", + "dev": true, + "requires": { + "@jest/environment": "^29.3.1", + "@jest/fake-timers": "^29.3.1", + "@jest/globals": "^29.3.1", + "@jest/source-map": "^29.2.0", + "@jest/test-result": "^29.3.1", + "@jest/transform": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.3.1", + "jest-message-util": "^29.3.1", + "jest-mock": "^29.3.1", + "jest-regex-util": "^29.2.0", + "jest-resolve": "^29.3.1", + "jest-snapshot": "^29.3.1", + "jest-util": "^29.3.1", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + } + }, + "jest-snapshot": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.3.1.tgz", + "integrity": "sha512-+3JOc+s28upYLI2OJM4PWRGK9AgpsMs/ekNryUV0yMBClT9B1DF2u2qay8YxcQd338PPYSFNb0lsar1B49sLDA==", + "dev": true, + "requires": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.3.1", + "@jest/transform": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/babel__traverse": "^7.0.6", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.3.1", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.3.1", + "jest-get-type": "^29.2.0", + "jest-haste-map": "^29.3.1", + "jest-matcher-utils": "^29.3.1", + "jest-message-util": "^29.3.1", + "jest-util": "^29.3.1", + "natural-compare": "^1.4.0", + "pretty-format": "^29.3.1", + "semver": "^7.3.5" + } + }, + "jest-tobetype": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-tobetype/-/jest-tobetype-1.2.3.tgz", + "integrity": "sha512-9wVkY9lDW4BhcUc0Hpc0hq7n1i/erZW59RbGMl+oAi4IKPi4YtaXHdJgQg0QMDPWtK5PiM82hw6jPbVjH61Z5A==", + "dev": true, + "requires": { + "jest-get-type": "^24.3.0", + "jest-matcher-utils": "^24.7.0" + }, + "dependencies": { + "@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + } + }, + "@types/istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "@types/yargs": { + "version": "13.0.12", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.12.tgz", + "integrity": "sha512-qCxJE1qgz2y0hA4pIxjBR+PelCH0U5CK1XJXFwCNqfmliatKp47UCXXE9Dyk1OXBDLvsCF57TqQEJaeLfDYEOQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "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" + } + }, + "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" + } + }, + "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": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "diff-sequences": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", + "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==", + "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": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "jest-diff": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", + "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "diff-sequences": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" + } + }, + "jest-get-type": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", + "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", + "dev": true + }, + "jest-matcher-utils": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz", + "integrity": "sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-diff": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" + } + }, + "pretty-format": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + } + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "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" + } + } + } + }, + "jest-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", + "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", + "dev": true, + "requires": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "jest-validate": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.3.1.tgz", + "integrity": "sha512-N9Lr3oYR2Mpzuelp1F8negJR3YE+L1ebk1rYA5qYo9TTY3f9OWdptLoNSPP9itOCBIRBqjt/S5XHlzYglLN67g==", + "dev": true, + "requires": { + "@jest/types": "^29.3.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.2.0", + "leven": "^3.1.0", + "pretty-format": "^29.3.1" + }, + "dependencies": { + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + } + } + }, + "jest-watcher": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.3.1.tgz", + "integrity": "sha512-RspXG2BQFDsZSRKGCT/NiNa8RkQ1iKAjrO0//soTMWx/QUt+OcxMqMSBxz23PYGqUuWm2+m2mNNsmj0eIoOaFg==", + "dev": true, + "requires": { + "@jest/test-result": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.3.1", + "string-length": "^4.0.1" + } + }, + "jest-worker": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.3.1.tgz", + "integrity": "sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw==", + "dev": true, + "requires": { + "@types/node": "*", + "jest-util": "^29.3.1", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.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": "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" + } + } + } + }, + "js-sdsl": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz", + "integrity": "sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==", + "dev": true + }, + "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": "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" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "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 + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "json5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "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" + } + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^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" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "requires": { + "tmpl": "1.0.5" + } + }, + "map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true + }, + "map-stream": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "integrity": "sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==", + "dev": true + }, + "meow": { + "version": "10.1.5", + "resolved": "https://registry.npmjs.org/meow/-/meow-10.1.5.tgz", + "integrity": "sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==", + "dev": true, + "requires": { + "@types/minimist": "^1.2.2", + "camelcase-keys": "^7.0.0", + "decamelize": "^5.0.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.2", + "read-pkg-up": "^8.0.0", + "redent": "^4.0.0", + "trim-newlines": "^4.0.2", + "type-fest": "^1.2.2", + "yargs-parser": "^20.2.9" + }, + "dependencies": { + "type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true + } + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true + }, + "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": { + "brace-expansion": "^1.1.7" + } + }, + "minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, + "node-cleanup": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/node-cleanup/-/node-cleanup-2.1.2.tgz", + "integrity": "sha512-qN8v/s2PAJwGUtr1/hYTpNKlD6Y9rc4p8KSmJXyGdYGZsDGKXrGThikLFP9OCHFeLeEpQzPwiAtdIvBLqm//Hw==", + "dev": true + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node-releases": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "dev": true + }, + "normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "requires": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + } + }, + "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 + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "open": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "dev": true, + "requires": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + } + }, + "open-cli": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/open-cli/-/open-cli-7.1.0.tgz", + "integrity": "sha512-Xnn/B7WY9ygV47oK+LlYp5WU8xr0tEL6SEw9jMX8n6ceElOs2AzVXFXI87/O0+b+LwLokQBZVxBMzGZHCYVppw==", + "dev": true, + "requires": { + "file-type": "^18.0.0", + "get-stdin": "^9.0.0", + "meow": "^10.1.5", + "open": "^8.4.0", + "tempy": "^3.0.0" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "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" + } + }, + "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 + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "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": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "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.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", + "dev": true, + "requires": { + "through": "~2.3" + } + }, + "peek-readable": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.0.0.tgz", + "integrity": "sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A==", + "dev": true + }, + "pick-port": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pick-port/-/pick-port-1.0.1.tgz", + "integrity": "sha512-JzjRIkfG/4pG3tYLl1LwdmFtnlW+Rsxe200DevHZzZLYDUgfnx8LuOFnLwy5Dt59JY1HIN3JXyMXRbUvERkh/g==", + "dev": true, + "requires": { + "debug": "^4.3.1" + } + }, + "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": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pirates": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "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" + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "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" + } + } + } + }, + "polycrc": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/polycrc/-/polycrc-0.1.0.tgz", + "integrity": "sha512-pBjdz8Gj0ixRkR80acjWl6bxiHf23MTI6chIKbQqphF2SrXXtYSPlftCSL31bD3veSWJCaTsM1QhT6zlIebqlg==", + "dev": true + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "pretty-format": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", + "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", + "dev": true, + "requires": { + "@jest/schemas": "^29.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, + "prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, + "ps-tree": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.2.0.tgz", + "integrity": "sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==", + "dev": true, + "requires": { + "event-stream": "=3.3.4" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "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 + }, + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "read-pkg": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-6.0.0.tgz", + "integrity": "sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^3.0.2", + "parse-json": "^5.2.0", + "type-fest": "^1.0.1" + }, + "dependencies": { + "type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-8.0.0.tgz", + "integrity": "sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==", + "dev": true, + "requires": { + "find-up": "^5.0.0", + "read-pkg": "^6.0.0", + "type-fest": "^1.0.1" + }, + "dependencies": { + "type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true + } + } + }, + "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" + } + }, + "readable-web-to-node-stream": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", + "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", + "dev": true, + "requires": { + "readable-stream": "^3.6.0" + } + }, + "redent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz", + "integrity": "sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==", + "dev": true, + "requires": { + "indent-string": "^5.0.0", + "strip-indent": "^4.0.0" + } + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + }, + "dependencies": { + "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 + } + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "resolve.exports": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", + "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "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" + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "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 + }, + "sctp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/sctp/-/sctp-1.0.0.tgz", + "integrity": "sha512-wceaBrz55a0dbYG3c2zfJ1adUASLJhntQYZNVZKlGfKH1ExMckZB0sOxroWgpJLflcAB/k6wMOAPOrmylsRU4A==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "ip": "^1.1.5", + "polycrc": "^0.1.0" + } + }, + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "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.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "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 + }, + "source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", + "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", + "dev": true + }, + "split": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", + "integrity": "sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==", + "dev": true, + "requires": { + "through": "2" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "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 + } + } + }, + "stream-combiner": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", + "integrity": "sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==", + "dev": true, + "requires": { + "duplexer": "~0.1.1" + } + }, + "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" + } + }, + "string-argv": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.1.2.tgz", + "integrity": "sha512-mBqPGEOMNJKXRo7z0keX0wlAhbBAjilUdPW13nN0PecVryZxdHIeM7TqbsSUA7VYuS00HGC6mojP7DlQzfa9ZA==", + "dev": true + }, + "string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "requires": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "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-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "strip-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", + "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", + "dev": true, + "requires": { + "min-indent": "^1.0.1" + } + }, + "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 + }, + "strtok3": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-7.0.0.tgz", + "integrity": "sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==", + "dev": true, + "requires": { + "@tokenizer/token": "^0.3.0", + "peek-readable": "^5.0.0" + } + }, + "supports-color": { + "version": "9.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.2.3.tgz", + "integrity": "sha512-aszYUX/DVK/ed5rFLb/dDinVJrQjG/vmU433wtqVSD800rYsJNWxh2R3USV90aLSU+UsyQkbNeffVLzc6B6foA==" + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "dev": true + }, + "tempy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-3.0.0.tgz", + "integrity": "sha512-B2I9X7+o2wOaW4r/CWMkpOO9mdiTRCxXNgob6iGvPmfPWgH/KyUD6Uy5crtWBxIBe3YrNZKR2lSzv1JJKWD4vA==", + "dev": true, + "requires": { + "is-stream": "^3.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^2.12.2", + "unique-string": "^3.0.0" + }, + "dependencies": { + "is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true + }, + "type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true + } + } + }, + "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" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "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 + }, + "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" + } + }, + "token-types": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-5.0.1.tgz", + "integrity": "sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==", + "dev": true, + "requires": { + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + } + }, + "trim-newlines": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.0.2.tgz", + "integrity": "sha512-GJtWyq9InR/2HRiLZgpIKv+ufIKrVrvjQWEj7PxAXNc5dwbNJkqhAUoAGgzRmULAnoOM5EIpveYd3J2VeSAIew==", + "dev": true + }, + "tsc-watch": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/tsc-watch/-/tsc-watch-5.0.3.tgz", + "integrity": "sha512-Hz2UawwELMSLOf0xHvAFc7anLeMw62cMVXr1flYmhRuOhOyOljwmb1l/O60ZwRyy1k7N1iC1mrn1QYM2zITfuw==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "node-cleanup": "^2.1.2", + "ps-tree": "^1.2.0", + "string-argv": "^0.1.1", + "strip-ansi": "^6.0.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + }, + "typescript": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.3.tgz", + "integrity": "sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==", + "dev": true + }, + "unique-string": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", + "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", + "dev": true, + "requires": { + "crypto-random-string": "^4.0.0" + } + }, + "update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "dev": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" + }, + "v8-to-istanbul": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", + "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + }, + "dependencies": { + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + } + } + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "requires": { + "makeerror": "1.0.12" + } + }, + "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" + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "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" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yargs": { + "version": "17.6.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", + "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "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 + } + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "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 index 817eab1fa8..944dc3c087 100644 --- a/package.json +++ b/package.json @@ -21,8 +21,7 @@ "types": "node/lib/index.d.ts", "files": [ "npm-scripts.js", - "node/src", - "node/tsconfig.json", + "node/lib", "worker/Makefile", "worker/meson.build", "worker/meson_options.txt", @@ -70,25 +69,25 @@ "testRegex": "node/tests/test.*\\.js" }, "dependencies": { - "@types/debug": "^4.1.7", "@types/node": "^18.11.9", - "@types/uuid": "^8.3.4", "debug": "^4.3.4", "h264-profile-level-id": "^1.0.1", "supports-color": "^9.2.3", - "typescript": "^4.8.4", "uuid": "^9.0.0" }, "devDependencies": { - "@typescript-eslint/eslint-plugin": "^5.42.0", - "@typescript-eslint/parser": "^5.42.0", - "eslint": "^8.26.0", - "eslint-plugin-jest": "^27.1.4", - "jest": "^29.2.2", + "@types/debug": "^4.1.7", + "@types/uuid": "^8.3.4", + "@typescript-eslint/eslint-plugin": "^5.43.0", + "@typescript-eslint/parser": "^5.43.0", + "eslint": "^8.27.0", + "eslint-plugin-jest": "^27.1.5", + "jest": "^29.3.1", "jest-tobetype": "^1.2.3", "open-cli": "^7.1.0", "pick-port": "^1.0.1", "sctp": "^1.0.0", - "tsc-watch": "^5.0.3" + "tsc-watch": "^5.0.3", + "typescript": "^4.9.3" } } From 38789bfed075d877b2b97b3f0747ee99fb86b9e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Thu, 17 Nov 2022 12:47:11 +0100 Subject: [PATCH 13/31] Update CHANGELOG --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 70da60d383..e4e006e278 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ ### NEXT -* Node: Compile TypeScript code on `postinstall` (PR #954). +* Node: Remove compiled JavaScript from repository and compile TypeScript code on `postinstall` on demand (PR #954). * `Worker`: Add `RTC::Shared` singleton for RTC entities (PR #953). From 5dd182c7d99e1590be046a133bd1ac33929eafd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Thu, 17 Nov 2022 13:04:08 +0100 Subject: [PATCH 14/31] Uninstall typescript libs after building --- npm-scripts.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/npm-scripts.js b/npm-scripts.js index 88a41f2838..933b4b78fc 100644 --- a/npm-scripts.js +++ b/npm-scripts.js @@ -124,6 +124,8 @@ switch (task) if (!fs.existsSync('node/lib')) { execute('npm install typescript @types/debug @types/uuid'); execute('node npm-scripts.js typescript:build'); + execute('npm uninstall typescript @types/debug @types/uuid'); + // TODO: Compile flatbuffers. } From a44253a63724d86476ff294b0f12d2c00d9740df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Thu, 17 Nov 2022 13:09:18 +0100 Subject: [PATCH 15/31] Add --no-save --- npm-scripts.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/npm-scripts.js b/npm-scripts.js index 933b4b78fc..d708429e31 100644 --- a/npm-scripts.js +++ b/npm-scripts.js @@ -122,9 +122,9 @@ switch (task) // If node/lib/ folder doesn't exist we have to compile TypeScript and // flatbuffers. if (!fs.existsSync('node/lib')) { - execute('npm install typescript @types/debug @types/uuid'); + execute('npm install --no-save typescript @types/debug @types/uuid'); execute('node npm-scripts.js typescript:build'); - execute('npm uninstall typescript @types/debug @types/uuid'); + execute('npm uninstall --no-save typescript @types/debug @types/uuid'); // TODO: Compile flatbuffers. } From a2cafbe026bc4826b05987e7732694d298176e43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Thu, 17 Nov 2022 13:44:16 +0100 Subject: [PATCH 16/31] Add prepack NPM script --- npm-scripts.js | 16 +++++++++++++--- package.json | 3 ++- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/npm-scripts.js b/npm-scripts.js index d708429e31..3be171535d 100644 --- a/npm-scripts.js +++ b/npm-scripts.js @@ -117,16 +117,26 @@ switch (task) break; } + case 'prepack': + { + // Before publishing to NPM ensure TypeScript and flatbuffers are compiled + // to JavaScript. + execute('node npm-scripts.js typescript:build'); + // TODO: Compile flatbuffers. + + break; + } + case 'postinstall': { // If node/lib/ folder doesn't exist we have to compile TypeScript and // flatbuffers. - if (!fs.existsSync('node/lib')) { + if (!fs.existsSync('node/lib')) + { execute('npm install --no-save typescript @types/debug @types/uuid'); execute('node npm-scripts.js typescript:build'); - execute('npm uninstall --no-save typescript @types/debug @types/uuid'); - // TODO: Compile flatbuffers. + execute('npm uninstall --no-save typescript @types/debug @types/uuid'); } if (!process.env.MEDIASOUP_WORKER_BIN) diff --git a/package.json b/package.json index 944dc3c087..9bc6ee71bb 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "types": "node/lib/index.d.ts", "files": [ "npm-scripts.js", - "node/lib", + "node/lib/", "worker/Makefile", "worker/meson.build", "worker/meson_options.txt", @@ -60,6 +60,7 @@ "test:node": "npm run worker:build && node npm-scripts.js test:node", "test:worker": "node npm-scripts.js test:worker", "coverage": "npm run worker:build && node npm-scripts.js coverage", + "prepack": "node npm-scripts.js prepack", "postinstall": "node npm-scripts.js postinstall", "release": "node npm-scripts.js release" }, From d9251b0bec9fffe290f169282009ff49dc5766f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Thu, 17 Nov 2022 15:07:56 +0100 Subject: [PATCH 17/31] test a thing --- npm-scripts.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/npm-scripts.js b/npm-scripts.js index 3be171535d..edb69ba3fb 100644 --- a/npm-scripts.js +++ b/npm-scripts.js @@ -133,10 +133,10 @@ switch (task) // flatbuffers. if (!fs.existsSync('node/lib')) { - execute('npm install --no-save typescript @types/debug @types/uuid'); + // execute('npm install --no-save typescript @types/debug @types/uuid'); execute('node npm-scripts.js typescript:build'); // TODO: Compile flatbuffers. - execute('npm uninstall --no-save typescript @types/debug @types/uuid'); + // execute('npm uninstall --no-save typescript @types/debug @types/uuid'); } if (!process.env.MEDIASOUP_WORKER_BIN) From 18b1e1481fa15f1e44d2082e8765a57447b6eda9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Thu, 17 Nov 2022 15:42:44 +0100 Subject: [PATCH 18/31] test 2 --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index 9bc6ee71bb..9fcd02f1c9 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,6 @@ "test:node": "npm run worker:build && node npm-scripts.js test:node", "test:worker": "node npm-scripts.js test:worker", "coverage": "npm run worker:build && node npm-scripts.js coverage", - "prepack": "node npm-scripts.js prepack", "postinstall": "node npm-scripts.js postinstall", "release": "node npm-scripts.js release" }, From 2f7001d2ff0648aaf2643a049727a8632f339c5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Thu, 17 Nov 2022 15:59:33 +0100 Subject: [PATCH 19/31] revert tests --- npm-scripts.js | 7 +++++-- package.json | 1 + 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/npm-scripts.js b/npm-scripts.js index edb69ba3fb..eae986718d 100644 --- a/npm-scripts.js +++ b/npm-scripts.js @@ -131,12 +131,15 @@ switch (task) { // If node/lib/ folder doesn't exist we have to compile TypeScript and // flatbuffers. + // NOTE: This will just happen when installing mediasoup from Git. if (!fs.existsSync('node/lib')) { - // execute('npm install --no-save typescript @types/debug @types/uuid'); + // TODO: Add flatbuffers dependency here. + execute('npm install --no-save typescript @types/debug @types/uuid'); execute('node npm-scripts.js typescript:build'); // TODO: Compile flatbuffers. - // execute('npm uninstall --no-save typescript @types/debug @types/uuid'); + // TODO: Add flatbuffers dependency here. + execute('npm uninstall --no-save typescript @types/debug @types/uuid'); } if (!process.env.MEDIASOUP_WORKER_BIN) diff --git a/package.json b/package.json index 9fcd02f1c9..9bc6ee71bb 100644 --- a/package.json +++ b/package.json @@ -60,6 +60,7 @@ "test:node": "npm run worker:build && node npm-scripts.js test:node", "test:worker": "node npm-scripts.js test:worker", "coverage": "npm run worker:build && node npm-scripts.js coverage", + "prepack": "node npm-scripts.js prepack", "postinstall": "node npm-scripts.js postinstall", "release": "node npm-scripts.js release" }, From f6a37ba4e83b3d0506d2f51a18122de19dd05302 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Thu, 17 Nov 2022 16:51:53 +0100 Subject: [PATCH 20/31] postinstall --- npm-scripts.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/npm-scripts.js b/npm-scripts.js index eae986718d..4c4c91e427 100644 --- a/npm-scripts.js +++ b/npm-scripts.js @@ -135,7 +135,7 @@ switch (task) if (!fs.existsSync('node/lib')) { // TODO: Add flatbuffers dependency here. - execute('npm install --no-save typescript @types/debug @types/uuid'); + execute('npm install --production=false --no-save typescript @types/debug @types/uuid'); execute('node npm-scripts.js typescript:build'); // TODO: Compile flatbuffers. // TODO: Add flatbuffers dependency here. From c60508af57666ed904129bbbabadd545fec05768 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Thu, 17 Nov 2022 17:31:05 +0100 Subject: [PATCH 21/31] improvements --- .npmrc | 3 +++ npm-scripts.js | 34 +++++++++++++++++++++++----------- package.json | 6 +++--- 3 files changed, 29 insertions(+), 14 deletions(-) diff --git a/.npmrc b/.npmrc index cafe685a11..05600b0d16 100644 --- a/.npmrc +++ b/.npmrc @@ -1 +1,4 @@ +# Generate package-lock.json. package-lock=true +# For bad node/npm version to throw actual error. +engine-strict=true diff --git a/npm-scripts.js b/npm-scripts.js index 4c4c91e427..9636da7564 100644 --- a/npm-scripts.js +++ b/npm-scripts.js @@ -15,7 +15,7 @@ const MAYOR_VERSION = version.split('.')[0]; const MAKE = process.env.MAKE || (isFreeBSD ? 'gmake' : 'make'); // eslint-disable-next-line no-console -console.log(`npm-scripts.js [INFO] running task "${task}"`); +console.log(`npm-scripts.js [INFO] running task: ${task}`); switch (task) { @@ -87,7 +87,11 @@ switch (task) case 'test:node': { - execute('node npm-scripts.js typescript:build'); + if (!fs.existsSync('node/lib')) + { + execute('node npm-scripts.js typescript:build'); + } + taskReplaceVersion(); if (!process.env.TEST_FILE) @@ -105,6 +109,7 @@ switch (task) case 'test:worker': { execute(`${MAKE} test -C worker`); + break; } @@ -135,22 +140,26 @@ switch (task) if (!fs.existsSync('node/lib')) { // TODO: Add flatbuffers dependency here. - execute('npm install --production=false --no-save typescript @types/debug @types/uuid'); + execute('npm install --omit=optional --no-save typescript @types/debug @types/node @types/uuid'); execute('node npm-scripts.js typescript:build'); // TODO: Compile flatbuffers. // TODO: Add flatbuffers dependency here. - execute('npm uninstall --no-save typescript @types/debug @types/uuid'); + execute('npm uninstall --no-save typescript @types/debug @types/node @types/uuid'); } if (!process.env.MEDIASOUP_WORKER_BIN) { execute('node npm-scripts.js worker:build'); - // Clean build artifacts except `mediasoup-worker`. - execute(`${MAKE} clean-build -C worker`); - // Clean downloaded dependencies. - execute(`${MAKE} clean-subprojects -C worker`); - // Clean PIP/Meson/Ninja. - execute(`${MAKE} clean-pip -C worker`); + + if (!process.env.MEDIASOUP_LOCAL_DEV) + { + // Clean build artifacts except `mediasoup-worker`. + execute(`${MAKE} clean-build -C worker`); + // Clean downloaded dependencies. + execute(`${MAKE} clean-subprojects -C worker`); + // Clean PIP/Meson/Ninja. + execute(`${MAKE} clean-pip -C worker`); + } } break; @@ -184,6 +193,9 @@ switch (task) function taskReplaceVersion() { + // eslint-disable-next-line no-console + console.log('npm-scripts.js [INFO] taskReplaceVersion()'); + const files = [ 'node/lib/index.js', @@ -203,7 +215,7 @@ function taskReplaceVersion() function execute(command, exitOnError = true) { // eslint-disable-next-line no-console - console.log(`npm-scripts.js [INFO] executing command: ${command}`); + console.log(`npm-scripts.js [INFO] execute(): ${command}`); try { diff --git a/package.json b/package.json index 9bc6ee71bb..da9c3713b2 100644 --- a/package.json +++ b/package.json @@ -57,9 +57,9 @@ "lint:worker": "node npm-scripts.js lint:worker", "format:worker": "node npm-scripts.js format:worker", "test": "npm run test:node && npm run test:worker", - "test:node": "npm run worker:build && node npm-scripts.js test:node", + "test:node": "node npm-scripts.js test:node", "test:worker": "node npm-scripts.js test:worker", - "coverage": "npm run worker:build && node npm-scripts.js coverage", + "coverage": "node npm-scripts.js coverage", "prepack": "node npm-scripts.js prepack", "postinstall": "node npm-scripts.js postinstall", "release": "node npm-scripts.js release" @@ -70,7 +70,6 @@ "testRegex": "node/tests/test.*\\.js" }, "dependencies": { - "@types/node": "^18.11.9", "debug": "^4.3.4", "h264-profile-level-id": "^1.0.1", "supports-color": "^9.2.3", @@ -78,6 +77,7 @@ }, "devDependencies": { "@types/debug": "^4.1.7", + "@types/node": "^18.11.9", "@types/uuid": "^8.3.4", "@typescript-eslint/eslint-plugin": "^5.43.0", "@typescript-eslint/parser": "^5.43.0", From 9a4b45a3f3e76ab9d07ce2d3b745e9d6b98a55e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Thu, 17 Nov 2022 18:01:45 +0100 Subject: [PATCH 22/31] cosmetic --- npm-scripts.js | 86 +++++++++++++++++++++++++------------------------- package.json | 8 ++--- 2 files changed, 47 insertions(+), 47 deletions(-) diff --git a/npm-scripts.js b/npm-scripts.js index 9636da7564..bf46d19f6e 100644 --- a/npm-scripts.js +++ b/npm-scripts.js @@ -19,6 +19,49 @@ console.log(`npm-scripts.js [INFO] running task: ${task}`); switch (task) { + case 'prepack': + { + // Before publishing to NPM ensure TypeScript and flatbuffers are compiled + // to JavaScript. + execute('node npm-scripts.js typescript:build'); + // TODO: Compile flatbuffers. + + break; + } + + case 'postinstall': + { + // If node/lib/ folder doesn't exist we have to compile TypeScript and + // flatbuffers. + // NOTE: This will just happen when installing mediasoup from Git. + if (!fs.existsSync('node/lib')) + { + // TODO: Add flatbuffers dependency here. + execute('npm install --omit=optional --no-save typescript @types/debug @types/node @types/uuid'); + execute('node npm-scripts.js typescript:build'); + // TODO: Compile flatbuffers. + // TODO: Add flatbuffers dependency here. + execute('npm uninstall --no-save typescript @types/debug @types/node @types/uuid'); + } + + if (!process.env.MEDIASOUP_WORKER_BIN) + { + execute('node npm-scripts.js worker:build'); + + if (!process.env.MEDIASOUP_LOCAL_DEV) + { + // Clean build artifacts except `mediasoup-worker`. + execute(`${MAKE} clean-build -C worker`); + // Clean downloaded dependencies. + execute(`${MAKE} clean-subprojects -C worker`); + // Clean PIP/Meson/Ninja. + execute(`${MAKE} clean-pip -C worker`); + } + } + + break; + } + case 'typescript:build': { if (!isWindows) @@ -122,49 +165,6 @@ switch (task) break; } - case 'prepack': - { - // Before publishing to NPM ensure TypeScript and flatbuffers are compiled - // to JavaScript. - execute('node npm-scripts.js typescript:build'); - // TODO: Compile flatbuffers. - - break; - } - - case 'postinstall': - { - // If node/lib/ folder doesn't exist we have to compile TypeScript and - // flatbuffers. - // NOTE: This will just happen when installing mediasoup from Git. - if (!fs.existsSync('node/lib')) - { - // TODO: Add flatbuffers dependency here. - execute('npm install --omit=optional --no-save typescript @types/debug @types/node @types/uuid'); - execute('node npm-scripts.js typescript:build'); - // TODO: Compile flatbuffers. - // TODO: Add flatbuffers dependency here. - execute('npm uninstall --no-save typescript @types/debug @types/node @types/uuid'); - } - - if (!process.env.MEDIASOUP_WORKER_BIN) - { - execute('node npm-scripts.js worker:build'); - - if (!process.env.MEDIASOUP_LOCAL_DEV) - { - // Clean build artifacts except `mediasoup-worker`. - execute(`${MAKE} clean-build -C worker`); - // Clean downloaded dependencies. - execute(`${MAKE} clean-subprojects -C worker`); - // Clean PIP/Meson/Ninja. - execute(`${MAKE} clean-pip -C worker`); - } - } - - break; - } - case 'release': { execute('node npm-scripts.js typescript:build'); diff --git a/package.json b/package.json index da9c3713b2..758ccc43e9 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,8 @@ "node": ">=12" }, "scripts": { - "install-clang-tools": "node npm-scripts.js install-clang-tools", + "prepack": "node npm-scripts.js prepack", + "postinstall": "node npm-scripts.js postinstall", "typescript:build": "node npm-scripts.js typescript:build", "typescript:watch": "node npm-scripts.js typescript:watch", "worker:build": "node npm-scripts.js worker:build", @@ -60,9 +61,8 @@ "test:node": "node npm-scripts.js test:node", "test:worker": "node npm-scripts.js test:worker", "coverage": "node npm-scripts.js coverage", - "prepack": "node npm-scripts.js prepack", - "postinstall": "node npm-scripts.js postinstall", - "release": "node npm-scripts.js release" + "release": "node npm-scripts.js release", + "install-clang-tools": "node npm-scripts.js install-clang-tools" }, "jest": { "verbose": true, From 591399ce83a50945e448ed626a619597666838bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Thu, 17 Nov 2022 18:08:36 +0100 Subject: [PATCH 23/31] fix .github/workflows/mediasoup-node.yaml Do not run `npm run typescript:build` after `npm install` since `npm install` implicitly calls the former and removes some dev deps --- .github/workflows/mediasoup-node.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/mediasoup-node.yaml b/.github/workflows/mediasoup-node.yaml index 67a6eb5da5..521d47598c 100644 --- a/.github/workflows/mediasoup-node.yaml +++ b/.github/workflows/mediasoup-node.yaml @@ -41,5 +41,4 @@ jobs: - run: npm install - run: npm run lint:node if: runner.os == 'Linux' - - run: npm run typescript:build - run: npm run test:node From 79b9baa0f7fa45547f059eb97ffea55cbc6dd257 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Thu, 17 Nov 2022 18:26:31 +0100 Subject: [PATCH 24/31] Use prepare instead of prepack --- npm-scripts.js | 31 +++++++++++++------------------ package.json | 2 +- 2 files changed, 14 insertions(+), 19 deletions(-) diff --git a/npm-scripts.js b/npm-scripts.js index bf46d19f6e..270f1c044e 100644 --- a/npm-scripts.js +++ b/npm-scripts.js @@ -19,31 +19,26 @@ console.log(`npm-scripts.js [INFO] running task: ${task}`); switch (task) { - case 'prepack': + // As per NPM documentation (https://docs.npmjs.com/cli/v9/using-npm/scripts): + // + // If a package being installed through git contains a prepare script, its + // dependencies and devDependencies will be installed, and the prepare script + // will be run, before the package is packaged and installed. + // + // So here we compile TypeScript and flatbuffers to JavaScript. + case 'prepare': { - // Before publishing to NPM ensure TypeScript and flatbuffers are compiled - // to JavaScript. - execute('node npm-scripts.js typescript:build'); - // TODO: Compile flatbuffers. - - break; - } - - case 'postinstall': - { - // If node/lib/ folder doesn't exist we have to compile TypeScript and - // flatbuffers. - // NOTE: This will just happen when installing mediasoup from Git. if (!fs.existsSync('node/lib')) { - // TODO: Add flatbuffers dependency here. - execute('npm install --omit=optional --no-save typescript @types/debug @types/node @types/uuid'); execute('node npm-scripts.js typescript:build'); // TODO: Compile flatbuffers. - // TODO: Add flatbuffers dependency here. - execute('npm uninstall --no-save typescript @types/debug @types/node @types/uuid'); } + break; + } + + case 'postinstall': + { if (!process.env.MEDIASOUP_WORKER_BIN) { execute('node npm-scripts.js worker:build'); diff --git a/package.json b/package.json index 758ccc43e9..04ade5ed37 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "node": ">=12" }, "scripts": { - "prepack": "node npm-scripts.js prepack", + "prepare": "node npm-scripts.js prepare", "postinstall": "node npm-scripts.js postinstall", "typescript:build": "node npm-scripts.js typescript:build", "typescript:watch": "node npm-scripts.js typescript:watch", From 95fa08057d5bf01da9a473300ed843d88d85508c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Thu, 17 Nov 2022 20:08:38 +0100 Subject: [PATCH 25/31] Improve npm-scripts.js by adding functions --- npm-scripts.js | 152 ++++++++++++++++++++++++++++--------------------- 1 file changed, 86 insertions(+), 66 deletions(-) diff --git a/npm-scripts.js b/npm-scripts.js index 270f1c044e..7e6db832fc 100644 --- a/npm-scripts.js +++ b/npm-scripts.js @@ -1,3 +1,5 @@ +/* eslint-disable no-console */ + const process = require('process'); const os = require('os'); const fs = require('fs'); @@ -14,8 +16,7 @@ const MAYOR_VERSION = version.split('.')[0]; // make command to use. const MAKE = process.env.MAKE || (isFreeBSD ? 'gmake' : 'make'); -// eslint-disable-next-line no-console -console.log(`npm-scripts.js [INFO] running task: ${task}`); +console.log(`npm-scripts.js [INFO] running task "${task}"`); switch (task) { @@ -28,11 +29,9 @@ switch (task) // So here we compile TypeScript and flatbuffers to JavaScript. case 'prepare': { - if (!fs.existsSync('node/lib')) - { - execute('node npm-scripts.js typescript:build'); - // TODO: Compile flatbuffers. - } + buildTypescript(/* force */ false); + + // TODO: Compile flatbuffers. break; } @@ -41,16 +40,11 @@ switch (task) { if (!process.env.MEDIASOUP_WORKER_BIN) { - execute('node npm-scripts.js worker:build'); + buildWorker(); if (!process.env.MEDIASOUP_LOCAL_DEV) { - // Clean build artifacts except `mediasoup-worker`. - execute(`${MAKE} clean-build -C worker`); - // Clean downloaded dependencies. - execute(`${MAKE} clean-subprojects -C worker`); - // Clean PIP/Meson/Ninja. - execute(`${MAKE} clean-pip -C worker`); + cleanWorker(); } } @@ -59,37 +53,20 @@ switch (task) case 'typescript:build': { - if (!isWindows) - { - execute('rm -rf node/lib'); - } - else - { - execute('rmdir /s /q "node/lib"', /* exitOnError */ false); - } - - execute('tsc --project node'); - taskReplaceVersion(); + buildTypescript(/* force */ true); + replaceVersion(); break; } case 'typescript:watch': { - const TscWatchClient = require('tsc-watch/client'); - - if (!isWindows) - { - execute('rm -rf node/lib'); - } - else - { - execute('rmdir /s /q "node/lib"', /* exitOnError */ false); - } + deleteNodeLib(); + const TscWatchClient = require('tsc-watch/client'); const watch = new TscWatchClient(); - watch.on('success', taskReplaceVersion); + watch.on('success', replaceVersion); watch.start('--project', 'node', '--pretty'); break; @@ -97,48 +74,44 @@ switch (task) case 'worker:build': { - execute(`${MAKE} -C worker`); + buildWorker(); break; } case 'lint:node': { - execute('eslint -c node/.eslintrc.js --max-warnings 0 node/src/ node/.eslintrc.js npm-scripts.js node/tests/ worker/scripts/gulpfile.js'); + executeCmd('eslint -c node/.eslintrc.js --max-warnings 0 node/src/ node/.eslintrc.js npm-scripts.js node/tests/ worker/scripts/gulpfile.js'); break; } case 'lint:worker': { - execute(`${MAKE} lint -C worker`); + executeCmd(`${MAKE} lint -C worker`); break; } case 'format:worker': { - execute(`${MAKE} format -C worker`); + executeCmd(`${MAKE} format -C worker`); break; } case 'test:node': { - if (!fs.existsSync('node/lib')) - { - execute('node npm-scripts.js typescript:build'); - } - - taskReplaceVersion(); + buildTypescript(/* force */ false); + replaceVersion(); if (!process.env.TEST_FILE) { - execute('jest'); + executeCmd('jest'); } else { - execute(`jest --testPathPattern ${process.env.TEST_FILE}`); + executeCmd(`jest --testPathPattern ${process.env.TEST_FILE}`); } break; @@ -146,36 +119,37 @@ switch (task) case 'test:worker': { - execute(`${MAKE} test -C worker`); + executeCmd(`${MAKE} test -C worker`); break; } case 'coverage': { - taskReplaceVersion(); - execute('jest --coverage'); - execute('open-cli coverage/lcov-report/index.html'); + replaceVersion(); + executeCmd('jest --coverage'); + executeCmd('open-cli coverage/lcov-report/index.html'); break; } case 'release': { - execute('node npm-scripts.js typescript:build'); - execute('npm run lint'); - execute('npm run test'); - execute(`git commit -am '${version}'`); - execute(`git tag -a ${version} -m '${version}'`); - execute(`git push origin v${MAYOR_VERSION} && git push origin --tags`); - execute('npm publish'); + buildTypescript(/* force */ true); + buildWorker(); + executeCmd('npm run lint'); + executeCmd('npm run test'); + executeCmd(`git commit -am '${version}'`); + executeCmd(`git tag -a ${version} -m '${version}'`); + executeCmd(`git push origin v${MAYOR_VERSION} && git push origin --tags`); + executeCmd('npm publish'); break; } case 'install-clang-tools': { - execute('npm ci --prefix worker/scripts'); + executeCmd('npm ci --prefix worker/scripts'); break; } @@ -186,10 +160,9 @@ switch (task) } } -function taskReplaceVersion() +function replaceVersion() { - // eslint-disable-next-line no-console - console.log('npm-scripts.js [INFO] taskReplaceVersion()'); + console.log('npm-scripts.js [INFO] replaceVersion()'); const files = [ @@ -207,10 +180,57 @@ function taskReplaceVersion() } } -function execute(command, exitOnError = true) +function deleteNodeLib() +{ + console.log('npm-scripts.js [INFO] deleteNodeLib()'); + + if (!isWindows) + { + executeCmd('rm -rf node/lib/'); + } + else + { + // NOTE: This command fails in Windows if the dir doesn't exist. + executeCmd('rmdir /s /q "node/lib/"', /* exitOnError */ false); + } +} + +function buildTypescript(force = false) +{ + if (!force && fs.existsSync('node/lib/')) + { + return; + } + + console.log('npm-scripts.js [INFO] buildTypescript()'); + + deleteNodeLib(); + + executeCmd('tsc --project node'); +} + +function buildWorker() +{ + console.log('npm-scripts.js [INFO] buildWorker()'); + + executeCmd(`${MAKE} -C worker`); +} + +function cleanWorker() +{ + console.log('npm-scripts.js [INFO] cleanWorker()'); + + // Clean build artifacts except `mediasoup-worker`. + executeCmd(`${MAKE} clean-build -C worker`); + // Clean downloaded dependencies. + executeCmd(`${MAKE} clean-subprojects -C worker`); + // Clean PIP/Meson/Ninja. + executeCmd(`${MAKE} clean-pip -C worker`); +} + +function executeCmd(command, exitOnError = true) { - // eslint-disable-next-line no-console - console.log(`npm-scripts.js [INFO] execute(): ${command}`); + console.log(`npm-scripts.js [INFO] executeCmd(): ${command}`); try { From bfd65600ae0d5ca36c594999e31e82e646a122cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Fri, 18 Nov 2022 10:33:01 +0100 Subject: [PATCH 26/31] Make npm-scripts.js better --- npm-scripts.js | 63 +++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 49 insertions(+), 14 deletions(-) diff --git a/npm-scripts.js b/npm-scripts.js index 7e6db832fc..95ca02f25a 100644 --- a/npm-scripts.js +++ b/npm-scripts.js @@ -81,14 +81,14 @@ switch (task) case 'lint:node': { - executeCmd('eslint -c node/.eslintrc.js --max-warnings 0 node/src/ node/.eslintrc.js npm-scripts.js node/tests/ worker/scripts/gulpfile.js'); + lintNode(); break; } case 'lint:worker': { - executeCmd(`${MAKE} lint -C worker`); + lintWorker(); break; } @@ -104,28 +104,21 @@ switch (task) { buildTypescript(/* force */ false); replaceVersion(); - - if (!process.env.TEST_FILE) - { - executeCmd('jest'); - } - else - { - executeCmd(`jest --testPathPattern ${process.env.TEST_FILE}`); - } + testNode(); break; } case 'test:worker': { - executeCmd(`${MAKE} test -C worker`); + testWorker(); break; } case 'coverage': { + buildTypescript(/* force */ false); replaceVersion(); executeCmd('jest --coverage'); executeCmd('open-cli coverage/lcov-report/index.html'); @@ -137,8 +130,10 @@ switch (task) { buildTypescript(/* force */ true); buildWorker(); - executeCmd('npm run lint'); - executeCmd('npm run test'); + lintNode(); + lintWorker(); + testNode(); + testWorker(); executeCmd(`git commit -am '${version}'`); executeCmd(`git tag -a ${version} -m '${version}'`); executeCmd(`git push origin v${MAYOR_VERSION} && git push origin --tags`); @@ -182,6 +177,11 @@ function replaceVersion() function deleteNodeLib() { + if (!fs.existsSync('node/lib/')) + { + return; + } + console.log('npm-scripts.js [INFO] deleteNodeLib()'); if (!isWindows) @@ -228,6 +228,41 @@ function cleanWorker() executeCmd(`${MAKE} clean-pip -C worker`); } +function lintNode() +{ + console.log('npm-scripts.js [INFO] lintNode()'); + + executeCmd('eslint -c node/.eslintrc.js --max-warnings 0 node/src/ node/.eslintrc.js npm-scripts.js node/tests/ worker/scripts/gulpfile.js'); +} + +function lintWorker() +{ + console.log('npm-scripts.js [INFO] lintWorker()'); + + executeCmd(`${MAKE} lint -C worker`); +} + +function testNode() +{ + console.log('npm-scripts.js [INFO] testNode()'); + + if (!process.env.TEST_FILE) + { + executeCmd('jest'); + } + else + { + executeCmd(`jest --testPathPattern ${process.env.TEST_FILE}`); + } +} + +function testWorker() +{ + console.log('npm-scripts.js [INFO] testWorker()'); + + executeCmd(`${MAKE} test -C worker`); +} + function executeCmd(command, exitOnError = true) { console.log(`npm-scripts.js [INFO] executeCmd(): ${command}`); From 18b7b2768c10809acae9efef5959b47d0c28c2b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Fri, 18 Nov 2022 10:40:16 +0100 Subject: [PATCH 27/31] Improve copy --- CHANGELOG.md | 2 +- npm-scripts.js | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e4e006e278..a259979d91 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ ### NEXT -* Node: Remove compiled JavaScript from repository and compile TypeScript code on `postinstall` on demand (PR #954). +* Node: Remove compiled JavaScript from repository and compile TypeScript code on NPM `prepare` script on demand when installed via git (PR #954). * `Worker`: Add `RTC::Shared` singleton for RTC entities (PR #953). diff --git a/npm-scripts.js b/npm-scripts.js index 95ca02f25a..9d360f0505 100644 --- a/npm-scripts.js +++ b/npm-scripts.js @@ -20,11 +20,14 @@ console.log(`npm-scripts.js [INFO] running task "${task}"`); switch (task) { - // As per NPM documentation (https://docs.npmjs.com/cli/v9/using-npm/scripts): + // As per NPM documentation (https://docs.npmjs.com/cli/v9/using-npm/scripts) + // `prepare` script: // - // If a package being installed through git contains a prepare script, its - // dependencies and devDependencies will be installed, and the prepare script - // will be run, before the package is packaged and installed. + // - Runs BEFORE the package is packed, i.e. during `npm publish` and `npm pack`. + // - Runs on local `npm install` without any arguments. + // - NOTE: If a package being installed through git contains a `prepare` script, + // its dependencies and devDependencies will be installed, and the `prepare` + // script will be run, before the package is packaged and installed. // // So here we compile TypeScript and flatbuffers to JavaScript. case 'prepare': From a962fdea7bdb13101638aa83aea7e036b2fda454 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Fri, 18 Nov 2022 12:38:29 +0100 Subject: [PATCH 28/31] Address feedback: - Remove slash in last forlders. - Improve `npm run release` script: - Make it update Node deps and `package-lock.json`. - Update `doc/Building.md`. --- .gitignore | 30 ++++++++++---------- doc/Building.md | 70 +++++++++++++++++++++++++++++++++-------------- npm-scripts.js | 35 +++++++++++++++++++----- package-lock.json | 8 ++++-- package.json | 19 +++++++------ 5 files changed, 107 insertions(+), 55 deletions(-) diff --git a/.gitignore b/.gitignore index a693d76847..bd1b1a17ed 100644 --- a/.gitignore +++ b/.gitignore @@ -3,35 +3,35 @@ !/worker/subprojects/*.wrap ## Node. -/node_modules/ -/node/lib/ +/node_modules +/node/lib ## Rust. /Cargo.lock -/rust/examples-frontend/*/node_modules/ +/rust/examples-frontend/*/node_modules /rust/examples-frontend/*/package-lock.json -/target/ +/target ## Worker. -/worker/out/ -/worker/scripts/node_modules/ +/worker/out +/worker/scripts/node_modules # Vistual Studio generated Stuff. -/worker/**/Debug/ -/worker/**/Release/ -/worker/.vs/ +/worker/**/Debug +/worker/**/Release +/worker/.vs # clang-fuzzer stuff is too big. -/worker/deps/clang-fuzzer/ +/worker/deps/clang-fuzzer # Ignore all fuzzer generated test inputs. /worker/fuzzer/new-corpus/* !/worker/fuzzer/new-corpus/.placeholder ## Others. -/coverage/ -/NO_GIT/ +/coverage +/NO_GIT *.swp *.swo -.DS_Store/ +.DS_Store # Vistual Studio Code stuff. -/.vscode/ +/.vscode # JetBrains IDE stuff. -/.idea/ +/.idea diff --git a/doc/Building.md b/doc/Building.md index d4329261ee..186afb79dd 100644 --- a/doc/Building.md +++ b/doc/Building.md @@ -17,6 +17,12 @@ Compiles mediasoup TypeScript code (`lib` folder) JavaScript and places it into Compiles mediasoup TypeScript code (`lib` folder) JavaScript, places it into the `lib` directory an watches for changes in the TypeScript files. + +### `npm run worker:build` + +Builds the `mediasoup-worker` binary. It invokes `make`below. + + ### `npm run lint` Runs both `npm run lint:node` and `npm run lint:worker`. @@ -57,41 +63,30 @@ Runs [Catch2](https://github.com/catchorg/Catch2) test units located at `worker/ Same as `npm run test:node` but it also opens a browser window with JavaScript coverage results. -## Makefile +### `npm run update-deps:node` -The `worker` folder contains a `Makefile` for the mediasoup-worker C++ subproject. It includes the following tasks: +Updates NPM dependencies and `package-lock.json`. -### `make` or `make mediasoup-worker` +### `npm run install-clang-tools` -Builds the `mediasoup-worker` binary at `worker/out/Release/`. +Installs clang tools needed for local development. -If the "MEDIASOUP_MAX_CORES" environment variable is set, the build process will use that number of CPU cores. Otherwise it will auto-detect the number of cores in the machine. -"MEDIASOUP_BUILDTYPE" environment variable controls build types, `Release` and `Debug` are presets optimized for those use cases. -Other build types are possible too, but they are not presets and will require "MESON_ARGS" use to customize build configuration. -Check the meaning of useful macros in the `worker/include/Logger.hpp` header file if you want to enable tracing or other debug information. - -Binary is built at `worker/out/MEDIASOUP_BUILDTYPE/build`. +## Makefile -In order to instruct the mediasoup Node.js module to use the `Debug` mediasoup-worker binary, an environment variable must be set before running the Node.js application: +The `worker` folder contains a `Makefile` for the mediasoup-worker C++ subproject. It includes the following tasks: -```bash -$ MEDIASOUP_BUILDTYPE=Debug node myapp.js -``` -If the "MEDIASOUP_WORKER_BIN" environment variable is set, mediasoup will use the it as mediasoup-worker binary and **won't** compile the binary: +### `make` or `make mediasoup-worker` -```bash -$ MEDIASOUP_WORKER_BIN="/home/xxx/src/foo/mediasoup-worker" node myapp.js -``` +Alias of ``make mediasoup-worker` below. -### `make libmediasoup-worker` +### `make meson-ninja` -Builds the `libmediasoup-worker` static library at `worker/out/Release/`. +Installs `meson` and `ninja`. -`MEDIASOUP_MAX_CORES` and `MEDIASOUP_BUILDTYPE` environment variables from above still apply for static library build. ### `make clean` @@ -128,6 +123,39 @@ $ make update-wrap-file SUBPROJECT=openssl ``` +### `make mediasoup-worker` + +Builds the `mediasoup-worker` binary at `worker/out/Release/`. + +If the "MEDIASOUP_MAX_CORES" environment variable is set, the build process will use that number of CPU cores. Otherwise it will auto-detect the number of cores in the machine. + +"MEDIASOUP_BUILDTYPE" environment variable controls build types, `Release` and `Debug` are presets optimized for those use cases. +Other build types are possible too, but they are not presets and will require "MESON_ARGS" use to customize build configuration. +Check the meaning of useful macros in the `worker/include/Logger.hpp` header file if you want to enable tracing or other debug information. + +Binary is built at `worker/out/MEDIASOUP_BUILDTYPE/build`. + +In order to instruct the mediasoup Node.js module to use the `Debug` mediasoup-worker binary, an environment variable must be set before running the Node.js application: + +```bash +$ MEDIASOUP_BUILDTYPE=Debug node myapp.js +``` + +If the "MEDIASOUP_WORKER_BIN" environment variable is set, mediasoup will use the it as mediasoup-worker binary and **won't** compile the binary: + +```bash +$ MEDIASOUP_WORKER_BIN="/home/xxx/src/foo/mediasoup-worker" node myapp.js +``` + + + +### `make libmediasoup-worker` + +Builds the `libmediasoup-worker` static library at `worker/out/Release/`. + +`MEDIASOUP_MAX_CORES` and `MEDIASOUP_BUILDTYPE` environment variables from above still apply for static library build. + + ### `make xcode` Builds a Xcode project for the mediasoup-worker subproject. diff --git a/npm-scripts.js b/npm-scripts.js index 9d360f0505..79c85f15f8 100644 --- a/npm-scripts.js +++ b/npm-scripts.js @@ -56,6 +56,7 @@ switch (task) case 'typescript:build': { + updateNodeDeps(); buildTypescript(/* force */ true); replaceVersion(); @@ -119,7 +120,7 @@ switch (task) break; } - case 'coverage': + case 'coverage:node': { buildTypescript(/* force */ false); replaceVersion(); @@ -129,9 +130,18 @@ switch (task) break; } + case 'update-deps:node': + { + updateNodeDeps(); + + break; + } + case 'release': { + updateNodeDeps(); buildTypescript(/* force */ true); + replaceVersion(); buildWorker(); lintNode(); lintWorker(); @@ -139,7 +149,8 @@ switch (task) testWorker(); executeCmd(`git commit -am '${version}'`); executeCmd(`git tag -a ${version} -m '${version}'`); - executeCmd(`git push origin v${MAYOR_VERSION} && git push origin --tags`); + executeCmd(`git push origin v${MAYOR_VERSION}`); + executeCmd(`git push origin '${version}'`); executeCmd('npm publish'); break; @@ -178,9 +189,19 @@ function replaceVersion() } } +function updateNodeDeps() +{ + console.log('npm-scripts.js [INFO] updateNodeDeps()'); + + // Install/update Node deps. + executeCmd(`npm ci --ignore-scripts`); + // Update package-lock.json. + executeCmd(`npm install --package-lock-only --ignore-scripts`); +} + function deleteNodeLib() { - if (!fs.existsSync('node/lib/')) + if (!fs.existsSync('node/lib')) { return; } @@ -189,18 +210,18 @@ function deleteNodeLib() if (!isWindows) { - executeCmd('rm -rf node/lib/'); + executeCmd('rm -rf node/lib'); } else { // NOTE: This command fails in Windows if the dir doesn't exist. - executeCmd('rmdir /s /q "node/lib/"', /* exitOnError */ false); + executeCmd('rmdir /s /q "node/lib"', /* exitOnError */ false); } } function buildTypescript(force = false) { - if (!force && fs.existsSync('node/lib/')) + if (!force && fs.existsSync('node/lib')) { return; } @@ -235,7 +256,7 @@ function lintNode() { console.log('npm-scripts.js [INFO] lintNode()'); - executeCmd('eslint -c node/.eslintrc.js --max-warnings 0 node/src/ node/.eslintrc.js npm-scripts.js node/tests/ worker/scripts/gulpfile.js'); + executeCmd('eslint -c node/.eslintrc.js --max-warnings 0 node/src node/.eslintrc.js npm-scripts.js node/tests worker/scripts/gulpfile.js'); } function lintWorker() diff --git a/package-lock.json b/package-lock.json index cea722e55a..7dd286e7dd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,6 @@ "hasInstallScript": true, "license": "ISC", "dependencies": { - "@types/node": "^18.11.9", "debug": "^4.3.4", "h264-profile-level-id": "^1.0.1", "supports-color": "^9.2.3", @@ -18,6 +17,7 @@ }, "devDependencies": { "@types/debug": "^4.1.7", + "@types/node": "^18.11.9", "@types/uuid": "^8.3.4", "@typescript-eslint/eslint-plugin": "^5.43.0", "@typescript-eslint/parser": "^5.43.0", @@ -1299,7 +1299,8 @@ "node_modules/@types/node": { "version": "18.11.9", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", - "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==" + "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", + "dev": true }, "node_modules/@types/normalize-package-data": { "version": "2.4.1", @@ -6825,7 +6826,8 @@ "@types/node": { "version": "18.11.9", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", - "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==" + "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", + "dev": true }, "@types/normalize-package-data": { "version": "2.4.1", diff --git a/package.json b/package.json index 04ade5ed37..4a50b8ab02 100644 --- a/package.json +++ b/package.json @@ -21,18 +21,18 @@ "types": "node/lib/index.d.ts", "files": [ "npm-scripts.js", - "node/lib/", + "node/lib", "worker/Makefile", "worker/meson.build", "worker/meson_options.txt", - "worker/src/", - "worker/include/", - "worker/test/src/", - "worker/test/include/", - "worker/fuzzer/src/", - "worker/fuzzer/include/", + "worker/src", + "worker/include", + "worker/test/src", + "worker/test/include", + "worker/fuzzer/src", + "worker/fuzzer/include", "worker/subprojects/*.wrap", - "worker/deps/libwebrtc/", + "worker/deps/libwebrtc", "worker/scripts/*.py", "worker/scripts/*.sh", "worker/scripts/*.js", @@ -60,7 +60,8 @@ "test": "npm run test:node && npm run test:worker", "test:node": "node npm-scripts.js test:node", "test:worker": "node npm-scripts.js test:worker", - "coverage": "node npm-scripts.js coverage", + "coverage:node": "node npm-scripts.js coverage:node", + "update-deps:node": "node npm-scripts.js update-deps:node", "release": "node npm-scripts.js release", "install-clang-tools": "node npm-scripts.js install-clang-tools" }, From f2911040db4174dd8a9d56df0917d3f9967b0d85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Fri, 18 Nov 2022 12:44:13 +0100 Subject: [PATCH 29/31] fix lint --- npm-scripts.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/npm-scripts.js b/npm-scripts.js index 79c85f15f8..0d56b6dcef 100644 --- a/npm-scripts.js +++ b/npm-scripts.js @@ -194,9 +194,9 @@ function updateNodeDeps() console.log('npm-scripts.js [INFO] updateNodeDeps()'); // Install/update Node deps. - executeCmd(`npm ci --ignore-scripts`); + executeCmd('npm ci --ignore-scripts'); // Update package-lock.json. - executeCmd(`npm install --package-lock-only --ignore-scripts`); + executeCmd('npm install --package-lock-only --ignore-scripts'); } function deleteNodeLib() From 1e457eafef4d3335c055d3d9d1c9d825f7ce309b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Fri, 18 Nov 2022 12:49:16 +0100 Subject: [PATCH 30/31] Address feedback 2 --- doc/Building.md | 4 ++-- npm-scripts.js | 12 ++++++------ package.json | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/doc/Building.md b/doc/Building.md index 186afb79dd..1d6d221f59 100644 --- a/doc/Building.md +++ b/doc/Building.md @@ -63,9 +63,9 @@ Runs [Catch2](https://github.com/catchorg/Catch2) test units located at `worker/ Same as `npm run test:node` but it also opens a browser window with JavaScript coverage results. -### `npm run update-deps:node` +### `npm run install-deps:node` -Updates NPM dependencies and `package-lock.json`. +Installs NPM dependencies and updates `package-lock.json`. ### `npm run install-clang-tools` diff --git a/npm-scripts.js b/npm-scripts.js index 0d56b6dcef..df6111c5ad 100644 --- a/npm-scripts.js +++ b/npm-scripts.js @@ -56,7 +56,7 @@ switch (task) case 'typescript:build': { - updateNodeDeps(); + installNodeDeps(); buildTypescript(/* force */ true); replaceVersion(); @@ -130,16 +130,16 @@ switch (task) break; } - case 'update-deps:node': + case 'install-deps:node': { - updateNodeDeps(); + installNodeDeps(); break; } case 'release': { - updateNodeDeps(); + installNodeDeps(); buildTypescript(/* force */ true); replaceVersion(); buildWorker(); @@ -189,9 +189,9 @@ function replaceVersion() } } -function updateNodeDeps() +function installNodeDeps() { - console.log('npm-scripts.js [INFO] updateNodeDeps()'); + console.log('npm-scripts.js [INFO] installNodeDeps()'); // Install/update Node deps. executeCmd('npm ci --ignore-scripts'); diff --git a/package.json b/package.json index 4a50b8ab02..b120dffdc6 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,7 @@ "test:node": "node npm-scripts.js test:node", "test:worker": "node npm-scripts.js test:worker", "coverage:node": "node npm-scripts.js coverage:node", - "update-deps:node": "node npm-scripts.js update-deps:node", + "install-deps:node": "node npm-scripts.js install-deps:node", "release": "node npm-scripts.js release", "install-clang-tools": "node npm-scripts.js install-clang-tools" }, From 7eb25a776f3d0df707b41d2cebc06baeac43e24f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Fri, 18 Nov 2022 14:04:06 +0100 Subject: [PATCH 31/31] cosmetic --- npm-scripts.js | 20 ++++++++++---------- package.json | 4 ++-- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/npm-scripts.js b/npm-scripts.js index df6111c5ad..8d6347f647 100644 --- a/npm-scripts.js +++ b/npm-scripts.js @@ -189,16 +189,6 @@ function replaceVersion() } } -function installNodeDeps() -{ - console.log('npm-scripts.js [INFO] installNodeDeps()'); - - // Install/update Node deps. - executeCmd('npm ci --ignore-scripts'); - // Update package-lock.json. - executeCmd('npm install --package-lock-only --ignore-scripts'); -} - function deleteNodeLib() { if (!fs.existsSync('node/lib')) @@ -287,6 +277,16 @@ function testWorker() executeCmd(`${MAKE} test -C worker`); } +function installNodeDeps() +{ + console.log('npm-scripts.js [INFO] installNodeDeps()'); + + // Install/update Node deps. + executeCmd('npm ci --ignore-scripts'); + // Update package-lock.json. + executeCmd('npm install --package-lock-only --ignore-scripts'); +} + function executeCmd(command, exitOnError = true) { console.log(`npm-scripts.js [INFO] executeCmd(): ${command}`); diff --git a/package.json b/package.json index b120dffdc6..af5c8ddf00 100644 --- a/package.json +++ b/package.json @@ -62,8 +62,8 @@ "test:worker": "node npm-scripts.js test:worker", "coverage:node": "node npm-scripts.js coverage:node", "install-deps:node": "node npm-scripts.js install-deps:node", - "release": "node npm-scripts.js release", - "install-clang-tools": "node npm-scripts.js install-clang-tools" + "install-clang-tools": "node npm-scripts.js install-clang-tools", + "release": "node npm-scripts.js release" }, "jest": { "verbose": true,