From f6950bac0fbe139df990d8710eac3b73991160d2 Mon Sep 17 00:00:00 2001 From: Anwarul Islam Date: Sat, 28 May 2022 15:35:41 +0600 Subject: [PATCH] refactor: real-time system (#2228) Co-authored-by: Andrew Bastin Co-authored-by: liyasthomas --- packages/hoppscotch-app/assets/icons/send.svg | 4 + .../components/app/PaneLayout.vue | 7 +- .../components/realtime/Communication.vue | 221 +++++ .../components/realtime/Log.vue | 3 +- .../components/realtime/LogEntry.vue | 38 +- .../components/realtime/Mqtt.vue | 487 +++++------ .../components/realtime/Socketio.vue | 776 ++++++++---------- .../components/realtime/Sse.vue | 283 +++---- .../components/realtime/Websocket.vue | 687 +++++++--------- .../helpers/editor/codemirror.ts | 21 +- .../helpers/realtime/MQTTConnection.ts | 223 +++++ .../helpers/realtime/SIOClients.ts | 84 ++ .../helpers/realtime/SIOConnection.ts | 163 ++++ .../helpers/realtime/SSEConnection.ts | 86 ++ .../helpers/realtime/WSConnection.ts | 102 +++ .../helpers/types/HoppRealtimeLog.ts | 3 +- packages/hoppscotch-app/locales/en.json | 17 +- .../hoppscotch-app/newstore/MQTTSession.ts | 48 +- .../hoppscotch-app/newstore/SSESession.ts | 45 +- .../newstore/SocketIOSession.ts | 45 +- .../newstore/WebSocketSession.ts | 42 +- packages/hoppscotch-app/package.json | 1 + .../hoppscotch-app/types/socket-io-2.d.ts | 19 +- pnpm-lock.yaml | 552 ++++--------- 24 files changed, 2138 insertions(+), 1819 deletions(-) create mode 100644 packages/hoppscotch-app/assets/icons/send.svg create mode 100644 packages/hoppscotch-app/components/realtime/Communication.vue create mode 100644 packages/hoppscotch-app/helpers/realtime/MQTTConnection.ts create mode 100644 packages/hoppscotch-app/helpers/realtime/SIOClients.ts create mode 100644 packages/hoppscotch-app/helpers/realtime/SIOConnection.ts create mode 100644 packages/hoppscotch-app/helpers/realtime/SSEConnection.ts create mode 100644 packages/hoppscotch-app/helpers/realtime/WSConnection.ts diff --git a/packages/hoppscotch-app/assets/icons/send.svg b/packages/hoppscotch-app/assets/icons/send.svg new file mode 100644 index 00000000..b1de9a99 --- /dev/null +++ b/packages/hoppscotch-app/assets/icons/send.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/packages/hoppscotch-app/components/app/PaneLayout.vue b/packages/hoppscotch-app/components/app/PaneLayout.vue index 0fbb9238..e5b0f707 100644 --- a/packages/hoppscotch-app/components/app/PaneLayout.vue +++ b/packages/hoppscotch-app/components/app/PaneLayout.vue @@ -28,7 +28,7 @@ !!slots.sidebar) diff --git a/packages/hoppscotch-app/components/realtime/Communication.vue b/packages/hoppscotch-app/components/realtime/Communication.vue new file mode 100644 index 00000000..b96a634f --- /dev/null +++ b/packages/hoppscotch-app/components/realtime/Communication.vue @@ -0,0 +1,221 @@ + + diff --git a/packages/hoppscotch-app/components/realtime/Log.vue b/packages/hoppscotch-app/components/realtime/Log.vue index e46dc21d..eb7ec006 100644 --- a/packages/hoppscotch-app/components/realtime/Log.vue +++ b/packages/hoppscotch-app/components/realtime/Log.vue @@ -61,7 +61,8 @@ import { useThrottleFn, useScroll } from "@vueuse/core" import { useI18n } from "~/helpers/utils/composables" export type LogEntryData = { - ts: number + prefix?: string + ts: number | undefined source: "info" | "client" | "server" | "disconnected" payload: string event: "connecting" | "connected" | "disconnected" | "error" diff --git a/packages/hoppscotch-app/components/realtime/LogEntry.vue b/packages/hoppscotch-app/components/realtime/LogEntry.vue index e9389e42..56a8537b 100644 --- a/packages/hoppscotch-app/components/realtime/LogEntry.vue +++ b/packages/hoppscotch-app/components/realtime/LogEntry.vue @@ -11,7 +11,10 @@ @click.native="copyQuery(entry.payload)" /> - @@ -56,14 +61,14 @@ - diff --git a/packages/hoppscotch-app/components/realtime/Socketio.vue b/packages/hoppscotch-app/components/realtime/Socketio.vue index 79623d22..fc02f857 100644 --- a/packages/hoppscotch-app/components/realtime/Socketio.vue +++ b/packages/hoppscotch-app/components/realtime/Socketio.vue @@ -23,13 +23,16 @@ class="flex px-4 py-2 font-semibold border rounded-l cursor-pointer bg-primaryLight border-divider text-secondaryDark w-26" :value="`Client ${clientVersion}`" readonly - :disabled="connectionState" + :disabled=" + connectionState === 'CONNECTED' || + connectionState === 'CONNECTING' + " /> -
- - - - - - - -
- - {{ $t("state.enabled") }} - - - -
-
-
- - - This SocketIO connection does not use any authentication. - - -
-
-
-
- -
-
-
-
-
- {{ $t("helpers.authorization") }} + + + +
+ + + + + + + +
+ + {{ t("state.enabled") }} + + +
- +
+ + + {{ t("socketio.connection_not_authorized") }} + +
-
-
+
+
+
+ +
+
+
+
+
+ {{ t("helpers.authorization") }} +
+ +
+
+
+ + - - diff --git a/packages/hoppscotch-app/components/realtime/Sse.vue b/packages/hoppscotch-app/components/realtime/Sse.vue index ac5ca388..d9b4a713 100644 --- a/packages/hoppscotch-app/components/realtime/Sse.vue +++ b/packages/hoppscotch-app/components/realtime/Sse.vue @@ -11,11 +11,13 @@ v-model="server" type="url" autocomplete="off" - :class="{ error: !serverValid }" + :class="{ error: !isUrlValid }" class="flex flex-1 w-full px-4 py-2 border rounded-l bg-primaryLight border-divider text-secondaryDark" :placeholder="$t('sse.url')" - :disabled="connectionSSEState" - @keyup.enter="serverValid ? toggleSSEConnection() : null" + :disabled=" + connectionState === 'STARTED' || connectionState === 'STARTING' + " + @keyup.enter="isUrlValid ? toggleSSEConnection() : null" />
@@ -56,11 +62,10 @@ - diff --git a/packages/hoppscotch-app/components/realtime/Websocket.vue b/packages/hoppscotch-app/components/realtime/Websocket.vue index 9ac8705a..ecf21fe4 100644 --- a/packages/hoppscotch-app/components/realtime/Websocket.vue +++ b/packages/hoppscotch-app/components/realtime/Websocket.vue @@ -12,133 +12,156 @@ type="url" autocomplete="off" spellcheck="false" - :class="{ error: !urlValid }" - :placeholder="$t('websocket.url')" - :disabled="connectionState" - @keyup.enter="urlValid ? toggleConnection() : null" + :class="{ error: !isUrlValid }" + :placeholder="`${t('websocket.url')}`" + :disabled=" + connectionState === 'CONNECTED' || + connectionState === 'CONNECTING' + " + @keyup.enter="isUrlValid ? toggleConnection() : null" />
-
- -
- - -
-
- -
- - + + +
+ +
+ + +
+
+ +
+ + + + + + + + + + +
+
+
+ - - - - - - - - -
- -
- - {{ $t("empty.protocols") }} -
+ + {{ t("empty.protocols") }} + +
+ + - - - diff --git a/packages/hoppscotch-app/helpers/editor/codemirror.ts b/packages/hoppscotch-app/helpers/editor/codemirror.ts index fd7b25c1..7e6ed56f 100644 --- a/packages/hoppscotch-app/helpers/editor/codemirror.ts +++ b/packages/hoppscotch-app/helpers/editor/codemirror.ts @@ -28,8 +28,6 @@ import { javascriptLanguage } from "@codemirror/lang-javascript" import { xmlLanguage } from "@codemirror/lang-xml" import { jsonLanguage } from "@codemirror/lang-json" import { GQLLanguage } from "@hoppscotch/codemirror-lang-graphql" -import { pipe } from "fp-ts/function" -import * as O from "fp-ts/Option" import { StreamLanguage } from "@codemirror/stream-parser" import { html } from "@codemirror/legacy-modes/mode/xml" import { shell } from "@codemirror/legacy-modes/mode/shell" @@ -96,8 +94,10 @@ const hoppCompleterExt = (completer: Completer): Extension => { }) } -const hoppLinterExt = (hoppLinter: LinterDefinition): Extension => { +const hoppLinterExt = (hoppLinter: LinterDefinition | undefined): Extension => { return linter(async (view) => { + if (!hoppLinter) return [] + // Requires full document scan, hence expensive on big files, force disable on big files ? const linterResult = await hoppLinter( view.state.doc.toJSON().join(view.state.lineBreak) @@ -119,16 +119,16 @@ const hoppLinterExt = (hoppLinter: LinterDefinition): Extension => { } const hoppLang = ( - language: Language, + language: Language | undefined, linter?: LinterDefinition | undefined, completer?: Completer | undefined -) => { +): Extension | LanguageSupport => { const exts: Extension[] = [] - if (linter) exts.push(hoppLinterExt(linter)) + exts.push(hoppLinterExt(linter)) if (completer) exts.push(hoppCompleterExt(completer)) - return new LanguageSupport(language, exts) + return language ? new LanguageSupport(language, exts) : exts } const getLanguage = (langMime: string): Language | null => { @@ -156,12 +156,7 @@ const getEditorLanguage = ( langMime: string, linter: LinterDefinition | undefined, completer: Completer | undefined -): Extension => - pipe( - O.fromNullable(getLanguage(langMime)), - O.map((lang) => hoppLang(lang, linter, completer)), - O.getOrElseW(() => []) - ) +): Extension => hoppLang(getLanguage(langMime) ?? undefined, linter, completer) export function useCodemirror( el: Ref, diff --git a/packages/hoppscotch-app/helpers/realtime/MQTTConnection.ts b/packages/hoppscotch-app/helpers/realtime/MQTTConnection.ts new file mode 100644 index 00000000..978663d5 --- /dev/null +++ b/packages/hoppscotch-app/helpers/realtime/MQTTConnection.ts @@ -0,0 +1,223 @@ +import Paho, { ConnectionOptions } from "paho-mqtt" +import { BehaviorSubject, Subject } from "rxjs" +import { logHoppRequestRunToAnalytics } from "../fb/analytics" + +export type MQTTMessage = { topic: string; message: string } +export type MQTTError = + | { type: "CONNECTION_NOT_ESTABLISHED"; value: unknown } + | { type: "CONNECTION_LOST" } + | { type: "CONNECTION_FAILED" } + | { type: "SUBSCRIPTION_FAILED"; topic: string } + | { type: "PUBLISH_ERROR"; topic: string; message: string } + +export type MQTTEvent = { time: number } & ( + | { type: "CONNECTING" } + | { type: "CONNECTED" } + | { type: "MESSAGE_SENT"; message: MQTTMessage } + | { type: "SUBSCRIBED"; topic: string } + | { type: "SUBSCRIPTION_FAILED"; topic: string } + | { type: "MESSAGE_RECEIVED"; message: MQTTMessage } + | { type: "DISCONNECTED"; manual: boolean } + | { type: "ERROR"; error: MQTTError } +) + +export type ConnectionState = "CONNECTING" | "CONNECTED" | "DISCONNECTED" + +export class MQTTConnection { + subscriptionState$ = new BehaviorSubject(false) + connectionState$ = new BehaviorSubject("DISCONNECTED") + event$: Subject = new Subject() + + private mqttClient: Paho.Client | undefined + private manualDisconnect = false + + private addEvent(event: MQTTEvent) { + this.event$.next(event) + } + + connect(url: string, username: string, password: string) { + try { + this.connectionState$.next("CONNECTING") + + this.addEvent({ + time: Date.now(), + type: "CONNECTING", + }) + + const parseUrl = new URL(url) + const { hostname, pathname, port } = parseUrl + this.mqttClient = new Paho.Client( + `${hostname + (pathname !== "/" ? pathname : "")}`, + port !== "" ? Number(port) : 8081, + "hoppscotch" + ) + const connectOptions: ConnectionOptions = { + onSuccess: this.onConnectionSuccess.bind(this), + onFailure: this.onConnectionFailure.bind(this), + useSSL: parseUrl.protocol !== "ws:", + } + if (username !== "") { + connectOptions.userName = username + } + if (password !== "") { + connectOptions.password = password + } + this.mqttClient.connect(connectOptions) + this.mqttClient.onConnectionLost = this.onConnectionLost.bind(this) + this.mqttClient.onMessageArrived = this.onMessageArrived.bind(this) + } catch (e) { + this.handleError(e) + } + + logHoppRequestRunToAnalytics({ + platform: "mqtt", + }) + } + + onConnectionFailure() { + this.connectionState$.next("DISCONNECTED") + this.addEvent({ + time: Date.now(), + type: "ERROR", + error: { + type: "CONNECTION_FAILED", + }, + }) + } + + onConnectionSuccess() { + this.connectionState$.next("CONNECTED") + this.addEvent({ + type: "CONNECTED", + time: Date.now(), + }) + } + + onConnectionLost() { + this.connectionState$.next("DISCONNECTED") + if (this.manualDisconnect) { + this.addEvent({ + time: Date.now(), + type: "DISCONNECTED", + manual: this.manualDisconnect, + }) + } else { + this.addEvent({ + time: Date.now(), + type: "ERROR", + error: { + type: "CONNECTION_LOST", + }, + }) + } + this.manualDisconnect = false + this.subscriptionState$.next(false) + } + + onMessageArrived({ + payloadString: message, + destinationName: topic, + }: { + payloadString: string + destinationName: string + }) { + this.addEvent({ + time: Date.now(), + type: "MESSAGE_RECEIVED", + message: { + topic, + message, + }, + }) + } + + private handleError(error: unknown) { + this.disconnect() + this.addEvent({ + time: Date.now(), + type: "ERROR", + error: { + type: "CONNECTION_NOT_ESTABLISHED", + value: error, + }, + }) + } + + publish(topic: string, message: string) { + if (this.connectionState$.value === "DISCONNECTED") return + + try { + // it was publish + this.mqttClient?.send(topic, message, 0, false) + this.addEvent({ + time: Date.now(), + type: "MESSAGE_SENT", + message: { + topic, + message, + }, + }) + } catch (e) { + this.addEvent({ + time: Date.now(), + type: "ERROR", + error: { + type: "PUBLISH_ERROR", + topic, + message, + }, + }) + } + } + + subscribe(topic: string) { + try { + this.mqttClient?.subscribe(topic, { + onSuccess: this.usubSuccess.bind(this, topic), + onFailure: this.usubFailure.bind(this, topic), + }) + } catch (e) { + this.addEvent({ + time: Date.now(), + type: "ERROR", + error: { + type: "SUBSCRIPTION_FAILED", + topic, + }, + }) + } + } + + usubSuccess(topic: string) { + this.subscriptionState$.next(!this.subscriptionState$.value) + this.addEvent({ + time: Date.now(), + type: "SUBSCRIBED", + topic, + }) + } + + usubFailure(topic: string) { + this.addEvent({ + time: Date.now(), + type: "ERROR", + error: { + type: "SUBSCRIPTION_FAILED", + topic, + }, + }) + } + + unsubscribe(topic: string) { + this.mqttClient?.unsubscribe(topic, { + onSuccess: this.usubSuccess.bind(this, topic), + onFailure: this.usubFailure.bind(this, topic), + }) + } + + disconnect() { + this.manualDisconnect = true + this.mqttClient?.disconnect() + this.connectionState$.next("DISCONNECTED") + } +} diff --git a/packages/hoppscotch-app/helpers/realtime/SIOClients.ts b/packages/hoppscotch-app/helpers/realtime/SIOClients.ts new file mode 100644 index 00000000..c0a9fc20 --- /dev/null +++ b/packages/hoppscotch-app/helpers/realtime/SIOClients.ts @@ -0,0 +1,84 @@ +import wildcard from "socketio-wildcard" +import ClientV2 from "socket.io-client-v2" +import { io as ClientV4, Socket as SocketV4 } from "socket.io-client-v4" +import { io as ClientV3, Socket as SocketV3 } from "socket.io-client-v3" + +type Options = { + path: string + auth: { + token: string | undefined + } +} + +type PossibleEvent = + | "connect" + | "connect_error" + | "reconnect_error" + | "error" + | "disconnect" + | "*" + +export interface SIOClient { + connect(url: string, opts?: Options): void + on(event: PossibleEvent, cb: (data: any) => void): void + emit(event: string, data: any, cb: (data: any) => void): void + close(): void +} + +export class SIOClientV4 implements SIOClient { + private client: SocketV4 | undefined + connect(url: string, opts?: Options) { + this.client = ClientV4(url, opts) + } + + on(event: PossibleEvent, cb: (data: any) => void) { + this.client?.on(event, cb) + } + + emit(event: string, data: any, cb: (data: any) => void): void { + this.client?.emit(event, data, cb) + } + + close(): void { + this.client?.close() + } +} + +export class SIOClientV3 implements SIOClient { + private client: SocketV3 | undefined + connect(url: string, opts?: Options) { + this.client = ClientV3(url, opts) + } + + on(event: PossibleEvent, cb: (data: any) => void): void { + this.client?.on(event, cb) + } + + emit(event: string, data: any, cb: (data: any) => void): void { + this.client?.emit(event, data, cb) + } + + close(): void { + this.client?.close() + } +} + +export class SIOClientV2 implements SIOClient { + private client: any | undefined + connect(url: string, opts?: Options) { + this.client = new ClientV2(url, opts) + wildcard(ClientV2.Manager)(this.client) + } + + on(event: PossibleEvent, cb: (data: any) => void): void { + this.client?.on(event, cb) + } + + emit(event: string, data: any, cb: (data: any) => void): void { + this.client?.emit(event, data, cb) + } + + close(): void { + this.client?.close() + } +} diff --git a/packages/hoppscotch-app/helpers/realtime/SIOConnection.ts b/packages/hoppscotch-app/helpers/realtime/SIOConnection.ts new file mode 100644 index 00000000..5f215685 --- /dev/null +++ b/packages/hoppscotch-app/helpers/realtime/SIOConnection.ts @@ -0,0 +1,163 @@ +import { BehaviorSubject, Subject } from "rxjs" +import { logHoppRequestRunToAnalytics } from "../fb/analytics" +import { SIOClientV2, SIOClientV3, SIOClientV4, SIOClient } from "./SIOClients" +import { SIOClientVersion } from "~/newstore/SocketIOSession" + +export const SOCKET_CLIENTS = { + v2: SIOClientV2, + v3: SIOClientV3, + v4: SIOClientV4, +} as const + +type SIOAuth = { type: "None" } | { type: "Bearer"; token: string } + +export type ConnectionOption = { + url: string + path: string + clientVersion: SIOClientVersion + auth: SIOAuth | undefined +} + +export type SIOMessage = { + eventName: string + value: unknown +} + +type SIOErrorType = "CONNECTION" | "RECONNECT_ERROR" | "UNKNOWN" +export type SIOError = { + type: SIOErrorType + value: unknown +} + +export type SIOEvent = { time: number } & ( + | { type: "CONNECTING" } + | { type: "CONNECTED" } + | { type: "MESSAGE_SENT"; message: SIOMessage } + | { type: "MESSAGE_RECEIVED"; message: SIOMessage } + | { type: "DISCONNECTED"; manual: boolean } + | { type: "ERROR"; error: SIOError } +) + +export type ConnectionState = "CONNECTING" | "CONNECTED" | "DISCONNECTED" + +export class SIOConnection { + connectionState$: BehaviorSubject + event$: Subject = new Subject() + socket: SIOClient | undefined + constructor() { + this.connectionState$ = new BehaviorSubject("DISCONNECTED") + } + + private addEvent(event: SIOEvent) { + this.event$.next(event) + } + + connect({ url, path, clientVersion, auth }: ConnectionOption) { + this.connectionState$.next("CONNECTING") + this.addEvent({ + time: Date.now(), + type: "CONNECTING", + }) + try { + this.socket = new SOCKET_CLIENTS[clientVersion]() + + if (auth?.type === "Bearer") { + this.socket.connect(url, { + path, + auth: { + token: auth.token, + }, + }) + } else { + this.socket.connect(url) + } + + this.socket.on("connect", () => { + this.connectionState$.next("CONNECTED") + this.addEvent({ + type: "CONNECTED", + time: Date.now(), + }) + }) + + this.socket.on("*", ({ data }: { data: string[] }) => { + const [eventName, message] = data + this.addEvent({ + message: { eventName, value: message }, + type: "MESSAGE_RECEIVED", + time: Date.now(), + }) + }) + + this.socket.on("connect_error", (error: unknown) => { + this.handleError(error, "CONNECTION") + }) + + this.socket.on("reconnect_error", (error: unknown) => { + this.handleError(error, "RECONNECT_ERROR") + }) + + this.socket.on("error", (error: unknown) => { + this.handleError(error, "UNKNOWN") + }) + + this.socket.on("disconnect", () => { + this.connectionState$.next("DISCONNECTED") + this.addEvent({ + type: "DISCONNECTED", + time: Date.now(), + manual: true, + }) + }) + } catch (error) { + this.handleError(error, "CONNECTION") + } + + logHoppRequestRunToAnalytics({ + platform: "socketio", + }) + } + + private handleError(error: unknown, type: SIOErrorType) { + this.disconnect() + this.addEvent({ + time: Date.now(), + type: "ERROR", + error: { + type, + value: error, + }, + }) + } + + sendMessage(event: { message: string; eventName: string }) { + if (this.connectionState$.value === "DISCONNECTED") return + const { message, eventName } = event + + this.socket?.emit(eventName, message, (data) => { + // receive response from server + this.addEvent({ + time: Date.now(), + type: "MESSAGE_RECEIVED", + message: { + eventName, + value: data, + }, + }) + }) + + this.addEvent({ + time: Date.now(), + type: "MESSAGE_SENT", + message: { + eventName, + value: message, + }, + }) + } + + disconnect() { + this.socket?.close() + this.connectionState$.next("DISCONNECTED") + } +} diff --git a/packages/hoppscotch-app/helpers/realtime/SSEConnection.ts b/packages/hoppscotch-app/helpers/realtime/SSEConnection.ts new file mode 100644 index 00000000..54acb257 --- /dev/null +++ b/packages/hoppscotch-app/helpers/realtime/SSEConnection.ts @@ -0,0 +1,86 @@ +import { BehaviorSubject, Subject } from "rxjs" +import { logHoppRequestRunToAnalytics } from "../fb/analytics" + +export type SSEEvent = { time: number } & ( + | { type: "STARTING" } + | { type: "STARTED" } + | { type: "MESSAGE_RECEIVED"; message: string } + | { type: "STOPPED"; manual: boolean } + | { type: "ERROR"; error: Event | null } +) + +export type ConnectionState = "STARTING" | "STARTED" | "STOPPED" + +export class SSEConnection { + connectionState$: BehaviorSubject + event$: Subject = new Subject() + sse: EventSource | undefined + constructor() { + this.connectionState$ = new BehaviorSubject("STOPPED") + } + + private addEvent(event: SSEEvent) { + this.event$.next(event) + } + + start(url: string, eventType: string) { + this.connectionState$.next("STARTING") + this.addEvent({ + time: Date.now(), + type: "STARTING", + }) + if (typeof EventSource !== "undefined") { + try { + this.sse = new EventSource(url) + this.sse.onopen = () => { + this.connectionState$.next("STARTED") + this.addEvent({ + type: "STARTED", + time: Date.now(), + }) + } + this.sse.onerror = this.handleError + this.sse.addEventListener(eventType, ({ data }) => { + this.addEvent({ + type: "MESSAGE_RECEIVED", + message: data, + time: Date.now(), + }) + }) + } catch (error) { + // A generic event type returned if anything goes wrong or browser doesn't support SSE + // https://developer.mozilla.org/en-US/docs/Web/API/EventSource/error_event#event_type + this.handleError(error as Event) + } + } else { + this.addEvent({ + type: "ERROR", + time: Date.now(), + error: null, + }) + } + + logHoppRequestRunToAnalytics({ + platform: "sse", + }) + } + + private handleError(error: Event) { + this.stop() + this.addEvent({ + time: Date.now(), + type: "ERROR", + error, + }) + } + + stop() { + this.sse?.close() + this.connectionState$.next("STOPPED") + this.addEvent({ + type: "STOPPED", + time: Date.now(), + manual: true, + }) + } +} diff --git a/packages/hoppscotch-app/helpers/realtime/WSConnection.ts b/packages/hoppscotch-app/helpers/realtime/WSConnection.ts new file mode 100644 index 00000000..f0c4a161 --- /dev/null +++ b/packages/hoppscotch-app/helpers/realtime/WSConnection.ts @@ -0,0 +1,102 @@ +import { BehaviorSubject, Subject } from "rxjs" +import { logHoppRequestRunToAnalytics } from "../fb/analytics" + +export type WSErrorMessage = SyntaxError | Event + +export type WSEvent = { time: number } & ( + | { type: "CONNECTING" } + | { type: "CONNECTED" } + | { type: "MESSAGE_SENT"; message: string } + | { type: "MESSAGE_RECEIVED"; message: string } + | { type: "DISCONNECTED"; manual: boolean } + | { type: "ERROR"; error: WSErrorMessage } +) + +export type ConnectionState = "CONNECTING" | "CONNECTED" | "DISCONNECTED" + +export class WSConnection { + connectionState$: BehaviorSubject + event$: Subject = new Subject() + socket: WebSocket | undefined + + constructor() { + this.connectionState$ = new BehaviorSubject("DISCONNECTED") + } + + private addEvent(event: WSEvent) { + this.event$.next(event) + } + + connect(url: string, protocols: string[]) { + try { + this.connectionState$.next("CONNECTING") + this.socket = new WebSocket(url, protocols) + + this.addEvent({ + time: Date.now(), + type: "CONNECTING", + }) + + this.socket.onopen = () => { + this.connectionState$.next("CONNECTED") + this.addEvent({ + type: "CONNECTED", + time: Date.now(), + }) + } + + this.socket.onerror = (error) => { + this.handleError(error) + } + + this.socket.onclose = () => { + this.connectionState$.next("DISCONNECTED") + this.addEvent({ + type: "DISCONNECTED", + time: Date.now(), + manual: true, + }) + } + + this.socket.onmessage = ({ data }) => { + this.addEvent({ + time: Date.now(), + type: "MESSAGE_RECEIVED", + message: data, + }) + } + } catch (error) { + // We will have SyntaxError if anything goes wrong with WebSocket constructor + // See https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/WebSocket#exceptions + this.handleError(error as SyntaxError) + } + + logHoppRequestRunToAnalytics({ + platform: "wss", + }) + } + + private handleError(error: WSErrorMessage) { + this.disconnect() + this.addEvent({ + time: Date.now(), + type: "ERROR", + error, + }) + } + + sendMessage(event: { message: string; eventName: string }) { + if (this.connectionState$.value === "DISCONNECTED") return + const { message } = event + this.socket?.send(message) + this.addEvent({ + time: Date.now(), + type: "MESSAGE_SENT", + message, + }) + } + + disconnect() { + this.socket?.close() + } +} diff --git a/packages/hoppscotch-app/helpers/types/HoppRealtimeLog.ts b/packages/hoppscotch-app/helpers/types/HoppRealtimeLog.ts index 4132a487..9756fce7 100644 --- a/packages/hoppscotch-app/helpers/types/HoppRealtimeLog.ts +++ b/packages/hoppscotch-app/helpers/types/HoppRealtimeLog.ts @@ -1,8 +1,9 @@ export type HoppRealtimeLogLine = { + prefix?: string payload: string source: string color?: string - ts: string + ts: number | undefined } export type HoppRealtimeLog = HoppRealtimeLogLine[] diff --git a/packages/hoppscotch-app/locales/en.json b/packages/hoppscotch-app/locales/en.json index 458ac5f1..8b5ab871 100644 --- a/packages/hoppscotch-app/locales/en.json +++ b/packages/hoppscotch-app/locales/en.json @@ -508,7 +508,8 @@ "event_name": "Event Name", "events": "Events", "log": "Log", - "url": "URL" + "url": "URL", + "connection_not_authorized": "This SocketIO connection does not use any authentication." }, "sse": { "event_type": "Event type", @@ -538,7 +539,19 @@ "loading": "Loading...", "none": "None", "nothing_found": "Nothing found for", - "waiting_send_request": "Waiting to send request" + "waiting_send_request": "Waiting to send request", + "subscribed_success": "Successfully subscribed to topic: {topic}", + "unsubscribed_success": "Successfully unsubscribed from topic: {topic}", + "subscribed_failed": "Failed to subscribe to topic: {topic}", + "unsubscribed_failed": "Failed to unsubscribe from topic: {topic}", + "published_message": "Published message: {message} to topic: {topic}", + "published_error": "Something went wrong while publishing msg: {topic} to topic: {message}", + "message_received": "Message: {message} arrived on topic: {topic}", + "mqtt_subscription_failed": "Something went wrong while subscribing to topic: {topic}", + "connection_lost": "Connection lost", + "connection_failed": "Connection failed", + "connection_error": "Failed to connect", + "reconnection_error": "Failed to reconnect" }, "support": { "changelog": "Read more about latest releases", diff --git a/packages/hoppscotch-app/newstore/MQTTSession.ts b/packages/hoppscotch-app/newstore/MQTTSession.ts index e6738270..cad1e8d6 100644 --- a/packages/hoppscotch-app/newstore/MQTTSession.ts +++ b/packages/hoppscotch-app/newstore/MQTTSession.ts @@ -1,6 +1,6 @@ -import { pluck, distinctUntilChanged } from "rxjs/operators" -import { Client as MQTTClient } from "paho-mqtt" +import { distinctUntilChanged, pluck } from "rxjs/operators" import DispatchingStore, { defineDispatchers } from "./DispatchingStore" +import { MQTTConnection } from "~/helpers/realtime/MQTTConnection" import { HoppRealtimeLog, HoppRealtimeLogLine, @@ -12,11 +12,9 @@ type HoppMQTTRequest = { type HoppMQTTSession = { request: HoppMQTTRequest - connectingState: boolean - connectionState: boolean subscriptionState: boolean log: HoppRealtimeLog - socket: MQTTClient | null + socket: MQTTConnection } const defaultMQTTRequest: HoppMQTTRequest = { @@ -25,10 +23,8 @@ const defaultMQTTRequest: HoppMQTTRequest = { const defaultMQTTSession: HoppMQTTSession = { request: defaultMQTTRequest, - connectionState: false, - connectingState: false, subscriptionState: false, - socket: null, + socket: new MQTTConnection(), log: [], } @@ -48,21 +44,11 @@ const dispatchers = defineDispatchers({ }, } }, - setSocket(_: HoppMQTTSession, { socket }: { socket: MQTTClient }) { + setConn(_: HoppMQTTSession, { socket }: { socket: MQTTConnection }) { return { socket, } }, - setConnectionState(_: HoppMQTTSession, { state }: { state: boolean }) { - return { - connectionState: state, - } - }, - setConnectingState(_: HoppMQTTSession, { state }: { state: boolean }) { - return { - connectingState: state, - } - }, setSubscriptionState(_: HoppMQTTSession, { state }: { state: boolean }) { return { subscriptionState: state, @@ -100,33 +86,15 @@ export function setMQTTEndpoint(newEndpoint: string) { }) } -export function setMQTTSocket(socket: MQTTClient) { +export function setMQTTConn(socket: MQTTConnection) { MQTTSessionStore.dispatch({ - dispatcher: "setSocket", + dispatcher: "setConn", payload: { socket, }, }) } -export function setMQTTConnectionState(state: boolean) { - MQTTSessionStore.dispatch({ - dispatcher: "setConnectionState", - payload: { - state, - }, - }) -} - -export function setMQTTConnectingState(state: boolean) { - MQTTSessionStore.dispatch({ - dispatcher: "setConnectingState", - payload: { - state, - }, - }) -} - export function setMQTTSubscriptionState(state: boolean) { MQTTSessionStore.dispatch({ dispatcher: "setSubscriptionState", @@ -179,7 +147,7 @@ export const MQTTSubscriptionState$ = MQTTSessionStore.subject$.pipe( distinctUntilChanged() ) -export const MQTTSocket$ = MQTTSessionStore.subject$.pipe( +export const MQTTConn$ = MQTTSessionStore.subject$.pipe( pluck("socket"), distinctUntilChanged() ) diff --git a/packages/hoppscotch-app/newstore/SSESession.ts b/packages/hoppscotch-app/newstore/SSESession.ts index fec8770d..3577483a 100644 --- a/packages/hoppscotch-app/newstore/SSESession.ts +++ b/packages/hoppscotch-app/newstore/SSESession.ts @@ -4,6 +4,7 @@ import { HoppRealtimeLog, HoppRealtimeLogLine, } from "~/helpers/types/HoppRealtimeLog" +import { SSEConnection } from "~/helpers/realtime/SSEConnection" type HoppSSERequest = { endpoint: string @@ -12,10 +13,8 @@ type HoppSSERequest = { type HoppSSESession = { request: HoppSSERequest - connectingState: boolean - connectionState: boolean log: HoppRealtimeLog - socket: EventSource | null + socket: SSEConnection } const defaultSSERequest: HoppSSERequest = { @@ -25,9 +24,7 @@ const defaultSSERequest: HoppSSERequest = { const defaultSSESession: HoppSSESession = { request: defaultSSERequest, - connectionState: false, - connectingState: false, - socket: null, + socket: new SSEConnection(), log: [], } @@ -56,21 +53,11 @@ const dispatchers = defineDispatchers({ }, } }, - setSocket(_: HoppSSESession, { socket }: { socket: EventSource }) { + setSocket(_: HoppSSESession, { socket }: { socket: SSEConnection }) { return { socket, } }, - setConnectionState(_: HoppSSESession, { state }: { state: boolean }) { - return { - connectionState: state, - } - }, - setConnectingState(_: HoppSSESession, { state }: { state: boolean }) { - return { - connectingState: state, - } - }, setLog(_: HoppSSESession, { log }: { log: HoppRealtimeLog }) { return { log, @@ -112,7 +99,7 @@ export function setSSEEventType(newType: string) { }) } -export function setSSESocket(socket: EventSource) { +export function setSSESocket(socket: SSEConnection) { SSESessionStore.dispatch({ dispatcher: "setSocket", payload: { @@ -121,23 +108,6 @@ export function setSSESocket(socket: EventSource) { }) } -export function setSSEConnectionState(state: boolean) { - SSESessionStore.dispatch({ - dispatcher: "setConnectionState", - payload: { - state, - }, - }) -} -export function setSSEConnectingState(state: boolean) { - SSESessionStore.dispatch({ - dispatcher: "setConnectingState", - payload: { - state, - }, - }) -} - export function setSSELog(log: HoppRealtimeLog) { SSESessionStore.dispatch({ dispatcher: "setLog", @@ -176,11 +146,6 @@ export const SSEConnectingState$ = SSESessionStore.subject$.pipe( distinctUntilChanged() ) -export const SSEConnectionState$ = SSESessionStore.subject$.pipe( - pluck("connectionState"), - distinctUntilChanged() -) - export const SSESocket$ = SSESessionStore.subject$.pipe( pluck("socket"), distinctUntilChanged() diff --git a/packages/hoppscotch-app/newstore/SocketIOSession.ts b/packages/hoppscotch-app/newstore/SocketIOSession.ts index 4b3aa57a..f8561bde 100644 --- a/packages/hoppscotch-app/newstore/SocketIOSession.ts +++ b/packages/hoppscotch-app/newstore/SocketIOSession.ts @@ -10,16 +10,16 @@ import { type SocketIO = SocketV2 | SocketV3 | SocketV4 +export type SIOClientVersion = "v4" | "v3" | "v2" + type HoppSIORequest = { endpoint: string path: string - version: string + version: SIOClientVersion } type HoppSIOSession = { request: HoppSIORequest - connectingState: boolean - connectionState: boolean log: HoppRealtimeLog socket: SocketIO | null } @@ -32,8 +32,6 @@ const defaultSIORequest: HoppSIORequest = { const defaultSIOSession: HoppSIOSession = { request: defaultSIORequest, - connectionState: false, - connectingState: false, socket: null, log: [], } @@ -63,7 +61,10 @@ const dispatchers = defineDispatchers({ }, } }, - setVersion(curr: HoppSIOSession, { newVersion }: { newVersion: string }) { + setVersion( + curr: HoppSIOSession, + { newVersion }: { newVersion: SIOClientVersion } + ) { return { request: { ...curr.request, @@ -76,16 +77,6 @@ const dispatchers = defineDispatchers({ socket, } }, - setConnectionState(_: HoppSIOSession, { state }: { state: boolean }) { - return { - connectionState: state, - } - }, - setConnectingState(_: HoppSIOSession, { state }: { state: boolean }) { - return { - connectingState: state, - } - }, setLog(_: HoppSIOSession, { log }: { log: HoppRealtimeLog }) { return { log, @@ -145,23 +136,6 @@ export function setSIOSocket(socket: SocketIO) { }) } -export function setSIOConnectionState(state: boolean) { - SIOSessionStore.dispatch({ - dispatcher: "setConnectionState", - payload: { - state, - }, - }) -} -export function setSIOConnectingState(state: boolean) { - SIOSessionStore.dispatch({ - dispatcher: "setConnectingState", - payload: { - state, - }, - }) -} - export function setSIOLog(log: HoppRealtimeLog) { SIOSessionStore.dispatch({ dispatcher: "setLog", @@ -200,11 +174,6 @@ export const SIOPath$ = SIOSessionStore.subject$.pipe( distinctUntilChanged() ) -export const SIOConnectingState$ = SIOSessionStore.subject$.pipe( - pluck("connectingState"), - distinctUntilChanged() -) - export const SIOConnectionState$ = SIOSessionStore.subject$.pipe( pluck("connectionState"), distinctUntilChanged() diff --git a/packages/hoppscotch-app/newstore/WebSocketSession.ts b/packages/hoppscotch-app/newstore/WebSocketSession.ts index 9d2d7687..6f5759e0 100644 --- a/packages/hoppscotch-app/newstore/WebSocketSession.ts +++ b/packages/hoppscotch-app/newstore/WebSocketSession.ts @@ -4,8 +4,9 @@ import { HoppRealtimeLog, HoppRealtimeLogLine, } from "~/helpers/types/HoppRealtimeLog" +import { WSConnection } from "~/helpers/realtime/WSConnection" -type HoppWSProtocol = { +export type HoppWSProtocol = { value: string active: boolean } @@ -17,10 +18,8 @@ type HoppWSRequest = { export type HoppWSSession = { request: HoppWSRequest - connectingState: boolean - connectionState: boolean log: HoppRealtimeLog - socket: WebSocket | null + socket: WSConnection } const defaultWSRequest: HoppWSRequest = { @@ -30,9 +29,7 @@ const defaultWSRequest: HoppWSRequest = { const defaultWSSession: HoppWSSession = { request: defaultWSRequest, - connectionState: false, - connectingState: false, - socket: null, + socket: new WSConnection(), log: [], } @@ -101,21 +98,11 @@ const dispatchers = defineDispatchers({ }, } }, - setSocket(_: HoppWSSession, { socket }: { socket: WebSocket }) { + setSocket(_: HoppWSSession, { socket }: { socket: WSConnection }) { return { socket, } }, - setConnectionState(_: HoppWSSession, { state }: { state: boolean }) { - return { - connectionState: state, - } - }, - setConnectingState(_: HoppWSSession, { state }: { state: boolean }) { - return { - connectingState: state, - } - }, setLog(_: HoppWSSession, { log }: { log: HoppRealtimeLog }) { return { log, @@ -195,7 +182,7 @@ export function updateWSProtocol( }) } -export function setWSSocket(socket: WebSocket) { +export function setWSSocket(socket: WSConnection) { WSSessionStore.dispatch({ dispatcher: "setSocket", payload: { @@ -204,23 +191,6 @@ export function setWSSocket(socket: WebSocket) { }) } -export function setWSConnectionState(state: boolean) { - WSSessionStore.dispatch({ - dispatcher: "setConnectionState", - payload: { - state, - }, - }) -} -export function setWSConnectingState(state: boolean) { - WSSessionStore.dispatch({ - dispatcher: "setConnectingState", - payload: { - state, - }, - }) -} - export function setWSLog(log: HoppRealtimeLog) { WSSessionStore.dispatch({ dispatcher: "setLog", diff --git a/packages/hoppscotch-app/package.json b/packages/hoppscotch-app/package.json index 1a9547db..e69ce859 100644 --- a/packages/hoppscotch-app/package.json +++ b/packages/hoppscotch-app/package.json @@ -153,6 +153,7 @@ "@types/paho-mqtt": "^1.0.6", "@types/postman-collection": "^3.5.7", "@types/qs": "^6.9.7", + "@types/socketio-wildcard": "^2.0.4", "@types/splitpanes": "^2.2.1", "@types/uuid": "^8.3.4", "@types/yargs-parser": "^21.0.0", diff --git a/packages/hoppscotch-app/types/socket-io-2.d.ts b/packages/hoppscotch-app/types/socket-io-2.d.ts index 7302c540..533cab96 100644 --- a/packages/hoppscotch-app/types/socket-io-2.d.ts +++ b/packages/hoppscotch-app/types/socket-io-2.d.ts @@ -2,6 +2,21 @@ // tsc, this is really annoying (and maybe dangerous) // We don't have access to the 2.4.0 typings, hence we make do with this, // Check docs before you correct types again as you need -declare module "socket.io-client-v2" { - export type Socket = any + +type Options = { + path: string + auth: { + token: string | undefined + } +} + +declare module "socket.io-client-v2" { + export type Socket = unknown + export default class ClientV2 { + static Manager: { prototype: EventEmitter } | undefined + constructor(url: string, opts?: Options) + on(event: string, cb: (data: any) => void): void + emit(event: string, data: any, cb: (data: any) => void): void + close(): void + } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9e3b88c4..05d209fb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -112,6 +112,7 @@ importers: '@types/paho-mqtt': ^1.0.6 '@types/postman-collection': ^3.5.7 '@types/qs': ^6.9.7 + '@types/socketio-wildcard': ^2.0.4 '@types/splitpanes': ^2.2.1 '@types/uuid': ^8.3.4 '@types/yargs-parser': ^21.0.0 @@ -314,6 +315,7 @@ importers: '@types/paho-mqtt': 1.0.6 '@types/postman-collection': 3.5.7 '@types/qs': 6.9.7 + '@types/socketio-wildcard': 2.0.4 '@types/splitpanes': 2.2.1 '@types/uuid': 8.3.4 '@types/yargs-parser': 21.0.0 @@ -380,7 +382,7 @@ importers: '@hoppscotch/data': link:../hoppscotch-data '@hoppscotch/js-sandbox': link:../hoppscotch-js-sandbox '@relmify/jest-fp-ts': 2.0.2_fp-ts@2.12.1+io-ts@2.2.16 - '@swc/core': 1.2.181 + '@swc/core': 1.2.182 '@types/axios': 0.14.0 '@types/chalk': 2.2.0 '@types/commander': 2.12.2 @@ -732,7 +734,7 @@ packages: dependencies: '@babel/helper-get-function-arity': 7.16.7 '@babel/template': 7.16.7 - '@babel/types': 7.16.8 + '@babel/types': 7.17.0 /@babel/helper-function-name/7.17.9: resolution: {integrity: sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==} @@ -751,7 +753,7 @@ packages: resolution: {integrity: sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.16.8 + '@babel/types': 7.17.0 /@babel/helper-hoist-variables/7.16.0: resolution: {integrity: sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==} @@ -795,7 +797,7 @@ packages: '@babel/helper-validator-identifier': 7.16.7 '@babel/template': 7.16.7 '@babel/traverse': 7.17.9 - '@babel/types': 7.16.8 + '@babel/types': 7.17.0 transitivePeerDependencies: - supports-color @@ -850,7 +852,7 @@ packages: resolution: {integrity: sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.16.8 + '@babel/types': 7.17.0 /@babel/helper-simple-access/7.17.7: resolution: {integrity: sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==} @@ -2218,10 +2220,10 @@ packages: '@types/node': 17.0.24 chalk: 4.1.2 cosmiconfig: 7.0.1 - cosmiconfig-typescript-loader: 1.0.9_kpiehm6dkipypriomyghl2wcpq + cosmiconfig-typescript-loader: 1.0.9_c6ucwwwirjo6ockovr3lj3o2cm lodash: 4.17.21 resolve-from: 5.0.0 - typescript: 4.6.4 + typescript: 4.6.3 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' @@ -3699,7 +3701,7 @@ packages: '@jest/schemas': 28.0.2 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 17.0.31 + '@types/node': 17.0.24 '@types/yargs': 17.0.10 chalk: 4.1.2 dev: true @@ -3867,17 +3869,17 @@ packages: consola: 2.15.3 crc: 3.8.0 defu: 4.0.1 - destr: 1.1.0 + destr: 1.1.1 execa: 5.1.1 exit: 0.1.2 fs-extra: 9.1.0 globby: 11.1.0 hable: 3.0.0 lodash: 4.17.21 - minimist: 1.2.5 + minimist: 1.2.6 opener: 1.5.2 pretty-bytes: 5.6.0 - semver: 7.3.6 + semver: 7.3.7 serve-static: 1.14.1 std-env: 2.3.1 upath: 2.0.1 @@ -3894,7 +3896,7 @@ packages: glob: 7.2.0 globby: 11.1.0 scule: 0.2.1 - semver: 7.3.6 + semver: 7.3.7 upath: 2.0.1 vue-template-compiler: 2.6.14 dev: false @@ -3905,10 +3907,10 @@ packages: '@nuxt/utils': 2.15.8 consola: 2.15.3 defu: 4.0.1 - destr: 1.1.0 + destr: 1.1.1 dotenv: 9.0.2 lodash: 4.17.21 - rc9: 1.2.0 + rc9: 1.2.2 std-env: 2.3.1 ufo: 0.7.11 dev: false @@ -3959,11 +3961,11 @@ packages: ufo: 0.7.11 dev: false - /@nuxt/kit-edge/3.0.0-rc.3-27536597.3359b3b: - resolution: {integrity: sha512-vQWAzbsHk8sP0tGXLfKX6EfnR6cb6sG4CJLcj2sptuyKwnXrHjQTfdWxKkJLqVBKq4O/8Vej9Xm9r5VLGOpNPA==} + /@nuxt/kit-edge/3.0.0-rc.3-27545866.cd37a21: + resolution: {integrity: sha512-iBU1wEwj2peSN/sS4QIuZfUQluplh7YCarvz+MCUcybdOw17kXALPQjUY6q5ISXmNsTiY/fLqHvYz3k6UjkS5w==} engines: {node: ^14.16.0 || ^16.11.0 || ^17.0.0 || ^18.0.0} dependencies: - '@nuxt/schema': /@nuxt/schema-edge/3.0.0-rc.3-27536597.3359b3b + '@nuxt/schema': /@nuxt/schema-edge/3.0.0-rc.3-27545866.cd37a21 c12: 0.2.7 consola: 2.15.3 defu: 6.0.0 @@ -4011,8 +4013,8 @@ packages: - encoding dev: false - /@nuxt/schema-edge/3.0.0-rc.3-27536597.3359b3b: - resolution: {integrity: sha512-+a/6Irx+EL2oxD+TX0Saervw3SXbr3SqFnAUE5QfTQppzG5Zf3Y9KBf+wzafB7qEDoQiCl0DWBuFVaPt+Ibt3g==} + /@nuxt/schema-edge/3.0.0-rc.3-27545866.cd37a21: + resolution: {integrity: sha512-7EOInYwj96i688RLlYKy1CIOM3Lo1GQkYNPfbNcD1k74QeQorUqn0/Tr5Cyce3/SqZ77c8PcQ4bc3p7PNPu9XA==} engines: {node: ^14.16.0 || ^16.11.0 || ^17.0.0 || ^18.0.0} dependencies: c12: 0.2.7 @@ -4064,7 +4066,7 @@ packages: consola: 2.15.3 create-require: 1.1.1 defu: 5.0.1 - destr: 1.1.0 + destr: 1.1.1 dotenv: 9.0.2 fs-extra: 8.1.0 git-url-parse: 11.6.0 @@ -4074,7 +4076,7 @@ packages: nanoid: 3.3.1 node-fetch: 2.6.7 parse-git-config: 3.0.0 - rc9: 1.2.0 + rc9: 1.2.2 std-env: 2.3.1 transitivePeerDependencies: - encoding @@ -4135,7 +4137,7 @@ packages: jiti: 1.13.0 lodash: 4.17.21 proper-lockfile: 4.1.2 - semver: 7.3.6 + semver: 7.3.7 serialize-javascript: 5.0.1 signal-exit: 3.0.5 ua-parser-js: 0.7.31 @@ -4206,7 +4208,7 @@ packages: postcss-loader: 3.0.0 postcss-preset-env: 6.7.0 postcss-url: 8.0.0 - semver: 7.3.6 + semver: 7.3.7 std-env: 2.3.1 style-resources-loader: 1.4.1_webpack@4.46.0 terser-webpack-plugin: 4.2.3_webpack@4.46.0 @@ -4589,7 +4591,7 @@ packages: requiresBuild: true dependencies: https-proxy-agent: 5.0.0 - mkdirp: 0.5.5 + mkdirp: 0.5.6 node-fetch: 2.6.7 npmlog: 4.1.2 progress: 2.0.3 @@ -4761,10 +4763,9 @@ packages: /@socket.io/component-emitter/3.0.0: resolution: {integrity: sha512-2pTGuibAXJswAPJjaKisthqS/NOK5ypG4LYT6tEAV0S/mxW0zOIvYvGK0V8w8+SHxAm6vRMSjqSalFXeBAqs+Q==} - dev: false - /@swc/core-android-arm-eabi/1.2.181: - resolution: {integrity: sha512-H3HNf8j6M13uIbSruef8iMsCElJJDZOhp5qxwm/+P1jAG4eQ4vPfajIlTVdFJes8Adrbr4WQaVvl+m4BQw51JQ==} + /@swc/core-android-arm-eabi/1.2.182: + resolution: {integrity: sha512-NLjye+oyMoGsGFO+w5Opo9Q55GOZw1bnXhw7MHlGibUIhxkJk3kJ+EgFNdXUPgh2B3c9qsDqY2d6v3WD+N4XyA==} engines: {node: '>=10'} cpu: [arm] os: [android] @@ -4772,8 +4773,8 @@ packages: dev: true optional: true - /@swc/core-android-arm64/1.2.181: - resolution: {integrity: sha512-b1apYKeosBaXl28xE/By4QVHYrXaR2+nOdcP6rsDXg6nyLBArtoiS5YUFikFN/VQbSAQqNeJQ+rovT5zITrgSQ==} + /@swc/core-android-arm64/1.2.182: + resolution: {integrity: sha512-80wldTfsY3JtSQQkIZKj8Vc9QpKObVapWXBfOrebfN1vJesUN/NSf2RGue8RGGkiqjZI0g4ErVHZXZl1CC3hBw==} engines: {node: '>=10'} cpu: [arm64] os: [android] @@ -4781,8 +4782,8 @@ packages: dev: true optional: true - /@swc/core-darwin-arm64/1.2.181: - resolution: {integrity: sha512-M3/PPeO6NTN7GYa1mOWPNMaAPxEQH8xd+X6FHMa7OBCi+Qxkarafu4DZRfzR88TcS3XikqFLgmmzSP7Z/tye2w==} + /@swc/core-darwin-arm64/1.2.182: + resolution: {integrity: sha512-CrJToIWnrh6mPHHxPW8bwAZzlQ85sbQmtWh5/DNWQe3MAtrcPDdxxoEIMu+d+HVFcO24EpqOvxI9ok7Cj0SaLQ==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] @@ -4790,8 +4791,8 @@ packages: dev: true optional: true - /@swc/core-darwin-x64/1.2.181: - resolution: {integrity: sha512-8Uc6gx7YN5+eSnk3h7aHqp1f3RFoBJPDPeH9cURm4mfE4BTgkVgkctUm0IE5sS5AotazVbrOwhEFrl7TONSfPA==} + /@swc/core-darwin-x64/1.2.182: + resolution: {integrity: sha512-FFtLCYcSxJDw6OTQMz8TmfudxwcCuinC4O2qdph5ocOb5fAbw/QQS9M3oYuCPN8KXlLyfQ/2zebaAUbKD1mr7g==} engines: {node: '>=10'} cpu: [x64] os: [darwin] @@ -4799,8 +4800,8 @@ packages: dev: true optional: true - /@swc/core-freebsd-x64/1.2.181: - resolution: {integrity: sha512-SbnsbJHGFNY7VSTA5OhBh2PmLgQumIGerAxTCTYO1IgtbADCTL+gCjU0TK0viG/zpH4jnjaL965BI4JTo/bpRg==} + /@swc/core-freebsd-x64/1.2.182: + resolution: {integrity: sha512-evWeqrw8HnhZroHhPsiWtCQKSFZ6knQfejeDx8Jqu99NGjYm6WtUKSG+yXPJRhlTTxDB0zj8QzjF1C0HDU1EFw==} engines: {node: '>=10'} cpu: [x64] os: [freebsd] @@ -4808,8 +4809,8 @@ packages: dev: true optional: true - /@swc/core-linux-arm-gnueabihf/1.2.181: - resolution: {integrity: sha512-aWO6Lr9wea96Z7AEagzf4reKgDb3UWXZnClwJK7baScwF8KV+Mh99vVgkSe1nj2gKOZ31pBLp62RDJkc3gdlnA==} + /@swc/core-linux-arm-gnueabihf/1.2.182: + resolution: {integrity: sha512-vix9LI1QUkaa33F42t0T4nmk9Yqeyh+P7zkc8STn26sc/mFaJ1T4PrF8rLZfACcX1B1vJxJ3+HoGLdTLqFBPRg==} engines: {node: '>=10'} cpu: [arm] os: [linux] @@ -4817,8 +4818,8 @@ packages: dev: true optional: true - /@swc/core-linux-arm64-gnu/1.2.181: - resolution: {integrity: sha512-+7fzDwsvcbhPafKdminMQrU3Ej1NHltXy7k+zgjj8BDPZbfi8hRzQcONeBV7sfl4xvw3d3roNHu2UMmKzLNs0w==} + /@swc/core-linux-arm64-gnu/1.2.182: + resolution: {integrity: sha512-co6NlUl2gxTUcN3/U5OJMIqUGK1j1OZSI9R2FMknaf0olymtSoRB0ww/+p/PKPD69sl+pZd7DvzeIjFrJKeOPw==} engines: {node: '>=10'} cpu: [arm64] os: [linux] @@ -4826,8 +4827,8 @@ packages: dev: true optional: true - /@swc/core-linux-arm64-musl/1.2.181: - resolution: {integrity: sha512-U9k8pv2oCxYYfu9DdOO1ZZgqbmF97NgJzSaIu3PsTedF4RcGIiPcuGOFqrUECsGUW2i6uKejE8onbXPj9UmaZQ==} + /@swc/core-linux-arm64-musl/1.2.182: + resolution: {integrity: sha512-NoT9aZjjANCtS/yECBRiwmA2oJjFn6X/NhXcQdapcNk2vVid9Hr3NZD5CgBhs3XncXUF/Fjfn6lbRNgZ4MqDRg==} engines: {node: '>=10'} cpu: [arm64] os: [linux] @@ -4835,8 +4836,8 @@ packages: dev: true optional: true - /@swc/core-linux-x64-gnu/1.2.181: - resolution: {integrity: sha512-9AQXrvZ9BFQJeqYMpKQZRf9h/DEwhfHIR39krehO+g594i+mkkp+UNTToez6Ifn+NBYl58xyEcQGwsYIqtdYVw==} + /@swc/core-linux-x64-gnu/1.2.182: + resolution: {integrity: sha512-Fq7sGcc3NyuEVCFIme5xAJLQ2d27ztAoI9Ct5a3/4mP6+E/uEIPSs9eridOOqedq5bi4ZEPU1GsisLUmkVML0g==} engines: {node: '>=10'} cpu: [x64] os: [linux] @@ -4844,8 +4845,8 @@ packages: dev: true optional: true - /@swc/core-linux-x64-musl/1.2.181: - resolution: {integrity: sha512-Pq/aBMj3F4CR4tXq85t7IW3piu76a677nIoo6QtBkAjrQ5QuJqpaez/5aewipG+kIXpiu/DNFIN+cISa1QeC8A==} + /@swc/core-linux-x64-musl/1.2.182: + resolution: {integrity: sha512-O8nZOXPMTLL4m0AVJPygkxU8pp/Mv7WeNgFlEqYcQbK0ZdmW7jU0ZWwAD+IfgzUhdvy3nezorsBnNCRT/YVLiA==} engines: {node: '>=10'} cpu: [x64] os: [linux] @@ -4853,8 +4854,8 @@ packages: dev: true optional: true - /@swc/core-win32-arm64-msvc/1.2.181: - resolution: {integrity: sha512-m24036tVFDE8ZJ3fBVBfsHw4tHd0BG6g3TvT2MLAiW2MezYeTdrGpmvPBz4Woz686I/06cWeSg7cZF1/ZcZMMA==} + /@swc/core-win32-arm64-msvc/1.2.182: + resolution: {integrity: sha512-KAr39wz+H7nqZ3wmzkR1h1FmFJhRNfDDvmBfIcqZCtM45YpeikRgxUrbq+Ph7lUob/6cUIKA8QGP5mHmxxzN1A==} engines: {node: '>=10'} cpu: [arm64] os: [win32] @@ -4862,8 +4863,8 @@ packages: dev: true optional: true - /@swc/core-win32-ia32-msvc/1.2.181: - resolution: {integrity: sha512-OPROzGapmr29qqwvB/aP9SA80r2eIukj+q7gghdQVptJrQU4GrTyzW1TpnGtpzj8rLZz4hEG6KtyPUh54bJZ/g==} + /@swc/core-win32-ia32-msvc/1.2.182: + resolution: {integrity: sha512-Ng2b/AE3CUulaattHo19+xPhCKQ9xjwKUgK8zBzx9h8yU7NdRJw5KCe58lMi5axVF0uIqbu0hFdHfQWQIX+bhQ==} engines: {node: '>=10'} cpu: [ia32] os: [win32] @@ -4871,8 +4872,8 @@ packages: dev: true optional: true - /@swc/core-win32-x64-msvc/1.2.181: - resolution: {integrity: sha512-YrIaS63XsGiQ9AgxUVZ7Irt4pwQc3c2TPN7PyQP7ok9zBZxY5pBTwRTdLctlF4LNsSavlHE5+rvdPzcYAG0ekQ==} + /@swc/core-win32-x64-msvc/1.2.182: + resolution: {integrity: sha512-GRN6AyTVZsvbfMMXKblf+27kQwFnVguaLYqK1H1xk6UKx0U26wcrCM/01hczcoD3NmIVtljANm3VOqqbwlNAJQ==} engines: {node: '>=10'} cpu: [x64] os: [win32] @@ -4880,24 +4881,24 @@ packages: dev: true optional: true - /@swc/core/1.2.181: - resolution: {integrity: sha512-evQX+Br/gC+FYLbUIF1dOQa7hUzBpowrcbgPkIRCEvi4HrCn7pGBZ2ZHBXmwEtBdLfOlyQvN/8USClApQKK4Rw==} + /@swc/core/1.2.182: + resolution: {integrity: sha512-ao/6J7VPS8NElpSElGw5KtAB2aYJriSvRkDdjFnX7N06H3w4qo+CweeS8NXnS2/XCoFuCtPBGEpecuBhfKkHNA==} engines: {node: '>=10'} hasBin: true optionalDependencies: - '@swc/core-android-arm-eabi': 1.2.181 - '@swc/core-android-arm64': 1.2.181 - '@swc/core-darwin-arm64': 1.2.181 - '@swc/core-darwin-x64': 1.2.181 - '@swc/core-freebsd-x64': 1.2.181 - '@swc/core-linux-arm-gnueabihf': 1.2.181 - '@swc/core-linux-arm64-gnu': 1.2.181 - '@swc/core-linux-arm64-musl': 1.2.181 - '@swc/core-linux-x64-gnu': 1.2.181 - '@swc/core-linux-x64-musl': 1.2.181 - '@swc/core-win32-arm64-msvc': 1.2.181 - '@swc/core-win32-ia32-msvc': 1.2.181 - '@swc/core-win32-x64-msvc': 1.2.181 + '@swc/core-android-arm-eabi': 1.2.182 + '@swc/core-android-arm64': 1.2.182 + '@swc/core-darwin-arm64': 1.2.182 + '@swc/core-darwin-x64': 1.2.182 + '@swc/core-freebsd-x64': 1.2.182 + '@swc/core-linux-arm-gnueabihf': 1.2.182 + '@swc/core-linux-arm64-gnu': 1.2.182 + '@swc/core-linux-arm64-musl': 1.2.182 + '@swc/core-linux-x64-gnu': 1.2.182 + '@swc/core-linux-x64-musl': 1.2.182 + '@swc/core-win32-arm64-msvc': 1.2.182 + '@swc/core-win32-ia32-msvc': 1.2.182 + '@swc/core-win32-x64-msvc': 1.2.182 dev: true /@szmarczak/http-timer/1.1.2: @@ -5001,7 +5002,7 @@ packages: /@types/babel__generator/7.6.3: resolution: {integrity: sha512-/GWCmzJWqV7diQW54smJZzWbSFf4QYtF71WCKhcx6Ru/tFyQIY2eiiITcCAeuPbNSvT9YCGkVMqqvSk2Z0mXiA==} dependencies: - '@babel/types': 7.16.0 + '@babel/types': 7.17.0 dev: true /@types/babel__generator/7.6.4: @@ -5013,7 +5014,7 @@ packages: /@types/babel__template/7.4.1: resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} dependencies: - '@babel/parser': 7.17.9 + '@babel/parser': 7.16.2 '@babel/types': 7.17.0 dev: true @@ -5027,7 +5028,7 @@ packages: resolution: {integrity: sha512-a6bTJ21vFOGIkwM0kzh9Yr89ziVxq4vYH2fQ6N8AeipEzai/cFK6aGMArIkUeIdRIgpwQa+2bXiLuUJCpSf2Cg==} dependencies: '@types/connect': 3.4.34 - '@types/node': 17.0.18 + '@types/node': 17.0.24 dev: true /@types/browserslist/4.15.0: @@ -5042,7 +5043,7 @@ packages: dependencies: '@types/http-cache-semantics': 4.0.1 '@types/keyv': 3.1.3 - '@types/node': 17.0.18 + '@types/node': 17.0.24 '@types/responselike': 1.0.0 dev: true @@ -5093,6 +5094,12 @@ packages: resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} dev: true + /@types/engine.io/3.1.7: + resolution: {integrity: sha512-qNjVXcrp+1sS8YpRUa714r0pgzOwESdW5UjHL7D/2ZFdBX0BXUXtg1LUrp+ylvqbvMcMWUy73YpRoxPN2VoKAQ==} + dependencies: + '@types/node': 17.0.24 + dev: true + /@types/eslint/7.29.0: resolution: {integrity: sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng==} dependencies: @@ -5123,7 +5130,7 @@ packages: /@types/express-serve-static-core/4.17.24: resolution: {integrity: sha512-3UJuW+Qxhzwjq3xhwXm2onQcFHn76frIYVbTu+kn24LFxI+dEhdfISDFovPB8VpEgW8oQCTpRuCe+0zJxB7NEA==} dependencies: - '@types/node': 17.0.18 + '@types/node': 17.0.24 '@types/qs': 6.9.7 '@types/range-parser': 1.2.4 dev: true @@ -5172,7 +5179,7 @@ packages: /@types/http-proxy/1.17.7: resolution: {integrity: sha512-9hdj6iXH64tHSLTY+Vt2eYOGzSogC+JQ2H7bdPWkuh7KXP5qLllWx++t+K9Wk556c3dkDdPws/SpMRi0sdCT1w==} dependencies: - '@types/node': 17.0.18 + '@types/node': 17.0.24 dev: false /@types/httpsnippet/1.23.1: @@ -5231,7 +5238,7 @@ packages: /@types/keyv/3.1.3: resolution: {integrity: sha512-FXCJgyyN3ivVgRoml4h94G/p3kY+u/B86La+QptcqJaWtBWtmc6TtkNfS40n9bIvyLteHh7zXOtgbobORKPbDg==} dependencies: - '@types/node': 17.0.18 + '@types/node': 17.0.24 dev: true /@types/less/3.0.2: @@ -5282,10 +5289,6 @@ packages: /@types/node/17.0.24: resolution: {integrity: sha512-aveCYRQbgTH9Pssp1voEP7HiuWlD2jW2BO56w+bVrJn04i61yh6mRfoKO6hEYQD9vF+W8Chkwc6j1M36uPkx4g==} - /@types/node/17.0.31: - resolution: {integrity: sha512-AR0x5HbXGqkEx9CadRH3EBYx/VkiUgZIhP4wvPn/+5KIsgpNoyFaRlVe0Zlx9gRtg8fA06a9tskE2MSN7TcG4Q==} - dev: true - /@types/node/17.0.6: resolution: {integrity: sha512-+XBAjfZmmivILUzO0HwBJoYkAyyySSLg5KCGBDFLomJo0sV6szvVLAf4ANZZ0pfWzgEds5KmGLG9D5hfEqOhaA==} @@ -5342,7 +5345,7 @@ packages: /@types/responselike/1.0.0: resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} dependencies: - '@types/node': 17.0.18 + '@types/node': 17.0.24 dev: true /@types/sass-loader/8.0.1: @@ -5362,7 +5365,7 @@ packages: /@types/sax/1.2.3: resolution: {integrity: sha512-+QSw6Tqvs/KQpZX8DvIl3hZSjNFLW/OqE5nlyHXtTwODaJvioN2rOWpBNEWZp2HZUFhOh+VohmJku/WxEXU2XA==} dependencies: - '@types/node': 17.0.18 + '@types/node': 17.0.24 dev: false /@types/semver/7.3.9: @@ -5376,6 +5379,38 @@ packages: '@types/node': 17.0.6 dev: true + /@types/socket.io-client/1.4.36: + resolution: {integrity: sha512-ZJWjtFBeBy1kRSYpVbeGYTElf6BqPQUkXDlHHD4k/42byCN5Rh027f4yARHCink9sKAkbtGZXEAmR0ZCnc2/Ag==} + dev: true + + /@types/socket.io-parser/3.0.0: + resolution: {integrity: sha512-Ry/rbTE6HQNL9eu3LpL1Ocup5VexXu1bSSGlSho/IR5LuRc8YvxwSNJ3JxqTltVJEATLbZkMQETSbxfKNgp4Ew==} + deprecated: This is a stub types definition. socket.io-parser provides its own type definitions, so you do not need this installed. + dependencies: + socket.io-parser: 4.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@types/socket.io/2.1.13: + resolution: {integrity: sha512-JRgH3nCgsWel4OPANkhH8TelpXvacAJ9VeryjuqCDiaVDMpLysd6sbt0dr6Z15pqH3p2YpOT3T1C5vQ+O/7uyg==} + dependencies: + '@types/engine.io': 3.1.7 + '@types/node': 17.0.24 + '@types/socket.io-parser': 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@types/socketio-wildcard/2.0.4: + resolution: {integrity: sha512-02BK7Bf3stIcvKXWjRFtPgCOMYi4KWhASPhVzkYpZOR9qQbtj7xBJEPi0fkksDJeqeRXCF23azFEOaRBXuUCNA==} + dependencies: + '@types/socket.io': 2.1.13 + '@types/socket.io-client': 1.4.36 + transitivePeerDependencies: + - supports-color + dev: true + /@types/source-list-map/0.1.2: resolution: {integrity: sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==} @@ -5484,7 +5519,7 @@ packages: /@types/webpack/4.41.31: resolution: {integrity: sha512-/i0J7sepXFIp1ZT7FjUGi1eXMCg8HCCzLJEQkKsOtbJFontsJLolBcDC+3qxn5pPwiCt1G0ZdRmYRzNBtvpuGQ==} dependencies: - '@types/node': 17.0.18 + '@types/node': 17.0.24 '@types/tapable': 1.0.8 '@types/uglify-js': 3.13.1 '@types/webpack-sources': 3.2.0 @@ -5495,7 +5530,7 @@ packages: /@types/websocket/1.0.4: resolution: {integrity: sha512-qn1LkcFEKK8RPp459jkjzsfpbsx36BBt3oC3pITYtkoBw/aVX+EZFa5j3ThCRTNpLFvIMr5dSTD4RaMdilIOpA==} dependencies: - '@types/node': 17.0.18 + '@types/node': 17.0.24 /@types/websocket/1.0.5: resolution: {integrity: sha512-NbsqiNX9CnEfC1Z0Vf4mE1SgAJ07JnRYcNex7AJ9zAVzmiGHmjKFEk7O4TJIsgv2B1sLEb6owKFZrACwdYngsQ==} @@ -5696,7 +5731,7 @@ packages: debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.3.6 + semver: 7.3.7 tsutils: 3.21.0_typescript@4.6.3 typescript: 4.6.3 transitivePeerDependencies: @@ -6672,7 +6707,7 @@ packages: babel-plugin-istanbul: 6.1.1 babel-preset-jest: 27.5.1_@babel+core@7.17.9 chalk: 4.1.2 - graceful-fs: 4.2.10 + graceful-fs: 4.2.9 slash: 3.0.0 transitivePeerDependencies: - supports-color @@ -6944,7 +6979,7 @@ packages: dev: true /backo2/1.0.2: - resolution: {integrity: sha1-MasayLEpNjRj41s+u2n038+6eUc=} + resolution: {integrity: sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA==} /balanced-match/1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -7153,6 +7188,17 @@ packages: picocolors: 1.0.0 dev: true + /browserslist/4.19.1: + resolution: {integrity: sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001311 + electron-to-chromium: 1.4.68 + escalade: 3.1.1 + node-releases: 2.0.2 + picocolors: 1.0.0 + /browserslist/4.20.0: resolution: {integrity: sha512-bnpOoa+DownbciXj0jVGENf8VYQnE2LNWomhYuCsMmmx9Jd9lwq0WXODuwpSsp8AVdKM2/HorrzxAfbKvWTByQ==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -7230,16 +7276,6 @@ packages: resolution: {integrity: sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=} dev: false - /bundle-require/3.0.4_esbuild@0.14.34: - resolution: {integrity: sha512-VXG6epB1yrLAvWVQpl92qF347/UXmncQj7J3U8kZEbdVZ1ZkQyr4hYeL/9RvcE8vVVdp53dY78Fd/3pqfRqI1A==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - peerDependencies: - esbuild: '>=0.13' - dependencies: - esbuild: 0.14.34 - load-tsconfig: 0.2.3 - dev: true - /bundle-require/3.0.4_esbuild@0.14.36: resolution: {integrity: sha512-VXG6epB1yrLAvWVQpl92qF347/UXmncQj7J3U8kZEbdVZ1ZkQyr4hYeL/9RvcE8vVVdp53dY78Fd/3pqfRqI1A==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -7455,6 +7491,9 @@ packages: /caniuse-lite/1.0.30001274: resolution: {integrity: sha512-+Nkvv0fHyhISkiMIjnyjmf5YJcQ1IQHZN6U9TLUMroWR38FNwpsC51Gb68yueafX1V6ifOisInSgP9WJFS13ew==} + /caniuse-lite/1.0.30001311: + resolution: {integrity: sha512-mleTFtFKfykEeW34EyfhGIFjGCqzhh38Y0LhdQ9aWF+HorZTtdgKV/1hEE0NlFkG2ubvisPV6l400tlbPys98A==} + /caniuse-lite/1.0.30001315: resolution: {integrity: sha512-5v7LFQU4Sb/qvkz7JcZkvtSH1Ko+1x2kgo3ocdBeMGZSOFpuE1kkm0kpTwLtWeFrw5qw08ulLxJjVIXIS8MkiQ==} @@ -8058,7 +8097,7 @@ packages: /core-js-compat/3.20.3: resolution: {integrity: sha512-c8M5h0IkNZ+I92QhIpuSijOxGAcj3lgpsWdkCqmUTZNwidujF4r3pi6x1DCN+Vcs5qTS2XWWMfWSuCqyupX8gw==} dependencies: - browserslist: 4.20.2 + browserslist: 4.19.1 semver: 7.0.0 /core-js/2.6.12: @@ -8084,7 +8123,7 @@ packages: dependencies: '@iarna/toml': 2.2.5 - /cosmiconfig-typescript-loader/1.0.9_kpiehm6dkipypriomyghl2wcpq: + /cosmiconfig-typescript-loader/1.0.9_c6ucwwwirjo6ockovr3lj3o2cm: resolution: {integrity: sha512-tRuMRhxN4m1Y8hP9SNYfz7jRwt8lZdWxdjg/ohg5esKmsndJIn4yT96oJVcf5x0eA11taXl+sIp+ielu529k6g==} engines: {node: '>=12', npm: '>=6'} peerDependencies: @@ -8093,8 +8132,8 @@ packages: dependencies: '@types/node': 17.0.24 cosmiconfig: 7.0.1 - ts-node: 10.7.0_kpiehm6dkipypriomyghl2wcpq - typescript: 4.6.4 + ts-node: 10.7.0_c6ucwwwirjo6ockovr3lj3o2cm + typescript: 4.6.3 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' @@ -8716,10 +8755,6 @@ packages: is-descriptor: 1.0.2 isobject: 3.0.1 - /defu/2.0.4: - resolution: {integrity: sha512-G9pEH1UUMxShy6syWk01VQSRVs3CDWtlxtZu7A+NyqjxaCA4gSlWAKDBx6QiUEKezqS8+DUlXLI14Fp05Hmpwg==} - dev: false - /defu/3.2.2: resolution: {integrity: sha512-8UWj5lNv7HD+kB0e9w77Z7TdQlbUYDVWqITLHNqFIn6khrNHv5WQo38Dcm1f6HeNyZf0U7UbPf6WeZDSdCzGDQ==} dev: true @@ -8737,7 +8772,6 @@ packages: /defu/6.0.0: resolution: {integrity: sha512-t2MZGLf1V2rV4VBZbWIaXKdX/mUcYW0n2znQZoADBkGGxYL8EWqCuCZBmJPJ/Yy9fofJkyuuSuo5GSwo0XdEgw==} - dev: true /delayed-stream/1.0.0: resolution: {integrity: sha1-3zrhmayt+31ECqrgsp4icrJOxhk=} @@ -8763,13 +8797,8 @@ packages: minimalistic-assert: 1.0.1 dev: false - /destr/1.1.0: - resolution: {integrity: sha512-Ev/sqS5AzzDwlpor/5wFCDu0dYMQu/0x2D6XfAsQ0E7uQmamIgYJ6Dppo2T2EOFVkeVYWjc+PCLKaqZZ57qmLg==} - dev: false - /destr/1.1.1: resolution: {integrity: sha512-QqkneF8LrYmwATMdnuD2MLI3GHQIcBnG6qFC2q9bSH430VTCDAVjcspPmUaKhPGtAtPAftIUFqY1obQYQuwmbg==} - dev: true /destroy/1.0.4: resolution: {integrity: sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=} @@ -9021,6 +9050,9 @@ packages: /electron-to-chromium/1.4.111: resolution: {integrity: sha512-/s3+fwhKf1YK4k7btOImOzCQLpUjS6MaPf0ODTNuT4eTM1Bg4itBpLkydhOzJmpmH6Z9eXFyuuK5czsmzRzwtw==} + /electron-to-chromium/1.4.68: + resolution: {integrity: sha512-cId+QwWrV8R1UawO6b9BR1hnkJ4EJPCPAr4h315vliHUtVUJDk39Sg1PMNnaWKfj5x+93ssjeJ9LKL6r8LaMiA==} + /electron-to-chromium/1.4.82: resolution: {integrity: sha512-Ks+ANzLoIrFDUOJdjxYMH6CMKB8UQo5modAwvSZTxgF+vEs/U7G5IbWFUp6dS4klPkTDVdxbORuk8xAXXhMsWw==} @@ -9150,7 +9182,7 @@ packages: resolution: {integrity: sha1-oRXDJQS2MC6Fp2Jp16V8zdli41k=} engines: {node: '>=0.6'} dependencies: - graceful-fs: 4.2.8 + graceful-fs: 4.2.10 memory-fs: 0.3.0 object-assign: 4.1.1 tapable: 0.2.9 @@ -9226,15 +9258,6 @@ packages: is-date-object: 1.0.5 is-symbol: 1.0.4 - /esbuild-android-64/0.14.34: - resolution: {integrity: sha512-XfxcfJqmMYsT/LXqrptzFxmaR3GWzXHDLdFNIhm6S00zPaQF1TBBWm+9t0RZ6LRR7iwH57DPjaOeW20vMqI4Yw==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true - /esbuild-android-64/0.14.36: resolution: {integrity: sha512-jwpBhF1jmo0tVCYC/ORzVN+hyVcNZUWuozGcLHfod0RJCedTDTvR4nwlTXdx1gtncDqjk33itjO+27OZHbiavw==} engines: {node: '>=12'} @@ -9243,15 +9266,6 @@ packages: requiresBuild: true optional: true - /esbuild-android-arm64/0.14.34: - resolution: {integrity: sha512-T02+NXTmSRL1Mc6puz+R9CB54rSPICkXKq6+tw8B6vxZFnCPzbJxgwIX4kcluz9p8nYBjF3+lSilTGWb7+Xgew==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - /esbuild-android-arm64/0.14.36: resolution: {integrity: sha512-/hYkyFe7x7Yapmfv4X/tBmyKnggUmdQmlvZ8ZlBnV4+PjisrEhAvC3yWpURuD9XoB8Wa1d5dGkTsF53pIvpjsg==} engines: {node: '>=12'} @@ -9260,15 +9274,6 @@ packages: requiresBuild: true optional: true - /esbuild-darwin-64/0.14.34: - resolution: {integrity: sha512-pLRip2Bh4Ng7Bf6AMgCrSp3pPe/qZyf11h5Qo2mOfJqLWzSVjxrXW+CFRJfrOVP7TCnh/gmZSM2AFdCPB72vtw==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - /esbuild-darwin-64/0.14.36: resolution: {integrity: sha512-kkl6qmV0dTpyIMKagluzYqlc1vO0ecgpviK/7jwPbRDEv5fejRTaBBEE2KxEQbTHcLhiiDbhG7d5UybZWo/1zQ==} engines: {node: '>=12'} @@ -9277,15 +9282,6 @@ packages: requiresBuild: true optional: true - /esbuild-darwin-arm64/0.14.34: - resolution: {integrity: sha512-vpidSJEBxx6lf1NWgXC+DCmGqesJuZ5Y8aQVVsaoO4i8tRXbXb0whChRvop/zd3nfNM4dIl5EXAky0knRX5I6w==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - /esbuild-darwin-arm64/0.14.36: resolution: {integrity: sha512-q8fY4r2Sx6P0Pr3VUm//eFYKVk07C5MHcEinU1BjyFnuYz4IxR/03uBbDwluR6ILIHnZTE7AkTUWIdidRi1Jjw==} engines: {node: '>=12'} @@ -9294,15 +9290,6 @@ packages: requiresBuild: true optional: true - /esbuild-freebsd-64/0.14.34: - resolution: {integrity: sha512-m0HBjePhe0hAQJgtMRMNV9kMgIyV4/qSnzPx42kRMQBcPhgjAq1JRu4Il26czC+9FgpMbFkUktb07f/Lwnc6CA==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - /esbuild-freebsd-64/0.14.36: resolution: {integrity: sha512-Hn8AYuxXXRptybPqoMkga4HRFE7/XmhtlQjXFHoAIhKUPPMeJH35GYEUWGbjteai9FLFvBAjEAlwEtSGxnqWww==} engines: {node: '>=12'} @@ -9311,15 +9298,6 @@ packages: requiresBuild: true optional: true - /esbuild-freebsd-arm64/0.14.34: - resolution: {integrity: sha512-cpRc2B94L1KvMPPYB4D6G39jLqpKlD3noAMY4/e86iXXXkhUYJJEtTuyNFTa9JRpWM0xCAp4mxjHjoIiLuoCLA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - /esbuild-freebsd-arm64/0.14.36: resolution: {integrity: sha512-S3C0attylLLRiCcHiJd036eDEMOY32+h8P+jJ3kTcfhJANNjP0TNBNL30TZmEdOSx/820HJFgRrqpNAvTbjnDA==} engines: {node: '>=12'} @@ -9328,15 +9306,6 @@ packages: requiresBuild: true optional: true - /esbuild-linux-32/0.14.34: - resolution: {integrity: sha512-8nQaEaoW7MH/K/RlozJa+lE1ejHIr8fuPIHhc513UebRav7HtXgQvxHQ6VZRUkWtep23M6dd7UqhwO1tMOfzQQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true - /esbuild-linux-32/0.14.36: resolution: {integrity: sha512-Eh9OkyTrEZn9WGO4xkI3OPPpUX7p/3QYvdG0lL4rfr73Ap2HAr6D9lP59VMF64Ex01LhHSXwIsFG/8AQjh6eNw==} engines: {node: '>=12'} @@ -9345,15 +9314,6 @@ packages: requiresBuild: true optional: true - /esbuild-linux-64/0.14.34: - resolution: {integrity: sha512-Y3of4qQoLLlAgf042MlrY1P+7PnN9zWj8nVtw9XQG5hcLOZLz7IKpU35oeu7n4wvyaZHwvQqDJ93gRLqdJekcQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /esbuild-linux-64/0.14.36: resolution: {integrity: sha512-vFVFS5ve7PuwlfgoWNyRccGDi2QTNkQo/2k5U5ttVD0jRFaMlc8UQee708fOZA6zTCDy5RWsT5MJw3sl2X6KDg==} engines: {node: '>=12'} @@ -9362,15 +9322,6 @@ packages: requiresBuild: true optional: true - /esbuild-linux-arm/0.14.34: - resolution: {integrity: sha512-9lpq1NcJqssAF7alCO6zL3gvBVVt/lKw4oetUM7OgNnRX0OWpB+ZIO9FwCrSj/dMdmgDhPLf+119zB8QxSMmAg==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - /esbuild-linux-arm/0.14.36: resolution: {integrity: sha512-NhgU4n+NCsYgt7Hy61PCquEz5aevI6VjQvxwBxtxrooXsxt5b2xtOUXYZe04JxqQo+XZk3d1gcr7pbV9MAQ/Lg==} engines: {node: '>=12'} @@ -9379,15 +9330,6 @@ packages: requiresBuild: true optional: true - /esbuild-linux-arm64/0.14.34: - resolution: {integrity: sha512-IlWaGtj9ir7+Nrume1DGcyzBDlK8GcnJq0ANKwcI9pVw8tqr+6GD0eqyF9SF1mR8UmAp+odrx1H5NdR2cHdFHA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /esbuild-linux-arm64/0.14.36: resolution: {integrity: sha512-24Vq1M7FdpSmaTYuu1w0Hdhiqkbto1I5Pjyi+4Cdw5fJKGlwQuw+hWynTcRI/cOZxBcBpP21gND7W27gHAiftw==} engines: {node: '>=12'} @@ -9396,15 +9338,6 @@ packages: requiresBuild: true optional: true - /esbuild-linux-mips64le/0.14.34: - resolution: {integrity: sha512-k3or+01Rska1AjUyNjA4buEwB51eyN/xPQAoOx1CjzAQC3l8rpjUDw55kXyL63O/1MUi4ISvtNtl8gLwdyEcxw==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true - /esbuild-linux-mips64le/0.14.36: resolution: {integrity: sha512-hZUeTXvppJN+5rEz2EjsOFM9F1bZt7/d2FUM1lmQo//rXh1RTFYzhC0txn7WV0/jCC7SvrGRaRz0NMsRPf8SIA==} engines: {node: '>=12'} @@ -9413,15 +9346,6 @@ packages: requiresBuild: true optional: true - /esbuild-linux-ppc64le/0.14.34: - resolution: {integrity: sha512-+qxb8M9FfM2CJaVU7GgYpJOHM1ngQOx+/VrtBjb4C8oVqaPcESCeg2anjl+HRZy8VpYc71q/iBYausPPbJ+Keg==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /esbuild-linux-ppc64le/0.14.36: resolution: {integrity: sha512-1Bg3QgzZjO+QtPhP9VeIBhAduHEc2kzU43MzBnMwpLSZ890azr4/A9Dganun8nsqD/1TBcqhId0z4mFDO8FAvg==} engines: {node: '>=12'} @@ -9430,15 +9354,6 @@ packages: requiresBuild: true optional: true - /esbuild-linux-riscv64/0.14.34: - resolution: {integrity: sha512-Y717ltBdQ5j5sZIHdy1DV9kieo0wMip0dCmVSTceowCPYSn1Cg33Kd6981+F/3b9FDMzNWldZFOBRILViENZSA==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /esbuild-linux-riscv64/0.14.36: resolution: {integrity: sha512-dOE5pt3cOdqEhaufDRzNCHf5BSwxgygVak9UR7PH7KPVHwSTDAZHDoEjblxLqjJYpc5XaU9+gKJ9F8mp9r5I4A==} engines: {node: '>=12'} @@ -9447,15 +9362,6 @@ packages: requiresBuild: true optional: true - /esbuild-linux-s390x/0.14.34: - resolution: {integrity: sha512-bDDgYO4LhL4+zPs+WcBkXph+AQoPcQRTv18FzZS0WhjfH8TZx2QqlVPGhmhZ6WidrY+jKthUqO6UhGyIb4MpmA==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true - /esbuild-linux-s390x/0.14.36: resolution: {integrity: sha512-g4FMdh//BBGTfVHjF6MO7Cz8gqRoDPzXWxRvWkJoGroKA18G9m0wddvPbEqcQf5Tbt2vSc1CIgag7cXwTmoTXg==} engines: {node: '>=12'} @@ -9464,15 +9370,6 @@ packages: requiresBuild: true optional: true - /esbuild-netbsd-64/0.14.34: - resolution: {integrity: sha512-cfaFGXdRt0+vHsjNPyF0POM4BVSHPSbhLPe8mppDc7GDDxjIl08mV1Zou14oDWMp/XZMjYN1kWYRSfftiD0vvQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true - /esbuild-netbsd-64/0.14.36: resolution: {integrity: sha512-UB2bVImxkWk4vjnP62ehFNZ73lQY1xcnL5ZNYF3x0AG+j8HgdkNF05v67YJdCIuUJpBuTyCK8LORCYo9onSW+A==} engines: {node: '>=12'} @@ -9481,15 +9378,6 @@ packages: requiresBuild: true optional: true - /esbuild-openbsd-64/0.14.34: - resolution: {integrity: sha512-vmy9DxXVnRiI14s8GKuYBtess+EVcDALkbpTqd5jw4XITutIzyB7n4x0Tj5utAkKsgZJB22lLWGekr0ABnSLow==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true - optional: true - /esbuild-openbsd-64/0.14.36: resolution: {integrity: sha512-NvGB2Chf8GxuleXRGk8e9zD3aSdRO5kLt9coTQbCg7WMGXeX471sBgh4kSg8pjx0yTXRt0MlrUDnjVYnetyivg==} engines: {node: '>=12'} @@ -9498,15 +9386,6 @@ packages: requiresBuild: true optional: true - /esbuild-sunos-64/0.14.34: - resolution: {integrity: sha512-eNPVatNET1F7tRMhii7goL/eptfxc0ALRjrj9SPFNqp0zmxrehBFD6BaP3R4LjMn6DbMO0jOAnTLFKr8NqcJAA==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true - optional: true - /esbuild-sunos-64/0.14.36: resolution: {integrity: sha512-VkUZS5ftTSjhRjuRLp+v78auMO3PZBXu6xl4ajomGenEm2/rGuWlhFSjB7YbBNErOchj51Jb2OK8lKAo8qdmsQ==} engines: {node: '>=12'} @@ -9515,15 +9394,6 @@ packages: requiresBuild: true optional: true - /esbuild-windows-32/0.14.34: - resolution: {integrity: sha512-EFhpXyHEcnqWYe2rAHFd8dRw8wkrd9U+9oqcyoEL84GbanAYjiiIjBZsnR8kl0sCQ5w6bLpk7vCEIA2VS32Vcg==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - /esbuild-windows-32/0.14.36: resolution: {integrity: sha512-bIar+A6hdytJjZrDxfMBUSEHHLfx3ynoEZXx/39nxy86pX/w249WZm8Bm0dtOAByAf4Z6qV0LsnTIJHiIqbw0w==} engines: {node: '>=12'} @@ -9532,15 +9402,6 @@ packages: requiresBuild: true optional: true - /esbuild-windows-64/0.14.34: - resolution: {integrity: sha512-a8fbl8Ky7PxNEjf1aJmtxdDZj32/hC7S1OcA2ckEpCJRTjiKslI9vAdPpSjrKIWhws4Galpaawy0nB7fjHYf5Q==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - /esbuild-windows-64/0.14.36: resolution: {integrity: sha512-+p4MuRZekVChAeueT1Y9LGkxrT5x7YYJxYE8ZOTcEfeUUN43vktSn6hUNsvxzzATrSgq5QqRdllkVBxWZg7KqQ==} engines: {node: '>=12'} @@ -9549,15 +9410,6 @@ packages: requiresBuild: true optional: true - /esbuild-windows-arm64/0.14.34: - resolution: {integrity: sha512-EYvmKbSa2B3sPnpC28UEu9jBK5atGV4BaVRE7CYGUci2Hlz4AvtV/LML+TcDMT6gBgibnN2gcltWclab3UutMg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - /esbuild-windows-arm64/0.14.36: resolution: {integrity: sha512-fBB4WlDqV1m18EF/aheGYQkQZHfPHiHJSBYzXIo8yKehek+0BtBwo/4PNwKGJ5T0YK0oc8pBKjgwPbzSrPLb+Q==} engines: {node: '>=12'} @@ -9572,34 +9424,6 @@ packages: requiresBuild: true dev: true - /esbuild/0.14.34: - resolution: {integrity: sha512-QIWdPT/gFF6hCaf4m7kP0cJ+JIuFkdHibI7vVFvu3eJS1HpVmYHWDulyN5WXwbRA0SX/7ZDaJ/1DH8SdY9xOJg==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - esbuild-android-64: 0.14.34 - esbuild-android-arm64: 0.14.34 - esbuild-darwin-64: 0.14.34 - esbuild-darwin-arm64: 0.14.34 - esbuild-freebsd-64: 0.14.34 - esbuild-freebsd-arm64: 0.14.34 - esbuild-linux-32: 0.14.34 - esbuild-linux-64: 0.14.34 - esbuild-linux-arm: 0.14.34 - esbuild-linux-arm64: 0.14.34 - esbuild-linux-mips64le: 0.14.34 - esbuild-linux-ppc64le: 0.14.34 - esbuild-linux-riscv64: 0.14.34 - esbuild-linux-s390x: 0.14.34 - esbuild-netbsd-64: 0.14.34 - esbuild-openbsd-64: 0.14.34 - esbuild-sunos-64: 0.14.34 - esbuild-windows-32: 0.14.34 - esbuild-windows-64: 0.14.34 - esbuild-windows-arm64: 0.14.34 - dev: true - /esbuild/0.14.36: resolution: {integrity: sha512-HhFHPiRXGYOCRlrhpiVDYKcFJRdO0sBElZ668M4lh2ER0YgnkLxECuFe7uWCf23FrcLc59Pqr7dHkTqmRPDHmw==} engines: {node: '>=12'} @@ -9847,7 +9671,7 @@ packages: read-pkg-up: 7.0.1 regexp-tree: 0.1.24 safe-regex: 2.1.1 - semver: 7.3.6 + semver: 7.3.7 strip-indent: 3.0.0 dev: true @@ -10210,16 +10034,6 @@ packages: merge2: 1.4.1 micromatch: 4.0.5 - /fast-glob/3.2.7: - resolution: {integrity: sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==} - engines: {node: '>=8'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.4 - /fast-json-stable-stringify/2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} @@ -10908,7 +10722,7 @@ packages: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.2.7 + fast-glob: 3.2.11 ignore: 5.2.0 merge2: 1.4.1 slash: 3.0.0 @@ -12749,7 +12563,7 @@ packages: jest-util: 27.5.1 natural-compare: 1.4.0 pretty-format: 27.5.1 - semver: 7.3.6 + semver: 7.3.7 transitivePeerDependencies: - supports-color dev: true @@ -12771,7 +12585,7 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: '@jest/types': 28.1.0 - '@types/node': 17.0.31 + '@types/node': 17.0.24 chalk: 4.1.2 ci-info: 3.3.0 graceful-fs: 4.2.10 @@ -12807,7 +12621,7 @@ packages: resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 17.0.18 + '@types/node': 17.0.24 merge-stream: 2.0.0 supports-color: 7.2.0 dev: false @@ -13597,6 +13411,7 @@ packages: /lru-cache/7.8.1: resolution: {integrity: sha512-E1v547OCgJvbvevfjgK9sNKIVXO96NnsTsFPBlg4ZxjhsJSODoH9lk8Bm0OxvHNm6Vm5Yqkl/1fErDxhYL8Skg==} engines: {node: '>=12'} + dev: true /lru_map/0.3.3: resolution: {integrity: sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0=} @@ -13964,9 +13779,6 @@ packages: kind-of: 6.0.3 dev: true - /minimist/1.2.5: - resolution: {integrity: sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==} - /minimist/1.2.6: resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==} @@ -14054,13 +13866,6 @@ packages: mkdirp: '>=0.5.0' dev: false - /mkdirp/0.5.5: - resolution: {integrity: sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==} - hasBin: true - dependencies: - minimist: 1.2.6 - dev: false - /mkdirp/0.5.6: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true @@ -14452,7 +14257,7 @@ packages: /nuxt-windicss/2.2.11: resolution: {integrity: sha512-xobq725D6vqpIgYOrLJ6CVlR4xLlFGwuq//gZikXKOdoVRpoK8C+NpHazPd4+f17urGQ4H0LqGBCIujTvV1V0g==} dependencies: - '@nuxt/kit': /@nuxt/kit-edge/3.0.0-rc.3-27536597.3359b3b + '@nuxt/kit': /@nuxt/kit-edge/3.0.0-rc.3-27545866.cd37a21 '@windicss/plugin-utils': 1.8.4 consola: 2.15.3 defu: 6.0.0 @@ -16189,21 +15994,12 @@ packages: strip-json-comments: 2.0.1 dev: true - /rc9/1.2.0: - resolution: {integrity: sha512-/jknmhG0USFAx5uoKkAKhtG40sONds9RWhFHrP1UzJ3OvVfqFWOypSUpmsQD0fFwAV7YtzHhsn3QNasfAoxgcQ==} - dependencies: - defu: 2.0.4 - destr: 1.1.0 - flat: 5.0.2 - dev: false - /rc9/1.2.2: resolution: {integrity: sha512-zbe8+HR2X28eZepAwohuKkebbEsA67h0DO9I7g12QrHa2CQopR9gztOLPIPXXGTvcxeUjAN4wZ+b29t3m/u05g==} dependencies: defu: 6.0.0 destr: 1.1.1 flat: 5.0.2 - dev: true /react-is/17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} @@ -16641,14 +16437,6 @@ packages: typescript: 4.6.3 dev: true - /rollup/2.70.1: - resolution: {integrity: sha512-CRYsI5EuzLbXdxC6RnYhOuRdtz4bhejPMSWjsFLfVM/7w/85n2szZv6yExqUXsBdz5KT8eoubeyDUDjhLHEslA==} - engines: {node: '>=10.0.0'} - hasBin: true - optionalDependencies: - fsevents: 2.3.2 - dev: true - /rollup/2.70.2: resolution: {integrity: sha512-EitogNZnfku65I1DD5Mxe8JYRUCy0hkK5X84IlDtUs+O6JRMpRciXTzyCUuX11b5L5pvjH+OmFXiQ3XjabcXgg==} engines: {node: '>=10.0.0'} @@ -16868,6 +16656,7 @@ packages: hasBin: true dependencies: lru-cache: 7.8.1 + dev: true /semver/7.3.7: resolution: {integrity: sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==} @@ -17223,7 +17012,6 @@ packages: debug: 4.3.4 transitivePeerDependencies: - supports-color - dev: false /socketio-wildcard/2.0.0: resolution: {integrity: sha1-JGboMidrGRY1Y77ncjiHR/kSR1s=} @@ -18370,7 +18158,7 @@ packages: json5: 2.2.1 lodash.memoize: 4.1.2 make-error: 1.3.6 - semver: 7.3.6 + semver: 7.3.7 typescript: 4.6.3 yargs-parser: 20.2.9 dev: true @@ -18404,7 +18192,7 @@ packages: json5: 2.2.1 lodash.memoize: 4.1.2 make-error: 1.3.6 - semver: 7.3.6 + semver: 7.3.7 typescript: 4.6.4 yargs-parser: 20.2.9 dev: true @@ -18438,7 +18226,7 @@ packages: json5: 2.2.1 lodash.memoize: 4.1.2 make-error: 1.3.6 - semver: 7.3.6 + semver: 7.3.7 typescript: 4.6.3 yargs-parser: 20.2.9 dev: true @@ -18462,7 +18250,7 @@ packages: resolution: {integrity: sha512-DEQrfv6l7IvN2jlzc/VTdZJYsWUnQNCsueYjMkC/iXoEoi5fNan6MjeDqkvhfzbmHgdz9UxDUluX3V5HdjTydQ==} dev: true - /ts-node/10.7.0_kpiehm6dkipypriomyghl2wcpq: + /ts-node/10.7.0_c6ucwwwirjo6ockovr3lj3o2cm: resolution: {integrity: sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==} hasBin: true peerDependencies: @@ -18488,7 +18276,7 @@ packages: create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 4.6.4 + typescript: 4.6.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 dev: true @@ -18525,7 +18313,7 @@ packages: dependencies: '@types/json5': 0.0.29 json5: 1.0.1 - minimist: 1.2.5 + minimist: 1.2.6 strip-bom: 3.0.0 dev: true @@ -18582,17 +18370,17 @@ packages: typescript: optional: true dependencies: - bundle-require: 3.0.4_esbuild@0.14.34 + bundle-require: 3.0.4_esbuild@0.14.36 cac: 6.7.12 chokidar: 3.5.3 debug: 4.3.4 - esbuild: 0.14.34 + esbuild: 0.14.36 execa: 5.1.1 globby: 11.1.0 joycon: 3.1.1 postcss-load-config: 3.1.4 resolve-from: 5.0.0 - rollup: 2.70.1 + rollup: 2.70.2 source-map: 0.7.3 sucrase: 3.21.0 tree-kill: 1.2.2 @@ -18734,7 +18522,7 @@ packages: acorn: 8.7.0 estree-walker: 2.0.2 magic-string: 0.26.1 - unplugin: 0.6.2 + unplugin: 0.6.3 transitivePeerDependencies: - esbuild - rollup @@ -18901,28 +18689,6 @@ packages: webpack-virtual-modules: 0.4.3 dev: false - /unplugin/0.6.2: - resolution: {integrity: sha512-+QONc2uBFQbeo4x5mlJHjTKjR6pmuchMpGVrWhwdGFFMb4ttFZ4E9KqhOOrNcm3Q8NNyB1vJ4s5e36IZC7UWYw==} - peerDependencies: - esbuild: '>=0.13' - rollup: ^2.50.0 - vite: ^2.3.0 - webpack: 4 || 5 - peerDependenciesMeta: - esbuild: - optional: true - rollup: - optional: true - vite: - optional: true - webpack: - optional: true - dependencies: - chokidar: 3.5.3 - webpack-sources: 3.2.3 - webpack-virtual-modules: 0.4.3 - dev: true - /unplugin/0.6.3: resolution: {integrity: sha512-CoW88FQfCW/yabVc4bLrjikN9HC8dEvMU4O7B6K2jsYMPK0l6iAnd9dpJwqGcmXJKRCU9vwSsy653qg+RK0G6A==} peerDependencies: