Type documentation for NymSDK (#3701)

* set up development process for docs

* set up development process for docs

* Add local installs for Typedoc on gitignore

* Add Typedoc comments on types.ts file

* add typedoc config file

* update types and add annotations

* Add updates on types file

* add examples + manage sort order for doc items

* update client methods with examples

* add description of NymMixnetClientOptions

* add description of NymMixnetClientOptions

* fix linting

---------

Co-authored-by: Lorexia <alexia.lorenza.martinel@protonmail.com>
This commit is contained in:
Fouad
2023-08-01 16:21:12 +01:00
committed by mfahampshire
parent 8a2ed9496d
commit a901dac0ae
10 changed files with 570 additions and 106 deletions
+2 -1
View File
@@ -1,2 +1,3 @@
src/mixnet/wasm/worker.js
src/mixnet/node-tester/worker.js
src/mixnet/node-tester/worker.js
docs/
@@ -0,0 +1,17 @@
## Install dependencies
run `yarn install` to install dependencies
## Generate docs
We use TypeDoc for document generation https://typedoc.org/
To generate docs run `yarn docs:generate`. Generated docs can be found the `./docs` directory.
To view the generated docs in a webpage run `yarn docs:serve`. The docs will be available to view at `http://localhost:3000`.
## Local document development
To support the development process we have a local server that will watch for changes to the src files and update the docs in real time.
Run `yarn docs:dev` to start a local server to view the docs. Again, The docs will be available to view at `http://localhost:3000`.
+12 -6
View File
@@ -28,11 +28,15 @@
"build:dev": "yarn build:dev:only-this",
"build:dev:only-this": "scripts/build.sh",
"build:local": "run-s build:dependencies:nym-client-wasm build:dev:only-this",
"docs:watch": "nodemon --ext ts --watch './src/**/*' --watch './typedoc.json' --exec \"yarn docs:generate\"",
"docs:generate": "typedoc",
"docs:serve": "reload -b -d ./docs -p 3000",
"docs:dev": "run-p docs:watch docs:serve ",
"test": "node --experimental-vm-modules --no-warnings node_modules/jest/bin/jest.js -c=jest.config.mjs --no-cache"
},
"dependencies": {
"@npmcli/node-gyp": "^3.0.0",
"@nymproject/nym-client-wasm": "1.0.0",
"@nymproject/nym-client-wasm": "1",
"comlink": "^4.3.1",
"lerna": "^6.6.2",
"node-gyp": "^9.3.1"
@@ -52,10 +56,10 @@
"@rollup/plugin-terser": "^0.2.1",
"@rollup/plugin-typescript": "^10.0.1",
"@rollup/plugin-wasm": "^6.1.1",
"@typescript-eslint/eslint-plugin": "^5.13.0",
"@typescript-eslint/parser": "^5.13.0",
"@types/jest": "^27.0.1",
"@types/node": "^16.7.13",
"@typescript-eslint/eslint-plugin": "^5.13.0",
"@typescript-eslint/parser": "^5.13.0",
"eslint": "^8.10.0",
"eslint-config-airbnb": "^19.0.4",
"eslint-config-airbnb-typescript": "^16.1.0",
@@ -67,13 +71,15 @@
"eslint-plugin-prettier": "^4.0.0",
"eslint-plugin-react": "^7.29.2",
"eslint-plugin-react-hooks": "^4.3.0",
"jest": "^29.5.0",
"nodemon": "3.0.1",
"reload": "^3.2.1",
"rimraf": "^3.0.2",
"rollup": "^3.9.1",
"rollup-plugin-base64": "^1.0.1",
"rollup-plugin-web-worker-loader": "^1.6.1",
"typescript": "^4.8.4",
"jest": "^29.5.0",
"ts-jest": "^29.1.0",
"ts-loader": "^9.4.2"
"typedoc": "^0.24.8",
"typescript": "^4.8.4"
}
}
@@ -1,2 +1,7 @@
// eslint-disable-next-line no-console
/**
* @ignore
* @internal
*/
export const notImplementedYet = () => console.log('Not implement, coming soon...');
@@ -1,5 +0,0 @@
const QA_VALIDATOR_URL = 'https://qa-nym-api.qa.nymte.ch/api';
const QWERTY_VALIDATOR_URL = 'https://qwerty-validator-api.qa.nymte.ch/api';
const MAINNET_VALIDATOR_URL = 'https://validator.nymtech.net/api/';
export { QA_VALIDATOR_URL, QWERTY_VALIDATOR_URL, MAINNET_VALIDATOR_URL };
@@ -25,8 +25,6 @@ export interface NodeTesterLoadedEvent {
};
}
export type Network = 'QA' | 'SANDBOX' | 'MAINNET';
export type NodeTestResultResponse = {
score: number;
sentPackets: number;
@@ -35,31 +33,3 @@ export type NodeTestResultResponse = {
duplicatePackets: number;
duplicateAcks: number;
};
export type Error = {
kind: 'Error';
args: { message: string };
};
export type WorkerLoaded = {
kind: 'WorkerLoaded';
};
export type DisplayTesterResults = {
kind: 'DisplayTesterResults';
args: {
result: NodeTestResultResponse;
};
};
export type TestPacket = {
kind: 'TestPacket';
args: {
mixnodeIdentity: string;
network: Network;
};
};
export type TestStatus = 'Stopped' | 'Running' | 'Complete';
export type NodeTestEvent = Error | DisplayTesterResults | TestPacket | WorkerLoaded;
@@ -5,8 +5,8 @@ import {
ConnectedEvent,
EventKinds,
IWebWorker,
IWebWorkerAsync,
IWebWorkerEvents,
Client,
Events,
LoadedEvent,
MimeTypes,
RawMessageReceivedEvent,
@@ -15,20 +15,40 @@ import {
import { createSubscriptions } from './subscriptions';
/**
* Client for the Nym mixnet.
* Options for the Nym mixnet client.
* @property autoConvertStringMimeTypes - An array of mime types.
* @example
* ```typescript
* const client = await createNymMixnetClient({
* autoConvertStringMimeTypes: [MimeTypes.ApplicationJson, MimeTypes.TextPlain],
* });
* ```
*/
export interface NymMixnetClientOptions {
autoConvertStringMimeTypes?: string[] | MimeTypes[];
}
/**
* The client for the Nym mixnet which gives access to client methods and event subscriptions.
* Returned by the {@link createNymMixnetClient} function.
*
*/
export interface NymMixnetClient {
client: IWebWorkerAsync;
events: IWebWorkerEvents;
client: Client;
events: Events;
}
/**
* Create a client to send and receive traffic from the Nym mixnet.
*
* @required
* @returns
* @example
* ```typescript
* const client = await createNymMixnetClient();
* ```
*/
export const createNymMixnetClient = async (options?: {
autoConvertStringMimeTypes?: string[] | MimeTypes[];
}): Promise<NymMixnetClient> => {
export const createNymMixnetClient = async (options?: NymMixnetClientOptions): Promise<NymMixnetClient> => {
// create a web worker that runs the WASM client on another thread and wait until it signals that it is ready
// eslint-disable-next-line @typescript-eslint/no-use-before-define
const worker = await createWorker();
@@ -53,7 +73,7 @@ export const createNymMixnetClient = async (options?: {
});
// manage the subscribers, returning self-unsubscribe methods
const events: IWebWorkerEvents = {
const events: Events = {
subscribeToConnected: (handler) => addSubscription<ConnectedEvent>(EventKinds.Connected, handler),
subscribeToLoaded: (handler) => addSubscription<LoadedEvent>(EventKinds.Loaded, handler),
subscribeToTextMessageReceivedEvent: (handler) =>
@@ -65,7 +85,7 @@ export const createNymMixnetClient = async (options?: {
};
// let comlink handle interop with the web worker
const client: IWebWorkerAsync = Comlink.wrap<IWebWorker>(worker);
const client: Client = Comlink.wrap<IWebWorker>(worker);
// set any options
if (options?.autoConvertStringMimeTypes) {
@@ -3,32 +3,138 @@ import type { DebugWasm } from './types-from-wasm-pack';
export * from './types-from-wasm-pack';
/**
* Some common mime types, however, you can always just specify the mime-type as a string
*
* @ignore
* @hidden
* @internal
*/
export enum MimeTypes {
ApplicationOctetStream = 'application/octet-stream',
TextPlain = 'text/plain',
ApplicationJson = 'application/json',
export interface IWebWorker {
start: (config: NymClientConfig) => void;
stop: () => void;
selfAddress: () => string | undefined;
setTextMimeTypes: (mimeTypes: string[]) => void;
getTextMimeTypes: () => string[];
send: (args: { payload: Payload; recipient: string; replySurbs?: number }) => void;
rawSend: (args: { payload: Uint8Array; recipient: string; replySurbs?: number }) => void;
}
export interface Payload {
message: string | Uint8Array;
mimeType?: MimeTypes | string;
headers?: string;
export interface Client {
/**
* Start the client.
*
* @example
*
* ```typescript
* const client = await createNymMixnetClient();
* await client.start({
* clientId: 'my-client',
* nymApiUrl: 'https://validator.nymtech.net/api',
* });
*
*/
start: (config: NymClientConfig) => Promise<void>;
/**
* Stop the client.
* @example
* ```typescript
* const client = await createNymMixnetClient();
* await client.start({
* clientId: 'my-client',
* nymApiUrl: 'https://validator.nymtech.net/api',
* });
* await client.stop();
* ```
*/
stop: () => Promise<void>;
/**
* Get the client address
* @example
* ```typescript
* const client = await createNymMixnetClient();
* await client.start({
* clientId: 'my-client',
* nymApiUrl: 'https://validator.nymtech.net/api',
* });
* const address = await client.selfAddress();
* ```
*/
selfAddress: () => Promise<string | undefined>;
/**
* Set the mime-types that should be used when using the {@link Client.send} method.
* @example
* ```typescript
* const client = await createNymMixnetClient();
* await client.start({
* clientId: 'my-client',
* nymApiUrl: 'https://validator.nymtech.net/api',
* });
* await client.setTextMimeTypes(['text/plain', 'application/json']);
* ```
* @param mimeTypes
* @see {@link MimeTypes}
* @see {@link Client.send}
* @see {@link Client.getTextMimeTypes}
*/
setTextMimeTypes: (mimeTypes: string[]) => void;
/**
* Get the mime-types that are automatically converted to strings.
* @example
* ```typescript
* const client = await createNymMixnetClient();
* await client.start({
* clientId: 'my-client',
* nymApiUrl: 'https://validator.nymtech.net/api',
* });
* const mimeTypes = await client.getTextMimeTypes();
* ```
* @see {@link MimeTypes}
* @see {@link Payload}
* @see {@link Client.send}
* @see {@link Client.setTextMimeTypes}
*/
getTextMimeTypes: () => Promise<string[]>;
/**
* Send some data through the mixnet message.
* @example
* ```typescript
* const client = await createNymMixnetClient();
* await client.start({
* clientId: 'my-client',
* nymApiUrl: 'https://validator.nymtech.net/api',
* });
* await client.send({
* payload: 'Hello world',
* recipient: // recipient address,
* });
* ```
* @see {@link MimeTypes}
* @see {@link Payload}
*/
send: (args: { payload: Payload; recipient: string; replySurbs?: number }) => Promise<void>;
/**
* Send a raw payload, without any mime-type conversion.
* @example
* ```typescript
* const client = await createNymMixnetClient();
* await client.start({
* clientId: 'my-client',
* nymApiUrl: 'https://validator.nymtech.net/api',
* });
* const payload = new Uint8Array([1, 2, 3]);
* await client.rawSend({
* payload,
* recipient: // recipient address,
* });
* ```
* @see {@link MimeTypes}
* @see {@link Payload}
*/
rawSend: (args: { payload: Uint8Array; recipient: string; replySurbs?: number }) => Promise<void>;
}
export type OnPayloadFn = (payload: Payload) => void;
export type OnRawPayloadFn = (payload: Uint8Array) => void;
export type EventHandlerFn<E> = (e: E) => void | Promise<void>;
export type EventHandlerSubscribeFn<E> = (fn: EventHandlerFn<E>) => EventHandlerUnsubscribeFn;
export type EventHandlerUnsubscribeFn = () => void;
/**
* The configuration passed to the {@link Client.start} method of the {@link Client}
*/
export interface NymClientConfig {
/**
* A human-readable id for the client.
@@ -56,31 +162,99 @@ export interface NymClientConfig {
debug?: DebugWasm;
}
export interface IWebWorker {
start: (config: NymClientConfig) => void;
stop: () => void;
selfAddress: () => string | undefined;
setTextMimeTypes: (mimeTypes: string[]) => void;
getTextMimeTypes: () => string[];
send: (args: { payload: Payload; recipient: string; replySurbs?: number }) => void;
rawSend: (args: { payload: Uint8Array; recipient: string; replySurbs?: number }) => void;
}
export interface IWebWorkerAsync {
start: (config: NymClientConfig) => Promise<void>;
stop: () => Promise<void>;
selfAddress: () => Promise<string | undefined>;
setTextMimeTypes: (mimeTypes: string[]) => void;
getTextMimeTypes: () => Promise<string[]>;
send: (args: { payload: Payload; recipient: string; replySurbs?: number }) => Promise<void>;
rawSend: (args: { payload: Uint8Array; recipient: string; replySurbs?: number }) => Promise<void>;
export interface Events {
/**
* @see {@link LoadedEvent}
* @example
* ```typescript
* events.subscribeToLoaded((e) => {
* console.log(e.args); // { loaded: true }
* });
* ```
*/
subscribeToLoaded: EventHandlerSubscribeFn<LoadedEvent>;
/**
* @see {@link ConnectedEvent}
* @example
* ```typescript
* events.subscribeConnected((e) => {
* console.log(e.args.address); // Client address
* });
*
*/
subscribeToConnected: EventHandlerSubscribeFn<ConnectedEvent>;
/**
* @returns {@link EventHandlerUnsubscribeFn}
* @see {@link StringMessageReceivedEvent}
* @example
* ```typescript
* const unsubscribe = events.subscribeToTextMessageReceivedEvent((e) => {
* console.log(e.args.payload); // string
* });
*
* // Stop listening to the event
* unsubscribe();
* ```
*/
subscribeToTextMessageReceivedEvent: EventHandlerSubscribeFn<StringMessageReceivedEvent>;
/**
* @returns {@link EventHandlerUnsubscribeFn}
* @see {@link BinaryMessageReceivedEvent}
* @example
* ```typescript
* const unsubscribe = events.subscribeToBinaryMessageReceivedEvent((e) => {
* console.log(e.args.payload); // Uint8Array
* });
*
* // Stop listening to the event
* unsubscribe();
* ```
*/
subscribeToBinaryMessageReceivedEvent: EventHandlerSubscribeFn<BinaryMessageReceivedEvent>;
/**
* @returns {@link EventHandlerUnsubscribeFn}
* @see {@link RawMessageReceivedEvent}
* @example
* ```typescript
* const unsubscribe = events.subscribeToRawMessageReceivedEvent((e) => {
* console.log(e.args.payload); // Uint8Array
* });
*
* // Stop listening to the event
* unsubscribe();
* ```
*/
subscribeToRawMessageReceivedEvent: EventHandlerSubscribeFn<RawMessageReceivedEvent>;
}
/**
* Enum representing various event kinds.
* @enum
*/
export enum EventKinds {
/**
* The event emitted when the nodetester is ready to be used.
*/
Loaded = 'Loaded',
/**
* The event emitted when connection to the gateway is established.
*/
Connected = 'Connected',
/**
* The event for when a message is received and interpreted as a string.
*/
StringMessageReceived = 'StringMessageReceived',
/**
* The event for when a binary message is received. BinaryMessage is a type of message that contains additional metadata, such as MIME type and some headers, along with the actual payload data.
*/
BinaryMessageReceived = 'BinaryMessageReceived',
/**
* The event for when a raw message is received. RawMessage represents the bytes that are received directly from the mixnet with no further parsing or interpretation done on them.
*/
RawMessageReceived = 'RawMessageReceived',
}
@@ -107,7 +281,6 @@ export interface StringMessageReceivedEvent {
headers?: string;
};
}
export interface BinaryMessageReceivedEvent {
kind: EventKinds.BinaryMessageReceived;
args: {
@@ -124,10 +297,54 @@ export interface RawMessageReceivedEvent {
};
}
export interface IWebWorkerEvents {
subscribeToLoaded: EventHandlerSubscribeFn<LoadedEvent>;
subscribeToConnected: EventHandlerSubscribeFn<ConnectedEvent>;
subscribeToTextMessageReceivedEvent: EventHandlerSubscribeFn<StringMessageReceivedEvent>;
subscribeToBinaryMessageReceivedEvent: EventHandlerSubscribeFn<BinaryMessageReceivedEvent>;
subscribeToRawMessageReceivedEvent: EventHandlerSubscribeFn<RawMessageReceivedEvent>;
/**
* Some common mime types, however, you can always just specify the mime-type as a string
*/
export enum MimeTypes {
ApplicationOctetStream = 'application/octet-stream',
TextPlain = 'text/plain',
ApplicationJson = 'application/json',
}
export interface Payload {
message: string | Uint8Array;
mimeType?: MimeTypes | string;
headers?: string;
}
/**
* @ignore
* @internal
*/
export type OnPayloadFn = (payload: Payload) => void;
/**
* @ignore
* @internal
*/
export type OnRawPayloadFn = (payload: Uint8Array) => void;
/**
* The **EventHandlerSubscribeFn** is a function that takes a callback of type {@link EventHandlerFn}
*
* @see {@link Events}
* @see {@link EventHandlerFn}
* @see {@link EventHandlerUnsubscribeFn}
*/
export type EventHandlerSubscribeFn<E> = (fn: EventHandlerFn<E>) => EventHandlerUnsubscribeFn;
/**
* The **EventHandlerFn** is a callback function that is passed to the {@link EventHandlerSubscribeFn}
* @see {@link Events}
* @see {@link EventHandlerFn}
* @see {@link EventHandlerSubscribeFn}
*/
export type EventHandlerFn<E> = (e: E) => void | Promise<void>;
/**
* The **EventHandlerUnsubscribeFn** function is returned by the {@link EventHandlerSubscribeFn}
* and can be used to stop listening for particular events
* @see {@link Events}
* @see {@link EventHandlerFn}
* @see {@link EventHandlerSubscribeFn}
*/
export type EventHandlerUnsubscribeFn = () => void;
+32
View File
@@ -0,0 +1,32 @@
{
"sort": ["kind"],
"entryPoints": ["./src/index.ts"],
"out": "./docs",
"exclude": ["./src/**/node-tester/*", "./src/**/wasm/types-from-wasm-pack.ts"],
"kindSortOrder": [
"Function",
"Interface",
"TypeAlias",
"Reference",
"Project",
"Module",
"Namespace",
"Enum",
"EnumMember",
"Class",
"Constructor",
"Property",
"Variable",
"Accessor",
"Method",
"ObjectLiteral",
"Parameter",
"TypeParameter",
"TypeLiteral",
"CallSignature",
"ConstructorSignature",
"IndexSignature",
"GetSignature",
"SetSignature"
]
}
+208 -7
View File
@@ -6421,6 +6421,11 @@ ansi-regex@^6.0.1:
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a"
integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==
ansi-sequence-parser@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/ansi-sequence-parser/-/ansi-sequence-parser-1.1.0.tgz#4d790f31236ac20366b23b3916b789e1bde39aed"
integrity sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ==
ansi-styles@^3.2.1:
version "3.2.1"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
@@ -7821,6 +7826,17 @@ cli-boxes@^2.2.1:
resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f"
integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==
cli-color@~2.0.0:
version "2.0.3"
resolved "https://registry.yarnpkg.com/cli-color/-/cli-color-2.0.3.tgz#73769ba969080629670f3f2ef69a4bf4e7cc1879"
integrity sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==
dependencies:
d "^1.0.1"
es5-ext "^0.10.61"
es6-iterator "^2.0.3"
memoizee "^0.4.15"
timers-ext "^0.1.7"
cli-cursor@3.1.0, cli-cursor@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307"
@@ -8093,6 +8109,11 @@ commander@^9.4.1:
resolved "https://registry.yarnpkg.com/commander/-/commander-9.5.0.tgz#bc08d1eb5cedf7ccb797a96199d41c7bc3e60d30"
integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==
commander@~9.4.0:
version "9.4.1"
resolved "https://registry.yarnpkg.com/commander/-/commander-9.4.1.tgz#d1dd8f2ce6faf93147295c0df13c7c21141cfbdd"
integrity sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==
common-ancestor-path@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz#4f7d2d1394d91b7abdf51871c62f71eadb0182a7"
@@ -8871,6 +8892,14 @@ d3-zoom@^2.0.0:
d3-selection "2"
d3-transition "2"
d@1, d@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a"
integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==
dependencies:
es5-ext "^0.10.50"
type "^1.0.1"
damerau-levenshtein@^1.0.8:
version "1.0.8"
resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7"
@@ -9678,16 +9707,52 @@ es-to-primitive@^1.2.1:
is-date-object "^1.0.1"
is-symbol "^1.0.2"
es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@^0.10.53, es5-ext@^0.10.61, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46:
version "0.10.62"
resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.62.tgz#5e6adc19a6da524bf3d1e02bbc8960e5eb49a9a5"
integrity sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==
dependencies:
es6-iterator "^2.0.3"
es6-symbol "^3.1.3"
next-tick "^1.1.0"
es5-shim@^4.5.13:
version "4.6.7"
resolved "https://registry.yarnpkg.com/es5-shim/-/es5-shim-4.6.7.tgz#bc67ae0fc3dd520636e0a1601cc73b450ad3e955"
integrity sha512-jg21/dmlrNQI7JyyA2w7n+yifSxBng0ZralnSfVZjoCawgNTCnS+yBCyVM9DL5itm7SUnDGgv7hcq2XCZX4iRQ==
es6-iterator@^2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==
dependencies:
d "1"
es5-ext "^0.10.35"
es6-symbol "^3.1.1"
es6-shim@^0.35.5:
version "0.35.8"
resolved "https://registry.yarnpkg.com/es6-shim/-/es6-shim-0.35.8.tgz#89216f6fbf8bacba3f897c8c0e814d2a41c05fb7"
integrity sha512-Twf7I2v4/1tLoIXMT8HlqaBSS5H2wQTs2wx3MNYCI8K1R1/clXyCazrcVCPm/FuO9cyV8+leEaZOWD5C253NDg==
es6-symbol@^3.1.1, es6-symbol@^3.1.3:
version "3.1.3"
resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18"
integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==
dependencies:
d "^1.0.1"
ext "^1.1.2"
es6-weak-map@^2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53"
integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==
dependencies:
d "1"
es5-ext "^0.10.46"
es6-iterator "^2.0.3"
es6-symbol "^3.1.1"
escalade@^3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
@@ -10150,6 +10215,14 @@ etag@~1.8.1:
resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==
event-emitter@^0.3.5:
version "0.3.5"
resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39"
integrity sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==
dependencies:
d "1"
es5-ext "~0.10.14"
event-target-shim@^5.0.0:
version "5.0.1"
resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789"
@@ -10330,6 +10403,13 @@ express@^4.17.1, express@^4.17.3, express@^4.18.2:
utils-merge "1.0.1"
vary "~1.1.2"
ext@^1.1.2:
version "1.7.0"
resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f"
integrity sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==
dependencies:
type "^2.7.2"
extend-shallow@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
@@ -10590,7 +10670,7 @@ fill-range@^7.0.1:
dependencies:
to-regex-range "^5.0.1"
finalhandler@1.2.0:
finalhandler@1.2.0, finalhandler@~1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32"
integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==
@@ -12432,6 +12512,11 @@ is-potential-custom-element-name@^1.0.1:
resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5"
integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==
is-promise@^2.2.2:
version "2.2.2"
resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1"
integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==
is-reference@1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7"
@@ -13749,7 +13834,7 @@ json5@^1.0.1, json5@^1.0.2:
dependencies:
minimist "^1.2.0"
jsonc-parser@3.2.0, jsonc-parser@^3.0.0:
jsonc-parser@3.2.0, jsonc-parser@^3.0.0, jsonc-parser@^3.2.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76"
integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==
@@ -14314,6 +14399,13 @@ lru-cache@^7.4.4, lru-cache@^7.5.1, lru-cache@^7.7.1:
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.0.0.tgz#b9e2a6a72a129d81ab317202d93c7691df727e61"
integrity sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==
lru-queue@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3"
integrity sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==
dependencies:
es5-ext "~0.10.2"
lunr@^2.3.9:
version "2.3.9"
resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.9.tgz#18b123142832337dd6e964df1a5a7707b25d35e1"
@@ -14464,7 +14556,7 @@ markdown-extensions@^1.0.0:
resolved "https://registry.yarnpkg.com/markdown-extensions/-/markdown-extensions-1.1.1.tgz#fea03b539faeaee9b4ef02a3769b455b189f7fc3"
integrity sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==
marked@^4.0.16:
marked@^4.0.16, marked@^4.3.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/marked/-/marked-4.3.0.tgz#796362821b019f734054582038b116481b456cf3"
integrity sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==
@@ -14662,6 +14754,20 @@ memfs@^3.1.2, memfs@^3.2.2, memfs@^3.4.1, memfs@^3.4.3:
dependencies:
fs-monkey "^1.0.4"
memoizee@^0.4.15:
version "0.4.15"
resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.15.tgz#e6f3d2da863f318d02225391829a6c5956555b72"
integrity sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==
dependencies:
d "^1.0.1"
es5-ext "^0.10.53"
es6-weak-map "^2.0.3"
event-emitter "^0.3.5"
is-promise "^2.2.2"
lru-queue "^0.1.0"
next-tick "^1.1.0"
timers-ext "^0.1.7"
memoizerific@^1.11.3:
version "1.11.3"
resolved "https://registry.yarnpkg.com/memoizerific/-/memoizerific-1.11.3.tgz#7c87a4646444c32d75438570905f2dbd1b1a805a"
@@ -15195,7 +15301,7 @@ minimist-options@4.1.0:
is-plain-obj "^1.1.0"
kind-of "^6.0.3"
minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5, minimist@^1.2.6:
minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5, minimist@^1.2.6, minimist@~1.2.0:
version "1.2.8"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c"
integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
@@ -15505,6 +15611,11 @@ nested-error-stacks@^2.0.0, nested-error-stacks@^2.1.0:
resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-2.1.1.tgz#26c8a3cee6cc05fbcf1e333cd2fc3e003326c0b5"
integrity sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==
next-tick@1, next-tick@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb"
integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==
nice-try@^1.0.4:
version "1.0.5"
resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
@@ -15632,6 +15743,22 @@ node-releases@^2.0.12:
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.12.tgz#35627cc224a23bfb06fb3380f2b3afaaa7eb1039"
integrity sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==
nodemon@3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-3.0.1.tgz#affe822a2c5f21354466b2fc8ae83277d27dadc7"
integrity sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==
dependencies:
chokidar "^3.5.2"
debug "^3.2.7"
ignore-by-default "^1.0.1"
minimatch "^3.1.2"
pstree.remy "^1.1.8"
semver "^7.5.3"
simple-update-notifier "^2.0.0"
supports-color "^5.5.0"
touch "^3.1.0"
undefsafe "^2.0.5"
nodemon@^2.0.21:
version "2.0.22"
resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.22.tgz#182c45c3a78da486f673d6c1702e00728daf5258"
@@ -16143,7 +16270,7 @@ open@^7.0.3:
is-docker "^2.0.0"
is-wsl "^2.1.1"
open@^8.0.9, open@^8.4.0:
open@^8.0.0, open@^8.0.9, open@^8.4.0:
version "8.4.2"
resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9"
integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==
@@ -18108,6 +18235,20 @@ relateurl@^0.2.7:
resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9"
integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==
reload@^3.2.1:
version "3.2.1"
resolved "https://registry.yarnpkg.com/reload/-/reload-3.2.1.tgz#42d43e33e327efe1348c723272c6835fe333349a"
integrity sha512-ZdM8ZSEeI72zkhh6heMEvJ0vHZoovZXcJI6Zae8CzS7o5vO/WjZsAMMr0y1+3I/fCN7y7ZxABoUwwCswcLHkjQ==
dependencies:
cli-color "~2.0.0"
commander "~9.4.0"
finalhandler "~1.2.0"
minimist "~1.2.0"
open "^8.0.0"
serve-static "~1.15.0"
supervisor "~0.12.0"
ws "~8.11.0"
remark-external-links@^8.0.0:
version "8.0.0"
resolved "https://registry.yarnpkg.com/remark-external-links/-/remark-external-links-8.0.0.tgz#308de69482958b5d1cd3692bc9b725ce0240f345"
@@ -18730,7 +18871,7 @@ serve-index@^1.9.1:
mime-types "~2.1.17"
parseurl "~1.3.2"
serve-static@1.15.0:
serve-static@1.15.0, serve-static@~1.15.0:
version "1.15.0"
resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540"
integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==
@@ -18851,6 +18992,16 @@ shiki@^0.10.1:
vscode-oniguruma "^1.6.1"
vscode-textmate "5.2.0"
shiki@^0.14.1:
version "0.14.3"
resolved "https://registry.yarnpkg.com/shiki/-/shiki-0.14.3.tgz#d1a93c463942bdafb9866d74d619a4347d0bbf64"
integrity sha512-U3S/a+b0KS+UkTyMjoNojvTgrBHjgp7L6ovhFVZsXmBGnVdQ4K4U9oK0z63w538S91ATngv1vXigHCSWOwnr+g==
dependencies:
ansi-sequence-parser "^1.1.0"
jsonc-parser "^3.2.0"
vscode-oniguruma "^1.7.0"
vscode-textmate "^8.0.0"
side-channel@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf"
@@ -18908,6 +19059,13 @@ simple-update-notifier@^1.0.7:
dependencies:
semver "~7.0.0"
simple-update-notifier@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz#d70b92bdab7d6d90dfd73931195a30b6e3d7cebb"
integrity sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==
dependencies:
semver "^7.5.3"
sisteransi@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed"
@@ -19527,6 +19685,11 @@ stylis@4.2.0:
resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51"
integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==
supervisor@~0.12.0:
version "0.12.0"
resolved "https://registry.yarnpkg.com/supervisor/-/supervisor-0.12.0.tgz#de7e6337015b291851c10f3538c4a7f04917ecc1"
integrity sha512-iBYeU5Or4WiiIa3+ns1DpHIiHjNNXSuYUiixKcznewwo4ImBJ8EobktaAo2csOcauhrz4SvKRTou8Z2C3W28+A==
supports-color@8.1.1, supports-color@^8.0.0:
version "8.1.1"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c"
@@ -19847,6 +20010,14 @@ timers-browserify@^2.0.4:
dependencies:
setimmediate "^1.0.4"
timers-ext@^0.1.7:
version "0.1.7"
resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.7.tgz#6f57ad8578e07a3fb9f91d9387d65647555e25c6"
integrity sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==
dependencies:
es5-ext "~0.10.46"
next-tick "1"
tiny-warning@^1.0.2:
version "1.0.3"
resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754"
@@ -20237,6 +20408,16 @@ type-is@~1.6.18:
media-typer "0.3.0"
mime-types "~2.1.24"
type@^1.0.1:
version "1.2.0"
resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0"
integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==
type@^2.7.2:
version "2.7.2"
resolved "https://registry.yarnpkg.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0"
integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==
typed-array-length@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb"
@@ -20269,6 +20450,16 @@ typedoc@^0.22.13:
minimatch "^5.1.0"
shiki "^0.10.1"
typedoc@^0.24.8:
version "0.24.8"
resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.24.8.tgz#cce9f47ba6a8d52389f5e583716a2b3b4335b63e"
integrity sha512-ahJ6Cpcvxwaxfu4KtjA8qZNqS43wYt6JL27wYiIgl1vd38WW/KWX11YuAeZhuz9v+ttrutSsgK+XO1CjL1kA3w==
dependencies:
lunr "^2.3.9"
marked "^4.3.0"
minimatch "^9.0.0"
shiki "^0.14.1"
"typescript@^3 || ^4", typescript@^4.6.2, typescript@^4.8.4:
version "4.9.5"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a"
@@ -20850,7 +21041,7 @@ vm-browserify@^1.0.1:
resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0"
integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==
vscode-oniguruma@^1.6.1:
vscode-oniguruma@^1.6.1, vscode-oniguruma@^1.7.0:
version "1.7.0"
resolved "https://registry.yarnpkg.com/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz#439bfad8fe71abd7798338d1cd3dc53a8beea94b"
integrity sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==
@@ -20860,6 +21051,11 @@ vscode-textmate@5.2.0:
resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-5.2.0.tgz#01f01760a391e8222fe4f33fbccbd1ad71aed74e"
integrity sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==
vscode-textmate@^8.0.0:
version "8.0.0"
resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-8.0.0.tgz#2c7a3b1163ef0441097e0b5d6389cd5504b59e5d"
integrity sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==
w3c-hr-time@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd"
@@ -21416,6 +21612,11 @@ ws@^8.13.0, ws@^8.2.3:
resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0"
integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==
ws@~8.11.0:
version "8.11.0"
resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143"
integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==
x-default-browser@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/x-default-browser/-/x-default-browser-0.4.0.tgz#70cf0da85da7c0ab5cb0f15a897f2322a6bdd481"