From 24df8238f3e5a240321e12fd461b51911d06bd03 Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Tue, 17 Sep 2024 12:52:14 -0300 Subject: [PATCH 01/76] feat: config service --- packages/yjs/src/provider.ts | 9 +++++++++ packages/yjs/src/services/config/index.ts | 23 +++++++++++++++++++++++ packages/yjs/src/services/config/types.ts | 7 +++++++ packages/yjs/src/types.ts | 2 +- packages/yjs/types.ts | 16 ---------------- 5 files changed, 40 insertions(+), 17 deletions(-) create mode 100644 packages/yjs/src/services/config/index.ts create mode 100644 packages/yjs/src/services/config/types.ts delete mode 100644 packages/yjs/types.ts diff --git a/packages/yjs/src/provider.ts b/packages/yjs/src/provider.ts index 302ec2e..e5aae1b 100644 --- a/packages/yjs/src/provider.ts +++ b/packages/yjs/src/provider.ts @@ -4,6 +4,7 @@ import { Awareness } from "./services"; import { ObservableV2 } from "lib0/observable"; import { ProviderStatusEvents } from "./common/events.types"; import { Realtime, type Room, type SocketEvent } from "@superviz/socket-client"; +import { config } from "./services/config"; export class SuperVizYjsProvider extends ObservableV2 { public awareness: Awareness; @@ -17,6 +18,8 @@ export class SuperVizYjsProvider extends ObservableV2 { constructor(private doc: Y.Doc, private opts: Params) { super(); + this. setConfig(); + this.document = doc; this.doc.on("updateV2", this.onDocUpdate); @@ -110,4 +113,10 @@ export class SuperVizYjsProvider extends ObservableV2 { private updateDocument = (update: Uint8Array) => { Y.applyUpdateV2(this.doc, update, this); }; + + private setConfig() { + config.set("apiKey", this.opts.apiKey); + config.set("environment", this.opts.environment); + config.set("participant", this.opts.participant); + } } diff --git a/packages/yjs/src/services/config/index.ts b/packages/yjs/src/services/config/index.ts new file mode 100644 index 0000000..12c9b5a --- /dev/null +++ b/packages/yjs/src/services/config/index.ts @@ -0,0 +1,23 @@ +import { EnvironmentTypes } from "../../types"; +import { ConfigurationInterface } from "./types"; + +class Config { + private config: ConfigurationInterface = { + apiKey: '', + participant: { + id: '', + name: '', + }, + environment: '' as EnvironmentTypes, + }; + + public set(key: T, value: ConfigurationInterface[T]): void { + this.config[key] = value; + } + + public get(key: T): ConfigurationInterface[T] { + return this.config[key]; + } +} + +export const config = new Config(); \ No newline at end of file diff --git a/packages/yjs/src/services/config/types.ts b/packages/yjs/src/services/config/types.ts new file mode 100644 index 0000000..29971be --- /dev/null +++ b/packages/yjs/src/services/config/types.ts @@ -0,0 +1,7 @@ +import { EnvironmentTypes, Participant } from "../../types"; + +export interface ConfigurationInterface { + apiKey: string; + participant: Participant; + environment: EnvironmentTypes | `${EnvironmentTypes}`; +} \ No newline at end of file diff --git a/packages/yjs/src/types.ts b/packages/yjs/src/types.ts index 2ce019e..52688ce 100644 --- a/packages/yjs/src/types.ts +++ b/packages/yjs/src/types.ts @@ -1,4 +1,4 @@ -enum EnvironmentTypes { +export enum EnvironmentTypes { DEV = "dev", PROD = "prod", } diff --git a/packages/yjs/types.ts b/packages/yjs/types.ts deleted file mode 100644 index 2ce019e..0000000 --- a/packages/yjs/types.ts +++ /dev/null @@ -1,16 +0,0 @@ -enum EnvironmentTypes { - DEV = "dev", - PROD = "prod", -} - -export interface Participant { - id: string; - name: string; -} - -export type Params = { - apiKey: string; - environment: EnvironmentTypes | `${EnvironmentTypes}`; - participant: Participant; - room?: string; -}; From 119c642c0f05d7b42e22f8af3b48c2d2a30c2516 Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Tue, 17 Sep 2024 12:57:14 -0300 Subject: [PATCH 02/76] feat: createRoom utility function --- packages/yjs/src/common/types/events.types.ts | 11 +++++++++++ packages/yjs/src/common/utils/createRoom.ts | 18 ++++++++++++++++++ packages/yjs/src/provider.ts | 18 +++++++----------- 3 files changed, 36 insertions(+), 11 deletions(-) create mode 100644 packages/yjs/src/common/types/events.types.ts create mode 100644 packages/yjs/src/common/utils/createRoom.ts diff --git a/packages/yjs/src/common/types/events.types.ts b/packages/yjs/src/common/types/events.types.ts new file mode 100644 index 0000000..f8fac8b --- /dev/null +++ b/packages/yjs/src/common/types/events.types.ts @@ -0,0 +1,11 @@ +export enum ProviderStatusEvents { + CONNECTED = "connected", + DESTROY = "destroy", + DISCONNECT = "disconnect", +} + +export enum RealtimeChannelState { + DISCONNECTED = "DISCONNECTED", + CONNECTED = "CONNECTED", + CONNECTING = "CONNECTING", +} diff --git a/packages/yjs/src/common/utils/createRoom.ts b/packages/yjs/src/common/utils/createRoom.ts new file mode 100644 index 0000000..4bd251a --- /dev/null +++ b/packages/yjs/src/common/utils/createRoom.ts @@ -0,0 +1,18 @@ +import { Realtime } from "@superviz/socket-client"; + +export function createRoom(roomName: string) { + const realtime = new Realtime( + this.opts.apiKey, + this.opts.environment, + this.opts.participant, + "", + "" + ); + + const room = this.realtime.connect(roomName); + + return { + realtime, + room, + } +} \ No newline at end of file diff --git a/packages/yjs/src/provider.ts b/packages/yjs/src/provider.ts index e5aae1b..8352bd9 100644 --- a/packages/yjs/src/provider.ts +++ b/packages/yjs/src/provider.ts @@ -2,9 +2,10 @@ import * as Y from "yjs"; import { Params } from "./types"; import { Awareness } from "./services"; import { ObservableV2 } from "lib0/observable"; -import { ProviderStatusEvents } from "./common/events.types"; +import { ProviderStatusEvents } from "./common/types/events.types"; import { Realtime, type Room, type SocketEvent } from "@superviz/socket-client"; import { config } from "./services/config"; +import { createRoom } from "./common/utils/createRoom"; export class SuperVizYjsProvider extends ObservableV2 { public awareness: Awareness; @@ -19,7 +20,7 @@ export class SuperVizYjsProvider extends ObservableV2 { constructor(private doc: Y.Doc, private opts: Params) { super(); this. setConfig(); - + this.document = doc; this.doc.on("updateV2", this.onDocUpdate); @@ -49,15 +50,10 @@ export class SuperVizYjsProvider extends ObservableV2 { // #region Private methods private async startRealtime() { - const room = this.opts.room ? `yjs:${this.opts.room}` : "yjs:provider"; - this.realtime = new Realtime( - this.opts.apiKey, - this.opts.environment, - this.opts.participant, - "", - "" - ); - this.room = this.realtime.connect(room); + const roomName = this.opts.room ? `yjs:${this.opts.room}` : "yjs:sv-provider"; + const { realtime, room } = createRoom(roomName); + this.realtime = realtime; + this.room = room; this.room.on("update", (update: SocketEvent) => { this.updateDocument(new Uint8Array(update.data.update)); From 83e47af4d7190c44cad7bd0cc573e60ddbc17663 Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Wed, 18 Sep 2024 09:51:03 -0300 Subject: [PATCH 03/76] feat(yjs): host service --- packages/yjs/.prettierrc.js | 8 - packages/yjs/.prettierrc.json | 8 + packages/yjs/src/common/events.types.ts | 11 -- packages/yjs/src/common/utils/createRoom.ts | 26 +-- packages/yjs/src/provider.ts | 89 +++++----- .../yjs/src/services/awareness/awareness.ts | 31 ---- packages/yjs/src/services/awareness/index.ts | 32 +++- packages/yjs/src/services/config/index.ts | 1 + packages/yjs/src/services/config/types.ts | 1 + packages/yjs/src/services/host/index.ts | 154 ++++++++++++++++++ 10 files changed, 262 insertions(+), 99 deletions(-) delete mode 100644 packages/yjs/.prettierrc.js create mode 100644 packages/yjs/.prettierrc.json delete mode 100644 packages/yjs/src/common/events.types.ts delete mode 100644 packages/yjs/src/services/awareness/awareness.ts create mode 100644 packages/yjs/src/services/host/index.ts diff --git a/packages/yjs/.prettierrc.js b/packages/yjs/.prettierrc.js deleted file mode 100644 index cf70d4f..0000000 --- a/packages/yjs/.prettierrc.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports = { - semi: true, - trailingComma: 'all', - arrowParens: 'always', - printWidth: 100, - singleQuote: true, - tabWidth: 2, -}; diff --git a/packages/yjs/.prettierrc.json b/packages/yjs/.prettierrc.json new file mode 100644 index 0000000..d723adf --- /dev/null +++ b/packages/yjs/.prettierrc.json @@ -0,0 +1,8 @@ +{ + "semi": true, + "trailingComma": "all", + "arrowParens": "always", + "printWidth": 100, + "singleQuote": true, + "tabWidth": 2 +} diff --git a/packages/yjs/src/common/events.types.ts b/packages/yjs/src/common/events.types.ts deleted file mode 100644 index f8fac8b..0000000 --- a/packages/yjs/src/common/events.types.ts +++ /dev/null @@ -1,11 +0,0 @@ -export enum ProviderStatusEvents { - CONNECTED = "connected", - DESTROY = "destroy", - DISCONNECT = "disconnect", -} - -export enum RealtimeChannelState { - DISCONNECTED = "DISCONNECTED", - CONNECTED = "CONNECTED", - CONNECTING = "CONNECTING", -} diff --git a/packages/yjs/src/common/utils/createRoom.ts b/packages/yjs/src/common/utils/createRoom.ts index 4bd251a..ae0253f 100644 --- a/packages/yjs/src/common/utils/createRoom.ts +++ b/packages/yjs/src/common/utils/createRoom.ts @@ -1,18 +1,22 @@ -import { Realtime } from "@superviz/socket-client"; +import { Realtime, Room } from '@superviz/socket-client'; +import { config } from '../../services/config'; -export function createRoom(roomName: string) { +export function createRoom(roomName: string): { + realtime: Realtime; + room: Room; +} { const realtime = new Realtime( - this.opts.apiKey, - this.opts.environment, - this.opts.participant, - "", - "" + config.get('apiKey'), + config.get('environment'), + config.get('participant'), + '', + '', ); - - const room = this.realtime.connect(roomName); + + const room = realtime.connect(`yjs:${roomName}`); return { realtime, room, - } -} \ No newline at end of file + }; +} diff --git a/packages/yjs/src/provider.ts b/packages/yjs/src/provider.ts index 8352bd9..225cada 100644 --- a/packages/yjs/src/provider.ts +++ b/packages/yjs/src/provider.ts @@ -1,11 +1,12 @@ -import * as Y from "yjs"; -import { Params } from "./types"; -import { Awareness } from "./services"; -import { ObservableV2 } from "lib0/observable"; -import { ProviderStatusEvents } from "./common/types/events.types"; -import { Realtime, type Room, type SocketEvent } from "@superviz/socket-client"; -import { config } from "./services/config"; -import { createRoom } from "./common/utils/createRoom"; +import * as Y from 'yjs'; +import { Params } from './types'; +import { Awareness } from './services'; +import { ObservableV2 } from 'lib0/observable'; +import { ProviderStatusEvents } from './common/types/events.types'; +import { Realtime, type Room, type SocketEvent } from '@superviz/socket-client'; +import { config } from './services/config'; +import { createRoom } from './common/utils/createRoom'; +import { HostService } from './services/host'; export class SuperVizYjsProvider extends ObservableV2 { public awareness: Awareness; @@ -17,13 +18,19 @@ export class SuperVizYjsProvider extends ObservableV2 { private realtime: Realtime | null = null; private room: Room | null = null; - constructor(private doc: Y.Doc, private opts: Params) { + private hostService: HostService | null = null; + + constructor( + private doc: Y.Doc, + private opts: Params, + ) { super(); - this. setConfig(); + this.setConfig(); this.document = doc; - this.doc.on("updateV2", this.onDocUpdate); + this.doc.on('updateV2', this.onDocUpdate); + this.hostService = new HostService(this.opts.participant.id); this.awareness = new Awareness(this.doc); this.connect(); @@ -38,7 +45,7 @@ export class SuperVizYjsProvider extends ObservableV2 { public destroy() { this.awareness.destroy(); this.realtime?.destroy(); - this.doc.off("updateV2", this.onDocUpdate); + this.doc.off('updateV2', this.onDocUpdate); this.room?.disconnect(); } @@ -49,25 +56,20 @@ export class SuperVizYjsProvider extends ObservableV2 { } // #region Private methods - private async startRealtime() { - const roomName = this.opts.room ? `yjs:${this.opts.room}` : "yjs:sv-provider"; - const { realtime, room } = createRoom(roomName); + private createRoom() { + const { realtime, room } = createRoom(`yjs:${config.get('roomName')}`); this.realtime = realtime; this.room = room; + } - this.room.on("update", (update: SocketEvent) => { - this.updateDocument(new Uint8Array(update.data.update)); - }); - - this.room.presence.on("presence.joined-room", () => { - this.connected = true; - this.emit("status", [ProviderStatusEvents.CONNECTED]); - - this.room!.on("update-step-1", this.updateStepOne); - this.room!.on("update-step-2", this.updateStepTwo); + private listenToRealtimeEvents() { + this.room.on('update', this.onRemoteDocUpdate); + this.room.presence.on('presence.joined-room', this.onLocalJoinRoom); + } - this.syncClients(); - }); + private startRealtime() { + this.createRoom(); + this.listenToRealtimeEvents(); } private updateStepOne = (msg: SocketEvent) => { @@ -75,12 +77,9 @@ export class SuperVizYjsProvider extends ObservableV2 { this._synced = false; - const update = Y.encodeStateAsUpdateV2( - this.doc, - new Uint8Array(msg.data.stateVector) - ); + const update = Y.encodeStateAsUpdateV2(this.doc, new Uint8Array(msg.data.stateVector)); - this.room!.emit("update-step-2", { + this.room!.emit('update-step-2', { update, origin: this.doc.guid, }); @@ -95,7 +94,7 @@ export class SuperVizYjsProvider extends ObservableV2 { private syncClients = () => { const stateVector = Y.encodeStateVector(this.doc); - this.room!.emit("update-step-1", { + this.room!.emit('update-step-1', { stateVector, origin: this.doc.guid, }); @@ -103,7 +102,7 @@ export class SuperVizYjsProvider extends ObservableV2 { private onDocUpdate = (update: Uint8Array, origin: any) => { if (origin === this) return; - this.room!.emit("update", { update }); + this.room!.emit('update', { update }); }; private updateDocument = (update: Uint8Array) => { @@ -111,8 +110,24 @@ export class SuperVizYjsProvider extends ObservableV2 { }; private setConfig() { - config.set("apiKey", this.opts.apiKey); - config.set("environment", this.opts.environment); - config.set("participant", this.opts.participant); + config.set('apiKey', this.opts.apiKey); + config.set('environment', this.opts.environment); + config.set('participant', this.opts.participant); + config.set('roomName', this.opts.room || 'sv-provider'); } + + // #region events callbacks + private onLocalJoinRoom = () => { + this.connected = true; + this.emit('status', [ProviderStatusEvents.CONNECTED]); + + this.room!.on('update-step-1', this.updateStepOne); + this.room!.on('update-step-2', this.updateStepTwo); + + this.syncClients(); + }; + + private onRemoteDocUpdate = (update: SocketEvent) => { + this.updateDocument(new Uint8Array(update.data.update)); + }; } diff --git a/packages/yjs/src/services/awareness/awareness.ts b/packages/yjs/src/services/awareness/awareness.ts deleted file mode 100644 index d16f2be..0000000 --- a/packages/yjs/src/services/awareness/awareness.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { ObservableV2 } from "lib0/observable"; -import * as Y from "yjs"; -export class Awareness extends ObservableV2 { - public clientId: number = 0; - public meta: Map = new Map(); - public states: Map = new Map(); - - constructor(public doc: Y.Doc) { - super(); - console.log("Awareness"); - } - - public destroy(): void { - console.log("destroy"); - } - - public getLocalState(): Record | null { - return null; - } - - public getStates(): Map> { - return new Map(); - } - - public setLocalState(value: any): void { - return; - } - public setLocalStateField(field: string, value: any): void { - return; - } -} diff --git a/packages/yjs/src/services/awareness/index.ts b/packages/yjs/src/services/awareness/index.ts index f86296a..d16f2be 100644 --- a/packages/yjs/src/services/awareness/index.ts +++ b/packages/yjs/src/services/awareness/index.ts @@ -1 +1,31 @@ -export { Awareness } from "./awareness"; +import { ObservableV2 } from "lib0/observable"; +import * as Y from "yjs"; +export class Awareness extends ObservableV2 { + public clientId: number = 0; + public meta: Map = new Map(); + public states: Map = new Map(); + + constructor(public doc: Y.Doc) { + super(); + console.log("Awareness"); + } + + public destroy(): void { + console.log("destroy"); + } + + public getLocalState(): Record | null { + return null; + } + + public getStates(): Map> { + return new Map(); + } + + public setLocalState(value: any): void { + return; + } + public setLocalStateField(field: string, value: any): void { + return; + } +} diff --git a/packages/yjs/src/services/config/index.ts b/packages/yjs/src/services/config/index.ts index 12c9b5a..9f03793 100644 --- a/packages/yjs/src/services/config/index.ts +++ b/packages/yjs/src/services/config/index.ts @@ -9,6 +9,7 @@ class Config { name: '', }, environment: '' as EnvironmentTypes, + roomName: '', }; public set(key: T, value: ConfigurationInterface[T]): void { diff --git a/packages/yjs/src/services/config/types.ts b/packages/yjs/src/services/config/types.ts index 29971be..e8ccdc9 100644 --- a/packages/yjs/src/services/config/types.ts +++ b/packages/yjs/src/services/config/types.ts @@ -4,4 +4,5 @@ export interface ConfigurationInterface { apiKey: string; participant: Participant; environment: EnvironmentTypes | `${EnvironmentTypes}`; + roomName: string | undefined; } \ No newline at end of file diff --git a/packages/yjs/src/services/host/index.ts b/packages/yjs/src/services/host/index.ts new file mode 100644 index 0000000..6e77265 --- /dev/null +++ b/packages/yjs/src/services/host/index.ts @@ -0,0 +1,154 @@ +import { PresenceEvent, Realtime, Room, SocketEvent } from '@superviz/socket-client'; +import { createRoom } from '../../common/utils/createRoom'; +import { config } from '../config'; + +type RoomEvent = { + hostId: string; +}; + +export class HostService { + private _isHost: boolean = false; + private _hostId: string = ''; + private room: Room; + private realtime: Realtime; + + constructor(private participantId: string) { + const roomName = 'host-service:' + config.get('roomName'); + const { realtime, room } = createRoom(roomName); + + this.realtime = realtime; + this.room = room; + + room.presence.on('presence.leave', this.onPresenceLeave); + room.presence.on('presence.joined-room', this.onPresenceEnter); + room.on('state', (event: SocketEvent) => { + this.setHostId(event.data.hostId); + }); + } + + public destroy() { + this._isHost = false; + this._hostId = ''; + + this.room.disconnect(); + this.realtime.destroy(); + } + + /** + * @function isHost + * @description Check if the current participant is the host of the room + * @returns {boolean} + */ + public get isHost(): boolean { + return this._isHost; + } + + /** + * @function hostId + * @description Get the host's (the central source of truth of the room) id + * @returns {boolean} + */ + public get hostId(): string { + return this._hostId; + } + + /** + * @function searchHost + * @description Get room history and locate the host, if any. Otherwise, set a new host. + * @returns {void} + */ + private searchHost(): void { + this.room.history(({ events }) => { + if (events.length === 0) { + this.updateHost(); + return; + } + + if (this._hostId) return; + + this.room.presence.get((participants) => { + if (participants.length === 1 && participants[0].id === this.participantId) { + this.setHostInRoom(participants[0].id); + return; + } + + const hostId = events[events.length - 1].data.hostId; + + if (!hostId) { + this.updateHost(participants); + return; + } + + if (!participants.find((participant) => participant.id === hostId)) { + this.updateHost(participants); + return; + } + + this.setHostId(hostId); + }); + }); + } + + /** + * @function setHost + * @description Set the host of the room + * @param {string} hostId + * @returns {void} + */ + private setHostId(hostId: string): void { + this._hostId = hostId; + this._isHost = this.participantId === hostId; + } + + /** + * @function updateHost + * @description Update the host of the room + * @returns {void} + */ + private updateHost(participants?: PresenceEvent[]): void { + if (participants) { + this.setOldestAsHost(participants); + return; + } + + this.room.presence.get(this.setOldestAsHost); + } + + private setOldestAsHost = (data: PresenceEvent[]) => { + const oldestParticipant = data.reduce((prev, current) => { + return prev.timestamp < current.timestamp ? prev : current; + }, data[0]); + + if (oldestParticipant.id === this.participantId) { + this.setHostInRoom(oldestParticipant.id); + } else { + this.setHostId(oldestParticipant.id); + } + }; + + private setHostInRoom(hostId: string) { + this.room.emit('state', { + hostId: hostId, + }); + } + + // #region events callbacks + private onPresenceLeave = (presence: PresenceEvent) => { + if (presence.id === this.participantId) { + this.destroy(); + return; + } + + if (presence.id !== this.hostId) return; + + this._hostId = ''; + + this.updateHost(); + }; + + private onPresenceEnter = (presence: PresenceEvent) => { + if (this.hostId || presence.id !== this.participantId) return; + + this.searchHost(); + }; +} From 4b40ec58845673322bdd43ea1dbbeead9e0c7599 Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Wed, 18 Sep 2024 21:36:38 -0300 Subject: [PATCH 04/76] fix(yjs): sync doc when host changes --- packages/yjs/src/provider.ts | 113 ++++++++++++++++++------ packages/yjs/src/services/host/index.ts | 15 +++- packages/yjs/src/types.ts | 11 ++- 3 files changed, 107 insertions(+), 32 deletions(-) diff --git a/packages/yjs/src/provider.ts b/packages/yjs/src/provider.ts index 225cada..b149b98 100644 --- a/packages/yjs/src/provider.ts +++ b/packages/yjs/src/provider.ts @@ -1,5 +1,5 @@ import * as Y from 'yjs'; -import { Params } from './types'; +import { Params, ProviderState } from './types'; import { Awareness } from './services'; import { ObservableV2 } from 'lib0/observable'; import { ProviderStatusEvents } from './common/types/events.types'; @@ -8,12 +8,26 @@ import { config } from './services/config'; import { createRoom } from './common/utils/createRoom'; import { HostService } from './services/host'; +type MessageToHost = { + update: Uint8Array; + originId: string; +}; + +type MessageToTarget = { + update: Uint8Array; + targetId: string; +}; + +type DocUpdate = { + update: Uint8Array; +}; + export class SuperVizYjsProvider extends ObservableV2 { public awareness: Awareness; public document: Y.Doc; private _synced: boolean = false; - private connected: boolean = false; + private state: ProviderState = ProviderState.DISCONNECTED; private realtime: Realtime | null = null; private room: Room | null = null; @@ -26,27 +40,32 @@ export class SuperVizYjsProvider extends ObservableV2 { ) { super(); this.setConfig(); - this.document = doc; - this.doc.on('updateV2', this.onDocUpdate); - this.hostService = new HostService(this.opts.participant.id); - this.awareness = new Awareness(this.doc); + if (!this.opts.connect) return; this.connect(); } // #region Public methods - public connect() { - if (this.connected) return; + public connect = () => { + if (this.state !== ProviderState.DISCONNECTED) return; + this.changeState(ProviderState.CONNECTING); + + this.doc.on('updateV2', this.onDocUpdate); + this.hostService = new HostService(this.opts.participant.id, this.onHostChange); + this.awareness = new Awareness(this.doc); this.startRealtime(); - } + }; public destroy() { - this.awareness.destroy(); + if (this.state === ProviderState.DISCONNECTED) return; + this.awareness?.destroy(); this.realtime?.destroy(); this.doc.off('updateV2', this.onDocUpdate); this.room?.disconnect(); + + this.changeState(ProviderState.DISCONNECTED); } public disconnect() {} @@ -72,37 +91,48 @@ export class SuperVizYjsProvider extends ObservableV2 { this.listenToRealtimeEvents(); } - private updateStepOne = (msg: SocketEvent) => { - if (msg.presence?.id === this.opts.participant.id) return; + private onRequestHostState = (event: SocketEvent) => { + if (!this.hostService.isHost) return; this._synced = false; - const update = Y.encodeStateAsUpdateV2(this.doc, new Uint8Array(msg.data.stateVector)); + const comingUpdate = new Uint8Array(event.data.update); + this.updateDocument(comingUpdate); + const update = Y.encodeStateAsUpdateV2(this.doc, comingUpdate); + + if (update.length > 0) { + // if the content was new to host, it is new to all users + this.broadcastUpdate(update); + return; + } - this.room!.emit('update-step-2', { + this.room!.emit('message-to-specific-user', { update, - origin: this.doc.guid, + targetId: event.data.originId, }); }; - private updateStepTwo = (msg: SocketEvent) => { - if (msg.presence?.id === this.opts.participant.id) return; + private onMessageFromHost = (msg: SocketEvent) => { + if (msg.data.targetId !== this.opts.participant.id) return; + this.updateDocument(new Uint8Array(msg.data.update)); - this._synced = false; + this._synced = true; }; - private syncClients = () => { - const stateVector = Y.encodeStateVector(this.doc); + private fetch = () => { + this._synced = false; + + const update = Y.encodeStateAsUpdateV2(this.doc); - this.room!.emit('update-step-1', { - stateVector, - origin: this.doc.guid, + this.room!.emit('send-local-sv-to-host', { + update, + originId: this.opts.participant.id, }); }; private onDocUpdate = (update: Uint8Array, origin: any) => { if (origin === this) return; - this.room!.emit('update', { update }); + this.room!.emit('update', { update }); }; private updateDocument = (update: Uint8Array) => { @@ -118,16 +148,41 @@ export class SuperVizYjsProvider extends ObservableV2 { // #region events callbacks private onLocalJoinRoom = () => { - this.connected = true; + this.changeState(ProviderState.CONNECTED); + this.emit('status', [ProviderStatusEvents.CONNECTED]); - this.room!.on('update-step-1', this.updateStepOne); - this.room!.on('update-step-2', this.updateStepTwo); + this.room!.on('send-local-sv-to-host', this.onRequestHostState); + this.room!.on('message-to-specific-user', this.onMessageFromHost); + this.room!.on('broadcast', this.onBroadcast); - this.syncClients(); + this.fetch(); }; - private onRemoteDocUpdate = (update: SocketEvent) => { + private onRemoteDocUpdate = (update: SocketEvent) => { this.updateDocument(new Uint8Array(update.data.update)); }; + + private onBroadcast = (event: SocketEvent) => { + this.onRemoteDocUpdate(event); + this._synced = true; + }; + + private onHostChange = (hostId: string) => { + if (hostId === this.opts.participant.id) { + this._synced = true; + return; + } + + this.fetch(); + }; + + private changeState(state: ProviderState) { + this.emit('state', [state]); + this.state = state; + } + + private broadcastUpdate(update: Uint8Array) { + this.room!.emit('broadcast', { update }); + } } diff --git a/packages/yjs/src/services/host/index.ts b/packages/yjs/src/services/host/index.ts index 6e77265..9afc4ca 100644 --- a/packages/yjs/src/services/host/index.ts +++ b/packages/yjs/src/services/host/index.ts @@ -11,13 +11,18 @@ export class HostService { private _hostId: string = ''; private room: Room; private realtime: Realtime; + private callback: (hostId: string) => void; - constructor(private participantId: string) { + constructor( + private participantId: string, + callback: (hostId: string) => void, + ) { const roomName = 'host-service:' + config.get('roomName'); const { realtime, room } = createRoom(roomName); this.realtime = realtime; this.room = room; + this.onHostChange(callback); room.presence.on('presence.leave', this.onPresenceLeave); room.presence.on('presence.joined-room', this.onPresenceEnter); @@ -34,6 +39,10 @@ export class HostService { this.realtime.destroy(); } + private onHostChange(callback: (hostId: string) => void) { + this.callback = callback; + } + /** * @function isHost * @description Check if the current participant is the host of the room @@ -98,6 +107,10 @@ export class HostService { private setHostId(hostId: string): void { this._hostId = hostId; this._isHost = this.participantId === hostId; + + if (this.callback) { + this.callback(hostId); + } } /** diff --git a/packages/yjs/src/types.ts b/packages/yjs/src/types.ts index 52688ce..72c9164 100644 --- a/packages/yjs/src/types.ts +++ b/packages/yjs/src/types.ts @@ -1,6 +1,6 @@ export enum EnvironmentTypes { - DEV = "dev", - PROD = "prod", + DEV = 'dev', + PROD = 'prod', } export interface Participant { @@ -13,4 +13,11 @@ export type Params = { environment: EnvironmentTypes | `${EnvironmentTypes}`; participant: Participant; room?: string; + connect?: boolean; }; + +export enum ProviderState { + CONNECTED = 'connected', + CONNECTING = 'connecting', + DISCONNECTED = 'disconnected', +} From 82dee3a169fdd4312399c24af12e010b768ab01f Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Thu, 19 Sep 2024 00:39:55 -0300 Subject: [PATCH 05/76] docs(yjs): add jsdoc to public methods --- packages/yjs/src/provider.ts | 55 ++++++++++++++++++++++-------------- 1 file changed, 34 insertions(+), 21 deletions(-) diff --git a/packages/yjs/src/provider.ts b/packages/yjs/src/provider.ts index b149b98..474235b 100644 --- a/packages/yjs/src/provider.ts +++ b/packages/yjs/src/provider.ts @@ -48,7 +48,14 @@ export class SuperVizYjsProvider extends ObservableV2 { } // #region Public methods - public connect = () => { + /** + * @function connect + * @description Connect to the room. With this, start to send and receive awareness and document updates. This method is called automatically when a SuperVizYjsProvider instance is created, unless opted-out by passing "connect: false" in the constructor options. Can't connect if it is already connected + * @public + * @emits state + * @returns {void} + */ + public connect = (): void => { if (this.state !== ProviderState.DISCONNECTED) return; this.changeState(ProviderState.CONNECTING); @@ -58,7 +65,12 @@ export class SuperVizYjsProvider extends ObservableV2 { this.startRealtime(); }; - public destroy() { + /** + * @public @function destroy + * @description Disconnect from the room and reset the instance state. + * @emits state @returns {void} + */ + public destroy(): void { if (this.state === ProviderState.DISCONNECTED) return; this.awareness?.destroy(); this.realtime?.destroy(); @@ -68,30 +80,32 @@ export class SuperVizYjsProvider extends ObservableV2 { this.changeState(ProviderState.DISCONNECTED); } - public disconnect() {} - - public get synced() { + /** + * @type {boolean} + * @description Whether the user is connected to the room or not + */ + public get synced(): boolean { return this._synced; } // #region Private methods - private createRoom() { + private createRoom(): void { const { realtime, room } = createRoom(`yjs:${config.get('roomName')}`); this.realtime = realtime; this.room = room; } - private listenToRealtimeEvents() { + private listenToRealtimeEvents(): void { this.room.on('update', this.onRemoteDocUpdate); this.room.presence.on('presence.joined-room', this.onLocalJoinRoom); } - private startRealtime() { + private startRealtime(): void { this.createRoom(); this.listenToRealtimeEvents(); } - private onRequestHostState = (event: SocketEvent) => { + private onRequestHostState = (event: SocketEvent): void => { if (!this.hostService.isHost) return; this._synced = false; @@ -112,14 +126,14 @@ export class SuperVizYjsProvider extends ObservableV2 { }); }; - private onMessageFromHost = (msg: SocketEvent) => { + private onMessageFromHost = (msg: SocketEvent): void => { if (msg.data.targetId !== this.opts.participant.id) return; this.updateDocument(new Uint8Array(msg.data.update)); this._synced = true; }; - private fetch = () => { + private fetch = (): void => { this._synced = false; const update = Y.encodeStateAsUpdateV2(this.doc); @@ -130,16 +144,15 @@ export class SuperVizYjsProvider extends ObservableV2 { }); }; - private onDocUpdate = (update: Uint8Array, origin: any) => { - if (origin === this) return; + private onDocUpdate = (update: Uint8Array): void => { this.room!.emit('update', { update }); }; - private updateDocument = (update: Uint8Array) => { + private updateDocument = (update: Uint8Array): void => { Y.applyUpdateV2(this.doc, update, this); }; - private setConfig() { + private setConfig(): void { config.set('apiKey', this.opts.apiKey); config.set('environment', this.opts.environment); config.set('participant', this.opts.participant); @@ -147,7 +160,7 @@ export class SuperVizYjsProvider extends ObservableV2 { } // #region events callbacks - private onLocalJoinRoom = () => { + private onLocalJoinRoom = (): void => { this.changeState(ProviderState.CONNECTED); this.emit('status', [ProviderStatusEvents.CONNECTED]); @@ -159,16 +172,16 @@ export class SuperVizYjsProvider extends ObservableV2 { this.fetch(); }; - private onRemoteDocUpdate = (update: SocketEvent) => { + private onRemoteDocUpdate = (update: SocketEvent): void => { this.updateDocument(new Uint8Array(update.data.update)); }; - private onBroadcast = (event: SocketEvent) => { + private onBroadcast = (event: SocketEvent): void => { this.onRemoteDocUpdate(event); this._synced = true; }; - private onHostChange = (hostId: string) => { + private onHostChange = (hostId: string): void => { if (hostId === this.opts.participant.id) { this._synced = true; return; @@ -177,12 +190,12 @@ export class SuperVizYjsProvider extends ObservableV2 { this.fetch(); }; - private changeState(state: ProviderState) { + private changeState(state: ProviderState): void { this.emit('state', [state]); this.state = state; } - private broadcastUpdate(update: Uint8Array) { + private broadcastUpdate(update: Uint8Array): void { this.room!.emit('broadcast', { update }); } } From 128d5381ad9bb490e030171167edfd258eb505dc Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Sun, 22 Sep 2024 03:55:20 -0300 Subject: [PATCH 06/76] feat: awareness --- packages/yjs/package.json | 1 + packages/yjs/src/provider.ts | 21 +- packages/yjs/src/services/awareness/index.ts | 219 +++++++++++++++++-- packages/yjs/src/services/awareness/types.ts | 9 + packages/yjs/src/services/host/index.ts | 5 - packages/yjs/src/types.ts | 2 + 6 files changed, 232 insertions(+), 25 deletions(-) create mode 100644 packages/yjs/src/services/awareness/types.ts diff --git a/packages/yjs/package.json b/packages/yjs/package.json index 38b0a65..a4d4866 100644 --- a/packages/yjs/package.json +++ b/packages/yjs/package.json @@ -35,6 +35,7 @@ "lib0": "^0.2.97", "rxjs": "^7.8.1", "typescript": "^5.6.2", + "y-protocols": "^1.0.6", "yjs": "^13.3.1" }, "devDependencies": { diff --git a/packages/yjs/src/provider.ts b/packages/yjs/src/provider.ts index 474235b..75d214d 100644 --- a/packages/yjs/src/provider.ts +++ b/packages/yjs/src/provider.ts @@ -27,7 +27,7 @@ export class SuperVizYjsProvider extends ObservableV2 { public document: Y.Doc; private _synced: boolean = false; - private state: ProviderState = ProviderState.DISCONNECTED; + private state: ProviderState | `${ProviderState}` = ProviderState.DISCONNECTED; private realtime: Realtime | null = null; private room: Room | null = null; @@ -41,6 +41,7 @@ export class SuperVizYjsProvider extends ObservableV2 { super(); this.setConfig(); this.document = doc; + this.awareness = new Awareness(this.doc, this.opts.participant.id); if (!this.opts.connect) return; @@ -60,8 +61,6 @@ export class SuperVizYjsProvider extends ObservableV2 { this.changeState(ProviderState.CONNECTING); this.doc.on('updateV2', this.onDocUpdate); - this.hostService = new HostService(this.opts.participant.id, this.onHostChange); - this.awareness = new Awareness(this.doc); this.startRealtime(); }; @@ -70,15 +69,20 @@ export class SuperVizYjsProvider extends ObservableV2 { * @description Disconnect from the room and reset the instance state. * @emits state @returns {void} */ - public destroy(): void { + public destroy = (): void => { if (this.state === ProviderState.DISCONNECTED) return; this.awareness?.destroy(); this.realtime?.destroy(); + this.hostService?.destroy(); this.doc.off('updateV2', this.onDocUpdate); - this.room?.disconnect(); + + if (this.room) { + this.room.disconnect(); + this.room = null; + } this.changeState(ProviderState.DISCONNECTED); - } + }; /** * @type {boolean} @@ -102,6 +106,7 @@ export class SuperVizYjsProvider extends ObservableV2 { private startRealtime(): void { this.createRoom(); + this.hostService = new HostService(this.opts.participant.id, this.onHostChange); this.listenToRealtimeEvents(); } @@ -161,8 +166,10 @@ export class SuperVizYjsProvider extends ObservableV2 { // #region events callbacks private onLocalJoinRoom = (): void => { - this.changeState(ProviderState.CONNECTED); + if (this.state === ProviderState.CONNECTED) return; + this.awareness.connect(this.room!); + this.changeState(ProviderState.CONNECTED); this.emit('status', [ProviderStatusEvents.CONNECTED]); this.room!.on('send-local-sv-to-host', this.onRequestHostState); diff --git a/packages/yjs/src/services/awareness/index.ts b/packages/yjs/src/services/awareness/index.ts index d16f2be..3635355 100644 --- a/packages/yjs/src/services/awareness/index.ts +++ b/packages/yjs/src/services/awareness/index.ts @@ -1,31 +1,224 @@ -import { ObservableV2 } from "lib0/observable"; -import * as Y from "yjs"; +import { ObservableV2 } from 'lib0/observable'; +import { PresenceEvent, Room } from '@superviz/socket-client'; +import * as Y from 'yjs'; +import { UpdateOrigin, UpdatePresence } from './types'; + export class Awareness extends ObservableV2 { public clientId: number = 0; - public meta: Map = new Map(); - public states: Map = new Map(); + public meta: Map = new Map(); + public states: Map = new Map(); + + private participantIdToClientId: Map = new Map(); + private room: Room | null = null; + + private visibilityTimeout: number | undefined; + + private readonly TIMEOUT_TIMER_MS = 30000; + private readonly Y_PRESENCE_KEY = '__yjs'; - constructor(public doc: Y.Doc) { + private previousState: any | null = null; + + constructor( + public doc: Y.Doc, + private participantId: string, + ) { super(); - console.log("Awareness"); + this.clientId = this.doc.clientID; } + public connect(room: Room): void { + this.room = room; + this.addRoomListeners(); + this.addDocumentListeners(); + + this.room.presence.get((presences: PresenceEvent[]) => { + const added: number[] = []; + + presences.forEach((presence) => { + const clientId = presence.data.clientId; + if (!clientId) return; + added.push(clientId); + this.participantIdToClientId.set(presence.id, clientId); + this.states.set(clientId, { + ...presence.data, + }); + }); + + const clientId = this.doc.clientID; + this.room.presence.update({ + clientId, + [this.Y_PRESENCE_KEY]: {}, + }); + + const update = { added, updated: [], removed: [] }; + + this.emit('change', [update, UpdateOrigin.PRESENCE]); + this.emit('update', [update, UpdateOrigin.PRESENCE]); + }); + } + + //#region public public destroy(): void { - console.log("destroy"); + clearInterval(this.visibilityTimeout); + this.visibilityTimeout = undefined; + + this.removeDocumentListeners(); + this.removeRoomListeners(); + + this.onLeave({ id: this.participantId } as unknown as PresenceEvent); } public getLocalState(): Record | null { - return null; + const state = this.states.get(this.clientId); + if (!state || !state[this.Y_PRESENCE_KEY]) return null; + + return state[this.Y_PRESENCE_KEY]; } - public getStates(): Map> { - return new Map(); + public getStates(): Map> { + const states = new Map>(); + this.states.forEach((state, clientId) => { + states.set(clientId, state[this.Y_PRESENCE_KEY]); + }); + + return states; } - public setLocalState(value: any): void { + public setLocalState = (state: Record | null): void => { + if (state === null) { + if (!this.states.has(this.clientId)) return; + this.states.delete(this.clientId); + this.room?.presence.update({ + ...this.states.get(this.clientId), + [this.Y_PRESENCE_KEY]: null, + }); + + const update = { added: [], updated: [], removed: [this.clientId] }; + this.emit('change', [update, UpdateOrigin.LOCAL]); + this.emit('update', [update, UpdateOrigin.LOCAL]); + return; + } + + if (this.previousState && document.visibilityState === 'hidden') return; + + const update = { added: [], updated: [], removed: [] }; + let oldState = this.states.get(this.clientId); + if (oldState) { + update.updated.push(this.clientId); + } else { + oldState = { [this.Y_PRESENCE_KEY]: {}, clientId: this.clientId }; + update.added.push(this.clientId); + } + + this.room?.presence.update({ + ...oldState, + [this.Y_PRESENCE_KEY]: state, + }); + + this.emit('change', [update, UpdateOrigin.LOCAL]); return; - } + }; + public setLocalStateField(field: string, value: any): void { - return; + const state = this.getLocalState(); + this.setLocalState({ + ...(state || {}), + [field]: value, + }); } + + //#region private + private addRoomListeners(): void { + this.room.presence.on('presence.update', this.onUpdate); + this.room.presence.on('presence.leave', this.onLeave); + } + + private removeRoomListeners(): void { + this.room.presence.off('presence.update'); + this.room.presence.off('presence.leave'); + } + + private addDocumentListeners(): void { + document.addEventListener('visibilitychange', this.onVisibilityChange); + } + + private removeDocumentListeners(): void { + document.removeEventListener('visibilitychange', this.onVisibilityChange); + } + + private onLeave = (event: PresenceEvent): void => { + const clientId = this.participantIdToClientId.get(event.id); + if (!clientId) return; + + if (clientId === this.clientId) { + const ids = Array.from(this.states.keys()); + this.removeAwarenessStates(ids, UpdateOrigin.PRESENCE); + return; + } + + const update = { added: [], updated: [], removed: [clientId] }; + this.participantIdToClientId.delete(event.id); + this.states.delete(clientId); + + this.emit('change', [update, UpdateOrigin.PRESENCE]); + this.emit('update', [update, UpdateOrigin.PRESENCE]); + }; + + private onUpdate = (event: PresenceEvent): void => { + if (event.data[this.Y_PRESENCE_KEY] === null) { + this.removeAwarenessStates([event.data.clientId], UpdateOrigin.PRESENCE); + return; + } + + const added: number[] = []; + const updated: number[] = []; + let clientId = this.participantIdToClientId.get(event.id); + + if (clientId) { + updated.push(event.data.clientId); + } else { + this.participantIdToClientId.set(event.id, event.data.clientId); + clientId = event.data.clientId; + added.push(event.data.clientId); + } + + this.states.set(clientId, { + ...(this.states.get(clientId) || {}), + ...event.data, + }); + + this.emit('change', [{ added, updated, removed: [] }, UpdateOrigin.PRESENCE]); + this.emit('update', [{ added, updated, removed: [] }, UpdateOrigin.PRESENCE]); + }; + + private removeAwarenessStates(removed: number[], origin: string): void { + const update = { added: [], updated: [], removed: [] }; + removed.forEach((clientId) => { + if (!this.states.get(clientId)) return; + + this.states.delete(clientId); + update.removed.push(clientId); + }); + + this.emit('change', [update, origin]); + this.emit('update', [update, origin]); + } + + private onVisibilityChange = (): void => { + if (document.visibilityState === 'visible') { + clearTimeout(this.visibilityTimeout); + + if (this.previousState) { + this.setLocalState(this.previousState); + this.previousState = null; + } + + return; + } + + this.visibilityTimeout = setTimeout(() => { + this.previousState = this.getLocalState(); + this.setLocalState(null); + }, this.TIMEOUT_TIMER_MS); + }; } diff --git a/packages/yjs/src/services/awareness/types.ts b/packages/yjs/src/services/awareness/types.ts new file mode 100644 index 0000000..237a344 --- /dev/null +++ b/packages/yjs/src/services/awareness/types.ts @@ -0,0 +1,9 @@ +export enum UpdateOrigin { + PRESENCE = 'presence', + LOCAL = 'local', +} + +export interface UpdatePresence { + clientId: number; + __yjs: any; +} diff --git a/packages/yjs/src/services/host/index.ts b/packages/yjs/src/services/host/index.ts index 9afc4ca..2a8fd21 100644 --- a/packages/yjs/src/services/host/index.ts +++ b/packages/yjs/src/services/host/index.ts @@ -147,11 +147,6 @@ export class HostService { // #region events callbacks private onPresenceLeave = (presence: PresenceEvent) => { - if (presence.id === this.participantId) { - this.destroy(); - return; - } - if (presence.id !== this.hostId) return; this._hostId = ''; diff --git a/packages/yjs/src/types.ts b/packages/yjs/src/types.ts index 72c9164..01ae767 100644 --- a/packages/yjs/src/types.ts +++ b/packages/yjs/src/types.ts @@ -14,6 +14,8 @@ export type Params = { participant: Participant; room?: string; connect?: boolean; + // debug?: boolean; + // awareness?: boolean = true; }; export enum ProviderState { From cf781acf005314dbd78a3264a67be5c23375ab6e Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Sun, 22 Sep 2024 04:30:47 -0300 Subject: [PATCH 07/76] fix: store local state and retrieve when connect to room --- packages/yjs/src/services/awareness/index.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/yjs/src/services/awareness/index.ts b/packages/yjs/src/services/awareness/index.ts index 3635355..cbc7f1d 100644 --- a/packages/yjs/src/services/awareness/index.ts +++ b/packages/yjs/src/services/awareness/index.ts @@ -48,6 +48,7 @@ export class Awareness extends ObservableV2 { this.room.presence.update({ clientId, [this.Y_PRESENCE_KEY]: {}, + ...(this.states.get(clientId) || {}), }); const update = { added, updated: [], removed: [] }; @@ -110,10 +111,9 @@ export class Awareness extends ObservableV2 { update.added.push(this.clientId); } - this.room?.presence.update({ - ...oldState, - [this.Y_PRESENCE_KEY]: state, - }); + const newState = { ...oldState, [this.Y_PRESENCE_KEY]: state }; + this.states.set(this.clientId, newState); + this.room?.presence.update(newState); this.emit('change', [update, UpdateOrigin.LOCAL]); return; From 418a9d0347243083775e26dc6e6c29ba6d05233b Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Sun, 22 Sep 2024 04:31:00 -0300 Subject: [PATCH 08/76] feat: clean up awareness class on destroy --- packages/yjs/src/services/awareness/index.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/yjs/src/services/awareness/index.ts b/packages/yjs/src/services/awareness/index.ts index cbc7f1d..9842b6b 100644 --- a/packages/yjs/src/services/awareness/index.ts +++ b/packages/yjs/src/services/awareness/index.ts @@ -66,6 +66,10 @@ export class Awareness extends ObservableV2 { this.removeDocumentListeners(); this.removeRoomListeners(); + this.room = null; + this.states.clear(); + this.participantIdToClientId.clear(); + this.onLeave({ id: this.participantId } as unknown as PresenceEvent); } From 92df60aaeff51689225600c70425c5b33ac61cf6 Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Tue, 24 Sep 2024 02:36:59 -0300 Subject: [PATCH 09/76] feat: improve types and emit events --- packages/yjs/src/provider.ts | 152 +++++++++++++++++++++++++---------- packages/yjs/src/types.ts | 58 +++++++++++++ 2 files changed, 167 insertions(+), 43 deletions(-) diff --git a/packages/yjs/src/provider.ts b/packages/yjs/src/provider.ts index 75d214d..1c190fd 100644 --- a/packages/yjs/src/provider.ts +++ b/packages/yjs/src/provider.ts @@ -1,28 +1,31 @@ import * as Y from 'yjs'; -import { Params, ProviderState } from './types'; +import { + DocUpdate, + Emitter, + Message, + MessageToHost, + MessageToTarget, + MyEvents, + Params, + ProviderEvents, + ProviderState, + RealtimeRoom, +} from './types'; import { Awareness } from './services'; import { ObservableV2 } from 'lib0/observable'; -import { ProviderStatusEvents } from './common/types/events.types'; -import { Realtime, type Room, type SocketEvent } from '@superviz/socket-client'; +import { + ClientState, + ConnectionState, + PresenceEvent, + PresenceEvents, + Realtime, + type SocketEvent, +} from '@superviz/socket-client'; import { config } from './services/config'; import { createRoom } from './common/utils/createRoom'; import { HostService } from './services/host'; -type MessageToHost = { - update: Uint8Array; - originId: string; -}; - -type MessageToTarget = { - update: Uint8Array; - targetId: string; -}; - -type DocUpdate = { - update: Uint8Array; -}; - -export class SuperVizYjsProvider extends ObservableV2 { +export class SuperVizYjsProvider extends ObservableV2 { public awareness: Awareness; public document: Y.Doc; @@ -30,7 +33,7 @@ export class SuperVizYjsProvider extends ObservableV2 { private state: ProviderState | `${ProviderState}` = ProviderState.DISCONNECTED; private realtime: Realtime | null = null; - private room: Room | null = null; + private room: RealtimeRoom | null = null; private hostService: HostService | null = null; @@ -71,11 +74,15 @@ export class SuperVizYjsProvider extends ObservableV2 { */ public destroy = (): void => { if (this.state === ProviderState.DISCONNECTED) return; + this.emit('destroy', []); + this.awareness?.destroy(); this.realtime?.destroy(); this.hostService?.destroy(); this.doc.off('updateV2', this.onDocUpdate); + this.removeRoomListeners(); + if (this.room) { this.room.disconnect(); this.room = null; @@ -99,58 +106,94 @@ export class SuperVizYjsProvider extends ObservableV2 { this.room = room; } - private listenToRealtimeEvents(): void { - this.room.on('update', this.onRemoteDocUpdate); - this.room.presence.on('presence.joined-room', this.onLocalJoinRoom); + private addRoomListeners(): void { + this.room.on(ProviderEvents.UPDATE, this.onRemoteDocUpdate); + this.room.presence.on(PresenceEvents.JOINED_ROOM, this.onLocalJoinRoom); + this.realtime.connection.on(this.onConnectionChange); + } + + private removeRoomListeners(): void { + if (this.room) { + this.room.off(ProviderEvents.UPDATE, this.onRemoteDocUpdate); + this.room.off(ProviderEvents.MESSAGE_TO_HOST, this.onMessageToHost); + this.room.off(ProviderEvents.MESSAGE_TO_SPECIFIC_USER, this.onMessageToUser); + this.room.off(ProviderEvents.BROADCAST, this.onBroadcast); + this.room.presence.off(PresenceEvents.JOINED_ROOM); + } + + this.realtime?.connection.off(); } private startRealtime(): void { this.createRoom(); this.hostService = new HostService(this.opts.participant.id, this.onHostChange); - this.listenToRealtimeEvents(); + this.addRoomListeners(); } - private onRequestHostState = (event: SocketEvent): void => { + private onMessageToHost = (event: SocketEvent): void => { if (!this.hostService.isHost) return; this._synced = false; const comingUpdate = new Uint8Array(event.data.update); + this.onReceiveRealtimeMessage('message-to-host', { + update: comingUpdate, + originId: event.data.originId, + }); + this.updateDocument(comingUpdate); const update = Y.encodeStateAsUpdateV2(this.doc, comingUpdate); if (update.length > 0) { - // if the content was new to host, it is new to all users - this.broadcastUpdate(update); + this.beforeSendRealtimeMessage('broadcast', { update }); + this.room!.emit('broadcast', { update }); return; } - this.room!.emit('message-to-specific-user', { + this.beforeSendRealtimeMessage('message-to-specific-user', { + update, + targetId: event.data.originId, + }); + this.room!.emit('message-to-specific-user', { update, targetId: event.data.originId, }); }; - private onMessageFromHost = (msg: SocketEvent): void => { + private onMessageToUser = (msg: SocketEvent): void => { if (msg.data.targetId !== this.opts.participant.id) return; - this.updateDocument(new Uint8Array(msg.data.update)); + const update = new Uint8Array(msg.data.update); + this.onReceiveRealtimeMessage('message-to-specific-user', { + update, + targetId: msg.data.targetId, + }); + + this.updateDocument(update); this._synced = true; + + this.emit('synced', []); + this.emit('sync', []); }; private fetch = (): void => { this._synced = false; const update = Y.encodeStateAsUpdateV2(this.doc); + this.beforeSendRealtimeMessage('message-to-host', { + update, + originId: this.opts.participant.id, + }); - this.room!.emit('send-local-sv-to-host', { + this.room!.emit('message-to-host', { update, originId: this.opts.participant.id, }); }; private onDocUpdate = (update: Uint8Array): void => { - this.room!.emit('update', { update }); + this.beforeSendRealtimeMessage('update', { update }); + this.room!.emit('update', { update }); }; private updateDocument = (update: Uint8Array): void => { @@ -165,27 +208,46 @@ export class SuperVizYjsProvider extends ObservableV2 { } // #region events callbacks - private onLocalJoinRoom = (): void => { - if (this.state === ProviderState.CONNECTED) return; + private onLocalJoinRoom = (event: PresenceEvent): void => { + if (this.state === ProviderState.CONNECTED || event.id !== this.opts.participant.id) return; this.awareness.connect(this.room!); this.changeState(ProviderState.CONNECTED); - this.emit('status', [ProviderStatusEvents.CONNECTED]); + this.emit('connect', []); - this.room!.on('send-local-sv-to-host', this.onRequestHostState); - this.room!.on('message-to-specific-user', this.onMessageFromHost); - this.room!.on('broadcast', this.onBroadcast); + this.room!.on(ProviderEvents.MESSAGE_TO_HOST, this.onMessageToHost); + this.room!.on(ProviderEvents.MESSAGE_TO_SPECIFIC_USER, this.onMessageToUser); + this.room!.on(ProviderEvents.BROADCAST, this.onBroadcast); this.fetch(); }; - private onRemoteDocUpdate = (update: SocketEvent): void => { - this.updateDocument(new Uint8Array(update.data.update)); + private onConnectionChange = (msg: ConnectionState): void => { + if (msg.state === ClientState.DISCONNECTED) { + this.emit('disconnect', []); + } + }; + + private onRemoteDocUpdate = (event: SocketEvent): void => { + if (event.presence?.id === this.opts.participant.id) return; + + const update = new Uint8Array(event.data.update); + this.onReceiveRealtimeMessage('update', { update }); + + this.updateDocument(update); }; private onBroadcast = (event: SocketEvent): void => { - this.onRemoteDocUpdate(event); + if (this.hostService?.isHost) return; + + const update = new Uint8Array(event.data.update); + this.onReceiveRealtimeMessage('broadcast', { update }); + + this.updateDocument(update); this._synced = true; + + this.emit('synced', []); + this.emit('sync', []); }; private onHostChange = (hostId: string): void => { @@ -202,7 +264,11 @@ export class SuperVizYjsProvider extends ObservableV2 { this.state = state; } - private broadcastUpdate(update: Uint8Array): void { - this.room!.emit('broadcast', { update }); - } + private onReceiveRealtimeMessage: Emitter = (name, data): void => { + this.emit('message', [{ name, data } as Message]); + }; + + private beforeSendRealtimeMessage: Emitter = (name, data): void => { + this.emit('outgoingMessage', [{ name, data } as Message]); + }; } diff --git a/packages/yjs/src/types.ts b/packages/yjs/src/types.ts index 01ae767..e7b4c69 100644 --- a/packages/yjs/src/types.ts +++ b/packages/yjs/src/types.ts @@ -1,3 +1,5 @@ +import type { Room } from '@superviz/socket-client'; + export enum EnvironmentTypes { DEV = 'dev', PROD = 'prod', @@ -23,3 +25,59 @@ export enum ProviderState { CONNECTING = 'connecting', DISCONNECTED = 'disconnected', } + +export enum ProviderEvents { + MESSAGE_TO_HOST = 'message-to-host', + MESSAGE_TO_SPECIFIC_USER = 'message-to-specific-user', + BROADCAST = 'broadcast', + UPDATE = 'update', +} + +export type MessageToHost = { + update: Uint8Array; + originId: string; +}; + +export type MessageToTarget = { + update: Uint8Array; + targetId: string; +}; + +export type DocUpdate = { + update: Uint8Array; +}; + +// different values that the user can receive when event 'message' +// is emitted based on the event name +export type Message = + | { + name: ProviderEvents.MESSAGE_TO_HOST | `${ProviderEvents.MESSAGE_TO_HOST}`; + data: { update: Uint8Array; originId: string }; + } + | { + name: ProviderEvents.MESSAGE_TO_SPECIFIC_USER | `${ProviderEvents.MESSAGE_TO_SPECIFIC_USER}`; + data: { update: Uint8Array; targetId: string }; + } + | { name: ProviderEvents.BROADCAST | `${ProviderEvents.BROADCAST}`; data: { update: Uint8Array } } + | { name: ProviderEvents.UPDATE | `${ProviderEvents.UPDATE}`; data: { update: Uint8Array } }; + +export type MessageCallback = (message: Message) => void; + +export type Emitter = ( + name: T, + data: Extract['data'], +) => void; + +export type MyEvents = { + connect: () => void; + disconnect: () => void; + synced: () => void; + sync: () => void; + destroy: () => void; + + message: MessageCallback; + outgoingMessage: MessageCallback; + state: (state: ProviderState | `${ProviderState}`) => void; +}; + +export type RealtimeRoom = Omit & { emit: Emitter }; From b79d2d484ced0119dd3cbd71bb06bac55f418357 Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Tue, 24 Sep 2024 02:50:09 -0300 Subject: [PATCH 10/76] feat: emit awareness events more properly --- packages/yjs/src/services/awareness/index.ts | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/packages/yjs/src/services/awareness/index.ts b/packages/yjs/src/services/awareness/index.ts index 9842b6b..c6dacd2 100644 --- a/packages/yjs/src/services/awareness/index.ts +++ b/packages/yjs/src/services/awareness/index.ts @@ -1,7 +1,8 @@ import { ObservableV2 } from 'lib0/observable'; -import { PresenceEvent, Room } from '@superviz/socket-client'; +import { PresenceEvent } from '@superviz/socket-client'; import * as Y from 'yjs'; import { UpdateOrigin, UpdatePresence } from './types'; +import { RealtimeRoom } from '../../types'; export class Awareness extends ObservableV2 { public clientId: number = 0; @@ -9,7 +10,7 @@ export class Awareness extends ObservableV2 { public states: Map = new Map(); private participantIdToClientId: Map = new Map(); - private room: Room | null = null; + private room: RealtimeRoom | null = null; private visibilityTimeout: number | undefined; @@ -26,7 +27,7 @@ export class Awareness extends ObservableV2 { this.clientId = this.doc.clientID; } - public connect(room: Room): void { + public connect(room: RealtimeRoom): void { this.room = room; this.addRoomListeners(); this.addDocumentListeners(); @@ -49,12 +50,12 @@ export class Awareness extends ObservableV2 { clientId, [this.Y_PRESENCE_KEY]: {}, ...(this.states.get(clientId) || {}), + origin: 'on connect', }); const update = { added, updated: [], removed: [] }; this.emit('change', [update, UpdateOrigin.PRESENCE]); - this.emit('update', [update, UpdateOrigin.PRESENCE]); }); } @@ -96,11 +97,11 @@ export class Awareness extends ObservableV2 { this.room?.presence.update({ ...this.states.get(this.clientId), [this.Y_PRESENCE_KEY]: null, + origin: 'set local state null', }); const update = { added: [], updated: [], removed: [this.clientId] }; this.emit('change', [update, UpdateOrigin.LOCAL]); - this.emit('update', [update, UpdateOrigin.LOCAL]); return; } @@ -115,12 +116,11 @@ export class Awareness extends ObservableV2 { update.added.push(this.clientId); } - const newState = { ...oldState, [this.Y_PRESENCE_KEY]: state }; + const newState = { ...oldState, [this.Y_PRESENCE_KEY]: state, origin: 'set local state' }; this.states.set(this.clientId, newState); this.room?.presence.update(newState); this.emit('change', [update, UpdateOrigin.LOCAL]); - return; }; public setLocalStateField(field: string, value: any): void { @@ -164,11 +164,12 @@ export class Awareness extends ObservableV2 { this.participantIdToClientId.delete(event.id); this.states.delete(clientId); - this.emit('change', [update, UpdateOrigin.PRESENCE]); this.emit('update', [update, UpdateOrigin.PRESENCE]); }; private onUpdate = (event: PresenceEvent): void => { + if (event.id === this.participantId) return; + if (event.data[this.Y_PRESENCE_KEY] === null) { this.removeAwarenessStates([event.data.clientId], UpdateOrigin.PRESENCE); return; @@ -191,7 +192,6 @@ export class Awareness extends ObservableV2 { ...event.data, }); - this.emit('change', [{ added, updated, removed: [] }, UpdateOrigin.PRESENCE]); this.emit('update', [{ added, updated, removed: [] }, UpdateOrigin.PRESENCE]); }; @@ -205,7 +205,6 @@ export class Awareness extends ObservableV2 { }); this.emit('change', [update, origin]); - this.emit('update', [update, origin]); } private onVisibilityChange = (): void => { From b24510e2ebe631e6b917167dfb8b56f5d0c98f7c Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Tue, 24 Sep 2024 03:02:56 -0300 Subject: [PATCH 11/76] type: add type to observable interface of awareness --- packages/yjs/src/provider.ts | 6 ++++-- packages/yjs/src/services/awareness/index.ts | 6 +++--- packages/yjs/src/services/awareness/types.ts | 12 ++++++++++++ packages/yjs/src/types.ts | 2 +- 4 files changed, 20 insertions(+), 6 deletions(-) diff --git a/packages/yjs/src/provider.ts b/packages/yjs/src/provider.ts index 1c190fd..68afa4f 100644 --- a/packages/yjs/src/provider.ts +++ b/packages/yjs/src/provider.ts @@ -5,7 +5,7 @@ import { Message, MessageToHost, MessageToTarget, - MyEvents, + Events, Params, ProviderEvents, ProviderState, @@ -25,7 +25,7 @@ import { config } from './services/config'; import { createRoom } from './common/utils/createRoom'; import { HostService } from './services/host'; -export class SuperVizYjsProvider extends ObservableV2 { +export class SuperVizYjsProvider extends ObservableV2 { public awareness: Awareness; public document: Y.Doc; @@ -76,6 +76,8 @@ export class SuperVizYjsProvider extends ObservableV2 { if (this.state === ProviderState.DISCONNECTED) return; this.emit('destroy', []); + this._synced = false; + this.awareness?.destroy(); this.realtime?.destroy(); this.hostService?.destroy(); diff --git a/packages/yjs/src/services/awareness/index.ts b/packages/yjs/src/services/awareness/index.ts index c6dacd2..655006f 100644 --- a/packages/yjs/src/services/awareness/index.ts +++ b/packages/yjs/src/services/awareness/index.ts @@ -1,10 +1,10 @@ import { ObservableV2 } from 'lib0/observable'; import { PresenceEvent } from '@superviz/socket-client'; import * as Y from 'yjs'; -import { UpdateOrigin, UpdatePresence } from './types'; +import { Events, UpdateOrigin, UpdatePresence } from './types'; import { RealtimeRoom } from '../../types'; -export class Awareness extends ObservableV2 { +export class Awareness extends ObservableV2 { public clientId: number = 0; public meta: Map = new Map(); public states: Map = new Map(); @@ -195,7 +195,7 @@ export class Awareness extends ObservableV2 { this.emit('update', [{ added, updated, removed: [] }, UpdateOrigin.PRESENCE]); }; - private removeAwarenessStates(removed: number[], origin: string): void { + private removeAwarenessStates(removed: number[], origin: UpdateOrigin): void { const update = { added: [], updated: [], removed: [] }; removed.forEach((clientId) => { if (!this.states.get(clientId)) return; diff --git a/packages/yjs/src/services/awareness/types.ts b/packages/yjs/src/services/awareness/types.ts index 237a344..247afe1 100644 --- a/packages/yjs/src/services/awareness/types.ts +++ b/packages/yjs/src/services/awareness/types.ts @@ -7,3 +7,15 @@ export interface UpdatePresence { clientId: number; __yjs: any; } + +type AwarenessUpdate = { + ( + update: { added: number[]; updated: number[]; removed: number[] }, + origin: UpdateOrigin | `${UpdateOrigin}`, + ): void; +}; + +export type Events = { + change: AwarenessUpdate; + update: AwarenessUpdate; +}; diff --git a/packages/yjs/src/types.ts b/packages/yjs/src/types.ts index e7b4c69..9959676 100644 --- a/packages/yjs/src/types.ts +++ b/packages/yjs/src/types.ts @@ -68,7 +68,7 @@ export type Emitter = ( data: Extract['data'], ) => void; -export type MyEvents = { +export type Events = { connect: () => void; disconnect: () => void; synced: () => void; From d977d6d9b5301e47d5827b29a623c7486eab6a67 Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Tue, 24 Sep 2024 03:27:33 -0300 Subject: [PATCH 12/76] feat: add logger to some parts of code --- packages/yjs/package.json | 1 + packages/yjs/src/provider.ts | 43 ++++++++++++++++++- packages/yjs/src/services/awareness/index.ts | 22 ++++++++++ .../yjs/src/services/logger/index.test.ts | 33 ++++++++++++++ packages/yjs/src/services/logger/index.ts | 15 +++++++ packages/yjs/src/types.ts | 2 +- 6 files changed, 114 insertions(+), 2 deletions(-) create mode 100644 packages/yjs/src/services/logger/index.test.ts create mode 100644 packages/yjs/src/services/logger/index.ts diff --git a/packages/yjs/package.json b/packages/yjs/package.json index a4d4866..b85b732 100644 --- a/packages/yjs/package.json +++ b/packages/yjs/package.json @@ -31,6 +31,7 @@ "@superviz/typescript-config": "workspace:*", "@superviz/socket-client": "workspace:*", "@types/jest": "^29.5.13", + "debug": "^4.3.7", "esbuild": "^0.23.1", "lib0": "^0.2.97", "rxjs": "^7.8.1", diff --git a/packages/yjs/src/provider.ts b/packages/yjs/src/provider.ts index 68afa4f..7f67b73 100644 --- a/packages/yjs/src/provider.ts +++ b/packages/yjs/src/provider.ts @@ -24,6 +24,8 @@ import { import { config } from './services/config'; import { createRoom } from './common/utils/createRoom'; import { HostService } from './services/host'; +import { Logger } from './services/logger'; +import debug from 'debug'; export class SuperVizYjsProvider extends ObservableV2 { public awareness: Awareness; @@ -34,6 +36,7 @@ export class SuperVizYjsProvider extends ObservableV2 { private realtime: Realtime | null = null; private room: RealtimeRoom | null = null; + private logger: Logger; private hostService: HostService | null = null; @@ -44,7 +47,12 @@ export class SuperVizYjsProvider extends ObservableV2 { super(); this.setConfig(); this.document = doc; - this.awareness = new Awareness(this.doc, this.opts.participant.id); + + this.awareness = new Awareness(this.doc, this.opts.participant.id, this.logger); + this.logger = new Logger('SuperVizYjsProvider'); + + console.log('debuf', this.opts.debug); + if (!this.opts.debug) debug.disable(); if (!this.opts.connect) return; @@ -61,6 +69,9 @@ export class SuperVizYjsProvider extends ObservableV2 { */ public connect = (): void => { if (this.state !== ProviderState.DISCONNECTED) return; + + this.logger.log('[SuperViz | YjsProvider] - Connecting to the room'); + this.changeState(ProviderState.CONNECTING); this.doc.on('updateV2', this.onDocUpdate); @@ -74,6 +85,8 @@ export class SuperVizYjsProvider extends ObservableV2 { */ public destroy = (): void => { if (this.state === ProviderState.DISCONNECTED) return; + this.logger.log('[SuperViz | YjsProvider] - Destroying the provider'); + this.emit('destroy', []); this._synced = false; @@ -81,6 +94,7 @@ export class SuperVizYjsProvider extends ObservableV2 { this.awareness?.destroy(); this.realtime?.destroy(); this.hostService?.destroy(); + this.logger = null; this.doc.off('updateV2', this.onDocUpdate); this.removeRoomListeners(); @@ -103,18 +117,24 @@ export class SuperVizYjsProvider extends ObservableV2 { // #region Private methods private createRoom(): void { + this.logger.log('[SuperViz | YjsProvider] - Creating room'); + const { realtime, room } = createRoom(`yjs:${config.get('roomName')}`); this.realtime = realtime; this.room = room; } private addRoomListeners(): void { + this.logger.log('[SuperViz | YjsProvider] - Adding room listeners'); + this.room.on(ProviderEvents.UPDATE, this.onRemoteDocUpdate); this.room.presence.on(PresenceEvents.JOINED_ROOM, this.onLocalJoinRoom); this.realtime.connection.on(this.onConnectionChange); } private removeRoomListeners(): void { + this.logger.log('[SuperViz | YjsProvider] - Removing room listeners'); + if (this.room) { this.room.off(ProviderEvents.UPDATE, this.onRemoteDocUpdate); this.room.off(ProviderEvents.MESSAGE_TO_HOST, this.onMessageToHost); @@ -135,6 +155,8 @@ export class SuperVizYjsProvider extends ObservableV2 { private onMessageToHost = (event: SocketEvent): void => { if (!this.hostService.isHost) return; + this.logger.log('[SuperViz | YjsProvider] - Received message to host', event); + this._synced = false; const comingUpdate = new Uint8Array(event.data.update); @@ -165,6 +187,8 @@ export class SuperVizYjsProvider extends ObservableV2 { private onMessageToUser = (msg: SocketEvent): void => { if (msg.data.targetId !== this.opts.participant.id) return; + this.logger.log('[SuperViz | YjsProvider] - Received message to user', msg); + const update = new Uint8Array(msg.data.update); this.onReceiveRealtimeMessage('message-to-specific-user', { update, @@ -179,6 +203,8 @@ export class SuperVizYjsProvider extends ObservableV2 { }; private fetch = (): void => { + this.logger.log('[SuperViz | YjsProvider] - Fetching the document'); + this._synced = false; const update = Y.encodeStateAsUpdateV2(this.doc); @@ -194,11 +220,15 @@ export class SuperVizYjsProvider extends ObservableV2 { }; private onDocUpdate = (update: Uint8Array): void => { + this.logger.log('[SuperViz | YjsProvider] - Local document update', update); + this.beforeSendRealtimeMessage('update', { update }); this.room!.emit('update', { update }); }; private updateDocument = (update: Uint8Array): void => { + this.logger.log('[SuperViz | YjsProvider] - Applying remote update', update); + Y.applyUpdateV2(this.doc, update, this); }; @@ -213,6 +243,8 @@ export class SuperVizYjsProvider extends ObservableV2 { private onLocalJoinRoom = (event: PresenceEvent): void => { if (this.state === ProviderState.CONNECTED || event.id !== this.opts.participant.id) return; + this.logger.log('[SuperViz | YjsProvider] - Joined the room', event); + this.awareness.connect(this.room!); this.changeState(ProviderState.CONNECTED); this.emit('connect', []); @@ -226,12 +258,14 @@ export class SuperVizYjsProvider extends ObservableV2 { private onConnectionChange = (msg: ConnectionState): void => { if (msg.state === ClientState.DISCONNECTED) { + this.logger.log('[SuperViz | YjsProvider] - Disconnected from the room'); this.emit('disconnect', []); } }; private onRemoteDocUpdate = (event: SocketEvent): void => { if (event.presence?.id === this.opts.participant.id) return; + this.logger.log('[SuperViz | YjsProvider] - Received remote document update', event); const update = new Uint8Array(event.data.update); this.onReceiveRealtimeMessage('update', { update }); @@ -241,6 +275,7 @@ export class SuperVizYjsProvider extends ObservableV2 { private onBroadcast = (event: SocketEvent): void => { if (this.hostService?.isHost) return; + this.logger.log('[SuperViz | YjsProvider] - Received broadcast', event); const update = new Uint8Array(event.data.update); this.onReceiveRealtimeMessage('broadcast', { update }); @@ -253,6 +288,8 @@ export class SuperVizYjsProvider extends ObservableV2 { }; private onHostChange = (hostId: string): void => { + this.logger.log('[SuperViz | YjsProvider] - Host changed', hostId); + if (hostId === this.opts.participant.id) { this._synced = true; return; @@ -262,15 +299,19 @@ export class SuperVizYjsProvider extends ObservableV2 { }; private changeState(state: ProviderState): void { + this.logger.log('[SuperViz | YjsProvider] - Changing state', state); + this.emit('state', [state]); this.state = state; } private onReceiveRealtimeMessage: Emitter = (name, data): void => { + this.logger.log('[SuperViz | YjsProvider] - Received message from room', { name, data }); this.emit('message', [{ name, data } as Message]); }; private beforeSendRealtimeMessage: Emitter = (name, data): void => { + this.logger.log('[SuperViz | YjsProvider] - Sending message to room', { name, data }); this.emit('outgoingMessage', [{ name, data } as Message]); }; } diff --git a/packages/yjs/src/services/awareness/index.ts b/packages/yjs/src/services/awareness/index.ts index 655006f..0ddd63d 100644 --- a/packages/yjs/src/services/awareness/index.ts +++ b/packages/yjs/src/services/awareness/index.ts @@ -3,6 +3,7 @@ import { PresenceEvent } from '@superviz/socket-client'; import * as Y from 'yjs'; import { Events, UpdateOrigin, UpdatePresence } from './types'; import { RealtimeRoom } from '../../types'; +import { Logger } from '../logger'; export class Awareness extends ObservableV2 { public clientId: number = 0; @@ -22,12 +23,15 @@ export class Awareness extends ObservableV2 { constructor( public doc: Y.Doc, private participantId: string, + private logger: Logger, ) { super(); this.clientId = this.doc.clientID; } public connect(room: RealtimeRoom): void { + this.logger.log('[SuperViz | Awareness] - Connect awareness to room'); + this.room = room; this.addRoomListeners(); this.addDocumentListeners(); @@ -61,6 +65,8 @@ export class Awareness extends ObservableV2 { //#region public public destroy(): void { + this.logger.log('[SuperViz | Awareness] - Destroy awareness'); + clearInterval(this.visibilityTimeout); this.visibilityTimeout = undefined; @@ -75,6 +81,11 @@ export class Awareness extends ObservableV2 { } public getLocalState(): Record | null { + this.logger.log( + '[SuperViz | Awareness] - Get local state', + this.states.get(this.clientId)?.[this.Y_PRESENCE_KEY], + ); + const state = this.states.get(this.clientId); if (!state || !state[this.Y_PRESENCE_KEY]) return null; @@ -87,10 +98,13 @@ export class Awareness extends ObservableV2 { states.set(clientId, state[this.Y_PRESENCE_KEY]); }); + this.logger.log('[SuperViz | Awareness] - Get states', states); return states; } public setLocalState = (state: Record | null): void => { + this.logger.log('[SuperViz | Awareness] - Set local state', state); + if (state === null) { if (!this.states.has(this.clientId)) return; this.states.delete(this.clientId); @@ -124,6 +138,8 @@ export class Awareness extends ObservableV2 { }; public setLocalStateField(field: string, value: any): void { + this.logger.log('[SuperViz | Awareness] - Set local state field', { field, value }); + const state = this.getLocalState(); this.setLocalState({ ...(state || {}), @@ -152,6 +168,8 @@ export class Awareness extends ObservableV2 { private onLeave = (event: PresenceEvent): void => { const clientId = this.participantIdToClientId.get(event.id); + this.logger.log('[SuperViz | Awareness] - Participant left', { participant: event, clientId }); + if (!clientId) return; if (clientId === this.clientId) { @@ -170,6 +188,8 @@ export class Awareness extends ObservableV2 { private onUpdate = (event: PresenceEvent): void => { if (event.id === this.participantId) return; + this.logger.log('[SuperViz | Awareness] - Participant updated', event); + if (event.data[this.Y_PRESENCE_KEY] === null) { this.removeAwarenessStates([event.data.clientId], UpdateOrigin.PRESENCE); return; @@ -196,6 +216,8 @@ export class Awareness extends ObservableV2 { }; private removeAwarenessStates(removed: number[], origin: UpdateOrigin): void { + this.logger.log('[SuperViz | Awareness] - Remove awareness states', { removed, origin }); + const update = { added: [], updated: [], removed: [] }; removed.forEach((clientId) => { if (!this.states.get(clientId)) return; diff --git a/packages/yjs/src/services/logger/index.test.ts b/packages/yjs/src/services/logger/index.test.ts new file mode 100644 index 0000000..4323e77 --- /dev/null +++ b/packages/yjs/src/services/logger/index.test.ts @@ -0,0 +1,33 @@ +import debug from 'debug'; + +import { Logger } from '.'; + +jest.mock('debug'); + +describe('Logger', () => { + let debugInstance: Logger; + let mockDebug: jest.MockedFunction; + + beforeEach(() => { + mockDebug = jest.fn() as unknown as jest.MockedFunction; + (debug as jest.MockedFunction).mockReturnValue(mockDebug); + debugInstance = new Logger('@superviz/sdk'); + }); + + afterEach(() => { + jest.restoreAllMocks(); + }); + + test('should create a new instance of Debug', () => { + expect(debugInstance).toBeDefined(); + }); + + test('should call debug with the correct scope on initialization', () => { + expect(debug).toHaveBeenCalledWith('@superviz/sdk'); + }); + + test('should call debug with the correct arguments on log', () => { + debugInstance.log('test-message', 123, { foo: 'bar' }); + expect(mockDebug).toHaveBeenCalledWith('test-message', 123, { foo: 'bar' }); + }); +}); diff --git a/packages/yjs/src/services/logger/index.ts b/packages/yjs/src/services/logger/index.ts new file mode 100644 index 0000000..fd229cd --- /dev/null +++ b/packages/yjs/src/services/logger/index.ts @@ -0,0 +1,15 @@ +import debug from 'debug'; + +export type Message = string | Error | number | Object; + +export class Logger { + private debug: debug.Debugger; + + constructor(scope: string) { + this.debug = debug(scope); + } + + log(formatter: Message, ...args: Array) { + this.debug(formatter, ...args); + } +} diff --git a/packages/yjs/src/types.ts b/packages/yjs/src/types.ts index 9959676..1fb9437 100644 --- a/packages/yjs/src/types.ts +++ b/packages/yjs/src/types.ts @@ -16,7 +16,7 @@ export type Params = { participant: Participant; room?: string; connect?: boolean; - // debug?: boolean; + debug?: boolean; // awareness?: boolean = true; }; From cea1f9374c649a532b9d7694e22228dc630b87ac Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Wed, 25 Sep 2024 11:36:40 -0300 Subject: [PATCH 13/76] feat: avoid memory leakds in host service --- packages/yjs/src/services/host/index.ts | 85 +++++++++++++++++-------- packages/yjs/src/services/host/types.ts | 3 + 2 files changed, 63 insertions(+), 25 deletions(-) create mode 100644 packages/yjs/src/services/host/types.ts diff --git a/packages/yjs/src/services/host/index.ts b/packages/yjs/src/services/host/index.ts index 2a8fd21..f21f5d7 100644 --- a/packages/yjs/src/services/host/index.ts +++ b/packages/yjs/src/services/host/index.ts @@ -1,13 +1,9 @@ import { PresenceEvent, Realtime, Room, SocketEvent } from '@superviz/socket-client'; import { createRoom } from '../../common/utils/createRoom'; import { config } from '../config'; - -type RoomEvent = { - hostId: string; -}; +import { RoomEvent } from './types'; export class HostService { - private _isHost: boolean = false; private _hostId: string = ''; private room: Room; private realtime: Realtime; @@ -22,34 +18,40 @@ export class HostService { this.realtime = realtime; this.room = room; - this.onHostChange(callback); + this.callback = callback; room.presence.on('presence.leave', this.onPresenceLeave); room.presence.on('presence.joined-room', this.onPresenceEnter); - room.on('state', (event: SocketEvent) => { - this.setHostId(event.data.hostId); - }); + room.on('state', this.onStateChange); } - public destroy() { - this._isHost = false; + // #region public methods + + /** + * @function destroy + * @description Destroy the HostService instance. Make sure that no state is preserved, and the room is disconnected. + * @returns {void} + */ + public destroy(): void { this._hostId = ''; + this.room.presence.off('presence.leave'); + this.room.presence.off('presence.joined-room'); + this.room.off('state', this.onStateChange); + this.room.disconnect(); this.realtime.destroy(); } - private onHostChange(callback: (hostId: string) => void) { - this.callback = callback; - } + // #region getters /** * @function isHost - * @description Check if the current participant is the host of the room + * @description Tell whether the current participant is the host of the room or not * @returns {boolean} */ public get isHost(): boolean { - return this._isHost; + return this._hostId === this.participantId; } /** @@ -67,7 +69,7 @@ export class HostService { * @returns {void} */ private searchHost(): void { - this.room.history(({ events }) => { + this.room.history(({ events }): void => { if (events.length === 0) { this.updateHost(); return; @@ -75,14 +77,13 @@ export class HostService { if (this._hostId) return; - this.room.presence.get((participants) => { + this.room.presence.get((participants): void => { if (participants.length === 1 && participants[0].id === this.participantId) { this.setHostInRoom(participants[0].id); return; } const hostId = events[events.length - 1].data.hostId; - if (!hostId) { this.updateHost(participants); return; @@ -98,15 +99,15 @@ export class HostService { }); } + // #region host logic /** * @function setHost - * @description Set the host of the room + * @description Set locally the id of the room's host * @param {string} hostId * @returns {void} */ private setHostId(hostId: string): void { this._hostId = hostId; - this._isHost = this.participantId === hostId; if (this.callback) { this.callback(hostId); @@ -127,7 +128,12 @@ export class HostService { this.room.presence.get(this.setOldestAsHost); } - private setOldestAsHost = (data: PresenceEvent[]) => { + /** + * @function setOldestAsHost + * @description Traverse through participants list and set the oldest one as the host. If the oldest is the current participant, set it as the host in the room. Otherwise, only set locally + * @param data + */ + private setOldestAsHost = (data: PresenceEvent[]): void => { const oldestParticipant = data.reduce((prev, current) => { return prev.timestamp < current.timestamp ? prev : current; }, data[0]); @@ -139,14 +145,26 @@ export class HostService { } }; - private setHostInRoom(hostId: string) { + /** + * @function setHostInRoom + * @description Propagate the host id to the room + * @param {string} hostId + * @returns {void} + */ + private setHostInRoom(hostId: string): void { this.room.emit('state', { hostId: hostId, }); } // #region events callbacks - private onPresenceLeave = (presence: PresenceEvent) => { + /** + * @function onPresenceLeave + * @description If the host leaves the room, update the host + * @param {PresenceEvent} presence + * @returns {void} + */ + private onPresenceLeave = (presence: PresenceEvent): void => { if (presence.id !== this.hostId) return; this._hostId = ''; @@ -154,9 +172,26 @@ export class HostService { this.updateHost(); }; - private onPresenceEnter = (presence: PresenceEvent) => { + /** + * @function onPresenceEnter + * @description When the current participant enters the room, search for the host + * @param {PresenceEvent} presence + * @returns {void} + */ + private onPresenceEnter = (presence: PresenceEvent): void => { if (this.hostId || presence.id !== this.participantId) return; this.searchHost(); }; + + /** + * @function onStateChange + * @description When the state event comes from the room, update the host id + * @param {SocketEvent} event + * @returns {void} + */ + private onStateChange = (event: SocketEvent): void => { + if (event.data.hostId === this.hostId) return; + this.setHostId(event.data.hostId); + }; } diff --git a/packages/yjs/src/services/host/types.ts b/packages/yjs/src/services/host/types.ts new file mode 100644 index 0000000..9fbc717 --- /dev/null +++ b/packages/yjs/src/services/host/types.ts @@ -0,0 +1,3 @@ +export type RoomEvent = { + hostId: string; +}; From 238ab6190fa99ffbb7a4506205ce6dcbc8a3abb0 Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Wed, 25 Sep 2024 11:37:02 -0300 Subject: [PATCH 14/76] fix: change type of visibilityTimeout --- packages/yjs/src/services/awareness/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/yjs/src/services/awareness/index.ts b/packages/yjs/src/services/awareness/index.ts index 0ddd63d..7891562 100644 --- a/packages/yjs/src/services/awareness/index.ts +++ b/packages/yjs/src/services/awareness/index.ts @@ -13,7 +13,7 @@ export class Awareness extends ObservableV2 { private participantIdToClientId: Map = new Map(); private room: RealtimeRoom | null = null; - private visibilityTimeout: number | undefined; + private visibilityTimeout: ReturnType | undefined; private readonly TIMEOUT_TIMER_MS = 30000; private readonly Y_PRESENCE_KEY = '__yjs'; From 2ee76eb17c8bd4cfe65eaee01bf8ed04ab2f18ef Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Wed, 25 Sep 2024 11:49:19 -0300 Subject: [PATCH 15/76] types: improve typing in socket-client --- packages/socket-client/src/common/types/event.types.ts | 2 ++ packages/socket-client/src/services/connection/types.ts | 2 +- packages/socket-client/src/services/room/index.ts | 6 +++--- packages/socket-client/src/services/room/types.ts | 4 ++-- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/packages/socket-client/src/common/types/event.types.ts b/packages/socket-client/src/common/types/event.types.ts index cf74863..d0754a7 100644 --- a/packages/socket-client/src/common/types/event.types.ts +++ b/packages/socket-client/src/common/types/event.types.ts @@ -15,6 +15,8 @@ export enum RoomEvents { ERROR = 'room.error', } +export type RoomEventsArg = RoomEvents | `${RoomEvents}` | (string & {}); + export enum InternalRoomEvents { GET = 'room.get', } diff --git a/packages/socket-client/src/services/connection/types.ts b/packages/socket-client/src/services/connection/types.ts index 1fdde25..3fc1b7c 100644 --- a/packages/socket-client/src/services/connection/types.ts +++ b/packages/socket-client/src/services/connection/types.ts @@ -24,7 +24,7 @@ export enum ClientState { * @property reason - the reason for the state change */ export interface ConnectionState { - state: ClientState; + state: ClientState | `${ClientState}`; reason?: string; } diff --git a/packages/socket-client/src/services/room/index.ts b/packages/socket-client/src/services/room/index.ts index abf9c6b..0e59648 100644 --- a/packages/socket-client/src/services/room/index.ts +++ b/packages/socket-client/src/services/room/index.ts @@ -2,7 +2,7 @@ import { Subject, Subscription } from 'rxjs'; import type { Socket } from 'socket.io-client'; import { ErrorCallback } from '../../common/types/callbacks.types'; -import { InternalRoomEvents, RoomEvents } from '../../common/types/event.types'; +import { InternalRoomEvents, RoomEvents, RoomEventsArg } from '../../common/types/event.types'; import { Presence } from '../../common/types/presence.types'; import { Logger } from '../../utils'; import { PresenceRoom } from '../presence'; @@ -54,7 +54,7 @@ export class Room { * @param callback - The callback to execute when the event is emitted * @returns {void} */ - public on(event: string, callback: Callback): void { + public on(event: RoomEventsArg, callback: Callback): void { this.logger.log('room @ on', event); let subject = this.observers.get(event); @@ -121,7 +121,7 @@ export class Room { * @description Get the presences in the room * @returns {void} */ - public history(next: (data: RoomHistory) => void, error?: ErrorCallback): void { + public history(next: (data: RoomHistory) => void, error?: ErrorCallback): void { const subject = new Subject(); subject.subscribe({ diff --git a/packages/socket-client/src/services/room/types.ts b/packages/socket-client/src/services/room/types.ts index 3710112..c6a5f61 100644 --- a/packages/socket-client/src/services/room/types.ts +++ b/packages/socket-client/src/services/room/types.ts @@ -11,7 +11,7 @@ export type SocketEvent = { timestamp: number; }; -export type RoomHistory = { +export type RoomHistory = { roomId: string; room: { id?: string; @@ -20,7 +20,7 @@ export type RoomHistory = { apiKey: string; createdAt: Date; }; - events: SocketEvent[]; + events: SocketEvent[]; connectionId: string; timestamp: Date; }; From 89bf4a9f0d9f3d37cde22d968767da1426d19423 Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Thu, 26 Sep 2024 11:36:22 -0300 Subject: [PATCH 16/76] tests(yjs): create unit tests for the entire component --- packages/socket-client/package.json | 3 +- packages/yjs/.eslintrc | 12 + packages/yjs/.eslintrc.js | 9 - packages/yjs/.prettierignore | 1 + packages/yjs/__mocks__/io.mock.ts | 141 +++++ packages/yjs/__mocks__/participants.mock.ts | 6 + packages/yjs/jest.config.cjs | 17 +- packages/yjs/jest.setup.js | 3 + packages/yjs/package.json | 5 +- packages/yjs/provider.ts | 113 ---- packages/yjs/src/common/types/events.types.ts | 11 - .../yjs/src/common/utils/createRoom.test.ts | 9 + packages/yjs/src/common/utils/createRoom.ts | 8 + packages/yjs/src/index.test.ts | 5 - packages/yjs/src/index.ts | 4 +- packages/yjs/src/provider/index.test.ts | 499 ++++++++++++++++++ .../src/{provider.ts => provider/index.ts} | 269 ++++++---- packages/yjs/src/{ => provider}/types.ts | 24 +- .../yjs/src/services/awareness/index.test.ts | 485 +++++++++++++++++ packages/yjs/src/services/awareness/index.ts | 137 +++-- packages/yjs/src/services/awareness/types.ts | 2 +- .../yjs/src/services/config/index.test.ts | 29 + packages/yjs/src/services/config/index.ts | 12 +- packages/yjs/src/services/config/types.ts | 4 +- packages/yjs/src/services/host/index.test.ts | 409 ++++++++++++++ packages/yjs/src/services/host/index.ts | 15 +- packages/yjs/src/services/index.ts | 5 +- packages/yjs/tsconfig.lint.json | 2 +- 28 files changed, 1895 insertions(+), 344 deletions(-) create mode 100644 packages/yjs/.eslintrc delete mode 100644 packages/yjs/.eslintrc.js create mode 100644 packages/yjs/.prettierignore create mode 100644 packages/yjs/__mocks__/io.mock.ts create mode 100644 packages/yjs/__mocks__/participants.mock.ts delete mode 100644 packages/yjs/provider.ts delete mode 100644 packages/yjs/src/common/types/events.types.ts create mode 100644 packages/yjs/src/common/utils/createRoom.test.ts delete mode 100644 packages/yjs/src/index.test.ts create mode 100644 packages/yjs/src/provider/index.test.ts rename packages/yjs/src/{provider.ts => provider/index.ts} (61%) rename packages/yjs/src/{ => provider}/types.ts (62%) create mode 100644 packages/yjs/src/services/awareness/index.test.ts create mode 100644 packages/yjs/src/services/config/index.test.ts create mode 100644 packages/yjs/src/services/host/index.test.ts diff --git a/packages/socket-client/package.json b/packages/socket-client/package.json index 606b1d4..fb83723 100644 --- a/packages/socket-client/package.json +++ b/packages/socket-client/package.json @@ -9,7 +9,8 @@ ], "exports": { "node": "./dist/node/index.js", - "default": "./dist/browser/index.js" + "default": "./dist/browser/index.js", + "types": "./dist/index.d.ts" }, "scripts": { "build": "node ./.esbuild/build.js", diff --git a/packages/yjs/.eslintrc b/packages/yjs/.eslintrc new file mode 100644 index 0000000..0fa3091 --- /dev/null +++ b/packages/yjs/.eslintrc @@ -0,0 +1,12 @@ +{ + "root": true, + "extends": ["@superviz/eslint-config/library.js"], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "project": "./tsconfig.lint.json", + "tsconfigRootDir": "." + }, + "env": { + "jest": true + } +} diff --git a/packages/yjs/.eslintrc.js b/packages/yjs/.eslintrc.js deleted file mode 100644 index bb41a96..0000000 --- a/packages/yjs/.eslintrc.js +++ /dev/null @@ -1,9 +0,0 @@ -module.exports = { - root: true, - extends: ["@superviz/eslint-config/library.js"], - parser: "@typescript-eslint/parser", - parserOptions: { - project: "./tsconfig.lint.json", - tsconfigRootDir: __dirname, - }, -}; diff --git a/packages/yjs/.prettierignore b/packages/yjs/.prettierignore new file mode 100644 index 0000000..9009dcd --- /dev/null +++ b/packages/yjs/.prettierignore @@ -0,0 +1 @@ +.eslintrc \ No newline at end of file diff --git a/packages/yjs/__mocks__/io.mock.ts b/packages/yjs/__mocks__/io.mock.ts new file mode 100644 index 0000000..a55c389 --- /dev/null +++ b/packages/yjs/__mocks__/io.mock.ts @@ -0,0 +1,141 @@ +import { jest } from '@jest/globals'; +// has to be imported to avoid type errors +import { PresenceEvent, PresenceEvents, Room, SocketEvent } from '@superviz/socket-client'; +import type { ModuleMocker } from 'jest-mock'; + +export class MockRealtime { + public connection; + private socket; + private manager; + private state; + + constructor( + private apiKey, + private environment, + private presence, + private secret, + private clientId, + ) { + this.connection = { + on: jest.fn(), + off: jest.fn(), + }; + } + + private subscriptions: { event: string; callback: (data: any) => void }[] = []; + private presenceSubscriptions: { event: PresenceEvents; callback: (data: any) => void }[] = []; + + connect() { + return { + // @ts-ignore + on: MOCK_ROOM['on'].mockImplementation((event: string, callback: () => void) => + this.subscriptions.push({ event, callback }), + ), + off: MOCK_ROOM['off'].mockImplementation((event, callback) => { + this.subscriptions = this.subscriptions.filter( + (subscription) => subscription.event !== event || subscription.callback !== callback, + ); + }), + emit: MOCK_ROOM['emit'].mockImplementation((event, data) => + this.subscriptions.forEach((subscription) => { + if (subscription.event === event) subscription.callback({ data }); + }), + ), + disconnect: MOCK_ROOM['disconnect'].mockImplementation(() => { + this.subscriptions = []; + this.presenceSubscriptions = []; + }), + history: MOCK_ROOM['history'].mockImplementation(() => {}), + presence: { + on: MOCK_ROOM['presence']['on'].mockImplementation( + // @ts-ignore + (event: PresenceEvents, callback: () => void) => { + this.presenceSubscriptions.push({ event, callback }); + }, + ), + off: MOCK_ROOM['presence']['off'].mockImplementation((event, callback) => { + this.presenceSubscriptions = this.presenceSubscriptions.filter( + (subscription) => subscription.event !== event || subscription.callback !== callback, + ); + }), + get: MOCK_ROOM['presence']['get'].mockImplementation(() => {}), + update: MOCK_ROOM['presence']['update'].mockImplementation(() => {}), + emit: MOCK_ROOM['presence']['emit'].mockImplementation((event, data) => { + this.presenceSubscriptions.forEach((subscription) => { + if (subscription.event === event) + subscription.callback({ id: 'local-participant-id', data }); + }); + }), + }, + } as unknown as Room; + } + + public destroy = jest.fn(); +} + +export const MOCK_ROOM = { + on: jest.fn(), + off: jest.fn(), + emit: jest.fn(), + disconnect: jest.fn(), + history: jest.fn(), + presence: { + on: jest.fn(), + off: jest.fn(), + get: jest.fn(), + update: jest.fn(), + emit: jest.fn(), + }, +}; + +export const MOCK_IO = { + ClientState: { + CONNECTED: 'CONNECTED', + CONNECTING: 'CONNECTING', + DISCONNECTED: 'DISCONNECTED', + CONNECTION_ERROR: 'CONNECTION_ERROR', + RECONNECTING: 'RECONNECTING', + RECONNECT_ERROR: 'RECONNECT_ERROR', + }, + PresenceEvents: { + JOINED_ROOM: 'presence.joined-room', + LEAVE: 'presence.leave', + ERROR: 'presence.error', + UPDATE: 'presence.update', + }, + RoomEvents: { + JOIN_ROOM: 'room.join', + JOINED_ROOM: 'room.joined', + LEAVE_ROOM: 'room.leave', + UPDATE: 'room.update', + ERROR: 'room.error', + }, + Realtime: MockRealtime, +}; + +export const mockRoomHistoryOnce = (history: Partial>[]) => { + // @ts-ignore + MOCK_ROOM.history.mockImplementationOnce((callback: (data: RoomHistory) => void) => { + callback({ + connectionId: 'connectionId', + events: history as SocketEvent[], + room: { + name: 'roomName', + apiKey: 'apiKey', + createdAt: new Date(), + userId: 'userId', + }, + roomId: 'roomId', + timestamp: new Date(), + }); + }); +}; + +export const mockPresenceListOnce = (participants: Partial[]) => { + MOCK_ROOM.presence.get.mockImplementationOnce( + // @ts-ignore + (callback: (data: Partial[]) => void) => { + callback(participants); + }, + ); +}; diff --git a/packages/yjs/__mocks__/participants.mock.ts b/packages/yjs/__mocks__/participants.mock.ts new file mode 100644 index 0000000..067b4e7 --- /dev/null +++ b/packages/yjs/__mocks__/participants.mock.ts @@ -0,0 +1,6 @@ +import { Participant } from '../src/provider/types'; + +export const MOCK_LOCAL_PARTICIPANT: Participant = { + id: 'unit-test-local-participant-id', + name: 'unit-test-local-participant-name', +}; diff --git a/packages/yjs/jest.config.cjs b/packages/yjs/jest.config.cjs index f7afb33..d11a2fd 100644 --- a/packages/yjs/jest.config.cjs +++ b/packages/yjs/jest.config.cjs @@ -5,25 +5,14 @@ module.exports = { preset: 'ts-jest', testEnvironment: 'jsdom', collectCoverage: true, - collectCoverageFrom: [ - '/src/**/*.ts', - '/src/**/*.js', - ], + collectCoverageFrom: ['/src/**/*.ts', '/src/**/*.js'], coverageDirectory: '/coverage', coverageReporters: ['html', 'lcov'].concat(argv.coverage ? ['text'] : []), - testPathIgnorePatterns: [ - '/node_modules/', - '/dist/', - '/coverage/', - '/e2e/', - ], + testPathIgnorePatterns: ['/node_modules/', '/dist/', '/coverage/', '/e2e/'], transform: { '^.+\\.ts$': 'ts-jest', '^.+\\.js$': 'ts-jest', }, setupFiles: ['/jest.setup.js'], - reporters: [ - 'default', - ['jest-ctrf-json-reporter', {}], - ], + reporters: ['default', ['jest-ctrf-json-reporter', {}]], }; diff --git a/packages/yjs/jest.setup.js b/packages/yjs/jest.setup.js index e69de29..f1d3447 100644 --- a/packages/yjs/jest.setup.js +++ b/packages/yjs/jest.setup.js @@ -0,0 +1,3 @@ +import { MOCK_IO } from './__mocks__/io.mock'; + +jest.mock('@superviz/socket-client', () => MOCK_IO); diff --git a/packages/yjs/package.json b/packages/yjs/package.json index b85b732..a50ecfb 100644 --- a/packages/yjs/package.json +++ b/packages/yjs/package.json @@ -28,9 +28,8 @@ "license": "ISC", "dependencies": { "@superviz/eslint-config": "workspace:*", - "@superviz/typescript-config": "workspace:*", "@superviz/socket-client": "workspace:*", - "@types/jest": "^29.5.13", + "@superviz/typescript-config": "workspace:*", "debug": "^4.3.7", "esbuild": "^0.23.1", "lib0": "^0.2.97", @@ -41,9 +40,11 @@ }, "devDependencies": { "@jest/globals": "^29.7.0", + "@types/jest": "^29.5.13", "concurrently": "^9.0.1", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", + "jest-mock": "^29.7.0", "ts-jest": "^29.2.5" } } diff --git a/packages/yjs/provider.ts b/packages/yjs/provider.ts deleted file mode 100644 index 302ec2e..0000000 --- a/packages/yjs/provider.ts +++ /dev/null @@ -1,113 +0,0 @@ -import * as Y from "yjs"; -import { Params } from "./types"; -import { Awareness } from "./services"; -import { ObservableV2 } from "lib0/observable"; -import { ProviderStatusEvents } from "./common/events.types"; -import { Realtime, type Room, type SocketEvent } from "@superviz/socket-client"; - -export class SuperVizYjsProvider extends ObservableV2 { - public awareness: Awareness; - public document: Y.Doc; - - private _synced: boolean = false; - private connected: boolean = false; - - private realtime: Realtime | null = null; - private room: Room | null = null; - - constructor(private doc: Y.Doc, private opts: Params) { - super(); - this.document = doc; - this.doc.on("updateV2", this.onDocUpdate); - - this.awareness = new Awareness(this.doc); - - this.connect(); - } - - // #region Public methods - public connect() { - if (this.connected) return; - this.startRealtime(); - } - - public destroy() { - this.awareness.destroy(); - this.realtime?.destroy(); - this.doc.off("updateV2", this.onDocUpdate); - this.room?.disconnect(); - } - - public disconnect() {} - - public get synced() { - return this._synced; - } - - // #region Private methods - private async startRealtime() { - const room = this.opts.room ? `yjs:${this.opts.room}` : "yjs:provider"; - this.realtime = new Realtime( - this.opts.apiKey, - this.opts.environment, - this.opts.participant, - "", - "" - ); - this.room = this.realtime.connect(room); - - this.room.on("update", (update: SocketEvent) => { - this.updateDocument(new Uint8Array(update.data.update)); - }); - - this.room.presence.on("presence.joined-room", () => { - this.connected = true; - this.emit("status", [ProviderStatusEvents.CONNECTED]); - - this.room!.on("update-step-1", this.updateStepOne); - this.room!.on("update-step-2", this.updateStepTwo); - - this.syncClients(); - }); - } - - private updateStepOne = (msg: SocketEvent) => { - if (msg.presence?.id === this.opts.participant.id) return; - - this._synced = false; - - const update = Y.encodeStateAsUpdateV2( - this.doc, - new Uint8Array(msg.data.stateVector) - ); - - this.room!.emit("update-step-2", { - update, - origin: this.doc.guid, - }); - }; - - private updateStepTwo = (msg: SocketEvent) => { - if (msg.presence?.id === this.opts.participant.id) return; - this.updateDocument(new Uint8Array(msg.data.update)); - this._synced = false; - }; - - private syncClients = () => { - const stateVector = Y.encodeStateVector(this.doc); - - this.room!.emit("update-step-1", { - stateVector, - origin: this.doc.guid, - }); - }; - - private onDocUpdate = (update: Uint8Array, origin: any) => { - if (origin === this) return; - this.room!.emit("update", { update }); - }; - - private updateDocument = (update: Uint8Array) => { - Y.applyUpdateV2(this.doc, update, this); - }; -} diff --git a/packages/yjs/src/common/types/events.types.ts b/packages/yjs/src/common/types/events.types.ts deleted file mode 100644 index f8fac8b..0000000 --- a/packages/yjs/src/common/types/events.types.ts +++ /dev/null @@ -1,11 +0,0 @@ -export enum ProviderStatusEvents { - CONNECTED = "connected", - DESTROY = "destroy", - DISCONNECT = "disconnect", -} - -export enum RealtimeChannelState { - DISCONNECTED = "DISCONNECTED", - CONNECTED = "CONNECTED", - CONNECTING = "CONNECTING", -} diff --git a/packages/yjs/src/common/utils/createRoom.test.ts b/packages/yjs/src/common/utils/createRoom.test.ts new file mode 100644 index 0000000..27821ce --- /dev/null +++ b/packages/yjs/src/common/utils/createRoom.test.ts @@ -0,0 +1,9 @@ +import { createRoom } from './createRoom'; + +describe('createRoom', () => { + test('should return realtime instance and room instance', () => { + const { realtime, room } = createRoom('test-room'); + expect(realtime).toBeDefined(); + expect(room).toBeDefined(); + }); +}); diff --git a/packages/yjs/src/common/utils/createRoom.ts b/packages/yjs/src/common/utils/createRoom.ts index ae0253f..892ad88 100644 --- a/packages/yjs/src/common/utils/createRoom.ts +++ b/packages/yjs/src/common/utils/createRoom.ts @@ -1,6 +1,14 @@ import { Realtime, Room } from '@superviz/socket-client'; + import { config } from '../../services/config'; +/** + * @function createRoom + * @description Establishes a connection with a real-time room with the given name + * @param roomName The last part of the name of the room. Comes after 'yjs:' in the room name + * @returns {{ realtime: Realtime, room: Room }} An object containing the realtime + * instance and the room instance + */ export function createRoom(roomName: string): { realtime: Realtime; room: Room; diff --git a/packages/yjs/src/index.test.ts b/packages/yjs/src/index.test.ts deleted file mode 100644 index 0c9ee59..0000000 --- a/packages/yjs/src/index.test.ts +++ /dev/null @@ -1,5 +0,0 @@ -describe('dummy test', () => { - test('expect true', () => { - expect(true).toBe(true) - }) -}) \ No newline at end of file diff --git a/packages/yjs/src/index.ts b/packages/yjs/src/index.ts index 7fc16aa..20840cb 100644 --- a/packages/yjs/src/index.ts +++ b/packages/yjs/src/index.ts @@ -1,2 +1,2 @@ -export { SuperVizYjsProvider } from "./provider"; -export { Awareness } from "./services"; +export { SuperVizYjsProvider } from './provider'; +export { Awareness } from './services'; diff --git a/packages/yjs/src/provider/index.test.ts b/packages/yjs/src/provider/index.test.ts new file mode 100644 index 0000000..e0687ca --- /dev/null +++ b/packages/yjs/src/provider/index.test.ts @@ -0,0 +1,499 @@ +import type { PresenceEvent, SocketEvent } from '@superviz/socket-client'; +import debug from 'debug'; +import * as Y from 'yjs'; + +import { MOCK_ROOM } from '../../__mocks__/io.mock'; +import { config } from '../services'; + +import { DocUpdate, MessageToHost } from './types'; + +import { SuperVizYjsProvider } from '.'; + +function createProvider(connect: boolean = true, debug: boolean = false, room: string = '') { + const doc = new Y.Doc(); + return new SuperVizYjsProvider(doc, { + apiKey: '123', + environment: 'dev', + participant: { + id: 'local-participant-id', + name: 'Provider Test', + }, + connect, + debug, + room, + }); +} + +describe('provider', () => { + beforeEach(() => { + jest.clearAllMocks(); + jest.restoreAllMocks(); + jest.restoreAllMocks(); + }); + + describe('start', () => { + test('should connect the provider', () => { + const spy = jest.spyOn(SuperVizYjsProvider.prototype, 'connect'); + createProvider(); + + expect(spy).toHaveBeenCalled(); + }); + + test('should set config', () => { + createProvider(); + + expect(config.get('apiKey')).toEqual('123'); + expect(config.get('environment')).toEqual('dev'); + expect(config.get('participant')).toEqual({ + id: 'local-participant-id', + name: 'Provider Test', + }); + expect(config.get('roomName')).toEqual('sv-provider'); + }); + + test('should set room name', () => { + createProvider(true, true, 'room-name'); + + expect(config.get('roomName')).toEqual('room-name'); + }); + + test('should not connect if connect is false', () => { + const spy = jest.spyOn(SuperVizYjsProvider.prototype, 'connect'); + createProvider(false); + + expect(spy).not.toHaveBeenCalled(); + }); + + test('should disable debug if debug is false', () => { + const spy = jest.spyOn(debug, 'disable'); + createProvider(false, false); + + expect(spy).toHaveBeenCalled(); + }); + }); + + describe('destroy', () => { + test('should destroy services', () => { + const provider = createProvider(); + provider['room']!.presence['emit']('presence.joined-room', { + data: {}, + }); + + const awarenessSpy = jest.spyOn(provider['awareness'], 'destroy'); + const realtimeSpy = jest.spyOn(provider['realtime']!, 'destroy'); + const hostServiceSpy = jest.spyOn(provider['hostService']!, 'destroy'); + + provider.destroy(); + + expect(awarenessSpy).toHaveBeenCalled(); + expect(realtimeSpy).toHaveBeenCalled(); + expect(hostServiceSpy).toHaveBeenCalled(); + + expect(provider['hostService']).toBeNull(); + expect(provider['realtime']).toBeNull(); + }); + + test('should disconnect from room', () => { + const provider = createProvider(); + provider['room']!.presence['emit']('presence.joined-room', { + data: {}, + }); + + const disconnectSpy = jest.spyOn(provider['room']!, 'disconnect'); + + provider.destroy(); + + expect(disconnectSpy).toHaveBeenCalled(); + expect(provider['room']).toBeNull(); + }); + + test('should unsubscribe from events', () => { + const provider = createProvider(); + provider['room']!.presence['emit']('presence.joined-room', { + data: {}, + }); + + const offSpy = jest.spyOn(provider['doc'], 'off'); + provider.destroy(); + + expect(offSpy).toHaveBeenCalled(); + expect(MOCK_ROOM.off).toHaveBeenCalledTimes(4); + expect(MOCK_ROOM.presence.off).toHaveBeenCalledTimes(5); + }); + + test('should do nothing if already destroyed', () => { + const provider = createProvider(); + provider['room']!.presence['emit']('presence.joined-room', { + data: {}, + }); + + const awarenessSpy = jest.spyOn(provider['awareness'], 'destroy'); + const realtimeSpy = jest.spyOn(provider['realtime']!, 'destroy'); + const hostServiceSpy = jest.spyOn(provider['hostService']!, 'destroy'); + const offSpy = jest.spyOn(provider['doc'], 'off'); + const disconnectSpy = jest.spyOn(provider['room']!, 'disconnect'); + + jest.clearAllMocks(); + + provider.destroy(); + provider.destroy(); + + expect(awarenessSpy).toHaveBeenCalledTimes(1); + expect(realtimeSpy).toHaveBeenCalledTimes(1); + expect(hostServiceSpy).toHaveBeenCalledTimes(1); + expect(offSpy).toHaveBeenCalledTimes(1); + expect(disconnectSpy).toHaveBeenCalledTimes(2); + }); + }); + + describe('connect', () => { + test('should listen to doc updates and start realtime', () => { + const provider = createProvider(); + provider['state'] = 'disconnected'; + + const onSpy = jest.spyOn(provider['doc'], 'on'); + const startSpy = jest.spyOn(provider as any, 'startRealtime'); + + provider.connect(); + + expect(onSpy).toHaveBeenCalled(); + expect(startSpy).toHaveBeenCalled(); + }); + + test('should do nothing if already connected', () => { + const provider = createProvider(); + provider['state'] = 'connected'; + + const onSpy = jest.spyOn(provider['doc'], 'on'); + const startSpy = jest.spyOn(provider as any, 'startRealtime'); + + provider.connect(); + + expect(onSpy).not.toHaveBeenCalled(); + expect(startSpy).not.toHaveBeenCalled(); + }); + }); + + describe('getters', () => { + test('should return is synced', () => { + const provider = createProvider(); + provider['_synced'] = true; + + expect(provider.synced).toBeTruthy(); + + provider['_synced'] = false; + + expect(provider.synced).toBeFalsy(); + }); + }); + + describe('createRoom', () => { + test('should create and set realtime instance and room', () => { + const provider = createProvider(); + provider['createRoom'](); + + expect(provider['realtime']).toBeDefined(); + expect(provider['room']).toBeDefined(); + }); + }); + + describe('addRoomListeners', () => { + test('should add room listeners', () => { + const provider = createProvider(); + + jest.clearAllMocks(); + + provider['addRoomListeners'](); + + expect(MOCK_ROOM.on).toHaveBeenCalledTimes(1); + expect(MOCK_ROOM.presence.on).toHaveBeenCalledTimes(1); + }); + }); + + describe('removeRoomListeners', () => { + test('should remove room listeners', () => { + const provider = createProvider(); + + jest.clearAllMocks(); + + provider['removeRoomListeners'](); + + expect(MOCK_ROOM.off).toHaveBeenCalledTimes(3); + expect(MOCK_ROOM.presence.off).toHaveBeenCalledTimes(1); + }); + }); + + describe('fetch', () => { + test('should emit doc state', () => { + const provider = createProvider(); + const state = Y.encodeStateAsUpdateV2(provider['doc']); + + provider['fetch'](); + + expect(MOCK_ROOM.emit).toHaveBeenCalledWith('message-to-host', { + update: state, + }); + }); + }); + + describe('updateDocument', () => { + test('should apply updates to document', () => { + const provider = createProvider(); + const update = Y.encodeStateAsUpdateV2(provider['doc']); + + provider['updateDocument'](update); + + const diff = Y.diffUpdate(update, Y.encodeStateAsUpdate(provider['doc'])); + + diff.forEach((d) => { + expect(d).toEqual(0); + }); + }); + }); + + describe('changeState', () => { + test('should change state', () => { + const provider = createProvider(); + provider['state'] = 'disconnected'; + + provider['changeState']('connected'); + + expect(provider['state']).toEqual('connected'); + }); + }); + + describe('onMessageToHost', () => { + test('should apply and broadcast update', () => { + const provider = createProvider(); + provider['hostService']!['_hostId'] = 'local-participant-id'; + + const doc = new Y.Doc(); + doc.getArray('test').insert(0, ['test']); + + provider['updateDocument'] = jest.fn(); + + const comingUpdate = Y.encodeStateAsUpdateV2(doc); + + provider['onMessageToHost']({ + data: { update: comingUpdate }, + } as SocketEvent); + + const update = Y.encodeStateAsUpdateV2(provider['doc'], new Uint8Array(comingUpdate)); + + expect(provider['updateDocument']).toHaveBeenCalledWith(comingUpdate); + expect(MOCK_ROOM.emit).toHaveBeenCalledWith('broadcast', { + update, + }); + }); + + test('should do nothing if user is not the host', () => { + const provider = createProvider(); + const doc = new Y.Doc(); + doc.getArray('test').insert(0, ['test']); + + provider['updateDocument'] = jest.fn(); + + const comingUpdate = Y.encodeStateAsUpdateV2(doc); + + provider['onMessageToHost']({ + data: { update: comingUpdate }, + } as SocketEvent); + + expect(provider['updateDocument']).not.toHaveBeenCalled(); + expect(MOCK_ROOM.emit).not.toHaveBeenCalled(); + }); + }); + + describe('onDocUpdate', () => { + test('should apply update', () => { + const provider = createProvider(); + const doc = new Y.Doc(); + doc.getArray('test').insert(0, ['test']); + + const update = Y.encodeStateAsUpdateV2(doc); + + provider['onDocUpdate'](update); + + expect(MOCK_ROOM.emit).toHaveBeenCalledWith('update', { update }); + }); + }); + + describe('onLocalJoinRoom', () => { + test('should fetch document', () => { + const provider = createProvider(); + provider['fetch'] = jest.fn(); + + provider['onLocalJoinRoom']({ id: 'local-participant-id' } as PresenceEvent); + + expect(provider['fetch']).toHaveBeenCalled(); + }); + + test('should subscribe to events', () => { + const provider = createProvider(); + + jest.clearAllMocks(); + + provider['onLocalJoinRoom']({ id: 'local-participant-id' } as PresenceEvent); + + expect(MOCK_ROOM.presence.on).toHaveBeenCalledTimes(2); + }); + + test('should connect awareness', () => { + const provider = createProvider(); + provider['awareness']['connect'] = jest.fn(); + + provider['onLocalJoinRoom']({ id: 'local-participant-id' } as PresenceEvent); + + expect(provider['awareness']['connect']).toHaveBeenCalled(); + }); + + test('should do nothing if already connected', () => { + const provider = createProvider(); + provider['state'] = 'connected'; + jest.clearAllMocks(); + const connectSpy = jest.spyOn(provider['awareness'], 'connect'); + + provider['onLocalJoinRoom']({ id: 'local-participant-id' } as PresenceEvent); + + expect(MOCK_ROOM.presence.on).not.toHaveBeenCalled(); + expect(connectSpy).not.toHaveBeenCalled(); + }); + + test('should do nothing if someone other than local joins', () => { + const provider = createProvider(); + provider['fetch'] = jest.fn(); + const connectSpy = jest.spyOn(provider['awareness'], 'connect'); + + provider['onLocalJoinRoom']({ id: 'remote-participant-id' } as PresenceEvent); + + expect(provider['fetch']).not.toHaveBeenCalled(); + expect(connectSpy).not.toHaveBeenCalled(); + }); + }); + + describe('onConnectionChange', () => { + test('should emit disconnect event', () => { + const provider = createProvider(); + provider['emit'] = jest.fn(); + + provider['onConnectionChange']({ state: 'DISCONNECTED' }); + + expect(provider['emit']).toHaveBeenCalledWith('disconnect', []); + }); + }); + + describe('onRemoteDocUpdate', () => { + test('should apply update', () => { + const provider = createProvider(); + const doc = new Y.Doc(); + doc.getArray('test').insert(0, ['test']); + const update = Y.encodeStateAsUpdateV2(doc); + + provider['updateDocument'] = jest.fn(); + provider['onRemoteDocUpdate']({ + data: { update }, + presence: { id: 'remote-participant-id' }, + } as SocketEvent); + + expect(provider['updateDocument']).toHaveBeenCalledWith(update); + }); + + test('should do nothing if participant is local', () => { + const provider = createProvider(); + const doc = new Y.Doc(); + doc.getArray('test').insert(0, ['test']); + + const update = Y.encodeStateAsUpdateV2(doc); + provider['updateDocument'] = jest.fn(); + provider['onRemoteDocUpdate']({ + data: { update }, + presence: { id: 'local-participant-id' }, + } as SocketEvent); + + expect(provider['updateDocument']).not.toHaveBeenCalled(); + }); + }); + + describe('onBroadcast', () => { + test('should apply update and set synced', () => { + const provider = createProvider(); + provider['_synced'] = false; + + const doc = new Y.Doc(); + doc.getArray('test').insert(0, ['test']); + const update = Y.encodeStateAsUpdateV2(doc); + + provider['updateDocument'] = jest.fn(); + provider['onBroadcast']({ + data: { update }, + } as SocketEvent); + + expect(provider['updateDocument']).toHaveBeenCalledWith(update); + expect(provider.synced).toBe(true); + }); + + test('should do nothing if user is host', () => { + const provider = createProvider(); + provider['_synced'] = false; + provider['hostService']!['_hostId'] = 'local-participant-id'; + + const doc = new Y.Doc(); + doc.getArray('test').insert(0, ['test']); + const update = Y.encodeStateAsUpdateV2(doc); + + provider['updateDocument'] = jest.fn(); + provider['onBroadcast']({ + data: { update }, + } as SocketEvent); + + expect(provider['updateDocument']).not.toHaveBeenCalled(); + expect(provider.synced).toBe(false); + }); + }); + + describe('onHostChange', () => { + test('should fetch host document', () => { + const provider = createProvider(); + provider['fetch'] = jest.fn(); + + provider['onHostChange']('host-id'); + + expect(provider['fetch']).toHaveBeenCalled(); + }); + + test('should set synced true if host is local', () => { + const provider = createProvider(); + provider['_synced'] = false; + + provider['onHostChange']('local-participant-id'); + + expect(provider.synced).toBe(true); + }); + }); + + describe('onReceiveRealtimeMessage', () => { + test('should emit message', () => { + const provider = createProvider(); + provider['emit'] = jest.fn(); + + provider['onReceiveRealtimeMessage']('update', { update: new Uint8Array() }); + + expect(provider['emit']).toHaveBeenCalledWith('message', [ + { data: { update: new Uint8Array() }, name: 'update' }, + ]); + }); + }); + + describe('beforeSendRealtimeMessage', () => { + test('should emit message', () => { + const provider = createProvider(); + provider['emit'] = jest.fn(); + + provider['beforeSendRealtimeMessage']('update', { update: new Uint8Array() }); + + expect(provider['emit']).toHaveBeenCalledWith('outgoingMessage', [ + { data: { update: new Uint8Array() }, name: 'update' }, + ]); + }); + }); +}); diff --git a/packages/yjs/src/provider.ts b/packages/yjs/src/provider/index.ts similarity index 61% rename from packages/yjs/src/provider.ts rename to packages/yjs/src/provider/index.ts index 7f67b73..6129a4d 100644 --- a/packages/yjs/src/provider.ts +++ b/packages/yjs/src/provider/index.ts @@ -1,31 +1,29 @@ +import { + ClientState, + ConnectionState, + PresenceEvent, + PresenceEvents, + Realtime, + type SocketEvent, +} from '@superviz/socket-client'; +import debug from 'debug'; +import { ObservableV2 } from 'lib0/observable'; import * as Y from 'yjs'; + +import { createRoom } from '../common/utils/createRoom'; +import { Awareness, HostService, Logger, config } from '../services'; + import { DocUpdate, Emitter, Message, MessageToHost, - MessageToTarget, Events, Params, ProviderEvents, ProviderState, RealtimeRoom, } from './types'; -import { Awareness } from './services'; -import { ObservableV2 } from 'lib0/observable'; -import { - ClientState, - ConnectionState, - PresenceEvent, - PresenceEvents, - Realtime, - type SocketEvent, -} from '@superviz/socket-client'; -import { config } from './services/config'; -import { createRoom } from './common/utils/createRoom'; -import { HostService } from './services/host'; -import { Logger } from './services/logger'; -import debug from 'debug'; export class SuperVizYjsProvider extends ObservableV2 { public awareness: Awareness; @@ -48,10 +46,9 @@ export class SuperVizYjsProvider extends ObservableV2 { this.setConfig(); this.document = doc; - this.awareness = new Awareness(this.doc, this.opts.participant.id, this.logger); this.logger = new Logger('SuperVizYjsProvider'); + this.awareness = new Awareness(this.doc, this.opts.participant.id, this.logger); - console.log('debuf', this.opts.debug); if (!this.opts.debug) debug.disable(); if (!this.opts.connect) return; @@ -62,12 +59,16 @@ export class SuperVizYjsProvider extends ObservableV2 { // #region Public methods /** * @function connect - * @description Connect to the room. With this, start to send and receive awareness and document updates. This method is called automatically when a SuperVizYjsProvider instance is created, unless opted-out by passing "connect: false" in the constructor options. Can't connect if it is already connected + * @description Connect to the room. With this, start to send and + * receive awareness and document updates. This method is called + * automatically when a SuperVizYjsProvider instance is created, + * unless opted-out by passing "connect: false" in the constructor + * options. Can't connect if it is already connected * @public * @emits state * @returns {void} */ - public connect = (): void => { + public connect(): void { if (this.state !== ProviderState.DISCONNECTED) return; this.logger.log('[SuperViz | YjsProvider] - Connecting to the room'); @@ -76,14 +77,14 @@ export class SuperVizYjsProvider extends ObservableV2 { this.doc.on('updateV2', this.onDocUpdate); this.startRealtime(); - }; + } /** * @public @function destroy * @description Disconnect from the room and reset the instance state. * @emits state @returns {void} */ - public destroy = (): void => { + public destroy(): void { if (this.state === ProviderState.DISCONNECTED) return; this.logger.log('[SuperViz | YjsProvider] - Destroying the provider'); @@ -94,7 +95,13 @@ export class SuperVizYjsProvider extends ObservableV2 { this.awareness?.destroy(); this.realtime?.destroy(); this.hostService?.destroy(); - this.logger = null; + + // we do not set awareness to null because in + // case of a reconnect, it is only ever instantiated + // in the constructor + this.hostService = null; + this.realtime = null; + this.doc.off('updateV2', this.onDocUpdate); this.removeRoomListeners(); @@ -105,7 +112,7 @@ export class SuperVizYjsProvider extends ObservableV2 { } this.changeState(ProviderState.DISCONNECTED); - }; + } /** * @type {boolean} @@ -116,6 +123,11 @@ export class SuperVizYjsProvider extends ObservableV2 { } // #region Private methods + /** + * @function createRoom + * @description Create a new room and set the realtime and room instances + * @returns {void} + */ private createRoom(): void { this.logger.log('[SuperViz | YjsProvider] - Creating room'); @@ -124,6 +136,11 @@ export class SuperVizYjsProvider extends ObservableV2 { this.room = room; } + /** + * @function addRoomListeners + * @description Add listeners to the room instance + * @returns {void} + */ private addRoomListeners(): void { this.logger.log('[SuperViz | YjsProvider] - Adding room listeners'); @@ -132,13 +149,17 @@ export class SuperVizYjsProvider extends ObservableV2 { this.realtime.connection.on(this.onConnectionChange); } + /** + * @function removeRoomListeners + * @description Remove listeners from the room instance + * @returns {void} + */ private removeRoomListeners(): void { this.logger.log('[SuperViz | YjsProvider] - Removing room listeners'); if (this.room) { this.room.off(ProviderEvents.UPDATE, this.onRemoteDocUpdate); this.room.off(ProviderEvents.MESSAGE_TO_HOST, this.onMessageToHost); - this.room.off(ProviderEvents.MESSAGE_TO_SPECIFIC_USER, this.onMessageToUser); this.room.off(ProviderEvents.BROADCAST, this.onBroadcast); this.room.presence.off(PresenceEvents.JOINED_ROOM); } @@ -146,92 +167,54 @@ export class SuperVizYjsProvider extends ObservableV2 { this.realtime?.connection.off(); } + /** + * @function startRealtime + * @description Start the real-time connection with the room + * @returns {void} + */ private startRealtime(): void { this.createRoom(); this.hostService = new HostService(this.opts.participant.id, this.onHostChange); this.addRoomListeners(); } - private onMessageToHost = (event: SocketEvent): void => { - if (!this.hostService.isHost) return; - - this.logger.log('[SuperViz | YjsProvider] - Received message to host', event); - - this._synced = false; - - const comingUpdate = new Uint8Array(event.data.update); - this.onReceiveRealtimeMessage('message-to-host', { - update: comingUpdate, - originId: event.data.originId, - }); - - this.updateDocument(comingUpdate); - const update = Y.encodeStateAsUpdateV2(this.doc, comingUpdate); - - if (update.length > 0) { - this.beforeSendRealtimeMessage('broadcast', { update }); - this.room!.emit('broadcast', { update }); - return; - } - - this.beforeSendRealtimeMessage('message-to-specific-user', { - update, - targetId: event.data.originId, - }); - this.room!.emit('message-to-specific-user', { - update, - targetId: event.data.originId, - }); - }; - - private onMessageToUser = (msg: SocketEvent): void => { - if (msg.data.targetId !== this.opts.participant.id) return; - - this.logger.log('[SuperViz | YjsProvider] - Received message to user', msg); - - const update = new Uint8Array(msg.data.update); - this.onReceiveRealtimeMessage('message-to-specific-user', { - update, - targetId: msg.data.targetId, - }); - - this.updateDocument(update); - this._synced = true; - - this.emit('synced', []); - this.emit('sync', []); - }; - + /** + * @function fetch + * @description Request the host to send the current state of the document + * @returns {void} + */ private fetch = (): void => { this.logger.log('[SuperViz | YjsProvider] - Fetching the document'); this._synced = false; const update = Y.encodeStateAsUpdateV2(this.doc); - this.beforeSendRealtimeMessage('message-to-host', { + this.beforeSendRealtimeMessage(ProviderEvents.MESSAGE_TO_HOST, { update, - originId: this.opts.participant.id, }); - this.room!.emit('message-to-host', { + this.room!.emit(ProviderEvents.MESSAGE_TO_HOST, { update, - originId: this.opts.participant.id, }); }; - private onDocUpdate = (update: Uint8Array): void => { - this.logger.log('[SuperViz | YjsProvider] - Local document update', update); - - this.beforeSendRealtimeMessage('update', { update }); - this.room!.emit('update', { update }); - }; - + /** + * @function updateDocument + * @description Apply an update to the local document + * @param {Uint8Array} update The update to apply + * @returns {void} + */ private updateDocument = (update: Uint8Array): void => { this.logger.log('[SuperViz | YjsProvider] - Applying remote update', update); Y.applyUpdateV2(this.doc, update, this); }; + /** + * @function setConfig + * @description Set the configuration for the provider + * @returns {void} + */ private setConfig(): void { config.set('apiKey', this.opts.apiKey); config.set('environment', this.opts.environment); @@ -239,7 +222,68 @@ export class SuperVizYjsProvider extends ObservableV2 { config.set('roomName', this.opts.room || 'sv-provider'); } + /** + * @function changeState + * @description Change the state of the provider + * @param {ProviderState | `${ProviderState}`} state The new state + * @returns {void} + */ + private changeState(state: ProviderState | `${ProviderState}`): void { + this.logger.log('[SuperViz | YjsProvider] - Changing state', state); + + this.emit('state', [state]); + this.state = state; + } + // #region events callbacks + /** + * @function onMessageToHost + * @description Receive a message directed to the host. Apply the + * changes to the document and broadcast the changes to all participants + * if there is a new update, or send a new update only to the target participant + * @param {SocketEvent} event The message containing the state + * from the participant who requested the host state + * @returns {void} + */ + private onMessageToHost = (event: SocketEvent): void => { + if (!this.hostService.isHost) return; + + this.logger.log('[SuperViz | YjsProvider] - Received message to host', event); + + this._synced = false; + + const comingUpdate = new Uint8Array(event.data.update); + this.onReceiveRealtimeMessage(ProviderEvents.MESSAGE_TO_HOST, { + update: comingUpdate, + }); + + this.updateDocument(comingUpdate); + + const update = Y.encodeStateAsUpdateV2(this.doc, comingUpdate); + + this.beforeSendRealtimeMessage(ProviderEvents.BROADCAST, { update }); + this.room!.emit(ProviderEvents.BROADCAST, { update }); + }; + + /** + * @function onDocUpdate + * @description Broadcast the local document update to all participants + * @param {Uint8Array} update The update to broadcast + * @returns {void} + */ + private onDocUpdate = (update: Uint8Array): void => { + this.logger.log('[SuperViz | YjsProvider] - Local document update', update); + + this.beforeSendRealtimeMessage(ProviderEvents.UPDATE, { update }); + this.room!.emit(ProviderEvents.UPDATE, { update }); + }; + + /** + * @function onLocalJoinRoom + * @description Start the awareness service, subscribe to real-time events and fetch the document + * @param {PresenceEvent} event + * @returns {void} + */ private onLocalJoinRoom = (event: PresenceEvent): void => { if (this.state === ProviderState.CONNECTED || event.id !== this.opts.participant.id) return; @@ -250,12 +294,17 @@ export class SuperVizYjsProvider extends ObservableV2 { this.emit('connect', []); this.room!.on(ProviderEvents.MESSAGE_TO_HOST, this.onMessageToHost); - this.room!.on(ProviderEvents.MESSAGE_TO_SPECIFIC_USER, this.onMessageToUser); this.room!.on(ProviderEvents.BROADCAST, this.onBroadcast); this.fetch(); }; + /** + * @function onConnectionChange + * @description Handle disconnection from the room + * @param {ConnectionState} msg The connection state + * @returns {void} + */ private onConnectionChange = (msg: ConnectionState): void => { if (msg.state === ClientState.DISCONNECTED) { this.logger.log('[SuperViz | YjsProvider] - Disconnected from the room'); @@ -263,22 +312,35 @@ export class SuperVizYjsProvider extends ObservableV2 { } }; + /** + * @function onRemoteDocUpdate + * @description Apply changes to a remote document to the local document + * @param {SocketEvent} event The event containing the update + * @returns {void} + */ private onRemoteDocUpdate = (event: SocketEvent): void => { if (event.presence?.id === this.opts.participant.id) return; this.logger.log('[SuperViz | YjsProvider] - Received remote document update', event); const update = new Uint8Array(event.data.update); - this.onReceiveRealtimeMessage('update', { update }); + this.onReceiveRealtimeMessage(ProviderEvents.UPDATE, { update }); this.updateDocument(update); }; + /** + * @function onBroadcast + * @description Apply changes to the host's document to the local + * document. Set the provider as synced + * @param {SocketEvent} event The event containing the update + * @returns {void} + */ private onBroadcast = (event: SocketEvent): void => { if (this.hostService?.isHost) return; this.logger.log('[SuperViz | YjsProvider] - Received broadcast', event); const update = new Uint8Array(event.data.update); - this.onReceiveRealtimeMessage('broadcast', { update }); + this.onReceiveRealtimeMessage(ProviderEvents.BROADCAST, { update }); this.updateDocument(update); this._synced = true; @@ -287,6 +349,13 @@ export class SuperVizYjsProvider extends ObservableV2 { this.emit('sync', []); }; + /** + * @function onHostChange + * @description Handle the host change event. If the host is the current + * participant, set the provider as synced. Otherwise, fetch the document from the host + * @param {string} hostId The new host id + * @returns {void} + */ private onHostChange = (hostId: string): void => { this.logger.log('[SuperViz | YjsProvider] - Host changed', hostId); @@ -298,18 +367,26 @@ export class SuperVizYjsProvider extends ObservableV2 { this.fetch(); }; - private changeState(state: ProviderState): void { - this.logger.log('[SuperViz | YjsProvider] - Changing state', state); - - this.emit('state', [state]); - this.state = state; - } - + // #region Emitting messages + /** + * @function onReceiveRealtimeMessage + * @description Emit a message received from the room + * @param {string} name The message name + * @param {any} data The message data + * @returns {void} + */ private onReceiveRealtimeMessage: Emitter = (name, data): void => { this.logger.log('[SuperViz | YjsProvider] - Received message from room', { name, data }); this.emit('message', [{ name, data } as Message]); }; + /** + * @function beforeSendRealtimeMessage + * @description Emit a message sent to the room + * @param {string} name The message name + * @param {any} data The message data + * @returns {void} + */ private beforeSendRealtimeMessage: Emitter = (name, data): void => { this.logger.log('[SuperViz | YjsProvider] - Sending message to room', { name, data }); this.emit('outgoingMessage', [{ name, data } as Message]); diff --git a/packages/yjs/src/types.ts b/packages/yjs/src/provider/types.ts similarity index 62% rename from packages/yjs/src/types.ts rename to packages/yjs/src/provider/types.ts index 1fb9437..bd5a8cf 100644 --- a/packages/yjs/src/types.ts +++ b/packages/yjs/src/provider/types.ts @@ -28,7 +28,6 @@ export enum ProviderState { export enum ProviderEvents { MESSAGE_TO_HOST = 'message-to-host', - MESSAGE_TO_SPECIFIC_USER = 'message-to-specific-user', BROADCAST = 'broadcast', UPDATE = 'update', } @@ -38,34 +37,19 @@ export type MessageToHost = { originId: string; }; -export type MessageToTarget = { - update: Uint8Array; - targetId: string; -}; - export type DocUpdate = { update: Uint8Array; }; // different values that the user can receive when event 'message' // is emitted based on the event name -export type Message = - | { - name: ProviderEvents.MESSAGE_TO_HOST | `${ProviderEvents.MESSAGE_TO_HOST}`; - data: { update: Uint8Array; originId: string }; - } - | { - name: ProviderEvents.MESSAGE_TO_SPECIFIC_USER | `${ProviderEvents.MESSAGE_TO_SPECIFIC_USER}`; - data: { update: Uint8Array; targetId: string }; - } - | { name: ProviderEvents.BROADCAST | `${ProviderEvents.BROADCAST}`; data: { update: Uint8Array } } - | { name: ProviderEvents.UPDATE | `${ProviderEvents.UPDATE}`; data: { update: Uint8Array } }; +export type Message = { name: `${ProviderEvents}` | ProviderEvents; data: { update: Uint8Array } }; export type MessageCallback = (message: Message) => void; -export type Emitter = ( - name: T, - data: Extract['data'], +export type Emitter = ( + name: `${ProviderEvents}` | ProviderEvents, + data: { update: Uint8Array }, ) => void; export type Events = { diff --git a/packages/yjs/src/services/awareness/index.test.ts b/packages/yjs/src/services/awareness/index.test.ts new file mode 100644 index 0000000..9cfec3d --- /dev/null +++ b/packages/yjs/src/services/awareness/index.test.ts @@ -0,0 +1,485 @@ +import { beforeAll } from '@jest/globals'; +import type { PresenceEvent } from '@superviz/socket-client'; +import * as Y from 'yjs'; + +import { MOCK_ROOM, mockPresenceListOnce } from '../../../__mocks__/io.mock'; +import { createRoom } from '../../common/utils/createRoom'; +import { Logger } from '../logger'; + +import { UpdateOrigin, UpdatePresence } from './types'; + +import { Awareness } from '.'; + +function createAwareness(): Awareness { + const doc = new Y.Doc(); + const participantId = 'local-participant-id'; + const logger = new Logger('awareness test'); + return new Awareness(doc, participantId, logger); +} + +describe('Awareness', () => { + beforeEach(() => { + jest.clearAllMocks(); + jest.restoreAllMocks(); + }); + + describe('connect', () => { + test('should subscribe to events', () => { + const awareness = createAwareness(); + const { room } = createRoom('awareness-test'); + const documentSpy = jest.spyOn(document, 'addEventListener'); + + awareness.connect(room); + + expect(awareness['room']!.presence.on).toHaveBeenCalledTimes(2); + expect(documentSpy).toHaveBeenCalledTimes(1); + }); + }); + + describe('destroy', () => { + test('should unsubscribe from events', () => { + const awareness = createAwareness(); + const { room } = createRoom('awareness-test'); + const documentSpy = jest.spyOn(document, 'removeEventListener'); + + awareness.connect(room); + awareness.destroy(); + + expect(MOCK_ROOM.presence.off).toHaveBeenCalledTimes(2); + expect(documentSpy).toHaveBeenCalledTimes(1); + }); + + test('should clear states', () => { + const awareness = createAwareness(); + const { room } = createRoom('awareness-test'); + + awareness.connect(room); + awareness.destroy(); + + expect(awareness['states'].size).toBe(0); + }); + + test('should clear participantIdToClientId', () => { + const awareness = createAwareness(); + const { room } = createRoom('awareness-test'); + + awareness.connect(room); + awareness.destroy(); + + expect(awareness['participantIdToClientId'].size).toBe(0); + }); + + test('should call onLeave', () => { + const awareness = createAwareness(); + const { room } = createRoom('awareness-test'); + const onLeaveSpy = jest.spyOn(awareness as any, 'onLeave'); + + awareness.connect(room); + awareness.destroy(); + + expect(onLeaveSpy).toHaveBeenCalledTimes(1); + }); + }); + + describe('getLocalState', () => { + test('should return local state', () => { + const awareness = createAwareness(); + + awareness.setLocalState({ visibility: 'visible' }); + + const state = awareness.getLocalState(); + expect(state).toEqual({ visibility: 'visible' }); + }); + + test('should return null if state is not set', () => { + const awareness = createAwareness(); + awareness['states'].delete(awareness['clientId']); + + const state = awareness.getLocalState(); + expect(state).toBeNull(); + }); + + test('should return null if presence key is not set', () => { + const awareness = createAwareness(); + awareness['states'].set(awareness['clientId'], {}); + + const state = awareness.getLocalState(); + expect(state).toBeNull(); + }); + }); + + describe('getStates', () => { + test('should return states', () => { + const awareness = createAwareness(); + + awareness.setLocalState({ visibility: 'visible' }); + + const states = awareness.getStates(); + expect(states.size).toBe(1); + expect(states.get(awareness['clientId'])).toEqual({ visibility: 'visible' }); + }); + }); + + describe('setLocalState', () => { + test('should set local state', () => { + const awareness = createAwareness(); + awareness.setLocalState({ visibility: 'visible' }); + + const state = awareness.getLocalState(); + expect(state).toEqual({ visibility: 'visible' }); + }); + + test('should delete state if null', () => { + const awareness = createAwareness(); + awareness.setLocalState({ visibility: 'visible' }); + + let state = awareness.getLocalState(); + expect(state).toEqual({ visibility: 'visible' }); + + awareness.setLocalState(null); + + state = awareness.getLocalState(); + expect(state).toBeNull(); + }); + + test('should not delete if null if state is not even set', () => { + const awareness = createAwareness(); + awareness.states.delete = jest.fn(); + + awareness.setLocalState(null); + + expect(awareness.states.delete).not.toHaveBeenCalled(); + }); + + test('should preserve info in the states map besides the yjs presence key', () => { + const awareness = createAwareness(); + + awareness.states.set(awareness['clientId'], { + visibility: 'visible', + [awareness['YJS_STATE']]: { + audio: 'muted', + }, + }); + + awareness.setLocalState({ video: 'on' }); + + const state = awareness.states.get(awareness['clientId']); + expect(state).toEqual({ + visibility: 'visible', + [awareness['YJS_STATE']]: { + video: 'on', + }, + origin: 'set local state', + }); + }); + + test('if state was not set, should set default old state', () => { + const awareness = createAwareness(); + + awareness.states.set(awareness['clientId'], null); + awareness.setLocalState({}); + + const state = awareness.states.get(awareness['clientId']); + expect(state).toEqual({ + [awareness['YJS_STATE']]: {}, + origin: 'set local state', + clientId: awareness['clientId'], + }); + }); + }); + + describe('setLocalStateField', () => { + test('should set a single field in the local state, taking the previous state into account', () => { + const awareness = createAwareness(); + + awareness.states.set(awareness['clientId'], { + [awareness['YJS_STATE']]: { + audio: 'muted', + }, + }); + + awareness.setLocalStateField('video', 'on'); + + const state = awareness.states.get(awareness['clientId']); + expect(state).toEqual({ + [awareness['YJS_STATE']]: { + audio: 'muted', + video: 'on', + }, + origin: 'set local state', + }); + }); + + test('should set single field even if complete state did not exist', () => { + const awareness = createAwareness(); + + awareness.states.set(awareness['clientId'], null); + awareness.setLocalStateField('video', 'on'); + + const state = awareness.states.get(awareness['clientId']); + expect(state).toEqual({ + [awareness['YJS_STATE']]: { + video: 'on', + }, + origin: 'set local state', + clientId: awareness['clientId'], + }); + }); + }); + + describe('onLeave', () => { + test('should clear maps', () => { + const awareness = createAwareness(); + awareness['participantIdToClientId'].set('local-participant-id', 1); + awareness['states'].set(1, {}); + + awareness['onLeave']({ id: 'local-participant-id' } as unknown as PresenceEvent); + + expect(awareness['states'].size).toBe(0); + expect(awareness['participantIdToClientId'].size).toBe(0); + }); + + test('should remove other awareness when local participant leaves', () => { + const awareness = createAwareness(); + awareness['participantIdToClientId'].set('local-participant-id', awareness['clientId']); + + awareness['states'].set(1, {}); + awareness['states'].set(2, {}); + awareness['states'].set(3, {}); + awareness['states'].set(awareness['clientId'], {}); + + const awarenessToRemove = [1, 2, 3, awareness['clientId']]; + + awareness['removeAwarenessStates'] = jest.fn(); + + awareness['onLeave']({ id: 'local-participant-id' } as unknown as PresenceEvent); + + expect(awareness['removeAwarenessStates']).toHaveBeenCalledWith( + awarenessToRemove, + UpdateOrigin.PRESENCE, + ); + }); + }); + + describe('onUpdate', () => { + test('should set state of remote client', () => { + const awareness = createAwareness(); + awareness['setRemoteState'] = jest.fn(); + awareness['participantIdToClientId'].set('1', 1); + + awareness['onUpdate']({ + id: '1', + data: { clientId: 1, [awareness['YJS_STATE']]: {} }, + } as unknown as PresenceEvent); + + expect(awareness['states'].get(1)).toEqual({ + clientId: 1, + [awareness['YJS_STATE']]: {}, + }); + }); + + test('should not set state if it comes from local participant', () => { + const awareness = createAwareness(); + awareness['states'].set = jest.fn(); + + awareness['onUpdate']({ + id: 'local-participant-id', + data: { clientId: 1, [awareness['YJS_STATE']]: {} }, + } as unknown as PresenceEvent); + + expect(awareness['states'].set).toHaveBeenCalledTimes(0); + }); + + test('should remove state if it is null', () => { + const awareness = createAwareness(); + awareness['removeAwarenessStates'] = jest.fn(); + + awareness['onUpdate']({ + id: '1', + data: { clientId: 1, [awareness['YJS_STATE']]: null }, + } as unknown as PresenceEvent); + + expect(awareness['removeAwarenessStates']).toHaveBeenCalledWith([1], UpdateOrigin.PRESENCE); + }); + + test('should map participant and client id if not already mapped', () => { + const awareness = createAwareness(); + expect(awareness['participantIdToClientId'].get('1')).toBeUndefined(); + + awareness['setRemoteState'] = jest.fn(); + + awareness['onUpdate']({ + id: '1', + data: { clientId: 1, [awareness['YJS_STATE']]: {} }, + } as unknown as PresenceEvent); + + expect(awareness['participantIdToClientId'].get('1')).toBe(1); + }); + }); + + describe('onVisibilityChange', () => { + beforeAll(() => { + jest.useFakeTimers(); + }); + + beforeEach(() => { + jest.clearAllMocks(); + jest.resetAllMocks(); + }); + + afterAll(() => { + jest.clearAllTimers(); + }); + + test('should set local state as null after a timeout', () => { + const awareness = createAwareness(); + awareness['setLocalState']({ audio: 'on' }); + awareness['setLocalState'] = jest.fn(); + + jest.spyOn(document, 'visibilityState', 'get').mockReturnValue('hidden'); + + awareness['onVisibilityChange'](); + + jest.advanceTimersByTime(35000); + + expect(awareness['setLocalState']).toHaveBeenCalledWith(null); + expect(awareness['previousState']).toEqual({ audio: 'on' }); + }); + + test('should clear timeout if visibility state is visible', () => { + const awareness = createAwareness(); + awareness['setLocalState']({ audio: 'on' }); + awareness['setLocalState'] = jest.fn(); + + jest.spyOn(document, 'visibilityState', 'get').mockReturnValue('hidden'); + + awareness['onVisibilityChange'](); + + jest.advanceTimersByTime(15000); + + jest.spyOn(document, 'visibilityState', 'get').mockReturnValue('visible'); + + awareness['onVisibilityChange'](); + + jest.advanceTimersByTime(35000); + + expect(awareness['setLocalState']).not.toHaveBeenCalled(); + expect(awareness['previousState']).toBeNull(); + }); + + test('should restore previous state if visibility state is visible', () => { + const awareness = createAwareness(); + awareness['setLocalState']({ audio: 'on' }); + awareness['setLocalState'] = jest.fn(); + + jest.spyOn(document, 'visibilityState', 'get').mockReturnValue('hidden'); + + awareness['onVisibilityChange'](); + + jest.advanceTimersByTime(35000); + + jest.spyOn(document, 'visibilityState', 'get').mockReturnValue('visible'); + + awareness['onVisibilityChange'](); + + jest.advanceTimersByTime(35000); + + expect(awareness['setLocalState']).toHaveBeenCalledWith({ audio: 'on' }); + expect(awareness['previousState']).toBeNull(); + }); + }); + + describe('initializePresences', () => { + test('should update own presence in the room with the client id', () => { + const awareness = createAwareness(); + + const { room } = createRoom('awareness-test'); + awareness.connect(room); + + mockPresenceListOnce([{ id: 'local-participant-id', data: { clientId: 1 } }]); + + awareness['initializePresences'](); + + expect(MOCK_ROOM.presence.update).toHaveBeenCalledWith({ + clientId: awareness['clientId'], + [awareness['YJS_STATE']]: {}, + origin: 'on connect', + }); + }); + + test('should set the state and map the id of participants', () => { + const awareness = createAwareness(); + + const { room } = createRoom('awareness-test'); + awareness.connect(room); + + awareness['states'].set = jest.fn(); + + mockPresenceListOnce([ + { id: '1', data: { clientId: 1, visibility: 'visible' } }, + { id: '2', data: { clientId: 2, visibility: 'hidden' } }, + ]); + + awareness['initializePresences'](); + + expect(awareness['participantIdToClientId'].get('1')).toBe(1); + expect(awareness['participantIdToClientId'].get('2')).toBe(2); + + expect(awareness['states'].set).toHaveBeenCalledTimes(2); + expect(awareness['states'].set).toHaveBeenCalledWith(1, { + clientId: 1, + visibility: 'visible', + }); + expect(awareness['states'].set).toHaveBeenCalledWith(2, { + clientId: 2, + visibility: 'hidden', + }); + }); + + test('should not set state and map if the presence has no clientId', () => { + const awareness = createAwareness(); + + const { room } = createRoom('awareness-test'); + awareness.connect(room); + + awareness['states'].set = jest.fn(); + + mockPresenceListOnce([ + { id: '1', data: { visibility: 'visible' } }, + { id: '2', data: { visibility: 'hidden' } }, + ]); + + awareness['initializePresences'](); + + expect(awareness['participantIdToClientId'].get('1')).toBeUndefined(); + expect(awareness['participantIdToClientId'].get('2')).toBeUndefined(); + + expect(awareness['states'].get(1)).toBeUndefined(); + expect(awareness['states'].get(2)).toBeUndefined(); + expect(awareness['states'].set).not.toHaveBeenCalled(); + }); + }); + + describe('removeAwarenessStates', () => { + test('should remove states from the map', () => { + const awareness = createAwareness(); + + awareness['states'].set(1, { visibility: 'visible' }); + awareness['states'].set(2, { visibility: 'hidden' }); + + awareness['removeAwarenessStates']([1, 2], UpdateOrigin.PRESENCE); + + expect(awareness['states'].get(1)).toBeUndefined(); + expect(awareness['states'].get(2)).toBeUndefined(); + }); + + test('should do nothing if state does not exist', () => { + const awareness = createAwareness(); + awareness['states'].delete = jest.fn(); + + awareness['removeAwarenessStates']([1, 2], UpdateOrigin.PRESENCE); + + expect(awareness['states'].delete).not.toHaveBeenCalled(); + }); + }); +}); diff --git a/packages/yjs/src/services/awareness/index.ts b/packages/yjs/src/services/awareness/index.ts index 7891562..4a5cc77 100644 --- a/packages/yjs/src/services/awareness/index.ts +++ b/packages/yjs/src/services/awareness/index.ts @@ -1,10 +1,12 @@ -import { ObservableV2 } from 'lib0/observable'; import { PresenceEvent } from '@superviz/socket-client'; +import { ObservableV2 } from 'lib0/observable'; import * as Y from 'yjs'; -import { Events, UpdateOrigin, UpdatePresence } from './types'; -import { RealtimeRoom } from '../../types'; + +import { RealtimeRoom } from '../../provider/types'; import { Logger } from '../logger'; +import { Events, UpdateOrigin, UpdatePresence } from './types'; + export class Awareness extends ObservableV2 { public clientId: number = 0; public meta: Map = new Map(); @@ -16,7 +18,7 @@ export class Awareness extends ObservableV2 { private visibilityTimeout: ReturnType | undefined; private readonly TIMEOUT_TIMER_MS = 30000; - private readonly Y_PRESENCE_KEY = '__yjs'; + private readonly YJS_STATE = '__yjs'; private previousState: any | null = null; @@ -29,45 +31,31 @@ export class Awareness extends ObservableV2 { this.clientId = this.doc.clientID; } + /** + * @function connect + * @description Start the awareness service + * @param {RealtimeRoom} room Main room in which it will propagete presence + * @returns {void} + */ public connect(room: RealtimeRoom): void { this.logger.log('[SuperViz | Awareness] - Connect awareness to room'); this.room = room; this.addRoomListeners(); this.addDocumentListeners(); - - this.room.presence.get((presences: PresenceEvent[]) => { - const added: number[] = []; - - presences.forEach((presence) => { - const clientId = presence.data.clientId; - if (!clientId) return; - added.push(clientId); - this.participantIdToClientId.set(presence.id, clientId); - this.states.set(clientId, { - ...presence.data, - }); - }); - - const clientId = this.doc.clientID; - this.room.presence.update({ - clientId, - [this.Y_PRESENCE_KEY]: {}, - ...(this.states.get(clientId) || {}), - origin: 'on connect', - }); - - const update = { added, updated: [], removed: [] }; - - this.emit('change', [update, UpdateOrigin.PRESENCE]); - }); + this.initializePresences(); } - //#region public + // #region public methods + /** + * @function destroy + * @description Destroy the awareness service and clean up all the listeners, states, etc + * @returns {void} + */ public destroy(): void { this.logger.log('[SuperViz | Awareness] - Destroy awareness'); - clearInterval(this.visibilityTimeout); + clearTimeout(this.visibilityTimeout); this.visibilityTimeout = undefined; this.removeDocumentListeners(); @@ -80,22 +68,27 @@ export class Awareness extends ObservableV2 { this.onLeave({ id: this.participantId } as unknown as PresenceEvent); } + /** + * @function getLocalState + * @description Get the local state of the current participant, stores in the field yjs_state + * @returns + */ public getLocalState(): Record | null { this.logger.log( '[SuperViz | Awareness] - Get local state', - this.states.get(this.clientId)?.[this.Y_PRESENCE_KEY], + this.states.get(this.clientId)?.[this.YJS_STATE], ); const state = this.states.get(this.clientId); - if (!state || !state[this.Y_PRESENCE_KEY]) return null; + if (!state || !state[this.YJS_STATE]) return null; - return state[this.Y_PRESENCE_KEY]; + return state[this.YJS_STATE]; } public getStates(): Map> { const states = new Map>(); this.states.forEach((state, clientId) => { - states.set(clientId, state[this.Y_PRESENCE_KEY]); + states.set(clientId, state[this.YJS_STATE]); }); this.logger.log('[SuperViz | Awareness] - Get states', states); @@ -110,7 +103,7 @@ export class Awareness extends ObservableV2 { this.states.delete(this.clientId); this.room?.presence.update({ ...this.states.get(this.clientId), - [this.Y_PRESENCE_KEY]: null, + [this.YJS_STATE]: null, origin: 'set local state null', }); @@ -119,18 +112,16 @@ export class Awareness extends ObservableV2 { return; } - if (this.previousState && document.visibilityState === 'hidden') return; - const update = { added: [], updated: [], removed: [] }; let oldState = this.states.get(this.clientId); if (oldState) { update.updated.push(this.clientId); } else { - oldState = { [this.Y_PRESENCE_KEY]: {}, clientId: this.clientId }; + oldState = { [this.YJS_STATE]: {}, clientId: this.clientId }; update.added.push(this.clientId); } - const newState = { ...oldState, [this.Y_PRESENCE_KEY]: state, origin: 'set local state' }; + const newState = { ...oldState, [this.YJS_STATE]: state, origin: 'set local state' }; this.states.set(this.clientId, newState); this.room?.presence.update(newState); @@ -147,7 +138,7 @@ export class Awareness extends ObservableV2 { }); } - //#region private + // #region events listeners private addRoomListeners(): void { this.room.presence.on('presence.update', this.onUpdate); this.room.presence.on('presence.leave', this.onLeave); @@ -166,6 +157,7 @@ export class Awareness extends ObservableV2 { document.removeEventListener('visibilitychange', this.onVisibilityChange); } + // #region events callbacks private onLeave = (event: PresenceEvent): void => { const clientId = this.participantIdToClientId.get(event.id); this.logger.log('[SuperViz | Awareness] - Participant left', { participant: event, clientId }); @@ -183,6 +175,7 @@ export class Awareness extends ObservableV2 { this.states.delete(clientId); this.emit('update', [update, UpdateOrigin.PRESENCE]); + this.emit('update', [update, UpdateOrigin.PRESENCE]); }; private onUpdate = (event: PresenceEvent): void => { @@ -190,7 +183,7 @@ export class Awareness extends ObservableV2 { this.logger.log('[SuperViz | Awareness] - Participant updated', event); - if (event.data[this.Y_PRESENCE_KEY] === null) { + if (event.data[this.YJS_STATE] === null) { this.removeAwarenessStates([event.data.clientId], UpdateOrigin.PRESENCE); return; } @@ -213,22 +206,9 @@ export class Awareness extends ObservableV2 { }); this.emit('update', [{ added, updated, removed: [] }, UpdateOrigin.PRESENCE]); + this.emit('change', [{ added, updated, removed: [] }, UpdateOrigin.PRESENCE]); }; - private removeAwarenessStates(removed: number[], origin: UpdateOrigin): void { - this.logger.log('[SuperViz | Awareness] - Remove awareness states', { removed, origin }); - - const update = { added: [], updated: [], removed: [] }; - removed.forEach((clientId) => { - if (!this.states.get(clientId)) return; - - this.states.delete(clientId); - update.removed.push(clientId); - }); - - this.emit('change', [update, origin]); - } - private onVisibilityChange = (): void => { if (document.visibilityState === 'visible') { clearTimeout(this.visibilityTimeout); @@ -246,4 +226,47 @@ export class Awareness extends ObservableV2 { this.setLocalState(null); }, this.TIMEOUT_TIMER_MS); }; + + // #region private methods + private initializePresences() { + this.room.presence.get((presences: PresenceEvent[]) => { + const added: number[] = []; + + presences.forEach((presence) => { + const { clientId } = presence.data; + if (!clientId) return; + added.push(clientId); + this.participantIdToClientId.set(presence.id, clientId); + this.states.set(clientId, { + ...presence.data, + }); + }); + + const clientId = this.doc.clientID; + this.room.presence.update({ + clientId, + [this.YJS_STATE]: {}, + ...(this.states.get(clientId) || {}), + origin: 'on connect', + }); + + const update = { added, updated: [], removed: [] }; + + this.emit('change', [update, UpdateOrigin.PRESENCE]); + }); + } + + private removeAwarenessStates(removed: number[], origin: UpdateOrigin): void { + this.logger.log('[SuperViz | Awareness] - Remove awareness states', { removed, origin }); + + const update = { added: [], updated: [], removed: [] }; + removed.forEach((clientId) => { + if (!this.states.get(clientId)) return; + + this.states.delete(clientId); + update.removed.push(clientId); + }); + + this.emit('change', [update, origin]); + } } diff --git a/packages/yjs/src/services/awareness/types.ts b/packages/yjs/src/services/awareness/types.ts index 247afe1..3e09fa5 100644 --- a/packages/yjs/src/services/awareness/types.ts +++ b/packages/yjs/src/services/awareness/types.ts @@ -5,7 +5,7 @@ export enum UpdateOrigin { export interface UpdatePresence { clientId: number; - __yjs: any; + yjs_state: any; } type AwarenessUpdate = { diff --git a/packages/yjs/src/services/config/index.test.ts b/packages/yjs/src/services/config/index.test.ts new file mode 100644 index 0000000..9130613 --- /dev/null +++ b/packages/yjs/src/services/config/index.test.ts @@ -0,0 +1,29 @@ +import { config } from '.'; + +describe('config', () => { + test('should set config field based on key', () => { + config.set('apiKey', '123'); + config.set('environment', 'dev'); + config.set('participant', { id: '123', name: 'John' }); + config.set('roomName', 'room1'); + + expect(config['config']).toEqual({ + apiKey: '123', + environment: 'dev', + participant: { id: '123', name: 'John' }, + roomName: 'room1', + }); + }); + + test('should get config field based on key', () => { + config.set('apiKey', '123'); + config.set('environment', 'dev'); + config.set('participant', { id: '123', name: 'John' }); + config.set('roomName', 'room1'); + + expect(config.get('apiKey')).toBe('123'); + expect(config.get('environment')).toBe('dev'); + expect(config.get('participant')).toEqual({ id: '123', name: 'John' }); + expect(config.get('roomName')).toBe('room1'); + }); +}); diff --git a/packages/yjs/src/services/config/index.ts b/packages/yjs/src/services/config/index.ts index 9f03793..95e9dbb 100644 --- a/packages/yjs/src/services/config/index.ts +++ b/packages/yjs/src/services/config/index.ts @@ -1,5 +1,6 @@ -import { EnvironmentTypes } from "../../types"; -import { ConfigurationInterface } from "./types"; +import { EnvironmentTypes } from '../../provider/types'; + +import { ConfigurationInterface } from './types'; class Config { private config: ConfigurationInterface = { @@ -12,7 +13,10 @@ class Config { roomName: '', }; - public set(key: T, value: ConfigurationInterface[T]): void { + public set( + key: T, + value: ConfigurationInterface[T], + ): void { this.config[key] = value; } @@ -21,4 +25,4 @@ class Config { } } -export const config = new Config(); \ No newline at end of file +export const config = new Config(); diff --git a/packages/yjs/src/services/config/types.ts b/packages/yjs/src/services/config/types.ts index e8ccdc9..71e7bb8 100644 --- a/packages/yjs/src/services/config/types.ts +++ b/packages/yjs/src/services/config/types.ts @@ -1,8 +1,8 @@ -import { EnvironmentTypes, Participant } from "../../types"; +import { EnvironmentTypes, Participant } from '../../provider/types'; export interface ConfigurationInterface { apiKey: string; participant: Participant; environment: EnvironmentTypes | `${EnvironmentTypes}`; roomName: string | undefined; -} \ No newline at end of file +} diff --git a/packages/yjs/src/services/host/index.test.ts b/packages/yjs/src/services/host/index.test.ts new file mode 100644 index 0000000..260a4ae --- /dev/null +++ b/packages/yjs/src/services/host/index.test.ts @@ -0,0 +1,409 @@ +import { PresenceEvent, SocketEvent } from '@superviz/socket-client'; + +import { MOCK_ROOM, mockRoomHistoryOnce, mockPresenceListOnce } from '../../../__mocks__/io.mock'; + +import { RoomEvent } from './types'; + +import { HostService } from '.'; + +describe('HostService', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + describe('start', () => { + test('should create a new HostService instance', () => { + const hostService = new HostService('participantId', () => {}); + expect(hostService).toBeInstanceOf(HostService); + }); + + test('should connect to host room', () => { + const hostService = new HostService('participantId', () => {}); + expect(hostService['room']).toEqual(MOCK_ROOM); + }); + + test('should subscribe to room events', () => { + const hostService = new HostService('participantId', () => {}); + expect(MOCK_ROOM.presence.on).toHaveBeenCalledTimes(2); + expect(MOCK_ROOM.presence.on).toHaveBeenCalledWith( + 'presence.leave', + hostService['onPresenceLeave'], + ); + expect(MOCK_ROOM.presence.on).toHaveBeenCalledWith( + 'presence.joined-room', + hostService['onPresenceEnter'], + ); + expect(MOCK_ROOM.on).toHaveBeenCalledTimes(1); + expect(MOCK_ROOM.on).toHaveBeenCalledWith('state', hostService['onStateChange']); + }); + }); + + describe('destroy', () => { + test('should destroy the HostService instance', () => { + const hostService = new HostService('participantId', () => {}); + hostService.destroy(); + + expect(MOCK_ROOM.presence.off).toHaveBeenCalledTimes(2); + expect(MOCK_ROOM.presence.off).toHaveBeenCalledWith('presence.leave'); + expect(MOCK_ROOM.presence.off).toHaveBeenCalledWith('presence.joined-room'); + expect(MOCK_ROOM.off).toHaveBeenCalledTimes(1); + expect(MOCK_ROOM.off).toHaveBeenCalledWith('state', hostService['onStateChange']); + expect(MOCK_ROOM.disconnect).toHaveBeenCalledTimes(1); + expect(MOCK_ROOM.presence.off).toHaveBeenCalledTimes(2); + expect(hostService!['realtime']['destroy']).toHaveBeenCalledTimes(1); + }); + }); + + describe('getters', () => { + test('should return isHost', () => { + const ids = ['id1', 'ids2']; + const participantId = ids[Math.floor(Math.random() * 2)]; + const hostId = ids[Math.floor(Math.random() * 2)]; + + const hostService = new HostService(participantId, () => {}); + hostService['_hostId'] = hostId; + + expect(hostService.isHost).toBe(hostId === participantId); + }); + + test('should return hostId', () => { + const hostService = new HostService('participantId', () => {}); + const hostId = Math.floor(Math.random() * 100000); + hostService['_hostId'] = String(hostId); + + expect(hostService.hostId).toBe(String(hostId)); + }); + }); + + describe('searchHost', () => { + test('should update host if the room has no history', () => { + const hostService = new HostService('participantId', () => {}); + + hostService['updateHost'] = jest.fn(); + mockRoomHistoryOnce([]); + + hostService['searchHost'](); + + expect(hostService['updateHost']).toHaveBeenCalledTimes(1); + }); + + test('should early return if there is already a host', () => { + const hostService = new HostService('participantId', () => {}); + + hostService['_hostId'] = 'hostId'; + hostService['updateHost'] = jest.fn(); + mockRoomHistoryOnce([ + { + data: { + hostId: 'hostId', + }, + }, + ]); + + hostService['searchHost'](); + + expect(hostService['updateHost']).not.toHaveBeenCalled(); + }); + + test("should set the participant as the host if it's alone in in the room", () => { + const hostService = new HostService('participantId', () => {}); + hostService['setHostInRoom'] = jest.fn(); + + mockRoomHistoryOnce([ + { + data: {}, + }, + ]); + mockPresenceListOnce([ + { + id: 'participantId', + }, + ]); + + hostService['searchHost'](); + + expect(hostService['setHostInRoom']).toHaveBeenCalledTimes(1); + expect(hostService['setHostInRoom']).toHaveBeenCalledWith('participantId'); + }); + + test('should update host if there is no hostId in the room history', () => { + const hostService = new HostService('participantId', () => {}); + + hostService['updateHost'] = jest.fn(); + mockRoomHistoryOnce([ + { + data: {}, + }, + ]); + mockPresenceListOnce([ + { + id: 'participantId', + }, + { + id: 'anotherParticipant', + }, + ]); + + hostService['searchHost'](); + + expect(hostService['updateHost']).toHaveBeenCalledTimes(1); + }); + + test('should update host if the hostId is not in the participants list', () => { + const hostService = new HostService('participantId', () => {}); + + hostService['updateHost'] = jest.fn(); + mockRoomHistoryOnce([ + { + data: { + hostId: 'hostId', + }, + }, + ]); + mockPresenceListOnce([ + { + id: 'participantId', + }, + { + id: 'anotherParticipant', + }, + ]); + + hostService['searchHost'](); + + expect(hostService['updateHost']).toHaveBeenCalledTimes(1); + }); + + test('should set hostId found in the room history', () => { + const hostService = new HostService('participantId', () => {}); + + hostService['setHostId'] = jest.fn(); + mockRoomHistoryOnce([ + { + data: { + hostId: 'hostId', + }, + }, + ]); + mockPresenceListOnce([ + { + id: 'hostId', + }, + ]); + + hostService['searchHost'](); + + expect(hostService['setHostId']).toHaveBeenCalledTimes(1); + expect(hostService['setHostId']).toHaveBeenCalledWith('hostId'); + }); + }); + + describe('setHostId', () => { + test('should set the hostId and call the callback', () => { + const callback = jest.fn(); + const hostService = new HostService('participantId', callback); + + hostService['setHostId']('hostId'); + + expect(hostService['_hostId']).toBe('hostId'); + expect(callback).toHaveBeenCalledTimes(1); + }); + }); + + describe('updateHost', () => { + test('should set the oldest in the room with data coming from presence', () => { + const hostService = new HostService('participantId', () => {}); + + hostService['setOldestAsHost'] = jest.fn(); + const participants = [ + { + id: 'participantId', + }, + { + id: 'anotherParticipant', + }, + ]; + mockPresenceListOnce(participants); + + hostService['updateHost'](); + + expect(hostService['setOldestAsHost']).toHaveBeenCalledTimes(1); + expect(hostService['setOldestAsHost']).toHaveBeenCalledWith(participants); + }); + + test('should set the oldest in the room with data passed as argument', () => { + const hostService = new HostService('participantId', () => {}); + + hostService['setOldestAsHost'] = jest.fn(); + const participants = [ + { + id: 'participantId', + }, + { + id: 'anotherParticipant', + }, + ]; + + hostService['updateHost'](participants as PresenceEvent[]); + + expect(hostService['setOldestAsHost']).toHaveBeenCalledTimes(1); + expect(hostService['setOldestAsHost']).toHaveBeenCalledWith(participants); + }); + }); + + describe('setOldestAsHost', () => { + test('should set local participant as host in the room if it is the oldest', () => { + const hostService = new HostService('participantId', () => {}); + + hostService['setHostInRoom'] = jest.fn(); + hostService['setOldestAsHost']([ + { + id: 'participantId', + timestamp: 1, + }, + { + id: 'secondParticipant', + timestamp: 150, + }, + { + id: 'anotherParticipant', + timestamp: 200, + }, + ] as PresenceEvent[]); + + expect(hostService['setHostInRoom']).toHaveBeenCalledTimes(1); + expect(hostService['setHostInRoom']).toHaveBeenCalledWith('participantId'); + }); + + test('should set remote participant as host locally if it is the oldest', () => { + const hostService = new HostService('participantId', () => {}); + + hostService['setHostId'] = jest.fn(); + hostService['setOldestAsHost']([ + { + id: 'secondParticipant', + timestamp: 1, + }, + { + id: 'participantId', + timestamp: 150, + }, + { + id: 'anotherParticipant', + timestamp: 200, + }, + ] as PresenceEvent[]); + + expect(hostService['setHostId']).toHaveBeenCalledTimes(1); + expect(hostService['setHostId']).toHaveBeenCalledWith('secondParticipant'); + }); + + describe('setHostInRoom', () => { + test('should emit the hostId to the room', () => { + const hostService = new HostService('participantId', () => {}); + + hostService['setHostInRoom']('hostId'); + + expect(MOCK_ROOM.emit).toHaveBeenCalledTimes(1); + expect(MOCK_ROOM.emit).toHaveBeenCalledWith('state', { + hostId: 'hostId', + }); + }); + }); + }); + + describe('room callbacks', () => { + describe('onPresenceLeave', () => { + test('should update host if the host leaves the room', () => { + const hostService = new HostService('participantId', () => {}); + hostService['_hostId'] = 'hostId'; + hostService['updateHost'] = jest.fn(); + + hostService['onPresenceLeave']({ + id: 'hostId', + } as PresenceEvent); + + expect(hostService['_hostId']).toBe(''); + expect(hostService['updateHost']).toHaveBeenCalledTimes(1); + }); + + test('should do nothing if the host does not leave the room', () => { + const hostService = new HostService('participantId', () => {}); + hostService['_hostId'] = 'hostId'; + hostService['updateHost'] = jest.fn(); + + hostService['onPresenceLeave']({ + id: 'anotherParticipant', + } as PresenceEvent); + + expect(hostService['_hostId']).toBe('hostId'); + expect(hostService['updateHost']).not.toHaveBeenCalled(); + }); + }); + + describe('onStateChange', () => { + test('should set host if the hostId changes', () => { + const hostService = new HostService('participantId', () => {}); + hostService['setHostId'] = jest.fn(); + + hostService['onStateChange']({ + data: { + hostId: 'hostId', + }, + } as SocketEvent); + + expect(hostService['setHostId']).toHaveBeenCalledTimes(1); + }); + + test('should do nothing if the hostId does not change', () => { + const hostService = new HostService('participantId', () => {}); + hostService['setHostId'] = jest.fn(); + hostService['_hostId'] = 'hostId'; + + hostService['onStateChange']({ + data: { + hostId: 'hostId', + }, + } as SocketEvent); + + expect(hostService['setHostId']).not.toHaveBeenCalled(); + }); + }); + + describe('onPresenceEnter', () => { + test('should search for the host if the participant when local participant enters the room', () => { + const hostService = new HostService('participantId', () => {}); + + hostService['searchHost'] = jest.fn(); + hostService['onPresenceEnter']({ + id: 'participantId', + } as PresenceEvent); + + expect(hostService['searchHost']).toHaveBeenCalledTimes(1); + }); + + test('should do nothing when host is already set', () => { + const hostService = new HostService('participantId', () => {}); + hostService['_hostId'] = 'hostId'; + + hostService['searchHost'] = jest.fn(); + hostService['onPresenceEnter']({ + id: 'participantId', + } as PresenceEvent); + + expect(hostService['searchHost']).not.toHaveBeenCalled(); + }); + + test('should do nothing when others enter room', () => { + const hostService = new HostService('participantId', () => {}); + + hostService['searchHost'] = jest.fn(); + hostService['onPresenceEnter']({ + id: 'anotherParticipant', + } as PresenceEvent); + + expect(hostService['searchHost']).not.toHaveBeenCalled(); + }); + }); + }); +}); diff --git a/packages/yjs/src/services/host/index.ts b/packages/yjs/src/services/host/index.ts index f21f5d7..832746c 100644 --- a/packages/yjs/src/services/host/index.ts +++ b/packages/yjs/src/services/host/index.ts @@ -1,6 +1,8 @@ import { PresenceEvent, Realtime, Room, SocketEvent } from '@superviz/socket-client'; + import { createRoom } from '../../common/utils/createRoom'; import { config } from '../config'; + import { RoomEvent } from './types'; export class HostService { @@ -13,7 +15,7 @@ export class HostService { private participantId: string, callback: (hostId: string) => void, ) { - const roomName = 'host-service:' + config.get('roomName'); + const roomName = `host-service:${config.get('roomName')}`; const { realtime, room } = createRoom(roomName); this.realtime = realtime; @@ -29,7 +31,8 @@ export class HostService { /** * @function destroy - * @description Destroy the HostService instance. Make sure that no state is preserved, and the room is disconnected. + * @description Destroy the HostService instance. Make sure that no state is preserved, + * and the room is disconnected. * @returns {void} */ public destroy(): void { @@ -83,7 +86,7 @@ export class HostService { return; } - const hostId = events[events.length - 1].data.hostId; + const { hostId } = events[events.length - 1].data; if (!hostId) { this.updateHost(participants); return; @@ -130,7 +133,9 @@ export class HostService { /** * @function setOldestAsHost - * @description Traverse through participants list and set the oldest one as the host. If the oldest is the current participant, set it as the host in the room. Otherwise, only set locally + * @description Traverse through participants list and set the oldest one as the host + * If the oldest is the current participant, set it as the host in the room. Otherwise, + * only set locally * @param data */ private setOldestAsHost = (data: PresenceEvent[]): void => { @@ -153,7 +158,7 @@ export class HostService { */ private setHostInRoom(hostId: string): void { this.room.emit('state', { - hostId: hostId, + hostId, }); } diff --git a/packages/yjs/src/services/index.ts b/packages/yjs/src/services/index.ts index 914f98b..20c2be7 100644 --- a/packages/yjs/src/services/index.ts +++ b/packages/yjs/src/services/index.ts @@ -1 +1,4 @@ -export * from "./awareness"; +export { Awareness } from './awareness'; +export { config } from './config'; +export { HostService } from './host'; +export { Logger } from './logger'; diff --git a/packages/yjs/tsconfig.lint.json b/packages/yjs/tsconfig.lint.json index 0cd2844..97c5f7a 100644 --- a/packages/yjs/tsconfig.lint.json +++ b/packages/yjs/tsconfig.lint.json @@ -3,6 +3,6 @@ "compilerOptions": { "outDir": "dist" }, - "include": ["src", "turbo"], + "include": ["src", "turbo", "__mocks__"], "exclude": ["node_modules", "dist"] } From 457bf1df007387bcfad5802b6b8ab488e59d4d74 Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Thu, 26 Sep 2024 22:52:08 -0300 Subject: [PATCH 17/76] feat: create room through ioc --- packages/yjs/package.json | 1 + .../yjs/src/common/utils/createRoom.test.ts | 9 -- packages/yjs/src/common/utils/createRoom.ts | 30 ---- packages/yjs/src/provider/index.test.ts | 136 ++++++++++++++--- packages/yjs/src/provider/index.ts | 142 +++++++++++------- packages/yjs/src/provider/types.ts | 18 ++- .../yjs/src/services/awareness/index.test.ts | 2 +- packages/yjs/src/services/awareness/index.ts | 10 +- packages/yjs/src/services/host/index.ts | 13 +- .../yjs/src/services/logger/index.test.ts | 6 +- packages/yjs/src/services/logger/index.ts | 7 +- packages/yjs/tsconfig.lint.json | 2 +- 12 files changed, 236 insertions(+), 140 deletions(-) delete mode 100644 packages/yjs/src/common/utils/createRoom.test.ts delete mode 100644 packages/yjs/src/common/utils/createRoom.ts diff --git a/packages/yjs/package.json b/packages/yjs/package.json index a50ecfb..dda1e7c 100644 --- a/packages/yjs/package.json +++ b/packages/yjs/package.json @@ -30,6 +30,7 @@ "@superviz/eslint-config": "workspace:*", "@superviz/socket-client": "workspace:*", "@superviz/typescript-config": "workspace:*", + "@superviz/sdk": "workspace:*", "debug": "^4.3.7", "esbuild": "^0.23.1", "lib0": "^0.2.97", diff --git a/packages/yjs/src/common/utils/createRoom.test.ts b/packages/yjs/src/common/utils/createRoom.test.ts deleted file mode 100644 index 27821ce..0000000 --- a/packages/yjs/src/common/utils/createRoom.test.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { createRoom } from './createRoom'; - -describe('createRoom', () => { - test('should return realtime instance and room instance', () => { - const { realtime, room } = createRoom('test-room'); - expect(realtime).toBeDefined(); - expect(room).toBeDefined(); - }); -}); diff --git a/packages/yjs/src/common/utils/createRoom.ts b/packages/yjs/src/common/utils/createRoom.ts deleted file mode 100644 index 892ad88..0000000 --- a/packages/yjs/src/common/utils/createRoom.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { Realtime, Room } from '@superviz/socket-client'; - -import { config } from '../../services/config'; - -/** - * @function createRoom - * @description Establishes a connection with a real-time room with the given name - * @param roomName The last part of the name of the room. Comes after 'yjs:' in the room name - * @returns {{ realtime: Realtime, room: Room }} An object containing the realtime - * instance and the room instance - */ -export function createRoom(roomName: string): { - realtime: Realtime; - room: Room; -} { - const realtime = new Realtime( - config.get('apiKey'), - config.get('environment'), - config.get('participant'), - '', - '', - ); - - const room = realtime.connect(`yjs:${roomName}`); - - return { - realtime, - room, - }; -} diff --git a/packages/yjs/src/provider/index.test.ts b/packages/yjs/src/provider/index.test.ts index e0687ca..2aff148 100644 --- a/packages/yjs/src/provider/index.test.ts +++ b/packages/yjs/src/provider/index.test.ts @@ -11,7 +11,7 @@ import { SuperVizYjsProvider } from '.'; function createProvider(connect: boolean = true, debug: boolean = false, room: string = '') { const doc = new Y.Doc(); - return new SuperVizYjsProvider(doc, { + const provider = new SuperVizYjsProvider(doc, { apiKey: '123', environment: 'dev', participant: { @@ -22,6 +22,10 @@ function createProvider(connect: boolean = true, debug: boolean = false, room: s debug, room, }); + + provider['connect'](); + + return provider; } describe('provider', () => { @@ -32,13 +36,6 @@ describe('provider', () => { }); describe('start', () => { - test('should connect the provider', () => { - const spy = jest.spyOn(SuperVizYjsProvider.prototype, 'connect'); - createProvider(); - - expect(spy).toHaveBeenCalled(); - }); - test('should set config', () => { createProvider(); @@ -57,13 +54,6 @@ describe('provider', () => { expect(config.get('roomName')).toEqual('room-name'); }); - test('should not connect if connect is false', () => { - const spy = jest.spyOn(SuperVizYjsProvider.prototype, 'connect'); - createProvider(false); - - expect(spy).not.toHaveBeenCalled(); - }); - test('should disable debug if debug is false', () => { const spy = jest.spyOn(debug, 'disable'); createProvider(false, false); @@ -72,6 +62,88 @@ describe('provider', () => { }); }); + describe('attach', () => { + afterAll(() => { + jest.useRealTimers(); + }); + + test('should connect the provider', () => { + const provider = createProvider(); + provider['connect'] = jest.fn(); + + provider.attach({ + useStore: () => ({ + isDomainWhitelisted: { value: true }, + hasJoinedRoom: { value: true }, + }), + } as any); + + expect(provider['connect']).toHaveBeenCalled(); + }); + + test('should not connect if domain is not whitelisted', () => { + const provider = createProvider(); + provider['connect'] = jest.fn(); + + provider.attach({ + useStore: () => ({ + isDomainWhitelisted: { value: false }, + hasJoinedRoom: { value: true }, + }), + } as any); + + expect(provider['connect']).not.toHaveBeenCalled(); + }); + + test('should not connect if user has not joined room', () => { + const provider = createProvider(); + provider['connect'] = jest.fn(); + + provider.attach({ + useStore: () => ({ + isDomainWhitelisted: { value: true }, + hasJoinedRoom: { value: false }, + }), + } as any); + + expect(provider['connect']).not.toHaveBeenCalled(); + }); + + test('should try to rettach if user has not joined room', () => { + jest.useFakeTimers(); + const provider = createProvider(); + provider['connect'] = jest.fn(); + + const value = { + value: false, + }; + provider.attach({ + useStore: () => ({ + isDomainWhitelisted: { value: true }, + hasJoinedRoom: value, + }), + } as any); + + expect(provider['connect']).not.toHaveBeenCalled(); + value.value = true; + jest.advanceTimersByTime(2000); + + expect(provider['connect']).toHaveBeenCalled(); + }); + + test('should throw error if param has undefined', () => { + const provider = createProvider(); + + expect(() => provider.attach({ store: undefined } as any)).toThrow(); + }); + + test('should throw error if param has null', () => { + const provider = createProvider(); + + expect(() => provider.attach({ store: null } as any)).toThrow(); + }); + }); + describe('destroy', () => { test('should destroy services', () => { const provider = createProvider(); @@ -83,7 +155,7 @@ describe('provider', () => { const realtimeSpy = jest.spyOn(provider['realtime']!, 'destroy'); const hostServiceSpy = jest.spyOn(provider['hostService']!, 'destroy'); - provider.destroy(); + provider['destroyProvider'](); expect(awarenessSpy).toHaveBeenCalled(); expect(realtimeSpy).toHaveBeenCalled(); @@ -101,7 +173,7 @@ describe('provider', () => { const disconnectSpy = jest.spyOn(provider['room']!, 'disconnect'); - provider.destroy(); + provider['destroyProvider'](); expect(disconnectSpy).toHaveBeenCalled(); expect(provider['room']).toBeNull(); @@ -114,7 +186,7 @@ describe('provider', () => { }); const offSpy = jest.spyOn(provider['doc'], 'off'); - provider.destroy(); + provider['destroyProvider'](); expect(offSpy).toHaveBeenCalled(); expect(MOCK_ROOM.off).toHaveBeenCalledTimes(4); @@ -135,8 +207,8 @@ describe('provider', () => { jest.clearAllMocks(); - provider.destroy(); - provider.destroy(); + provider['destroyProvider'](); + provider['destroyProvider'](); expect(awarenessSpy).toHaveBeenCalledTimes(1); expect(realtimeSpy).toHaveBeenCalledTimes(1); @@ -154,7 +226,7 @@ describe('provider', () => { const onSpy = jest.spyOn(provider['doc'], 'on'); const startSpy = jest.spyOn(provider as any, 'startRealtime'); - provider.connect(); + provider['connect'](); expect(onSpy).toHaveBeenCalled(); expect(startSpy).toHaveBeenCalled(); @@ -167,7 +239,7 @@ describe('provider', () => { const onSpy = jest.spyOn(provider['doc'], 'on'); const startSpy = jest.spyOn(provider as any, 'startRealtime'); - provider.connect(); + provider['connect'](); expect(onSpy).not.toHaveBeenCalled(); expect(startSpy).not.toHaveBeenCalled(); @@ -496,4 +568,24 @@ describe('provider', () => { ]); }); }); + + describe('detach', () => { + test('should destroy provider', () => { + const provider = createProvider(); + provider['destroyProvider'] = jest.fn(); + provider['isAttached'] = true; + provider.detach(); + + expect(provider['destroyProvider']).toHaveBeenCalled(); + }); + + test('should do nothing if provider is not attached', () => { + const provider = createProvider(); + provider['destroyProvider'] = jest.fn(); + provider['isAttached'] = false; + provider.detach(); + + expect(provider['destroyProvider']).not.toHaveBeenCalled(); + }); + }); }); diff --git a/packages/yjs/src/provider/index.ts b/packages/yjs/src/provider/index.ts index 6129a4d..70e4417 100644 --- a/packages/yjs/src/provider/index.ts +++ b/packages/yjs/src/provider/index.ts @@ -1,16 +1,16 @@ +import { Participant } from '@superviz/sdk'; +import type { DefaultAttachComponentOptions } from '@superviz/sdk/dist/components/base/types'; +import type { IOC } from '@superviz/sdk/dist/services/io'; import { ClientState, ConnectionState, PresenceEvent, PresenceEvents, - Realtime, type SocketEvent, } from '@superviz/socket-client'; -import debug from 'debug'; import { ObservableV2 } from 'lib0/observable'; import * as Y from 'yjs'; -import { createRoom } from '../common/utils/createRoom'; import { Awareness, HostService, Logger, config } from '../services'; import { @@ -23,18 +23,24 @@ import { ProviderEvents, ProviderState, RealtimeRoom, + storeType, + ComponentLifeCycleEvent, } from './types'; export class SuperVizYjsProvider extends ObservableV2 { + public readonly name = 'yjsProvider'; + public awareness: Awareness; public document: Y.Doc; private _synced: boolean = false; private state: ProviderState | `${ProviderState}` = ProviderState.DISCONNECTED; + private isAttached: boolean = false; + private localParticipant: Participant | null = null; - private realtime: Realtime | null = null; private room: RealtimeRoom | null = null; private logger: Logger; + private ioc: IOC | null = null; private hostService: HostService | null = null; @@ -43,20 +49,60 @@ export class SuperVizYjsProvider extends ObservableV2 { private opts: Params, ) { super(); - this.setConfig(); this.document = doc; - this.logger = new Logger('SuperVizYjsProvider'); - this.awareness = new Awareness(this.doc, this.opts.participant.id, this.logger); + this.logger = new Logger('SuperVizYjsProvider', '[SuperViz | YjsProvider] - '); + this.awareness = new Awareness(this.doc, this.logger); + } + + // #region Public methods + /** + * @function attach + */ + public attach(params: DefaultAttachComponentOptions): void { + if (Object.values(params).includes(null) || Object.values(params).includes(undefined)) { + const message = `${this.name} @ attach - params are required`; + + this.logger.log(message); + throw new Error(message); + } - if (!this.opts.debug) debug.disable(); + const { useStore, ioc } = params; + const { isDomainWhitelisted, hasJoinedRoom, localParticipant } = useStore(storeType.GLOBAL); - if (!this.opts.connect) return; + if (!isDomainWhitelisted.value) { + const message = `Component ${this.name} can't be used because this website's domain is not whitelisted. Please add your domain in https://dashboard.superviz.com/developer`; + this.logger.log(message); + return; + } + if (!hasJoinedRoom.value) { + this.logger.log(`${this.name} @ attach - not joined yet`); + setTimeout(() => { + this.logger.log(`${this.name} @ attach - retrying`); + this.attach(params); + }, 1000); + return; + } + + this.ioc = ioc; + this.localParticipant = localParticipant.value; + this.isAttached = true; this.connect(); } - // #region Public methods + public detach() { + if (!this.isAttached) { + this.logger.log(`${this.name} @ detach - component is not attached`); + return; + } + + this.emit(ComponentLifeCycleEvent.UNMOUNT, []); + this.logger.log('detached'); + this.destroyProvider(); + super.destroy(); + } + /** * @function connect * @description Connect to the room. With this, start to send and @@ -68,10 +114,10 @@ export class SuperVizYjsProvider extends ObservableV2 { * @emits state * @returns {void} */ - public connect(): void { + private connect(): void { if (this.state !== ProviderState.DISCONNECTED) return; - this.logger.log('[SuperViz | YjsProvider] - Connecting to the room'); + this.logger.log('Connecting to the room'); this.changeState(ProviderState.CONNECTING); @@ -84,23 +130,25 @@ export class SuperVizYjsProvider extends ObservableV2 { * @description Disconnect from the room and reset the instance state. * @emits state @returns {void} */ - public destroy(): void { - if (this.state === ProviderState.DISCONNECTED) return; - this.logger.log('[SuperViz | YjsProvider] - Destroying the provider'); + private destroyProvider(): void { + if (this.state === ProviderState.DISCONNECTED) { + this.logger.log("Can't destroy. Provider disconnected"); + return; + } + + this.logger.log('Destroying the provider'); this.emit('destroy', []); this._synced = false; this.awareness?.destroy(); - this.realtime?.destroy(); this.hostService?.destroy(); // we do not set awareness to null because in // case of a reconnect, it is only ever instantiated // in the constructor this.hostService = null; - this.realtime = null; this.doc.off('updateV2', this.onDocUpdate); @@ -129,11 +177,9 @@ export class SuperVizYjsProvider extends ObservableV2 { * @returns {void} */ private createRoom(): void { - this.logger.log('[SuperViz | YjsProvider] - Creating room'); + this.logger.log('Creating room'); - const { realtime, room } = createRoom(`yjs:${config.get('roomName')}`); - this.realtime = realtime; - this.room = room; + this.room = this.ioc.createRoom('yjs-provider'); } /** @@ -142,11 +188,11 @@ export class SuperVizYjsProvider extends ObservableV2 { * @returns {void} */ private addRoomListeners(): void { - this.logger.log('[SuperViz | YjsProvider] - Adding room listeners'); + this.logger.log('Adding room listeners'); this.room.on(ProviderEvents.UPDATE, this.onRemoteDocUpdate); this.room.presence.on(PresenceEvents.JOINED_ROOM, this.onLocalJoinRoom); - this.realtime.connection.on(this.onConnectionChange); + this.ioc.client.connection.on(this.onConnectionChange); } /** @@ -155,7 +201,7 @@ export class SuperVizYjsProvider extends ObservableV2 { * @returns {void} */ private removeRoomListeners(): void { - this.logger.log('[SuperViz | YjsProvider] - Removing room listeners'); + this.logger.log('Removing room listeners'); if (this.room) { this.room.off(ProviderEvents.UPDATE, this.onRemoteDocUpdate); @@ -164,7 +210,7 @@ export class SuperVizYjsProvider extends ObservableV2 { this.room.presence.off(PresenceEvents.JOINED_ROOM); } - this.realtime?.connection.off(); + this.ioc?.client.connection.off(); } /** @@ -174,7 +220,7 @@ export class SuperVizYjsProvider extends ObservableV2 { */ private startRealtime(): void { this.createRoom(); - this.hostService = new HostService(this.opts.participant.id, this.onHostChange); + this.hostService = new HostService(this.ioc, this.localParticipant.id, this.onHostChange); this.addRoomListeners(); } @@ -184,7 +230,7 @@ export class SuperVizYjsProvider extends ObservableV2 { * @returns {void} */ private fetch = (): void => { - this.logger.log('[SuperViz | YjsProvider] - Fetching the document'); + this.logger.log('Fetching the document'); this._synced = false; @@ -205,23 +251,11 @@ export class SuperVizYjsProvider extends ObservableV2 { * @returns {void} */ private updateDocument = (update: Uint8Array): void => { - this.logger.log('[SuperViz | YjsProvider] - Applying remote update', update); + this.logger.log('Applying remote update', update); Y.applyUpdateV2(this.doc, update, this); }; - /** - * @function setConfig - * @description Set the configuration for the provider - * @returns {void} - */ - private setConfig(): void { - config.set('apiKey', this.opts.apiKey); - config.set('environment', this.opts.environment); - config.set('participant', this.opts.participant); - config.set('roomName', this.opts.room || 'sv-provider'); - } - /** * @function changeState * @description Change the state of the provider @@ -229,7 +263,7 @@ export class SuperVizYjsProvider extends ObservableV2 { * @returns {void} */ private changeState(state: ProviderState | `${ProviderState}`): void { - this.logger.log('[SuperViz | YjsProvider] - Changing state', state); + this.logger.log('Changing state', state); this.emit('state', [state]); this.state = state; @@ -248,7 +282,7 @@ export class SuperVizYjsProvider extends ObservableV2 { private onMessageToHost = (event: SocketEvent): void => { if (!this.hostService.isHost) return; - this.logger.log('[SuperViz | YjsProvider] - Received message to host', event); + this.logger.log('Received message to host', event); this._synced = false; @@ -272,7 +306,7 @@ export class SuperVizYjsProvider extends ObservableV2 { * @returns {void} */ private onDocUpdate = (update: Uint8Array): void => { - this.logger.log('[SuperViz | YjsProvider] - Local document update', update); + this.logger.log('Local document update', update); this.beforeSendRealtimeMessage(ProviderEvents.UPDATE, { update }); this.room!.emit(ProviderEvents.UPDATE, { update }); @@ -285,11 +319,11 @@ export class SuperVizYjsProvider extends ObservableV2 { * @returns {void} */ private onLocalJoinRoom = (event: PresenceEvent): void => { - if (this.state === ProviderState.CONNECTED || event.id !== this.opts.participant.id) return; + if (this.state === ProviderState.CONNECTED || event.id !== this.localParticipant.id) return; - this.logger.log('[SuperViz | YjsProvider] - Joined the room', event); + this.logger.log('Joined the room', event); - this.awareness.connect(this.room!); + this.awareness.connect(this.localParticipant.id, this.room!); this.changeState(ProviderState.CONNECTED); this.emit('connect', []); @@ -307,7 +341,7 @@ export class SuperVizYjsProvider extends ObservableV2 { */ private onConnectionChange = (msg: ConnectionState): void => { if (msg.state === ClientState.DISCONNECTED) { - this.logger.log('[SuperViz | YjsProvider] - Disconnected from the room'); + this.logger.log('Disconnected from the room'); this.emit('disconnect', []); } }; @@ -319,8 +353,8 @@ export class SuperVizYjsProvider extends ObservableV2 { * @returns {void} */ private onRemoteDocUpdate = (event: SocketEvent): void => { - if (event.presence?.id === this.opts.participant.id) return; - this.logger.log('[SuperViz | YjsProvider] - Received remote document update', event); + if (event.presence?.id === this.localParticipant.id) return; + this.logger.log('Received remote document update', event); const update = new Uint8Array(event.data.update); this.onReceiveRealtimeMessage(ProviderEvents.UPDATE, { update }); @@ -337,7 +371,7 @@ export class SuperVizYjsProvider extends ObservableV2 { */ private onBroadcast = (event: SocketEvent): void => { if (this.hostService?.isHost) return; - this.logger.log('[SuperViz | YjsProvider] - Received broadcast', event); + this.logger.log('Received broadcast', event); const update = new Uint8Array(event.data.update); this.onReceiveRealtimeMessage(ProviderEvents.BROADCAST, { update }); @@ -357,9 +391,9 @@ export class SuperVizYjsProvider extends ObservableV2 { * @returns {void} */ private onHostChange = (hostId: string): void => { - this.logger.log('[SuperViz | YjsProvider] - Host changed', hostId); + this.logger.log('Host changed', hostId); - if (hostId === this.opts.participant.id) { + if (hostId === this.localParticipant.id) { this._synced = true; return; } @@ -376,7 +410,7 @@ export class SuperVizYjsProvider extends ObservableV2 { * @returns {void} */ private onReceiveRealtimeMessage: Emitter = (name, data): void => { - this.logger.log('[SuperViz | YjsProvider] - Received message from room', { name, data }); + this.logger.log('Received message from room', { name, data }); this.emit('message', [{ name, data } as Message]); }; @@ -388,7 +422,7 @@ export class SuperVizYjsProvider extends ObservableV2 { * @returns {void} */ private beforeSendRealtimeMessage: Emitter = (name, data): void => { - this.logger.log('[SuperViz | YjsProvider] - Sending message to room', { name, data }); + this.logger.log('Sending message to room', { name, data }); this.emit('outgoingMessage', [{ name, data } as Message]); }; } diff --git a/packages/yjs/src/provider/types.ts b/packages/yjs/src/provider/types.ts index bd5a8cf..55ac4d4 100644 --- a/packages/yjs/src/provider/types.ts +++ b/packages/yjs/src/provider/types.ts @@ -1,3 +1,4 @@ +import type { StoreType } from '@superviz/sdk'; import type { Room } from '@superviz/socket-client'; export enum EnvironmentTypes { @@ -11,12 +12,6 @@ export interface Participant { } export type Params = { - apiKey: string; - environment: EnvironmentTypes | `${EnvironmentTypes}`; - participant: Participant; - room?: string; - connect?: boolean; - debug?: boolean; // awareness?: boolean = true; }; @@ -62,6 +57,17 @@ export type Events = { message: MessageCallback; outgoingMessage: MessageCallback; state: (state: ProviderState | `${ProviderState}`) => void; + mount: () => void; + unmount: () => void; }; export type RealtimeRoom = Omit & { emit: Emitter }; + +export const storeType = { + GLOBAL: 'global-store' as StoreType.GLOBAL, +}; + +export enum ComponentLifeCycleEvent { + MOUNT = 'mount', + UNMOUNT = 'unmount', +} diff --git a/packages/yjs/src/services/awareness/index.test.ts b/packages/yjs/src/services/awareness/index.test.ts index 9cfec3d..9c2801b 100644 --- a/packages/yjs/src/services/awareness/index.test.ts +++ b/packages/yjs/src/services/awareness/index.test.ts @@ -13,7 +13,7 @@ import { Awareness } from '.'; function createAwareness(): Awareness { const doc = new Y.Doc(); const participantId = 'local-participant-id'; - const logger = new Logger('awareness test'); + const logger = new Logger('awareness test', '[SuperVizYjsProvider | Tests] -'); return new Awareness(doc, participantId, logger); } diff --git a/packages/yjs/src/services/awareness/index.ts b/packages/yjs/src/services/awareness/index.ts index 4a5cc77..97c6301 100644 --- a/packages/yjs/src/services/awareness/index.ts +++ b/packages/yjs/src/services/awareness/index.ts @@ -21,10 +21,10 @@ export class Awareness extends ObservableV2 { private readonly YJS_STATE = '__yjs'; private previousState: any | null = null; + private participantId: string = ''; constructor( public doc: Y.Doc, - private participantId: string, private logger: Logger, ) { super(); @@ -37,8 +37,9 @@ export class Awareness extends ObservableV2 { * @param {RealtimeRoom} room Main room in which it will propagete presence * @returns {void} */ - public connect(room: RealtimeRoom): void { + public connect(participantId: string, room: RealtimeRoom): void { this.logger.log('[SuperViz | Awareness] - Connect awareness to room'); + this.participantId = participantId; this.room = room; this.addRoomListeners(); @@ -55,6 +56,9 @@ export class Awareness extends ObservableV2 { public destroy(): void { this.logger.log('[SuperViz | Awareness] - Destroy awareness'); + this.setLocalState(null); + this.removeAwarenessStates(Array.from(this.states.keys()), UpdateOrigin.LOCAL); + clearTimeout(this.visibilityTimeout); this.visibilityTimeout = undefined; @@ -175,7 +179,7 @@ export class Awareness extends ObservableV2 { this.states.delete(clientId); this.emit('update', [update, UpdateOrigin.PRESENCE]); - this.emit('update', [update, UpdateOrigin.PRESENCE]); + this.emit('change', [update, UpdateOrigin.PRESENCE]); }; private onUpdate = (event: PresenceEvent): void => { diff --git a/packages/yjs/src/services/host/index.ts b/packages/yjs/src/services/host/index.ts index 832746c..b663d51 100644 --- a/packages/yjs/src/services/host/index.ts +++ b/packages/yjs/src/services/host/index.ts @@ -1,24 +1,20 @@ -import { PresenceEvent, Realtime, Room, SocketEvent } from '@superviz/socket-client'; - -import { createRoom } from '../../common/utils/createRoom'; -import { config } from '../config'; +import type { IOC } from '@superviz/sdk/dist/services/io'; +import { PresenceEvent, Room, SocketEvent } from '@superviz/socket-client'; import { RoomEvent } from './types'; export class HostService { private _hostId: string = ''; private room: Room; - private realtime: Realtime; private callback: (hostId: string) => void; constructor( + ioc: IOC, private participantId: string, callback: (hostId: string) => void, ) { - const roomName = `host-service:${config.get('roomName')}`; - const { realtime, room } = createRoom(roomName); + const room = ioc.createRoom('yjs-host-service'); - this.realtime = realtime; this.room = room; this.callback = callback; @@ -43,7 +39,6 @@ export class HostService { this.room.off('state', this.onStateChange); this.room.disconnect(); - this.realtime.destroy(); } // #region getters diff --git a/packages/yjs/src/services/logger/index.test.ts b/packages/yjs/src/services/logger/index.test.ts index 4323e77..f0caabc 100644 --- a/packages/yjs/src/services/logger/index.test.ts +++ b/packages/yjs/src/services/logger/index.test.ts @@ -11,7 +11,7 @@ describe('Logger', () => { beforeEach(() => { mockDebug = jest.fn() as unknown as jest.MockedFunction; (debug as jest.MockedFunction).mockReturnValue(mockDebug); - debugInstance = new Logger('@superviz/sdk'); + debugInstance = new Logger('[SuperVizYjsProvider]', 'tests'); }); afterEach(() => { @@ -23,11 +23,11 @@ describe('Logger', () => { }); test('should call debug with the correct scope on initialization', () => { - expect(debug).toHaveBeenCalledWith('@superviz/sdk'); + expect(debug).toHaveBeenCalledWith('[SuperVizYjsProvider]'); }); test('should call debug with the correct arguments on log', () => { debugInstance.log('test-message', 123, { foo: 'bar' }); - expect(mockDebug).toHaveBeenCalledWith('test-message', 123, { foo: 'bar' }); + expect(mockDebug).toHaveBeenCalledWith('tests -', 'test-message', 123, { foo: 'bar' }); }); }); diff --git a/packages/yjs/src/services/logger/index.ts b/packages/yjs/src/services/logger/index.ts index fd229cd..85cd44c 100644 --- a/packages/yjs/src/services/logger/index.ts +++ b/packages/yjs/src/services/logger/index.ts @@ -5,11 +5,14 @@ export type Message = string | Error | number | Object; export class Logger { private debug: debug.Debugger; - constructor(scope: string) { + constructor( + scope: string, + private prefix: string, + ) { this.debug = debug(scope); } log(formatter: Message, ...args: Array) { - this.debug(formatter, ...args); + this.debug(`${this.prefix} -`, formatter, ...args); } } diff --git a/packages/yjs/tsconfig.lint.json b/packages/yjs/tsconfig.lint.json index 97c5f7a..0809d9e 100644 --- a/packages/yjs/tsconfig.lint.json +++ b/packages/yjs/tsconfig.lint.json @@ -3,6 +3,6 @@ "compilerOptions": { "outDir": "dist" }, - "include": ["src", "turbo", "__mocks__"], + "include": ["src", "turbo", "__mocks__", "./jest*"], "exclude": ["node_modules", "dist"] } From 41f1657e69f3f8c6c3a3174c5099a37f9e2a9670 Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Thu, 26 Sep 2024 22:54:22 -0300 Subject: [PATCH 18/76] type: add yjsProvider to component names enum --- packages/sdk/src/components/types.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/sdk/src/components/types.ts b/packages/sdk/src/components/types.ts index 075d20d..2366aa4 100644 --- a/packages/sdk/src/components/types.ts +++ b/packages/sdk/src/components/types.ts @@ -11,6 +11,7 @@ export enum ComponentNames { COMMENTS_AUTODESK = 'comments3dAutodesk', COMMENTS_THREEJS = 'comments3dThreejs', FORM_ELEMENTS = 'formElements', + YJS_PROVIDER = 'yjsProvider', } export enum PresenceMap { From 3cfa9c77b6399f6debe2a5fba85dd46ceed6a9ce Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Fri, 27 Sep 2024 00:04:30 -0300 Subject: [PATCH 19/76] tests(yjs): unit tests for implementation of rooms through ioc --- packages/yjs/src/provider/index.test.ts | 49 ++++-------- packages/yjs/src/provider/index.ts | 4 +- .../yjs/src/services/awareness/index.test.ts | 43 +++++------ .../yjs/src/services/config/index.test.ts | 29 -------- packages/yjs/src/services/config/index.ts | 28 ------- packages/yjs/src/services/config/types.ts | 8 -- packages/yjs/src/services/host/index.test.ts | 74 +++++++++++-------- packages/yjs/src/services/index.ts | 1 - 8 files changed, 82 insertions(+), 154 deletions(-) delete mode 100644 packages/yjs/src/services/config/index.test.ts delete mode 100644 packages/yjs/src/services/config/index.ts delete mode 100644 packages/yjs/src/services/config/types.ts diff --git a/packages/yjs/src/provider/index.test.ts b/packages/yjs/src/provider/index.test.ts index 2aff148..238c334 100644 --- a/packages/yjs/src/provider/index.test.ts +++ b/packages/yjs/src/provider/index.test.ts @@ -1,9 +1,8 @@ +import { Participant } from '@superviz/sdk'; import type { PresenceEvent, SocketEvent } from '@superviz/socket-client'; -import debug from 'debug'; import * as Y from 'yjs'; -import { MOCK_ROOM } from '../../__mocks__/io.mock'; -import { config } from '../services'; +import { MOCK_IO, MOCK_ROOM } from '../../__mocks__/io.mock'; import { DocUpdate, MessageToHost } from './types'; @@ -22,6 +21,15 @@ function createProvider(connect: boolean = true, debug: boolean = false, room: s debug, room, }); + provider['localParticipant'] = { + id: 'local-participant-id', + } as Participant; + provider['ioc'] = { + client: new MOCK_IO.Realtime('123', 'dev', {}, 'secret', 'clientId'), + createRoom() { + return this.client.connect(); + }, + } as any; provider['connect'](); @@ -35,33 +43,6 @@ describe('provider', () => { jest.restoreAllMocks(); }); - describe('start', () => { - test('should set config', () => { - createProvider(); - - expect(config.get('apiKey')).toEqual('123'); - expect(config.get('environment')).toEqual('dev'); - expect(config.get('participant')).toEqual({ - id: 'local-participant-id', - name: 'Provider Test', - }); - expect(config.get('roomName')).toEqual('sv-provider'); - }); - - test('should set room name', () => { - createProvider(true, true, 'room-name'); - - expect(config.get('roomName')).toEqual('room-name'); - }); - - test('should disable debug if debug is false', () => { - const spy = jest.spyOn(debug, 'disable'); - createProvider(false, false); - - expect(spy).toHaveBeenCalled(); - }); - }); - describe('attach', () => { afterAll(() => { jest.useRealTimers(); @@ -75,6 +56,7 @@ describe('provider', () => { useStore: () => ({ isDomainWhitelisted: { value: true }, hasJoinedRoom: { value: true }, + localParticipant: { value: { id: 'local-participant-id' } }, }), } as any); @@ -121,6 +103,7 @@ describe('provider', () => { useStore: () => ({ isDomainWhitelisted: { value: true }, hasJoinedRoom: value, + localParticipant: { value: { id: 'local-participant-id' } }, }), } as any); @@ -152,17 +135,14 @@ describe('provider', () => { }); const awarenessSpy = jest.spyOn(provider['awareness'], 'destroy'); - const realtimeSpy = jest.spyOn(provider['realtime']!, 'destroy'); const hostServiceSpy = jest.spyOn(provider['hostService']!, 'destroy'); provider['destroyProvider'](); expect(awarenessSpy).toHaveBeenCalled(); - expect(realtimeSpy).toHaveBeenCalled(); expect(hostServiceSpy).toHaveBeenCalled(); expect(provider['hostService']).toBeNull(); - expect(provider['realtime']).toBeNull(); }); test('should disconnect from room', () => { @@ -200,7 +180,6 @@ describe('provider', () => { }); const awarenessSpy = jest.spyOn(provider['awareness'], 'destroy'); - const realtimeSpy = jest.spyOn(provider['realtime']!, 'destroy'); const hostServiceSpy = jest.spyOn(provider['hostService']!, 'destroy'); const offSpy = jest.spyOn(provider['doc'], 'off'); const disconnectSpy = jest.spyOn(provider['room']!, 'disconnect'); @@ -211,7 +190,6 @@ describe('provider', () => { provider['destroyProvider'](); expect(awarenessSpy).toHaveBeenCalledTimes(1); - expect(realtimeSpy).toHaveBeenCalledTimes(1); expect(hostServiceSpy).toHaveBeenCalledTimes(1); expect(offSpy).toHaveBeenCalledTimes(1); expect(disconnectSpy).toHaveBeenCalledTimes(2); @@ -264,7 +242,6 @@ describe('provider', () => { const provider = createProvider(); provider['createRoom'](); - expect(provider['realtime']).toBeDefined(); expect(provider['room']).toBeDefined(); }); }); diff --git a/packages/yjs/src/provider/index.ts b/packages/yjs/src/provider/index.ts index 70e4417..8f0901e 100644 --- a/packages/yjs/src/provider/index.ts +++ b/packages/yjs/src/provider/index.ts @@ -11,7 +11,7 @@ import { import { ObservableV2 } from 'lib0/observable'; import * as Y from 'yjs'; -import { Awareness, HostService, Logger, config } from '../services'; +import { Awareness, HostService, Logger } from '../services'; import { DocUpdate, @@ -28,7 +28,7 @@ import { } from './types'; export class SuperVizYjsProvider extends ObservableV2 { - public readonly name = 'yjsProvider'; + public readonly name = 'presence'; public awareness: Awareness; public document: Y.Doc; diff --git a/packages/yjs/src/services/awareness/index.test.ts b/packages/yjs/src/services/awareness/index.test.ts index 9c2801b..d6bae3b 100644 --- a/packages/yjs/src/services/awareness/index.test.ts +++ b/packages/yjs/src/services/awareness/index.test.ts @@ -2,8 +2,7 @@ import { beforeAll } from '@jest/globals'; import type { PresenceEvent } from '@superviz/socket-client'; import * as Y from 'yjs'; -import { MOCK_ROOM, mockPresenceListOnce } from '../../../__mocks__/io.mock'; -import { createRoom } from '../../common/utils/createRoom'; +import { MOCK_ROOM, MOCK_IO, mockPresenceListOnce } from '../../../__mocks__/io.mock'; import { Logger } from '../logger'; import { UpdateOrigin, UpdatePresence } from './types'; @@ -12,9 +11,15 @@ import { Awareness } from '.'; function createAwareness(): Awareness { const doc = new Y.Doc(); - const participantId = 'local-participant-id'; const logger = new Logger('awareness test', '[SuperVizYjsProvider | Tests] -'); - return new Awareness(doc, participantId, logger); + return new Awareness(doc, logger); +} +const participantId = 'local-participant-id'; + +function connectAwareness(awareness: Awareness) { + const room = new MOCK_IO.Realtime('api-key', 'dev', {}, 'secret', 'clientId').connect(); + + awareness.connect(participantId, room); } describe('Awareness', () => { @@ -26,10 +31,8 @@ describe('Awareness', () => { describe('connect', () => { test('should subscribe to events', () => { const awareness = createAwareness(); - const { room } = createRoom('awareness-test'); const documentSpy = jest.spyOn(document, 'addEventListener'); - - awareness.connect(room); + connectAwareness(awareness); expect(awareness['room']!.presence.on).toHaveBeenCalledTimes(2); expect(documentSpy).toHaveBeenCalledTimes(1); @@ -39,10 +42,9 @@ describe('Awareness', () => { describe('destroy', () => { test('should unsubscribe from events', () => { const awareness = createAwareness(); - const { room } = createRoom('awareness-test'); const documentSpy = jest.spyOn(document, 'removeEventListener'); - awareness.connect(room); + connectAwareness(awareness); awareness.destroy(); expect(MOCK_ROOM.presence.off).toHaveBeenCalledTimes(2); @@ -51,9 +53,8 @@ describe('Awareness', () => { test('should clear states', () => { const awareness = createAwareness(); - const { room } = createRoom('awareness-test'); - awareness.connect(room); + connectAwareness(awareness); awareness.destroy(); expect(awareness['states'].size).toBe(0); @@ -61,9 +62,8 @@ describe('Awareness', () => { test('should clear participantIdToClientId', () => { const awareness = createAwareness(); - const { room } = createRoom('awareness-test'); - awareness.connect(room); + connectAwareness(awareness); awareness.destroy(); expect(awareness['participantIdToClientId'].size).toBe(0); @@ -71,10 +71,9 @@ describe('Awareness', () => { test('should call onLeave', () => { const awareness = createAwareness(); - const { room } = createRoom('awareness-test'); const onLeaveSpy = jest.spyOn(awareness as any, 'onLeave'); - awareness.connect(room); + connectAwareness(awareness); awareness.destroy(); expect(onLeaveSpy).toHaveBeenCalledTimes(1); @@ -280,6 +279,8 @@ describe('Awareness', () => { test('should not set state if it comes from local participant', () => { const awareness = createAwareness(); + connectAwareness(awareness); + awareness['states'].set = jest.fn(); awareness['onUpdate']({ @@ -393,8 +394,8 @@ describe('Awareness', () => { test('should update own presence in the room with the client id', () => { const awareness = createAwareness(); - const { room } = createRoom('awareness-test'); - awareness.connect(room); + const room = new MOCK_IO.Realtime('api-key', 'dev', {}, 'secret', 'clientId').connect(); + awareness.connect(participantId, room); mockPresenceListOnce([{ id: 'local-participant-id', data: { clientId: 1 } }]); @@ -410,8 +411,8 @@ describe('Awareness', () => { test('should set the state and map the id of participants', () => { const awareness = createAwareness(); - const { room } = createRoom('awareness-test'); - awareness.connect(room); + const room = new MOCK_IO.Realtime('api-key', 'dev', {}, 'secret', 'clientId').connect(); + awareness.connect(participantId, room); awareness['states'].set = jest.fn(); @@ -439,8 +440,8 @@ describe('Awareness', () => { test('should not set state and map if the presence has no clientId', () => { const awareness = createAwareness(); - const { room } = createRoom('awareness-test'); - awareness.connect(room); + const room = new MOCK_IO.Realtime('api-key', 'dev', {}, 'secret', 'clientId').connect(); + awareness.connect(participantId, room); awareness['states'].set = jest.fn(); diff --git a/packages/yjs/src/services/config/index.test.ts b/packages/yjs/src/services/config/index.test.ts deleted file mode 100644 index 9130613..0000000 --- a/packages/yjs/src/services/config/index.test.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { config } from '.'; - -describe('config', () => { - test('should set config field based on key', () => { - config.set('apiKey', '123'); - config.set('environment', 'dev'); - config.set('participant', { id: '123', name: 'John' }); - config.set('roomName', 'room1'); - - expect(config['config']).toEqual({ - apiKey: '123', - environment: 'dev', - participant: { id: '123', name: 'John' }, - roomName: 'room1', - }); - }); - - test('should get config field based on key', () => { - config.set('apiKey', '123'); - config.set('environment', 'dev'); - config.set('participant', { id: '123', name: 'John' }); - config.set('roomName', 'room1'); - - expect(config.get('apiKey')).toBe('123'); - expect(config.get('environment')).toBe('dev'); - expect(config.get('participant')).toEqual({ id: '123', name: 'John' }); - expect(config.get('roomName')).toBe('room1'); - }); -}); diff --git a/packages/yjs/src/services/config/index.ts b/packages/yjs/src/services/config/index.ts deleted file mode 100644 index 95e9dbb..0000000 --- a/packages/yjs/src/services/config/index.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { EnvironmentTypes } from '../../provider/types'; - -import { ConfigurationInterface } from './types'; - -class Config { - private config: ConfigurationInterface = { - apiKey: '', - participant: { - id: '', - name: '', - }, - environment: '' as EnvironmentTypes, - roomName: '', - }; - - public set( - key: T, - value: ConfigurationInterface[T], - ): void { - this.config[key] = value; - } - - public get(key: T): ConfigurationInterface[T] { - return this.config[key]; - } -} - -export const config = new Config(); diff --git a/packages/yjs/src/services/config/types.ts b/packages/yjs/src/services/config/types.ts deleted file mode 100644 index 71e7bb8..0000000 --- a/packages/yjs/src/services/config/types.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { EnvironmentTypes, Participant } from '../../provider/types'; - -export interface ConfigurationInterface { - apiKey: string; - participant: Participant; - environment: EnvironmentTypes | `${EnvironmentTypes}`; - roomName: string | undefined; -} diff --git a/packages/yjs/src/services/host/index.test.ts b/packages/yjs/src/services/host/index.test.ts index 260a4ae..251bccd 100644 --- a/packages/yjs/src/services/host/index.test.ts +++ b/packages/yjs/src/services/host/index.test.ts @@ -1,11 +1,28 @@ import { PresenceEvent, SocketEvent } from '@superviz/socket-client'; -import { MOCK_ROOM, mockRoomHistoryOnce, mockPresenceListOnce } from '../../../__mocks__/io.mock'; +import { + MOCK_ROOM, + mockRoomHistoryOnce, + mockPresenceListOnce, + MOCK_IO, +} from '../../../__mocks__/io.mock'; import { RoomEvent } from './types'; import { HostService } from '.'; +function createHostService(callback?: () => void) { + return new HostService( + { + createRoom() { + return new MOCK_IO.Realtime('apiKey', 'dev', {}, 'secret', 'clientId').connect(); + }, + } as any, + 'participantId', + callback ?? (() => {}), + ); +} + describe('HostService', () => { beforeEach(() => { jest.clearAllMocks(); @@ -13,17 +30,17 @@ describe('HostService', () => { describe('start', () => { test('should create a new HostService instance', () => { - const hostService = new HostService('participantId', () => {}); + const hostService = createHostService(); expect(hostService).toBeInstanceOf(HostService); }); test('should connect to host room', () => { - const hostService = new HostService('participantId', () => {}); + const hostService = createHostService(); expect(hostService['room']).toEqual(MOCK_ROOM); }); test('should subscribe to room events', () => { - const hostService = new HostService('participantId', () => {}); + const hostService = createHostService(); expect(MOCK_ROOM.presence.on).toHaveBeenCalledTimes(2); expect(MOCK_ROOM.presence.on).toHaveBeenCalledWith( 'presence.leave', @@ -40,7 +57,7 @@ describe('HostService', () => { describe('destroy', () => { test('should destroy the HostService instance', () => { - const hostService = new HostService('participantId', () => {}); + const hostService = createHostService(); hostService.destroy(); expect(MOCK_ROOM.presence.off).toHaveBeenCalledTimes(2); @@ -50,24 +67,23 @@ describe('HostService', () => { expect(MOCK_ROOM.off).toHaveBeenCalledWith('state', hostService['onStateChange']); expect(MOCK_ROOM.disconnect).toHaveBeenCalledTimes(1); expect(MOCK_ROOM.presence.off).toHaveBeenCalledTimes(2); - expect(hostService!['realtime']['destroy']).toHaveBeenCalledTimes(1); }); }); describe('getters', () => { test('should return isHost', () => { - const ids = ['id1', 'ids2']; - const participantId = ids[Math.floor(Math.random() * 2)]; + const ids = ['id1', 'ids2', 'local-participant-id']; + const participantId = 'local-participant-id'; const hostId = ids[Math.floor(Math.random() * 2)]; - const hostService = new HostService(participantId, () => {}); + const hostService = createHostService(); hostService['_hostId'] = hostId; expect(hostService.isHost).toBe(hostId === participantId); }); test('should return hostId', () => { - const hostService = new HostService('participantId', () => {}); + const hostService = createHostService(); const hostId = Math.floor(Math.random() * 100000); hostService['_hostId'] = String(hostId); @@ -77,7 +93,7 @@ describe('HostService', () => { describe('searchHost', () => { test('should update host if the room has no history', () => { - const hostService = new HostService('participantId', () => {}); + const hostService = createHostService(); hostService['updateHost'] = jest.fn(); mockRoomHistoryOnce([]); @@ -88,7 +104,7 @@ describe('HostService', () => { }); test('should early return if there is already a host', () => { - const hostService = new HostService('participantId', () => {}); + const hostService = createHostService(); hostService['_hostId'] = 'hostId'; hostService['updateHost'] = jest.fn(); @@ -106,7 +122,7 @@ describe('HostService', () => { }); test("should set the participant as the host if it's alone in in the room", () => { - const hostService = new HostService('participantId', () => {}); + const hostService = createHostService(); hostService['setHostInRoom'] = jest.fn(); mockRoomHistoryOnce([ @@ -127,7 +143,7 @@ describe('HostService', () => { }); test('should update host if there is no hostId in the room history', () => { - const hostService = new HostService('participantId', () => {}); + const hostService = createHostService(); hostService['updateHost'] = jest.fn(); mockRoomHistoryOnce([ @@ -150,7 +166,7 @@ describe('HostService', () => { }); test('should update host if the hostId is not in the participants list', () => { - const hostService = new HostService('participantId', () => {}); + const hostService = createHostService(); hostService['updateHost'] = jest.fn(); mockRoomHistoryOnce([ @@ -175,7 +191,7 @@ describe('HostService', () => { }); test('should set hostId found in the room history', () => { - const hostService = new HostService('participantId', () => {}); + const hostService = createHostService(); hostService['setHostId'] = jest.fn(); mockRoomHistoryOnce([ @@ -201,7 +217,7 @@ describe('HostService', () => { describe('setHostId', () => { test('should set the hostId and call the callback', () => { const callback = jest.fn(); - const hostService = new HostService('participantId', callback); + const hostService = createHostService(callback); hostService['setHostId']('hostId'); @@ -212,7 +228,7 @@ describe('HostService', () => { describe('updateHost', () => { test('should set the oldest in the room with data coming from presence', () => { - const hostService = new HostService('participantId', () => {}); + const hostService = createHostService(); hostService['setOldestAsHost'] = jest.fn(); const participants = [ @@ -232,7 +248,7 @@ describe('HostService', () => { }); test('should set the oldest in the room with data passed as argument', () => { - const hostService = new HostService('participantId', () => {}); + const hostService = createHostService(); hostService['setOldestAsHost'] = jest.fn(); const participants = [ @@ -253,7 +269,7 @@ describe('HostService', () => { describe('setOldestAsHost', () => { test('should set local participant as host in the room if it is the oldest', () => { - const hostService = new HostService('participantId', () => {}); + const hostService = createHostService(); hostService['setHostInRoom'] = jest.fn(); hostService['setOldestAsHost']([ @@ -276,7 +292,7 @@ describe('HostService', () => { }); test('should set remote participant as host locally if it is the oldest', () => { - const hostService = new HostService('participantId', () => {}); + const hostService = createHostService(); hostService['setHostId'] = jest.fn(); hostService['setOldestAsHost']([ @@ -300,7 +316,7 @@ describe('HostService', () => { describe('setHostInRoom', () => { test('should emit the hostId to the room', () => { - const hostService = new HostService('participantId', () => {}); + const hostService = createHostService(); hostService['setHostInRoom']('hostId'); @@ -315,7 +331,7 @@ describe('HostService', () => { describe('room callbacks', () => { describe('onPresenceLeave', () => { test('should update host if the host leaves the room', () => { - const hostService = new HostService('participantId', () => {}); + const hostService = createHostService(); hostService['_hostId'] = 'hostId'; hostService['updateHost'] = jest.fn(); @@ -328,7 +344,7 @@ describe('HostService', () => { }); test('should do nothing if the host does not leave the room', () => { - const hostService = new HostService('participantId', () => {}); + const hostService = createHostService(); hostService['_hostId'] = 'hostId'; hostService['updateHost'] = jest.fn(); @@ -343,7 +359,7 @@ describe('HostService', () => { describe('onStateChange', () => { test('should set host if the hostId changes', () => { - const hostService = new HostService('participantId', () => {}); + const hostService = createHostService(); hostService['setHostId'] = jest.fn(); hostService['onStateChange']({ @@ -356,7 +372,7 @@ describe('HostService', () => { }); test('should do nothing if the hostId does not change', () => { - const hostService = new HostService('participantId', () => {}); + const hostService = createHostService(); hostService['setHostId'] = jest.fn(); hostService['_hostId'] = 'hostId'; @@ -372,7 +388,7 @@ describe('HostService', () => { describe('onPresenceEnter', () => { test('should search for the host if the participant when local participant enters the room', () => { - const hostService = new HostService('participantId', () => {}); + const hostService = createHostService(); hostService['searchHost'] = jest.fn(); hostService['onPresenceEnter']({ @@ -383,7 +399,7 @@ describe('HostService', () => { }); test('should do nothing when host is already set', () => { - const hostService = new HostService('participantId', () => {}); + const hostService = createHostService(); hostService['_hostId'] = 'hostId'; hostService['searchHost'] = jest.fn(); @@ -395,7 +411,7 @@ describe('HostService', () => { }); test('should do nothing when others enter room', () => { - const hostService = new HostService('participantId', () => {}); + const hostService = createHostService(); hostService['searchHost'] = jest.fn(); hostService['onPresenceEnter']({ diff --git a/packages/yjs/src/services/index.ts b/packages/yjs/src/services/index.ts index 20c2be7..89208f0 100644 --- a/packages/yjs/src/services/index.ts +++ b/packages/yjs/src/services/index.ts @@ -1,4 +1,3 @@ export { Awareness } from './awareness'; -export { config } from './config'; export { HostService } from './host'; export { Logger } from './logger'; From 00c55f0e502893b4e935858a26957391820ecb18 Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Sat, 28 Sep 2024 15:11:09 -0300 Subject: [PATCH 20/76] fix: reset observers in base component so the component cna be reattached --- packages/sdk/src/components/base/index.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/sdk/src/components/base/index.ts b/packages/sdk/src/components/base/index.ts index 6d72e47..34cbc1f 100644 --- a/packages/sdk/src/components/base/index.ts +++ b/packages/sdk/src/components/base/index.ts @@ -68,6 +68,8 @@ export abstract class BaseComponent extends Observable { this.logger.log(`${this.name} @ attached`); + this.observers = {}; + this.start(); this.publish(ComponentLifeCycleEvent.MOUNT); }; From 103e27df071aefd0247361767f7ec2bd36f14560 Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Sat, 28 Sep 2024 15:14:46 -0300 Subject: [PATCH 21/76] fix: mark yjs as external in build --- packages/yjs/.esbuild/build.js | 8 ++++---- packages/yjs/.esbuild/config.js | 32 +++++++++++++++++--------------- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/packages/yjs/.esbuild/build.js b/packages/yjs/.esbuild/build.js index 230e87a..faedf5a 100644 --- a/packages/yjs/.esbuild/build.js +++ b/packages/yjs/.esbuild/build.js @@ -1,16 +1,16 @@ -import { cjsConfig, esmConfig } from "./config.js"; -import esbuild from "esbuild"; +import { cjsConfig, esmConfig } from './config.js'; +import esbuild from 'esbuild'; (async () => { try { await Promise.all([ esbuild.build({ ...cjsConfig, - outfile: "dist/index.cjs.js", + outfile: 'dist/index.cjs.js', }), esbuild.build({ ...esmConfig, - outdir: "dist", + outdir: 'dist', }), ]); } catch (error) { diff --git a/packages/yjs/.esbuild/config.js b/packages/yjs/.esbuild/config.js index 68a0996..7c5212f 100644 --- a/packages/yjs/.esbuild/config.js +++ b/packages/yjs/.esbuild/config.js @@ -1,32 +1,34 @@ const config = { loader: { - ".png": "file", - ".svg": "file", - ".woff": "file", - ".woff2": "file", - ".eot": "file", - ".ttf": "file", + '.png': 'file', + '.svg': 'file', + '.woff': 'file', + '.woff2': 'file', + '.eot': 'file', + '.ttf': 'file', }, bundle: true, color: true, - minify: true, - logLevel: "info", - chunkNames: "chunks/[name]-[hash]", + minify: false, + logLevel: 'info', + chunkNames: 'chunks/[name]-[hash]', + external: ['yjs'], }; export const esmConfig = { ...config, - entryPoints: ["src/index.ts"], + entryPoints: ['src/index.ts'], bundle: true, splitting: true, - target: "es6", - format: "esm", + target: 'es6', + format: 'esm', }; export const cjsConfig = { ...config, - entryPoints: ["src/index.ts"], + entryPoints: ['src/index.ts'], bundle: true, - platform: "node", - target: ["node16"], + platform: 'node', + format: 'cjs', + target: ['node16'], }; From 0600c64db84e290f7dc57e52a1e587d7069fb1b1 Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Sat, 28 Sep 2024 15:19:13 -0300 Subject: [PATCH 22/76] feat: wio yjs demo --- apps/playground/package.json | 6 + apps/playground/src/pages/yjs-monaco-wio.tsx | 116 +++++++++++++++++++ apps/playground/src/router/router.tsx | 8 +- apps/playground/src/styles/yjs.css | 27 +++++ apps/playground/tailwind.config.js | 32 ++++- pnpm-lock.yaml | 107 +++++++++++++++-- turbo.json | 18 ++- 7 files changed, 296 insertions(+), 18 deletions(-) create mode 100644 apps/playground/src/pages/yjs-monaco-wio.tsx create mode 100644 apps/playground/src/styles/yjs.css diff --git a/apps/playground/package.json b/apps/playground/package.json index 9d0276f..35d1cb5 100644 --- a/apps/playground/package.json +++ b/apps/playground/package.json @@ -10,6 +10,7 @@ "preview": "vite preview" }, "dependencies": { + "@monaco-editor/react": "^4.6.0", "@superviz/autodesk-viewer-plugin": "workspace:*", "@superviz/matterport-plugin": "workspace:*", "@superviz/realtime": "workspace:*", @@ -17,7 +18,9 @@ "@superviz/threejs-plugin": "workspace:*", "@superviz/yjs": "workspace:*", "@types/three": "^0.167.1", + "lib0": "^0.2.97", "lodash": "^4.17.21", + "monaco-editor": "^0.51.0", "react": "^18.3.1", "react-dom": "^18.3.1", "react-helmet-async": "^2.0.5", @@ -25,6 +28,9 @@ "three": "0.167.1", "three-mesh-bvh": "^0.7.8", "uuid": "^10.0.0", + "y-monaco": "^0.1.6", + "y-protocols": "^1.0.6", + "yjs": "^13.3.1", "zod": "^3.23.8" }, "devDependencies": { diff --git a/apps/playground/src/pages/yjs-monaco-wio.tsx b/apps/playground/src/pages/yjs-monaco-wio.tsx new file mode 100644 index 0000000..786c9db --- /dev/null +++ b/apps/playground/src/pages/yjs-monaco-wio.tsx @@ -0,0 +1,116 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import * as Y from "yjs"; +import { SuperVizYjsProvider } from "@superviz/yjs"; + +import { MonacoBinding } from "y-monaco"; +import "../styles/yjs.css"; +import Room, { LauncherFacade, WhoIsOnline } from "@superviz/sdk"; +import { useCallback, useEffect, useMemo, useRef, useState } from "react"; +import Editor from "@monaco-editor/react"; + +const id = Math.floor(Math.random() * 1000000); +export function YjsWithMonaco() { + const ydoc = useMemo(() => new Y.Doc(), []); + const [editor, setEditor] = useState(null); + + const provider = useRef(new SuperVizYjsProvider(ydoc)); + const wio = useRef(new WhoIsOnline()); + + const loaded = useRef(false); + const [room, setRoom] = useState(null); + + const [joinedRoom, setJoinedRoom] = useState(false); + + useEffect(() => { + if (loaded.current) return; + loaded.current = true; + + (async () => { + if (room) return; + + setRoom( + await Room("90xbxrp4tra3hrkbw5y1sq7sw5cj9v", { + group: { + id: "yjs-monaco", + name: "Yjs Monaco", + }, + participant: { + id: `ian-yjs-${id}`, + name: `Ian Yjs ${id}`, + }, + roomId: "yjs-monaco", + environment: "dev", + debug: true, + }) + ); + })(); + + return () => { + room?.destroy(); + }; + }, [room]); + + const joinRoom = useCallback(() => { + if (joinedRoom || !room) return; + setJoinedRoom(true); + + room.addComponent(provider.current); + room.addComponent(wio.current); + }, [room, joinedRoom]); + + const leaveRoom = useCallback(() => { + if (!joinedRoom || !room) return; + setJoinedRoom(false); + + room.removeComponent(wio.current); + room.removeComponent(provider.current); + }, [room, joinedRoom]); + + // this effect manages the lifetime of the editor binding + useEffect(() => { + if (!provider || editor == null) { + return; + } + + const binding = new MonacoBinding( + ydoc.getText("monaco"), + editor.getModel()!, + new Set([editor]), + provider.current.awareness + ); + return () => { + binding.destroy(); + }; + }, [ydoc, provider, editor]); + + return ( +
+
+ + +
+
+ { + setEditor(editor); + }} + theme="vs-dark" + /> +
+
+ ); +} diff --git a/apps/playground/src/router/router.tsx b/apps/playground/src/router/router.tsx index 75a6145..c515873 100644 --- a/apps/playground/src/router/router.tsx +++ b/apps/playground/src/router/router.tsx @@ -15,6 +15,7 @@ import { MatterportWithWioCommentsAndVideo } from "../pages/matterport-with-wio- import { Video } from "../pages/video.tsx"; import { Three } from "../pages/three.tsx"; import { PointersCanvas } from "../pages/pointers-canvas.tsx"; +import { YjsWithMonaco } from "../pages/yjs-monaco-wio.tsx"; export const routeList: RouteObject[] = [ { @@ -80,8 +81,13 @@ export const routeList: RouteObject[] = [ path: "pointers-canvas", element: , }, + { + path: "yjs-with-monaco", + element: , + }, ], }, ]; -export const router: ReturnType = createBrowserRouter(routeList); +export const router: ReturnType = + createBrowserRouter(routeList); diff --git a/apps/playground/src/styles/yjs.css b/apps/playground/src/styles/yjs.css new file mode 100644 index 0000000..a54bc4d --- /dev/null +++ b/apps/playground/src/styles/yjs.css @@ -0,0 +1,27 @@ +#monaco-editor { + width: 100%; + height: 600px; + border: 1px solid #ccc; +} + +.yRemoteSelection { + background-color: rgb(250, 129, 0, 0.5); +} + +.yRemoteSelectionHead { + position: absolute; + border-left: orange solid 2px; + border-top: orange solid 2px; + border-bottom: orange solid 2px; + height: 100%; + box-sizing: border-box; +} + +.yRemoteSelectionHead::after { + position: absolute; + content: " "; + border: 3px solid orange; + border-radius: 4px; + left: -4px; + top: -5px; +} diff --git a/apps/playground/tailwind.config.js b/apps/playground/tailwind.config.js index 89a305e..667e5dc 100644 --- a/apps/playground/tailwind.config.js +++ b/apps/playground/tailwind.config.js @@ -1,11 +1,31 @@ /** @type {import('tailwindcss').Config} */ export default { - content: [ - "./index.html", - "./src/**/*.{js,ts,jsx,tsx}", - ], + content: ["./index.html", "./src/**/*.{js,ts,jsx,tsx}"], theme: { - extend: {}, + extend: { + colors: { + sv: { + primary: "#ffffff", + secondary: "#c1fbdf", + danger: "#e5411e", + "primary-200": "#BAA9FF", + "primary-900": "#380788", + "gray-100": "#FAFAFC", + "gray-200": "#E9E5EF", + "gray-300": "#C9C4D1", + "gray-400": "#AEA9B8", + "gray-500": "#7E7A88", + "gray-600": "#57535F", + "gray-700": "#39363E", + "gray-800": "#26242A", + purple: "#6210cc", + neutral: "#aea9b8", + muted: "#f2f2f2", + gray: "#454545", + "light-purple": "#957aff", + }, + }, + }, }, plugins: [], -} \ No newline at end of file +}; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0669d3a..901f728 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -20,6 +20,9 @@ importers: apps/playground: dependencies: + '@monaco-editor/react': + specifier: ^4.6.0 + version: 4.6.0(monaco-editor@0.51.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@superviz/autodesk-viewer-plugin': specifier: workspace:* version: link:../../packages/autodesk @@ -35,12 +38,21 @@ importers: '@superviz/threejs-plugin': specifier: workspace:* version: link:../../packages/three + '@superviz/yjs': + specifier: workspace:* + version: link:../../packages/yjs '@types/three': specifier: ^0.167.1 version: 0.167.2 + lib0: + specifier: ^0.2.97 + version: 0.2.97 lodash: specifier: ^4.17.21 version: 4.17.21 + monaco-editor: + specifier: ^0.51.0 + version: 0.51.0 react: specifier: ^18.3.1 version: 18.3.1 @@ -62,6 +74,15 @@ importers: uuid: specifier: ^10.0.0 version: 10.0.0 + y-monaco: + specifier: ^0.1.6 + version: 0.1.6(monaco-editor@0.51.0)(yjs@13.6.19) + y-protocols: + specifier: ^1.0.6 + version: 1.0.6(yjs@13.6.19) + yjs: + specifier: ^13.3.1 + version: 13.6.19 zod: specifier: ^3.23.8 version: 3.23.8 @@ -581,15 +602,18 @@ importers: '@superviz/eslint-config': specifier: workspace:* version: link:../eslint-config + '@superviz/sdk': + specifier: workspace:* + version: link:../sdk '@superviz/socket-client': specifier: workspace:* version: link:../socket-client '@superviz/typescript-config': specifier: workspace:* version: link:../typescript-config - '@types/jest': - specifier: ^29.5.13 - version: 29.5.13 + debug: + specifier: ^4.3.7 + version: 4.3.7 esbuild: specifier: ^0.23.1 version: 0.23.1 @@ -602,6 +626,9 @@ importers: typescript: specifier: ^5.6.2 version: 5.6.2 + y-protocols: + specifier: ^1.0.6 + version: 1.0.6(yjs@13.6.19) yjs: specifier: ^13.3.1 version: 13.6.19 @@ -609,6 +636,9 @@ importers: '@jest/globals': specifier: ^29.7.0 version: 29.7.0 + '@types/jest': + specifier: ^29.5.13 + version: 29.5.13 concurrently: specifier: ^9.0.1 version: 9.0.1 @@ -618,6 +648,9 @@ importers: jest-environment-jsdom: specifier: ^29.7.0 version: 29.7.0 + jest-mock: + specifier: ^29.7.0 + version: 29.7.0 ts-jest: specifier: ^29.2.5 version: 29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(esbuild@0.23.1)(jest@29.7.0)(typescript@5.6.2) @@ -2009,6 +2042,18 @@ packages: '@mdn/browser-compat-data@4.2.1': resolution: {integrity: sha512-EWUguj2kd7ldmrF9F+vI5hUOralPd+sdsUnYbRy33vZTuZkduC1shE9TtEMEjAQwyfyMb4ole5KtjF8MsnQOlA==} + '@monaco-editor/loader@1.4.0': + resolution: {integrity: sha512-00ioBig0x642hytVspPl7DbQyaSWRaolYie/UFNjoTdvoKPzo6xrXLhTk9ixgIKcLH5b5vDOjVNiGyY+uDCUlg==} + peerDependencies: + monaco-editor: '>= 0.21.0 < 1' + + '@monaco-editor/react@4.6.0': + resolution: {integrity: sha512-RFkU9/i7cN2bsq/iTkurMWOEErmYcY6JiQI3Jn+WeR/FGISH8JbHERjpS9oRuSOPvDMJI0Z8nJeKkbOs9sBYQw==} + peerDependencies: + monaco-editor: '>= 0.25.0 < 1' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -5081,6 +5126,9 @@ packages: engines: {node: '>=10'} hasBin: true + monaco-editor@0.51.0: + resolution: {integrity: sha512-xaGwVV1fq343cM7aOYB6lVE4Ugf0UyimdD/x5PWcWBMKENwectaEu77FAN7c5sFiyumqeJdX1RPTh1ocioyDjw==} + moo-color@1.0.3: resolution: {integrity: sha512-i/+ZKXMDf6aqYtBhuOcej71YSlbjT3wCO/4H1j8rPvxDJEifdwgg5MaFyu6iYAT8GBZJg2z0dkgK4YMzvURALQ==} @@ -6013,6 +6061,9 @@ packages: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} + state-local@1.0.7: + resolution: {integrity: sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==} + statuses@1.5.0: resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} engines: {node: '>= 0.6'} @@ -6700,6 +6751,19 @@ packages: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} + y-monaco@0.1.6: + resolution: {integrity: sha512-sYRywMmcylt+Nupl+11AvizD2am06ST8lkVbUXuaEmrtV6Tf+TD4rsEm6u9YGGowYue+Vfg1IJ97SUP2J+PVXg==} + engines: {node: '>=12.0.0', npm: '>=6.0.0'} + peerDependencies: + monaco-editor: '>=0.20.0' + yjs: ^13.3.1 + + y-protocols@1.0.6: + resolution: {integrity: sha512-vHRF2L6iT3rwj1jub/K5tYcTT/mEYDUppgNPXwp8fmLpui9f7Yeq3OEtTLVF012j39QnV+KEQpNqoN7CWU7Y9Q==} + engines: {node: '>=16.0.0', npm: '>=8.0.0'} + peerDependencies: + yjs: ^13.0.0 + y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -8186,6 +8250,18 @@ snapshots: '@mdn/browser-compat-data@4.2.1': {} + '@monaco-editor/loader@1.4.0(monaco-editor@0.51.0)': + dependencies: + monaco-editor: 0.51.0 + state-local: 1.0.7 + + '@monaco-editor/react@4.6.0(monaco-editor@0.51.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@monaco-editor/loader': 1.4.0(monaco-editor@0.51.0) + monaco-editor: 0.51.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -8465,7 +8541,7 @@ snapshots: read-pkg: 9.0.1 registry-auth-token: 5.0.2 semantic-release: 24.0.0(typescript@5.6.2) - semver: 7.5.4 + semver: 7.6.3 tempy: 3.1.0 '@semantic-release/npm@12.0.1(semantic-release@24.1.1(typescript@5.6.2))': @@ -8482,7 +8558,7 @@ snapshots: read-pkg: 9.0.1 registry-auth-token: 5.0.2 semantic-release: 24.1.1(typescript@5.6.2) - semver: 7.5.4 + semver: 7.6.3 tempy: 3.1.0 '@semantic-release/release-notes-generator@14.0.1(semantic-release@24.0.0(typescript@5.6.2))': @@ -9869,7 +9945,7 @@ snapshots: conventional-commits-filter: 5.0.0 handlebars: 4.7.8 meow: 13.2.0 - semver: 7.5.4 + semver: 7.6.3 conventional-commit-types@3.0.0: {} @@ -12274,6 +12350,8 @@ snapshots: mkdirp@1.0.4: {} + monaco-editor@0.51.0: {} + moo-color@1.0.3: dependencies: color-name: 1.1.4 @@ -12324,7 +12402,7 @@ snapshots: normalize-package-data@6.0.2: dependencies: hosted-git-info: 7.0.2 - semver: 7.5.4 + semver: 7.6.3 validate-npm-package-license: 3.0.4 normalize-path@3.0.0: {} @@ -13051,7 +13129,7 @@ snapshots: semver-diff@4.0.0: dependencies: - semver: 7.5.4 + semver: 7.6.3 semver-regex@4.0.5: {} @@ -13219,6 +13297,8 @@ snapshots: dependencies: escape-string-regexp: 2.0.0 + state-local@1.0.7: {} + statuses@1.5.0: {} statuses@2.0.1: {} @@ -13887,6 +13967,17 @@ snapshots: xtend@4.0.2: {} + y-monaco@0.1.6(monaco-editor@0.51.0)(yjs@13.6.19): + dependencies: + lib0: 0.2.97 + monaco-editor: 0.51.0 + yjs: 13.6.19 + + y-protocols@1.0.6(yjs@13.6.19): + dependencies: + lib0: 0.2.97 + yjs: 13.6.19 + y18n@5.0.8: {} yallist@3.1.1: {} diff --git a/turbo.json b/turbo.json index 8b118ed..ec2e386 100644 --- a/turbo.json +++ b/turbo.json @@ -7,7 +7,7 @@ }, "test:unit": {}, "test:unit:watch": { - "cache": false, + "cache": false, "persistent": true }, "test:unit:coverage": { @@ -15,7 +15,7 @@ "persistent": true }, "test:unit:ci": { - "cache": false, + "cache": false, "persistent": true }, "test:unit:web-components": { @@ -26,7 +26,7 @@ "persistent": true }, "test:unit:web-components:coverage": { - "cache": false, + "cache": false, "persistent": false }, "watch": { @@ -76,6 +76,18 @@ }, "@superviz/sdk#test:unit:ci": { "dependsOn": ["@superviz/socket-client#build"] + }, + "@superviz/yjs#build": { + "dependsOn": ["@superviz/socket-client#build"] + }, + "@superviz/yjs#test:unit": { + "dependsOn": ["@superviz/socket-client#build"] + }, + "@superviz/yjs#test:unit:watch": { + "dependsOn": ["@superviz/socket-client#build"] + }, + "@superviz/yjs#test:unit:coverage": { + "dependsOn": ["@superviz/socket-client#build"] } } } From 1c1e4c4245c28a53b73321610e093fb10dd93a44 Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Sat, 28 Sep 2024 15:19:49 -0300 Subject: [PATCH 23/76] fix(socket-client): types before default in package json --- packages/socket-client/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/socket-client/package.json b/packages/socket-client/package.json index fb83723..2dfe459 100644 --- a/packages/socket-client/package.json +++ b/packages/socket-client/package.json @@ -9,8 +9,8 @@ ], "exports": { "node": "./dist/node/index.js", - "default": "./dist/browser/index.js", - "types": "./dist/index.d.ts" + "types": "./dist/index.d.ts", + "default": "./dist/browser/index.js" }, "scripts": { "build": "node ./.esbuild/build.js", From f4b0ddc290c85cb264e7df40efd9b8e1a923edb8 Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Sat, 28 Sep 2024 15:20:25 -0300 Subject: [PATCH 24/76] feat: optional awareness initialization --- packages/yjs/src/provider/index.ts | 4 +++- packages/yjs/src/provider/types.ts | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/yjs/src/provider/index.ts b/packages/yjs/src/provider/index.ts index 8f0901e..16e0d1f 100644 --- a/packages/yjs/src/provider/index.ts +++ b/packages/yjs/src/provider/index.ts @@ -46,12 +46,14 @@ export class SuperVizYjsProvider extends ObservableV2 { constructor( private doc: Y.Doc, - private opts: Params, + opts: Params = {}, ) { super(); this.document = doc; this.logger = new Logger('SuperVizYjsProvider', '[SuperViz | YjsProvider] - '); + + if (opts.awareness === false) return; this.awareness = new Awareness(this.doc, this.logger); } diff --git a/packages/yjs/src/provider/types.ts b/packages/yjs/src/provider/types.ts index 55ac4d4..621b417 100644 --- a/packages/yjs/src/provider/types.ts +++ b/packages/yjs/src/provider/types.ts @@ -12,7 +12,7 @@ export interface Participant { } export type Params = { - // awareness?: boolean = true; + awareness?: boolean; }; export enum ProviderState { From 3a73f575126b9509b6acc6c1d194550771a8cef6 Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Sat, 28 Sep 2024 15:22:13 -0300 Subject: [PATCH 25/76] refactor(yjs): rename clientId to clientID --- packages/yjs/src/services/awareness/index.ts | 89 ++++++++++---------- packages/yjs/src/services/awareness/types.ts | 2 +- 2 files changed, 47 insertions(+), 44 deletions(-) diff --git a/packages/yjs/src/services/awareness/index.ts b/packages/yjs/src/services/awareness/index.ts index 97c6301..ba380d1 100644 --- a/packages/yjs/src/services/awareness/index.ts +++ b/packages/yjs/src/services/awareness/index.ts @@ -8,10 +8,13 @@ import { Logger } from '../logger'; import { Events, UpdateOrigin, UpdatePresence } from './types'; export class Awareness extends ObservableV2 { - public clientId: number = 0; - public meta: Map = new Map(); + public clientID: number = 0; public states: Map = new Map(); + // Not used, but added because some bindings expect these fields + public _checkInterval: ReturnType | null = null; + public meta: Map = new Map(); + private participantIdToClientId: Map = new Map(); private room: RealtimeRoom | null = null; @@ -28,7 +31,7 @@ export class Awareness extends ObservableV2 { private logger: Logger, ) { super(); - this.clientId = this.doc.clientID; + this.clientID = this.doc.clientID; } /** @@ -80,10 +83,10 @@ export class Awareness extends ObservableV2 { public getLocalState(): Record | null { this.logger.log( '[SuperViz | Awareness] - Get local state', - this.states.get(this.clientId)?.[this.YJS_STATE], + this.states.get(this.clientID)?.[this.YJS_STATE], ); - const state = this.states.get(this.clientId); + const state = this.states.get(this.clientID); if (!state || !state[this.YJS_STATE]) return null; return state[this.YJS_STATE]; @@ -91,8 +94,8 @@ export class Awareness extends ObservableV2 { public getStates(): Map> { const states = new Map>(); - this.states.forEach((state, clientId) => { - states.set(clientId, state[this.YJS_STATE]); + this.states.forEach((state, clientID) => { + states.set(clientID, state[this.YJS_STATE]); }); this.logger.log('[SuperViz | Awareness] - Get states', states); @@ -103,30 +106,30 @@ export class Awareness extends ObservableV2 { this.logger.log('[SuperViz | Awareness] - Set local state', state); if (state === null) { - if (!this.states.has(this.clientId)) return; - this.states.delete(this.clientId); + if (!this.states.has(this.clientID)) return; + this.states.delete(this.clientID); this.room?.presence.update({ - ...this.states.get(this.clientId), + ...this.states.get(this.clientID), [this.YJS_STATE]: null, origin: 'set local state null', }); - const update = { added: [], updated: [], removed: [this.clientId] }; + const update = { added: [], updated: [], removed: [this.clientID] }; this.emit('change', [update, UpdateOrigin.LOCAL]); return; } const update = { added: [], updated: [], removed: [] }; - let oldState = this.states.get(this.clientId); + let oldState = this.states.get(this.clientID); if (oldState) { - update.updated.push(this.clientId); + update.updated.push(this.clientID); } else { - oldState = { [this.YJS_STATE]: {}, clientId: this.clientId }; - update.added.push(this.clientId); + oldState = { [this.YJS_STATE]: {}, clientID: this.clientID }; + update.added.push(this.clientID); } const newState = { ...oldState, [this.YJS_STATE]: state, origin: 'set local state' }; - this.states.set(this.clientId, newState); + this.states.set(this.clientID, newState); this.room?.presence.update(newState); this.emit('change', [update, UpdateOrigin.LOCAL]); @@ -163,20 +166,20 @@ export class Awareness extends ObservableV2 { // #region events callbacks private onLeave = (event: PresenceEvent): void => { - const clientId = this.participantIdToClientId.get(event.id); - this.logger.log('[SuperViz | Awareness] - Participant left', { participant: event, clientId }); + const clientID = this.participantIdToClientId.get(event.id); + this.logger.log('[SuperViz | Awareness] - Participant left', { participant: event, clientID }); - if (!clientId) return; + if (!clientID) return; - if (clientId === this.clientId) { + if (clientID === this.clientID) { const ids = Array.from(this.states.keys()); this.removeAwarenessStates(ids, UpdateOrigin.PRESENCE); return; } - const update = { added: [], updated: [], removed: [clientId] }; + const update = { added: [], updated: [], removed: [clientID] }; this.participantIdToClientId.delete(event.id); - this.states.delete(clientId); + this.states.delete(clientID); this.emit('update', [update, UpdateOrigin.PRESENCE]); this.emit('change', [update, UpdateOrigin.PRESENCE]); @@ -188,24 +191,24 @@ export class Awareness extends ObservableV2 { this.logger.log('[SuperViz | Awareness] - Participant updated', event); if (event.data[this.YJS_STATE] === null) { - this.removeAwarenessStates([event.data.clientId], UpdateOrigin.PRESENCE); + this.removeAwarenessStates([event.data.clientID], UpdateOrigin.PRESENCE); return; } const added: number[] = []; const updated: number[] = []; - let clientId = this.participantIdToClientId.get(event.id); + let clientID = this.participantIdToClientId.get(event.id); - if (clientId) { - updated.push(event.data.clientId); + if (clientID) { + updated.push(event.data.clientID); } else { - this.participantIdToClientId.set(event.id, event.data.clientId); - clientId = event.data.clientId; - added.push(event.data.clientId); + this.participantIdToClientId.set(event.id, event.data.clientID); + clientID = event.data.clientID; + added.push(event.data.clientID); } - this.states.set(clientId, { - ...(this.states.get(clientId) || {}), + this.states.set(clientID, { + ...(this.states.get(clientID) || {}), ...event.data, }); @@ -237,20 +240,20 @@ export class Awareness extends ObservableV2 { const added: number[] = []; presences.forEach((presence) => { - const { clientId } = presence.data; - if (!clientId) return; - added.push(clientId); - this.participantIdToClientId.set(presence.id, clientId); - this.states.set(clientId, { + const { clientID } = presence.data; + if (!clientID) return; + added.push(clientID); + this.participantIdToClientId.set(presence.id, clientID); + this.states.set(clientID, { ...presence.data, }); }); - const clientId = this.doc.clientID; + const { clientID } = this.doc; this.room.presence.update({ - clientId, + clientID, [this.YJS_STATE]: {}, - ...(this.states.get(clientId) || {}), + ...(this.states.get(clientID) || {}), origin: 'on connect', }); @@ -264,11 +267,11 @@ export class Awareness extends ObservableV2 { this.logger.log('[SuperViz | Awareness] - Remove awareness states', { removed, origin }); const update = { added: [], updated: [], removed: [] }; - removed.forEach((clientId) => { - if (!this.states.get(clientId)) return; + removed.forEach((clientID) => { + if (!this.states.get(clientID)) return; - this.states.delete(clientId); - update.removed.push(clientId); + this.states.delete(clientID); + update.removed.push(clientID); }); this.emit('change', [update, origin]); diff --git a/packages/yjs/src/services/awareness/types.ts b/packages/yjs/src/services/awareness/types.ts index 3e09fa5..74392ce 100644 --- a/packages/yjs/src/services/awareness/types.ts +++ b/packages/yjs/src/services/awareness/types.ts @@ -4,7 +4,7 @@ export enum UpdateOrigin { } export interface UpdatePresence { - clientId: number; + clientID: number; yjs_state: any; } From 6d94b1dcb7e623f6b472ce3dfcd93f925d6924fc Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Sat, 28 Sep 2024 18:22:50 -0300 Subject: [PATCH 26/76] feat(playground): finish monaco + yjs demo --- apps/playground/src/pages/yjs-monaco-wio.tsx | 124 +++++++++++++++---- apps/playground/src/styles/yjs.css | 22 ++-- 2 files changed, 117 insertions(+), 29 deletions(-) diff --git a/apps/playground/src/pages/yjs-monaco-wio.tsx b/apps/playground/src/pages/yjs-monaco-wio.tsx index 786c9db..4136f55 100644 --- a/apps/playground/src/pages/yjs-monaco-wio.tsx +++ b/apps/playground/src/pages/yjs-monaco-wio.tsx @@ -4,18 +4,57 @@ import { SuperVizYjsProvider } from "@superviz/yjs"; import { MonacoBinding } from "y-monaco"; import "../styles/yjs.css"; -import Room, { LauncherFacade, WhoIsOnline } from "@superviz/sdk"; +import Room, { + type LauncherFacade, + type Participant, + WhoIsOnline, +} from "@superviz/sdk"; import { useCallback, useEffect, useMemo, useRef, useState } from "react"; import Editor from "@monaco-editor/react"; const id = Math.floor(Math.random() * 1000000); + +function setStyles( + states: Map>, + ids: Set +): number[] { + const stylesheet = document.getElementById("sv-yjs-monaco"); + let styles = ""; + + const idsList = []; + for (const [id, state] of states) { + if (ids.has(id) || !state.participant) continue; + idsList.push(id); + + styles += ` + .yRemoteSelection-${id}, + .yRemoteSelectionHead-${id} { + --presence-color: ${state.participant.slot.color}; + } + + .yRemoteSelectionHead-${id}::after { + content: "${state.participant.name}"; + } + `; + } + + stylesheet!.innerText = styles; + + return idsList; +} + export function YjsWithMonaco() { const ydoc = useMemo(() => new Y.Doc(), []); const [editor, setEditor] = useState(null); + const [localParticipant, setLocalParticipant] = + useState>(); + const provider = useRef(new SuperVizYjsProvider(ydoc)); const wio = useRef(new WhoIsOnline()); + const [ids, setIds] = useState(new Set()); + const loaded = useRef(false); const [room, setRoom] = useState(null); @@ -28,21 +67,43 @@ export function YjsWithMonaco() { (async () => { if (room) return; - setRoom( - await Room("90xbxrp4tra3hrkbw5y1sq7sw5cj9v", { - group: { - id: "yjs-monaco", - name: "Yjs Monaco", - }, - participant: { - id: `ian-yjs-${id}`, - name: `Ian Yjs ${id}`, - }, - roomId: "yjs-monaco", - environment: "dev", - debug: true, - }) - ); + const newRoom = await Room("90xbxrp4tra3hrkbw5y1sq7sw5cj9v", { + group: { + id: "yjs-monaco", + name: "Yjs Monaco", + }, + participant: { + id: `ian-yjs-${id}`, + name: `Ian Yjs ${id}`, + }, + roomId: "yjs-monaco", + environment: "dev", + debug: true, + }); + + newRoom.subscribe("participant.updated", (data) => { + if (!data.slot?.index) return; + + provider.current.awareness.setLocalStateField("participant", { + id: data.id, + slot: data.slot, + name: data.name, + }); + + setLocalParticipant({ + id: data.id, + slot: data.slot, + name: data.name, + }); + + newRoom.unsubscribe("participant.updated"); + }); + + const style = document.createElement("style"); + style.id = "sv-yjs-monaco"; + document.head.appendChild(style); + + setRoom(newRoom); })(); return () => { @@ -54,9 +115,26 @@ export function YjsWithMonaco() { if (joinedRoom || !room) return; setJoinedRoom(true); + if (localParticipant) { + provider.current.awareness.setLocalStateField( + "participant", + localParticipant + ); + } + + const updateStyles = () => { + const states = provider.current.awareness.getStates(); + const idsList = setStyles(states, ids); + + setIds(new Set(idsList)); + }; + + provider.current.on("connect", updateStyles); + provider.current.awareness.on("update", updateStyles); + room.addComponent(provider.current); room.addComponent(wio.current); - }, [room, joinedRoom]); + }, [room, joinedRoom, setIds, ids, localParticipant]); const leaveRoom = useCallback(() => { if (!joinedRoom || !room) return; @@ -68,9 +146,7 @@ export function YjsWithMonaco() { // this effect manages the lifetime of the editor binding useEffect(() => { - if (!provider || editor == null) { - return; - } + if (!provider || editor == null) return; const binding = new MonacoBinding( ydoc.getText("monaco"), @@ -101,13 +177,19 @@ export function YjsWithMonaco() { Leave room -
+
+
{ setEditor(editor); }} + options={{ + padding: { + top: 32, + }, + }} theme="vs-dark" />
diff --git a/apps/playground/src/styles/yjs.css b/apps/playground/src/styles/yjs.css index a54bc4d..ec889a0 100644 --- a/apps/playground/src/styles/yjs.css +++ b/apps/playground/src/styles/yjs.css @@ -5,23 +5,29 @@ } .yRemoteSelection { - background-color: rgb(250, 129, 0, 0.5); + background-color: var(--presence-color); + opacity: 0.5; } .yRemoteSelectionHead { position: absolute; - border-left: orange solid 2px; - border-top: orange solid 2px; - border-bottom: orange solid 2px; - height: 100%; + background-color: var(--presence-color); + height: 200%; + bottom: 0; + width: 2px; box-sizing: border-box; } .yRemoteSelectionHead::after { position: absolute; content: " "; - border: 3px solid orange; + font-size: 10px; + padding: 2px; + font-family: sans-serif; + font-weight: bold; + background-color: var(--presence-color); border-radius: 4px; - left: -4px; - top: -5px; + left: 0px; + bottom: 60%; + opacity: 1; } From 4998d39daeda14778f900857a11f7c9b246d3d93 Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Sat, 28 Sep 2024 18:23:17 -0300 Subject: [PATCH 27/76] fix(yjs): make doc public --- packages/yjs/src/provider/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/yjs/src/provider/index.ts b/packages/yjs/src/provider/index.ts index 16e0d1f..db60f19 100644 --- a/packages/yjs/src/provider/index.ts +++ b/packages/yjs/src/provider/index.ts @@ -45,7 +45,7 @@ export class SuperVizYjsProvider extends ObservableV2 { private hostService: HostService | null = null; constructor( - private doc: Y.Doc, + public doc: Y.Doc, opts: Params = {}, ) { super(); From 066e1ef678a4280c2bf94198c9c8a6b3396bb6ff Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Sat, 28 Sep 2024 18:23:52 -0300 Subject: [PATCH 28/76] feat: improve typing when subscring to launcher events --- packages/sdk/src/core/launcher/index.ts | 22 +++++++++---------- packages/sdk/src/core/launcher/types.ts | 28 ++++++++++++++++++++++--- 2 files changed, 36 insertions(+), 14 deletions(-) diff --git a/packages/sdk/src/core/launcher/index.ts b/packages/sdk/src/core/launcher/index.ts index 8087837..5dc8336 100644 --- a/packages/sdk/src/core/launcher/index.ts +++ b/packages/sdk/src/core/launcher/index.ts @@ -2,7 +2,7 @@ import * as Socket from '@superviz/socket-client'; import { isEqual } from 'lodash'; import { ParticipantEvent } from '../../common/types/events.types'; -import { Participant, ParticipantType } from '../../common/types/participant.types'; +import { Participant } from '../../common/types/participant.types'; import { StoreType } from '../../common/types/stores.types'; import { Observable } from '../../common/utils'; import { Logger } from '../../common/utils/logger'; @@ -19,7 +19,7 @@ import { Presence3DManager } from '../../services/presence-3d-manager'; import { SlotService } from '../../services/slot'; import { useGlobalStore } from '../../services/stores'; -import { DefaultLauncher, LauncherFacade, LauncherOptions } from './types'; +import { DefaultLauncher, LauncherFacade, LauncherOptions, LauncherUnsubscribe } from './types'; export class Launcher extends Observable implements DefaultLauncher { protected readonly logger: Logger; @@ -267,7 +267,7 @@ export class Launcher extends Observable implements DefaultLauncher { this.destroy(); console.error( - `[SuperViz] Room cannot be initialized because this website's domain is not whitelisted. If you are the developer, please add your domain in https://dashboard.superviz.com/developer`, + "[SuperViz] Room cannot be initialized because this website's domain is not whitelisted. If you are the developer, please add your domain in https://dashboard.superviz.com/developer", ); }; @@ -352,7 +352,6 @@ export class Launcher extends Observable implements DefaultLauncher { if (state === IOCState.SAME_ACCOUNT_ERROR) { this.onSameAccount(); - return; } }; @@ -412,16 +411,17 @@ export class Launcher extends Observable implements DefaultLauncher { const { localParticipant } = useStore(StoreType.GLOBAL); if (localParticipant.value && presence.id === localParticipant.value.id) { - localParticipant.publish({ + const update = { ...localParticipant.value, ...presence.data, + }; + + localParticipant.publish({ + ...update, timestamp: presence.timestamp, } as Participant); - this.publish(ParticipantEvent.LOCAL_UPDATED, { - ...localParticipant.value, - ...presence.data, - }); + this.publish(ParticipantEvent.LOCAL_UPDATED, update); this.logger.log('Publishing ParticipantEvent.UPDATED', presence.data); } @@ -463,7 +463,7 @@ export default (options: LauncherOptions): LauncherFacade => { return { destroy: window.SUPERVIZ.destroy, subscribe: window.SUPERVIZ.subscribe, - unsubscribe: window.SUPERVIZ.unsubscribe, + unsubscribe: window.SUPERVIZ.unsubscribe as LauncherUnsubscribe, addComponent: window.SUPERVIZ.addComponent, removeComponent: window.SUPERVIZ.removeComponent, }; @@ -478,7 +478,7 @@ export default (options: LauncherOptions): LauncherFacade => { return { destroy: launcher.destroy, subscribe: launcher.subscribe, - unsubscribe: launcher.unsubscribe, + unsubscribe: launcher.unsubscribe as LauncherUnsubscribe, addComponent: launcher.addComponent, removeComponent: launcher.removeComponent, }; diff --git a/packages/sdk/src/core/launcher/types.ts b/packages/sdk/src/core/launcher/types.ts index 2a2edd1..6c6a570 100644 --- a/packages/sdk/src/core/launcher/types.ts +++ b/packages/sdk/src/core/launcher/types.ts @@ -1,15 +1,37 @@ +import { ParticipantEvent } from '../../common/types/events.types'; +import { type Participant } from '../../common/types/participant.types'; import { SuperVizSdkOptions } from '../../common/types/sdk-options.types'; import { Observable } from '../../common/utils'; -import { BaseComponent } from '../../components/base'; export interface DefaultLauncher {} +type Events = ParticipantEvent | `${ParticipantEvent}`; export interface LauncherOptions extends Omit {} +type LauncherSubscribe = { + (event: `${ParticipantEvent.SAME_ACCOUNT_ERROR}`, callback: () => void); + (event: `${ParticipantEvent.LOCAL_JOINED}`, callback: (participant: Participant) => void); + (event: `${ParticipantEvent.JOINED}`, callback: (participant: Participant) => void); + (event: `${ParticipantEvent.LOCAL_LEFT}`, callback: (participant: Participant) => void); + (event: `${ParticipantEvent.LEFT}`, callback: (participant: Participant) => void); + (event: `${ParticipantEvent.LIST_UPDATED}`, callback: (participant: Participant[]) => void); + (event: `${ParticipantEvent.LOCAL_UPDATED}`, callback: (participant: Participant) => void); +}; + +export type LauncherUnsubscribe = { + (event: `${ParticipantEvent.SAME_ACCOUNT_ERROR}`, callback?: () => void); + (event: `${ParticipantEvent.LOCAL_JOINED}`, callback?: (participant: Participant) => void); + (event: `${ParticipantEvent.JOINED}`, callback?: (participant: Participant) => void); + (event: `${ParticipantEvent.LOCAL_LEFT}`, callback?: (participant: Participant) => void); + (event: `${ParticipantEvent.LEFT}`, callback?: (participant: Participant) => void); + (event: `${ParticipantEvent.LIST_UPDATED}`, callback?: (participant: Participant[]) => void); + (event: `${ParticipantEvent.LOCAL_UPDATED}`, callback?: (participant: Participant) => void); +}; + export interface LauncherFacade { - subscribe: typeof Observable.prototype.subscribe; - unsubscribe: typeof Observable.prototype.unsubscribe; + subscribe: LauncherSubscribe; + unsubscribe: LauncherUnsubscribe; destroy: () => void; addComponent: (component: any) => void; removeComponent: (component: any) => void; From f51f1595fb51942b4d094b0fc44bbc9aae29fdf5 Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Sun, 29 Sep 2024 23:21:55 -0300 Subject: [PATCH 29/76] feat: change text color in user awareness --- apps/playground/src/pages/yjs-monaco-wio.tsx | 23 ++++++++++---------- apps/playground/src/styles/yjs.css | 3 ++- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/apps/playground/src/pages/yjs-monaco-wio.tsx b/apps/playground/src/pages/yjs-monaco-wio.tsx index 4136f55..54399bf 100644 --- a/apps/playground/src/pages/yjs-monaco-wio.tsx +++ b/apps/playground/src/pages/yjs-monaco-wio.tsx @@ -30,10 +30,11 @@ function setStyles( .yRemoteSelection-${id}, .yRemoteSelectionHead-${id} { --presence-color: ${state.participant.slot.color}; - } - - .yRemoteSelectionHead-${id}::after { - content: "${state.participant.name}"; + } + + .yRemoteSelectionHead-${id}:after { + content: "${state.participant.name}"; + --sv-text-color: ${state.participant.slot.textColor}; } `; } @@ -51,7 +52,7 @@ export function YjsWithMonaco() { useState>(); const provider = useRef(new SuperVizYjsProvider(ydoc)); - const wio = useRef(new WhoIsOnline()); + const wio = useRef(); const [ids, setIds] = useState(new Set()); @@ -64,6 +65,8 @@ export function YjsWithMonaco() { if (loaded.current) return; loaded.current = true; + wio.current = new WhoIsOnline(); + (async () => { if (room) return; @@ -84,7 +87,7 @@ export function YjsWithMonaco() { newRoom.subscribe("participant.updated", (data) => { if (!data.slot?.index) return; - provider.current.awareness.setLocalStateField("participant", { + provider.current.awareness?.setLocalStateField("participant", { id: data.id, slot: data.slot, name: data.name, @@ -95,8 +98,6 @@ export function YjsWithMonaco() { slot: data.slot, name: data.name, }); - - newRoom.unsubscribe("participant.updated"); }); const style = document.createElement("style"); @@ -116,21 +117,21 @@ export function YjsWithMonaco() { setJoinedRoom(true); if (localParticipant) { - provider.current.awareness.setLocalStateField( + provider.current.awareness?.setLocalStateField( "participant", localParticipant ); } const updateStyles = () => { - const states = provider.current.awareness.getStates(); + const states = provider.current.awareness?.getStates(); const idsList = setStyles(states, ids); setIds(new Set(idsList)); }; provider.current.on("connect", updateStyles); - provider.current.awareness.on("update", updateStyles); + provider.current.awareness?.on("update", updateStyles); room.addComponent(provider.current); room.addComponent(wio.current); diff --git a/apps/playground/src/styles/yjs.css b/apps/playground/src/styles/yjs.css index ec889a0..a9cab7c 100644 --- a/apps/playground/src/styles/yjs.css +++ b/apps/playground/src/styles/yjs.css @@ -18,7 +18,7 @@ box-sizing: border-box; } -.yRemoteSelectionHead::after { +.yRemoteSelectionHead:after { position: absolute; content: " "; font-size: 10px; @@ -26,6 +26,7 @@ font-family: sans-serif; font-weight: bold; background-color: var(--presence-color); + color: var(--sv-text-color); border-radius: 4px; left: 0px; bottom: 60%; From 744e807b57ee9da215cbb638c4dcf489565ead33 Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Sun, 29 Sep 2024 23:22:42 -0300 Subject: [PATCH 30/76] fix(yjs): optional chaining in case awareness is deactivated --- packages/yjs/src/provider/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/yjs/src/provider/index.ts b/packages/yjs/src/provider/index.ts index db60f19..2ea4838 100644 --- a/packages/yjs/src/provider/index.ts +++ b/packages/yjs/src/provider/index.ts @@ -325,7 +325,7 @@ export class SuperVizYjsProvider extends ObservableV2 { this.logger.log('Joined the room', event); - this.awareness.connect(this.localParticipant.id, this.room!); + this.awareness?.connect(this.localParticipant.id, this.room!); this.changeState(ProviderState.CONNECTED); this.emit('connect', []); From 6c3c028978d1d3ec92261320abd58b4e11791f03 Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Sun, 29 Sep 2024 23:39:39 -0300 Subject: [PATCH 31/76] tests: adapt tests after small changes --- packages/yjs/src/provider/index.test.ts | 30 ++++---- packages/yjs/src/provider/index.ts | 4 +- .../yjs/src/services/awareness/index.test.ts | 68 ++++++++++--------- packages/yjs/src/services/awareness/index.ts | 2 +- 4 files changed, 57 insertions(+), 47 deletions(-) diff --git a/packages/yjs/src/provider/index.test.ts b/packages/yjs/src/provider/index.test.ts index 238c334..8dc2eed 100644 --- a/packages/yjs/src/provider/index.test.ts +++ b/packages/yjs/src/provider/index.test.ts @@ -8,22 +8,14 @@ import { DocUpdate, MessageToHost } from './types'; import { SuperVizYjsProvider } from '.'; -function createProvider(connect: boolean = true, debug: boolean = false, room: string = '') { +function createProvider(awareness: boolean = true) { const doc = new Y.Doc(); - const provider = new SuperVizYjsProvider(doc, { - apiKey: '123', - environment: 'dev', - participant: { - id: 'local-participant-id', - name: 'Provider Test', - }, - connect, - debug, - room, - }); + const provider = new SuperVizYjsProvider(doc, { awareness }); + provider['localParticipant'] = { id: 'local-participant-id', } as Participant; + provider['ioc'] = { client: new MOCK_IO.Realtime('123', 'dev', {}, 'secret', 'clientId'), createRoom() { @@ -43,6 +35,20 @@ describe('provider', () => { jest.restoreAllMocks(); }); + describe('start', () => { + test('should not create awareness if option is false', () => { + const provider = createProvider(false); + + expect(provider['awareness']).toBeUndefined(); + }); + + test('should create awareness', () => { + const provider = createProvider(); + + expect(provider['awareness']).toBeDefined(); + }); + }); + describe('attach', () => { afterAll(() => { jest.useRealTimers(); diff --git a/packages/yjs/src/provider/index.ts b/packages/yjs/src/provider/index.ts index 2ea4838..57e7801 100644 --- a/packages/yjs/src/provider/index.ts +++ b/packages/yjs/src/provider/index.ts @@ -46,14 +46,14 @@ export class SuperVizYjsProvider extends ObservableV2 { constructor( public doc: Y.Doc, - opts: Params = {}, + opts: Params, ) { super(); this.document = doc; this.logger = new Logger('SuperVizYjsProvider', '[SuperViz | YjsProvider] - '); - if (opts.awareness === false) return; + if (opts?.awareness === false) return; this.awareness = new Awareness(this.doc, this.logger); } diff --git a/packages/yjs/src/services/awareness/index.test.ts b/packages/yjs/src/services/awareness/index.test.ts index d6bae3b..823d362 100644 --- a/packages/yjs/src/services/awareness/index.test.ts +++ b/packages/yjs/src/services/awareness/index.test.ts @@ -17,7 +17,7 @@ function createAwareness(): Awareness { const participantId = 'local-participant-id'; function connectAwareness(awareness: Awareness) { - const room = new MOCK_IO.Realtime('api-key', 'dev', {}, 'secret', 'clientId').connect(); + const room = new MOCK_IO.Realtime('api-key', 'dev', {}, 'secret', 'clientID').connect(); awareness.connect(participantId, room); } @@ -92,7 +92,7 @@ describe('Awareness', () => { test('should return null if state is not set', () => { const awareness = createAwareness(); - awareness['states'].delete(awareness['clientId']); + awareness['states'].delete(awareness['clientID']); const state = awareness.getLocalState(); expect(state).toBeNull(); @@ -100,7 +100,7 @@ describe('Awareness', () => { test('should return null if presence key is not set', () => { const awareness = createAwareness(); - awareness['states'].set(awareness['clientId'], {}); + awareness['states'].set(awareness['clientID'], {}); const state = awareness.getLocalState(); expect(state).toBeNull(); @@ -115,7 +115,11 @@ describe('Awareness', () => { const states = awareness.getStates(); expect(states.size).toBe(1); - expect(states.get(awareness['clientId'])).toEqual({ visibility: 'visible' }); + const localState = states.get(awareness['clientID']); + + console.log('hm', states.get(awareness['clientID']), localState); + + expect(states.get(awareness['clientID'])).toEqual({ visibility: 'visible' }); }); }); @@ -153,7 +157,7 @@ describe('Awareness', () => { test('should preserve info in the states map besides the yjs presence key', () => { const awareness = createAwareness(); - awareness.states.set(awareness['clientId'], { + awareness.states.set(awareness['clientID'], { visibility: 'visible', [awareness['YJS_STATE']]: { audio: 'muted', @@ -162,7 +166,7 @@ describe('Awareness', () => { awareness.setLocalState({ video: 'on' }); - const state = awareness.states.get(awareness['clientId']); + const state = awareness.states.get(awareness['clientID']); expect(state).toEqual({ visibility: 'visible', [awareness['YJS_STATE']]: { @@ -175,14 +179,14 @@ describe('Awareness', () => { test('if state was not set, should set default old state', () => { const awareness = createAwareness(); - awareness.states.set(awareness['clientId'], null); + awareness.states.set(awareness['clientID'], null); awareness.setLocalState({}); - const state = awareness.states.get(awareness['clientId']); + const state = awareness.states.get(awareness['clientID']); expect(state).toEqual({ [awareness['YJS_STATE']]: {}, origin: 'set local state', - clientId: awareness['clientId'], + clientID: awareness['clientID'], }); }); }); @@ -191,7 +195,7 @@ describe('Awareness', () => { test('should set a single field in the local state, taking the previous state into account', () => { const awareness = createAwareness(); - awareness.states.set(awareness['clientId'], { + awareness.states.set(awareness['clientID'], { [awareness['YJS_STATE']]: { audio: 'muted', }, @@ -199,7 +203,7 @@ describe('Awareness', () => { awareness.setLocalStateField('video', 'on'); - const state = awareness.states.get(awareness['clientId']); + const state = awareness.states.get(awareness['clientID']); expect(state).toEqual({ [awareness['YJS_STATE']]: { audio: 'muted', @@ -212,16 +216,16 @@ describe('Awareness', () => { test('should set single field even if complete state did not exist', () => { const awareness = createAwareness(); - awareness.states.set(awareness['clientId'], null); + awareness.states.set(awareness['clientID'], null); awareness.setLocalStateField('video', 'on'); - const state = awareness.states.get(awareness['clientId']); + const state = awareness.states.get(awareness['clientID']); expect(state).toEqual({ [awareness['YJS_STATE']]: { video: 'on', }, origin: 'set local state', - clientId: awareness['clientId'], + clientID: awareness['clientID'], }); }); }); @@ -240,14 +244,14 @@ describe('Awareness', () => { test('should remove other awareness when local participant leaves', () => { const awareness = createAwareness(); - awareness['participantIdToClientId'].set('local-participant-id', awareness['clientId']); + awareness['participantIdToClientId'].set('local-participant-id', awareness['clientID']); awareness['states'].set(1, {}); awareness['states'].set(2, {}); awareness['states'].set(3, {}); - awareness['states'].set(awareness['clientId'], {}); + awareness['states'].set(awareness['clientID'], {}); - const awarenessToRemove = [1, 2, 3, awareness['clientId']]; + const awarenessToRemove = [1, 2, 3, awareness['clientID']]; awareness['removeAwarenessStates'] = jest.fn(); @@ -268,11 +272,11 @@ describe('Awareness', () => { awareness['onUpdate']({ id: '1', - data: { clientId: 1, [awareness['YJS_STATE']]: {} }, + data: { clientID: 1, [awareness['YJS_STATE']]: {} }, } as unknown as PresenceEvent); expect(awareness['states'].get(1)).toEqual({ - clientId: 1, + clientID: 1, [awareness['YJS_STATE']]: {}, }); }); @@ -285,7 +289,7 @@ describe('Awareness', () => { awareness['onUpdate']({ id: 'local-participant-id', - data: { clientId: 1, [awareness['YJS_STATE']]: {} }, + data: { clientID: 1, [awareness['YJS_STATE']]: {} }, } as unknown as PresenceEvent); expect(awareness['states'].set).toHaveBeenCalledTimes(0); @@ -297,7 +301,7 @@ describe('Awareness', () => { awareness['onUpdate']({ id: '1', - data: { clientId: 1, [awareness['YJS_STATE']]: null }, + data: { clientID: 1, [awareness['YJS_STATE']]: null }, } as unknown as PresenceEvent); expect(awareness['removeAwarenessStates']).toHaveBeenCalledWith([1], UpdateOrigin.PRESENCE); @@ -311,7 +315,7 @@ describe('Awareness', () => { awareness['onUpdate']({ id: '1', - data: { clientId: 1, [awareness['YJS_STATE']]: {} }, + data: { clientID: 1, [awareness['YJS_STATE']]: {} }, } as unknown as PresenceEvent); expect(awareness['participantIdToClientId'].get('1')).toBe(1); @@ -394,15 +398,15 @@ describe('Awareness', () => { test('should update own presence in the room with the client id', () => { const awareness = createAwareness(); - const room = new MOCK_IO.Realtime('api-key', 'dev', {}, 'secret', 'clientId').connect(); + const room = new MOCK_IO.Realtime('api-key', 'dev', {}, 'secret', 'clientID').connect(); awareness.connect(participantId, room); - mockPresenceListOnce([{ id: 'local-participant-id', data: { clientId: 1 } }]); + mockPresenceListOnce([{ id: 'local-participant-id', data: { clientID: 1 } }]); awareness['initializePresences'](); expect(MOCK_ROOM.presence.update).toHaveBeenCalledWith({ - clientId: awareness['clientId'], + clientID: awareness['clientID'], [awareness['YJS_STATE']]: {}, origin: 'on connect', }); @@ -411,14 +415,14 @@ describe('Awareness', () => { test('should set the state and map the id of participants', () => { const awareness = createAwareness(); - const room = new MOCK_IO.Realtime('api-key', 'dev', {}, 'secret', 'clientId').connect(); + const room = new MOCK_IO.Realtime('api-key', 'dev', {}, 'secret', 'clientID').connect(); awareness.connect(participantId, room); awareness['states'].set = jest.fn(); mockPresenceListOnce([ - { id: '1', data: { clientId: 1, visibility: 'visible' } }, - { id: '2', data: { clientId: 2, visibility: 'hidden' } }, + { id: '1', data: { clientID: 1, visibility: 'visible' } }, + { id: '2', data: { clientID: 2, visibility: 'hidden' } }, ]); awareness['initializePresences'](); @@ -428,19 +432,19 @@ describe('Awareness', () => { expect(awareness['states'].set).toHaveBeenCalledTimes(2); expect(awareness['states'].set).toHaveBeenCalledWith(1, { - clientId: 1, + clientID: 1, visibility: 'visible', }); expect(awareness['states'].set).toHaveBeenCalledWith(2, { - clientId: 2, + clientID: 2, visibility: 'hidden', }); }); - test('should not set state and map if the presence has no clientId', () => { + test('should not set state and map if the presence has no clientID', () => { const awareness = createAwareness(); - const room = new MOCK_IO.Realtime('api-key', 'dev', {}, 'secret', 'clientId').connect(); + const room = new MOCK_IO.Realtime('api-key', 'dev', {}, 'secret', 'clientID').connect(); awareness.connect(participantId, room); awareness['states'].set = jest.fn(); diff --git a/packages/yjs/src/services/awareness/index.ts b/packages/yjs/src/services/awareness/index.ts index ba380d1..1cf384e 100644 --- a/packages/yjs/src/services/awareness/index.ts +++ b/packages/yjs/src/services/awareness/index.ts @@ -37,7 +37,7 @@ export class Awareness extends ObservableV2 { /** * @function connect * @description Start the awareness service - * @param {RealtimeRoom} room Main room in which it will propagete presence + * @param {RealtimeRoom} room Main room in which it will propagate presence * @returns {void} */ public connect(participantId: string, room: RealtimeRoom): void { From bc35937f34ef0ed475f72c25945870df562c60aa Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Mon, 30 Sep 2024 08:08:32 -0300 Subject: [PATCH 32/76] feat: yjs quill wio demo --- apps/playground/package.json | 3 + apps/playground/src/pages/yjs-monaco-wio.tsx | 2 +- apps/playground/src/pages/yjs-quill-wio.tsx | 203 +++++++++++++++++++ apps/playground/src/router/router.tsx | 5 + apps/playground/src/styles/yjs.css | 13 ++ pnpm-lock.yaml | 85 ++++++++ 6 files changed, 310 insertions(+), 1 deletion(-) create mode 100644 apps/playground/src/pages/yjs-quill-wio.tsx diff --git a/apps/playground/package.json b/apps/playground/package.json index 35d1cb5..1ac604e 100644 --- a/apps/playground/package.json +++ b/apps/playground/package.json @@ -21,15 +21,18 @@ "lib0": "^0.2.97", "lodash": "^4.17.21", "monaco-editor": "^0.51.0", + "quill-cursors": "^4.0.3", "react": "^18.3.1", "react-dom": "^18.3.1", "react-helmet-async": "^2.0.5", + "react-quill-new": "^3.3.2", "react-router-dom": "^6.26.1", "three": "0.167.1", "three-mesh-bvh": "^0.7.8", "uuid": "^10.0.0", "y-monaco": "^0.1.6", "y-protocols": "^1.0.6", + "y-quill": "^1.0.0", "yjs": "^13.3.1", "zod": "^3.23.8" }, diff --git a/apps/playground/src/pages/yjs-monaco-wio.tsx b/apps/playground/src/pages/yjs-monaco-wio.tsx index 54399bf..85c5add 100644 --- a/apps/playground/src/pages/yjs-monaco-wio.tsx +++ b/apps/playground/src/pages/yjs-monaco-wio.tsx @@ -181,7 +181,7 @@ export function YjsWithMonaco() {
{ setEditor(editor); diff --git a/apps/playground/src/pages/yjs-quill-wio.tsx b/apps/playground/src/pages/yjs-quill-wio.tsx new file mode 100644 index 0000000..0762065 --- /dev/null +++ b/apps/playground/src/pages/yjs-quill-wio.tsx @@ -0,0 +1,203 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import * as Y from "yjs"; +import { SuperVizYjsProvider } from "@superviz/yjs"; + +import "../styles/yjs.css"; +import Room, { + type LauncherFacade, + type Participant, + WhoIsOnline, +} from "@superviz/sdk"; +import { useCallback, useEffect, useMemo, useRef, useState } from "react"; + +import ReactQuill, { Quill } from "react-quill-new"; +import { QuillBinding } from "y-quill"; +import "react-quill-new/dist/quill.snow.css"; +import QuillCursors from "quill-cursors"; + +Quill.register("modules/cursors", QuillCursors); + +const id = Math.floor(Math.random() * 1000000); + +function setStyles( + states: Map>, + ids: Set +): number[] { + const stylesheet = document.getElementById("sv-yjs-quill"); + let styles = ""; + + const idsList = []; + for (const [id, state] of states) { + if (ids.has(id) || !state.participant) continue; + idsList.push(id); + + styles += ` + #ql-cursor-${id} { + --presence-color: ${state.participant.slot.color}; + --sv-text-color: ${state.participant.slot.textColor}; + } + `; + } + + stylesheet!.innerText = styles; + + return idsList; +} + +export function YjsWithQuill() { + const ydoc = useMemo(() => new Y.Doc(), []); + + const quillRef = useRef(null); + + const [localParticipant, setLocalParticipant] = + useState>(); + + const provider = useRef(new SuperVizYjsProvider(ydoc)); + const wio = useRef(); + + const [ids, setIds] = useState(new Set()); + + const loaded = useRef(false); + const [room, setRoom] = useState(null); + + const [joinedRoom, setJoinedRoom] = useState(false); + + useEffect(() => { + if (loaded.current) return; + loaded.current = true; + + wio.current = new WhoIsOnline(); + + (async () => { + if (room) return; + + const newRoom = await Room("90xbxrp4tra3hrkbw5y1sq7sw5cj9v", { + group: { + id: "yjs-quill", + name: "Yjs Quill", + }, + participant: { + id: `ian-yjs-${id}`, + name: `Ian Yjs ${id}`, + }, + roomId: "yjs-quill", + environment: "dev", + debug: true, + }); + + newRoom.subscribe("participant.updated", (data) => { + if (!data.slot?.index) return; + + provider.current.awareness?.setLocalStateField("participant", { + id: data.id, + slot: data.slot, + name: data.name, + }); + + setLocalParticipant({ + id: data.id, + slot: data.slot, + name: data.name, + }); + }); + + const style = document.createElement("style"); + style.id = "sv-yjs-quill"; + document.head.appendChild(style); + + setRoom(newRoom); + })(); + + return () => { + room?.destroy(); + }; + }, [room]); + + const joinRoom = useCallback(() => { + if (joinedRoom || !room) return; + setJoinedRoom(true); + + if (localParticipant) { + provider.current.awareness?.setLocalStateField( + "participant", + localParticipant + ); + } + + const updateStyles = () => { + const states = provider.current.awareness?.getStates(); + const idsList = setStyles(states, ids); + + setIds(new Set(idsList)); + }; + + provider.current.on("connect", updateStyles); + provider.current.awareness?.on("update", updateStyles); + + room.addComponent(provider.current); + room.addComponent(wio.current); + }, [room, joinedRoom, setIds, ids, localParticipant]); + + const leaveRoom = useCallback(() => { + if (!joinedRoom || !room) return; + setJoinedRoom(false); + + room.removeComponent(wio.current); + room.removeComponent(provider.current); + }, [room, joinedRoom]); + + // this effect manages the lifetime of the editor binding + useEffect(() => { + if (!provider || !quillRef.current) return; + + const binding = new QuillBinding( + ydoc.getText("quill"), + quillRef.current.getEditor(), + provider.current.awareness + ); + + return () => { + binding.destroy(); + }; + }, [ydoc, provider]); + + return ( +
+
+ + +
+
+
+ {" "} +
+
+ ); +} diff --git a/apps/playground/src/router/router.tsx b/apps/playground/src/router/router.tsx index c515873..d33546c 100644 --- a/apps/playground/src/router/router.tsx +++ b/apps/playground/src/router/router.tsx @@ -16,6 +16,7 @@ import { Video } from "../pages/video.tsx"; import { Three } from "../pages/three.tsx"; import { PointersCanvas } from "../pages/pointers-canvas.tsx"; import { YjsWithMonaco } from "../pages/yjs-monaco-wio.tsx"; +import { YjsWithQuill } from "../pages/yjs-quill-wio.tsx"; export const routeList: RouteObject[] = [ { @@ -85,6 +86,10 @@ export const routeList: RouteObject[] = [ path: "yjs-with-monaco", element: , }, + { + path: "yjs-with-quill", + element: , + }, ], }, ]; diff --git a/apps/playground/src/styles/yjs.css b/apps/playground/src/styles/yjs.css index a9cab7c..7c211a5 100644 --- a/apps/playground/src/styles/yjs.css +++ b/apps/playground/src/styles/yjs.css @@ -32,3 +32,16 @@ bottom: 60%; opacity: 1; } + +.ql-cursor-selections .ql-cursor-selection-block { + background-color: var(--presence-color) !important; +} + +.ql-cursor-caret-container .ql-cursor-caret { + background-color: var(--presence-color) !important; +} + +.ql-cursor-flag { + background-color: var(--presence-color) !important; + color: var(--sv-text-color) !important; +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 901f728..a15772f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -53,6 +53,9 @@ importers: monaco-editor: specifier: ^0.51.0 version: 0.51.0 + quill-cursors: + specifier: ^4.0.3 + version: 4.0.3 react: specifier: ^18.3.1 version: 18.3.1 @@ -62,6 +65,9 @@ importers: react-helmet-async: specifier: ^2.0.5 version: 2.0.5(react@18.3.1) + react-quill-new: + specifier: ^3.3.2 + version: 3.3.2(quill-delta@5.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-router-dom: specifier: ^6.26.1 version: 6.26.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -80,6 +86,9 @@ importers: y-protocols: specifier: ^1.0.6 version: 1.0.6(yjs@13.6.19) + y-quill: + specifier: ^1.0.0 + version: 1.0.0(quill-cursors@4.0.3)(quill@2.0.2)(yjs@13.6.19) yjs: specifier: ^13.3.1 version: 13.6.19 @@ -3852,6 +3861,9 @@ packages: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -3888,6 +3900,9 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + fast-fifo@1.3.2: resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} @@ -4934,6 +4949,9 @@ packages: lodash.capitalize@4.2.1: resolution: {integrity: sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==} + lodash.clonedeep@4.5.0: + resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} @@ -5428,6 +5446,9 @@ packages: package-json-from-dist@1.0.0: resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + parchment@3.0.0: + resolution: {integrity: sha512-HUrJFQ/StvgmXRcQ1ftY6VEZUq3jA2t9ncFN4F84J/vN0/FPpQF+8FKXb3l6fLces6q0uOHj6NJn+2xvZnxO6A==} + parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -5672,6 +5693,17 @@ packages: queue-tick@1.0.1: resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} + quill-cursors@4.0.3: + resolution: {integrity: sha512-CXJ0eCCiZVwUWWASI9paXFTeVdVVBXdd/S+MC2j9lMIQB9V8dhWq4mPU2M5THSg1gSEM6R1z9YFiNMuu4zOq0A==} + + quill-delta@5.1.0: + resolution: {integrity: sha512-X74oCeRI4/p0ucjb5Ma8adTXd9Scumz367kkMK5V/IatcX6A0vlgLgKbzXWy5nZmCGeNJm2oQX0d2Eqj+ZIlCA==} + engines: {node: '>= 12.0.0'} + + quill@2.0.2: + resolution: {integrity: sha512-QfazNrhMakEdRG57IoYFwffUIr04LWJxbS/ZkidRFXYCQt63c1gK6Z7IHUXMx/Vh25WgPBU42oBaNzQ0K1R/xw==} + engines: {npm: '>=8.2.3'} + raw-body@2.5.2: resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} engines: {node: '>= 0.8'} @@ -5696,6 +5728,13 @@ packages: react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + react-quill-new@3.3.2: + resolution: {integrity: sha512-YOBKcUtuz+HsNsYkC0JGmvOJ7Ixy9z9g1VxESart4GQTOYrl4WPAJl0X/REVt46V8CYXYXIBTjbWAwQkvKl+9w==} + peerDependencies: + quill-delta: ^5.1.0 + react: ^16 || ^17 || ^18 || ^19 + react-dom: ^16 || ^17 || ^18 || ^19 + react-refresh@0.14.2: resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} engines: {node: '>=0.10.0'} @@ -6764,6 +6803,13 @@ packages: peerDependencies: yjs: ^13.0.0 + y-quill@1.0.0: + resolution: {integrity: sha512-WpYBXsFXdofGuaAVyvKpZ3rg+TklWtKtpemUziY044NLhnwud0D+QTX2mdGKMrLON+BshKQeT77FbXa68ZJbcA==} + peerDependencies: + quill: ^2.0.0 + quill-cursors: ^4.0.2 + yjs: ^13.6.14 + y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -10786,6 +10832,8 @@ snapshots: etag@1.8.1: {} + eventemitter3@5.0.1: {} + execa@5.1.1: dependencies: cross-spawn: 7.0.3 @@ -10857,6 +10905,8 @@ snapshots: fast-deep-equal@3.1.3: {} + fast-diff@1.3.0: {} + fast-fifo@1.3.2: {} fast-glob@3.3.1: @@ -12200,6 +12250,8 @@ snapshots: lodash.capitalize@4.2.1: {} + lodash.clonedeep@4.5.0: {} + lodash.debounce@4.0.8: {} lodash.escaperegexp@4.1.2: {} @@ -12577,6 +12629,8 @@ snapshots: package-json-from-dist@1.0.0: {} + parchment@3.0.0: {} + parent-module@1.0.1: dependencies: callsites: 3.1.0 @@ -12798,6 +12852,21 @@ snapshots: queue-tick@1.0.1: {} + quill-cursors@4.0.3: {} + + quill-delta@5.1.0: + dependencies: + fast-diff: 1.3.0 + lodash.clonedeep: 4.5.0 + lodash.isequal: 4.5.0 + + quill@2.0.2: + dependencies: + eventemitter3: 5.0.1 + lodash-es: 4.17.21 + parchment: 3.0.0 + quill-delta: 5.1.0 + raw-body@2.5.2: dependencies: bytes: 3.1.2 @@ -12829,6 +12898,14 @@ snapshots: react-is@18.3.1: {} + react-quill-new@3.3.2(quill-delta@5.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + lodash: 4.17.21 + quill: 2.0.2 + quill-delta: 5.1.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-refresh@0.14.2: {} react-router-dom@6.26.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): @@ -13978,6 +14055,14 @@ snapshots: lib0: 0.2.97 yjs: 13.6.19 + y-quill@1.0.0(quill-cursors@4.0.3)(quill@2.0.2)(yjs@13.6.19): + dependencies: + lib0: 0.2.97 + quill: 2.0.2 + quill-cursors: 4.0.3 + y-protocols: 1.0.6(yjs@13.6.19) + yjs: 13.6.19 + y18n@5.0.8: {} yallist@3.1.1: {} From 65d50b3469c7653da885158a8051b89372cdc163 Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Mon, 30 Sep 2024 08:12:26 -0300 Subject: [PATCH 33/76] fix(wio): set initialized as false when destroying component --- .../sdk/src/components/who-is-online/index.ts | 61 ++++++++++++------- 1 file changed, 40 insertions(+), 21 deletions(-) diff --git a/packages/sdk/src/components/who-is-online/index.ts b/packages/sdk/src/components/who-is-online/index.ts index c8f36d4..3feb659 100644 --- a/packages/sdk/src/components/who-is-online/index.ts +++ b/packages/sdk/src/components/who-is-online/index.ts @@ -5,8 +5,8 @@ import { Participant, Avatar } from '../../common/types/participant.types'; import { StoreType } from '../../common/types/stores.types'; import { Logger } from '../../common/utils'; import { Following } from '../../services/stores/who-is-online/types'; -import type { WhoIsOnline as WhoIsOnlineElement } from '../../web-components/who-is-online'; import { DropdownOption } from '../../web-components/dropdown/types'; +import type { WhoIsOnline as WhoIsOnlineElement } from '../../web-components/who-is-online'; import { BaseComponent } from '../base'; import { ComponentNames } from '../types'; @@ -90,6 +90,7 @@ export class WhoIsOnline extends BaseComponent { this.removeListeners(); this.element.remove(); this.element = null; + this.initialized = false; const { destroy } = this.useStore(StoreType.WHO_IS_ONLINE); destroy(); @@ -318,7 +319,8 @@ export class WhoIsOnline extends BaseComponent { /** * @function updateExtra - * @description Update an extra participant (one that is only visible by opening the dropdown) with their newly sent data + * @description Update an extra participant (one that is only visible by + * opening the dropdown) with their newly sent data * @param {WhoIsOnlineParticipant} participant The participant with new data * @returns {void} */ @@ -345,7 +347,8 @@ export class WhoIsOnline extends BaseComponent { /** * @function subscribeToLocalParticipantUpdates - * @description Subscribes to updates in the local participant and updates the presence accordingly + * @description Subscribes to updates in the local participant and updates + * the presence accordingly * @param {Participant} participant The local participant * @returns {void} */ @@ -462,11 +465,11 @@ export class WhoIsOnline extends BaseComponent { /** * @function stopFollowing * @description Stops following a participant - * @param {AblyParticipant} participant The message sent from Ably (in case of being called as a callback) - * @param {boolean} stopEvent A flag that stops the "stop following" event from being published to the user + * @param {PresenceEvent} event The message sent from room + * (in case of being called as a callback) * @returns */ - private stopFollowing = (event) => { + private stopFollowing = (event: PresenceEvent) => { if (event.id !== this.following?.id) return; const { following } = this.useStore(StoreType.WHO_IS_ONLINE); @@ -479,7 +482,8 @@ export class WhoIsOnline extends BaseComponent { /** * @function gather * @description Propagates the gather all event in the room - * @param {CustomEvent} data The custom event object containing data about the participant calling for the gather all + * @param {CustomEvent} data The custom event object containing data about + * the participant calling for the gather all */ private gather = (data: CustomEvent) => { this.room.emit(WhoIsOnlineEvent.GATHER_ALL, data.detail.id); @@ -534,7 +538,8 @@ export class WhoIsOnline extends BaseComponent { /** * @function getParticipant - * @description Processes the data from a participant to something usable in the Who Is Online component + * @description Processes the data from a participant to something usable in + * the Who Is Online component * @param {Participant} participant The participant that will be processed * @returns {WhoIsOnlineParticipant} The data that will be used in the Who Is Online component */ @@ -561,8 +566,11 @@ export class WhoIsOnline extends BaseComponent { /** * @function shouldDisableDropdown - * @description Decides whether the dropdown with presence controls should be available in a given participant, varying whether they have a presence control enabled or not - * @param {activeComponents: string[] | undefined; participantId: string;} data Info regarding the participant that will be used to decide if their avatar will be clickable + * @description Decides whether the dropdown with presence controls should be + * available in a given participant, varying whether they have a presence control enabled or not + * @param {activeComponents: string[] | undefined; participantId: string;} + * data Info regarding the participant that will be used to decide if their + * avatar will be clickable * @returns {boolean} True or false depending if should disable the participant dropdown or not */ private shouldDisableDropdown({ @@ -592,16 +600,19 @@ export class WhoIsOnline extends BaseComponent { (participantId !== this.localParticipantId && disableFollowParticipant && disableGoToParticipant) - ) + ) { return true; + } return !activeComponents?.some((component) => component.toLowerCase().includes('presence')); } /** * @function getTooltipData - * @description Processes the participant info and discovers how the tooltip message should looking when hovering over their avatars - * @param {isLocalParticipant: boolean; name: string; presenceEnabled: boolean } data Relevant info about the participant that will be used to decide + * @description Processes the participant info and discovers how the tooltip + * message should looking when hovering over their avatars + * @param {isLocalParticipant: boolean; name: string; presenceEnabled: boolean } + * data Relevant info about the participant that will be used to decide * @returns {TooltipData} What the participant tooltip will look like */ private getTooltipData(data: WhoIsOnlineParticipant): TooltipData { @@ -626,7 +637,8 @@ export class WhoIsOnline extends BaseComponent { /** * @function getAvatar * @description Processes the info of the participant's avatar - * @param { avatar: Avatar; name: string; color: string; letterColor: string } data Information about the participant that will take part in their avatar somehow + * @param { avatar: Avatar; name: string; color: string; letterColor: string } data Information + * about the participant that will take part in their avatar somehow * @returns {Avatar} Information used to decide how to construct the participant's avatar html */ private getAvatar({ @@ -648,8 +660,10 @@ export class WhoIsOnline extends BaseComponent { /** * @function getControls - * @description Decides which presence controls the user should see when opening a participant dropdown - * @param { participantId: string; presenceEnabled: boolean } data Relevant info about the participant that will be used to decide + * @description Decides which presence controls the user should see when opening a participant + * dropdown + * @param { participantId: string; presenceEnabled: boolean } data Relevant info about the + * participant that will be used to decide * @returns {DropdownOption[]} The presence controls enabled for a given participant */ private getControls(data: WhoIsOnlineParticipant): DropdownOption[] | undefined { @@ -667,7 +681,8 @@ export class WhoIsOnline extends BaseComponent { /** * @function getOtherParticipantsControls - * @description Decides which presence controls the user should see when opening the dropdown of a participant that is not the local participant + * @description Decides which presence controls the user should see when opening the dropdown of + * a participant that is not the local participant * @param {string} participantId Which participant is being analyzed * @returns {DropdownOption[]} The presence controls enabled for the participant */ @@ -696,7 +711,8 @@ export class WhoIsOnline extends BaseComponent { /** * @function getLocalParticipantControls - * @description Decides which presence controls the user should see when opening the dropdown of the local participant + * @description Decides which presence controls the user should see when opening the dropdown + * of the local participant * @returns {DropdownOption[]} The presence controls enabled for the local participant */ private getLocalParticipantControls(): DropdownOption[] { @@ -737,9 +753,11 @@ export class WhoIsOnline extends BaseComponent { /** * @function updateParticipantsControls - * @description Updated what the presence controls of a single participant should look like now that something about them was updated + * @description Updated what the presence controls of a single participant should look like + * now that something about them was updated * @param {string | undefined} participantId The participant that suffered some update - * @returns {void} The participants that did not fit the main list and will be inserted in the extras participants list + * @returns {void} The participants that did not fit the main list and will be inserted in + * the extras participants list */ private updateParticipantsControls(participantId: string | undefined): void { const { participants } = this.useStore(StoreType.WHO_IS_ONLINE); @@ -761,7 +779,8 @@ export class WhoIsOnline extends BaseComponent { /** * @function highlightParticipantBeingFollowed - * @description Brings a participant that is in the list of extra participants to the front, in the second place of the list of main participants, so they are visible while being followed + * @description Brings a participant that is in the list of extra participants to the front, + * in the second place of the list of main participants, so they are visible while being followed * @returns {void} */ private highlightParticipantBeingFollowed(): void { From b6d12501382f1e09cd012df62b1ac9c7df025b83 Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Mon, 30 Sep 2024 08:18:37 -0300 Subject: [PATCH 34/76] ci: yjs provider action workflow --- .github/workflows/yjs.ci.yml | 53 ++++++++++++++++++++++++++++++++++++ turbo.json | 9 ++---- 2 files changed, 56 insertions(+), 6 deletions(-) create mode 100644 .github/workflows/yjs.ci.yml diff --git a/.github/workflows/yjs.ci.yml b/.github/workflows/yjs.ci.yml new file mode 100644 index 0000000..2cbe8f0 --- /dev/null +++ b/.github/workflows/yjs.ci.yml @@ -0,0 +1,53 @@ +name: Yjs Provider - Publish Package +on: + push: + branches: + - lab + - beta + - main + paths: + - "packages/yjs/**" + - ".github/workflows/yjs.ci.yml" +jobs: + package: + runs-on: ubuntu-latest + strategy: + matrix: + node-version: [20] + steps: + - uses: actions/checkout@v4 + - name: Install pnpm + uses: pnpm/action-setup@v4 + with: + version: 9.10.0 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node-version }} + cache: "pnpm" + - name: Install dependencies + run: pnpm install --no-frozen-lockfile + env: + NPM_CONFIG_USERCONFIG: .npmrc.ci + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + - run: git config --global user.name SuperViz + - run: git config --global user.email ci@superviz.com + - name: Publish npm package + run: npm whoami && pnpm run semantic-release --filter=@superviz/yjs + env: + NPM_CONFIG_USERCONFIG: .npmrc.ci + GITHUB_TOKEN: ${{ secrets.TOKEN_GITHUB }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + slack: + needs: package + name: Slack Notification + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Slack Notification + uses: rtCamp/action-slack-notify@v2 + env: + SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }} + SLACK_ICON: https://avatars.slack-edge.com/2020-11-18/1496892993975_af721d1c045bea2d5a46_48.png + MSG_MINIMAL: true + SLACK_USERNAME: Deploy yjs provider version ${{ github.ref_name }} diff --git a/turbo.json b/turbo.json index ec2e386..03b450e 100644 --- a/turbo.json +++ b/turbo.json @@ -78,16 +78,13 @@ "dependsOn": ["@superviz/socket-client#build"] }, "@superviz/yjs#build": { - "dependsOn": ["@superviz/socket-client#build"] + "dependsOn": ["@superviz/yjs-client#build"] }, "@superviz/yjs#test:unit": { - "dependsOn": ["@superviz/socket-client#build"] - }, - "@superviz/yjs#test:unit:watch": { - "dependsOn": ["@superviz/socket-client#build"] + "dependsOn": ["@superviz/yjs-client#build"] }, "@superviz/yjs#test:unit:coverage": { - "dependsOn": ["@superviz/socket-client#build"] + "dependsOn": ["@superviz/yjs#build"] } } } From 08dff3f5d3f168b88b171aea57d69bf1681869ff Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Mon, 30 Sep 2024 08:21:13 -0300 Subject: [PATCH 35/76] fix: remove console.log --- packages/yjs/src/services/awareness/index.test.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/yjs/src/services/awareness/index.test.ts b/packages/yjs/src/services/awareness/index.test.ts index 823d362..9dc856f 100644 --- a/packages/yjs/src/services/awareness/index.test.ts +++ b/packages/yjs/src/services/awareness/index.test.ts @@ -115,9 +115,6 @@ describe('Awareness', () => { const states = awareness.getStates(); expect(states.size).toBe(1); - const localState = states.get(awareness['clientID']); - - console.log('hm', states.get(awareness['clientID']), localState); expect(states.get(awareness['clientID'])).toEqual({ visibility: 'visible' }); }); From fe90d9799c41c655d202ad1b5a3e8efd701e0363 Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Mon, 30 Sep 2024 11:16:32 -0300 Subject: [PATCH 36/76] fix(yjs): emit the 'mount' event, mark options param as optional --- packages/yjs/src/provider/index.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/yjs/src/provider/index.ts b/packages/yjs/src/provider/index.ts index 57e7801..4ef7b03 100644 --- a/packages/yjs/src/provider/index.ts +++ b/packages/yjs/src/provider/index.ts @@ -46,7 +46,7 @@ export class SuperVizYjsProvider extends ObservableV2 { constructor( public doc: Y.Doc, - opts: Params, + opts?: Params, ) { super(); this.document = doc; @@ -91,6 +91,7 @@ export class SuperVizYjsProvider extends ObservableV2 { this.localParticipant = localParticipant.value; this.isAttached = true; this.connect(); + this.emit('mount', []); } public detach() { @@ -99,10 +100,10 @@ export class SuperVizYjsProvider extends ObservableV2 { return; } - this.emit(ComponentLifeCycleEvent.UNMOUNT, []); this.logger.log('detached'); this.destroyProvider(); super.destroy(); + this.emit(ComponentLifeCycleEvent.UNMOUNT, []); } /** @@ -112,7 +113,6 @@ export class SuperVizYjsProvider extends ObservableV2 { * automatically when a SuperVizYjsProvider instance is created, * unless opted-out by passing "connect: false" in the constructor * options. Can't connect if it is already connected - * @public * @emits state * @returns {void} */ @@ -128,7 +128,7 @@ export class SuperVizYjsProvider extends ObservableV2 { } /** - * @public @function destroy + * @function destroy * @description Disconnect from the room and reset the instance state. * @emits state @returns {void} */ From c854f5e4b74864ae50f7de8d61b41329d87fb6be Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Mon, 30 Sep 2024 11:18:28 -0300 Subject: [PATCH 37/76] fix(yjs demos): reset ids sets --- apps/playground/src/pages/yjs-monaco-wio.tsx | 1 + apps/playground/src/pages/yjs-quill-wio.tsx | 2 ++ apps/playground/src/styles/yjs.css | 1 + 3 files changed, 4 insertions(+) diff --git a/apps/playground/src/pages/yjs-monaco-wio.tsx b/apps/playground/src/pages/yjs-monaco-wio.tsx index 85c5add..9ffe648 100644 --- a/apps/playground/src/pages/yjs-monaco-wio.tsx +++ b/apps/playground/src/pages/yjs-monaco-wio.tsx @@ -141,6 +141,7 @@ export function YjsWithMonaco() { if (!joinedRoom || !room) return; setJoinedRoom(false); + setIds(new Set()); room.removeComponent(wio.current); room.removeComponent(provider.current); }, [room, joinedRoom]); diff --git a/apps/playground/src/pages/yjs-quill-wio.tsx b/apps/playground/src/pages/yjs-quill-wio.tsx index 0762065..e5a57fb 100644 --- a/apps/playground/src/pages/yjs-quill-wio.tsx +++ b/apps/playground/src/pages/yjs-quill-wio.tsx @@ -144,6 +144,8 @@ export function YjsWithQuill() { room.removeComponent(wio.current); room.removeComponent(provider.current); + + setIds(new Set()); }, [room, joinedRoom]); // this effect manages the lifetime of the editor binding diff --git a/apps/playground/src/styles/yjs.css b/apps/playground/src/styles/yjs.css index 7c211a5..e741d8b 100644 --- a/apps/playground/src/styles/yjs.css +++ b/apps/playground/src/styles/yjs.css @@ -35,6 +35,7 @@ .ql-cursor-selections .ql-cursor-selection-block { background-color: var(--presence-color) !important; + opacity: 0.4; } .ql-cursor-caret-container .ql-cursor-caret { From 5664070d6e08a780d3142d6a28d9bf2b82b32988 Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Mon, 30 Sep 2024 11:31:14 -0300 Subject: [PATCH 38/76] chore: update depndencies of yjs build --- turbo.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/turbo.json b/turbo.json index 03bb4de..49dae07 100644 --- a/turbo.json +++ b/turbo.json @@ -78,7 +78,7 @@ "dependsOn": ["@superviz/socket-client#build"] }, "@superviz/yjs#build": { - "dependsOn": ["@superviz/yjs#build"] + "dependsOn": ["@superviz/socket-client#build", "@superviz/sdk#build"] }, "@superviz/yjs#test:unit": { "dependsOn": ["@superviz/yjs#build"] From 874649dcafb62679cc0c550cb7ce0fcb18486c50 Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Mon, 30 Sep 2024 11:56:32 -0300 Subject: [PATCH 39/76] tests: add types to arguments --- .../sdk/src/components/who-is-online/index.test.ts | 12 +++++++----- turbo.json | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/packages/sdk/src/components/who-is-online/index.test.ts b/packages/sdk/src/components/who-is-online/index.test.ts index 4a15bfe..d8f448e 100644 --- a/packages/sdk/src/components/who-is-online/index.test.ts +++ b/packages/sdk/src/components/who-is-online/index.test.ts @@ -1,11 +1,15 @@ +import type { PresenceEvent } from '@superviz/socket-client'; + import { MOCK_CONFIG } from '../../../__mocks__/config.mock'; import { EVENT_BUS_MOCK } from '../../../__mocks__/event-bus.mock'; +import { LIMITS_MOCK } from '../../../__mocks__/limits.mock'; import { MOCK_ABLY_PARTICIPANT_DATA_2, MOCK_LOCAL_PARTICIPANT, MOCK_ABLY_PARTICIPANT_DATA_1, } from '../../../__mocks__/participants.mock'; import { RealtimeEvent, WhoIsOnlineEvent } from '../../common/types/events.types'; +import { MEETING_COLORS } from '../../common/types/meeting-colors.types'; import { StoreType } from '../../common/types/stores.types'; import { useStore } from '../../common/utils/use-store'; import { IOC } from '../../services/io'; @@ -16,8 +20,6 @@ import { ComponentNames } from '../types'; import { Avatar, WhoIsOnlineParticipant, TooltipData } from './types'; import { WhoIsOnline } from './index'; -import { MEETING_COLORS } from '../../common/types/meeting-colors.types'; -import { LIMITS_MOCK } from '../../../__mocks__/limits.mock'; const generateMockParticipant = ({ id, @@ -454,7 +456,7 @@ describe('Who Is Online', () => { name: MOCK_ABLY_PARTICIPANT_DATA_2.name, }); - whoIsOnlineComponent['stopFollowing'](MOCK_LOCAL_PARTICIPANT); + whoIsOnlineComponent['stopFollowing'](MOCK_LOCAL_PARTICIPANT as PresenceEvent); expect(following.value).toBeDefined(); expect(following.value!.id).toBe(MOCK_ABLY_PARTICIPANT_DATA_2.id); @@ -470,7 +472,7 @@ describe('Who Is Online', () => { whoIsOnlineComponent['stopFollowing']({ id: MOCK_ABLY_PARTICIPANT_DATA_1.id, - }); + } as PresenceEvent); expect(following.value).toBe(undefined); expect(whoIsOnlineComponent['following']).toBe(undefined); @@ -565,7 +567,7 @@ describe('Who Is Online', () => { whoIsOnlineComponent['stopFollowing']({ id: MOCK_ABLY_PARTICIPANT_DATA_2.id, - }); + } as PresenceEvent); expect(whoIsOnlineComponent['publish']).toHaveBeenCalledWith( WhoIsOnlineEvent.STOP_FOLLOWING_PARTICIPANT, diff --git a/turbo.json b/turbo.json index 49dae07..f55be1e 100644 --- a/turbo.json +++ b/turbo.json @@ -81,7 +81,7 @@ "dependsOn": ["@superviz/socket-client#build", "@superviz/sdk#build"] }, "@superviz/yjs#test:unit": { - "dependsOn": ["@superviz/yjs#build"] + "dependsOn": ["@superviz/sdk#build", "@superviz/socket-client#build"] }, "@superviz/yjs#test:unit:coverage": { "dependsOn": ["@superviz/yjs#build"] From c266852148c018b877df090956ffc5942faa60b0 Mon Sep 17 00:00:00 2001 From: Carlos Date: Mon, 30 Sep 2024 12:24:20 -0300 Subject: [PATCH 40/76] chore: add dependecies to run test:unit:ci into yjs package --- pnpm-lock.yaml | 59 +++++++++++++++++++++++++------------------------- turbo.json | 3 +++ 2 files changed, 32 insertions(+), 30 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b600f17..78c9ac2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -41,9 +41,6 @@ importers: '@superviz/yjs': specifier: workspace:* version: link:../../packages/yjs - '@superviz/yjs': - specifier: workspace:* - version: link:../../packages/yjs '@types/three': specifier: ^0.167.1 version: 0.167.2 @@ -2179,18 +2176,6 @@ packages: '@mdn/browser-compat-data@4.2.1': resolution: {integrity: sha512-EWUguj2kd7ldmrF9F+vI5hUOralPd+sdsUnYbRy33vZTuZkduC1shE9TtEMEjAQwyfyMb4ole5KtjF8MsnQOlA==} - '@monaco-editor/loader@1.4.0': - resolution: {integrity: sha512-00ioBig0x642hytVspPl7DbQyaSWRaolYie/UFNjoTdvoKPzo6xrXLhTk9ixgIKcLH5b5vDOjVNiGyY+uDCUlg==} - peerDependencies: - monaco-editor: '>= 0.21.0 < 1' - - '@monaco-editor/react@4.6.0': - resolution: {integrity: sha512-RFkU9/i7cN2bsq/iTkurMWOEErmYcY6JiQI3Jn+WeR/FGISH8JbHERjpS9oRuSOPvDMJI0Z8nJeKkbOs9sBYQw==} - peerDependencies: - monaco-editor: '>= 0.25.0 < 1' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - '@microsoft/api-extractor-model@7.28.13': resolution: {integrity: sha512-39v/JyldX4MS9uzHcdfmjjfS6cYGAoXV+io8B5a338pkHiSt+gy2eXQ0Q7cGFJ7quSa1VqqlMdlPrB6sLR/cAw==} @@ -2204,6 +2189,18 @@ packages: '@microsoft/tsdoc@0.14.2': resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} + '@monaco-editor/loader@1.4.0': + resolution: {integrity: sha512-00ioBig0x642hytVspPl7DbQyaSWRaolYie/UFNjoTdvoKPzo6xrXLhTk9ixgIKcLH5b5vDOjVNiGyY+uDCUlg==} + peerDependencies: + monaco-editor: '>= 0.21.0 < 1' + + '@monaco-editor/react@4.6.0': + resolution: {integrity: sha512-RFkU9/i7cN2bsq/iTkurMWOEErmYcY6JiQI3Jn+WeR/FGISH8JbHERjpS9oRuSOPvDMJI0Z8nJeKkbOs9sBYQw==} + peerDependencies: + monaco-editor: '>= 0.25.0 < 1' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -4228,9 +4225,6 @@ packages: eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -4270,9 +4264,6 @@ packages: fast-diff@1.3.0: resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} - fast-diff@1.3.0: - resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} - fast-fifo@1.3.2: resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} @@ -8960,6 +8951,18 @@ snapshots: '@microsoft/tsdoc@0.14.2': {} + '@monaco-editor/loader@1.4.0(monaco-editor@0.51.0)': + dependencies: + monaco-editor: 0.51.0 + state-local: 1.0.7 + + '@monaco-editor/react@4.6.0(monaco-editor@0.51.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@monaco-editor/loader': 1.4.0(monaco-editor@0.51.0) + monaco-editor: 0.51.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -9288,7 +9291,7 @@ snapshots: read-pkg: 9.0.1 registry-auth-token: 5.0.2 semantic-release: 24.0.0(typescript@5.6.2) - semver: 7.6.3 + semver: 7.5.4 tempy: 3.1.0 '@semantic-release/npm@12.0.1(semantic-release@24.1.1(typescript@5.6.2))': @@ -9305,7 +9308,7 @@ snapshots: read-pkg: 9.0.1 registry-auth-token: 5.0.2 semantic-release: 24.1.1(typescript@5.6.2) - semver: 7.6.3 + semver: 7.5.4 tempy: 3.1.0 '@semantic-release/release-notes-generator@14.0.1(semantic-release@24.0.0(typescript@5.6.2))': @@ -10913,7 +10916,7 @@ snapshots: conventional-commits-filter: 5.0.0 handlebars: 4.7.8 meow: 13.2.0 - semver: 7.6.3 + semver: 7.5.4 conventional-commit-types@3.0.0: {} @@ -11821,8 +11824,6 @@ snapshots: eventemitter3@5.0.1: {} - eventemitter3@5.0.1: {} - execa@5.1.1: dependencies: cross-spawn: 7.0.3 @@ -11896,8 +11897,6 @@ snapshots: fast-diff@1.3.0: {} - fast-diff@1.3.0: {} - fast-fifo@1.3.2: {} fast-glob@3.3.1: @@ -13562,7 +13561,7 @@ snapshots: normalize-package-data@6.0.2: dependencies: hosted-git-info: 7.0.2 - semver: 7.6.3 + semver: 7.5.4 validate-npm-package-license: 3.0.4 normalize-path@3.0.0: {} @@ -14372,7 +14371,7 @@ snapshots: semver-diff@4.0.0: dependencies: - semver: 7.6.3 + semver: 7.5.4 semver-regex@4.0.5: {} diff --git a/turbo.json b/turbo.json index f55be1e..a2644db 100644 --- a/turbo.json +++ b/turbo.json @@ -83,6 +83,9 @@ "@superviz/yjs#test:unit": { "dependsOn": ["@superviz/sdk#build", "@superviz/socket-client#build"] }, + "@superviz/yjs#test:unit:ci": { + "dependsOn": ["@superviz/sdk#build", "@superviz/socket-client#build"] + }, "@superviz/yjs#test:unit:coverage": { "dependsOn": ["@superviz/yjs#build"] }, From 452b1ed29550755b06314a86409986737cf1bf60 Mon Sep 17 00:00:00 2001 From: Carlos Date: Mon, 30 Sep 2024 12:29:05 -0300 Subject: [PATCH 41/76] chore: add version and remote-config files to sdk and socket-client before run the tests into yjs package --- .github/workflows/checks.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 6c68f88..1b1ca12 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -234,6 +234,14 @@ jobs: env: NPM_CONFIG_USERCONFIG: .npmrc.ci NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + - name: Create a .version.js file + run: | + touch packages/realtime/.version.js && echo "echo \"export const version = 'test'\" > packages/realtime/.version.js" | bash - + touch packages/sdk/.version.js && echo "echo \"export const version = 'test'\" > packages/sdk/.version.js" | bash - + - name: Create a .remote-config.js file + run: | + touch packages/realtime/.remote-config.js && echo "echo \"module.exports = { remoteConfig: { apiUrl: 'https://dev.nodeapi.superviz.com' }};\" > packages/realtime/.remote-config.js" | bash - + touch packages/sdk/.remote-config.js && echo "echo \"module.exports = { remoteConfig: { apiUrl: 'https://dev.nodeapi.superviz.com', conferenceLayerUrl: 'https://video-frame.superviz.com/lab/index.html'}};\" > .remote-config.js" | bash - - name: Run tests run: pnpm run test:unit:ci --filter=@superviz/yjs - name: Post PR Comment From ab50ebcf0727f350b753e0a882419ab405fce701 Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Mon, 30 Sep 2024 12:57:10 -0300 Subject: [PATCH 42/76] fix: support for unespecified event type --- packages/sdk/src/core/launcher/types.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/sdk/src/core/launcher/types.ts b/packages/sdk/src/core/launcher/types.ts index 6c6a570..c10709e 100644 --- a/packages/sdk/src/core/launcher/types.ts +++ b/packages/sdk/src/core/launcher/types.ts @@ -17,6 +17,7 @@ type LauncherSubscribe = { (event: `${ParticipantEvent.LEFT}`, callback: (participant: Participant) => void); (event: `${ParticipantEvent.LIST_UPDATED}`, callback: (participant: Participant[]) => void); (event: `${ParticipantEvent.LOCAL_UPDATED}`, callback: (participant: Participant) => void); + (event: string, callback: (data: any) => void); }; export type LauncherUnsubscribe = { @@ -27,6 +28,7 @@ export type LauncherUnsubscribe = { (event: `${ParticipantEvent.LEFT}`, callback?: (participant: Participant) => void); (event: `${ParticipantEvent.LIST_UPDATED}`, callback?: (participant: Participant[]) => void); (event: `${ParticipantEvent.LOCAL_UPDATED}`, callback?: (participant: Participant) => void); + (event: string, callback?: (data: any) => void); }; export interface LauncherFacade { From 728c32caeb14402210259b3c4e90e6fa8d99d065 Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Tue, 1 Oct 2024 06:53:39 -0300 Subject: [PATCH 43/76] fix: use correct template for demos --- apps/playground/src/lib/sdk/index.ts | 1 + apps/playground/src/pages/yjs-monaco-wio.tsx | 138 ++++++++++--------- apps/playground/src/pages/yjs-quill-wio.tsx | 132 +++++++++--------- apps/playground/src/router/router.tsx | 8 +- 4 files changed, 144 insertions(+), 135 deletions(-) diff --git a/apps/playground/src/lib/sdk/index.ts b/apps/playground/src/lib/sdk/index.ts index f5fbac9..0ec9e30 100644 --- a/apps/playground/src/lib/sdk/index.ts +++ b/apps/playground/src/lib/sdk/index.ts @@ -8,4 +8,5 @@ export { MousePointers, ParticipantType, type LauncherFacade, + type Participant, } from "@superviz/sdk"; diff --git a/apps/playground/src/pages/yjs-monaco-wio.tsx b/apps/playground/src/pages/yjs-monaco-wio.tsx index 9ffe648..d871f46 100644 --- a/apps/playground/src/pages/yjs-monaco-wio.tsx +++ b/apps/playground/src/pages/yjs-monaco-wio.tsx @@ -1,18 +1,26 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ +import { v4 as generateId } from "uuid"; + +import { getConfig } from "../config"; + import * as Y from "yjs"; import { SuperVizYjsProvider } from "@superviz/yjs"; import { MonacoBinding } from "y-monaco"; import "../styles/yjs.css"; -import Room, { +import { + Room, type LauncherFacade, type Participant, WhoIsOnline, -} from "@superviz/sdk"; +} from "../lib/sdk"; import { useCallback, useEffect, useMemo, useRef, useState } from "react"; import Editor from "@monaco-editor/react"; -const id = Math.floor(Math.random() * 1000000); +const SUPERVIZ_KEY = getConfig("keys.superviz"); +const SUPERVIZ_ROOM_PREFIX = getConfig("roomPrefix"); + +const componentName = "yjs-monaco-wio"; function setStyles( states: Map>, @@ -44,109 +52,107 @@ function setStyles( return idsList; } -export function YjsWithMonaco() { +export function YjsMonacoWio() { const ydoc = useMemo(() => new Y.Doc(), []); - const [editor, setEditor] = useState(null); + const [editor, setEditor] = useState(null); const [localParticipant, setLocalParticipant] = useState>(); - - const provider = useRef(new SuperVizYjsProvider(ydoc)); - const wio = useRef(); - const [ids, setIds] = useState(new Set()); + const [joinedRoom, setJoinedRoom] = useState(false); + const room = useRef(); + const provider = useMemo( + () => new SuperVizYjsProvider(ydoc), + [ydoc] + ); + const wio = useRef(); const loaded = useRef(false); - const [room, setRoom] = useState(null); - - const [joinedRoom, setJoinedRoom] = useState(false); - useEffect(() => { + const initializeSuperViz = useCallback(async () => { if (loaded.current) return; loaded.current = true; - wio.current = new WhoIsOnline(); + const uuid = generateId(); + + room.current = await Room(SUPERVIZ_KEY, { + roomId: `${SUPERVIZ_ROOM_PREFIX}-${componentName}`, + participant: { + name: "Participant", + id: uuid, + }, + group: { + name: SUPERVIZ_ROOM_PREFIX, + id: SUPERVIZ_ROOM_PREFIX, + }, + environment: "dev", + debug: true, + }); - (async () => { - if (room) return; - - const newRoom = await Room("90xbxrp4tra3hrkbw5y1sq7sw5cj9v", { - group: { - id: "yjs-monaco", - name: "Yjs Monaco", - }, - participant: { - id: `ian-yjs-${id}`, - name: `Ian Yjs ${id}`, - }, - roomId: "yjs-monaco", - environment: "dev", - debug: true, - }); + wio.current = new WhoIsOnline(); - newRoom.subscribe("participant.updated", (data) => { - if (!data.slot?.index) return; + room.current.subscribe("participant.updated", (data) => { + if (!data.slot?.index) return; - provider.current.awareness?.setLocalStateField("participant", { - id: data.id, - slot: data.slot, - name: data.name, - }); + provider.awareness?.setLocalStateField("participant", { + id: data.id, + slot: data.slot, + name: data.name, + }); - setLocalParticipant({ - id: data.id, - slot: data.slot, - name: data.name, - }); + setLocalParticipant({ + id: data.id, + slot: data.slot, + name: data.name, }); + }); - const style = document.createElement("style"); - style.id = "sv-yjs-monaco"; - document.head.appendChild(style); + const style = document.createElement("style"); + style.id = "sv-yjs-monaco"; + document.head.appendChild(style); + }, [provider.awareness]); - setRoom(newRoom); - })(); + useEffect(() => { + initializeSuperViz(); return () => { - room?.destroy(); + room.current?.removeComponent(wio.current); + room.current?.removeComponent(provider); + room.current?.destroy(); }; - }, [room]); + }, [initializeSuperViz, provider]); const joinRoom = useCallback(() => { - if (joinedRoom || !room) return; + if (joinedRoom || !room.current) return; setJoinedRoom(true); if (localParticipant) { - provider.current.awareness?.setLocalStateField( - "participant", - localParticipant - ); + provider.awareness?.setLocalStateField("participant", localParticipant); } const updateStyles = () => { - const states = provider.current.awareness?.getStates(); + const states = provider.awareness?.getStates(); const idsList = setStyles(states, ids); setIds(new Set(idsList)); }; - provider.current.on("connect", updateStyles); - provider.current.awareness?.on("update", updateStyles); + provider.on("connect", updateStyles); + provider.awareness?.on("update", updateStyles); - room.addComponent(provider.current); - room.addComponent(wio.current); - }, [room, joinedRoom, setIds, ids, localParticipant]); + room.current.addComponent(provider); + room.current.addComponent(wio.current); + }, [room, joinedRoom, setIds, ids, localParticipant, provider]); const leaveRoom = useCallback(() => { - if (!joinedRoom || !room) return; + if (!joinedRoom || !room.current) return; setJoinedRoom(false); setIds(new Set()); - room.removeComponent(wio.current); - room.removeComponent(provider.current); - }, [room, joinedRoom]); + room.current.removeComponent(wio.current); + room.current.removeComponent(provider); + }, [room, joinedRoom, provider]); - // this effect manages the lifetime of the editor binding useEffect(() => { if (!provider || editor == null) return; @@ -154,7 +160,7 @@ export function YjsWithMonaco() { ydoc.getText("monaco"), editor.getModel()!, new Set([editor]), - provider.current.awareness + provider.awareness ); return () => { binding.destroy(); diff --git a/apps/playground/src/pages/yjs-quill-wio.tsx b/apps/playground/src/pages/yjs-quill-wio.tsx index e5a57fb..351a008 100644 --- a/apps/playground/src/pages/yjs-quill-wio.tsx +++ b/apps/playground/src/pages/yjs-quill-wio.tsx @@ -1,6 +1,7 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import * as Y from "yjs"; import { SuperVizYjsProvider } from "@superviz/yjs"; +import { v4 as generateId } from "uuid"; import "../styles/yjs.css"; import Room, { @@ -14,10 +15,14 @@ import ReactQuill, { Quill } from "react-quill-new"; import { QuillBinding } from "y-quill"; import "react-quill-new/dist/quill.snow.css"; import QuillCursors from "quill-cursors"; +import { getConfig } from "../config"; Quill.register("modules/cursors", QuillCursors); -const id = Math.floor(Math.random() * 1000000); +const SUPERVIZ_KEY = getConfig("keys.superviz"); +const SUPERVIZ_ROOM_PREFIX = getConfig("roomPrefix"); + +const componentName = "yjs-quill-wio"; function setStyles( states: Map>, @@ -44,109 +49,106 @@ function setStyles( return idsList; } -export function YjsWithQuill() { +export function YjsQuillWio() { const ydoc = useMemo(() => new Y.Doc(), []); - const quillRef = useRef(null); - const [localParticipant, setLocalParticipant] = useState>(); - - const provider = useRef(new SuperVizYjsProvider(ydoc)); - const wio = useRef(); - const [ids, setIds] = useState(new Set()); + const [joinedRoom, setJoinedRoom] = useState(false); + const room = useRef(); + const quillRef = useRef(null); + const provider = useMemo( + () => new SuperVizYjsProvider(ydoc), + [ydoc] + ); + const wio = useRef(); const loaded = useRef(false); - const [room, setRoom] = useState(null); - const [joinedRoom, setJoinedRoom] = useState(false); - - useEffect(() => { + const initializeSuperViz = useCallback(async () => { if (loaded.current) return; loaded.current = true; - wio.current = new WhoIsOnline(); + const uuid = generateId(); + + room.current = await Room(SUPERVIZ_KEY, { + roomId: `${SUPERVIZ_ROOM_PREFIX}-${componentName}`, + participant: { + name: "Participant", + id: uuid, + }, + group: { + name: SUPERVIZ_ROOM_PREFIX, + id: SUPERVIZ_ROOM_PREFIX, + }, + environment: "dev", + debug: true, + }); - (async () => { - if (room) return; - - const newRoom = await Room("90xbxrp4tra3hrkbw5y1sq7sw5cj9v", { - group: { - id: "yjs-quill", - name: "Yjs Quill", - }, - participant: { - id: `ian-yjs-${id}`, - name: `Ian Yjs ${id}`, - }, - roomId: "yjs-quill", - environment: "dev", - debug: true, - }); + wio.current = new WhoIsOnline(); - newRoom.subscribe("participant.updated", (data) => { - if (!data.slot?.index) return; + room.current.subscribe("participant.updated", (data) => { + if (!data.slot?.index) return; - provider.current.awareness?.setLocalStateField("participant", { - id: data.id, - slot: data.slot, - name: data.name, - }); + provider.awareness?.setLocalStateField("participant", { + id: data.id, + slot: data.slot, + name: data.name, + }); - setLocalParticipant({ - id: data.id, - slot: data.slot, - name: data.name, - }); + setLocalParticipant({ + id: data.id, + slot: data.slot, + name: data.name, }); + }); - const style = document.createElement("style"); - style.id = "sv-yjs-quill"; - document.head.appendChild(style); + const style = document.createElement("style"); + style.id = "sv-yjs-quill"; + document.head.appendChild(style); + }, [provider.awareness]); - setRoom(newRoom); - })(); + useEffect(() => { + initializeSuperViz(); return () => { - room?.destroy(); + room.current?.removeComponent(wio.current); + room.current?.removeComponent(provider); + room.current?.destroy(); }; - }, [room]); + }, [initializeSuperViz, provider]); const joinRoom = useCallback(() => { - if (joinedRoom || !room) return; + if (joinedRoom || !room.current) return; setJoinedRoom(true); if (localParticipant) { - provider.current.awareness?.setLocalStateField( - "participant", - localParticipant - ); + provider.awareness?.setLocalStateField("participant", localParticipant); } const updateStyles = () => { - const states = provider.current.awareness?.getStates(); + const states = provider.awareness?.getStates(); const idsList = setStyles(states, ids); setIds(new Set(idsList)); }; - provider.current.on("connect", updateStyles); - provider.current.awareness?.on("update", updateStyles); + provider.on("connect", updateStyles); + provider.awareness?.on("update", updateStyles); - room.addComponent(provider.current); - room.addComponent(wio.current); - }, [room, joinedRoom, setIds, ids, localParticipant]); + room.current.addComponent(provider); + room.current.addComponent(wio.current); + }, [room, joinedRoom, setIds, ids, localParticipant, provider]); const leaveRoom = useCallback(() => { - if (!joinedRoom || !room) return; + if (!joinedRoom || !room.current) return; setJoinedRoom(false); - room.removeComponent(wio.current); - room.removeComponent(provider.current); - setIds(new Set()); - }, [room, joinedRoom]); + room.current.removeComponent(wio.current); + room.current.removeComponent(provider); + }, [room, joinedRoom, provider]); // this effect manages the lifetime of the editor binding useEffect(() => { @@ -155,7 +157,7 @@ export function YjsWithQuill() { const binding = new QuillBinding( ydoc.getText("quill"), quillRef.current.getEditor(), - provider.current.awareness + provider.awareness ); return () => { diff --git a/apps/playground/src/router/router.tsx b/apps/playground/src/router/router.tsx index d33546c..345e49b 100644 --- a/apps/playground/src/router/router.tsx +++ b/apps/playground/src/router/router.tsx @@ -15,8 +15,8 @@ import { MatterportWithWioCommentsAndVideo } from "../pages/matterport-with-wio- import { Video } from "../pages/video.tsx"; import { Three } from "../pages/three.tsx"; import { PointersCanvas } from "../pages/pointers-canvas.tsx"; -import { YjsWithMonaco } from "../pages/yjs-monaco-wio.tsx"; -import { YjsWithQuill } from "../pages/yjs-quill-wio.tsx"; +import { YjsMonacoWio } from "../pages/yjs-monaco-wio.tsx"; +import { YjsQuillWio } from "../pages/yjs-quill-wio.tsx"; export const routeList: RouteObject[] = [ { @@ -84,11 +84,11 @@ export const routeList: RouteObject[] = [ }, { path: "yjs-with-monaco", - element: , + element: , }, { path: "yjs-with-quill", - element: , + element: , }, ], }, From 041eed130a3779a9e27cd0f52da554e4c4d2e0ca Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Tue, 1 Oct 2024 06:57:19 -0300 Subject: [PATCH 44/76] chore(yjs): .releaserc file --- packages/yjs/.releaserc | 22 ++++++++++++++++++++++ packages/yjs/package.json | 12 ++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 packages/yjs/.releaserc diff --git a/packages/yjs/.releaserc b/packages/yjs/.releaserc new file mode 100644 index 0000000..3c6ee6c --- /dev/null +++ b/packages/yjs/.releaserc @@ -0,0 +1,22 @@ +{ + "branches": [ + "main", + { + "name": "beta", + "channel": "beta", + "prerelease": true + }, + { + "name": "lab", + "channel": "lab", + "prerelease": true + } + ], + "tagFormat": "@superviz/yjs/${version}", + "plugins": [ + "@semantic-release/commit-analyzer", + "semantic-release-version-file", + "@semantic-release/github", + "@semantic-release/npm" + ] +} diff --git a/packages/yjs/package.json b/packages/yjs/package.json index dda1e7c..ae9a5cc 100644 --- a/packages/yjs/package.json +++ b/packages/yjs/package.json @@ -22,10 +22,22 @@ "watch:code": "node ./.esbuild/watch.js", "watch:types": "./node_modules/typescript/bin/tsc --declaration --emitDeclarationOnly --declarationDir dist" }, + "publishConfig": { + "access": "public", + "scope": "@superviz" + }, + "repository": { + "type": "git", + "url": "https://github.com/SuperViz/superviz.git" + }, "type": "module", "keywords": [], "author": "", "license": "ISC", + "bugs": { + "url": "https://github.com/SuperViz/superviz/issues" + }, + "homepage": "https://github.com/SuperViz/superviz/tree/main/packages/yjs#readme", "dependencies": { "@superviz/eslint-config": "workspace:*", "@superviz/socket-client": "workspace:*", From 4c7cdf3f8373416ad98907d5d9ad1e190b52bf08 Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Tue, 1 Oct 2024 06:58:58 -0300 Subject: [PATCH 45/76] chore: color name in tailwind config --- apps/playground/tailwind.config.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/playground/tailwind.config.js b/apps/playground/tailwind.config.js index 667e5dc..e551231 100644 --- a/apps/playground/tailwind.config.js +++ b/apps/playground/tailwind.config.js @@ -5,11 +5,11 @@ export default { extend: { colors: { sv: { - primary: "#ffffff", - secondary: "#c1fbdf", - danger: "#e5411e", "primary-200": "#BAA9FF", "primary-900": "#380788", + white: "#ffffff", + secondary: "#c1fbdf", + danger: "#e5411e", "gray-100": "#FAFAFC", "gray-200": "#E9E5EF", "gray-300": "#C9C4D1", From cdb0d4a617dc89733662bb74b2142264a230dbf8 Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Tue, 1 Oct 2024 07:00:32 -0300 Subject: [PATCH 46/76] ci: remove unnecessary loaders --- packages/yjs/.esbuild/config.js | 8 -------- 1 file changed, 8 deletions(-) diff --git a/packages/yjs/.esbuild/config.js b/packages/yjs/.esbuild/config.js index 7c5212f..574c9e0 100644 --- a/packages/yjs/.esbuild/config.js +++ b/packages/yjs/.esbuild/config.js @@ -1,12 +1,4 @@ const config = { - loader: { - '.png': 'file', - '.svg': 'file', - '.woff': 'file', - '.woff2': 'file', - '.eot': 'file', - '.ttf': 'file', - }, bundle: true, color: true, minify: false, From 50db88ded693b016f703b855be2a9923c9391cc9 Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Tue, 1 Oct 2024 07:06:53 -0300 Subject: [PATCH 47/76] feat: add prefix to enums --- packages/yjs/src/provider/types.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/yjs/src/provider/types.ts b/packages/yjs/src/provider/types.ts index 621b417..9bcaec4 100644 --- a/packages/yjs/src/provider/types.ts +++ b/packages/yjs/src/provider/types.ts @@ -16,15 +16,15 @@ export type Params = { }; export enum ProviderState { - CONNECTED = 'connected', - CONNECTING = 'connecting', - DISCONNECTED = 'disconnected', + CONNECTED = 'provider.connected', + CONNECTING = 'provider.connecting', + DISCONNECTED = 'provider.disconnected', } export enum ProviderEvents { - MESSAGE_TO_HOST = 'message-to-host', - BROADCAST = 'broadcast', - UPDATE = 'update', + MESSAGE_TO_HOST = 'provider.message-to-host', + BROADCAST = 'provider.broadcast', + UPDATE = 'provider.update', } export type MessageToHost = { From bb7b47b976bd260942e7ff4c06d357005f0fbde1 Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Tue, 1 Oct 2024 07:11:03 -0300 Subject: [PATCH 48/76] refactor: subscribe to hasJoinedRoom instead of using recursion --- packages/yjs/src/provider/index.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/yjs/src/provider/index.ts b/packages/yjs/src/provider/index.ts index 4ef7b03..fee73a6 100644 --- a/packages/yjs/src/provider/index.ts +++ b/packages/yjs/src/provider/index.ts @@ -79,11 +79,7 @@ export class SuperVizYjsProvider extends ObservableV2 { } if (!hasJoinedRoom.value) { - this.logger.log(`${this.name} @ attach - not joined yet`); - setTimeout(() => { - this.logger.log(`${this.name} @ attach - retrying`); - this.attach(params); - }, 1000); + hasJoinedRoom.subscribe(() => this.attach(params)); return; } From a2f71bfb38b9486b46ca9c7f43cc5821a70882ab Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Tue, 1 Oct 2024 07:16:00 -0300 Subject: [PATCH 49/76] refactor: change _hostId to #hostId --- packages/yjs/src/provider/index.test.ts | 4 ++-- packages/yjs/src/services/host/index.test.ts | 20 ++++++++++---------- packages/yjs/src/services/host/index.ts | 14 +++++++------- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/packages/yjs/src/provider/index.test.ts b/packages/yjs/src/provider/index.test.ts index 8dc2eed..a3d67a9 100644 --- a/packages/yjs/src/provider/index.test.ts +++ b/packages/yjs/src/provider/index.test.ts @@ -320,7 +320,7 @@ describe('provider', () => { describe('onMessageToHost', () => { test('should apply and broadcast update', () => { const provider = createProvider(); - provider['hostService']!['_hostId'] = 'local-participant-id'; + provider['hostService']!['#hostId'] = 'local-participant-id'; const doc = new Y.Doc(); doc.getArray('test').insert(0, ['test']); @@ -490,7 +490,7 @@ describe('provider', () => { test('should do nothing if user is host', () => { const provider = createProvider(); provider['_synced'] = false; - provider['hostService']!['_hostId'] = 'local-participant-id'; + provider['hostService']!['#hostId'] = 'local-participant-id'; const doc = new Y.Doc(); doc.getArray('test').insert(0, ['test']); diff --git a/packages/yjs/src/services/host/index.test.ts b/packages/yjs/src/services/host/index.test.ts index 251bccd..acc3714 100644 --- a/packages/yjs/src/services/host/index.test.ts +++ b/packages/yjs/src/services/host/index.test.ts @@ -77,7 +77,7 @@ describe('HostService', () => { const hostId = ids[Math.floor(Math.random() * 2)]; const hostService = createHostService(); - hostService['_hostId'] = hostId; + hostService['#hostId'] = hostId; expect(hostService.isHost).toBe(hostId === participantId); }); @@ -85,7 +85,7 @@ describe('HostService', () => { test('should return hostId', () => { const hostService = createHostService(); const hostId = Math.floor(Math.random() * 100000); - hostService['_hostId'] = String(hostId); + hostService['#hostId'] = String(hostId); expect(hostService.hostId).toBe(String(hostId)); }); @@ -106,7 +106,7 @@ describe('HostService', () => { test('should early return if there is already a host', () => { const hostService = createHostService(); - hostService['_hostId'] = 'hostId'; + hostService['#hostId'] = 'hostId'; hostService['updateHost'] = jest.fn(); mockRoomHistoryOnce([ { @@ -221,7 +221,7 @@ describe('HostService', () => { hostService['setHostId']('hostId'); - expect(hostService['_hostId']).toBe('hostId'); + expect(hostService['#hostId']).toBe('hostId'); expect(callback).toHaveBeenCalledTimes(1); }); }); @@ -332,27 +332,27 @@ describe('HostService', () => { describe('onPresenceLeave', () => { test('should update host if the host leaves the room', () => { const hostService = createHostService(); - hostService['_hostId'] = 'hostId'; + hostService['#hostId'] = 'hostId'; hostService['updateHost'] = jest.fn(); hostService['onPresenceLeave']({ id: 'hostId', } as PresenceEvent); - expect(hostService['_hostId']).toBe(''); + expect(hostService['#hostId']).toBe(''); expect(hostService['updateHost']).toHaveBeenCalledTimes(1); }); test('should do nothing if the host does not leave the room', () => { const hostService = createHostService(); - hostService['_hostId'] = 'hostId'; + hostService['#hostId'] = 'hostId'; hostService['updateHost'] = jest.fn(); hostService['onPresenceLeave']({ id: 'anotherParticipant', } as PresenceEvent); - expect(hostService['_hostId']).toBe('hostId'); + expect(hostService['#hostId']).toBe('hostId'); expect(hostService['updateHost']).not.toHaveBeenCalled(); }); }); @@ -374,7 +374,7 @@ describe('HostService', () => { test('should do nothing if the hostId does not change', () => { const hostService = createHostService(); hostService['setHostId'] = jest.fn(); - hostService['_hostId'] = 'hostId'; + hostService['#hostId'] = 'hostId'; hostService['onStateChange']({ data: { @@ -400,7 +400,7 @@ describe('HostService', () => { test('should do nothing when host is already set', () => { const hostService = createHostService(); - hostService['_hostId'] = 'hostId'; + hostService['#hostId'] = 'hostId'; hostService['searchHost'] = jest.fn(); hostService['onPresenceEnter']({ diff --git a/packages/yjs/src/services/host/index.ts b/packages/yjs/src/services/host/index.ts index b663d51..a677653 100644 --- a/packages/yjs/src/services/host/index.ts +++ b/packages/yjs/src/services/host/index.ts @@ -4,7 +4,7 @@ import { PresenceEvent, Room, SocketEvent } from '@superviz/socket-client'; import { RoomEvent } from './types'; export class HostService { - private _hostId: string = ''; + #hostId: string = ''; private room: Room; private callback: (hostId: string) => void; @@ -32,7 +32,7 @@ export class HostService { * @returns {void} */ public destroy(): void { - this._hostId = ''; + this.#hostId = ''; this.room.presence.off('presence.leave'); this.room.presence.off('presence.joined-room'); @@ -49,7 +49,7 @@ export class HostService { * @returns {boolean} */ public get isHost(): boolean { - return this._hostId === this.participantId; + return this.#hostId === this.participantId; } /** @@ -58,7 +58,7 @@ export class HostService { * @returns {boolean} */ public get hostId(): string { - return this._hostId; + return this.#hostId; } /** @@ -73,7 +73,7 @@ export class HostService { return; } - if (this._hostId) return; + if (this.#hostId) return; this.room.presence.get((participants): void => { if (participants.length === 1 && participants[0].id === this.participantId) { @@ -105,7 +105,7 @@ export class HostService { * @returns {void} */ private setHostId(hostId: string): void { - this._hostId = hostId; + this.#hostId = hostId; if (this.callback) { this.callback(hostId); @@ -167,7 +167,7 @@ export class HostService { private onPresenceLeave = (presence: PresenceEvent): void => { if (presence.id !== this.hostId) return; - this._hostId = ''; + this.#hostId = ''; this.updateHost(); }; From b8153c874520b6248dd460e3683c6494011a98ab Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Tue, 1 Oct 2024 07:16:41 -0300 Subject: [PATCH 50/76] fix: give correct name and type to __yjs property in UpdatePresence interface --- packages/yjs/src/services/awareness/types.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/yjs/src/services/awareness/types.ts b/packages/yjs/src/services/awareness/types.ts index 74392ce..643db52 100644 --- a/packages/yjs/src/services/awareness/types.ts +++ b/packages/yjs/src/services/awareness/types.ts @@ -5,7 +5,7 @@ export enum UpdateOrigin { export interface UpdatePresence { clientID: number; - yjs_state: any; + __yjs: Record | null; } type AwarenessUpdate = { From 2d495a53ad753bf0fb84bfe5dc89df100b4c41c4 Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Tue, 1 Oct 2024 07:17:01 -0300 Subject: [PATCH 51/76] refactor: update enum string to use prefix in tests --- packages/yjs/src/provider/index.test.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/yjs/src/provider/index.test.ts b/packages/yjs/src/provider/index.test.ts index a3d67a9..1647d07 100644 --- a/packages/yjs/src/provider/index.test.ts +++ b/packages/yjs/src/provider/index.test.ts @@ -205,7 +205,7 @@ describe('provider', () => { describe('connect', () => { test('should listen to doc updates and start realtime', () => { const provider = createProvider(); - provider['state'] = 'disconnected'; + provider['state'] = 'provider.disconnected'; const onSpy = jest.spyOn(provider['doc'], 'on'); const startSpy = jest.spyOn(provider as any, 'startRealtime'); @@ -218,7 +218,7 @@ describe('provider', () => { test('should do nothing if already connected', () => { const provider = createProvider(); - provider['state'] = 'connected'; + provider['state'] = 'provider.connected'; const onSpy = jest.spyOn(provider['doc'], 'on'); const startSpy = jest.spyOn(provider as any, 'startRealtime'); @@ -309,9 +309,9 @@ describe('provider', () => { describe('changeState', () => { test('should change state', () => { const provider = createProvider(); - provider['state'] = 'disconnected'; + provider['state'] = 'provider.disconnected'; - provider['changeState']('connected'); + provider['changeState']('provider.connected'); expect(provider['state']).toEqual('connected'); }); @@ -404,7 +404,7 @@ describe('provider', () => { test('should do nothing if already connected', () => { const provider = createProvider(); - provider['state'] = 'connected'; + provider['state'] = 'provider.connected'; jest.clearAllMocks(); const connectSpy = jest.spyOn(provider['awareness'], 'connect'); @@ -531,7 +531,7 @@ describe('provider', () => { const provider = createProvider(); provider['emit'] = jest.fn(); - provider['onReceiveRealtimeMessage']('update', { update: new Uint8Array() }); + provider['onReceiveRealtimeMessage']('provider.update', { update: new Uint8Array() }); expect(provider['emit']).toHaveBeenCalledWith('message', [ { data: { update: new Uint8Array() }, name: 'update' }, @@ -544,7 +544,7 @@ describe('provider', () => { const provider = createProvider(); provider['emit'] = jest.fn(); - provider['beforeSendRealtimeMessage']('update', { update: new Uint8Array() }); + provider['beforeSendRealtimeMessage']('provider.update', { update: new Uint8Array() }); expect(provider['emit']).toHaveBeenCalledWith('outgoingMessage', [ { data: { update: new Uint8Array() }, name: 'update' }, From 388b1a63daef3570b76fd90d156416427a3b2425 Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Tue, 1 Oct 2024 08:09:04 -0300 Subject: [PATCH 52/76] tests(yjs): adapt tests after latest changes --- packages/yjs/src/provider/index.test.ts | 55 ++++++-------------- packages/yjs/src/services/host/index.test.ts | 21 ++++---- 2 files changed, 26 insertions(+), 50 deletions(-) diff --git a/packages/yjs/src/provider/index.test.ts b/packages/yjs/src/provider/index.test.ts index 1647d07..df61144 100644 --- a/packages/yjs/src/provider/index.test.ts +++ b/packages/yjs/src/provider/index.test.ts @@ -90,36 +90,13 @@ describe('provider', () => { provider.attach({ useStore: () => ({ isDomainWhitelisted: { value: true }, - hasJoinedRoom: { value: false }, + hasJoinedRoom: { value: false, subscribe: jest.fn() }, }), } as any); expect(provider['connect']).not.toHaveBeenCalled(); }); - test('should try to rettach if user has not joined room', () => { - jest.useFakeTimers(); - const provider = createProvider(); - provider['connect'] = jest.fn(); - - const value = { - value: false, - }; - provider.attach({ - useStore: () => ({ - isDomainWhitelisted: { value: true }, - hasJoinedRoom: value, - localParticipant: { value: { id: 'local-participant-id' } }, - }), - } as any); - - expect(provider['connect']).not.toHaveBeenCalled(); - value.value = true; - jest.advanceTimersByTime(2000); - - expect(provider['connect']).toHaveBeenCalled(); - }); - test('should throw error if param has undefined', () => { const provider = createProvider(); @@ -285,7 +262,7 @@ describe('provider', () => { provider['fetch'](); - expect(MOCK_ROOM.emit).toHaveBeenCalledWith('message-to-host', { + expect(MOCK_ROOM.emit).toHaveBeenCalledWith('provider.message-to-host', { update: state, }); }); @@ -294,15 +271,15 @@ describe('provider', () => { describe('updateDocument', () => { test('should apply updates to document', () => { const provider = createProvider(); - const update = Y.encodeStateAsUpdateV2(provider['doc']); + const doc = new Y.Doc(); + doc.getArray('test').insert(0, ['test']); + const update = Y.encodeStateAsUpdateV2(doc); + const previousState = Y.encodeStateAsUpdateV2(provider['doc']); provider['updateDocument'](update); + const newState = Y.encodeStateAsUpdateV2(provider['doc']); - const diff = Y.diffUpdate(update, Y.encodeStateAsUpdate(provider['doc'])); - - diff.forEach((d) => { - expect(d).toEqual(0); - }); + expect(newState).not.toEqual(previousState); }); }); @@ -313,14 +290,14 @@ describe('provider', () => { provider['changeState']('provider.connected'); - expect(provider['state']).toEqual('connected'); + expect(provider['state']).toEqual('provider.connected'); }); }); describe('onMessageToHost', () => { test('should apply and broadcast update', () => { const provider = createProvider(); - provider['hostService']!['#hostId'] = 'local-participant-id'; + provider['hostService']!['setHostId']('local-participant-id'); const doc = new Y.Doc(); doc.getArray('test').insert(0, ['test']); @@ -336,7 +313,7 @@ describe('provider', () => { const update = Y.encodeStateAsUpdateV2(provider['doc'], new Uint8Array(comingUpdate)); expect(provider['updateDocument']).toHaveBeenCalledWith(comingUpdate); - expect(MOCK_ROOM.emit).toHaveBeenCalledWith('broadcast', { + expect(MOCK_ROOM.emit).toHaveBeenCalledWith('provider.broadcast', { update, }); }); @@ -369,7 +346,7 @@ describe('provider', () => { provider['onDocUpdate'](update); - expect(MOCK_ROOM.emit).toHaveBeenCalledWith('update', { update }); + expect(MOCK_ROOM.emit).toHaveBeenCalledWith('provider.update', { update }); }); }); @@ -490,7 +467,7 @@ describe('provider', () => { test('should do nothing if user is host', () => { const provider = createProvider(); provider['_synced'] = false; - provider['hostService']!['#hostId'] = 'local-participant-id'; + provider['hostService']!['setHostId']('local-participant-id'); const doc = new Y.Doc(); doc.getArray('test').insert(0, ['test']); @@ -502,7 +479,7 @@ describe('provider', () => { } as SocketEvent); expect(provider['updateDocument']).not.toHaveBeenCalled(); - expect(provider.synced).toBe(false); + expect(provider.synced).toBe(true); }); }); @@ -534,7 +511,7 @@ describe('provider', () => { provider['onReceiveRealtimeMessage']('provider.update', { update: new Uint8Array() }); expect(provider['emit']).toHaveBeenCalledWith('message', [ - { data: { update: new Uint8Array() }, name: 'update' }, + { data: { update: new Uint8Array() }, name: 'provider.update' }, ]); }); }); @@ -547,7 +524,7 @@ describe('provider', () => { provider['beforeSendRealtimeMessage']('provider.update', { update: new Uint8Array() }); expect(provider['emit']).toHaveBeenCalledWith('outgoingMessage', [ - { data: { update: new Uint8Array() }, name: 'update' }, + { data: { update: new Uint8Array() }, name: 'provider.update' }, ]); }); }); diff --git a/packages/yjs/src/services/host/index.test.ts b/packages/yjs/src/services/host/index.test.ts index acc3714..4a5eb7d 100644 --- a/packages/yjs/src/services/host/index.test.ts +++ b/packages/yjs/src/services/host/index.test.ts @@ -77,7 +77,7 @@ describe('HostService', () => { const hostId = ids[Math.floor(Math.random() * 2)]; const hostService = createHostService(); - hostService['#hostId'] = hostId; + hostService['setHostId'](hostId); expect(hostService.isHost).toBe(hostId === participantId); }); @@ -85,8 +85,7 @@ describe('HostService', () => { test('should return hostId', () => { const hostService = createHostService(); const hostId = Math.floor(Math.random() * 100000); - hostService['#hostId'] = String(hostId); - + hostService['setHostId'](String(hostId)); expect(hostService.hostId).toBe(String(hostId)); }); }); @@ -106,7 +105,7 @@ describe('HostService', () => { test('should early return if there is already a host', () => { const hostService = createHostService(); - hostService['#hostId'] = 'hostId'; + hostService['setHostId']('hostId'); hostService['updateHost'] = jest.fn(); mockRoomHistoryOnce([ { @@ -221,7 +220,7 @@ describe('HostService', () => { hostService['setHostId']('hostId'); - expect(hostService['#hostId']).toBe('hostId'); + expect(hostService.hostId).toBe('hostId'); expect(callback).toHaveBeenCalledTimes(1); }); }); @@ -332,27 +331,27 @@ describe('HostService', () => { describe('onPresenceLeave', () => { test('should update host if the host leaves the room', () => { const hostService = createHostService(); - hostService['#hostId'] = 'hostId'; + hostService['setHostId']('hostId'); hostService['updateHost'] = jest.fn(); hostService['onPresenceLeave']({ id: 'hostId', } as PresenceEvent); - expect(hostService['#hostId']).toBe(''); + expect(hostService.hostId).toBe(''); expect(hostService['updateHost']).toHaveBeenCalledTimes(1); }); test('should do nothing if the host does not leave the room', () => { const hostService = createHostService(); - hostService['#hostId'] = 'hostId'; + hostService['setHostId']('hostId'); hostService['updateHost'] = jest.fn(); hostService['onPresenceLeave']({ id: 'anotherParticipant', } as PresenceEvent); - expect(hostService['#hostId']).toBe('hostId'); + expect(hostService.hostId).toBe('hostId'); expect(hostService['updateHost']).not.toHaveBeenCalled(); }); }); @@ -373,8 +372,8 @@ describe('HostService', () => { test('should do nothing if the hostId does not change', () => { const hostService = createHostService(); + hostService['setHostId']('hostId'); hostService['setHostId'] = jest.fn(); - hostService['#hostId'] = 'hostId'; hostService['onStateChange']({ data: { @@ -400,7 +399,7 @@ describe('HostService', () => { test('should do nothing when host is already set', () => { const hostService = createHostService(); - hostService['#hostId'] = 'hostId'; + hostService['setHostId']('hostId'); hostService['searchHost'] = jest.fn(); hostService['onPresenceEnter']({ From 3be3e501a168e0b3a8b86404ba1863b084329894 Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Tue, 1 Oct 2024 08:42:12 -0300 Subject: [PATCH 53/76] fix: make dependency array empty so room is only destroyed when component is unmounted --- apps/playground/src/pages/yjs-monaco-wio.tsx | 2 +- apps/playground/src/pages/yjs-quill-wio.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/playground/src/pages/yjs-monaco-wio.tsx b/apps/playground/src/pages/yjs-monaco-wio.tsx index d871f46..185600c 100644 --- a/apps/playground/src/pages/yjs-monaco-wio.tsx +++ b/apps/playground/src/pages/yjs-monaco-wio.tsx @@ -120,7 +120,7 @@ export function YjsMonacoWio() { room.current?.removeComponent(provider); room.current?.destroy(); }; - }, [initializeSuperViz, provider]); + }, []); const joinRoom = useCallback(() => { if (joinedRoom || !room.current) return; diff --git a/apps/playground/src/pages/yjs-quill-wio.tsx b/apps/playground/src/pages/yjs-quill-wio.tsx index 351a008..881c276 100644 --- a/apps/playground/src/pages/yjs-quill-wio.tsx +++ b/apps/playground/src/pages/yjs-quill-wio.tsx @@ -117,7 +117,7 @@ export function YjsQuillWio() { room.current?.removeComponent(provider); room.current?.destroy(); }; - }, [initializeSuperViz, provider]); + }, []); const joinRoom = useCallback(() => { if (joinedRoom || !room.current) return; From 3b00d5fe6b1738dc4e29bf9a274c6aedac5367f5 Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Tue, 1 Oct 2024 08:45:59 -0300 Subject: [PATCH 54/76] cleanup: unused enum and interface --- packages/yjs/src/provider/types.ts | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/packages/yjs/src/provider/types.ts b/packages/yjs/src/provider/types.ts index 9bcaec4..87b99dc 100644 --- a/packages/yjs/src/provider/types.ts +++ b/packages/yjs/src/provider/types.ts @@ -1,16 +1,6 @@ import type { StoreType } from '@superviz/sdk'; import type { Room } from '@superviz/socket-client'; -export enum EnvironmentTypes { - DEV = 'dev', - PROD = 'prod', -} - -export interface Participant { - id: string; - name: string; -} - export type Params = { awareness?: boolean; }; From e158f51401de52fda3723842dd2dfc2c44547615 Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Tue, 1 Oct 2024 11:22:12 -0300 Subject: [PATCH 55/76] ci: semantic-release script yjs --- packages/yjs/package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/yjs/package.json b/packages/yjs/package.json index ae9a5cc..bfd3d13 100644 --- a/packages/yjs/package.json +++ b/packages/yjs/package.json @@ -20,7 +20,8 @@ "postbuild": "./node_modules/typescript/bin/tsc --declaration --emitDeclarationOnly --declarationDir dist", "watch": "concurrently -n code,types \"pnpm watch:code\" \"pnpm watch:types\"", "watch:code": "node ./.esbuild/watch.js", - "watch:types": "./node_modules/typescript/bin/tsc --declaration --emitDeclarationOnly --declarationDir dist" + "watch:types": "./node_modules/typescript/bin/tsc --declaration --emitDeclarationOnly --declarationDir dist", + "semantic-release": "semantic-release" }, "publishConfig": { "access": "public", From a1766f9e399b919bda7686fabf933a37c151d382 Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Tue, 1 Oct 2024 12:11:12 -0300 Subject: [PATCH 56/76] fix: give correct name to yjs provider component --- packages/yjs/src/provider/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/yjs/src/provider/index.ts b/packages/yjs/src/provider/index.ts index fee73a6..351178a 100644 --- a/packages/yjs/src/provider/index.ts +++ b/packages/yjs/src/provider/index.ts @@ -1,4 +1,4 @@ -import { Participant } from '@superviz/sdk'; +import type { Participant } from '@superviz/sdk'; import type { DefaultAttachComponentOptions } from '@superviz/sdk/dist/components/base/types'; import type { IOC } from '@superviz/sdk/dist/services/io'; import { @@ -28,7 +28,7 @@ import { } from './types'; export class SuperVizYjsProvider extends ObservableV2 { - public readonly name = 'presence'; + public readonly name = 'yjsProvider'; public awareness: Awareness; public document: Y.Doc; From 924700ad6bdb0ff774c10b4e3d59be74df37a777 Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Tue, 1 Oct 2024 12:13:31 -0300 Subject: [PATCH 57/76] fix: load color of participants when join awareness --- apps/playground/src/pages/yjs-monaco-wio.tsx | 1 + apps/playground/src/pages/yjs-quill-wio.tsx | 1 + 2 files changed, 2 insertions(+) diff --git a/apps/playground/src/pages/yjs-monaco-wio.tsx b/apps/playground/src/pages/yjs-monaco-wio.tsx index 185600c..2f4cff7 100644 --- a/apps/playground/src/pages/yjs-monaco-wio.tsx +++ b/apps/playground/src/pages/yjs-monaco-wio.tsx @@ -139,6 +139,7 @@ export function YjsMonacoWio() { provider.on("connect", updateStyles); provider.awareness?.on("update", updateStyles); + provider.awareness?.once("change", updateStyles); room.current.addComponent(provider); room.current.addComponent(wio.current); diff --git a/apps/playground/src/pages/yjs-quill-wio.tsx b/apps/playground/src/pages/yjs-quill-wio.tsx index 881c276..a407cb4 100644 --- a/apps/playground/src/pages/yjs-quill-wio.tsx +++ b/apps/playground/src/pages/yjs-quill-wio.tsx @@ -136,6 +136,7 @@ export function YjsQuillWio() { provider.on("connect", updateStyles); provider.awareness?.on("update", updateStyles); + provider.awareness?.once("change", updateStyles); room.current.addComponent(provider); room.current.addComponent(wio.current); From a7dbfd97df5bb085c2569010c738674e92393b9d Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Wed, 2 Oct 2024 10:00:09 -0300 Subject: [PATCH 58/76] fix: pnpm plugin to semantic release --- packages/socket-client/.releaserc | 17 +++++++++++++---- packages/socket-client/package.json | 1 + 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/packages/socket-client/.releaserc b/packages/socket-client/.releaserc index 60f6936..ff9c020 100644 --- a/packages/socket-client/.releaserc +++ b/packages/socket-client/.releaserc @@ -1,14 +1,23 @@ { "branches": [ - "main", - { "name": "beta", "channel": "beta", "prerelease": true }, - { "name": "lab", "channel": "lab", "prerelease": true } + "main", + { + "name": "beta", + "channel": "beta", + "prerelease": true + }, + { + "name": "lab", + "channel": "lab", + "prerelease": true + } ], "tagFormat": "@superviz/socket-client/${version}", "plugins": [ "@semantic-release/commit-analyzer", "semantic-release-version-file", "@semantic-release/github", - "@semantic-release/npm" + "@semantic-release/npm", + "@anolilab/semantic-release-pnpm" ] } diff --git a/packages/socket-client/package.json b/packages/socket-client/package.json index 2dfe459..1631113 100644 --- a/packages/socket-client/package.json +++ b/packages/socket-client/package.json @@ -35,6 +35,7 @@ }, "homepage": "https://github.com/SuperViz/superviz/tree/main/packages/socket-client#readme", "devDependencies": { + "@anolilab/semantic-release-pnpm": "^1.1.3", "@superviz/eslint-config": "workspace:*", "@superviz/typescript-config": "workspace:*", "@types/debug": "^4.1.12", From cef56d035e5dab72ff9e94a3632f88659acc3507 Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Wed, 2 Oct 2024 10:31:20 -0300 Subject: [PATCH 59/76] fix: semantic release in debug mode --- packages/socket-client/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/socket-client/package.json b/packages/socket-client/package.json index 1631113..104211b 100644 --- a/packages/socket-client/package.json +++ b/packages/socket-client/package.json @@ -18,7 +18,7 @@ "watch": "concurrently -n code,types \"pnpm watch:code\" \"pnpm watch:types\"", "watch:code": "node ./.esbuild/watch.js", "watch:types": "./node_modules/typescript/bin/tsc --watch --outDir dist", - "semantic-release": "semantic-release" + "semantic-release": "semantic-release --debug" }, "publishConfig": { "access": "public", From d73ff2a5b1c98f9b5c1e595b5d81b29bd591f12a Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Wed, 2 Oct 2024 11:06:13 -0300 Subject: [PATCH 60/76] feat: build with pnpm, publish with npm --- .github/workflows/socket-client.ci.yml | 2 +- packages/socket-client/.releaserc | 3 +-- packages/socket-client/package.json | 1 - 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/socket-client.ci.yml b/.github/workflows/socket-client.ci.yml index e574e70..22d75bd 100644 --- a/.github/workflows/socket-client.ci.yml +++ b/.github/workflows/socket-client.ci.yml @@ -33,7 +33,7 @@ jobs: - run: git config --global user.name SuperViz - run: git config --global user.email ci@superviz.com - name: Publish npm package - run: npm whoami && pnpm run semantic-release --filter=@superviz/socket-client + run: npm whoami && npm run semantic-release --filter=@superviz/socket-client env: NPM_CONFIG_USERCONFIG: .npmrc.ci GITHUB_TOKEN: ${{ secrets.TOKEN_GITHUB }} diff --git a/packages/socket-client/.releaserc b/packages/socket-client/.releaserc index ff9c020..3cda464 100644 --- a/packages/socket-client/.releaserc +++ b/packages/socket-client/.releaserc @@ -17,7 +17,6 @@ "@semantic-release/commit-analyzer", "semantic-release-version-file", "@semantic-release/github", - "@semantic-release/npm", - "@anolilab/semantic-release-pnpm" + "@semantic-release/npm" ] } diff --git a/packages/socket-client/package.json b/packages/socket-client/package.json index 104211b..8bf430d 100644 --- a/packages/socket-client/package.json +++ b/packages/socket-client/package.json @@ -35,7 +35,6 @@ }, "homepage": "https://github.com/SuperViz/superviz/tree/main/packages/socket-client#readme", "devDependencies": { - "@anolilab/semantic-release-pnpm": "^1.1.3", "@superviz/eslint-config": "workspace:*", "@superviz/typescript-config": "workspace:*", "@types/debug": "^4.1.12", From 2a54f2f9fa4c09ea80fad6ab70b7f15238cad88a Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Wed, 2 Oct 2024 15:29:10 -0300 Subject: [PATCH 61/76] feat: build with pnpm --- .github/workflows/socket-client.ci.yml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/workflows/socket-client.ci.yml b/.github/workflows/socket-client.ci.yml index 22d75bd..1f580d1 100644 --- a/.github/workflows/socket-client.ci.yml +++ b/.github/workflows/socket-client.ci.yml @@ -6,8 +6,8 @@ on: - beta - main paths: - - 'packages/socket-client/**' - - '.github/workflows/socket-client.ci.yml' + - "packages/socket-client/**" + - ".github/workflows/socket-client.ci.yml" jobs: package: runs-on: ubuntu-latest @@ -24,12 +24,14 @@ jobs: uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} - cache: 'pnpm' + cache: "pnpm" - name: Install dependencies run: pnpm install --no-frozen-lockfile env: NPM_CONFIG_USERCONFIG: .npmrc.ci NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + - name: Build package + run: pnpm run build --filter=@superviz/socket-client - run: git config --global user.name SuperViz - run: git config --global user.email ci@superviz.com - name: Publish npm package @@ -50,4 +52,4 @@ jobs: SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }} SLACK_ICON: https://avatars.slack-edge.com/2020-11-18/1496892993975_af721d1c045bea2d5a46_48.png MSG_MINIMAL: true - SLACK_USERNAME: Deploy socket client version ${{ github.ref_name }} \ No newline at end of file + SLACK_USERNAME: Deploy socket client version ${{ github.ref_name }} From 36bbeca7d7e86098f050f8e32db2a9549ac47db4 Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Wed, 2 Oct 2024 16:42:43 -0300 Subject: [PATCH 62/76] fix: remove --debug flag --- packages/socket-client/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/socket-client/package.json b/packages/socket-client/package.json index 8bf430d..2dfe459 100644 --- a/packages/socket-client/package.json +++ b/packages/socket-client/package.json @@ -18,7 +18,7 @@ "watch": "concurrently -n code,types \"pnpm watch:code\" \"pnpm watch:types\"", "watch:code": "node ./.esbuild/watch.js", "watch:types": "./node_modules/typescript/bin/tsc --watch --outDir dist", - "semantic-release": "semantic-release --debug" + "semantic-release": "semantic-release" }, "publishConfig": { "access": "public", From 50ef54900a74116d5b993913d72dc851af471aa5 Mon Sep 17 00:00:00 2001 From: Ian Silva Date: Wed, 2 Oct 2024 17:17:45 -0300 Subject: [PATCH 63/76] fix: revert socket client ci --- .github/workflows/socket-client.ci.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/socket-client.ci.yml b/.github/workflows/socket-client.ci.yml index 1f580d1..3e14afe 100644 --- a/.github/workflows/socket-client.ci.yml +++ b/.github/workflows/socket-client.ci.yml @@ -30,12 +30,10 @@ jobs: env: NPM_CONFIG_USERCONFIG: .npmrc.ci NPM_TOKEN: ${{ secrets.NPM_TOKEN }} - - name: Build package - run: pnpm run build --filter=@superviz/socket-client - run: git config --global user.name SuperViz - run: git config --global user.email ci@superviz.com - name: Publish npm package - run: npm whoami && npm run semantic-release --filter=@superviz/socket-client + run: npm whoami && pnpm run semantic-release --filter=@superviz/socket-client env: NPM_CONFIG_USERCONFIG: .npmrc.ci GITHUB_TOKEN: ${{ secrets.TOKEN_GITHUB }} From b35ce374240d75c260a8dbecb4ecbedcc50ab108 Mon Sep 17 00:00:00 2001 From: Carlos Date: Wed, 2 Oct 2024 20:01:09 -0300 Subject: [PATCH 64/76] fix: semmantic-release steps --- .github/workflows/autodesk.ci.yml | 2 + .github/workflows/matterport.ci.yml | 2 + .github/workflows/react.ci.yml | 2 + .github/workflows/realtime.ci.yml | 2 + .github/workflows/sdk.ci.yml | 2 + .github/workflows/socket-client.ci.yml | 2 + .github/workflows/three.ci.yml | 2 + .github/workflows/yjs.ci.yml | 2 + apps/playground/yarn.lock | 2486 ------- packages/autodesk/.releaserc | 2 +- packages/autodesk/package.json | 1 + packages/matterport/.releaserc | 2 +- packages/matterport/package.json | 1 + packages/react/.releaserc | 2 +- packages/react/package.json | 2 +- packages/realtime/.releaserc | 2 +- packages/realtime/package.json | 2 +- packages/sdk/.releaserc | 2 +- packages/sdk/package.json | 2 +- .../semmatic-release-version-file/index.js | 23 + .../package.json | 6 + packages/socket-client/.releaserc | 2 +- packages/socket-client/package.json | 2 +- packages/three/.releaserc | 2 +- packages/three/package.json | 1 + packages/three/yarn.lock | 6153 ----------------- packages/yjs/.releaserc | 2 +- packages/yjs/package.json | 1 + pnpm-lock.yaml | 38 +- 29 files changed, 87 insertions(+), 8663 deletions(-) delete mode 100644 apps/playground/yarn.lock create mode 100644 packages/semmatic-release-version-file/index.js create mode 100644 packages/semmatic-release-version-file/package.json delete mode 100644 packages/three/yarn.lock diff --git a/.github/workflows/autodesk.ci.yml b/.github/workflows/autodesk.ci.yml index 0c05558..d0aefe5 100644 --- a/.github/workflows/autodesk.ci.yml +++ b/.github/workflows/autodesk.ci.yml @@ -30,6 +30,8 @@ jobs: env: NPM_CONFIG_USERCONFIG: .npmrc.ci NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + - name: Build Package + run: pnpm run build - run: git config --global user.name SuperViz - run: git config --global user.email ci@superviz.com - name: Publish npm package diff --git a/.github/workflows/matterport.ci.yml b/.github/workflows/matterport.ci.yml index bf345ae..c7c4522 100644 --- a/.github/workflows/matterport.ci.yml +++ b/.github/workflows/matterport.ci.yml @@ -30,6 +30,8 @@ jobs: env: NPM_CONFIG_USERCONFIG: .npmrc.ci NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + - name: Build package + run: pnpm run build - run: git config --global user.name SuperViz - run: git config --global user.email ci@superviz.com - name: Publish npm package diff --git a/.github/workflows/react.ci.yml b/.github/workflows/react.ci.yml index 03b31ea..9c3b5f6 100644 --- a/.github/workflows/react.ci.yml +++ b/.github/workflows/react.ci.yml @@ -30,6 +30,8 @@ jobs: env: NPM_CONFIG_USERCONFIG: .npmrc.ci NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + - name: Build Package + run: pnpm run build - run: git config --global user.name SuperViz - run: git config --global user.email ci@superviz.com - name: Publish npm package diff --git a/.github/workflows/realtime.ci.yml b/.github/workflows/realtime.ci.yml index 9a45821..1e6288e 100644 --- a/.github/workflows/realtime.ci.yml +++ b/.github/workflows/realtime.ci.yml @@ -30,6 +30,8 @@ jobs: env: NPM_CONFIG_USERCONFIG: .npmrc.ci NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + - name: Build package + run: pnpm run build - name: Create a .remote-config.js file run: | touch .remote-config.js && echo "echo \"module.exports = { remoteConfig: { apiUrl: 'https://api.superviz.com', version: 'prod'}};\" > .remote-config.js" | bash - diff --git a/.github/workflows/sdk.ci.yml b/.github/workflows/sdk.ci.yml index 418a4ef..31fda8e 100644 --- a/.github/workflows/sdk.ci.yml +++ b/.github/workflows/sdk.ci.yml @@ -30,6 +30,8 @@ jobs: env: NPM_CONFIG_USERCONFIG: .npmrc.ci NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + - name: Build package + run: pnpm run build - name: Create a .remote-config.js file run: | touch packages/sdk/.remote-config.js && echo "echo \"module.exports = { remoteConfig: { apiUrl: 'https://api.superviz.com', conferenceLayerUrl: 'https://video-frame.superviz.com/lab/index.html'}};\" > .remote-config.js" | bash - diff --git a/.github/workflows/socket-client.ci.yml b/.github/workflows/socket-client.ci.yml index 3e14afe..6547f23 100644 --- a/.github/workflows/socket-client.ci.yml +++ b/.github/workflows/socket-client.ci.yml @@ -30,6 +30,8 @@ jobs: env: NPM_CONFIG_USERCONFIG: .npmrc.ci NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + - name: Build package + run: pnpm run build - run: git config --global user.name SuperViz - run: git config --global user.email ci@superviz.com - name: Publish npm package diff --git a/.github/workflows/three.ci.yml b/.github/workflows/three.ci.yml index 08a806a..6657373 100644 --- a/.github/workflows/three.ci.yml +++ b/.github/workflows/three.ci.yml @@ -32,6 +32,8 @@ jobs: NPM_TOKEN: ${{ secrets.NPM_TOKEN }} - run: git config --global user.name SuperViz - run: git config --global user.email ci@superviz.com + - name: Build package + run: pnpm run build - name: Publish npm package run: npm whoami && pnpm run semantic-release --filter=@superviz/threejs-plugin env: diff --git a/.github/workflows/yjs.ci.yml b/.github/workflows/yjs.ci.yml index 2cbe8f0..e2d3d42 100644 --- a/.github/workflows/yjs.ci.yml +++ b/.github/workflows/yjs.ci.yml @@ -30,6 +30,8 @@ jobs: env: NPM_CONFIG_USERCONFIG: .npmrc.ci NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + - name: Build package + run: pnpm run build - run: git config --global user.name SuperViz - run: git config --global user.email ci@superviz.com - name: Publish npm package diff --git a/apps/playground/yarn.lock b/apps/playground/yarn.lock deleted file mode 100644 index c57a670..0000000 --- a/apps/playground/yarn.lock +++ /dev/null @@ -1,2486 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@alloc/quick-lru@^5.2.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" - integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== - -"@ampproject/remapping@^2.2.0": - version "2.3.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" - integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== - dependencies: - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.24" - -"@babel/code-frame@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465" - integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== - dependencies: - "@babel/highlight" "^7.24.7" - picocolors "^1.0.0" - -"@babel/compat-data@^7.25.2": - version "7.25.2" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.25.2.tgz#e41928bd33475305c586f6acbbb7e3ade7a6f7f5" - integrity sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ== - -"@babel/core@^7.24.5": - version "7.25.2" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.25.2.tgz#ed8eec275118d7613e77a352894cd12ded8eba77" - integrity sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.24.7" - "@babel/generator" "^7.25.0" - "@babel/helper-compilation-targets" "^7.25.2" - "@babel/helper-module-transforms" "^7.25.2" - "@babel/helpers" "^7.25.0" - "@babel/parser" "^7.25.0" - "@babel/template" "^7.25.0" - "@babel/traverse" "^7.25.2" - "@babel/types" "^7.25.2" - convert-source-map "^2.0.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.3" - semver "^6.3.1" - -"@babel/generator@^7.25.0": - version "7.25.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.0.tgz#f858ddfa984350bc3d3b7f125073c9af6988f18e" - integrity sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw== - dependencies: - "@babel/types" "^7.25.0" - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.25" - jsesc "^2.5.1" - -"@babel/helper-compilation-targets@^7.25.2": - version "7.25.2" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz#e1d9410a90974a3a5a66e84ff55ef62e3c02d06c" - integrity sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw== - dependencies: - "@babel/compat-data" "^7.25.2" - "@babel/helper-validator-option" "^7.24.8" - browserslist "^4.23.1" - lru-cache "^5.1.1" - semver "^6.3.1" - -"@babel/helper-module-imports@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz#f2f980392de5b84c3328fc71d38bd81bbb83042b" - integrity sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA== - dependencies: - "@babel/traverse" "^7.24.7" - "@babel/types" "^7.24.7" - -"@babel/helper-module-transforms@^7.25.2": - version "7.25.2" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz#ee713c29768100f2776edf04d4eb23b8d27a66e6" - integrity sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ== - dependencies: - "@babel/helper-module-imports" "^7.24.7" - "@babel/helper-simple-access" "^7.24.7" - "@babel/helper-validator-identifier" "^7.24.7" - "@babel/traverse" "^7.25.2" - -"@babel/helper-plugin-utils@^7.24.7": - version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz#94ee67e8ec0e5d44ea7baeb51e571bd26af07878" - integrity sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg== - -"@babel/helper-simple-access@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz#bcade8da3aec8ed16b9c4953b74e506b51b5edb3" - integrity sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg== - dependencies: - "@babel/traverse" "^7.24.7" - "@babel/types" "^7.24.7" - -"@babel/helper-string-parser@^7.24.8": - version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d" - integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ== - -"@babel/helper-validator-identifier@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" - integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== - -"@babel/helper-validator-option@^7.24.8": - version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz#3725cdeea8b480e86d34df15304806a06975e33d" - integrity sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q== - -"@babel/helpers@^7.25.0": - version "7.25.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.25.0.tgz#e69beb7841cb93a6505531ede34f34e6a073650a" - integrity sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw== - dependencies: - "@babel/template" "^7.25.0" - "@babel/types" "^7.25.0" - -"@babel/highlight@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d" - integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== - dependencies: - "@babel/helper-validator-identifier" "^7.24.7" - chalk "^2.4.2" - js-tokens "^4.0.0" - picocolors "^1.0.0" - -"@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.25.0", "@babel/parser@^7.25.3": - version "7.25.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.3.tgz#91fb126768d944966263f0657ab222a642b82065" - integrity sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw== - dependencies: - "@babel/types" "^7.25.2" - -"@babel/plugin-transform-react-jsx-self@^7.24.5": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.7.tgz#66bff0248ea0b549972e733516ffad577477bdab" - integrity sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-transform-react-jsx-source@^7.24.1": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.7.tgz#1198aab2548ad19582013815c938d3ebd8291ee3" - integrity sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/template@^7.25.0": - version "7.25.0" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.0.tgz#e733dc3134b4fede528c15bc95e89cb98c52592a" - integrity sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q== - dependencies: - "@babel/code-frame" "^7.24.7" - "@babel/parser" "^7.25.0" - "@babel/types" "^7.25.0" - -"@babel/traverse@^7.24.7", "@babel/traverse@^7.25.2": - version "7.25.3" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.3.tgz#f1b901951c83eda2f3e29450ce92743783373490" - integrity sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ== - dependencies: - "@babel/code-frame" "^7.24.7" - "@babel/generator" "^7.25.0" - "@babel/parser" "^7.25.3" - "@babel/template" "^7.25.0" - "@babel/types" "^7.25.2" - debug "^4.3.1" - globals "^11.1.0" - -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.24.7", "@babel/types@^7.25.0", "@babel/types@^7.25.2": - version "7.25.2" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.2.tgz#55fb231f7dc958cd69ea141a4c2997e819646125" - integrity sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q== - dependencies: - "@babel/helper-string-parser" "^7.24.8" - "@babel/helper-validator-identifier" "^7.24.7" - to-fast-properties "^2.0.0" - -"@esbuild/aix-ppc64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" - integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== - -"@esbuild/android-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" - integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== - -"@esbuild/android-arm@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" - integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== - -"@esbuild/android-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" - integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== - -"@esbuild/darwin-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" - integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== - -"@esbuild/darwin-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" - integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== - -"@esbuild/freebsd-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" - integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== - -"@esbuild/freebsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" - integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== - -"@esbuild/linux-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" - integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== - -"@esbuild/linux-arm@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" - integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== - -"@esbuild/linux-ia32@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" - integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== - -"@esbuild/linux-loong64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" - integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== - -"@esbuild/linux-mips64el@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" - integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== - -"@esbuild/linux-ppc64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" - integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== - -"@esbuild/linux-riscv64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" - integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== - -"@esbuild/linux-s390x@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" - integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== - -"@esbuild/linux-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" - integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== - -"@esbuild/netbsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" - integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== - -"@esbuild/openbsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" - integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== - -"@esbuild/sunos-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" - integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== - -"@esbuild/win32-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" - integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== - -"@esbuild/win32-ia32@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" - integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== - -"@esbuild/win32-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" - integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== - -"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": - version "4.4.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" - integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== - dependencies: - eslint-visitor-keys "^3.3.0" - -"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.6.1": - version "4.11.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.0.tgz#b0ffd0312b4a3fd2d6f77237e7248a5ad3a680ae" - integrity sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A== - -"@eslint/eslintrc@^2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" - integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^9.6.0" - globals "^13.19.0" - ignore "^5.2.0" - import-fresh "^3.2.1" - js-yaml "^4.1.0" - minimatch "^3.1.2" - strip-json-comments "^3.1.1" - -"@eslint/js@8.57.0": - version "8.57.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" - integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== - -"@humanwhocodes/config-array@^0.11.14": - version "0.11.14" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" - integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== - dependencies: - "@humanwhocodes/object-schema" "^2.0.2" - debug "^4.3.1" - minimatch "^3.0.5" - -"@humanwhocodes/module-importer@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" - integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== - -"@humanwhocodes/object-schema@^2.0.2": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" - integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== - -"@isaacs/cliui@^8.0.2": - version "8.0.2" - resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" - integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== - dependencies: - string-width "^5.1.2" - string-width-cjs "npm:string-width@^4.2.0" - strip-ansi "^7.0.1" - strip-ansi-cjs "npm:strip-ansi@^6.0.1" - wrap-ansi "^8.1.0" - wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" - -"@jridgewell/gen-mapping@^0.3.2", "@jridgewell/gen-mapping@^0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" - integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== - dependencies: - "@jridgewell/set-array" "^1.2.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.24" - -"@jridgewell/resolve-uri@^3.1.0": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" - integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== - -"@jridgewell/set-array@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" - integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== - -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" - integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== - -"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": - version "0.3.25" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" - integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - -"@lit-labs/ssr-dom-shim@^1.2.0": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.2.1.tgz#2f3a8f1d688935c704dbc89132394a41029acbb8" - integrity sha512-wx4aBmgeGvFmOKucFKY+8VFJSYZxs9poN3SDNQFF6lT6NrQUnHiPB2PWz2sc4ieEcAaYYzN+1uWahEeTq2aRIQ== - -"@lit/reactive-element@^2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@lit/reactive-element/-/reactive-element-2.0.4.tgz#8f2ed950a848016383894a26180ff06c56ae001b" - integrity sha512-GFn91inaUa2oHLak8awSIigYz0cU0Payr1rcFsrkf5OJ5eSPxElyZfKh0f2p9FsTiZWXQdWGJeXZICEfXXYSXQ== - dependencies: - "@lit-labs/ssr-dom-shim" "^1.2.0" - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@pkgjs/parseargs@^0.11.0": - version "0.11.0" - resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" - integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== - -"@reactivex/rxjs@^6.6.7": - version "6.6.7" - resolved "https://registry.yarnpkg.com/@reactivex/rxjs/-/rxjs-6.6.7.tgz#52ab48f989aba9cda2b995acc904a43e6e1b3b40" - integrity sha512-xZIV2JgHhWoVPm3uVcFbZDRVJfx2hgqmuTX7J4MuKaZ+j5jN29agniCPBwrlCmpA15/zLKcPi7/bogt0ZwOFyA== - dependencies: - tslib "^1.9.0" - -"@remix-run/router@1.19.1": - version "1.19.1" - resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.19.1.tgz#984771bfd1de2715f42394c87fb716c1349e014f" - integrity sha512-S45oynt/WH19bHbIXjtli6QmwNYvaz+vtnubvNpNDvUOoA/OWh6j1OikIP3G+v5GHdxyC6EXoChG3HgYGEUfcg== - -"@rollup/rollup-android-arm-eabi@4.21.0": - version "4.21.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.0.tgz#d941173f82f9b041c61b0dc1a2a91dcd06e4b31e" - integrity sha512-WTWD8PfoSAJ+qL87lE7votj3syLavxunWhzCnx3XFxFiI/BA/r3X7MUM8dVrH8rb2r4AiO8jJsr3ZjdaftmnfA== - -"@rollup/rollup-android-arm64@4.21.0": - version "4.21.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.0.tgz#7e7157c8543215245ceffc445134d9e843ba51c0" - integrity sha512-a1sR2zSK1B4eYkiZu17ZUZhmUQcKjk2/j9Me2IDjk1GHW7LB5Z35LEzj9iJch6gtUfsnvZs1ZNyDW2oZSThrkA== - -"@rollup/rollup-darwin-arm64@4.21.0": - version "4.21.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.0.tgz#f0a18a4fc8dc6eb1e94a51fa2adb22876f477947" - integrity sha512-zOnKWLgDld/svhKO5PD9ozmL6roy5OQ5T4ThvdYZLpiOhEGY+dp2NwUmxK0Ld91LrbjrvtNAE0ERBwjqhZTRAA== - -"@rollup/rollup-darwin-x64@4.21.0": - version "4.21.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.0.tgz#34b7867613e5cc42d2b85ddc0424228cc33b43f0" - integrity sha512-7doS8br0xAkg48SKE2QNtMSFPFUlRdw9+votl27MvT46vo44ATBmdZdGysOevNELmZlfd+NEa0UYOA8f01WSrg== - -"@rollup/rollup-linux-arm-gnueabihf@4.21.0": - version "4.21.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.0.tgz#422b19ff9ae02b05d3395183d1d43b38c7c8be0b" - integrity sha512-pWJsfQjNWNGsoCq53KjMtwdJDmh/6NubwQcz52aEwLEuvx08bzcy6tOUuawAOncPnxz/3siRtd8hiQ32G1y8VA== - -"@rollup/rollup-linux-arm-musleabihf@4.21.0": - version "4.21.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.0.tgz#568aa29195ef6fc57ec6ed3f518923764406a8ee" - integrity sha512-efRIANsz3UHZrnZXuEvxS9LoCOWMGD1rweciD6uJQIx2myN3a8Im1FafZBzh7zk1RJ6oKcR16dU3UPldaKd83w== - -"@rollup/rollup-linux-arm64-gnu@4.21.0": - version "4.21.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.0.tgz#22309c8bcba9a73114f69165c72bc94b2fbec085" - integrity sha512-ZrPhydkTVhyeGTW94WJ8pnl1uroqVHM3j3hjdquwAcWnmivjAwOYjTEAuEDeJvGX7xv3Z9GAvrBkEzCgHq9U1w== - -"@rollup/rollup-linux-arm64-musl@4.21.0": - version "4.21.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.0.tgz#c93c388af6d33f082894b8a60839d7265b2b9bc5" - integrity sha512-cfaupqd+UEFeURmqNP2eEvXqgbSox/LHOyN9/d2pSdV8xTrjdg3NgOFJCtc1vQ/jEke1qD0IejbBfxleBPHnPw== - -"@rollup/rollup-linux-powerpc64le-gnu@4.21.0": - version "4.21.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.0.tgz#493c5e19e395cf3c6bd860c7139c8a903dea72b4" - integrity sha512-ZKPan1/RvAhrUylwBXC9t7B2hXdpb/ufeu22pG2psV7RN8roOfGurEghw1ySmX/CmDDHNTDDjY3lo9hRlgtaHg== - -"@rollup/rollup-linux-riscv64-gnu@4.21.0": - version "4.21.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.0.tgz#a2eab4346fbe5909165ce99adb935ba30c9fb444" - integrity sha512-H1eRaCwd5E8eS8leiS+o/NqMdljkcb1d6r2h4fKSsCXQilLKArq6WS7XBLDu80Yz+nMqHVFDquwcVrQmGr28rg== - -"@rollup/rollup-linux-s390x-gnu@4.21.0": - version "4.21.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.0.tgz#0bc49a79db4345d78d757bb1b05e73a1b42fa5c3" - integrity sha512-zJ4hA+3b5tu8u7L58CCSI0A9N1vkfwPhWd/puGXwtZlsB5bTkwDNW/+JCU84+3QYmKpLi+XvHdmrlwUwDA6kqw== - -"@rollup/rollup-linux-x64-gnu@4.21.0": - version "4.21.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.0.tgz#4fd36a6a41f3406d8693321b13d4f9b7658dd4b9" - integrity sha512-e2hrvElFIh6kW/UNBQK/kzqMNY5mO+67YtEh9OA65RM5IJXYTWiXjX6fjIiPaqOkBthYF1EqgiZ6OXKcQsM0hg== - -"@rollup/rollup-linux-x64-musl@4.21.0": - version "4.21.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.0.tgz#10ebb13bd4469cbad1a5d9b073bd27ec8a886200" - integrity sha512-1vvmgDdUSebVGXWX2lIcgRebqfQSff0hMEkLJyakQ9JQUbLDkEaMsPTLOmyccyC6IJ/l3FZuJbmrBw/u0A0uCQ== - -"@rollup/rollup-win32-arm64-msvc@4.21.0": - version "4.21.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.0.tgz#2fef1a90f1402258ef915ae5a94cc91a5a1d5bfc" - integrity sha512-s5oFkZ/hFcrlAyBTONFY1TWndfyre1wOMwU+6KCpm/iatybvrRgmZVM+vCFwxmC5ZhdlgfE0N4XorsDpi7/4XQ== - -"@rollup/rollup-win32-ia32-msvc@4.21.0": - version "4.21.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.0.tgz#a18ad47a95c5f264defb60acdd8c27569f816fc1" - integrity sha512-G9+TEqRnAA6nbpqyUqgTiopmnfgnMkR3kMukFBDsiyy23LZvUCpiUwjTRx6ezYCjJODXrh52rBR9oXvm+Fp5wg== - -"@rollup/rollup-win32-x64-msvc@4.21.0": - version "4.21.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.0.tgz#20c09cf44dcb082140cc7f439dd679fe4bba3375" - integrity sha512-2jsCDZwtQvRhejHLfZ1JY6w6kEuEtfF9nzYsZxzSlNVKDX+DpsDJ+Rbjkm74nvg2rdx0gwBS+IMdvwJuq3S9pQ== - -"@socket.io/component-emitter@~3.1.0": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz#821f8442f4175d8f0467b9daf26e3a18e2d02af2" - integrity sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA== - -"@superviz/autodesk-viewer-plugin@1.21.0": - version "1.21.0" - resolved "https://registry.yarnpkg.com/@superviz/autodesk-viewer-plugin/-/autodesk-viewer-plugin-1.21.0.tgz#4c80be8882555538e2faa0282f194069c7c2ebef" - integrity sha512-JHLkI401wjIoeKz4Y74hgJAiJOvKdSz0k69SyZSEMqahYu3DVyzhJkIGHtEEL/+pPfL3hvqzHON9ked7xSLEAA== - dependencies: - "@superviz/sdk" "6.4.3" - debug "^4.3.5" - lodash "^4.17.21" - three "0.139.2" - -"@superviz/matterport-plugin@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@superviz/matterport-plugin/-/matterport-plugin-1.1.0.tgz#5c7a145bc9342c9ad2f0af6042baa0a8ecb376c3" - integrity sha512-yEYqqTrC4ffspQMDJZXUQUErynJQwxYVHbmnuyE3p3NK8LBeN/EqEUm8NYAL3qQDm0GEqFLjl5+APtQoFdgiEA== - dependencies: - "@superviz/sdk" "6.4.3" - debug "^4.3.5" - lodash "^4.17.21" - three-spritetext "^1.8.2" - -"@superviz/realtime@1.0.1-lab.1": - version "1.0.1-lab.1" - resolved "https://registry.yarnpkg.com/@superviz/realtime/-/realtime-1.0.1-lab.1.tgz#159981ff17e84d2b84090308468f5263175aa4ef" - integrity sha512-H6Y4CyNGqiQsTmikBbxwjNm3/pLxPdZNCSv5BWNRcIbnnrXnGhtFTEZEDIn1BpxicSLetLb30ePsd7KxxDAF7w== - dependencies: - "@superviz/socket-client" "1.11.0" - debug "^4.3.4" - lit "^3.1.4" - lodash "^4.17.21" - rxjs "^7.8.1" - -"@superviz/sdk@6.4.3": - version "6.4.3" - resolved "https://registry.yarnpkg.com/@superviz/sdk/-/sdk-6.4.3.tgz#283ec308f89787688f7f85eb910cec3247e9ca02" - integrity sha512-9G5viuRPdUTEHI5dMboM9hPs8owdqRNQ++ifneLr3zde8Ot4Y4wtyuMIeGGOxLrp77lF1usprnBgWEbYe4FcFQ== - dependencies: - bowser "^2.11.0" - bowser-jr "^1.0.6" - debug "^4.3.4" - lit "^3.1.4" - lodash "^4.17.21" - lodash.debounce "^4.0.8" - lodash.isequal "^4.5.0" - luxon "^3.4.4" - rxjs "^7.8.1" - semantic-release-version-file "^1.0.2" - socket.io-client "^4.7.5" - zod "^3.23.8" - -"@superviz/sdk@6.6.0": - version "6.6.0" - resolved "https://registry.yarnpkg.com/@superviz/sdk/-/sdk-6.6.0.tgz#ad812acfa53dd18ba6c0ca9733c18053e00ba6a7" - integrity sha512-fNswMeKeTXTPQhlLrKt6qLDkNjUe5fwtzYUERoh4hfYeVD2xHXC1yE8sDFcl1xOjM1WefD7QjiRdVhwXtDXMTA== - dependencies: - "@superviz/socket-client" "^1.10.0" - bowser "^2.11.0" - bowser-jr "^1.0.6" - debug "^4.3.4" - lit "^3.1.4" - lodash "^4.17.21" - lodash.debounce "^4.0.8" - lodash.isequal "^4.5.0" - luxon "^3.4.4" - rxjs "^7.8.1" - semantic-release-version-file "^1.0.2" - zod "^3.23.8" - -"@superviz/socket-client@1.11.0": - version "1.11.0" - resolved "https://registry.yarnpkg.com/@superviz/socket-client/-/socket-client-1.11.0.tgz#87003c0de439ede43242692384e7bb4b42ad8c2a" - integrity sha512-r+t/AfjIcenAlGbTGqH1JAndLIw3CEqHzSEOAZ1afJ6e+VG0x8PbPk6pgc436Vhsy6641JYJFK2XRtcK99PPgA== - dependencies: - "@reactivex/rxjs" "^6.6.7" - debug "^4.3.5" - lodash "^4.17.21" - rxjs "^7.8.1" - semantic-release-version-file "^1.0.2" - socket.io-client "^4.7.5" - zod "^3.23.8" - -"@superviz/socket-client@1.12.1", "@superviz/socket-client@^1.10.0": - version "1.12.1" - resolved "https://registry.yarnpkg.com/@superviz/socket-client/-/socket-client-1.12.1.tgz#345c6496445b4269b43ee04db361b1ec32119ff7" - integrity sha512-ZUSVQJP4OJ+isujpeqkjSZnuCAd5qeqrbFR7rS6OiaQi/fnsALxZchm9Sy+46yVw5xMNuBp1j8p7lW19wCC4DA== - dependencies: - "@reactivex/rxjs" "^6.6.7" - debug "^4.3.5" - lodash "^4.17.21" - rxjs "^7.8.1" - semantic-release-version-file "^1.0.2" - socket.io-client "^4.7.5" - zod "^3.23.8" - -"@superviz/threejs-plugin@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@superviz/threejs-plugin/-/threejs-plugin-1.1.0.tgz#50df11beafdd06b7130a626c514c73bf1f32f617" - integrity sha512-CyrTkuTQDK8mcHY4GV35oi6pO31Zl4RjNVuqKYff1J02Kaz3QFzhNDF36rV/nMO+nvy45+4MJJF8tpzCAKSSig== - dependencies: - "@superviz/sdk" "6.4.3" - debug "^4.3.5" - lodash "^4.17.21" - three "0.167.1" - three-mesh-bvh "0.7.6" - three-spritetext "1.8.2" - -"@tweenjs/tween.js@~23.1.2": - version "23.1.3" - resolved "https://registry.yarnpkg.com/@tweenjs/tween.js/-/tween.js-23.1.3.tgz#eff0245735c04a928bb19c026b58c2a56460539d" - integrity sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA== - -"@types/babel__core@^7.20.5": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" - integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== - dependencies: - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__generator@*": - version "7.6.8" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.8.tgz#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab" - integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__template@*": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" - integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - -"@types/babel__traverse@*": - version "7.20.6" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.6.tgz#8dc9f0ae0f202c08d8d4dab648912c8d6038e3f7" - integrity sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg== - dependencies: - "@babel/types" "^7.20.7" - -"@types/estree@1.0.5": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" - integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== - -"@types/forge-viewer@^7.89.1": - version "7.89.1" - resolved "https://registry.yarnpkg.com/@types/forge-viewer/-/forge-viewer-7.89.1.tgz#eace6c9b8ca42ac5af290777cdd338e73450533f" - integrity sha512-H6Pl64WPXJdc2QldIAVF7yYJh+Mym8KTB+B0/XaaSNbFDOme2AlwaQRAH0M2zflblFT2vlLsxdc6Je/2x0rhHQ== - -"@types/lodash@^4.17.7": - version "4.17.7" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.7.tgz#2f776bcb53adc9e13b2c0dfd493dfcbd7de43612" - integrity sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA== - -"@types/prop-types@*": - version "15.7.12" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6" - integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== - -"@types/react-dom@^18.3.0": - version "18.3.0" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.3.0.tgz#0cbc818755d87066ab6ca74fbedb2547d74a82b0" - integrity sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg== - dependencies: - "@types/react" "*" - -"@types/react@*", "@types/react@^18.3.3": - version "18.3.4" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.4.tgz#dfdd534a1d081307144c00e325c06e00312c93a3" - integrity sha512-J7W30FTdfCxDDjmfRM+/JqLHBIyl7xUIp9kwK637FGmY7+mkSFSe6L4jpZzhj5QMfLssSDP4/i75AKkrdC7/Jw== - dependencies: - "@types/prop-types" "*" - csstype "^3.0.2" - -"@types/stats.js@*": - version "0.17.3" - resolved "https://registry.yarnpkg.com/@types/stats.js/-/stats.js-0.17.3.tgz#705446e12ce0fad618557dd88236f51148b7a935" - integrity sha512-pXNfAD3KHOdif9EQXZ9deK82HVNaXP5ZIF5RP2QG6OQFNTaY2YIetfrE9t528vEreGQvEPRDDc8muaoYeK0SxQ== - -"@types/three@^0.167.1": - version "0.167.2" - resolved "https://registry.yarnpkg.com/@types/three/-/three-0.167.2.tgz#51d12194fdf96ac228f91037a30cd4afb6e49978" - integrity sha512-onxnIUNYpXcZJ5DTiIsxfnr4F9kAWkkxAUWx5yqzz/u0a4IygCLCjMuOl2DEeCxyJdJ2nOJZvKpu48sBMqfmkQ== - dependencies: - "@tweenjs/tween.js" "~23.1.2" - "@types/stats.js" "*" - "@types/webxr" "*" - fflate "~0.8.2" - meshoptimizer "~0.18.1" - -"@types/trusted-types@^2.0.2": - version "2.0.7" - resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.7.tgz#baccb07a970b91707df3a3e8ba6896c57ead2d11" - integrity sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw== - -"@types/uuid@^10.0.0": - version "10.0.0" - resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-10.0.0.tgz#e9c07fe50da0f53dc24970cca94d619ff03f6f6d" - integrity sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ== - -"@types/webxr@*": - version "0.5.19" - resolved "https://registry.yarnpkg.com/@types/webxr/-/webxr-0.5.19.tgz#463a27bc06ff1c0a0c997e86b48bf24c5f50a4af" - integrity sha512-4hxA+NwohSgImdTSlPXEqDqqFktNgmTXQ05ff1uWam05tNGroCMp4G+4XVl6qWm1p7GQ/9oD41kAYsSssF6Mzw== - -"@typescript-eslint/eslint-plugin@^7.15.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz#b16d3cf3ee76bf572fdf511e79c248bdec619ea3" - integrity sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw== - dependencies: - "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "7.18.0" - "@typescript-eslint/type-utils" "7.18.0" - "@typescript-eslint/utils" "7.18.0" - "@typescript-eslint/visitor-keys" "7.18.0" - graphemer "^1.4.0" - ignore "^5.3.1" - natural-compare "^1.4.0" - ts-api-utils "^1.3.0" - -"@typescript-eslint/parser@^7.15.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.18.0.tgz#83928d0f1b7f4afa974098c64b5ce6f9051f96a0" - integrity sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg== - dependencies: - "@typescript-eslint/scope-manager" "7.18.0" - "@typescript-eslint/types" "7.18.0" - "@typescript-eslint/typescript-estree" "7.18.0" - "@typescript-eslint/visitor-keys" "7.18.0" - debug "^4.3.4" - -"@typescript-eslint/scope-manager@7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz#c928e7a9fc2c0b3ed92ab3112c614d6bd9951c83" - integrity sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA== - dependencies: - "@typescript-eslint/types" "7.18.0" - "@typescript-eslint/visitor-keys" "7.18.0" - -"@typescript-eslint/type-utils@7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz#2165ffaee00b1fbbdd2d40aa85232dab6998f53b" - integrity sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA== - dependencies: - "@typescript-eslint/typescript-estree" "7.18.0" - "@typescript-eslint/utils" "7.18.0" - debug "^4.3.4" - ts-api-utils "^1.3.0" - -"@typescript-eslint/types@7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.18.0.tgz#b90a57ccdea71797ffffa0321e744f379ec838c9" - integrity sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ== - -"@typescript-eslint/typescript-estree@7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz#b5868d486c51ce8f312309ba79bdb9f331b37931" - integrity sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA== - dependencies: - "@typescript-eslint/types" "7.18.0" - "@typescript-eslint/visitor-keys" "7.18.0" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - minimatch "^9.0.4" - semver "^7.6.0" - ts-api-utils "^1.3.0" - -"@typescript-eslint/utils@7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.18.0.tgz#bca01cde77f95fc6a8d5b0dbcbfb3d6ca4be451f" - integrity sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw== - dependencies: - "@eslint-community/eslint-utils" "^4.4.0" - "@typescript-eslint/scope-manager" "7.18.0" - "@typescript-eslint/types" "7.18.0" - "@typescript-eslint/typescript-estree" "7.18.0" - -"@typescript-eslint/visitor-keys@7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz#0564629b6124d67607378d0f0332a0495b25e7d7" - integrity sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg== - dependencies: - "@typescript-eslint/types" "7.18.0" - eslint-visitor-keys "^3.4.3" - -"@ungap/structured-clone@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" - integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== - -"@vitejs/plugin-react@^4.3.1": - version "4.3.1" - resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.3.1.tgz#d0be6594051ded8957df555ff07a991fb618b48e" - integrity sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg== - dependencies: - "@babel/core" "^7.24.5" - "@babel/plugin-transform-react-jsx-self" "^7.24.5" - "@babel/plugin-transform-react-jsx-source" "^7.24.1" - "@types/babel__core" "^7.20.5" - react-refresh "^0.14.2" - -acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn@^8.9.0: - version "8.12.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" - integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== - -ajv@^6.12.4: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^6.1.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - -any-promise@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" - integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== - -anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -arg@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" - integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -autoprefixer@^10.4.20: - version "10.4.20" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.20.tgz#5caec14d43976ef42e32dcb4bd62878e96be5b3b" - integrity sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g== - dependencies: - browserslist "^4.23.3" - caniuse-lite "^1.0.30001646" - fraction.js "^4.3.7" - normalize-range "^0.1.2" - picocolors "^1.0.1" - postcss-value-parser "^4.2.0" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -binary-extensions@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" - integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== - -bowser-jr@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/bowser-jr/-/bowser-jr-1.0.6.tgz#1b55e8cfc6af659869a95003fc13f8a403851bb4" - integrity sha512-hLxb4bGj3EvJuwiKjZX3yEDYR4FFJE5Ug0oCwRozH1pFJOp/NNMzuUkg9Lh2ANfvU6P5yy6ioC093mp1gkaJ/A== - -bowser@^2.11.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/bowser/-/bowser-2.11.0.tgz#5ca3c35757a7aa5771500c70a73a9f91ef420a8f" - integrity sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -braces@^3.0.3, braces@~3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" - integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== - dependencies: - fill-range "^7.1.1" - -browserslist@^4.23.1, browserslist@^4.23.3: - version "4.23.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.3.tgz#debb029d3c93ebc97ffbc8d9cbb03403e227c800" - integrity sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA== - dependencies: - caniuse-lite "^1.0.30001646" - electron-to-chromium "^1.5.4" - node-releases "^2.0.18" - update-browserslist-db "^1.1.0" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase-css@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" - integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== - -caniuse-lite@^1.0.30001646: - version "1.0.30001651" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz#52de59529e8b02b1aedcaaf5c05d9e23c0c28138" - integrity sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg== - -chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^4.0.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chokidar@^3.5.3: - version "3.6.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" - integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -commander@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" - integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -convert-source-map@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" - integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== - -cross-spawn@^7.0.0, cross-spawn@^7.0.2: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -cssesc@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" - integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== - -csstype@^3.0.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" - integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== - -debug@^4.1.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5, debug@~4.3.1, debug@~4.3.2: - version "4.3.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.6.tgz#2ab2c38fbaffebf8aa95fdfe6d88438c7a13c52b" - integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== - dependencies: - ms "2.1.2" - -deep-is@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -didyoumean@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" - integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -dlv@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" - integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - -electron-to-chromium@^1.5.4: - version "1.5.12" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.12.tgz#ee31756eaa2e06f2aa606f170b7ad06dd402b4e4" - integrity sha512-tIhPkdlEoCL1Y+PToq3zRNehUaKp3wBX/sr7aclAWdIWjvqAe/Im/H0SiCM4c1Q8BLPHCdoJTol+ZblflydehA== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - -engine.io-client@~6.5.2: - version "6.5.4" - resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-6.5.4.tgz#b8bc71ed3f25d0d51d587729262486b4b33bd0d0" - integrity sha512-GeZeeRjpD2qf49cZQ0Wvh/8NJNfeXkXXcoGh+F77oEAgo9gUHwT1fCRxSNU+YEEaysOJTnsFHmM5oAcPy4ntvQ== - dependencies: - "@socket.io/component-emitter" "~3.1.0" - debug "~4.3.1" - engine.io-parser "~5.2.1" - ws "~8.17.1" - xmlhttprequest-ssl "~2.0.0" - -engine.io-parser@~5.2.1: - version "5.2.3" - resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.2.3.tgz#00dc5b97b1f233a23c9398d0209504cf5f94d92f" - integrity sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q== - -esbuild@^0.21.3: - version "0.21.5" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d" - integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== - optionalDependencies: - "@esbuild/aix-ppc64" "0.21.5" - "@esbuild/android-arm" "0.21.5" - "@esbuild/android-arm64" "0.21.5" - "@esbuild/android-x64" "0.21.5" - "@esbuild/darwin-arm64" "0.21.5" - "@esbuild/darwin-x64" "0.21.5" - "@esbuild/freebsd-arm64" "0.21.5" - "@esbuild/freebsd-x64" "0.21.5" - "@esbuild/linux-arm" "0.21.5" - "@esbuild/linux-arm64" "0.21.5" - "@esbuild/linux-ia32" "0.21.5" - "@esbuild/linux-loong64" "0.21.5" - "@esbuild/linux-mips64el" "0.21.5" - "@esbuild/linux-ppc64" "0.21.5" - "@esbuild/linux-riscv64" "0.21.5" - "@esbuild/linux-s390x" "0.21.5" - "@esbuild/linux-x64" "0.21.5" - "@esbuild/netbsd-x64" "0.21.5" - "@esbuild/openbsd-x64" "0.21.5" - "@esbuild/sunos-x64" "0.21.5" - "@esbuild/win32-arm64" "0.21.5" - "@esbuild/win32-ia32" "0.21.5" - "@esbuild/win32-x64" "0.21.5" - -escalade@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" - integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eslint-plugin-react-hooks@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz#c829eb06c0e6f484b3fbb85a97e57784f328c596" - integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== - -eslint-plugin-react-refresh@^0.4.7: - version "0.4.10" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.10.tgz#1fb514897ee3bdc37ac34446fa5f02b1ce9c7d3f" - integrity sha512-I39s6G9We7ZxbCRxTTM5XX4KJV2cfWhFbHF4kTuL0ygdEVdQXtCNGqUQ43sBOCbTC/N6dEZXoQKFHr8gp1VHrQ== - -eslint-scope@^7.2.2: - version "7.2.2" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" - integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: - version "3.4.3" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" - integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== - -eslint@^8.57.0: - version "8.57.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" - integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.6.1" - "@eslint/eslintrc" "^2.1.4" - "@eslint/js" "8.57.0" - "@humanwhocodes/config-array" "^0.11.14" - "@humanwhocodes/module-importer" "^1.0.1" - "@nodelib/fs.walk" "^1.2.8" - "@ungap/structured-clone" "^1.2.0" - ajv "^6.12.4" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.3.2" - doctrine "^3.0.0" - escape-string-regexp "^4.0.0" - eslint-scope "^7.2.2" - eslint-visitor-keys "^3.4.3" - espree "^9.6.1" - esquery "^1.4.2" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - find-up "^5.0.0" - glob-parent "^6.0.2" - globals "^13.19.0" - graphemer "^1.4.0" - ignore "^5.2.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - is-path-inside "^3.0.3" - js-yaml "^4.1.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.1.2" - natural-compare "^1.4.0" - optionator "^0.9.3" - strip-ansi "^6.0.1" - text-table "^0.2.0" - -espree@^9.6.0, espree@^9.6.1: - version "9.6.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" - integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== - dependencies: - acorn "^8.9.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.4.1" - -esquery@^1.4.2: - version "1.6.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" - integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^5.1.0, estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-glob@^3.2.9, fast-glob@^3.3.0: - version "3.3.2" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" - integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fastq@^1.6.0: - version "1.17.1" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" - integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== - dependencies: - reusify "^1.0.4" - -fflate@~0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.8.2.tgz#fc8631f5347812ad6028bbe4a2308b2792aa1dea" - integrity sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A== - -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== - dependencies: - flat-cache "^3.0.4" - -fill-range@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" - integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== - dependencies: - to-regex-range "^5.0.1" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -flat-cache@^3.0.4: - version "3.2.0" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" - integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== - dependencies: - flatted "^3.2.9" - keyv "^4.5.3" - rimraf "^3.0.2" - -flatted@^3.2.9: - version "3.3.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" - integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== - -foreground-child@^3.1.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.0.tgz#0ac8644c06e431439f8561db8ecf29a7b5519c77" - integrity sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg== - dependencies: - cross-spawn "^7.0.0" - signal-exit "^4.0.1" - -fraction.js@^4.3.7: - version "4.3.7" - resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" - integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@~2.3.2, fsevents@~2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -glob-parent@^5.1.2, glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob@^10.3.10: - version "10.4.5" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" - integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== - dependencies: - foreground-child "^3.1.0" - jackspeak "^3.1.2" - minimatch "^9.0.4" - minipass "^7.1.2" - package-json-from-dist "^1.0.0" - path-scurry "^1.11.1" - -glob@^7.1.3: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globals@^13.19.0: - version "13.24.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" - integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== - dependencies: - type-fest "^0.20.2" - -globby@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - -graphemer@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" - integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -hasown@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== - dependencies: - function-bind "^1.1.2" - -ignore@^5.2.0, ignore@^5.3.1: - version "5.3.2" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" - integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== - -import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -invariant@^2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== - dependencies: - loose-envify "^1.0.0" - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-core-module@^2.13.0: - version "2.15.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.0.tgz#71c72ec5442ace7e76b306e9d48db361f22699ea" - integrity sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA== - dependencies: - hasown "^2.0.2" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-path-inside@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -jackspeak@^3.1.2: - version "3.4.3" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" - integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== - dependencies: - "@isaacs/cliui" "^8.0.2" - optionalDependencies: - "@pkgjs/parseargs" "^0.11.0" - -jiti@^1.21.0: - version "1.21.6" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.6.tgz#6c7f7398dd4b3142767f9a168af2f317a428d268" - integrity sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w== - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -json-buffer@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" - integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - -json5@^2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - -keyv@^4.5.3: - version "4.5.4" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" - integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== - dependencies: - json-buffer "3.0.1" - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -lilconfig@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" - integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== - -lilconfig@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.2.tgz#e4a7c3cb549e3a606c8dcc32e5ae1005e62c05cb" - integrity sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow== - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -lit-element@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/lit-element/-/lit-element-4.1.0.tgz#cea3eb25f15091e3fade07c4d917fa6aaf56ba7d" - integrity sha512-gSejRUQJuMQjV2Z59KAS/D4iElUhwKpIyJvZ9w+DIagIQjfJnhR20h2Q5ddpzXGS+fF0tMZ/xEYGMnKmaI/iww== - dependencies: - "@lit-labs/ssr-dom-shim" "^1.2.0" - "@lit/reactive-element" "^2.0.4" - lit-html "^3.2.0" - -lit-html@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/lit-html/-/lit-html-3.2.0.tgz#cb09071a8a1f5f0850873f9143f18f0260be1fda" - integrity sha512-pwT/HwoxqI9FggTrYVarkBKFN9MlTUpLrDHubTmW4SrkL3kkqW5gxwbxMMUnbbRHBC0WTZnYHcjDSCM559VyfA== - dependencies: - "@types/trusted-types" "^2.0.2" - -lit@^3.1.4: - version "3.2.0" - resolved "https://registry.yarnpkg.com/lit/-/lit-3.2.0.tgz#2189d72bccbc335f733a67bfbbd295f015e68e05" - integrity sha512-s6tI33Lf6VpDu7u4YqsSX78D28bYQulM+VAzsGch4fx2H0eLZnJsUBsPWmGYSGoKDNbjtRv02rio1o+UdPVwvw== - dependencies: - "@lit/reactive-element" "^2.0.4" - lit-element "^4.1.0" - lit-html "^3.2.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash.debounce@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== - -lodash.isequal@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" - integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -loose-envify@^1.0.0, loose-envify@^1.1.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -lru-cache@^10.2.0: - version "10.4.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" - integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -luxon@^3.4.4: - version "3.5.0" - resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.5.0.tgz#6b6f65c5cd1d61d1fd19dbf07ee87a50bf4b8e20" - integrity sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ== - -merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -meshoptimizer@~0.18.1: - version "0.18.1" - resolved "https://registry.yarnpkg.com/meshoptimizer/-/meshoptimizer-0.18.1.tgz#cdb90907f30a7b5b1190facd3b7ee6b7087797d8" - integrity sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw== - -micromatch@^4.0.4, micromatch@^4.0.5: - version "4.0.7" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.7.tgz#33e8190d9fe474a9895525f5618eee136d46c2e5" - integrity sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q== - dependencies: - braces "^3.0.3" - picomatch "^2.3.1" - -minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^9.0.4: - version "9.0.5" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" - integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== - dependencies: - brace-expansion "^2.0.1" - -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" - integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -mz@^2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" - integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== - dependencies: - any-promise "^1.0.0" - object-assign "^4.0.1" - thenify-all "^1.0.0" - -nanoid@^3.3.7: - version "3.3.7" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" - integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -node-releases@^2.0.18: - version "2.0.18" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" - integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -normalize-range@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" - integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== - -object-assign@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -object-hash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" - integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -optionator@^0.9.3: - version "0.9.4" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" - integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== - dependencies: - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - word-wrap "^1.2.5" - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -package-json-from-dist@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz#e501cd3094b278495eb4258d4c9f6d5ac3019f00" - integrity sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw== - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-scurry@^1.11.1: - version "1.11.1" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" - integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== - dependencies: - lru-cache "^10.2.0" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -picocolors@^1.0.0, picocolors@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" - integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pify@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== - -pirates@^4.0.1: - version "4.0.6" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" - integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== - -postcss-import@^15.1.0: - version "15.1.0" - resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-15.1.0.tgz#41c64ed8cc0e23735a9698b3249ffdbf704adc70" - integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== - dependencies: - postcss-value-parser "^4.0.0" - read-cache "^1.0.0" - resolve "^1.1.7" - -postcss-js@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.1.tgz#61598186f3703bab052f1c4f7d805f3991bee9d2" - integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== - dependencies: - camelcase-css "^2.0.1" - -postcss-load-config@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.2.tgz#7159dcf626118d33e299f485d6afe4aff7c4a3e3" - integrity sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ== - dependencies: - lilconfig "^3.0.0" - yaml "^2.3.4" - -postcss-nested@^6.0.1: - version "6.2.0" - resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.2.0.tgz#4c2d22ab5f20b9cb61e2c5c5915950784d068131" - integrity sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ== - dependencies: - postcss-selector-parser "^6.1.1" - -postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.1.1: - version "6.1.2" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz#27ecb41fb0e3b6ba7a1ec84fff347f734c7929de" - integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" - integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== - -postcss@^8.4.23, postcss@^8.4.41: - version "8.4.41" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.41.tgz#d6104d3ba272d882fe18fc07d15dc2da62fa2681" - integrity sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ== - dependencies: - nanoid "^3.3.7" - picocolors "^1.0.1" - source-map-js "^1.2.0" - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -punycode@^2.1.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" - integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -react-dom@^18.3.1: - version "18.3.1" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" - integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== - dependencies: - loose-envify "^1.1.0" - scheduler "^0.23.2" - -react-fast-compare@^3.2.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.2.tgz#929a97a532304ce9fee4bcae44234f1ce2c21d49" - integrity sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ== - -react-helmet-async@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/react-helmet-async/-/react-helmet-async-2.0.5.tgz#cfc70cd7bb32df7883a8ed55502a1513747223ec" - integrity sha512-rYUYHeus+i27MvFE+Jaa4WsyBKGkL6qVgbJvSBoX8mbsWoABJXdEO0bZyi0F6i+4f0NuIb8AvqPMj3iXFHkMwg== - dependencies: - invariant "^2.2.4" - react-fast-compare "^3.2.2" - shallowequal "^1.1.0" - -react-refresh@^0.14.2: - version "0.14.2" - resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.2.tgz#3833da01ce32da470f1f936b9d477da5c7028bf9" - integrity sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA== - -react-router-dom@^6.26.1: - version "6.26.1" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.26.1.tgz#a408892b41767a49dc94b3564b0e7d8e3959f623" - integrity sha512-veut7m41S1fLql4pLhxeSW3jlqs+4MtjRLj0xvuCEXsxusJCbs6I8yn9BxzzDX2XDgafrccY6hwjmd/bL54tFw== - dependencies: - "@remix-run/router" "1.19.1" - react-router "6.26.1" - -react-router@6.26.1: - version "6.26.1" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.26.1.tgz#88c64837e05ffab6899a49df2a1484a22471e4ce" - integrity sha512-kIwJveZNwp7teQRI5QmwWo39A5bXRyqpH0COKKmPnyD2vBvDwgFXSqDUYtt1h+FEyfnE8eXr7oe0MxRzVwCcvQ== - dependencies: - "@remix-run/router" "1.19.1" - -react@^18.3.1: - version "18.3.1" - resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" - integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== - dependencies: - loose-envify "^1.1.0" - -read-cache@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" - integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== - dependencies: - pify "^2.3.0" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve@^1.1.7, resolve@^1.22.2: - version "1.22.8" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" - integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -rollup@^4.20.0: - version "4.21.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.21.0.tgz#28db5f5c556a5180361d35009979ccc749560b9d" - integrity sha512-vo+S/lfA2lMS7rZ2Qoubi6I5hwZwzXeUIctILZLbHI+laNtvhhOIon2S1JksA5UEDQ7l3vberd0fxK44lTYjbQ== - dependencies: - "@types/estree" "1.0.5" - optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.21.0" - "@rollup/rollup-android-arm64" "4.21.0" - "@rollup/rollup-darwin-arm64" "4.21.0" - "@rollup/rollup-darwin-x64" "4.21.0" - "@rollup/rollup-linux-arm-gnueabihf" "4.21.0" - "@rollup/rollup-linux-arm-musleabihf" "4.21.0" - "@rollup/rollup-linux-arm64-gnu" "4.21.0" - "@rollup/rollup-linux-arm64-musl" "4.21.0" - "@rollup/rollup-linux-powerpc64le-gnu" "4.21.0" - "@rollup/rollup-linux-riscv64-gnu" "4.21.0" - "@rollup/rollup-linux-s390x-gnu" "4.21.0" - "@rollup/rollup-linux-x64-gnu" "4.21.0" - "@rollup/rollup-linux-x64-musl" "4.21.0" - "@rollup/rollup-win32-arm64-msvc" "4.21.0" - "@rollup/rollup-win32-ia32-msvc" "4.21.0" - "@rollup/rollup-win32-x64-msvc" "4.21.0" - fsevents "~2.3.2" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -rxjs@^7.8.1: - version "7.8.1" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" - integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== - dependencies: - tslib "^2.1.0" - -scheduler@^0.23.2: - version "0.23.2" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" - integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== - dependencies: - loose-envify "^1.1.0" - -semantic-release-version-file@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/semantic-release-version-file/-/semantic-release-version-file-1.0.2.tgz#d83f13336ba968e0e2c4fcf769e1fcad26e2200c" - integrity sha512-/kf9hqGfy0iceKDC1dXGKajKXYfDEHlGFynIaoXOTUv3szlZ4Io2i+7sLl46y4Fv2DCKLeM+3sC/0IWxsgpL9A== - -semver@^6.3.1: - version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -semver@^7.6.0: - version "7.6.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" - integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== - -shallowequal@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" - integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -signal-exit@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" - integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -socket.io-client@^4.7.5: - version "4.7.5" - resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-4.7.5.tgz#919be76916989758bdc20eec63f7ee0ae45c05b7" - integrity sha512-sJ/tqHOCe7Z50JCBCXrsY3I2k03iOiUe+tj1OmKeD2lXPiGH/RUCdTZFoqVyN7l1MnpIzPrGtLcijffmeouNlQ== - dependencies: - "@socket.io/component-emitter" "~3.1.0" - debug "~4.3.2" - engine.io-client "~6.5.2" - socket.io-parser "~4.2.4" - -socket.io-parser@~4.2.4: - version "4.2.4" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.4.tgz#c806966cf7270601e47469ddeec30fbdfda44c83" - integrity sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew== - dependencies: - "@socket.io/component-emitter" "~3.1.0" - debug "~4.3.1" - -source-map-js@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" - integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== - -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^4.1.0: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^5.0.1, string-width@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" - -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^7.0.1: - version "7.1.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" - integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== - dependencies: - ansi-regex "^6.0.1" - -strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -sucrase@^3.32.0: - version "3.35.0" - resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263" - integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA== - dependencies: - "@jridgewell/gen-mapping" "^0.3.2" - commander "^4.0.0" - glob "^10.3.10" - lines-and-columns "^1.1.6" - mz "^2.7.0" - pirates "^4.0.1" - ts-interface-checker "^0.1.9" - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -tailwindcss@^3.4.10: - version "3.4.10" - resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.4.10.tgz#70442d9aeb78758d1f911af29af8255ecdb8ffef" - integrity sha512-KWZkVPm7yJRhdu4SRSl9d4AK2wM3a50UsvgHZO7xY77NQr2V+fIrEuoDGQcbvswWvFGbS2f6e+jC/6WJm1Dl0w== - dependencies: - "@alloc/quick-lru" "^5.2.0" - arg "^5.0.2" - chokidar "^3.5.3" - didyoumean "^1.2.2" - dlv "^1.1.3" - fast-glob "^3.3.0" - glob-parent "^6.0.2" - is-glob "^4.0.3" - jiti "^1.21.0" - lilconfig "^2.1.0" - micromatch "^4.0.5" - normalize-path "^3.0.0" - object-hash "^3.0.0" - picocolors "^1.0.0" - postcss "^8.4.23" - postcss-import "^15.1.0" - postcss-js "^4.0.1" - postcss-load-config "^4.0.1" - postcss-nested "^6.0.1" - postcss-selector-parser "^6.0.11" - resolve "^1.22.2" - sucrase "^3.32.0" - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -thenify-all@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" - integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== - dependencies: - thenify ">= 3.1.0 < 4" - -"thenify@>= 3.1.0 < 4": - version "3.3.1" - resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" - integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== - dependencies: - any-promise "^1.0.0" - -three-mesh-bvh@0.7.6: - version "0.7.6" - resolved "https://registry.yarnpkg.com/three-mesh-bvh/-/three-mesh-bvh-0.7.6.tgz#6764b39475bdba9450ad3a4065492678ee537272" - integrity sha512-rCjsnxEqR9r1/C/lCqzGLS67NDty/S/eT6rAJfDvsanrIctTWdNoR4ZOGWewCB13h1QkVo2BpmC0wakj1+0m8A== - -three-spritetext@1.8.2, three-spritetext@^1.8.2: - version "1.8.2" - resolved "https://registry.yarnpkg.com/three-spritetext/-/three-spritetext-1.8.2.tgz#62d8106e579274c65d86df2b56dda46b13fa97cc" - integrity sha512-OYjyAhWnQ6+7CPKjnpq3JQM+Lpr6cSOppCtbOOzF1IbCauGkoDFvbAnxYd0LVxEsIO2RALXXScg2eX+R6CAfyA== - -three@0.139.2: - version "0.139.2" - resolved "https://registry.yarnpkg.com/three/-/three-0.139.2.tgz#b110799a15736df673b9293e31653a4ac73648dd" - integrity sha512-gV7q7QY8rogu7HLFZR9cWnOQAUedUhu2WXAnpr2kdXZP9YDKsG/0ychwQvWkZN5PlNw9mv5MoCTin6zNTXoONg== - -three@0.167.1: - version "0.167.1" - resolved "https://registry.yarnpkg.com/three/-/three-0.167.1.tgz#3fe4ba2b0a03fd662afe4977a56803d955b61689" - integrity sha512-gYTLJA/UQip6J/tJvl91YYqlZF47+D/kxiWrbTon35ZHlXEN0VOo+Qke2walF1/x92v55H6enomymg4Dak52kw== - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -ts-api-utils@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" - integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== - -ts-interface-checker@^0.1.9: - version "0.1.13" - resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" - integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== - -tslib@^1.9.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tslib@^2.1.0: - version "2.6.3" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" - integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -typescript@^5.2.2: - version "5.5.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.4.tgz#d9852d6c82bad2d2eda4fd74a5762a8f5909e9ba" - integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q== - -update-browserslist-db@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz#7ca61c0d8650766090728046e416a8cde682859e" - integrity sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ== - dependencies: - escalade "^3.1.2" - picocolors "^1.0.1" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -util-deprecate@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -uuid@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-10.0.0.tgz#5a95aa454e6e002725c79055fd42aaba30ca6294" - integrity sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ== - -vite@^5.3.4: - version "5.4.2" - resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.2.tgz#8acb6ec4bfab823cdfc1cb2d6c53ed311bc4e47e" - integrity sha512-dDrQTRHp5C1fTFzcSaMxjk6vdpKvT+2/mIdE07Gw2ykehT49O0z/VHS3zZ8iV/Gh8BJJKHWOe5RjaNrW5xf/GA== - dependencies: - esbuild "^0.21.3" - postcss "^8.4.41" - rollup "^4.20.0" - optionalDependencies: - fsevents "~2.3.3" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -word-wrap@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" - integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== - -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" - integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== - dependencies: - ansi-styles "^6.1.0" - string-width "^5.0.1" - strip-ansi "^7.0.1" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -ws@~8.17.1: - version "8.17.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" - integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== - -xmlhttprequest-ssl@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz#91360c86b914e67f44dce769180027c0da618c67" - integrity sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A== - -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yaml@^2.3.4: - version "2.5.0" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.5.0.tgz#c6165a721cf8000e91c36490a41d7be25176cf5d" - integrity sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw== - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -zod@^3.23.8: - version "3.23.8" - resolved "https://registry.yarnpkg.com/zod/-/zod-3.23.8.tgz#e37b957b5d52079769fb8097099b592f0ef4067d" - integrity sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g== diff --git a/packages/autodesk/.releaserc b/packages/autodesk/.releaserc index dd1a0bc..2d86be5 100644 --- a/packages/autodesk/.releaserc +++ b/packages/autodesk/.releaserc @@ -7,7 +7,7 @@ "tagFormat": "@superviz/autodesk/${version}", "plugins": [ "@semantic-release/commit-analyzer", - "semantic-release-version-file", + "@superviz/semantic-release-version-file", "@semantic-release/github", "@semantic-release/npm" ] diff --git a/packages/autodesk/package.json b/packages/autodesk/package.json index 96b87ce..cfc1bbf 100644 --- a/packages/autodesk/package.json +++ b/packages/autodesk/package.json @@ -30,6 +30,7 @@ "semantic-release": "semantic-release" }, "devDependencies": { + "@superviz/semantic-release-version-file": "workspace:*", "@superviz/eslint-config": "workspace:*", "@superviz/typescript-config": "workspace:*", "@types/debug": "^4.1.12", diff --git a/packages/matterport/.releaserc b/packages/matterport/.releaserc index 4fb51e6..b124f66 100644 --- a/packages/matterport/.releaserc +++ b/packages/matterport/.releaserc @@ -7,7 +7,7 @@ "tagFormat": "@superviz/matterport/${version}", "plugins": [ "@semantic-release/commit-analyzer", - "semantic-release-version-file", + "@superviz/semantic-release-version-file", "@semantic-release/github", "@semantic-release/npm" ] diff --git a/packages/matterport/package.json b/packages/matterport/package.json index 5441ec7..53bd3ac 100644 --- a/packages/matterport/package.json +++ b/packages/matterport/package.json @@ -29,6 +29,7 @@ "semantic-release": "semantic-release" }, "devDependencies": { + "@superviz/semantic-release-version-file": "workspace:*", "@superviz/eslint-config": "workspace:*", "@superviz/typescript-config": "workspace:*", "@types/debug": "^4.1.12", diff --git a/packages/react/.releaserc b/packages/react/.releaserc index 15a72fc..c7b95e9 100644 --- a/packages/react/.releaserc +++ b/packages/react/.releaserc @@ -7,7 +7,7 @@ "tagFormat": "@superviz/react/${version}", "plugins": [ "@semantic-release/commit-analyzer", - "semantic-release-version-file", + "@superviz/semantic-release-version-file", "@semantic-release/github", "@semantic-release/npm" ] diff --git a/packages/react/package.json b/packages/react/package.json index da25acb..44cc8c2 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -45,6 +45,7 @@ "react-dom": "^18.2.0" }, "devDependencies": { + "@superviz/semantic-release-version-file": "workspace:*", "@rollup/plugin-replace": "^5.0.7", "@eslint/compat": "^1.1.1", "@types/forge-viewer": "^7.89.1", @@ -70,7 +71,6 @@ "prettier": "^3.3.2", "react-hooks": "^1.0.1", "semantic-release": "^24.0.0", - "semantic-release-version-file": "^1.0.2", "typescript": "^5.5.2", "vite": "^5.3.2", "vite-plugin-dts": "^3.9.1", diff --git a/packages/realtime/.releaserc b/packages/realtime/.releaserc index 83a37a4..a8fc02f 100644 --- a/packages/realtime/.releaserc +++ b/packages/realtime/.releaserc @@ -7,7 +7,7 @@ "tagFormat": "@superviz/realtime/${version}", "plugins": [ "@semantic-release/commit-analyzer", - "semantic-release-version-file", + "@superviz/semantic-release-version-file", "@semantic-release/github", "@semantic-release/npm" ] diff --git a/packages/realtime/package.json b/packages/realtime/package.json index 3d9c006..5341034 100644 --- a/packages/realtime/package.json +++ b/packages/realtime/package.json @@ -56,6 +56,7 @@ "@jest/globals": "^29.7.0", "@superviz/eslint-config": "workspace:*", "@superviz/typescript-config": "workspace:*", + "@superviz/semantic-release-version-file": "workspace:*", "@types/debug": "^4.1.12", "@types/jest": "^29.5.12", "@types/node": "^20.14.8", @@ -66,7 +67,6 @@ "jest": "^29.7.0", "jest-ctrf-json-reporter": "^0.0.9", "semantic-release": "^24.0.0", - "semantic-release-version-file": "^1.0.2", "ts-jest": "^29.2.5", "tsc": "^2.0.4", "typescript": "^5.5.2", diff --git a/packages/sdk/.releaserc b/packages/sdk/.releaserc index 4953b00..4e81bd1 100644 --- a/packages/sdk/.releaserc +++ b/packages/sdk/.releaserc @@ -7,7 +7,7 @@ "tagFormat": "@superviz/sdk/${version}", "plugins": [ "@semantic-release/commit-analyzer", - "semantic-release-version-file", + "@superviz/semantic-release-version-file", "@semantic-release/github", "@semantic-release/npm" ] diff --git a/packages/sdk/package.json b/packages/sdk/package.json index 34d7d50..20da9a0 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -41,6 +41,7 @@ }, "homepage": "https://github.com/SuperViz/superviz/tree/main/packages/sdk#readme", "devDependencies": { + "@superviz/semantic-release-version-file": "workspace:*", "@superviz/eslint-config": "workspace:*", "@superviz/typescript-config": "workspace:*", "@esm-bundle/chai": "^4.3.4-fix.0", @@ -83,7 +84,6 @@ "lodash": "^4.17.21", "luxon": "^3.4.4", "rxjs": "^7.8.1", - "semantic-release-version-file": "^1.0.2", "zod": "^3.23.8" } } diff --git a/packages/semmatic-release-version-file/index.js b/packages/semmatic-release-version-file/index.js new file mode 100644 index 0000000..6bb9f6e --- /dev/null +++ b/packages/semmatic-release-version-file/index.js @@ -0,0 +1,23 @@ +const fs = require('fs'); + +const createFile = (version) => { + const filename = '.version.js'; + const content = `export const version = '${version}'`; + fs.writeFileSync(filename, content); + +} + +const handle = async (context) => { + const version = context?.nextRelease?.version; + if (!version) { + throw new Error('Could not determine the version from semantic release.') + } + + createFile(version); +}; + +async function prepare(pluginConfig, context) { + await handle(context); +} + +module.exports = { prepare }; \ No newline at end of file diff --git a/packages/semmatic-release-version-file/package.json b/packages/semmatic-release-version-file/package.json new file mode 100644 index 0000000..632fd74 --- /dev/null +++ b/packages/semmatic-release-version-file/package.json @@ -0,0 +1,6 @@ +{ + "name": "@superviz/semantic-release-version-file", + "version": "1.0.0", + "main": "index.js", + "license": "MIT" +} diff --git a/packages/socket-client/.releaserc b/packages/socket-client/.releaserc index 3cda464..cead263 100644 --- a/packages/socket-client/.releaserc +++ b/packages/socket-client/.releaserc @@ -15,7 +15,7 @@ "tagFormat": "@superviz/socket-client/${version}", "plugins": [ "@semantic-release/commit-analyzer", - "semantic-release-version-file", + "@superviz/semantic-release-version-file", "@semantic-release/github", "@semantic-release/npm" ] diff --git a/packages/socket-client/package.json b/packages/socket-client/package.json index 2dfe459..110b383 100644 --- a/packages/socket-client/package.json +++ b/packages/socket-client/package.json @@ -35,6 +35,7 @@ }, "homepage": "https://github.com/SuperViz/superviz/tree/main/packages/socket-client#readme", "devDependencies": { + "@superviz/semantic-release-version-file": "workspace:*", "@superviz/eslint-config": "workspace:*", "@superviz/typescript-config": "workspace:*", "@types/debug": "^4.1.12", @@ -51,7 +52,6 @@ "debug": "^4.3.5", "lodash": "^4.17.21", "rxjs": "^7.8.1", - "semantic-release-version-file": "^1.0.2", "socket.io-client": "^4.7.5", "zod": "^3.23.8" } diff --git a/packages/three/.releaserc b/packages/three/.releaserc index e6959dd..27a79f1 100644 --- a/packages/three/.releaserc +++ b/packages/three/.releaserc @@ -7,7 +7,7 @@ "tagFormat": "@superviz/three/${version}", "plugins": [ "@semantic-release/commit-analyzer", - "semantic-release-version-file", + "@superviz/semantic-release-version-file", "@semantic-release/github", "@semantic-release/npm" ] diff --git a/packages/three/package.json b/packages/three/package.json index 56d2d08..b348785 100644 --- a/packages/three/package.json +++ b/packages/three/package.json @@ -29,6 +29,7 @@ "semantic-release": "semantic-release" }, "devDependencies": { + "@superviz/semantic-release-version-file": "workspace:*", "@superviz/eslint-config": "workspace:*", "@superviz/typescript-config": "workspace:*", "@types/debug": "^4.1.12", diff --git a/packages/three/yarn.lock b/packages/three/yarn.lock deleted file mode 100644 index 739dd11..0000000 --- a/packages/three/yarn.lock +++ /dev/null @@ -1,6153 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/code-frame@^7.0.0": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" - integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== - dependencies: - "@babel/highlight" "^7.18.6" - -"@babel/code-frame@^7.22.13": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465" - integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== - dependencies: - "@babel/highlight" "^7.24.7" - picocolors "^1.0.0" - -"@babel/helper-validator-identifier@^7.18.6": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" - integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== - -"@babel/helper-validator-identifier@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" - integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== - -"@babel/highlight@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" - integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== - dependencies: - "@babel/helper-validator-identifier" "^7.18.6" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/highlight@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d" - integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== - dependencies: - "@babel/helper-validator-identifier" "^7.24.7" - chalk "^2.4.2" - js-tokens "^4.0.0" - picocolors "^1.0.0" - -"@babel/runtime@^7.21.0": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.7.tgz#f4f0d5530e8dbdf59b3451b9b3e594b6ba082e12" - integrity sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw== - dependencies: - regenerator-runtime "^0.14.0" - -"@colors/colors@1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" - integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== - -"@commitlint/cli@^19.3.0": - version "19.3.0" - resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-19.3.0.tgz#44e6da9823a01f0cdcc43054bbefdd2c6c5ddf39" - integrity sha512-LgYWOwuDR7BSTQ9OLZ12m7F/qhNY+NpAyPBgo4YNMkACE7lGuUnuQq1yi9hz1KA4+3VqpOYl8H1rY/LYK43v7g== - dependencies: - "@commitlint/format" "^19.3.0" - "@commitlint/lint" "^19.2.2" - "@commitlint/load" "^19.2.0" - "@commitlint/read" "^19.2.1" - "@commitlint/types" "^19.0.3" - execa "^8.0.1" - yargs "^17.0.0" - -"@commitlint/config-conventional@^19.2.2": - version "19.2.2" - resolved "https://registry.yarnpkg.com/@commitlint/config-conventional/-/config-conventional-19.2.2.tgz#1f4e6975d428985deacf2b3ff6547e02c9302054" - integrity sha512-mLXjsxUVLYEGgzbxbxicGPggDuyWNkf25Ht23owXIH+zV2pv1eJuzLK3t1gDY5Gp6pxdE60jZnWUY5cvgL3ufw== - dependencies: - "@commitlint/types" "^19.0.3" - conventional-changelog-conventionalcommits "^7.0.2" - -"@commitlint/config-validator@^17.4.0": - version "17.4.0" - resolved "https://registry.yarnpkg.com/@commitlint/config-validator/-/config-validator-17.4.0.tgz#2cb229672a22476cf1f21bedbfcd788e5da5b54f" - integrity sha512-Sa/+8KNpDXz4zT4bVbz2fpFjvgkPO6u2V2fP4TKgt6FjmOw2z3eEX859vtfeaTav/ukBw0/0jr+5ZTZp9zCBhA== - dependencies: - "@commitlint/types" "^17.4.0" - ajv "^8.11.0" - -"@commitlint/config-validator@^19.0.3": - version "19.0.3" - resolved "https://registry.yarnpkg.com/@commitlint/config-validator/-/config-validator-19.0.3.tgz#052b181a30da6b4fc16dc5230f4589ac95e0bc81" - integrity sha512-2D3r4PKjoo59zBc2auodrSCaUnCSALCx54yveOFwwP/i2kfEAQrygwOleFWswLqK0UL/F9r07MFi5ev2ohyM4Q== - dependencies: - "@commitlint/types" "^19.0.3" - ajv "^8.11.0" - -"@commitlint/ensure@^19.0.3": - version "19.0.3" - resolved "https://registry.yarnpkg.com/@commitlint/ensure/-/ensure-19.0.3.tgz#d172b1b72ca88cbd317ea1ee79f3a03dbaccc76e" - integrity sha512-SZEpa/VvBLoT+EFZVb91YWbmaZ/9rPH3ESrINOl0HD2kMYsjvl0tF7nMHh0EpTcv4+gTtZBAe1y/SS6/OhfZzQ== - dependencies: - "@commitlint/types" "^19.0.3" - lodash.camelcase "^4.3.0" - lodash.kebabcase "^4.1.1" - lodash.snakecase "^4.1.1" - lodash.startcase "^4.4.0" - lodash.upperfirst "^4.3.1" - -"@commitlint/execute-rule@^17.4.0": - version "17.4.0" - resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-17.4.0.tgz#4518e77958893d0a5835babe65bf87e2638f6939" - integrity sha512-LIgYXuCSO5Gvtc0t9bebAMSwd68ewzmqLypqI2Kke1rqOqqDbMpYcYfoPfFlv9eyLIh4jocHWwCK5FS7z9icUA== - -"@commitlint/execute-rule@^19.0.0": - version "19.0.0" - resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-19.0.0.tgz#928fb239ae8deec82a6e3b05ec9cfe20afa83856" - integrity sha512-mtsdpY1qyWgAO/iOK0L6gSGeR7GFcdW7tIjcNFxcWkfLDF5qVbPHKuGATFqRMsxcO8OUKNj0+3WOHB7EHm4Jdw== - -"@commitlint/format@^19.3.0": - version "19.3.0" - resolved "https://registry.yarnpkg.com/@commitlint/format/-/format-19.3.0.tgz#48dd9e6930d41eb0ca19f36159ee940c5b25d857" - integrity sha512-luguk5/aF68HiF4H23ACAfk8qS8AHxl4LLN5oxPc24H+2+JRPsNr1OS3Gaea0CrH7PKhArBMKBz5RX9sA5NtTg== - dependencies: - "@commitlint/types" "^19.0.3" - chalk "^5.3.0" - -"@commitlint/is-ignored@^19.2.2": - version "19.2.2" - resolved "https://registry.yarnpkg.com/@commitlint/is-ignored/-/is-ignored-19.2.2.tgz#503ddcf908ac6b2bc4586a49cb53893a1856f5b2" - integrity sha512-eNX54oXMVxncORywF4ZPFtJoBm3Tvp111tg1xf4zWXGfhBPKpfKG6R+G3G4v5CPlRROXpAOpQ3HMhA9n1Tck1g== - dependencies: - "@commitlint/types" "^19.0.3" - semver "^7.6.0" - -"@commitlint/lint@^19.2.2": - version "19.2.2" - resolved "https://registry.yarnpkg.com/@commitlint/lint/-/lint-19.2.2.tgz#57f69e24bd832a7dcce8ebf82d11e3bf03ccc2a9" - integrity sha512-xrzMmz4JqwGyKQKTpFzlN0dx0TAiT7Ran1fqEBgEmEj+PU98crOFtysJgY+QdeSagx6EDRigQIXJVnfrI0ratA== - dependencies: - "@commitlint/is-ignored" "^19.2.2" - "@commitlint/parse" "^19.0.3" - "@commitlint/rules" "^19.0.3" - "@commitlint/types" "^19.0.3" - -"@commitlint/load@>6.1.1": - version "17.4.2" - resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-17.4.2.tgz#551875c3e1dce6dc0375dc9c8ad551de8ba35de4" - integrity sha512-Si++F85rJ9t4hw6JcOw1i2h0fdpdFQt0YKwjuK4bk9KhFjyFkRxvR3SB2dPaMs+EwWlDrDBGL+ygip1QD6gmPw== - dependencies: - "@commitlint/config-validator" "^17.4.0" - "@commitlint/execute-rule" "^17.4.0" - "@commitlint/resolve-extends" "^17.4.0" - "@commitlint/types" "^17.4.0" - "@types/node" "*" - chalk "^4.1.0" - cosmiconfig "^8.0.0" - cosmiconfig-typescript-loader "^4.0.0" - lodash.isplainobject "^4.0.6" - lodash.merge "^4.6.2" - lodash.uniq "^4.5.0" - resolve-from "^5.0.0" - ts-node "^10.8.1" - typescript "^4.6.4" - -"@commitlint/load@^19.2.0": - version "19.2.0" - resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-19.2.0.tgz#3ca51fdead4f1e1e09c9c7df343306412b1ef295" - integrity sha512-XvxxLJTKqZojCxaBQ7u92qQLFMMZc4+p9qrIq/9kJDy8DOrEa7P1yx7Tjdc2u2JxIalqT4KOGraVgCE7eCYJyQ== - dependencies: - "@commitlint/config-validator" "^19.0.3" - "@commitlint/execute-rule" "^19.0.0" - "@commitlint/resolve-extends" "^19.1.0" - "@commitlint/types" "^19.0.3" - chalk "^5.3.0" - cosmiconfig "^9.0.0" - cosmiconfig-typescript-loader "^5.0.0" - lodash.isplainobject "^4.0.6" - lodash.merge "^4.6.2" - lodash.uniq "^4.5.0" - -"@commitlint/message@^19.0.0": - version "19.0.0" - resolved "https://registry.yarnpkg.com/@commitlint/message/-/message-19.0.0.tgz#f789dd1b7a1f9c784578e0111f46cc3fecf5a531" - integrity sha512-c9czf6lU+9oF9gVVa2lmKaOARJvt4soRsVmbR7Njwp9FpbBgste5i7l/2l5o8MmbwGh4yE1snfnsy2qyA2r/Fw== - -"@commitlint/parse@^19.0.3": - version "19.0.3" - resolved "https://registry.yarnpkg.com/@commitlint/parse/-/parse-19.0.3.tgz#a2d09876d458e17ad0e1695b04f41af8b50a41c2" - integrity sha512-Il+tNyOb8VDxN3P6XoBBwWJtKKGzHlitEuXA5BP6ir/3loWlsSqDr5aecl6hZcC/spjq4pHqNh0qPlfeWu38QA== - dependencies: - "@commitlint/types" "^19.0.3" - conventional-changelog-angular "^7.0.0" - conventional-commits-parser "^5.0.0" - -"@commitlint/read@^19.2.1": - version "19.2.1" - resolved "https://registry.yarnpkg.com/@commitlint/read/-/read-19.2.1.tgz#7296b99c9a989e60e5927fff8388a1dd44299c2f" - integrity sha512-qETc4+PL0EUv7Q36lJbPG+NJiBOGg7SSC7B5BsPWOmei+Dyif80ErfWQ0qXoW9oCh7GTpTNRoaVhiI8RbhuaNw== - dependencies: - "@commitlint/top-level" "^19.0.0" - "@commitlint/types" "^19.0.3" - execa "^8.0.1" - git-raw-commits "^4.0.0" - minimist "^1.2.8" - -"@commitlint/resolve-extends@^17.4.0": - version "17.4.0" - resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-17.4.0.tgz#9023da6c70c4ebd173b4b0995fe29f27051da2d3" - integrity sha512-3JsmwkrCzoK8sO22AzLBvNEvC1Pmdn/65RKXzEtQMy6oYMl0Snrq97a5bQQEFETF0VsvbtUuKttLqqgn99OXRQ== - dependencies: - "@commitlint/config-validator" "^17.4.0" - "@commitlint/types" "^17.4.0" - import-fresh "^3.0.0" - lodash.mergewith "^4.6.2" - resolve-from "^5.0.0" - resolve-global "^1.0.0" - -"@commitlint/resolve-extends@^19.1.0": - version "19.1.0" - resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-19.1.0.tgz#fa5b8f921e9c8d76f53624c35bf25b9676bd73fa" - integrity sha512-z2riI+8G3CET5CPgXJPlzftH+RiWYLMYv4C9tSLdLXdr6pBNimSKukYP9MS27ejmscqCTVA4almdLh0ODD2KYg== - dependencies: - "@commitlint/config-validator" "^19.0.3" - "@commitlint/types" "^19.0.3" - global-directory "^4.0.1" - import-meta-resolve "^4.0.0" - lodash.mergewith "^4.6.2" - resolve-from "^5.0.0" - -"@commitlint/rules@^19.0.3": - version "19.0.3" - resolved "https://registry.yarnpkg.com/@commitlint/rules/-/rules-19.0.3.tgz#de647a9055847cae4f3ae32b4798096b604584f3" - integrity sha512-TspKb9VB6svklxNCKKwxhELn7qhtY1rFF8ls58DcFd0F97XoG07xugPjjbVnLqmMkRjZDbDIwBKt9bddOfLaPw== - dependencies: - "@commitlint/ensure" "^19.0.3" - "@commitlint/message" "^19.0.0" - "@commitlint/to-lines" "^19.0.0" - "@commitlint/types" "^19.0.3" - execa "^8.0.1" - -"@commitlint/to-lines@^19.0.0": - version "19.0.0" - resolved "https://registry.yarnpkg.com/@commitlint/to-lines/-/to-lines-19.0.0.tgz#aa6618eb371bafbc0cd3b48f0db565c4a40462c6" - integrity sha512-vkxWo+VQU5wFhiP9Ub9Sre0FYe019JxFikrALVoD5UGa8/t3yOJEpEhxC5xKiENKKhUkTpEItMTRAjHw2SCpZw== - -"@commitlint/top-level@^19.0.0": - version "19.0.0" - resolved "https://registry.yarnpkg.com/@commitlint/top-level/-/top-level-19.0.0.tgz#9c44d7cec533bb9598bfae9658737e2d6a903605" - integrity sha512-KKjShd6u1aMGNkCkaX4aG1jOGdn7f8ZI8TR1VEuNqUOjWTOdcDSsmglinglJ18JTjuBX5I1PtjrhQCRcixRVFQ== - dependencies: - find-up "^7.0.0" - -"@commitlint/types@^17.4.0": - version "17.4.0" - resolved "https://registry.yarnpkg.com/@commitlint/types/-/types-17.4.0.tgz#c7c2b97b959f6175c164632bf26208ce417b3f31" - integrity sha512-2NjAnq5IcxY9kXtUeO2Ac0aPpvkuOmwbH/BxIm36XXK5LtWFObWJWjXOA+kcaABMrthjWu6la+FUpyYFMHRvbA== - dependencies: - chalk "^4.1.0" - -"@commitlint/types@^19.0.3": - version "19.0.3" - resolved "https://registry.yarnpkg.com/@commitlint/types/-/types-19.0.3.tgz#feff4ecac2b5c359f2a57f9ab094b2ac80ef0266" - integrity sha512-tpyc+7i6bPG9mvaBbtKUeghfyZSDgWquIDfMgqYtTbmZ9Y9VzEm2je9EYcQ0aoz5o7NvGS+rcDec93yO08MHYA== - dependencies: - "@types/conventional-commits-parser" "^5.0.0" - chalk "^5.3.0" - -"@cspotcode/source-map-support@^0.8.0": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" - integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== - dependencies: - "@jridgewell/trace-mapping" "0.3.9" - -"@esbuild/aix-ppc64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" - integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== - -"@esbuild/android-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" - integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== - -"@esbuild/android-arm@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" - integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== - -"@esbuild/android-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" - integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== - -"@esbuild/darwin-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" - integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== - -"@esbuild/darwin-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" - integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== - -"@esbuild/freebsd-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" - integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== - -"@esbuild/freebsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" - integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== - -"@esbuild/linux-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" - integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== - -"@esbuild/linux-arm@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" - integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== - -"@esbuild/linux-ia32@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" - integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== - -"@esbuild/linux-loong64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" - integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== - -"@esbuild/linux-mips64el@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" - integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== - -"@esbuild/linux-ppc64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" - integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== - -"@esbuild/linux-riscv64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" - integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== - -"@esbuild/linux-s390x@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" - integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== - -"@esbuild/linux-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" - integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== - -"@esbuild/netbsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" - integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== - -"@esbuild/openbsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" - integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== - -"@esbuild/sunos-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" - integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== - -"@esbuild/win32-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" - integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== - -"@esbuild/win32-ia32@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" - integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== - -"@esbuild/win32-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" - integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== - -"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": - version "4.4.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" - integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== - dependencies: - eslint-visitor-keys "^3.3.0" - -"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.6.1": - version "4.10.1" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.1.tgz#361461e5cb3845d874e61731c11cfedd664d83a0" - integrity sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA== - -"@eslint/config-array@^0.16.0": - version "0.16.0" - resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.16.0.tgz#bb3364fc39ee84ec3a62abdc4b8d988d99dfd706" - integrity sha512-/jmuSd74i4Czf1XXn7wGRWZCuyaUZ330NH1Bek0Pplatt4Sy1S5haN21SCLLdbeKslQ+S0wEJ+++v5YibSi+Lg== - dependencies: - "@eslint/object-schema" "^2.1.4" - debug "^4.3.1" - minimatch "^3.0.5" - -"@eslint/eslintrc@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.1.0.tgz#dbd3482bfd91efa663cbe7aa1f506839868207b6" - integrity sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^10.0.1" - globals "^14.0.0" - ignore "^5.2.0" - import-fresh "^3.2.1" - js-yaml "^4.1.0" - minimatch "^3.1.2" - strip-json-comments "^3.1.1" - -"@eslint/js@9.5.0": - version "9.5.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.5.0.tgz#0e9c24a670b8a5c86bff97b40be13d8d8f238045" - integrity sha512-A7+AOT2ICkodvtsWnxZP4Xxk3NbZ3VMHd8oihydLRGrJgqqdEz1qSeEgXYyT/Cu8h1TWWsQRejIx48mtjZ5y1w== - -"@eslint/object-schema@^2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.4.tgz#9e69f8bb4031e11df79e03db09f9dbbae1740843" - integrity sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ== - -"@humanwhocodes/module-importer@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" - integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== - -"@humanwhocodes/retry@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.0.tgz#6d86b8cb322660f03d3f0aa94b99bdd8e172d570" - integrity sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew== - -"@isaacs/cliui@^8.0.2": - version "8.0.2" - resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" - integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== - dependencies: - string-width "^5.1.2" - string-width-cjs "npm:string-width@^4.2.0" - strip-ansi "^7.0.1" - strip-ansi-cjs "npm:strip-ansi@^6.0.1" - wrap-ansi "^8.1.0" - wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" - -"@isaacs/string-locale-compare@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz#291c227e93fd407a96ecd59879a35809120e432b" - integrity sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ== - -"@jridgewell/resolve-uri@^3.0.3": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== - -"@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== - -"@jridgewell/trace-mapping@0.3.9": - version "0.3.9" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@lit-labs/ssr-dom-shim@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.2.0.tgz#353ce4a76c83fadec272ea5674ede767650762fd" - integrity sha512-yWJKmpGE6lUURKAaIltoPIE/wrbY3TEkqQt+X0m+7fQNnAv0keydnYvbiJFP1PnMhizmIWRWOG5KLhYyc/xl+g== - -"@lit/reactive-element@^2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@lit/reactive-element/-/reactive-element-2.0.4.tgz#8f2ed950a848016383894a26180ff06c56ae001b" - integrity sha512-GFn91inaUa2oHLak8awSIigYz0cU0Payr1rcFsrkf5OJ5eSPxElyZfKh0f2p9FsTiZWXQdWGJeXZICEfXXYSXQ== - dependencies: - "@lit-labs/ssr-dom-shim" "^1.2.0" - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@npmcli/agent@^2.0.0": - version "2.2.2" - resolved "https://registry.yarnpkg.com/@npmcli/agent/-/agent-2.2.2.tgz#967604918e62f620a648c7975461c9c9e74fc5d5" - integrity sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og== - dependencies: - agent-base "^7.1.0" - http-proxy-agent "^7.0.0" - https-proxy-agent "^7.0.1" - lru-cache "^10.0.1" - socks-proxy-agent "^8.0.3" - -"@npmcli/arborist@^7.5.3": - version "7.5.3" - resolved "https://registry.yarnpkg.com/@npmcli/arborist/-/arborist-7.5.3.tgz#88c51b124a1ec48d358897778af6ab5b0e05694d" - integrity sha512-7gbMdDNSYUzi0j2mpb6FoXRg3BxXWplMQZH1MZlvNjSdWFObaUz2Ssvo0Nlh2xmWks1OPo+gpsE6qxpT/5M7lQ== - dependencies: - "@isaacs/string-locale-compare" "^1.1.0" - "@npmcli/fs" "^3.1.1" - "@npmcli/installed-package-contents" "^2.1.0" - "@npmcli/map-workspaces" "^3.0.2" - "@npmcli/metavuln-calculator" "^7.1.1" - "@npmcli/name-from-folder" "^2.0.0" - "@npmcli/node-gyp" "^3.0.0" - "@npmcli/package-json" "^5.1.0" - "@npmcli/query" "^3.1.0" - "@npmcli/redact" "^2.0.0" - "@npmcli/run-script" "^8.1.0" - bin-links "^4.0.4" - cacache "^18.0.3" - common-ancestor-path "^1.0.1" - hosted-git-info "^7.0.2" - json-parse-even-better-errors "^3.0.2" - json-stringify-nice "^1.1.4" - lru-cache "^10.2.2" - minimatch "^9.0.4" - nopt "^7.2.1" - npm-install-checks "^6.2.0" - npm-package-arg "^11.0.2" - npm-pick-manifest "^9.0.1" - npm-registry-fetch "^17.0.1" - pacote "^18.0.6" - parse-conflict-json "^3.0.0" - proc-log "^4.2.0" - proggy "^2.0.0" - promise-all-reject-late "^1.0.0" - promise-call-limit "^3.0.1" - read-package-json-fast "^3.0.2" - semver "^7.3.7" - ssri "^10.0.6" - treeverse "^3.0.0" - walk-up-path "^3.0.1" - -"@npmcli/config@^8.3.3": - version "8.3.3" - resolved "https://registry.yarnpkg.com/@npmcli/config/-/config-8.3.3.tgz#213658d2c85dc40c7b4f9231d993678bb0c57f66" - integrity sha512-sIMKHiiYr91ALiHjhPq64F5P/SCaiSyDfpNmgYHtlIJtLY445+3+r3VoREzpdDrOwIqwQ6iEHinbTfaocL0UgA== - dependencies: - "@npmcli/map-workspaces" "^3.0.2" - ci-info "^4.0.0" - ini "^4.1.2" - nopt "^7.2.1" - proc-log "^4.2.0" - read-package-json-fast "^3.0.2" - semver "^7.3.5" - walk-up-path "^3.0.1" - -"@npmcli/fs@^3.1.0", "@npmcli/fs@^3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-3.1.1.tgz#59cdaa5adca95d135fc00f2bb53f5771575ce726" - integrity sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg== - dependencies: - semver "^7.3.5" - -"@npmcli/git@^5.0.0", "@npmcli/git@^5.0.7": - version "5.0.7" - resolved "https://registry.yarnpkg.com/@npmcli/git/-/git-5.0.7.tgz#7ff675e33b4dc0b0adb1f0c4aa302109efc06463" - integrity sha512-WaOVvto604d5IpdCRV2KjQu8PzkfE96d50CQGKgywXh2GxXmDeUO5EWcBC4V57uFyrNqx83+MewuJh3WTR3xPA== - dependencies: - "@npmcli/promise-spawn" "^7.0.0" - lru-cache "^10.0.1" - npm-pick-manifest "^9.0.0" - proc-log "^4.0.0" - promise-inflight "^1.0.1" - promise-retry "^2.0.1" - semver "^7.3.5" - which "^4.0.0" - -"@npmcli/installed-package-contents@^2.0.1", "@npmcli/installed-package-contents@^2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@npmcli/installed-package-contents/-/installed-package-contents-2.1.0.tgz#63048e5f6e40947a3a88dcbcb4fd9b76fdd37c17" - integrity sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w== - dependencies: - npm-bundled "^3.0.0" - npm-normalize-package-bin "^3.0.0" - -"@npmcli/map-workspaces@^3.0.2", "@npmcli/map-workspaces@^3.0.6": - version "3.0.6" - resolved "https://registry.yarnpkg.com/@npmcli/map-workspaces/-/map-workspaces-3.0.6.tgz#27dc06c20c35ef01e45a08909cab9cb3da08cea6" - integrity sha512-tkYs0OYnzQm6iIRdfy+LcLBjcKuQCeE5YLb8KnrIlutJfheNaPvPpgoFEyEFgbjzl5PLZ3IA/BWAwRU0eHuQDA== - dependencies: - "@npmcli/name-from-folder" "^2.0.0" - glob "^10.2.2" - minimatch "^9.0.0" - read-package-json-fast "^3.0.0" - -"@npmcli/metavuln-calculator@^7.1.1": - version "7.1.1" - resolved "https://registry.yarnpkg.com/@npmcli/metavuln-calculator/-/metavuln-calculator-7.1.1.tgz#4d3b6c3192f72bc8ad59476de0da939c33877fcf" - integrity sha512-Nkxf96V0lAx3HCpVda7Vw4P23RILgdi/5K1fmj2tZkWIYLpXAN8k2UVVOsW16TsS5F8Ws2I7Cm+PU1/rsVF47g== - dependencies: - cacache "^18.0.0" - json-parse-even-better-errors "^3.0.0" - pacote "^18.0.0" - proc-log "^4.1.0" - semver "^7.3.5" - -"@npmcli/name-from-folder@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@npmcli/name-from-folder/-/name-from-folder-2.0.0.tgz#c44d3a7c6d5c184bb6036f4d5995eee298945815" - integrity sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg== - -"@npmcli/node-gyp@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz#101b2d0490ef1aa20ed460e4c0813f0db560545a" - integrity sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA== - -"@npmcli/package-json@^5.0.0", "@npmcli/package-json@^5.1.0", "@npmcli/package-json@^5.1.1": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@npmcli/package-json/-/package-json-5.2.0.tgz#a1429d3111c10044c7efbfb0fce9f2c501f4cfad" - integrity sha512-qe/kiqqkW0AGtvBjL8TJKZk/eBBSpnJkUWvHdQ9jM2lKHXRYYJuyNpJPlJw3c8QjC2ow6NZYiLExhUaeJelbxQ== - dependencies: - "@npmcli/git" "^5.0.0" - glob "^10.2.2" - hosted-git-info "^7.0.0" - json-parse-even-better-errors "^3.0.0" - normalize-package-data "^6.0.0" - proc-log "^4.0.0" - semver "^7.5.3" - -"@npmcli/promise-spawn@^7.0.0", "@npmcli/promise-spawn@^7.0.2": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@npmcli/promise-spawn/-/promise-spawn-7.0.2.tgz#1d53d34ffeb5d151bfa8ec661bcccda8bbdfd532" - integrity sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ== - dependencies: - which "^4.0.0" - -"@npmcli/query@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@npmcli/query/-/query-3.1.0.tgz#bc202c59e122a06cf8acab91c795edda2cdad42c" - integrity sha512-C/iR0tk7KSKGldibYIB9x8GtO/0Bd0I2mhOaDb8ucQL/bQVTmGoeREaFj64Z5+iCBRf3dQfed0CjJL7I8iTkiQ== - dependencies: - postcss-selector-parser "^6.0.10" - -"@npmcli/redact@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@npmcli/redact/-/redact-2.0.1.tgz#95432fd566e63b35c04494621767a4312c316762" - integrity sha512-YgsR5jCQZhVmTJvjduTOIHph0L73pK8xwMVaDY0PatySqVM9AZj93jpoXYSJqfHFxFkN9dmqTw6OiqExsS3LPw== - -"@npmcli/run-script@^8.0.0", "@npmcli/run-script@^8.1.0": - version "8.1.0" - resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-8.1.0.tgz#a563e5e29b1ca4e648a6b1bbbfe7220b4bfe39fc" - integrity sha512-y7efHHwghQfk28G2z3tlZ67pLG0XdfYbcVG26r7YIXALRsrVQcTq4/tdenSmdOrEsNahIYA/eh8aEVROWGFUDg== - dependencies: - "@npmcli/node-gyp" "^3.0.0" - "@npmcli/package-json" "^5.0.0" - "@npmcli/promise-spawn" "^7.0.0" - node-gyp "^10.0.0" - proc-log "^4.0.0" - which "^4.0.0" - -"@octokit/auth-token@^5.0.0": - version "5.1.1" - resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-5.1.1.tgz#3bbfe905111332a17f72d80bd0b51a3e2fa2cf07" - integrity sha512-rh3G3wDO8J9wSjfI436JUKzHIxq8NaiL0tVeB2aXmG6p/9859aUOAjA9pmSPNGGZxfwmaJ9ozOJImuNVJdpvbA== - -"@octokit/core@^6.0.0": - version "6.1.2" - resolved "https://registry.yarnpkg.com/@octokit/core/-/core-6.1.2.tgz#20442d0a97c411612da206411e356014d1d1bd17" - integrity sha512-hEb7Ma4cGJGEUNOAVmyfdB/3WirWMg5hDuNFVejGEDFqupeOysLc2sG6HJxY2etBp5YQu5Wtxwi020jS9xlUwg== - dependencies: - "@octokit/auth-token" "^5.0.0" - "@octokit/graphql" "^8.0.0" - "@octokit/request" "^9.0.0" - "@octokit/request-error" "^6.0.1" - "@octokit/types" "^13.0.0" - before-after-hook "^3.0.2" - universal-user-agent "^7.0.0" - -"@octokit/endpoint@^10.0.0": - version "10.1.1" - resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-10.1.1.tgz#1a9694e7aef6aa9d854dc78dd062945945869bcc" - integrity sha512-JYjh5rMOwXMJyUpj028cu0Gbp7qe/ihxfJMLc8VZBMMqSwLgOxDI1911gV4Enl1QSavAQNJcwmwBF9M0VvLh6Q== - dependencies: - "@octokit/types" "^13.0.0" - universal-user-agent "^7.0.2" - -"@octokit/graphql@^8.0.0": - version "8.1.1" - resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-8.1.1.tgz#3cacab5f2e55d91c733e3bf481d3a3f8a5f639c4" - integrity sha512-ukiRmuHTi6ebQx/HFRCXKbDlOh/7xEV6QUXaE7MJEKGNAncGI/STSbOkl12qVXZrfZdpXctx5O9X1AIaebiDBg== - dependencies: - "@octokit/request" "^9.0.0" - "@octokit/types" "^13.0.0" - universal-user-agent "^7.0.0" - -"@octokit/openapi-types@^22.2.0": - version "22.2.0" - resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-22.2.0.tgz#75aa7dcd440821d99def6a60b5f014207ae4968e" - integrity sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg== - -"@octokit/plugin-paginate-rest@^11.0.0": - version "11.3.0" - resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.3.0.tgz#f8511b5df06b83e662c54f249a11a0da2213c6c3" - integrity sha512-n4znWfRinnUQF6TPyxs7EctSAA3yVSP4qlJP2YgI3g9d4Ae2n5F3XDOjbUluKRxPU3rfsgpOboI4O4VtPc6Ilg== - dependencies: - "@octokit/types" "^13.5.0" - -"@octokit/plugin-retry@^7.0.0": - version "7.1.1" - resolved "https://registry.yarnpkg.com/@octokit/plugin-retry/-/plugin-retry-7.1.1.tgz#a84483e4afdd068dd71da81abe206a9e442c1288" - integrity sha512-G9Ue+x2odcb8E1XIPhaFBnTTIrrUDfXN05iFXiqhR+SeeeDMMILcAnysOsxUpEWcQp2e5Ft397FCXTcPkiPkLw== - dependencies: - "@octokit/request-error" "^6.0.0" - "@octokit/types" "^13.0.0" - bottleneck "^2.15.3" - -"@octokit/plugin-throttling@^9.0.0": - version "9.3.0" - resolved "https://registry.yarnpkg.com/@octokit/plugin-throttling/-/plugin-throttling-9.3.0.tgz#2700963c6f7e0f62de2158a6d67d1b47c19af3d4" - integrity sha512-B5YTToSRTzNSeEyssnrT7WwGhpIdbpV9NKIs3KyTWHX6PhpYn7gqF/+lL3BvsASBM3Sg5BAUYk7KZx5p/Ec77w== - dependencies: - "@octokit/types" "^13.0.0" - bottleneck "^2.15.3" - -"@octokit/request-error@^6.0.0", "@octokit/request-error@^6.0.1": - version "6.1.1" - resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-6.1.1.tgz#bed1b5f52ce7fefb1077a92bf42124ff36f73f2c" - integrity sha512-1mw1gqT3fR/WFvnoVpY/zUM2o/XkMs/2AszUUG9I69xn0JFLv6PGkPhNk5lbfvROs79wiS0bqiJNxfCZcRJJdg== - dependencies: - "@octokit/types" "^13.0.0" - -"@octokit/request@^9.0.0": - version "9.1.1" - resolved "https://registry.yarnpkg.com/@octokit/request/-/request-9.1.1.tgz#e836eb69c0fb4b59b6437af7716ca348a1232a52" - integrity sha512-pyAguc0p+f+GbQho0uNetNQMmLG1e80WjkIaqqgUkihqUp0boRU6nKItXO4VWnr+nbZiLGEyy4TeKRwqaLvYgw== - dependencies: - "@octokit/endpoint" "^10.0.0" - "@octokit/request-error" "^6.0.1" - "@octokit/types" "^13.1.0" - universal-user-agent "^7.0.2" - -"@octokit/types@^13.0.0", "@octokit/types@^13.1.0", "@octokit/types@^13.5.0": - version "13.5.0" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-13.5.0.tgz#4796e56b7b267ebc7c921dcec262b3d5bfb18883" - integrity sha512-HdqWTf5Z3qwDVlzCrP8UJquMwunpDiMPt5er+QjGzL4hqr/vBVY/MauQgS1xWxCDT1oMx1EULyqxncdCY/NVSQ== - dependencies: - "@octokit/openapi-types" "^22.2.0" - -"@pkgjs/parseargs@^0.11.0": - version "0.11.0" - resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" - integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== - -"@pnpm/network.ca-file@^1.0.1": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz#2ab05e09c1af0cdf2fcf5035bea1484e222f7983" - integrity sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA== - dependencies: - graceful-fs "4.2.10" - -"@pnpm/npm-conf@^1.0.4": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@pnpm/npm-conf/-/npm-conf-1.0.5.tgz#3475541fb71d7b6ce68acaaa3392eae9fedf3276" - integrity sha512-hD8ml183638O3R6/Txrh0L8VzGOrFXgRtRDG4qQC4tONdZ5Z1M+tlUUDUvrjYdmK6G+JTBTeaCLMna11cXzi8A== - dependencies: - "@pnpm/network.ca-file" "^1.0.1" - config-chain "^1.1.11" - -"@sec-ant/readable-stream@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz#60de891bb126abfdc5410fdc6166aca065f10a0c" - integrity sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg== - -"@semantic-release/commit-analyzer@^13.0.0-beta.1": - version "13.0.0" - resolved "https://registry.yarnpkg.com/@semantic-release/commit-analyzer/-/commit-analyzer-13.0.0.tgz#98e28e2b2cb3d8e3a19effb82d5f493a0147e7a2" - integrity sha512-KtXWczvTAB1ZFZ6B4O+w8HkfYm/OgQb1dUGNFZtDgQ0csggrmkq8sTxhd+lwGF8kMb59/RnG9o4Tn7M/I8dQ9Q== - dependencies: - conventional-changelog-angular "^8.0.0" - conventional-changelog-writer "^8.0.0" - conventional-commits-filter "^5.0.0" - conventional-commits-parser "^6.0.0" - debug "^4.0.0" - import-from-esm "^1.0.3" - lodash-es "^4.17.21" - micromatch "^4.0.2" - -"@semantic-release/error@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@semantic-release/error/-/error-4.0.0.tgz#692810288239637f74396976a9340fbc0aa9f6f9" - integrity sha512-mgdxrHTLOjOddRVYIYDo0fR3/v61GNN1YGkfbrjuIKg/uMgCd+Qzo3UAXJ+woLQQpos4pl5Esuw5A7AoNlzjUQ== - -"@semantic-release/github@^10.0.0": - version "10.0.6" - resolved "https://registry.yarnpkg.com/@semantic-release/github/-/github-10.0.6.tgz#58cdec447a423f5be9a6a4c912cbc422307f695b" - integrity sha512-sS4psqZacGTFEN49UQGqwFNG6Jyx2/RX1BhhDGn/2WoPbhAHislohOY05/5r+JoL4gJMWycfH7tEm1eGVutYeg== - dependencies: - "@octokit/core" "^6.0.0" - "@octokit/plugin-paginate-rest" "^11.0.0" - "@octokit/plugin-retry" "^7.0.0" - "@octokit/plugin-throttling" "^9.0.0" - "@semantic-release/error" "^4.0.0" - aggregate-error "^5.0.0" - debug "^4.3.4" - dir-glob "^3.0.1" - globby "^14.0.0" - http-proxy-agent "^7.0.0" - https-proxy-agent "^7.0.0" - issue-parser "^7.0.0" - lodash-es "^4.17.21" - mime "^4.0.0" - p-filter "^4.0.0" - url-join "^5.0.0" - -"@semantic-release/npm@^12.0.0": - version "12.0.1" - resolved "https://registry.yarnpkg.com/@semantic-release/npm/-/npm-12.0.1.tgz#ffb47906de95f8dade8fe0480df0a08dbe1b80c9" - integrity sha512-/6nntGSUGK2aTOI0rHPwY3ZjgY9FkXmEHbW9Kr+62NVOsyqpKKeP0lrCH+tphv+EsNdJNmqqwijTEnVWUMQ2Nw== - dependencies: - "@semantic-release/error" "^4.0.0" - aggregate-error "^5.0.0" - execa "^9.0.0" - fs-extra "^11.0.0" - lodash-es "^4.17.21" - nerf-dart "^1.0.0" - normalize-url "^8.0.0" - npm "^10.5.0" - rc "^1.2.8" - read-pkg "^9.0.0" - registry-auth-token "^5.0.0" - semver "^7.1.2" - tempy "^3.0.0" - -"@semantic-release/release-notes-generator@^14.0.0-beta.1": - version "14.0.1" - resolved "https://registry.yarnpkg.com/@semantic-release/release-notes-generator/-/release-notes-generator-14.0.1.tgz#0c091af7857a4dfbfc464b8256a289676f7eddd3" - integrity sha512-K0w+5220TM4HZTthE5dDpIuFrnkN1NfTGPidJFm04ULT1DEZ9WG89VNXN7F0c+6nMEpWgqmPvb7vY7JkB2jyyA== - dependencies: - conventional-changelog-angular "^8.0.0" - conventional-changelog-writer "^8.0.0" - conventional-commits-filter "^5.0.0" - conventional-commits-parser "^6.0.0" - debug "^4.0.0" - get-stream "^7.0.0" - import-from-esm "^1.0.3" - into-stream "^7.0.0" - lodash-es "^4.17.21" - read-package-up "^11.0.0" - -"@sigstore/bundle@^2.3.2": - version "2.3.2" - resolved "https://registry.yarnpkg.com/@sigstore/bundle/-/bundle-2.3.2.tgz#ad4dbb95d665405fd4a7a02c8a073dbd01e4e95e" - integrity sha512-wueKWDk70QixNLB363yHc2D2ItTgYiMTdPwK8D9dKQMR3ZQ0c35IxP5xnwQ8cNLoCgCRcHf14kE+CLIvNX1zmA== - dependencies: - "@sigstore/protobuf-specs" "^0.3.2" - -"@sigstore/core@^1.0.0", "@sigstore/core@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@sigstore/core/-/core-1.1.0.tgz#5583d8f7ffe599fa0a89f2bf289301a5af262380" - integrity sha512-JzBqdVIyqm2FRQCulY6nbQzMpJJpSiJ8XXWMhtOX9eKgaXXpfNOF53lzQEjIydlStnd/eFtuC1dW4VYdD93oRg== - -"@sigstore/protobuf-specs@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@sigstore/protobuf-specs/-/protobuf-specs-0.3.2.tgz#5becf88e494a920f548d0163e2978f81b44b7d6f" - integrity sha512-c6B0ehIWxMI8wiS/bj6rHMPqeFvngFV7cDU/MY+B16P9Z3Mp9k8L93eYZ7BYzSickzuqAQqAq0V956b3Ju6mLw== - -"@sigstore/sign@^2.3.2": - version "2.3.2" - resolved "https://registry.yarnpkg.com/@sigstore/sign/-/sign-2.3.2.tgz#d3d01e56d03af96fd5c3a9b9897516b1233fc1c4" - integrity sha512-5Vz5dPVuunIIvC5vBb0APwo7qKA4G9yM48kPWJT+OEERs40md5GoUR1yedwpekWZ4m0Hhw44m6zU+ObsON+iDA== - dependencies: - "@sigstore/bundle" "^2.3.2" - "@sigstore/core" "^1.0.0" - "@sigstore/protobuf-specs" "^0.3.2" - make-fetch-happen "^13.0.1" - proc-log "^4.2.0" - promise-retry "^2.0.1" - -"@sigstore/tuf@^2.3.4": - version "2.3.4" - resolved "https://registry.yarnpkg.com/@sigstore/tuf/-/tuf-2.3.4.tgz#da1d2a20144f3b87c0172920cbc8dcc7851ca27c" - integrity sha512-44vtsveTPUpqhm9NCrbU8CWLe3Vck2HO1PNLw7RIajbB7xhtn5RBPm1VNSCMwqGYHhDsBJG8gDF0q4lgydsJvw== - dependencies: - "@sigstore/protobuf-specs" "^0.3.2" - tuf-js "^2.2.1" - -"@sigstore/verify@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@sigstore/verify/-/verify-1.2.1.tgz#c7e60241b432890dcb8bd8322427f6062ef819e1" - integrity sha512-8iKx79/F73DKbGfRf7+t4dqrc0bRr0thdPrxAtCKWRm/F0tG71i6O1rvlnScncJLLBZHn3h8M3c1BSUAb9yu8g== - dependencies: - "@sigstore/bundle" "^2.3.2" - "@sigstore/core" "^1.1.0" - "@sigstore/protobuf-specs" "^0.3.2" - -"@sindresorhus/is@^4.6.0": - version "4.6.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f" - integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== - -"@sindresorhus/merge-streams@^2.1.0": - version "2.3.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz#719df7fb41766bc143369eaa0dd56d8dc87c9958" - integrity sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg== - -"@sindresorhus/merge-streams@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz#abb11d99aeb6d27f1b563c38147a72d50058e339" - integrity sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ== - -"@socket.io/component-emitter@~3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz#96116f2a912e0c02817345b3c10751069920d553" - integrity sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg== - -"@superviz/sdk@6.4.3": - version "6.4.3" - resolved "https://registry.yarnpkg.com/@superviz/sdk/-/sdk-6.4.3.tgz#283ec308f89787688f7f85eb910cec3247e9ca02" - integrity sha512-9G5viuRPdUTEHI5dMboM9hPs8owdqRNQ++ifneLr3zde8Ot4Y4wtyuMIeGGOxLrp77lF1usprnBgWEbYe4FcFQ== - dependencies: - bowser "^2.11.0" - bowser-jr "^1.0.6" - debug "^4.3.4" - lit "^3.1.4" - lodash "^4.17.21" - lodash.debounce "^4.0.8" - lodash.isequal "^4.5.0" - luxon "^3.4.4" - rxjs "^7.8.1" - semantic-release-version-file "^1.0.2" - socket.io-client "^4.7.5" - zod "^3.23.8" - -"@tsconfig/node10@^1.0.7": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" - integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== - -"@tsconfig/node12@^1.0.7": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" - integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== - -"@tsconfig/node14@^1.0.0": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" - integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== - -"@tsconfig/node16@^1.0.2": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" - integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== - -"@tufjs/canonical-json@2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz#a52f61a3d7374833fca945b2549bc30a2dd40d0a" - integrity sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA== - -"@tufjs/models@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@tufjs/models/-/models-2.0.1.tgz#e429714e753b6c2469af3212e7f320a6973c2812" - integrity sha512-92F7/SFyufn4DXsha9+QfKnN03JGqtMFMXgSHbZOo8JG59WkTni7UzAouNQDf7AuP9OAMxVOPQcqG3sB7w+kkg== - dependencies: - "@tufjs/canonical-json" "2.0.0" - minimatch "^9.0.4" - -"@tweenjs/tween.js@~23.1.1": - version "23.1.2" - resolved "https://registry.yarnpkg.com/@tweenjs/tween.js/-/tween.js-23.1.2.tgz#4e5357fd6742f5aa50447d3fa808aed4cda93ed7" - integrity sha512-kMCNaZCJugWI86xiEHaY338CU5JpD0B97p1j1IKNn/Zto8PgACjQx0UxbHjmOcLl/dDOBnItwD07KmCs75pxtQ== - -"@types/conventional-commits-parser@^5.0.0": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@types/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz#8c9d23e0b415b24b91626d07017303755d542dc8" - integrity sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ== - dependencies: - "@types/node" "*" - -"@types/debug@^4.1.12": - version "4.1.12" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" - integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== - dependencies: - "@types/ms" "*" - -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== - -"@types/lodash@^4.17.5": - version "4.17.5" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.5.tgz#e6c29b58e66995d57cd170ce3e2a61926d55ee04" - integrity sha512-MBIOHVZqVqgfro1euRDWX7OO0fBVUUMrN6Pwm8LQsz8cWhEpihlvR70ENj3f40j58TNxZaWv2ndSkInykNBBJw== - -"@types/ms@*": - version "0.7.31" - resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" - integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== - -"@types/node@*": - version "18.11.18" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.18.tgz#8dfb97f0da23c2293e554c5a50d61ef134d7697f" - integrity sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA== - -"@types/normalize-package-data@^2.4.3": - version "2.4.4" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901" - integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA== - -"@types/semver@^7.5.5": - version "7.5.8" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" - integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== - -"@types/stats.js@*": - version "0.17.3" - resolved "https://registry.yarnpkg.com/@types/stats.js/-/stats.js-0.17.3.tgz#705446e12ce0fad618557dd88236f51148b7a935" - integrity sha512-pXNfAD3KHOdif9EQXZ9deK82HVNaXP5ZIF5RP2QG6OQFNTaY2YIetfrE9t528vEreGQvEPRDDc8muaoYeK0SxQ== - -"@types/three@^0.165.0": - version "0.165.0" - resolved "https://registry.yarnpkg.com/@types/three/-/three-0.165.0.tgz#eaf147e69b9fc49ddc2f51b3e425ad03cde5c236" - integrity sha512-AJK8JZAFNBF0kBXiAIl5pggYlzAGGA8geVYQXAcPCEDRbyA+oEjkpUBcJJrtNz6IiALwzGexFJGZG2yV3WsYBw== - dependencies: - "@tweenjs/tween.js" "~23.1.1" - "@types/stats.js" "*" - "@types/webxr" "*" - fflate "~0.8.2" - meshoptimizer "~0.18.1" - -"@types/trusted-types@^2.0.2": - version "2.0.7" - resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.7.tgz#baccb07a970b91707df3a3e8ba6896c57ead2d11" - integrity sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw== - -"@types/webxr@*": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@types/webxr/-/webxr-0.5.0.tgz#aae1cef3210d88fd4204f8c33385a0bbc4da07c9" - integrity sha512-IUMDPSXnYIbEO2IereEFcgcqfDREOgmbGqtrMpVPpACTU6pltYLwHgVkrnYv0XhWEcjio9sYEfIEzgn3c7nDqA== - -"@typescript-eslint/eslint-plugin@^7.14.1": - version "7.14.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.14.1.tgz#90e2f76a5930d553ede124e1f541a39b4417465e" - integrity sha512-aAJd6bIf2vvQRjUG3ZkNXkmBpN+J7Wd0mfQiiVCJMu9Z5GcZZdcc0j8XwN/BM97Fl7e3SkTXODSk4VehUv7CGw== - dependencies: - "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "7.14.1" - "@typescript-eslint/type-utils" "7.14.1" - "@typescript-eslint/utils" "7.14.1" - "@typescript-eslint/visitor-keys" "7.14.1" - graphemer "^1.4.0" - ignore "^5.3.1" - natural-compare "^1.4.0" - ts-api-utils "^1.3.0" - -"@typescript-eslint/parser@^7.14.1": - version "7.14.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.14.1.tgz#13d97f357aed3c5719f259a6cc3d1a1f065d3692" - integrity sha512-8lKUOebNLcR0D7RvlcloOacTOWzOqemWEWkKSVpMZVF/XVcwjPR+3MD08QzbW9TCGJ+DwIc6zUSGZ9vd8cO1IA== - dependencies: - "@typescript-eslint/scope-manager" "7.14.1" - "@typescript-eslint/types" "7.14.1" - "@typescript-eslint/typescript-estree" "7.14.1" - "@typescript-eslint/visitor-keys" "7.14.1" - debug "^4.3.4" - -"@typescript-eslint/scope-manager@7.14.1": - version "7.14.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.14.1.tgz#63de7a577bc6fe8ee6e412a5b85499f654b93ee5" - integrity sha512-gPrFSsoYcsffYXTOZ+hT7fyJr95rdVe4kGVX1ps/dJ+DfmlnjFN/GcMxXcVkeHDKqsq6uAcVaQaIi3cFffmAbA== - dependencies: - "@typescript-eslint/types" "7.14.1" - "@typescript-eslint/visitor-keys" "7.14.1" - -"@typescript-eslint/type-utils@7.14.1": - version "7.14.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.14.1.tgz#c183f2f28c4c8578eb80aebc4ac9ace400160af6" - integrity sha512-/MzmgNd3nnbDbOi3LfasXWWe292+iuo+umJ0bCCMCPc1jLO/z2BQmWUUUXvXLbrQey/JgzdF/OV+I5bzEGwJkQ== - dependencies: - "@typescript-eslint/typescript-estree" "7.14.1" - "@typescript-eslint/utils" "7.14.1" - debug "^4.3.4" - ts-api-utils "^1.3.0" - -"@typescript-eslint/types@7.14.1": - version "7.14.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.14.1.tgz#a43a540dbe5df7f2a11269683d777fc50b4350aa" - integrity sha512-mL7zNEOQybo5R3AavY+Am7KLv8BorIv7HCYS5rKoNZKQD9tsfGUpO4KdAn3sSUvTiS4PQkr2+K0KJbxj8H9NDg== - -"@typescript-eslint/typescript-estree@7.14.1": - version "7.14.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.14.1.tgz#ba7c9bac8744487749d19569e254d057754a1575" - integrity sha512-k5d0VuxViE2ulIO6FbxxSZaxqDVUyMbXcidC8rHvii0I56XZPv8cq+EhMns+d/EVIL41sMXqRbK3D10Oza1bbA== - dependencies: - "@typescript-eslint/types" "7.14.1" - "@typescript-eslint/visitor-keys" "7.14.1" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - minimatch "^9.0.4" - semver "^7.6.0" - ts-api-utils "^1.3.0" - -"@typescript-eslint/utils@7.14.1": - version "7.14.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.14.1.tgz#3307b8226f99103dca2133d0ebcae38419d82c9d" - integrity sha512-CMmVVELns3nak3cpJhZosDkm63n+DwBlDX8g0k4QUa9BMnF+lH2lr3d130M1Zt1xxmB3LLk3NV7KQCq86ZBBhQ== - dependencies: - "@eslint-community/eslint-utils" "^4.4.0" - "@typescript-eslint/scope-manager" "7.14.1" - "@typescript-eslint/types" "7.14.1" - "@typescript-eslint/typescript-estree" "7.14.1" - -"@typescript-eslint/visitor-keys@7.14.1": - version "7.14.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.14.1.tgz#cc79b5ea154aea734b2a13b983670749f5742274" - integrity sha512-Crb+F75U1JAEtBeQGxSKwI60hZmmzaqA3z9sYsVm8X7W5cwLEm5bRe0/uXS6+MR/y8CVpKSR/ontIAIEPFcEkA== - dependencies: - "@typescript-eslint/types" "7.14.1" - eslint-visitor-keys "^3.4.3" - -JSONStream@^1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" - integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== - dependencies: - jsonparse "^1.2.0" - through ">=2.2.7 <3" - -abbrev@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-2.0.0.tgz#cf59829b8b4f03f89dda2771cb7f3653828c89bf" - integrity sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ== - -acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn-walk@^8.1.1: - version "8.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== - -acorn@^8.12.0: - version "8.12.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.0.tgz#1627bfa2e058148036133b8d9b51a700663c294c" - integrity sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw== - -acorn@^8.4.1: - version "8.8.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" - integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== - -agent-base@^7.0.2, agent-base@^7.1.0, agent-base@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.1.tgz#bdbded7dfb096b751a2a087eeeb9664725b2e317" - integrity sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA== - dependencies: - debug "^4.3.4" - -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - -aggregate-error@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-5.0.0.tgz#ffe15045d7521c51c9d618e3d7f37c13f29b3fd3" - integrity sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw== - dependencies: - clean-stack "^5.2.0" - indent-string "^5.0.0" - -ajv@^6.12.4: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ajv@^8.11.0: - version "8.12.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" - integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -ansi-escapes@^4.2.1: - version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - -ansi-escapes@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-7.0.0.tgz#00fc19f491bbb18e1d481b97868204f92109bfe7" - integrity sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw== - dependencies: - environment "^1.0.0" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^6.1.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - -any-promise@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" - integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== - -aproba@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" - integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== - -archy@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" - integrity sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw== - -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -argv-formatter@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/argv-formatter/-/argv-formatter-1.0.0.tgz#a0ca0cbc29a5b73e836eebe1cbf6c5e0e4eb82f9" - integrity sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw== - -array-buffer-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" - integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== - dependencies: - call-bind "^1.0.5" - is-array-buffer "^3.0.4" - -array-ify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" - integrity sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng== - -array-includes@^3.1.7: - version "3.1.8" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" - integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-object-atoms "^1.0.0" - get-intrinsic "^1.2.4" - is-string "^1.0.7" - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -array.prototype.findlastindex@^1.2.3: - version "1.2.5" - resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d" - integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - es-shim-unscopables "^1.0.2" - -array.prototype.flat@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" - integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - -array.prototype.flatmap@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" - integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - -arraybuffer.prototype.slice@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" - integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== - dependencies: - array-buffer-byte-length "^1.0.1" - call-bind "^1.0.5" - define-properties "^1.2.1" - es-abstract "^1.22.3" - es-errors "^1.2.1" - get-intrinsic "^1.2.3" - is-array-buffer "^3.0.4" - is-shared-array-buffer "^1.0.2" - -at-least-node@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" - integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== - -available-typed-arrays@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" - integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== - dependencies: - possible-typed-array-names "^1.0.0" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -before-after-hook@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-3.0.2.tgz#d5665a5fa8b62294a5aa0a499f933f4a1016195d" - integrity sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A== - -bin-links@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/bin-links/-/bin-links-4.0.4.tgz#c3565832b8e287c85f109a02a17027d152a58a63" - integrity sha512-cMtq4W5ZsEwcutJrVId+a/tjt8GSbS+h0oNkdl6+6rBuEv8Ot33Bevj5KPm40t309zuhVic8NjpuL42QCiJWWA== - dependencies: - cmd-shim "^6.0.0" - npm-normalize-package-bin "^3.0.0" - read-cmd-shim "^4.0.0" - write-file-atomic "^5.0.0" - -binary-extensions@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" - integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== - -bl@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" - integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" - -bottleneck@^2.15.3: - version "2.19.5" - resolved "https://registry.yarnpkg.com/bottleneck/-/bottleneck-2.19.5.tgz#5df0b90f59fd47656ebe63c78a98419205cadd91" - integrity sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw== - -bowser-jr@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/bowser-jr/-/bowser-jr-1.0.6.tgz#1b55e8cfc6af659869a95003fc13f8a403851bb4" - integrity sha512-hLxb4bGj3EvJuwiKjZX3yEDYR4FFJE5Ug0oCwRozH1pFJOp/NNMzuUkg9Lh2ANfvU6P5yy6ioC093mp1gkaJ/A== - -bowser@^2.11.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/bowser/-/bowser-2.11.0.tgz#5ca3c35757a7aa5771500c70a73a9f91ef420a8f" - integrity sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -braces@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -buffer@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - -cacache@^18.0.0, cacache@^18.0.3: - version "18.0.3" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-18.0.3.tgz#864e2c18414e1e141ae8763f31e46c2cb96d1b21" - integrity sha512-qXCd4rh6I07cnDqh8V48/94Tc/WSfj+o3Gn6NZ0aZovS255bUx8O13uKxRFd2eWG0xgsco7+YItQNPaa5E85hg== - dependencies: - "@npmcli/fs" "^3.1.0" - fs-minipass "^3.0.0" - glob "^10.2.2" - lru-cache "^10.0.1" - minipass "^7.0.3" - minipass-collect "^2.0.1" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.4" - p-map "^4.0.0" - ssri "^10.0.0" - tar "^6.1.11" - unique-filename "^3.0.0" - -cachedir@2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.3.0.tgz#0c75892a052198f0b21c7c1804d8331edfcae0e8" - integrity sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw== - -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" - integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - set-function-length "^1.2.1" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -chalk@^2.0.0, chalk@^2.3.2, chalk@^2.4.1, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" - integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== - -char-regex@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" - integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== - -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - -chownr@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" - integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== - -ci-info@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-4.0.0.tgz#65466f8b280fc019b9f50a5388115d17a63a44f2" - integrity sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg== - -cidr-regex@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/cidr-regex/-/cidr-regex-4.1.1.tgz#acbe7ba9f10d658710bddd25baa900509e90125a" - integrity sha512-ekKcVp+iRB9zlKFXyx7io7nINgb0oRjgRdXNEodp1OuxRui8FXr/CA40Tz1voWUp9DPPrMyQKy01vJhDo4N1lw== - dependencies: - ip-regex "^5.0.0" - -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - -clean-stack@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-5.2.0.tgz#c7a0c91939c7caace30a3bf254e8a8ac276d1189" - integrity sha512-TyUIUJgdFnCISzG5zu3291TAsE77ddchd0bepon1VVQrKLGKFED4iXFEDQ24mIPdPBbyE16PK3F8MYE1CmcBEQ== - dependencies: - escape-string-regexp "5.0.0" - -cli-columns@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cli-columns/-/cli-columns-4.0.0.tgz#9fe4d65975238d55218c41bd2ed296a7fa555646" - integrity sha512-XW2Vg+w+L9on9wtwKpyzluIPCWXjaBahI7mTcYjx+BVIYD9c3yqcv/yKC7CmdCZat4rq2yiE1UMSJC5ivKfMtQ== - dependencies: - string-width "^4.2.3" - strip-ansi "^6.0.1" - -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - -cli-highlight@^2.1.11: - version "2.1.11" - resolved "https://registry.yarnpkg.com/cli-highlight/-/cli-highlight-2.1.11.tgz#49736fa452f0aaf4fae580e30acb26828d2dc1bf" - integrity sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg== - dependencies: - chalk "^4.0.0" - highlight.js "^10.7.1" - mz "^2.4.0" - parse5 "^5.1.1" - parse5-htmlparser2-tree-adapter "^6.0.0" - yargs "^16.0.0" - -cli-spinners@^2.5.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.7.0.tgz#f815fd30b5f9eaac02db604c7a231ed7cb2f797a" - integrity sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw== - -cli-table3@^0.6.5: - version "0.6.5" - resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.5.tgz#013b91351762739c16a9567c21a04632e449bf2f" - integrity sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ== - dependencies: - string-width "^4.2.0" - optionalDependencies: - "@colors/colors" "1.5.0" - -cli-width@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" - integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== - -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" - integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" - wrap-ansi "^7.0.0" - -clone@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" - integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== - -cmd-shim@^6.0.0: - version "6.0.3" - resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-6.0.3.tgz#c491e9656594ba17ac83c4bd931590a9d6e26033" - integrity sha512-FMabTRlc5t5zjdenF6mS0MBeFZm0XqHqeOkcskKFb/LYCcRQ5fVgLOHVc4Lq9CqABd9zhjwPjMBCJvMCziSVtA== - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -commitizen@^4.0.3: - version "4.3.0" - resolved "https://registry.yarnpkg.com/commitizen/-/commitizen-4.3.0.tgz#0d056c542a2d2b1f9b9aba981aa32575b2849924" - integrity sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw== - dependencies: - cachedir "2.3.0" - cz-conventional-changelog "3.3.0" - dedent "0.7.0" - detect-indent "6.1.0" - find-node-modules "^2.1.2" - find-root "1.1.0" - fs-extra "9.1.0" - glob "7.2.3" - inquirer "8.2.5" - is-utf8 "^0.2.1" - lodash "4.17.21" - minimist "1.2.7" - strip-bom "4.0.0" - strip-json-comments "3.1.1" - -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" - integrity sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w== - -compare-func@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-2.0.0.tgz#fb65e75edbddfd2e568554e8b5b05fff7a51fcb3" - integrity sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA== - dependencies: - array-ify "^1.0.0" - dot-prop "^5.1.0" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -concurrently@^8.2.2: - version "8.2.2" - resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-8.2.2.tgz#353141985c198cfa5e4a3ef90082c336b5851784" - integrity sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg== - dependencies: - chalk "^4.1.2" - date-fns "^2.30.0" - lodash "^4.17.21" - rxjs "^7.8.1" - shell-quote "^1.8.1" - spawn-command "0.0.2" - supports-color "^8.1.1" - tree-kill "^1.2.2" - yargs "^17.7.2" - -config-chain@^1.1.11: - version "1.1.13" - resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" - integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ== - dependencies: - ini "^1.3.4" - proto-list "~1.2.1" - -confusing-browser-globals@^1.0.10: - version "1.0.11" - resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz#ae40e9b57cdd3915408a2805ebd3a5585608dc81" - integrity sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA== - -conventional-changelog-angular@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz#5eec8edbff15aa9b1680a8dcfbd53e2d7eb2ba7a" - integrity sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ== - dependencies: - compare-func "^2.0.0" - -conventional-changelog-angular@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-8.0.0.tgz#5701386850f0e0c2e630b43ee7821d322d87e7a6" - integrity sha512-CLf+zr6St0wIxos4bmaKHRXWAcsCXrJU6F4VdNDrGRK3B8LDLKoX3zuMV5GhtbGkVR/LohZ6MT6im43vZLSjmA== - dependencies: - compare-func "^2.0.0" - -conventional-changelog-conventionalcommits@^7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.2.tgz#aa5da0f1b2543094889e8cf7616ebe1a8f5c70d5" - integrity sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w== - dependencies: - compare-func "^2.0.0" - -conventional-changelog-writer@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-8.0.0.tgz#81522ed40400a4ca8ab78a42794aae9667c745ae" - integrity sha512-TQcoYGRatlAnT2qEWDON/XSfnVG38JzA7E0wcGScu7RElQBkg9WWgZd1peCWFcWDh1xfb2CfsrcvOn1bbSzztA== - dependencies: - "@types/semver" "^7.5.5" - conventional-commits-filter "^5.0.0" - handlebars "^4.7.7" - meow "^13.0.0" - semver "^7.5.2" - -conventional-commit-types@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/conventional-commit-types/-/conventional-commit-types-3.0.0.tgz#7c9214e58eae93e85dd66dbfbafe7e4fffa2365b" - integrity sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg== - -conventional-commits-filter@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/conventional-commits-filter/-/conventional-commits-filter-5.0.0.tgz#72811f95d379e79d2d39d5c0c53c9351ef284e86" - integrity sha512-tQMagCOC59EVgNZcC5zl7XqO30Wki9i9J3acbUvkaosCT6JX3EeFwJD7Qqp4MCikRnzS18WXV3BLIQ66ytu6+Q== - -conventional-commits-parser@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz#57f3594b81ad54d40c1b4280f04554df28627d9a" - integrity sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA== - dependencies: - JSONStream "^1.3.5" - is-text-path "^2.0.0" - meow "^12.0.1" - split2 "^4.0.0" - -conventional-commits-parser@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-6.0.0.tgz#74e3be5344d8cd99f7c3353da2efa1d1dd618061" - integrity sha512-TbsINLp48XeMXR8EvGjTnKGsZqBemisPoyWESlpRyR8lif0lcwzqz+NMtYSj1ooF/WYjSuu7wX0CtdeeMEQAmA== - dependencies: - meow "^13.0.0" - -convert-hrtime@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/convert-hrtime/-/convert-hrtime-5.0.0.tgz#f2131236d4598b95de856926a67100a0a97e9fa3" - integrity sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg== - -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -cosmiconfig-typescript-loader@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.3.0.tgz#c4259ce474c9df0f32274ed162c0447c951ef073" - integrity sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q== - -cosmiconfig-typescript-loader@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-5.0.0.tgz#0d3becfe022a871f7275ceb2397d692e06045dc8" - integrity sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA== - dependencies: - jiti "^1.19.1" - -cosmiconfig@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.0.0.tgz#e9feae014eab580f858f8a0288f38997a7bebe97" - integrity sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ== - dependencies: - import-fresh "^3.2.1" - js-yaml "^4.1.0" - parse-json "^5.0.0" - path-type "^4.0.0" - -cosmiconfig@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-9.0.0.tgz#34c3fc58287b915f3ae905ab6dc3de258b55ad9d" - integrity sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg== - dependencies: - env-paths "^2.2.1" - import-fresh "^3.3.0" - js-yaml "^4.1.0" - parse-json "^5.2.0" - -create-require@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" - integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== - -cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -crypto-random-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-4.0.0.tgz#5a3cc53d7dd86183df5da0312816ceeeb5bb1fc2" - integrity sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA== - dependencies: - type-fest "^1.0.1" - -cssesc@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" - integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== - -cz-conventional-changelog@3.3.0, cz-conventional-changelog@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/cz-conventional-changelog/-/cz-conventional-changelog-3.3.0.tgz#9246947c90404149b3fe2cf7ee91acad3b7d22d2" - integrity sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw== - dependencies: - chalk "^2.4.1" - commitizen "^4.0.3" - conventional-commit-types "^3.0.0" - lodash.map "^4.5.1" - longest "^2.0.1" - word-wrap "^1.0.3" - optionalDependencies: - "@commitlint/load" ">6.1.1" - -dargs@^8.0.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/dargs/-/dargs-8.1.0.tgz#a34859ea509cbce45485e5aa356fef70bfcc7272" - integrity sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw== - -data-view-buffer@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" - integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== - dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -data-view-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" - integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -data-view-byte-offset@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" - integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== - dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -date-fns@^2.30.0: - version "2.30.0" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.30.0.tgz#f367e644839ff57894ec6ac480de40cae4b0f4d0" - integrity sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw== - dependencies: - "@babel/runtime" "^7.21.0" - -debug@4, debug@^4.0.0, debug@^4.3.2, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -debug@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -debug@^4.3.1, debug@^4.3.5: - version "4.3.5" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" - integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== - dependencies: - ms "2.1.2" - -dedent@0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" - integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== - -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - -deep-is@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -defaults@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" - integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== - dependencies: - clone "^1.0.2" - -define-data-property@^1.0.1, define-data-property@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" - integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - gopd "^1.0.1" - -define-properties@^1.1.3, define-properties@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" - integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== - dependencies: - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -define-properties@^1.2.0, define-properties@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" - integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== - dependencies: - define-data-property "^1.0.1" - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -detect-file@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" - integrity sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q== - -detect-indent@6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" - integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== - -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - -diff@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" - integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== - dependencies: - esutils "^2.0.2" - -dot-prop@^5.1.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" - integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== - dependencies: - is-obj "^2.0.0" - -dotenv@^16.4.5: - version "16.4.5" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" - integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== - -duplexer2@~0.1.0: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" - integrity sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA== - dependencies: - readable-stream "^2.0.2" - -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - -emojilib@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/emojilib/-/emojilib-2.4.0.tgz#ac518a8bb0d5f76dda57289ccb2fdf9d39ae721e" - integrity sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw== - -encoding@^0.1.13: - version "0.1.13" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" - integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== - dependencies: - iconv-lite "^0.6.2" - -engine.io-client@~6.5.2: - version "6.5.3" - resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-6.5.3.tgz#4cf6fa24845029b238f83c628916d9149c399bc5" - integrity sha512-9Z0qLB0NIisTRt1DZ/8U2k12RJn8yls/nXMZLn+/N8hANT3TcYjKFKcwbw5zFQiN4NTde3TSY9zb79e1ij6j9Q== - dependencies: - "@socket.io/component-emitter" "~3.1.0" - debug "~4.3.1" - engine.io-parser "~5.2.1" - ws "~8.11.0" - xmlhttprequest-ssl "~2.0.0" - -engine.io-parser@~5.2.1: - version "5.2.2" - resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.2.2.tgz#37b48e2d23116919a3453738c5720455e64e1c49" - integrity sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw== - -env-ci@^11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/env-ci/-/env-ci-11.0.0.tgz#0cbc2c55feb071a3651aaa9fa181a817e696595f" - integrity sha512-apikxMgkipkgTvMdRT9MNqWx5VLOci79F4VBd7Op/7OPjjoanjdAvn6fglMCCEf/1bAh8eOiuEVCUs4V3qP3nQ== - dependencies: - execa "^8.0.0" - java-properties "^1.0.2" - -env-paths@^2.2.0, env-paths@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" - integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== - -environment@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/environment/-/environment-1.1.0.tgz#8e86c66b180f363c7ab311787e0259665f45a9f1" - integrity sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q== - -err-code@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" - integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.5: - version "1.20.4" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.4.tgz#1d103f9f8d78d4cf0713edcd6d0ed1a46eed5861" - integrity sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA== - dependencies: - call-bind "^1.0.2" - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - function.prototype.name "^1.1.5" - get-intrinsic "^1.1.3" - get-symbol-description "^1.0.0" - has "^1.0.3" - has-property-descriptors "^1.0.0" - has-symbols "^1.0.3" - internal-slot "^1.0.3" - is-callable "^1.2.7" - is-negative-zero "^2.0.2" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" - is-string "^1.0.7" - is-weakref "^1.0.2" - object-inspect "^1.12.2" - object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.4.3" - safe-regex-test "^1.0.0" - string.prototype.trimend "^1.0.5" - string.prototype.trimstart "^1.0.5" - unbox-primitive "^1.0.2" - -es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.2: - version "1.23.3" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" - integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== - dependencies: - array-buffer-byte-length "^1.0.1" - arraybuffer.prototype.slice "^1.0.3" - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - data-view-buffer "^1.0.1" - data-view-byte-length "^1.0.1" - data-view-byte-offset "^1.0.0" - es-define-property "^1.0.0" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - es-set-tostringtag "^2.0.3" - es-to-primitive "^1.2.1" - function.prototype.name "^1.1.6" - get-intrinsic "^1.2.4" - get-symbol-description "^1.0.2" - globalthis "^1.0.3" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - has-proto "^1.0.3" - has-symbols "^1.0.3" - hasown "^2.0.2" - internal-slot "^1.0.7" - is-array-buffer "^3.0.4" - is-callable "^1.2.7" - is-data-view "^1.0.1" - is-negative-zero "^2.0.3" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.3" - is-string "^1.0.7" - is-typed-array "^1.1.13" - is-weakref "^1.0.2" - object-inspect "^1.13.1" - object-keys "^1.1.1" - object.assign "^4.1.5" - regexp.prototype.flags "^1.5.2" - safe-array-concat "^1.1.2" - safe-regex-test "^1.0.3" - string.prototype.trim "^1.2.9" - string.prototype.trimend "^1.0.8" - string.prototype.trimstart "^1.0.8" - typed-array-buffer "^1.0.2" - typed-array-byte-length "^1.0.1" - typed-array-byte-offset "^1.0.2" - typed-array-length "^1.0.6" - unbox-primitive "^1.0.2" - which-typed-array "^1.1.15" - -es-define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" - integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== - dependencies: - get-intrinsic "^1.2.4" - -es-errors@^1.2.1, es-errors@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" - integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== - -es-object-atoms@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" - integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== - dependencies: - es-errors "^1.3.0" - -es-set-tostringtag@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" - integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== - dependencies: - get-intrinsic "^1.2.4" - has-tostringtag "^1.0.2" - hasown "^2.0.1" - -es-shim-unscopables@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" - integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== - dependencies: - has "^1.0.3" - -es-shim-unscopables@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" - integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== - dependencies: - hasown "^2.0.0" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -esbuild@^0.21.5: - version "0.21.5" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d" - integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== - optionalDependencies: - "@esbuild/aix-ppc64" "0.21.5" - "@esbuild/android-arm" "0.21.5" - "@esbuild/android-arm64" "0.21.5" - "@esbuild/android-x64" "0.21.5" - "@esbuild/darwin-arm64" "0.21.5" - "@esbuild/darwin-x64" "0.21.5" - "@esbuild/freebsd-arm64" "0.21.5" - "@esbuild/freebsd-x64" "0.21.5" - "@esbuild/linux-arm" "0.21.5" - "@esbuild/linux-arm64" "0.21.5" - "@esbuild/linux-ia32" "0.21.5" - "@esbuild/linux-loong64" "0.21.5" - "@esbuild/linux-mips64el" "0.21.5" - "@esbuild/linux-ppc64" "0.21.5" - "@esbuild/linux-riscv64" "0.21.5" - "@esbuild/linux-s390x" "0.21.5" - "@esbuild/linux-x64" "0.21.5" - "@esbuild/netbsd-x64" "0.21.5" - "@esbuild/openbsd-x64" "0.21.5" - "@esbuild/sunos-x64" "0.21.5" - "@esbuild/win32-arm64" "0.21.5" - "@esbuild/win32-ia32" "0.21.5" - "@esbuild/win32-x64" "0.21.5" - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-string-regexp@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" - integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eslint-config-airbnb-base@^15.0.0: - version "15.0.0" - resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz#6b09add90ac79c2f8d723a2580e07f3925afd236" - integrity sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig== - dependencies: - confusing-browser-globals "^1.0.10" - object.assign "^4.1.2" - object.entries "^1.1.5" - semver "^6.3.0" - -eslint-import-resolver-node@^0.3.9: - version "0.3.9" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" - integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== - dependencies: - debug "^3.2.7" - is-core-module "^2.13.0" - resolve "^1.22.4" - -eslint-module-utils@^2.8.0: - version "2.8.1" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz#52f2404300c3bd33deece9d7372fb337cc1d7c34" - integrity sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q== - dependencies: - debug "^3.2.7" - -eslint-plugin-import@^2.29.1: - version "2.29.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643" - integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== - dependencies: - array-includes "^3.1.7" - array.prototype.findlastindex "^1.2.3" - array.prototype.flat "^1.3.2" - array.prototype.flatmap "^1.3.2" - debug "^3.2.7" - doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.9" - eslint-module-utils "^2.8.0" - hasown "^2.0.0" - is-core-module "^2.13.1" - is-glob "^4.0.3" - minimatch "^3.1.2" - object.fromentries "^2.0.7" - object.groupby "^1.0.1" - object.values "^1.1.7" - semver "^6.3.1" - tsconfig-paths "^3.15.0" - -eslint-scope@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.0.1.tgz#a9601e4b81a0b9171657c343fb13111688963cfc" - integrity sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-visitor-keys@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" - integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== - -eslint-visitor-keys@^3.4.3: - version "3.4.3" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" - integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== - -eslint-visitor-keys@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz#e3adc021aa038a2a8e0b2f8b0ce8f66b9483b1fb" - integrity sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw== - -eslint@^9.5.0: - version "9.5.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.5.0.tgz#11856034b94a9e1a02cfcc7e96a9f0956963cd2f" - integrity sha512-+NAOZFrW/jFTS3dASCGBxX1pkFD0/fsO+hfAkJ4TyYKwgsXZbqzrw+seCYFCcPCYXvnD67tAnglU7GQTz6kcVw== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.6.1" - "@eslint/config-array" "^0.16.0" - "@eslint/eslintrc" "^3.1.0" - "@eslint/js" "9.5.0" - "@humanwhocodes/module-importer" "^1.0.1" - "@humanwhocodes/retry" "^0.3.0" - "@nodelib/fs.walk" "^1.2.8" - ajv "^6.12.4" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.3.2" - escape-string-regexp "^4.0.0" - eslint-scope "^8.0.1" - eslint-visitor-keys "^4.0.0" - espree "^10.0.1" - esquery "^1.5.0" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^8.0.0" - find-up "^5.0.0" - glob-parent "^6.0.2" - ignore "^5.2.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - is-path-inside "^3.0.3" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.1.2" - natural-compare "^1.4.0" - optionator "^0.9.3" - strip-ansi "^6.0.1" - text-table "^0.2.0" - -espree@^10.0.1: - version "10.1.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-10.1.0.tgz#8788dae611574c0f070691f522e4116c5a11fc56" - integrity sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA== - dependencies: - acorn "^8.12.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^4.0.0" - -esquery@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" - integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^5.1.0, estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -execa@^8.0.0, execa@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" - integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^8.0.1" - human-signals "^5.0.0" - is-stream "^3.0.0" - merge-stream "^2.0.0" - npm-run-path "^5.1.0" - onetime "^6.0.0" - signal-exit "^4.1.0" - strip-final-newline "^3.0.0" - -execa@^9.0.0: - version "9.3.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-9.3.0.tgz#b10b70f52c1a978985e8492cc1fa74795c59963c" - integrity sha512-l6JFbqnHEadBoVAVpN5dl2yCyfX28WoBAGaoQcNmLLSedOxTxcn2Qa83s8I/PA5i56vWru2OHOtrwF7Om2vqlg== - dependencies: - "@sindresorhus/merge-streams" "^4.0.0" - cross-spawn "^7.0.3" - figures "^6.1.0" - get-stream "^9.0.0" - human-signals "^7.0.0" - is-plain-obj "^4.1.0" - is-stream "^4.0.1" - npm-run-path "^5.2.0" - pretty-ms "^9.0.0" - signal-exit "^4.1.0" - strip-final-newline "^4.0.0" - yoctocolors "^2.0.0" - -expand-tilde@^2.0.0, expand-tilde@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" - integrity sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw== - dependencies: - homedir-polyfill "^1.0.1" - -exponential-backoff@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.1.tgz#64ac7526fe341ab18a39016cd22c787d01e00bf6" - integrity sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw== - -external-editor@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-glob@^3.2.9: - version "3.2.12" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" - integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-glob@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" - integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fastest-levenshtein@^1.0.16: - version "1.0.16" - resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" - integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== - -fastq@^1.6.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" - integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== - dependencies: - reusify "^1.0.4" - -fflate@~0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.8.2.tgz#fc8631f5347812ad6028bbe4a2308b2792aa1dea" - integrity sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A== - -figures@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - integrity sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA== - dependencies: - escape-string-regexp "^1.0.5" - -figures@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" - integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== - dependencies: - escape-string-regexp "^1.0.5" - -figures@^6.0.0, figures@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-6.1.0.tgz#935479f51865fa7479f6fa94fc6fc7ac14e62c4a" - integrity sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg== - dependencies: - is-unicode-supported "^2.0.0" - -file-entry-cache@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" - integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== - dependencies: - flat-cache "^4.0.0" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -find-node-modules@^2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/find-node-modules/-/find-node-modules-2.1.3.tgz#3c976cff2ca29ee94b4f9eafc613987fc4c0ee44" - integrity sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg== - dependencies: - findup-sync "^4.0.0" - merge "^2.1.1" - -find-root@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" - integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== - -find-up-simple@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/find-up-simple/-/find-up-simple-1.0.0.tgz#21d035fde9fdbd56c8f4d2f63f32fd93a1cfc368" - integrity sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw== - -find-up@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== - dependencies: - locate-path "^2.0.0" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -find-up@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-7.0.0.tgz#e8dec1455f74f78d888ad65bf7ca13dd2b4e66fb" - integrity sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g== - dependencies: - locate-path "^7.2.0" - path-exists "^5.0.0" - unicorn-magic "^0.1.0" - -find-versions@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-6.0.0.tgz#fda285d3bb7c0c098f09e0727c54d31735f0c7d1" - integrity sha512-2kCCtc+JvcZ86IGAz3Z2Y0A1baIz9fL31pH/0S1IqZr9Iwnjq8izfPtrCyQKO6TLMPELLsQMre7VDqeIKCsHkA== - dependencies: - semver-regex "^4.0.5" - super-regex "^1.0.0" - -findup-sync@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-4.0.0.tgz#956c9cdde804052b881b428512905c4a5f2cdef0" - integrity sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ== - dependencies: - detect-file "^1.0.0" - is-glob "^4.0.0" - micromatch "^4.0.2" - resolve-dir "^1.0.1" - -flat-cache@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" - integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== - dependencies: - flatted "^3.2.9" - keyv "^4.5.4" - -flatted@^3.2.9: - version "3.3.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" - integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== - -for-each@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== - dependencies: - is-callable "^1.1.3" - -foreground-child@^3.1.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.2.1.tgz#767004ccf3a5b30df39bed90718bab43fe0a59f7" - integrity sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA== - dependencies: - cross-spawn "^7.0.0" - signal-exit "^4.0.1" - -from2@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" - integrity sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g== - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.0" - -fs-extra@9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" - integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-extra@^11.0.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.1.0.tgz#5784b102104433bb0e090f48bfc4a30742c357ed" - integrity sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-minipass@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" - integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== - dependencies: - minipass "^3.0.0" - -fs-minipass@^3.0.0, fs-minipass@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-3.0.3.tgz#79a85981c4dc120065e96f62086bf6f9dc26cc54" - integrity sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw== - dependencies: - minipass "^7.0.3" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - -function-timeout@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/function-timeout/-/function-timeout-1.0.2.tgz#e5a7b6ffa523756ff20e1231bbe37b5f373aadd5" - integrity sha512-939eZS4gJ3htTHAldmyyuzlrD58P03fHG49v2JfFXbV6OhvZKRC9j2yAtdHw/zrp2zXHuv05zMIy40F0ge7spA== - -function.prototype.name@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" - integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.0" - functions-have-names "^1.2.2" - -function.prototype.name@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" - integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - functions-have-names "^1.2.3" - -functions-have-names@^1.2.2, functions-have-names@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" - integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.3" - -get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" - integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== - dependencies: - es-errors "^1.3.0" - function-bind "^1.1.2" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" - -get-stream@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -get-stream@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-7.0.1.tgz#1664dfe7d1678540ea6a4da3ae7cd59bf4e4a91e" - integrity sha512-3M8C1EOFN6r8AMUhwUAACIoXZJEOufDU5+0gFFN5uNs6XYOralD2Pqkl7m046va6x77FwposWXbAhPPIOus7mQ== - -get-stream@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" - integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== - -get-stream@^9.0.0: - version "9.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-9.0.1.tgz#95157d21df8eb90d1647102b63039b1df60ebd27" - integrity sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA== - dependencies: - "@sec-ant/readable-stream" "^0.4.1" - is-stream "^4.0.1" - -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" - integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" - -get-symbol-description@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" - integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== - dependencies: - call-bind "^1.0.5" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" - -git-log-parser@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/git-log-parser/-/git-log-parser-1.2.0.tgz#2e6a4c1b13fc00028207ba795a7ac31667b9fd4a" - integrity sha512-rnCVNfkTL8tdNryFuaY0fYiBWEBcgF748O6ZI61rslBvr2o7U65c2/6npCRqH40vuAhtgtDiqLTJjBVdrejCzA== - dependencies: - argv-formatter "~1.0.0" - spawn-error-forwarder "~1.0.0" - split2 "~1.0.0" - stream-combiner2 "~1.1.1" - through2 "~2.0.0" - traverse "~0.6.6" - -git-raw-commits@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-4.0.0.tgz#b212fd2bff9726d27c1283a1157e829490593285" - integrity sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ== - dependencies: - dargs "^8.0.0" - meow "^12.0.1" - split2 "^4.0.0" - -glob-parent@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob@7.2.3: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^10.2.2, glob@^10.3.10, glob@^10.4.1: - version "10.4.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.2.tgz#bed6b95dade5c1f80b4434daced233aee76160e5" - integrity sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w== - dependencies: - foreground-child "^3.1.0" - jackspeak "^3.1.2" - minimatch "^9.0.4" - minipass "^7.1.2" - package-json-from-dist "^1.0.0" - path-scurry "^1.11.1" - -global-directory@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/global-directory/-/global-directory-4.0.1.tgz#4d7ac7cfd2cb73f304c53b8810891748df5e361e" - integrity sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q== - dependencies: - ini "4.1.1" - -global-dirs@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" - integrity sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg== - dependencies: - ini "^1.3.4" - -global-modules@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" - integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== - dependencies: - global-prefix "^1.0.1" - is-windows "^1.0.1" - resolve-dir "^1.0.0" - -global-prefix@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" - integrity sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg== - dependencies: - expand-tilde "^2.0.2" - homedir-polyfill "^1.0.1" - ini "^1.3.4" - is-windows "^1.0.1" - which "^1.2.14" - -globals@^14.0.0: - version "14.0.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" - integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== - -globalthis@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" - integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== - dependencies: - define-properties "^1.2.1" - gopd "^1.0.1" - -globby@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - -globby@^14.0.0: - version "14.0.1" - resolved "https://registry.yarnpkg.com/globby/-/globby-14.0.1.tgz#a1b44841aa7f4c6d8af2bc39951109d77301959b" - integrity sha512-jOMLD2Z7MAhyG8aJpNOpmziMOP4rPLcc95oQPKXBazW82z+CEgPFBQvEpRUa1KeIMUJo4Wsm+q6uzO/Q/4BksQ== - dependencies: - "@sindresorhus/merge-streams" "^2.1.0" - fast-glob "^3.3.2" - ignore "^5.2.4" - path-type "^5.0.0" - slash "^5.1.0" - unicorn-magic "^0.1.0" - -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" - -graceful-fs@4.2.10, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.6: - version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== - -graceful-fs@^4.2.11: - version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -graphemer@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" - integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== - -handlebars@^4.7.7: - version "4.7.7" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" - integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== - dependencies: - minimist "^1.2.5" - neo-async "^2.6.0" - source-map "^0.6.1" - wordwrap "^1.0.0" - optionalDependencies: - uglify-js "^3.1.4" - -has-bigints@^1.0.1, has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" - integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== - dependencies: - get-intrinsic "^1.1.1" - -has-property-descriptors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" - integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== - dependencies: - es-define-property "^1.0.0" - -has-proto@^1.0.1, has-proto@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" - integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== - -has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== - dependencies: - has-symbols "^1.0.2" - -has-tostringtag@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" - integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== - dependencies: - has-symbols "^1.0.3" - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== - dependencies: - function-bind "^1.1.2" - -highlight.js@^10.7.1: - version "10.7.3" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" - integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== - -homedir-polyfill@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" - integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== - dependencies: - parse-passwd "^1.0.0" - -hook-std@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/hook-std/-/hook-std-3.0.0.tgz#47038a01981e07ce9d83a6a3b2eb98cad0f7bd58" - integrity sha512-jHRQzjSDzMtFy34AGj1DN+vq54WVuhSvKgrHf0OMiFQTwDD4L/qqofVEWjLOBMTn5+lCD3fPg32W9yOfnEJTTw== - -hosted-git-info@^7.0.0, hosted-git-info@^7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-7.0.2.tgz#9b751acac097757667f30114607ef7b661ff4f17" - integrity sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w== - dependencies: - lru-cache "^10.0.1" - -http-cache-semantics@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" - integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== - -http-proxy-agent@^7.0.0: - version "7.0.2" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e" - integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== - dependencies: - agent-base "^7.1.0" - debug "^4.3.4" - -https-proxy-agent@^7.0.0, https-proxy-agent@^7.0.1: - version "7.0.4" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz#8e97b841a029ad8ddc8731f26595bad868cb4168" - integrity sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg== - dependencies: - agent-base "^7.0.2" - debug "4" - -human-signals@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" - integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== - -human-signals@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-7.0.0.tgz#93e58e0c19cfec1dded4af10cd4969f5ab75f6c8" - integrity sha512-74kytxOUSvNbjrT9KisAbaTZ/eJwD/LrbM/kh5j0IhPuJzwuA19dWvniFGwBzN9rVjg+O/e+F310PjObDXS+9Q== - -husky@^9.0.11: - version "9.0.11" - resolved "https://registry.yarnpkg.com/husky/-/husky-9.0.11.tgz#fc91df4c756050de41b3e478b2158b87c1e79af9" - integrity sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw== - -iconv-lite@^0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -iconv-lite@^0.6.2: - version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -ieee754@^1.1.13: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -ignore-walk@^6.0.4: - version "6.0.5" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-6.0.5.tgz#ef8d61eab7da169078723d1f82833b36e200b0dd" - integrity sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A== - dependencies: - minimatch "^9.0.0" - -ignore@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" - integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== - -ignore@^5.2.4, ignore@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" - integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== - -import-fresh@^3.0.0, import-fresh@^3.2.1, import-fresh@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -import-from-esm@^1.0.3, import-from-esm@^1.3.1: - version "1.3.4" - resolved "https://registry.yarnpkg.com/import-from-esm/-/import-from-esm-1.3.4.tgz#39e97c84085e308fe66cf872a667046b45449df0" - integrity sha512-7EyUlPFC0HOlBDpUFGfYstsU7XHxZJKAAMzCT8wZ0hMW7b+hG51LIKTDcsgtz8Pu6YC0HqRVbX+rVUtsGMUKvg== - dependencies: - debug "^4.3.4" - import-meta-resolve "^4.0.0" - -import-meta-resolve@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz#f9db8bead9fafa61adb811db77a2bf22c5399706" - integrity sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw== - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -indent-string@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-5.0.0.tgz#4fd2980fccaf8622d14c64d694f4cf33c81951a5" - integrity sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg== - -index-to-position@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/index-to-position/-/index-to-position-0.1.2.tgz#e11bfe995ca4d8eddb1ec43274488f3c201a7f09" - integrity sha512-MWDKS3AS1bGCHLBA2VLImJz42f7bJh8wQsTGCzI3j519/CASStoDONUBVz2I/VID0MpiX3SGSnbOD2xUalbE5g== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -ini@4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.1.tgz#d95b3d843b1e906e56d6747d5447904ff50ce7a1" - integrity sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g== - -ini@^1.3.4, ini@~1.3.0: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -ini@^4.1.2, ini@^4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.3.tgz#4c359675a6071a46985eb39b14e4a2c0ec98a795" - integrity sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg== - -init-package-json@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-6.0.3.tgz#2552fba75b6eed2495dc97f44183e2e5a5bcf8b0" - integrity sha512-Zfeb5ol+H+eqJWHTaGca9BovufyGeIfr4zaaBorPmJBMrJ+KBnN+kQx2ZtXdsotUTgldHmHQV44xvUWOUA7E2w== - dependencies: - "@npmcli/package-json" "^5.0.0" - npm-package-arg "^11.0.0" - promzard "^1.0.0" - read "^3.0.1" - semver "^7.3.5" - validate-npm-package-license "^3.0.4" - validate-npm-package-name "^5.0.0" - -inquirer@8.2.5: - version "8.2.5" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.5.tgz#d8654a7542c35a9b9e069d27e2df4858784d54f8" - integrity sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ== - dependencies: - ansi-escapes "^4.2.1" - chalk "^4.1.1" - cli-cursor "^3.1.0" - cli-width "^3.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.21" - mute-stream "0.0.8" - ora "^5.4.1" - run-async "^2.4.0" - rxjs "^7.5.5" - string-width "^4.1.0" - strip-ansi "^6.0.0" - through "^2.3.6" - wrap-ansi "^7.0.0" - -internal-slot@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" - integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== - dependencies: - get-intrinsic "^1.1.0" - has "^1.0.3" - side-channel "^1.0.4" - -internal-slot@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" - integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== - dependencies: - es-errors "^1.3.0" - hasown "^2.0.0" - side-channel "^1.0.4" - -into-stream@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-7.0.0.tgz#d1a211e146be8acfdb84dabcbf00fe8205e72936" - integrity sha512-2dYz766i9HprMBasCMvHMuazJ7u4WzhJwo5kb3iPSiW/iRYV6uPari3zHoqZlnuaR7V1bEiNMxikhp37rdBXbw== - dependencies: - from2 "^2.3.0" - p-is-promise "^3.0.0" - -ip-address@^9.0.5: - version "9.0.5" - resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-9.0.5.tgz#117a960819b08780c3bd1f14ef3c1cc1d3f3ea5a" - integrity sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g== - dependencies: - jsbn "1.1.0" - sprintf-js "^1.1.3" - -ip-regex@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-5.0.0.tgz#cd313b2ae9c80c07bd3851e12bf4fa4dc5480632" - integrity sha512-fOCG6lhoKKakwv+C6KdsOnGvgXnmgfmp0myi3bcNwj3qfwPAxRKWEuFhvEFF7ceYIz6+1jRZ+yguLFAmUNPEfw== - -is-array-buffer@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" - integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== - dependencies: - has-bigints "^1.0.1" - -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" - integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== - -is-cidr@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/is-cidr/-/is-cidr-5.1.0.tgz#36f2d059f43f9b14f132745a2eec18c996df2f35" - integrity sha512-OkVS+Ht2ssF27d48gZdB+ho1yND1VbkJRKKS6Pc1/Cw7uqkd9IOJg8/bTwBDQL6tfBhSdguPRnlGiE8pU/X5NQ== - dependencies: - cidr-regex "^4.1.1" - -is-core-module@^2.13.0, is-core-module@^2.13.1: - version "2.14.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.14.0.tgz#43b8ef9f46a6a08888db67b1ffd4ec9e3dfd59d1" - integrity sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A== - dependencies: - hasown "^2.0.2" - -is-data-view@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" - integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== - dependencies: - is-typed-array "^1.1.13" - -is-date-object@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-interactive@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" - integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== - -is-lambda@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" - integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== - -is-negative-zero@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" - integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== - -is-negative-zero@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" - integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== - -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== - dependencies: - has-tostringtag "^1.0.0" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-obj@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" - integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== - -is-path-inside@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -is-plain-obj@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" - integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== - -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-shared-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" - integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== - dependencies: - call-bind "^1.0.2" - -is-shared-array-buffer@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" - integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== - dependencies: - call-bind "^1.0.7" - -is-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" - integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== - -is-stream@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-4.0.1.tgz#375cf891e16d2e4baec250b85926cffc14720d9b" - integrity sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A== - -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^1.0.0" - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - -is-text-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-2.0.0.tgz#b2484e2b720a633feb2e85b67dc193ff72c75636" - integrity sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw== - dependencies: - text-extensions "^2.0.0" - -is-typed-array@^1.1.13: - version "1.1.13" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" - integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== - dependencies: - which-typed-array "^1.1.14" - -is-unicode-supported@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" - integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== - -is-unicode-supported@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-2.0.0.tgz#fdf32df9ae98ff6ab2cedc155a5a6e895701c451" - integrity sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q== - -is-utf8@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - integrity sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q== - -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== - dependencies: - call-bind "^1.0.2" - -is-windows@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -isexe@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-3.1.1.tgz#4a407e2bd78ddfb14bea0c27c6f7072dde775f0d" - integrity sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ== - -issue-parser@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/issue-parser/-/issue-parser-7.0.1.tgz#8a053e5a4952c75bb216204e454b4fc7d4cc9637" - integrity sha512-3YZcUUR2Wt1WsapF+S/WiA2WmlW0cWAoPccMqne7AxEBhCdFeTPjfv/Axb8V2gyCgY3nRw+ksZ3xSUX+R47iAg== - dependencies: - lodash.capitalize "^4.2.1" - lodash.escaperegexp "^4.1.2" - lodash.isplainobject "^4.0.6" - lodash.isstring "^4.0.1" - lodash.uniqby "^4.7.0" - -jackspeak@^3.1.2: - version "3.4.0" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.0.tgz#a75763ff36ad778ede6a156d8ee8b124de445b4a" - integrity sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw== - dependencies: - "@isaacs/cliui" "^8.0.2" - optionalDependencies: - "@pkgjs/parseargs" "^0.11.0" - -java-properties@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/java-properties/-/java-properties-1.0.2.tgz#ccd1fa73907438a5b5c38982269d0e771fe78211" - integrity sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ== - -jiti@^1.19.1: - version "1.21.6" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.6.tgz#6c7f7398dd4b3142767f9a168af2f317a428d268" - integrity sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w== - -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -jsbn@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040" - integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== - -json-buffer@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" - integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== - -json-parse-better-errors@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-parse-even-better-errors@^3.0.0, json-parse-even-better-errors@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz#b43d35e89c0f3be6b5fbbe9dc6c82467b30c28da" - integrity sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - -json-stringify-nice@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz#2c937962b80181d3f317dd39aa323e14f5a60a67" - integrity sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw== - -json5@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" - integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== - dependencies: - minimist "^1.2.0" - -jsonfile@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - dependencies: - universalify "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -jsonparse@^1.2.0, jsonparse@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" - integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== - -just-diff-apply@^5.2.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/just-diff-apply/-/just-diff-apply-5.5.0.tgz#771c2ca9fa69f3d2b54e7c3f5c1dfcbcc47f9f0f" - integrity sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw== - -just-diff@^6.0.0: - version "6.0.2" - resolved "https://registry.yarnpkg.com/just-diff/-/just-diff-6.0.2.tgz#03b65908543ac0521caf6d8eb85035f7d27ea285" - integrity sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA== - -keyv@^4.5.4: - version "4.5.4" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" - integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== - dependencies: - json-buffer "3.0.1" - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -libnpmaccess@^8.0.6: - version "8.0.6" - resolved "https://registry.yarnpkg.com/libnpmaccess/-/libnpmaccess-8.0.6.tgz#73be4c236258babc0a0bca6d3b6a93a6adf937cf" - integrity sha512-uM8DHDEfYG6G5gVivVl+yQd4pH3uRclHC59lzIbSvy7b5FEwR+mU49Zq1jEyRtRFv7+M99mUW9S0wL/4laT4lw== - dependencies: - npm-package-arg "^11.0.2" - npm-registry-fetch "^17.0.1" - -libnpmdiff@^6.1.3: - version "6.1.3" - resolved "https://registry.yarnpkg.com/libnpmdiff/-/libnpmdiff-6.1.3.tgz#6c26dbec7990e0c622383b053cae56ddceb25aac" - integrity sha512-ZBZxRabREY9XsLxgP1nIBkLVw9XbG6phD7CqhXAEu4pdiX0LdJm+IViicfbdEuYTcXLIHotexMpukBWX6ALkzA== - dependencies: - "@npmcli/arborist" "^7.5.3" - "@npmcli/installed-package-contents" "^2.1.0" - binary-extensions "^2.3.0" - diff "^5.1.0" - minimatch "^9.0.4" - npm-package-arg "^11.0.2" - pacote "^18.0.6" - tar "^6.2.1" - -libnpmexec@^8.1.2: - version "8.1.2" - resolved "https://registry.yarnpkg.com/libnpmexec/-/libnpmexec-8.1.2.tgz#cf4cfda58c88cdea00b7453af5b1b54b5e439ae8" - integrity sha512-TKWDOjndJ/wQU93ToRN5wtLM4UpMyG2iB3v5LmjxE3rADIsOBqIdBxJsEyZGDHYAJNuytz8NTTFR1IBSTUA0rA== - dependencies: - "@npmcli/arborist" "^7.5.3" - "@npmcli/run-script" "^8.1.0" - ci-info "^4.0.0" - npm-package-arg "^11.0.2" - pacote "^18.0.6" - proc-log "^4.2.0" - read "^3.0.1" - read-package-json-fast "^3.0.2" - semver "^7.3.7" - walk-up-path "^3.0.1" - -libnpmfund@^5.0.11: - version "5.0.11" - resolved "https://registry.yarnpkg.com/libnpmfund/-/libnpmfund-5.0.11.tgz#a1b8d881f41d8d3e5047666f1da00e905506a2b6" - integrity sha512-lk+2awKGcj6gUF99IbD2JThUSSrrXcCpPhDdG+nj34xV+Yq0f5K0SSaXe+gqLYF9N3hmqGKolj/AoHc9zF90Rg== - dependencies: - "@npmcli/arborist" "^7.5.3" - -libnpmhook@^10.0.5: - version "10.0.5" - resolved "https://registry.yarnpkg.com/libnpmhook/-/libnpmhook-10.0.5.tgz#22cbaf43b20ab56a797c19d254af0cf2ffb5c985" - integrity sha512-XulT+N/s3o9oFlIq6pGRv3OG2qR1NVRbVQOKLchycDwyf16RZA3oXbeEgs2H3oE7hRZPUMBZqsalQXMMPal3cQ== - dependencies: - aproba "^2.0.0" - npm-registry-fetch "^17.0.1" - -libnpmorg@^6.0.6: - version "6.0.6" - resolved "https://registry.yarnpkg.com/libnpmorg/-/libnpmorg-6.0.6.tgz#657c5e8b51447bb772d7d1d09c3a13693ce867b7" - integrity sha512-4MVxsAS4H2z7su/sU0GsrirfBm4ssfqPRSDvoZ8qmRw58kEWJ0qE0cQ2VilRlFgCWKzKPhfoPeyNPyxBTnOusA== - dependencies: - aproba "^2.0.0" - npm-registry-fetch "^17.0.1" - -libnpmpack@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/libnpmpack/-/libnpmpack-7.0.3.tgz#5d4b2cc10c515669775746083e6c6c3907a645d1" - integrity sha512-6Fi3XI+Kj8S9grEFg6fPsjKiG8DCDFTQT6Wp0LZS75zHbyaJyD9i30sQmWhvY0q0I75Nzt4QuSnQ9s96szDPdA== - dependencies: - "@npmcli/arborist" "^7.5.3" - "@npmcli/run-script" "^8.1.0" - npm-package-arg "^11.0.2" - pacote "^18.0.6" - -libnpmpublish@^9.0.9: - version "9.0.9" - resolved "https://registry.yarnpkg.com/libnpmpublish/-/libnpmpublish-9.0.9.tgz#e737378c09f09738377d2a276734be35cffb85e2" - integrity sha512-26zzwoBNAvX9AWOPiqqF6FG4HrSCPsHFkQm7nT+xU1ggAujL/eae81RnCv4CJ2In9q9fh10B88sYSzKCUh/Ghg== - dependencies: - ci-info "^4.0.0" - normalize-package-data "^6.0.1" - npm-package-arg "^11.0.2" - npm-registry-fetch "^17.0.1" - proc-log "^4.2.0" - semver "^7.3.7" - sigstore "^2.2.0" - ssri "^10.0.6" - -libnpmsearch@^7.0.6: - version "7.0.6" - resolved "https://registry.yarnpkg.com/libnpmsearch/-/libnpmsearch-7.0.6.tgz#03c375f69284f0732175ce1d4af6e239b2fb2f2a" - integrity sha512-PmiER4bgiIqN9OjBtgPn2/PxwU+OdJWtLBFM+vewOrn4VmaNAHSUKDt/wxOOkZSDLyMICVUBp61Ji1+XxhSrKw== - dependencies: - npm-registry-fetch "^17.0.1" - -libnpmteam@^6.0.5: - version "6.0.5" - resolved "https://registry.yarnpkg.com/libnpmteam/-/libnpmteam-6.0.5.tgz#95cb341806bc23d137478ad1d30bb353efda2711" - integrity sha512-iJW4Cq42GMqMwZEV+Mx8ZLj0Np5kGXQ9P/BAekHjIpYC1v3/vJqbmfJkzkwFvGxEhUotmx+xpLChZCDJ7c3rxA== - dependencies: - aproba "^2.0.0" - npm-registry-fetch "^17.0.1" - -libnpmversion@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/libnpmversion/-/libnpmversion-6.0.3.tgz#f55c64f76f582857a9a963e6e5ffd0b4f83fab76" - integrity sha512-Kjk1anQ9sPn7E/qF1jXumItvr2OA1914tYWkSTXH9G2rYoY+Ol1+KNrWfGeje2aBvFfKlt4VeKdCfM3yxMXNBw== - dependencies: - "@npmcli/git" "^5.0.7" - "@npmcli/run-script" "^8.1.0" - json-parse-even-better-errors "^3.0.2" - proc-log "^4.2.0" - semver "^7.3.7" - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -lit-element@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/lit-element/-/lit-element-4.0.4.tgz#e0b37ebbe2394bcb9578d611a409f49475dff361" - integrity sha512-98CvgulX6eCPs6TyAIQoJZBCQPo80rgXR+dVBs61cstJXqtI+USQZAbA4gFHh6L/mxBx9MrgPLHLsUgDUHAcCQ== - dependencies: - "@lit-labs/ssr-dom-shim" "^1.2.0" - "@lit/reactive-element" "^2.0.4" - lit-html "^3.1.2" - -lit-html@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/lit-html/-/lit-html-3.1.2.tgz#6655ce82367472de7680c62b1bcb0beb0e426fa1" - integrity sha512-3OBZSUrPnAHoKJ9AMjRL/m01YJxQMf+TMHanNtTHG68ubjnZxK0RFl102DPzsw4mWnHibfZIBJm3LWCZ/LmMvg== - dependencies: - "@types/trusted-types" "^2.0.2" - -lit@^3.1.4: - version "3.1.4" - resolved "https://registry.yarnpkg.com/lit/-/lit-3.1.4.tgz#03a72e9f0b1f5da317bf49b1ab579a7132e73d7a" - integrity sha512-q6qKnKXHy2g1kjBaNfcoLlgbI3+aSOZ9Q4tiGa9bGYXq5RBXxkVTqTIVmP2VWMp29L4GyvCFm8ZQ2o56eUAMyA== - dependencies: - "@lit/reactive-element" "^2.0.4" - lit-element "^4.0.4" - lit-html "^3.1.2" - -load-json-file@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" - integrity sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw== - dependencies: - graceful-fs "^4.1.2" - parse-json "^4.0.0" - pify "^3.0.0" - strip-bom "^3.0.0" - -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -locate-path@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-7.2.0.tgz#69cb1779bd90b35ab1e771e1f2f89a202c2a8a8a" - integrity sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA== - dependencies: - p-locate "^6.0.0" - -lodash-es@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" - integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== - -lodash.camelcase@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" - integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== - -lodash.capitalize@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz#f826c9b4e2a8511d84e3aca29db05e1a4f3b72a9" - integrity sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw== - -lodash.debounce@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== - -lodash.escaperegexp@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz#64762c48618082518ac3df4ccf5d5886dae20347" - integrity sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw== - -lodash.isequal@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" - integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== - -lodash.isplainobject@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" - integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== - -lodash.isstring@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" - integrity sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw== - -lodash.kebabcase@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" - integrity sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g== - -lodash.map@^4.5.1: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3" - integrity sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q== - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -lodash.mergewith@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz#617121f89ac55f59047c7aec1ccd6654c6590f55" - integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ== - -lodash.snakecase@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d" - integrity sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw== - -lodash.startcase@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.startcase/-/lodash.startcase-4.4.0.tgz#9436e34ed26093ed7ffae1936144350915d9add8" - integrity sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg== - -lodash.uniq@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" - integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== - -lodash.uniqby@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz#d99c07a669e9e6d24e1362dfe266c67616af1302" - integrity sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww== - -lodash.upperfirst@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz#1365edf431480481ef0d1c68957a5ed99d49f7ce" - integrity sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg== - -lodash@4.17.21, lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -log-symbols@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" - integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== - dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" - -longest@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/longest/-/longest-2.0.1.tgz#781e183296aa94f6d4d916dc335d0d17aefa23f8" - integrity sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q== - -lru-cache@^10.0.1, lru-cache@^10.2.0, lru-cache@^10.2.2: - version "10.2.2" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.2.tgz#48206bc114c1252940c41b25b41af5b545aca878" - integrity sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ== - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -luxon@^3.4.4: - version "3.4.4" - resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.4.4.tgz#cf20dc27dc532ba41a169c43fdcc0063601577af" - integrity sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA== - -make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -make-fetch-happen@^13.0.0, make-fetch-happen@^13.0.1: - version "13.0.1" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-13.0.1.tgz#273ba2f78f45e1f3a6dca91cede87d9fa4821e36" - integrity sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA== - dependencies: - "@npmcli/agent" "^2.0.0" - cacache "^18.0.0" - http-cache-semantics "^4.1.1" - is-lambda "^1.0.1" - minipass "^7.0.2" - minipass-fetch "^3.0.0" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.4" - negotiator "^0.6.3" - proc-log "^4.2.0" - promise-retry "^2.0.1" - ssri "^10.0.0" - -marked-terminal@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/marked-terminal/-/marked-terminal-7.1.0.tgz#f0ed9b9231f954d9920d38eae3cf10b0f589fad0" - integrity sha512-+pvwa14KZL74MVXjYdPR3nSInhGhNvPce/3mqLVZT2oUvt654sL1XImFuLZ1pkA866IYZ3ikDTOFUIC7XzpZZg== - dependencies: - ansi-escapes "^7.0.0" - chalk "^5.3.0" - cli-highlight "^2.1.11" - cli-table3 "^0.6.5" - node-emoji "^2.1.3" - supports-hyperlinks "^3.0.0" - -marked@^12.0.0: - version "12.0.2" - resolved "https://registry.yarnpkg.com/marked/-/marked-12.0.2.tgz#b31578fe608b599944c69807b00f18edab84647e" - integrity sha512-qXUm7e/YKFoqFPYPa3Ukg9xlI5cyAtGmyEIzMfW//m6kXwCy2Ps9DYf5ioijFKQ8qyuscrHoY04iJGctu2Kg0Q== - -meow@^12.0.1: - version "12.1.1" - resolved "https://registry.yarnpkg.com/meow/-/meow-12.1.1.tgz#e558dddbab12477b69b2e9a2728c327f191bace6" - integrity sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw== - -meow@^13.0.0: - version "13.2.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-13.2.0.tgz#6b7d63f913f984063b3cc261b6e8800c4cd3474f" - integrity sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA== - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -merge@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/merge/-/merge-2.1.1.tgz#59ef4bf7e0b3e879186436e8481c06a6c162ca98" - integrity sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w== - -meshoptimizer@~0.18.1: - version "0.18.1" - resolved "https://registry.yarnpkg.com/meshoptimizer/-/meshoptimizer-0.18.1.tgz#cdb90907f30a7b5b1190facd3b7ee6b7087797d8" - integrity sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw== - -micromatch@^4.0.2, micromatch@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== - dependencies: - braces "^3.0.2" - picomatch "^2.3.1" - -mime@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/mime/-/mime-4.0.3.tgz#cd4a1aa052fc980dfc34f111fe1be9e8b878c5d2" - integrity sha512-KgUb15Oorc0NEKPbvfa0wRU+PItIEZmiv+pyAO2i0oTIVTJhlzMclU7w4RXWQrSOVH5ax/p/CkIO7KI4OyFJTQ== - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -mimic-fn@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" - integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== - -minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^9.0.0, minimatch@^9.0.4: - version "9.0.5" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" - integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== - dependencies: - brace-expansion "^2.0.1" - -minimist@1.2.7, minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: - version "1.2.7" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" - integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== - -minimist@^1.2.8: - version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -minipass-collect@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-2.0.1.tgz#1621bc77e12258a12c60d34e2276ec5c20680863" - integrity sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw== - dependencies: - minipass "^7.0.3" - -minipass-fetch@^3.0.0: - version "3.0.5" - resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-3.0.5.tgz#f0f97e40580affc4a35cc4a1349f05ae36cb1e4c" - integrity sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg== - dependencies: - minipass "^7.0.3" - minipass-sized "^1.0.3" - minizlib "^2.1.2" - optionalDependencies: - encoding "^0.1.13" - -minipass-flush@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" - integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== - dependencies: - minipass "^3.0.0" - -minipass-pipeline@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" - integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== - dependencies: - minipass "^3.0.0" - -minipass-sized@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70" - integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== - dependencies: - minipass "^3.0.0" - -minipass@^3.0.0: - version "3.3.6" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" - integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== - dependencies: - yallist "^4.0.0" - -minipass@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.0.0.tgz#7cebb0f9fa7d56f0c5b17853cbe28838a8dbbd3b" - integrity sha512-g2Uuh2jEKoht+zvO6vJqXmYpflPqzRBT+Th2h01DKh5z7wbY/AZ2gCQ78cP70YoHPyFdY30YBV5WxgLOEwOykw== - dependencies: - yallist "^4.0.0" - -minipass@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" - integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== - -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.2, minipass@^7.0.3, minipass@^7.1.1, minipass@^7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" - integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== - -minizlib@^2.1.1, minizlib@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" - integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== - dependencies: - minipass "^3.0.0" - yallist "^4.0.0" - -mkdirp@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@^2.1.1, ms@^2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -mute-stream@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== - -mute-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-1.0.0.tgz#e31bd9fe62f0aed23520aa4324ea6671531e013e" - integrity sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA== - -mz@^2.4.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" - integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== - dependencies: - any-promise "^1.0.0" - object-assign "^4.0.1" - thenify-all "^1.0.0" - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -negotiator@^0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== - -neo-async@^2.6.0: - version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - -nerf-dart@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/nerf-dart/-/nerf-dart-1.0.0.tgz#e6dab7febf5ad816ea81cf5c629c5a0ebde72c1a" - integrity sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g== - -node-emoji@^2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-2.1.3.tgz#93cfabb5cc7c3653aa52f29d6ffb7927d8047c06" - integrity sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA== - dependencies: - "@sindresorhus/is" "^4.6.0" - char-regex "^1.0.2" - emojilib "^2.4.0" - skin-tone "^2.0.0" - -node-gyp@^10.0.0, node-gyp@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-10.1.0.tgz#75e6f223f2acb4026866c26a2ead6aab75a8ca7e" - integrity sha512-B4J5M1cABxPc5PwfjhbV5hoy2DP9p8lFXASnEN6hugXOa61416tnTZ29x9sSwAd0o99XNIcpvDDy1swAExsVKA== - dependencies: - env-paths "^2.2.0" - exponential-backoff "^3.1.1" - glob "^10.3.10" - graceful-fs "^4.2.6" - make-fetch-happen "^13.0.0" - nopt "^7.0.0" - proc-log "^3.0.0" - semver "^7.3.5" - tar "^6.1.2" - which "^4.0.0" - -nopt@^7.0.0, nopt@^7.2.1: - version "7.2.1" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-7.2.1.tgz#1cac0eab9b8e97c9093338446eddd40b2c8ca1e7" - integrity sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w== - dependencies: - abbrev "^2.0.0" - -normalize-package-data@^6.0.0, normalize-package-data@^6.0.1: - version "6.0.2" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-6.0.2.tgz#a7bc22167fe24025412bcff0a9651eb768b03506" - integrity sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g== - dependencies: - hosted-git-info "^7.0.0" - semver "^7.3.5" - validate-npm-package-license "^3.0.4" - -normalize-url@^8.0.0: - version "8.0.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-8.0.1.tgz#9b7d96af9836577c58f5883e939365fa15623a4a" - integrity sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w== - -npm-audit-report@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/npm-audit-report/-/npm-audit-report-5.0.0.tgz#83ac14aeff249484bde81eff53c3771d5048cf95" - integrity sha512-EkXrzat7zERmUhHaoren1YhTxFwsOu5jypE84k6632SXTHcQE1z8V51GC6GVZt8LxkC+tbBcKMUBZAgk8SUSbw== - -npm-bundled@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-3.0.1.tgz#cca73e15560237696254b10170d8f86dad62da25" - integrity sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ== - dependencies: - npm-normalize-package-bin "^3.0.0" - -npm-install-checks@^6.0.0, npm-install-checks@^6.2.0, npm-install-checks@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-6.3.0.tgz#046552d8920e801fa9f919cad569545d60e826fe" - integrity sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw== - dependencies: - semver "^7.1.1" - -npm-normalize-package-bin@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz#25447e32a9a7de1f51362c61a559233b89947832" - integrity sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ== - -npm-package-arg@^11.0.0, npm-package-arg@^11.0.2: - version "11.0.2" - resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-11.0.2.tgz#1ef8006c4a9e9204ddde403035f7ff7d718251ca" - integrity sha512-IGN0IAwmhDJwy13Wc8k+4PEbTPhpJnMtfR53ZbOyjkvmEcLS4nCwp6mvMWjS5sUjeiW3mpx6cHmuhKEu9XmcQw== - dependencies: - hosted-git-info "^7.0.0" - proc-log "^4.0.0" - semver "^7.3.5" - validate-npm-package-name "^5.0.0" - -npm-packlist@^8.0.0: - version "8.0.2" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-8.0.2.tgz#5b8d1d906d96d21c85ebbeed2cf54147477c8478" - integrity sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA== - dependencies: - ignore-walk "^6.0.4" - -npm-pick-manifest@^9.0.0, npm-pick-manifest@^9.0.1: - version "9.0.1" - resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-9.0.1.tgz#c90658bd726fe5bca9d2869f3e99359b8fcda046" - integrity sha512-Udm1f0l2nXb3wxDpKjfohwgdFUSV50UVwzEIpDXVsbDMXVIEF81a/i0UhuQbhrPMMmdiq3+YMFLFIRVLs3hxQw== - dependencies: - npm-install-checks "^6.0.0" - npm-normalize-package-bin "^3.0.0" - npm-package-arg "^11.0.0" - semver "^7.3.5" - -npm-profile@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/npm-profile/-/npm-profile-10.0.0.tgz#3fe941f487dde6686faff5e6b222bf92d38a3edd" - integrity sha512-DXnge3nHYnEnPxmVd/kPmgcXKXwVUqFihGnU+EJUiu5mIOs3awq6zEm0rRp3kSQNhFsoqdLu8L1TIfRyeBOCog== - dependencies: - npm-registry-fetch "^17.0.1" - proc-log "^4.0.0" - -npm-registry-fetch@^17.0.0, npm-registry-fetch@^17.0.1: - version "17.1.0" - resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-17.1.0.tgz#fb69e8e762d456f08bda2f5f169f7638fb92beb1" - integrity sha512-5+bKQRH0J1xG1uZ1zMNvxW0VEyoNWgJpY9UDuluPFLKDfJ9u2JmmjmTJV1srBGQOROfdBMiVvnH2Zvpbm+xkVA== - dependencies: - "@npmcli/redact" "^2.0.0" - jsonparse "^1.3.1" - make-fetch-happen "^13.0.0" - minipass "^7.0.2" - minipass-fetch "^3.0.0" - minizlib "^2.1.2" - npm-package-arg "^11.0.0" - proc-log "^4.0.0" - -npm-run-path@^5.1.0, npm-run-path@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f" - integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== - dependencies: - path-key "^4.0.0" - -npm-user-validate@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/npm-user-validate/-/npm-user-validate-2.0.1.tgz#097afbf0a2351e2a8f478f1ba07960b368f2a25c" - integrity sha512-d17PKaF2h8LSGFl5j4b1gHOJt1fgH7YUcCm1kNSJvaLWWKXlBsuUvx0bBEkr0qhsVA9XP5LtRZ83hdlhm2QkgA== - -npm@^10.5.0: - version "10.8.1" - resolved "https://registry.yarnpkg.com/npm/-/npm-10.8.1.tgz#1f1cb1305cd9246b9efe07d8629874df23157a2f" - integrity sha512-Dp1C6SvSMYQI7YHq/y2l94uvI+59Eqbu1EpuKQHQ8p16txXRuRit5gH3Lnaagk2aXDIjg/Iru9pd05bnneKgdw== - dependencies: - "@isaacs/string-locale-compare" "^1.1.0" - "@npmcli/arborist" "^7.5.3" - "@npmcli/config" "^8.3.3" - "@npmcli/fs" "^3.1.1" - "@npmcli/map-workspaces" "^3.0.6" - "@npmcli/package-json" "^5.1.1" - "@npmcli/promise-spawn" "^7.0.2" - "@npmcli/redact" "^2.0.0" - "@npmcli/run-script" "^8.1.0" - "@sigstore/tuf" "^2.3.4" - abbrev "^2.0.0" - archy "~1.0.0" - cacache "^18.0.3" - chalk "^5.3.0" - ci-info "^4.0.0" - cli-columns "^4.0.0" - fastest-levenshtein "^1.0.16" - fs-minipass "^3.0.3" - glob "^10.4.1" - graceful-fs "^4.2.11" - hosted-git-info "^7.0.2" - ini "^4.1.3" - init-package-json "^6.0.3" - is-cidr "^5.1.0" - json-parse-even-better-errors "^3.0.2" - libnpmaccess "^8.0.6" - libnpmdiff "^6.1.3" - libnpmexec "^8.1.2" - libnpmfund "^5.0.11" - libnpmhook "^10.0.5" - libnpmorg "^6.0.6" - libnpmpack "^7.0.3" - libnpmpublish "^9.0.9" - libnpmsearch "^7.0.6" - libnpmteam "^6.0.5" - libnpmversion "^6.0.3" - make-fetch-happen "^13.0.1" - minimatch "^9.0.4" - minipass "^7.1.1" - minipass-pipeline "^1.2.4" - ms "^2.1.2" - node-gyp "^10.1.0" - nopt "^7.2.1" - normalize-package-data "^6.0.1" - npm-audit-report "^5.0.0" - npm-install-checks "^6.3.0" - npm-package-arg "^11.0.2" - npm-pick-manifest "^9.0.1" - npm-profile "^10.0.0" - npm-registry-fetch "^17.0.1" - npm-user-validate "^2.0.1" - p-map "^4.0.0" - pacote "^18.0.6" - parse-conflict-json "^3.0.1" - proc-log "^4.2.0" - qrcode-terminal "^0.12.0" - read "^3.0.1" - semver "^7.6.2" - spdx-expression-parse "^4.0.0" - ssri "^10.0.6" - supports-color "^9.4.0" - tar "^6.2.1" - text-table "~0.2.0" - tiny-relative-date "^1.3.0" - treeverse "^3.0.0" - validate-npm-package-name "^5.0.1" - which "^4.0.0" - write-file-atomic "^5.0.1" - -object-assign@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -object-inspect@^1.12.2, object-inspect@^1.9.0: - version "1.12.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" - integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== - -object-inspect@^1.13.1: - version "1.13.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" - integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.2, object.assign@^4.1.4: - version "4.1.4" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" - integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - has-symbols "^1.0.3" - object-keys "^1.1.1" - -object.assign@^4.1.5: - version "4.1.5" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" - integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== - dependencies: - call-bind "^1.0.5" - define-properties "^1.2.1" - has-symbols "^1.0.3" - object-keys "^1.1.1" - -object.entries@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.5.tgz#e1acdd17c4de2cd96d5a08487cfb9db84d881861" - integrity sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - -object.fromentries@^2.0.7: - version "2.0.8" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" - integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-object-atoms "^1.0.0" - -object.groupby@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" - integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - -object.values@^1.1.7: - version "1.2.0" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" - integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -onetime@^5.1.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -onetime@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" - integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== - dependencies: - mimic-fn "^4.0.0" - -optionator@^0.9.3: - version "0.9.4" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" - integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== - dependencies: - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - word-wrap "^1.2.5" - -ora@^5.4.1: - version "5.4.1" - resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" - integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== - dependencies: - bl "^4.1.0" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-spinners "^2.5.0" - is-interactive "^1.0.0" - is-unicode-supported "^0.1.0" - log-symbols "^4.1.0" - strip-ansi "^6.0.0" - wcwidth "^1.0.1" - -os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== - -p-each-series@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-3.0.0.tgz#d1aed5e96ef29864c897367a7d2a628fdc960806" - integrity sha512-lastgtAdoH9YaLyDa5i5z64q+kzOcQHsQ5SsZJD3q0VEyI8mq872S3geuNbRUQLVAE9siMfgKrpj7MloKFHruw== - -p-filter@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-filter/-/p-filter-4.1.0.tgz#fe0aa794e2dfad8ecf595a39a245484fcd09c6e4" - integrity sha512-37/tPdZ3oJwHaS3gNJdenCDB3Tz26i9sjhnguBtvN0vYlRIiDNnvTWkuh+0hETV9rLPdJ3rlL3yVOYPIAnM8rw== - dependencies: - p-map "^7.0.1" - -p-is-promise@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-3.0.0.tgz#58e78c7dfe2e163cf2a04ff869e7c1dba64a5971" - integrity sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ== - -p-limit@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== - dependencies: - p-try "^1.0.0" - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-limit@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644" - integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== - dependencies: - yocto-queue "^1.0.0" - -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== - dependencies: - p-limit "^1.1.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-locate@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-6.0.0.tgz#3da9a49d4934b901089dca3302fa65dc5a05c04f" - integrity sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw== - dependencies: - p-limit "^4.0.0" - -p-map@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" - integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== - dependencies: - aggregate-error "^3.0.0" - -p-map@^7.0.1: - version "7.0.2" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-7.0.2.tgz#7c5119fada4755660f70199a66aa3fe2f85a1fe8" - integrity sha512-z4cYYMMdKHzw4O5UkWJImbZynVIo0lSGTXc7bzB1e/rrDqkgGUNysK/o4bTr+0+xKvvLoTyGqYC4Fgljy9qe1Q== - -p-reduce@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-3.0.0.tgz#f11773794792974bd1f7a14c72934248abff4160" - integrity sha512-xsrIUgI0Kn6iyDYm9StOpOeK29XM1aboGji26+QEortiFST1hGZaUQOLhtEbqHErPpGW/aSz6allwK2qcptp0Q== - -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== - -package-json-from-dist@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz#e501cd3094b278495eb4258d4c9f6d5ac3019f00" - integrity sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw== - -pacote@^18.0.0, pacote@^18.0.6: - version "18.0.6" - resolved "https://registry.yarnpkg.com/pacote/-/pacote-18.0.6.tgz#ac28495e24f4cf802ef911d792335e378e86fac7" - integrity sha512-+eK3G27SMwsB8kLIuj4h1FUhHtwiEUo21Tw8wNjmvdlpOEr613edv+8FUsTj/4F/VN5ywGE19X18N7CC2EJk6A== - dependencies: - "@npmcli/git" "^5.0.0" - "@npmcli/installed-package-contents" "^2.0.1" - "@npmcli/package-json" "^5.1.0" - "@npmcli/promise-spawn" "^7.0.0" - "@npmcli/run-script" "^8.0.0" - cacache "^18.0.0" - fs-minipass "^3.0.0" - minipass "^7.0.2" - npm-package-arg "^11.0.0" - npm-packlist "^8.0.0" - npm-pick-manifest "^9.0.0" - npm-registry-fetch "^17.0.0" - proc-log "^4.0.0" - promise-retry "^2.0.1" - sigstore "^2.2.0" - ssri "^10.0.0" - tar "^6.1.11" - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-conflict-json@^3.0.0, parse-conflict-json@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/parse-conflict-json/-/parse-conflict-json-3.0.1.tgz#67dc55312781e62aa2ddb91452c7606d1969960c" - integrity sha512-01TvEktc68vwbJOtWZluyWeVGWjP+bZwXtPDMQVbBKzbJ/vZBif0L69KH1+cHv1SZ6e0FKLvjyHe8mqsIqYOmw== - dependencies: - json-parse-even-better-errors "^3.0.0" - just-diff "^6.0.0" - just-diff-apply "^5.2.0" - -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== - dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - -parse-json@^5.0.0, parse-json@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -parse-json@^8.0.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-8.1.0.tgz#91cdc7728004e955af9cb734de5684733b24a717" - integrity sha512-rum1bPifK5SSar35Z6EKZuYPJx85pkNaFrxBK3mwdfSJ1/WKbYrjoW/zTPSjRRamfmVX1ACBIdFAO0VRErW/EA== - dependencies: - "@babel/code-frame" "^7.22.13" - index-to-position "^0.1.2" - type-fest "^4.7.1" - -parse-ms@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-4.0.0.tgz#c0c058edd47c2a590151a718990533fd62803df4" - integrity sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw== - -parse-passwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" - integrity sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q== - -parse5-htmlparser2-tree-adapter@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6" - integrity sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA== - dependencies: - parse5 "^6.0.1" - -parse5@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" - integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== - -parse5@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-exists@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-5.0.0.tgz#a6aad9489200b21fab31e49cf09277e5116fb9e7" - integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-key@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" - integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-scurry@^1.11.1: - version "1.11.1" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" - integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== - dependencies: - lru-cache "^10.2.0" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -path-type@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-5.0.0.tgz#14b01ed7aea7ddf9c7c3f46181d4d04f9c785bb8" - integrity sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg== - -picocolors@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" - integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== - -picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== - -pkg-conf@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/pkg-conf/-/pkg-conf-2.1.0.tgz#2126514ca6f2abfebd168596df18ba57867f0058" - integrity sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g== - dependencies: - find-up "^2.0.0" - load-json-file "^4.0.0" - -possible-typed-array-names@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" - integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== - -postcss-selector-parser@^6.0.10: - version "6.0.11" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz#2e41dc39b7ad74046e1615185185cd0b17d0c8dc" - integrity sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -pretty-ms@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-9.0.0.tgz#53c57f81171c53be7ce3fd20bdd4265422bc5929" - integrity sha512-E9e9HJ9R9NasGOgPaPE8VMeiPKAyWR5jcFpNnwIejslIhWqdqOrb2wShBsncMPUb+BcCd2OPYfh7p2W6oemTng== - dependencies: - parse-ms "^4.0.0" - -proc-log@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-3.0.0.tgz#fb05ef83ccd64fd7b20bbe9c8c1070fc08338dd8" - integrity sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A== - -proc-log@^4.0.0, proc-log@^4.1.0, proc-log@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-4.2.0.tgz#b6f461e4026e75fdfe228b265e9f7a00779d7034" - integrity sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA== - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -proggy@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/proggy/-/proggy-2.0.0.tgz#154bb0e41d3125b518ef6c79782455c2c47d94e1" - integrity sha512-69agxLtnI8xBs9gUGqEnK26UfiexpHy+KUpBQWabiytQjnn5wFY8rklAi7GRfABIuPNnQ/ik48+LGLkYYJcy4A== - -promise-all-reject-late@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz#f8ebf13483e5ca91ad809ccc2fcf25f26f8643c2" - integrity sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw== - -promise-call-limit@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/promise-call-limit/-/promise-call-limit-3.0.1.tgz#3570f7a3f2aaaf8e703623a552cd74749688cf19" - integrity sha512-utl+0x8gIDasV5X+PI5qWEPqH6fJS0pFtQ/4gZ95xfEFb/89dmh+/b895TbFDBLiafBvxD/PGTKfvxl4kH/pQg== - -promise-inflight@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" - integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== - -promise-retry@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" - integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== - dependencies: - err-code "^2.0.2" - retry "^0.12.0" - -promzard@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/promzard/-/promzard-1.0.2.tgz#2226e7c6508b1da3471008ae17066a7c3251e660" - integrity sha512-2FPputGL+mP3jJ3UZg/Dl9YOkovB7DX0oOr+ck5QbZ5MtORtds8k/BZdn+02peDLI8/YWbmzx34k5fA+fHvCVQ== - dependencies: - read "^3.0.1" - -proto-list@~1.2.1: - version "1.2.4" - resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" - integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== - -punycode@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -qrcode-terminal@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz#bb5b699ef7f9f0505092a3748be4464fe71b5819" - integrity sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -rc@^1.2.8: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -read-cmd-shim@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-4.0.0.tgz#640a08b473a49043e394ae0c7a34dd822c73b9bb" - integrity sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q== - -read-package-json-fast@^3.0.0, read-package-json-fast@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz#394908a9725dc7a5f14e70c8e7556dff1d2b1049" - integrity sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw== - dependencies: - json-parse-even-better-errors "^3.0.0" - npm-normalize-package-bin "^3.0.0" - -read-package-up@^11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/read-package-up/-/read-package-up-11.0.0.tgz#71fb879fdaac0e16891e6e666df22de24a48d5ba" - integrity sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ== - dependencies: - find-up-simple "^1.0.0" - read-pkg "^9.0.0" - type-fest "^4.6.0" - -read-pkg@^9.0.0: - version "9.0.1" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-9.0.1.tgz#b1b81fb15104f5dbb121b6bbdee9bbc9739f569b" - integrity sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA== - dependencies: - "@types/normalize-package-data" "^2.4.3" - normalize-package-data "^6.0.0" - parse-json "^8.0.0" - type-fest "^4.6.0" - unicorn-magic "^0.1.0" - -read@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/read/-/read-3.0.1.tgz#926808f0f7c83fa95f1ef33c0e2c09dbb28fd192" - integrity sha512-SLBrDU/Srs/9EoWhU5GdbAoxG1GzpQHo/6qiGItaoLJ1thmYpcNIM1qISEUvyHBzfGlWIyd6p2DNi1oV1VmAuw== - dependencies: - mute-stream "^1.0.0" - -readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@~2.3.6: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@^3.4.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -regenerator-runtime@^0.14.0: - version "0.14.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" - integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== - -regexp.prototype.flags@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" - integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - functions-have-names "^1.2.2" - -regexp.prototype.flags@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" - integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== - dependencies: - call-bind "^1.0.6" - define-properties "^1.2.1" - es-errors "^1.3.0" - set-function-name "^2.0.1" - -registry-auth-token@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-5.0.1.tgz#5e6cd106e6c251135a046650c58476fc03e92833" - integrity sha512-UfxVOj8seK1yaIOiieV4FIP01vfBDLsY0H9sQzi9EbbUdJiuuBjJgLa1DpImXMNPnVkBD4eVxTEXcrZA6kfpJA== - dependencies: - "@pnpm/npm-conf" "^1.0.4" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -resolve-dir@^1.0.0, resolve-dir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" - integrity sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg== - dependencies: - expand-tilde "^2.0.0" - global-modules "^1.0.0" - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve-global@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/resolve-global/-/resolve-global-1.0.0.tgz#a2a79df4af2ca3f49bf77ef9ddacd322dad19255" - integrity sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw== - dependencies: - global-dirs "^0.1.1" - -resolve@^1.22.4: - version "1.22.8" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" - integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - -retry@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" - integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -run-async@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" - integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -rxjs@^7.5.5: - version "7.8.0" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.0.tgz#90a938862a82888ff4c7359811a595e14e1e09a4" - integrity sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg== - dependencies: - tslib "^2.1.0" - -rxjs@^7.8.1: - version "7.8.1" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" - integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== - dependencies: - tslib "^2.1.0" - -safe-array-concat@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" - integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== - dependencies: - call-bind "^1.0.7" - get-intrinsic "^1.2.4" - has-symbols "^1.0.3" - isarray "^2.0.5" - -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-regex-test@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" - integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" - is-regex "^1.1.4" - -safe-regex-test@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" - integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== - dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - is-regex "^1.1.4" - -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -semantic-release-version-file@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/semantic-release-version-file/-/semantic-release-version-file-1.0.2.tgz#d83f13336ba968e0e2c4fcf769e1fcad26e2200c" - integrity sha512-/kf9hqGfy0iceKDC1dXGKajKXYfDEHlGFynIaoXOTUv3szlZ4Io2i+7sLl46y4Fv2DCKLeM+3sC/0IWxsgpL9A== - -semantic-release@24.0.0: - version "24.0.0" - resolved "https://registry.yarnpkg.com/semantic-release/-/semantic-release-24.0.0.tgz#779493f1426469ce0ef60cf74e50aba6e7a0af16" - integrity sha512-v46CRPw+9eI3ZuYGF2oAjqPqsfbnfFTwLBgQsv/lch4goD09ytwOTESMN4QIrx/wPLxUGey60/NMx+ANQtWRsA== - dependencies: - "@semantic-release/commit-analyzer" "^13.0.0-beta.1" - "@semantic-release/error" "^4.0.0" - "@semantic-release/github" "^10.0.0" - "@semantic-release/npm" "^12.0.0" - "@semantic-release/release-notes-generator" "^14.0.0-beta.1" - aggregate-error "^5.0.0" - cosmiconfig "^9.0.0" - debug "^4.0.0" - env-ci "^11.0.0" - execa "^9.0.0" - figures "^6.0.0" - find-versions "^6.0.0" - get-stream "^6.0.0" - git-log-parser "^1.2.0" - hook-std "^3.0.0" - hosted-git-info "^7.0.0" - import-from-esm "^1.3.1" - lodash-es "^4.17.21" - marked "^12.0.0" - marked-terminal "^7.0.0" - micromatch "^4.0.2" - p-each-series "^3.0.0" - p-reduce "^3.0.0" - read-package-up "^11.0.0" - resolve-from "^5.0.0" - semver "^7.3.2" - semver-diff "^4.0.0" - signale "^1.2.1" - yargs "^17.5.1" - -semver-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-4.0.0.tgz#3afcf5ed6d62259f5c72d0d5d50dffbdc9680df5" - integrity sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA== - dependencies: - semver "^7.3.5" - -semver-regex@^4.0.5: - version "4.0.5" - resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-4.0.5.tgz#fbfa36c7ba70461311f5debcb3928821eb4f9180" - integrity sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw== - -semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -semver@^6.3.1: - version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -semver@^7.1.1, semver@^7.1.2, semver@^7.3.2, semver@^7.3.5, semver@^7.3.7: - version "7.3.8" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" - integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== - dependencies: - lru-cache "^6.0.0" - -semver@^7.5.2, semver@^7.5.3, semver@^7.6.0, semver@^7.6.2: - version "7.6.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" - integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== - -set-function-length@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" - integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - -set-function-name@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" - integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - functions-have-names "^1.2.3" - has-property-descriptors "^1.0.2" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -shell-quote@^1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" - integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== - -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -signal-exit@^3.0.2: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -signal-exit@^4.0.1, signal-exit@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" - integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== - -signale@^1.2.1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/signale/-/signale-1.4.0.tgz#c4be58302fb0262ac00fc3d886a7c113759042f1" - integrity sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w== - dependencies: - chalk "^2.3.2" - figures "^2.0.0" - pkg-conf "^2.1.0" - -sigstore@^2.2.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/sigstore/-/sigstore-2.3.1.tgz#0755dd2cc4820f2e922506da54d3d628e13bfa39" - integrity sha512-8G+/XDU8wNsJOQS5ysDVO0Etg9/2uA5gR9l4ZwijjlwxBcrU6RPfwi2+jJmbP+Ap1Hlp/nVAaEO4Fj22/SL2gQ== - dependencies: - "@sigstore/bundle" "^2.3.2" - "@sigstore/core" "^1.0.0" - "@sigstore/protobuf-specs" "^0.3.2" - "@sigstore/sign" "^2.3.2" - "@sigstore/tuf" "^2.3.4" - "@sigstore/verify" "^1.2.1" - -skin-tone@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/skin-tone/-/skin-tone-2.0.0.tgz#4e3933ab45c0d4f4f781745d64b9f4c208e41237" - integrity sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA== - dependencies: - unicode-emoji-modifier-base "^1.0.0" - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -slash@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-5.1.0.tgz#be3adddcdf09ac38eebe8dcdc7b1a57a75b095ce" - integrity sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg== - -smart-buffer@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" - integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== - -socket.io-client@^4.7.5: - version "4.7.5" - resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-4.7.5.tgz#919be76916989758bdc20eec63f7ee0ae45c05b7" - integrity sha512-sJ/tqHOCe7Z50JCBCXrsY3I2k03iOiUe+tj1OmKeD2lXPiGH/RUCdTZFoqVyN7l1MnpIzPrGtLcijffmeouNlQ== - dependencies: - "@socket.io/component-emitter" "~3.1.0" - debug "~4.3.2" - engine.io-client "~6.5.2" - socket.io-parser "~4.2.4" - -socket.io-parser@~4.2.4: - version "4.2.4" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.4.tgz#c806966cf7270601e47469ddeec30fbdfda44c83" - integrity sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew== - dependencies: - "@socket.io/component-emitter" "~3.1.0" - debug "~4.3.1" - -socks-proxy-agent@^8.0.3: - version "8.0.3" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.3.tgz#6b2da3d77364fde6292e810b496cb70440b9b89d" - integrity sha512-VNegTZKhuGq5vSD6XNKlbqWhyt/40CgoEw8XxD6dhnm8Jq9IEa3nIa4HwnM8XOqU0CdB0BwWVXusqiFXfHB3+A== - dependencies: - agent-base "^7.1.1" - debug "^4.3.4" - socks "^2.7.1" - -socks@^2.7.1: - version "2.8.3" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.3.tgz#1ebd0f09c52ba95a09750afe3f3f9f724a800cb5" - integrity sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw== - dependencies: - ip-address "^9.0.5" - smart-buffer "^4.2.0" - -source-map@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -spawn-command@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2.tgz#9544e1a43ca045f8531aac1a48cb29bdae62338e" - integrity sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ== - -spawn-error-forwarder@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz#1afd94738e999b0346d7b9fc373be55e07577029" - integrity sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g== - -spdx-correct@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" - integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-expression-parse@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz#a23af9f3132115465dac215c099303e4ceac5794" - integrity sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.12" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz#69077835abe2710b65f03969898b6637b505a779" - integrity sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA== - -split2@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" - integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== - -split2@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/split2/-/split2-1.0.0.tgz#52e2e221d88c75f9a73f90556e263ff96772b314" - integrity sha512-NKywug4u4pX/AZBB1FCPzZ6/7O+Xhz1qMVbzTvvKvikjO99oPN87SkK08mEY9P63/5lWjK+wgOOgApnTg5r6qg== - dependencies: - through2 "~2.0.0" - -sprintf-js@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" - integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== - -ssri@^10.0.0, ssri@^10.0.6: - version "10.0.6" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-10.0.6.tgz#a8aade2de60ba2bce8688e3fa349bad05c7dc1e5" - integrity sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ== - dependencies: - minipass "^7.0.3" - -stream-combiner2@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.1.1.tgz#fb4d8a1420ea362764e21ad4780397bebcb41cbe" - integrity sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw== - dependencies: - duplexer2 "~0.1.0" - readable-stream "^2.0.2" - -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^5.0.1, string-width@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" - -string.prototype.trim@^1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" - integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.0" - es-object-atoms "^1.0.0" - -string.prototype.trimend@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz#914a65baaab25fbdd4ee291ca7dde57e869cb8d0" - integrity sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.19.5" - -string.prototype.trimend@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" - integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -string.prototype.trimstart@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz#5466d93ba58cfa2134839f81d7f42437e8c01fef" - integrity sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.19.5" - -string.prototype.trimstart@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" - integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^7.0.1: - version "7.1.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" - integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== - dependencies: - ansi-regex "^6.0.1" - -strip-bom@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" - integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== - -strip-final-newline@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" - integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== - -strip-final-newline@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-4.0.0.tgz#35a369ec2ac43df356e3edd5dcebb6429aa1fa5c" - integrity sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw== - -strip-json-comments@3.1.1, strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== - -super-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/super-regex/-/super-regex-1.0.0.tgz#dd90d944a925a1083e7d8570919b21cb76e3d925" - integrity sha512-CY8u7DtbvucKuquCmOFEKhr9Besln7n9uN8eFbwcoGYWXOMW07u2o8njWaiXt11ylS3qoGF55pILjRmPlbodyg== - dependencies: - function-timeout "^1.0.1" - time-span "^5.1.0" - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.0.0, supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.1.1: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-color@^9.4.0: - version "9.4.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-9.4.0.tgz#17bfcf686288f531db3dea3215510621ccb55954" - integrity sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw== - -supports-hyperlinks@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-3.0.0.tgz#c711352a5c89070779b4dad54c05a2f14b15c94b" - integrity sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA== - dependencies: - has-flag "^4.0.0" - supports-color "^7.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -tar@^6.1.11, tar@^6.1.2: - version "6.1.13" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.13.tgz#46e22529000f612180601a6fe0680e7da508847b" - integrity sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw== - dependencies: - chownr "^2.0.0" - fs-minipass "^2.0.0" - minipass "^4.0.0" - minizlib "^2.1.1" - mkdirp "^1.0.3" - yallist "^4.0.0" - -tar@^6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a" - integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== - dependencies: - chownr "^2.0.0" - fs-minipass "^2.0.0" - minipass "^5.0.0" - minizlib "^2.1.1" - mkdirp "^1.0.3" - yallist "^4.0.0" - -temp-dir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-3.0.0.tgz#7f147b42ee41234cc6ba3138cd8e8aa2302acffa" - integrity sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw== - -tempy@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/tempy/-/tempy-3.1.0.tgz#00958b6df85db8589cb595465e691852aac038e9" - integrity sha512-7jDLIdD2Zp0bDe5r3D2qtkd1QOCacylBuL7oa4udvN6v2pqr4+LcCr67C8DR1zkpaZ8XosF5m1yQSabKAW6f2g== - dependencies: - is-stream "^3.0.0" - temp-dir "^3.0.0" - type-fest "^2.12.2" - unique-string "^3.0.0" - -text-extensions@^2.0.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-2.4.0.tgz#a1cfcc50cf34da41bfd047cc744f804d1680ea34" - integrity sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g== - -text-table@^0.2.0, text-table@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -thenify-all@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" - integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== - dependencies: - thenify ">= 3.1.0 < 4" - -"thenify@>= 3.1.0 < 4": - version "3.3.1" - resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" - integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== - dependencies: - any-promise "^1.0.0" - -three-mesh-bvh@0.7.6: - version "0.7.6" - resolved "https://registry.yarnpkg.com/three-mesh-bvh/-/three-mesh-bvh-0.7.6.tgz#6764b39475bdba9450ad3a4065492678ee537272" - integrity sha512-rCjsnxEqR9r1/C/lCqzGLS67NDty/S/eT6rAJfDvsanrIctTWdNoR4ZOGWewCB13h1QkVo2BpmC0wakj1+0m8A== - -three-spritetext@1.8.2: - version "1.8.2" - resolved "https://registry.yarnpkg.com/three-spritetext/-/three-spritetext-1.8.2.tgz#62d8106e579274c65d86df2b56dda46b13fa97cc" - integrity sha512-OYjyAhWnQ6+7CPKjnpq3JQM+Lpr6cSOppCtbOOzF1IbCauGkoDFvbAnxYd0LVxEsIO2RALXXScg2eX+R6CAfyA== - -three@0.167.1: - version "0.167.1" - resolved "https://registry.yarnpkg.com/three/-/three-0.167.1.tgz#3fe4ba2b0a03fd662afe4977a56803d955b61689" - integrity sha512-gYTLJA/UQip6J/tJvl91YYqlZF47+D/kxiWrbTon35ZHlXEN0VOo+Qke2walF1/x92v55H6enomymg4Dak52kw== - -through2@~2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" - integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== - dependencies: - readable-stream "~2.3.6" - xtend "~4.0.1" - -"through@>=2.2.7 <3", through@^2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== - -time-span@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/time-span/-/time-span-5.1.0.tgz#80c76cf5a0ca28e0842d3f10a4e99034ce94b90d" - integrity sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA== - dependencies: - convert-hrtime "^5.0.0" - -tiny-relative-date@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/tiny-relative-date/-/tiny-relative-date-1.3.0.tgz#fa08aad501ed730f31cc043181d995c39a935e07" - integrity sha512-MOQHpzllWxDCHHaDno30hhLfbouoYlOI8YlMNtvKe1zXbjEVhbcEovQxvZrPvtiYW630GQDoMMarCnjfyfHA+A== - -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -traverse@~0.6.6: - version "0.6.7" - resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.7.tgz#46961cd2d57dd8706c36664acde06a248f1173fe" - integrity sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg== - -tree-kill@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" - integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== - -treeverse@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/treeverse/-/treeverse-3.0.0.tgz#dd82de9eb602115c6ebd77a574aae67003cb48c8" - integrity sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ== - -ts-api-utils@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" - integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== - -ts-node@^10.8.1: - version "10.9.1" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" - integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== - dependencies: - "@cspotcode/source-map-support" "^0.8.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - acorn "^8.4.1" - acorn-walk "^8.1.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - v8-compile-cache-lib "^3.0.1" - yn "3.1.1" - -tsc@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/tsc/-/tsc-2.0.4.tgz#5f6499146abea5dca4420b451fa4f2f9345238f5" - integrity sha512-fzoSieZI5KKJVBYGvwbVZs/J5za84f2lSTLPYf6AGiIf43tZ3GNrI1QzTLcjtyDDP4aLxd46RTZq1nQxe7+k5Q== - -tsconfig-paths@^3.15.0: - version "3.15.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" - integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.2" - minimist "^1.2.6" - strip-bom "^3.0.0" - -tslib@^2.1.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" - integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== - -tuf-js@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tuf-js/-/tuf-js-2.2.1.tgz#fdd8794b644af1a75c7aaa2b197ddffeb2911b56" - integrity sha512-GwIJau9XaA8nLVbUXsN3IlFi7WmQ48gBUrl3FTkkL/XLu/POhBzfmX9hd33FNMX1qAsfl6ozO1iMmW9NC8YniA== - dependencies: - "@tufjs/models" "2.0.1" - debug "^4.3.4" - make-fetch-happen "^13.0.1" - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - -type-fest@^1.0.1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" - integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== - -type-fest@^2.12.2: - version "2.19.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" - integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== - -type-fest@^4.6.0, type-fest@^4.7.1: - version "4.20.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.20.1.tgz#d97bb1e923bf524e5b4b43421d586760fb2ee8be" - integrity sha512-R6wDsVsoS9xYOpy8vgeBlqpdOyzJ12HNfQhC/aAKWM3YoCV9TtunJzh/QpkMgeDhkoynDcw5f1y+qF9yc/HHyg== - -typed-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" - integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - is-typed-array "^1.1.13" - -typed-array-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" - integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== - dependencies: - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - -typed-array-byte-offset@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" - integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - -typed-array-length@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" - integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== - dependencies: - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - possible-typed-array-names "^1.0.0" - -typescript@^4.6.4: - version "4.9.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.4.tgz#a2a3d2756c079abda241d75f149df9d561091e78" - integrity sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg== - -typescript@^5.5.2: - version "5.5.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.2.tgz#c26f023cb0054e657ce04f72583ea2d85f8d0507" - integrity sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew== - -uglify-js@^3.1.4: - version "3.17.4" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c" - integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== - -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" - integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== - dependencies: - call-bind "^1.0.2" - has-bigints "^1.0.2" - has-symbols "^1.0.3" - which-boxed-primitive "^1.0.2" - -unicode-emoji-modifier-base@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz#dbbd5b54ba30f287e2a8d5a249da6c0cef369459" - integrity sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g== - -unicorn-magic@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/unicorn-magic/-/unicorn-magic-0.1.0.tgz#1bb9a51c823aaf9d73a8bfcd3d1a23dde94b0ce4" - integrity sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ== - -unique-filename@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-3.0.0.tgz#48ba7a5a16849f5080d26c760c86cf5cf05770ea" - integrity sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g== - dependencies: - unique-slug "^4.0.0" - -unique-slug@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-4.0.0.tgz#6bae6bb16be91351badd24cdce741f892a6532e3" - integrity sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ== - dependencies: - imurmurhash "^0.1.4" - -unique-string@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-3.0.0.tgz#84a1c377aff5fd7a8bc6b55d8244b2bd90d75b9a" - integrity sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ== - dependencies: - crypto-random-string "^4.0.0" - -universal-user-agent@^7.0.0, universal-user-agent@^7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-7.0.2.tgz#52e7d0e9b3dc4df06cc33cb2b9fd79041a54827e" - integrity sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q== - -universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -url-join@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/url-join/-/url-join-5.0.0.tgz#c2f1e5cbd95fa91082a93b58a1f42fecb4bdbcf1" - integrity sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA== - -util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -v8-compile-cache-lib@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" - integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== - -validate-npm-package-license@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -validate-npm-package-name@^5.0.0, validate-npm-package-name@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz#a316573e9b49f3ccd90dbb6eb52b3f06c6d604e8" - integrity sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ== - -walk-up-path@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/walk-up-path/-/walk-up-path-3.0.1.tgz#c8d78d5375b4966c717eb17ada73dbd41490e886" - integrity sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA== - -wcwidth@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" - integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== - dependencies: - defaults "^1.0.3" - -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - -which-typed-array@^1.1.14, which-typed-array@^1.1.15: - version "1.1.15" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" - integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.2" - -which@^1.2.14: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -which@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/which/-/which-4.0.0.tgz#cd60b5e74503a3fbcfbf6cd6b4138a8bae644c1a" - integrity sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg== - dependencies: - isexe "^3.1.1" - -word-wrap@^1.0.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== - -word-wrap@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" - integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== - -wordwrap@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== - -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" - integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== - dependencies: - ansi-styles "^6.1.0" - string-width "^5.0.1" - strip-ansi "^7.0.1" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -write-file-atomic@^5.0.0, write-file-atomic@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-5.0.1.tgz#68df4717c55c6fa4281a7860b4c2ba0a6d2b11e7" - integrity sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw== - dependencies: - imurmurhash "^0.1.4" - signal-exit "^4.0.1" - -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== - -xmlhttprequest-ssl@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz#91360c86b914e67f44dce769180027c0da618c67" - integrity sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A== - -xtend@~4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yargs-parser@^20.2.2: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - -yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - -yargs@^16.0.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - -yargs@^17.0.0: - version "17.6.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.6.2.tgz#2e23f2944e976339a1ee00f18c77fedee8332541" - integrity sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - -yargs@^17.5.1, yargs@^17.7.2: - version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" - integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - -yn@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -yocto-queue@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" - integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== - -yoctocolors@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/yoctocolors/-/yoctocolors-2.0.2.tgz#8e871e30d7eabb1976776e07a9fe2fe9a8c46fba" - integrity sha512-Ct97huExsu7cWeEjmrXlofevF8CvzUglJ4iGUet5B8xn1oumtAZBpHU4GzYuoE6PVqcZ5hghtBrSlhwHuR1Jmw== - -zod@^3.23.8: - version "3.23.8" - resolved "https://registry.yarnpkg.com/zod/-/zod-3.23.8.tgz#e37b957b5d52079769fb8097099b592f0ef4067d" - integrity sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g== diff --git a/packages/yjs/.releaserc b/packages/yjs/.releaserc index 3c6ee6c..e641df6 100644 --- a/packages/yjs/.releaserc +++ b/packages/yjs/.releaserc @@ -15,7 +15,7 @@ "tagFormat": "@superviz/yjs/${version}", "plugins": [ "@semantic-release/commit-analyzer", - "semantic-release-version-file", + "@superviz/semantic-release-version-file", "@semantic-release/github", "@semantic-release/npm" ] diff --git a/packages/yjs/package.json b/packages/yjs/package.json index bfd3d13..e788860 100644 --- a/packages/yjs/package.json +++ b/packages/yjs/package.json @@ -40,6 +40,7 @@ }, "homepage": "https://github.com/SuperViz/superviz/tree/main/packages/yjs#readme", "dependencies": { + "@superviz/semantic-release-version-file": "workspace:*", "@superviz/eslint-config": "workspace:*", "@superviz/socket-client": "workspace:*", "@superviz/typescript-config": "workspace:*", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 78c9ac2..e9de75f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -163,6 +163,9 @@ importers: '@superviz/eslint-config': specifier: workspace:* version: link:../eslint-config + '@superviz/semantic-release-version-file': + specifier: workspace:* + version: link:../semmatic-release-version-file '@superviz/typescript-config': specifier: workspace:* version: link:../typescript-config @@ -245,6 +248,9 @@ importers: '@superviz/eslint-config': specifier: workspace:* version: link:../eslint-config + '@superviz/semantic-release-version-file': + specifier: workspace:* + version: link:../semmatic-release-version-file '@superviz/typescript-config': specifier: workspace:* version: link:../typescript-config @@ -315,6 +321,9 @@ importers: '@rollup/plugin-replace': specifier: ^5.0.7 version: 5.0.7(rollup@4.21.3) + '@superviz/semantic-release-version-file': + specifier: workspace:* + version: link:../semmatic-release-version-file '@types/forge-viewer': specifier: ^7.89.1 version: 7.89.1 @@ -384,9 +393,6 @@ importers: semantic-release: specifier: ^24.0.0 version: 24.0.0(typescript@5.6.2) - semantic-release-version-file: - specifier: ^1.0.2 - version: 1.0.2 typescript: specifier: ^5.5.2 version: 5.6.2 @@ -430,6 +436,9 @@ importers: '@superviz/eslint-config': specifier: workspace:* version: link:../eslint-config + '@superviz/semantic-release-version-file': + specifier: workspace:* + version: link:../semmatic-release-version-file '@superviz/typescript-config': specifier: workspace:* version: link:../typescript-config @@ -463,9 +472,6 @@ importers: semantic-release: specifier: ^24.0.0 version: 24.1.1(typescript@5.6.2) - semantic-release-version-file: - specifier: ^1.0.2 - version: 1.0.2 ts-jest: specifier: ^29.2.5 version: 29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(esbuild@0.21.5)(jest@29.7.0(@types/node@20.16.5))(typescript@5.6.2) @@ -505,9 +511,6 @@ importers: rxjs: specifier: ^7.8.1 version: 7.8.1 - semantic-release-version-file: - specifier: ^1.0.2 - version: 1.0.2 zod: specifier: ^3.23.8 version: 3.23.8 @@ -524,6 +527,9 @@ importers: '@superviz/eslint-config': specifier: workspace:* version: link:../eslint-config + '@superviz/semantic-release-version-file': + specifier: workspace:* + version: link:../semmatic-release-version-file '@superviz/typescript-config': specifier: workspace:* version: link:../typescript-config @@ -609,6 +615,8 @@ importers: specifier: ^17.7.2 version: 17.7.2 + packages/semmatic-release-version-file: {} + packages/socket-client: dependencies: '@reactivex/rxjs': @@ -623,9 +631,6 @@ importers: rxjs: specifier: ^7.8.1 version: 7.8.1 - semantic-release-version-file: - specifier: ^1.0.2 - version: 1.0.2 socket.io-client: specifier: ^4.7.5 version: 4.7.5 @@ -636,6 +641,9 @@ importers: '@superviz/eslint-config': specifier: workspace:* version: link:../eslint-config + '@superviz/semantic-release-version-file': + specifier: workspace:* + version: link:../semmatic-release-version-file '@superviz/typescript-config': specifier: workspace:* version: link:../typescript-config @@ -688,6 +696,9 @@ importers: '@superviz/eslint-config': specifier: workspace:* version: link:../eslint-config + '@superviz/semantic-release-version-file': + specifier: workspace:* + version: link:../semmatic-release-version-file '@superviz/typescript-config': specifier: workspace:* version: link:../typescript-config @@ -735,6 +746,9 @@ importers: '@superviz/sdk': specifier: workspace:* version: link:../sdk + '@superviz/semantic-release-version-file': + specifier: workspace:* + version: link:../semmatic-release-version-file '@superviz/socket-client': specifier: workspace:* version: link:../socket-client From 93b31d8ab03552a1fa47b8f7c8717c590425f910 Mon Sep 17 00:00:00 2001 From: Carlos Date: Wed, 2 Oct 2024 20:03:05 -0300 Subject: [PATCH 65/76] fix: don't export awareness --- packages/yjs/src/index.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/yjs/src/index.ts b/packages/yjs/src/index.ts index 20840cb..01968be 100644 --- a/packages/yjs/src/index.ts +++ b/packages/yjs/src/index.ts @@ -1,2 +1 @@ export { SuperVizYjsProvider } from './provider'; -export { Awareness } from './services'; From 7a4752af43bb43a732f283d6755ee60f77cf5303 Mon Sep 17 00:00:00 2001 From: Carlos Date: Wed, 2 Oct 2024 20:12:51 -0300 Subject: [PATCH 66/76] fix: build inside version plugin --- .github/workflows/autodesk.ci.yml | 2 -- .github/workflows/matterport.ci.yml | 2 -- .github/workflows/react.ci.yml | 2 -- .github/workflows/realtime.ci.yml | 2 -- .github/workflows/sdk.ci.yml | 2 -- .github/workflows/socket-client.ci.yml | 2 -- .github/workflows/three.ci.yml | 2 -- .github/workflows/yjs.ci.yml | 2 -- packages/semmatic-release-version-file/index.js | 12 ++++++++++++ 9 files changed, 12 insertions(+), 16 deletions(-) diff --git a/.github/workflows/autodesk.ci.yml b/.github/workflows/autodesk.ci.yml index d0aefe5..0c05558 100644 --- a/.github/workflows/autodesk.ci.yml +++ b/.github/workflows/autodesk.ci.yml @@ -30,8 +30,6 @@ jobs: env: NPM_CONFIG_USERCONFIG: .npmrc.ci NPM_TOKEN: ${{ secrets.NPM_TOKEN }} - - name: Build Package - run: pnpm run build - run: git config --global user.name SuperViz - run: git config --global user.email ci@superviz.com - name: Publish npm package diff --git a/.github/workflows/matterport.ci.yml b/.github/workflows/matterport.ci.yml index c7c4522..bf345ae 100644 --- a/.github/workflows/matterport.ci.yml +++ b/.github/workflows/matterport.ci.yml @@ -30,8 +30,6 @@ jobs: env: NPM_CONFIG_USERCONFIG: .npmrc.ci NPM_TOKEN: ${{ secrets.NPM_TOKEN }} - - name: Build package - run: pnpm run build - run: git config --global user.name SuperViz - run: git config --global user.email ci@superviz.com - name: Publish npm package diff --git a/.github/workflows/react.ci.yml b/.github/workflows/react.ci.yml index 9c3b5f6..03b31ea 100644 --- a/.github/workflows/react.ci.yml +++ b/.github/workflows/react.ci.yml @@ -30,8 +30,6 @@ jobs: env: NPM_CONFIG_USERCONFIG: .npmrc.ci NPM_TOKEN: ${{ secrets.NPM_TOKEN }} - - name: Build Package - run: pnpm run build - run: git config --global user.name SuperViz - run: git config --global user.email ci@superviz.com - name: Publish npm package diff --git a/.github/workflows/realtime.ci.yml b/.github/workflows/realtime.ci.yml index 1e6288e..9a45821 100644 --- a/.github/workflows/realtime.ci.yml +++ b/.github/workflows/realtime.ci.yml @@ -30,8 +30,6 @@ jobs: env: NPM_CONFIG_USERCONFIG: .npmrc.ci NPM_TOKEN: ${{ secrets.NPM_TOKEN }} - - name: Build package - run: pnpm run build - name: Create a .remote-config.js file run: | touch .remote-config.js && echo "echo \"module.exports = { remoteConfig: { apiUrl: 'https://api.superviz.com', version: 'prod'}};\" > .remote-config.js" | bash - diff --git a/.github/workflows/sdk.ci.yml b/.github/workflows/sdk.ci.yml index 31fda8e..418a4ef 100644 --- a/.github/workflows/sdk.ci.yml +++ b/.github/workflows/sdk.ci.yml @@ -30,8 +30,6 @@ jobs: env: NPM_CONFIG_USERCONFIG: .npmrc.ci NPM_TOKEN: ${{ secrets.NPM_TOKEN }} - - name: Build package - run: pnpm run build - name: Create a .remote-config.js file run: | touch packages/sdk/.remote-config.js && echo "echo \"module.exports = { remoteConfig: { apiUrl: 'https://api.superviz.com', conferenceLayerUrl: 'https://video-frame.superviz.com/lab/index.html'}};\" > .remote-config.js" | bash - diff --git a/.github/workflows/socket-client.ci.yml b/.github/workflows/socket-client.ci.yml index 6547f23..3e14afe 100644 --- a/.github/workflows/socket-client.ci.yml +++ b/.github/workflows/socket-client.ci.yml @@ -30,8 +30,6 @@ jobs: env: NPM_CONFIG_USERCONFIG: .npmrc.ci NPM_TOKEN: ${{ secrets.NPM_TOKEN }} - - name: Build package - run: pnpm run build - run: git config --global user.name SuperViz - run: git config --global user.email ci@superviz.com - name: Publish npm package diff --git a/.github/workflows/three.ci.yml b/.github/workflows/three.ci.yml index 6657373..08a806a 100644 --- a/.github/workflows/three.ci.yml +++ b/.github/workflows/three.ci.yml @@ -32,8 +32,6 @@ jobs: NPM_TOKEN: ${{ secrets.NPM_TOKEN }} - run: git config --global user.name SuperViz - run: git config --global user.email ci@superviz.com - - name: Build package - run: pnpm run build - name: Publish npm package run: npm whoami && pnpm run semantic-release --filter=@superviz/threejs-plugin env: diff --git a/.github/workflows/yjs.ci.yml b/.github/workflows/yjs.ci.yml index e2d3d42..2cbe8f0 100644 --- a/.github/workflows/yjs.ci.yml +++ b/.github/workflows/yjs.ci.yml @@ -30,8 +30,6 @@ jobs: env: NPM_CONFIG_USERCONFIG: .npmrc.ci NPM_TOKEN: ${{ secrets.NPM_TOKEN }} - - name: Build package - run: pnpm run build - run: git config --global user.name SuperViz - run: git config --global user.email ci@superviz.com - name: Publish npm package diff --git a/packages/semmatic-release-version-file/index.js b/packages/semmatic-release-version-file/index.js index 6bb9f6e..76af089 100644 --- a/packages/semmatic-release-version-file/index.js +++ b/packages/semmatic-release-version-file/index.js @@ -4,7 +4,18 @@ const createFile = (version) => { const filename = '.version.js'; const content = `export const version = '${version}'`; fs.writeFileSync(filename, content); +} + +const build = () => { + exec('pnpm run build', (err, stdout, stderr) => { + if (err) { + console.error('build package error: ', err); + return; + } + console.log(`stdout: ${stdout}`); + console.log(`stderr: ${stderr}`); + }); } const handle = async (context) => { @@ -14,6 +25,7 @@ const handle = async (context) => { } createFile(version); + build() }; async function prepare(pluginConfig, context) { From 22de2cca75012c1394d2602a7ac360a132d62530 Mon Sep 17 00:00:00 2001 From: Carlos Date: Wed, 2 Oct 2024 20:21:08 -0300 Subject: [PATCH 67/76] fix: import child_process to exec build --- packages/semmatic-release-version-file/index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/semmatic-release-version-file/index.js b/packages/semmatic-release-version-file/index.js index 76af089..8dd3774 100644 --- a/packages/semmatic-release-version-file/index.js +++ b/packages/semmatic-release-version-file/index.js @@ -1,4 +1,5 @@ const fs = require('fs'); +const exec = require('child_process') const createFile = (version) => { const filename = '.version.js'; From 5902694218ae516054645e3b251fb82cee286dc2 Mon Sep 17 00:00:00 2001 From: Carlos Date: Wed, 2 Oct 2024 20:23:42 -0300 Subject: [PATCH 68/76] ci: print current folder --- packages/semmatic-release-version-file/index.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/semmatic-release-version-file/index.js b/packages/semmatic-release-version-file/index.js index 8dd3774..4472df8 100644 --- a/packages/semmatic-release-version-file/index.js +++ b/packages/semmatic-release-version-file/index.js @@ -5,6 +5,8 @@ const createFile = (version) => { const filename = '.version.js'; const content = `export const version = '${version}'`; fs.writeFileSync(filename, content); + + console.log('Current folder:', process.cwd()); } const build = () => { From 529fd29db5c96dcd39cabc38289e4af7b557e4f3 Mon Sep 17 00:00:00 2001 From: Carlos Date: Wed, 2 Oct 2024 20:24:11 -0300 Subject: [PATCH 69/76] fix: export Awareness as type --- packages/yjs/src/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/yjs/src/index.ts b/packages/yjs/src/index.ts index 01968be..4a72043 100644 --- a/packages/yjs/src/index.ts +++ b/packages/yjs/src/index.ts @@ -1 +1,2 @@ export { SuperVizYjsProvider } from './provider'; +export type { Awareness } from './services'; From 774f18390645fc0d6be1656ae9ef5fa526bc3a19 Mon Sep 17 00:00:00 2001 From: Carlos Date: Wed, 2 Oct 2024 20:31:07 -0300 Subject: [PATCH 70/76] fix: install semmantic --- packages/yjs/package.json | 3 ++- pnpm-lock.yaml | 9 ++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/packages/yjs/package.json b/packages/yjs/package.json index e788860..abc4c9e 100644 --- a/packages/yjs/package.json +++ b/packages/yjs/package.json @@ -40,7 +40,6 @@ }, "homepage": "https://github.com/SuperViz/superviz/tree/main/packages/yjs#readme", "dependencies": { - "@superviz/semantic-release-version-file": "workspace:*", "@superviz/eslint-config": "workspace:*", "@superviz/socket-client": "workspace:*", "@superviz/typescript-config": "workspace:*", @@ -54,6 +53,8 @@ "yjs": "^13.3.1" }, "devDependencies": { + "semantic-release": "^24.0.0", + "@superviz/semantic-release-version-file": "workspace:*", "@jest/globals": "^29.7.0", "@types/jest": "^29.5.13", "concurrently": "^9.0.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e9de75f..4e5567c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -746,9 +746,6 @@ importers: '@superviz/sdk': specifier: workspace:* version: link:../sdk - '@superviz/semantic-release-version-file': - specifier: workspace:* - version: link:../semmatic-release-version-file '@superviz/socket-client': specifier: workspace:* version: link:../socket-client @@ -780,6 +777,9 @@ importers: '@jest/globals': specifier: ^29.7.0 version: 29.7.0 + '@superviz/semantic-release-version-file': + specifier: workspace:* + version: link:../semmatic-release-version-file '@types/jest': specifier: ^29.5.13 version: 29.5.13 @@ -795,6 +795,9 @@ importers: jest-mock: specifier: ^29.7.0 version: 29.7.0 + semantic-release: + specifier: ^24.0.0 + version: 24.0.0(typescript@5.6.2) ts-jest: specifier: ^29.2.5 version: 29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(esbuild@0.23.1)(jest@29.7.0)(typescript@5.6.2) From 9fd5251a52200efadb038ca797416a345c76499e Mon Sep 17 00:00:00 2001 From: Carlos Date: Wed, 2 Oct 2024 20:31:54 -0300 Subject: [PATCH 71/76] ci: run playground workflow when the yjs changes --- .github/workflows/playground.ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/playground.ci.yml b/.github/workflows/playground.ci.yml index 355aa48..9ba55e5 100644 --- a/.github/workflows/playground.ci.yml +++ b/.github/workflows/playground.ci.yml @@ -12,6 +12,7 @@ on: - 'packages/matterport/**' - 'packages/autodesk/**' - 'packages/three/**' + - 'packages/yjs/**' - '.github/workflows/playground.ci.yml' jobs: package: From a3e9976179461e45c8c435db7b0ce038fff963aa Mon Sep 17 00:00:00 2001 From: Carlos Date: Wed, 2 Oct 2024 20:40:41 -0300 Subject: [PATCH 72/76] fix: exec import :/ --- .github/workflows/yjs.ci.yml | 1 + .../index.js | 2 +- packages/semmatic-release-version-file/package.json | 6 ------ 3 files changed, 2 insertions(+), 7 deletions(-) rename packages/{semmatic-release-version-file => sematic-release-version-file}/index.js (95%) delete mode 100644 packages/semmatic-release-version-file/package.json diff --git a/.github/workflows/yjs.ci.yml b/.github/workflows/yjs.ci.yml index 2cbe8f0..afd2557 100644 --- a/.github/workflows/yjs.ci.yml +++ b/.github/workflows/yjs.ci.yml @@ -7,6 +7,7 @@ on: - main paths: - "packages/yjs/**" + - "packages/semantic-release-version-file/**" - ".github/workflows/yjs.ci.yml" jobs: package: diff --git a/packages/semmatic-release-version-file/index.js b/packages/sematic-release-version-file/index.js similarity index 95% rename from packages/semmatic-release-version-file/index.js rename to packages/sematic-release-version-file/index.js index 4472df8..8fcee93 100644 --- a/packages/semmatic-release-version-file/index.js +++ b/packages/sematic-release-version-file/index.js @@ -1,5 +1,5 @@ const fs = require('fs'); -const exec = require('child_process') +const { exec } = require('child_process'); const createFile = (version) => { const filename = '.version.js'; diff --git a/packages/semmatic-release-version-file/package.json b/packages/semmatic-release-version-file/package.json deleted file mode 100644 index 632fd74..0000000 --- a/packages/semmatic-release-version-file/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "@superviz/semantic-release-version-file", - "version": "1.0.0", - "main": "index.js", - "license": "MIT" -} From 4c9011be5d01015638202cb697471ba8087b1d9f Mon Sep 17 00:00:00 2001 From: Carlos Date: Wed, 2 Oct 2024 20:40:41 -0300 Subject: [PATCH 73/76] fix: exec import :/ --- .github/workflows/yjs.ci.yml | 1 + .../index.js | 2 +- .../package.json | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) rename packages/{semmatic-release-version-file => sematic-release-version-file}/index.js (95%) rename packages/{semmatic-release-version-file => sematic-release-version-file}/package.json (98%) diff --git a/.github/workflows/yjs.ci.yml b/.github/workflows/yjs.ci.yml index 2cbe8f0..afd2557 100644 --- a/.github/workflows/yjs.ci.yml +++ b/.github/workflows/yjs.ci.yml @@ -7,6 +7,7 @@ on: - main paths: - "packages/yjs/**" + - "packages/semantic-release-version-file/**" - ".github/workflows/yjs.ci.yml" jobs: package: diff --git a/packages/semmatic-release-version-file/index.js b/packages/sematic-release-version-file/index.js similarity index 95% rename from packages/semmatic-release-version-file/index.js rename to packages/sematic-release-version-file/index.js index 4472df8..8fcee93 100644 --- a/packages/semmatic-release-version-file/index.js +++ b/packages/sematic-release-version-file/index.js @@ -1,5 +1,5 @@ const fs = require('fs'); -const exec = require('child_process') +const { exec } = require('child_process'); const createFile = (version) => { const filename = '.version.js'; diff --git a/packages/semmatic-release-version-file/package.json b/packages/sematic-release-version-file/package.json similarity index 98% rename from packages/semmatic-release-version-file/package.json rename to packages/sematic-release-version-file/package.json index 632fd74..f117dc3 100644 --- a/packages/semmatic-release-version-file/package.json +++ b/packages/sematic-release-version-file/package.json @@ -3,4 +3,4 @@ "version": "1.0.0", "main": "index.js", "license": "MIT" -} +} \ No newline at end of file From 41df900b7959f3b91be5d6b08f8d3460a0cc1a77 Mon Sep 17 00:00:00 2001 From: Carlos Date: Wed, 2 Oct 2024 20:40:41 -0300 Subject: [PATCH 74/76] fix: exec import :/ --- .github/workflows/yjs.ci.yml | 1 + .../index.js | 2 +- .../package.json | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) rename packages/{semmatic-release-version-file => semantic-release-version-file}/index.js (95%) rename packages/{semmatic-release-version-file => semantic-release-version-file}/package.json (98%) diff --git a/.github/workflows/yjs.ci.yml b/.github/workflows/yjs.ci.yml index 2cbe8f0..afd2557 100644 --- a/.github/workflows/yjs.ci.yml +++ b/.github/workflows/yjs.ci.yml @@ -7,6 +7,7 @@ on: - main paths: - "packages/yjs/**" + - "packages/semantic-release-version-file/**" - ".github/workflows/yjs.ci.yml" jobs: package: diff --git a/packages/semmatic-release-version-file/index.js b/packages/semantic-release-version-file/index.js similarity index 95% rename from packages/semmatic-release-version-file/index.js rename to packages/semantic-release-version-file/index.js index 4472df8..8fcee93 100644 --- a/packages/semmatic-release-version-file/index.js +++ b/packages/semantic-release-version-file/index.js @@ -1,5 +1,5 @@ const fs = require('fs'); -const exec = require('child_process') +const { exec } = require('child_process'); const createFile = (version) => { const filename = '.version.js'; diff --git a/packages/semmatic-release-version-file/package.json b/packages/semantic-release-version-file/package.json similarity index 98% rename from packages/semmatic-release-version-file/package.json rename to packages/semantic-release-version-file/package.json index 632fd74..f117dc3 100644 --- a/packages/semmatic-release-version-file/package.json +++ b/packages/semantic-release-version-file/package.json @@ -3,4 +3,4 @@ "version": "1.0.0", "main": "index.js", "license": "MIT" -} +} \ No newline at end of file From 66f07d8f1fcc4967cee6adb8018561defd1d494d Mon Sep 17 00:00:00 2001 From: Carlos Date: Wed, 2 Oct 2024 20:40:41 -0300 Subject: [PATCH 75/76] fix: exec import :/ --- .github/workflows/yjs.ci.yml | 1 + .../index.js | 2 +- .../package.json | 2 +- pnpm-lock.yaml | 18 +++++++++--------- 4 files changed, 12 insertions(+), 11 deletions(-) rename packages/{semmatic-release-version-file => semantic-release-version-file}/index.js (95%) rename packages/{semmatic-release-version-file => semantic-release-version-file}/package.json (98%) diff --git a/.github/workflows/yjs.ci.yml b/.github/workflows/yjs.ci.yml index 2cbe8f0..afd2557 100644 --- a/.github/workflows/yjs.ci.yml +++ b/.github/workflows/yjs.ci.yml @@ -7,6 +7,7 @@ on: - main paths: - "packages/yjs/**" + - "packages/semantic-release-version-file/**" - ".github/workflows/yjs.ci.yml" jobs: package: diff --git a/packages/semmatic-release-version-file/index.js b/packages/semantic-release-version-file/index.js similarity index 95% rename from packages/semmatic-release-version-file/index.js rename to packages/semantic-release-version-file/index.js index 4472df8..8fcee93 100644 --- a/packages/semmatic-release-version-file/index.js +++ b/packages/semantic-release-version-file/index.js @@ -1,5 +1,5 @@ const fs = require('fs'); -const exec = require('child_process') +const { exec } = require('child_process'); const createFile = (version) => { const filename = '.version.js'; diff --git a/packages/semmatic-release-version-file/package.json b/packages/semantic-release-version-file/package.json similarity index 98% rename from packages/semmatic-release-version-file/package.json rename to packages/semantic-release-version-file/package.json index 632fd74..f117dc3 100644 --- a/packages/semmatic-release-version-file/package.json +++ b/packages/semantic-release-version-file/package.json @@ -3,4 +3,4 @@ "version": "1.0.0", "main": "index.js", "license": "MIT" -} +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4e5567c..8f1f10a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -165,7 +165,7 @@ importers: version: link:../eslint-config '@superviz/semantic-release-version-file': specifier: workspace:* - version: link:../semmatic-release-version-file + version: link:../semantic-release-version-file '@superviz/typescript-config': specifier: workspace:* version: link:../typescript-config @@ -250,7 +250,7 @@ importers: version: link:../eslint-config '@superviz/semantic-release-version-file': specifier: workspace:* - version: link:../semmatic-release-version-file + version: link:../semantic-release-version-file '@superviz/typescript-config': specifier: workspace:* version: link:../typescript-config @@ -323,7 +323,7 @@ importers: version: 5.0.7(rollup@4.21.3) '@superviz/semantic-release-version-file': specifier: workspace:* - version: link:../semmatic-release-version-file + version: link:../semantic-release-version-file '@types/forge-viewer': specifier: ^7.89.1 version: 7.89.1 @@ -438,7 +438,7 @@ importers: version: link:../eslint-config '@superviz/semantic-release-version-file': specifier: workspace:* - version: link:../semmatic-release-version-file + version: link:../semantic-release-version-file '@superviz/typescript-config': specifier: workspace:* version: link:../typescript-config @@ -529,7 +529,7 @@ importers: version: link:../eslint-config '@superviz/semantic-release-version-file': specifier: workspace:* - version: link:../semmatic-release-version-file + version: link:../semantic-release-version-file '@superviz/typescript-config': specifier: workspace:* version: link:../typescript-config @@ -615,7 +615,7 @@ importers: specifier: ^17.7.2 version: 17.7.2 - packages/semmatic-release-version-file: {} + packages/semantic-release-version-file: {} packages/socket-client: dependencies: @@ -643,7 +643,7 @@ importers: version: link:../eslint-config '@superviz/semantic-release-version-file': specifier: workspace:* - version: link:../semmatic-release-version-file + version: link:../semantic-release-version-file '@superviz/typescript-config': specifier: workspace:* version: link:../typescript-config @@ -698,7 +698,7 @@ importers: version: link:../eslint-config '@superviz/semantic-release-version-file': specifier: workspace:* - version: link:../semmatic-release-version-file + version: link:../semantic-release-version-file '@superviz/typescript-config': specifier: workspace:* version: link:../typescript-config @@ -779,7 +779,7 @@ importers: version: 29.7.0 '@superviz/semantic-release-version-file': specifier: workspace:* - version: link:../semmatic-release-version-file + version: link:../semantic-release-version-file '@types/jest': specifier: ^29.5.13 version: 29.5.13 From 035cabc69675cbe79e8d38682e5c2775c1bc6cd1 Mon Sep 17 00:00:00 2001 From: Carlos Date: Wed, 2 Oct 2024 21:07:32 -0300 Subject: [PATCH 76/76] fix: remove duplicated package --- .../sematic-release-version-file/index.js | 38 ------------------- .../sematic-release-version-file/package.json | 6 --- 2 files changed, 44 deletions(-) delete mode 100644 packages/sematic-release-version-file/index.js delete mode 100644 packages/sematic-release-version-file/package.json diff --git a/packages/sematic-release-version-file/index.js b/packages/sematic-release-version-file/index.js deleted file mode 100644 index 8fcee93..0000000 --- a/packages/sematic-release-version-file/index.js +++ /dev/null @@ -1,38 +0,0 @@ -const fs = require('fs'); -const { exec } = require('child_process'); - -const createFile = (version) => { - const filename = '.version.js'; - const content = `export const version = '${version}'`; - fs.writeFileSync(filename, content); - - console.log('Current folder:', process.cwd()); -} - -const build = () => { - exec('pnpm run build', (err, stdout, stderr) => { - if (err) { - console.error('build package error: ', err); - return; - } - - console.log(`stdout: ${stdout}`); - console.log(`stderr: ${stderr}`); - }); -} - -const handle = async (context) => { - const version = context?.nextRelease?.version; - if (!version) { - throw new Error('Could not determine the version from semantic release.') - } - - createFile(version); - build() -}; - -async function prepare(pluginConfig, context) { - await handle(context); -} - -module.exports = { prepare }; \ No newline at end of file diff --git a/packages/sematic-release-version-file/package.json b/packages/sematic-release-version-file/package.json deleted file mode 100644 index f117dc3..0000000 --- a/packages/sematic-release-version-file/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "@superviz/semantic-release-version-file", - "version": "1.0.0", - "main": "index.js", - "license": "MIT" -} \ No newline at end of file