From bc49f1753855220ae077fa458483126fe56f36e3 Mon Sep 17 00:00:00 2001 From: Sahil Gupte Date: Tue, 17 Dec 2024 15:46:54 -0500 Subject: [PATCH] Remove node extension runner --- src-extensions/build.js | 61 - src-extensions/package.json | 34 - src-extensions/prepack.js | 10 - src-extensions/sea-config.json | 10 - src-extensions/sea-prep.blob | Bin 633731 -> 0 bytes src-extensions/src/constants.ts | 72 - src-extensions/src/index.ts | 75 - src-extensions/src/sandbox/api.ts | 505 ------ src-extensions/src/sandbox/common.ts | 309 ---- src-extensions/src/sandbox/commonConstants.ts | 16 - src-extensions/src/sandbox/extensionFinder.ts | 97 -- .../src/sandbox/extensionHandler.ts | 420 ----- .../src/sandbox/extensionManager.ts | 264 --- .../src/sandbox/extensionRegistry.ts | 54 - src-extensions/src/sandbox/index.ts | 247 --- src-extensions/src/types.ts | 13 - src-extensions/src/types/exported.d.ts | 1114 ------------- src-extensions/src/types/sandbox.d.ts | 193 --- src-extensions/tsconfig.json | 31 - src-extensions/webpack.config.js | 29 - src-extensions/yarn.lock | 1463 ----------------- 21 files changed, 5017 deletions(-) delete mode 100644 src-extensions/build.js delete mode 100644 src-extensions/package.json delete mode 100644 src-extensions/prepack.js delete mode 100644 src-extensions/sea-config.json delete mode 100644 src-extensions/sea-prep.blob delete mode 100644 src-extensions/src/constants.ts delete mode 100644 src-extensions/src/index.ts delete mode 100644 src-extensions/src/sandbox/api.ts delete mode 100644 src-extensions/src/sandbox/common.ts delete mode 100644 src-extensions/src/sandbox/commonConstants.ts delete mode 100644 src-extensions/src/sandbox/extensionFinder.ts delete mode 100644 src-extensions/src/sandbox/extensionHandler.ts delete mode 100644 src-extensions/src/sandbox/extensionManager.ts delete mode 100644 src-extensions/src/sandbox/extensionRegistry.ts delete mode 100644 src-extensions/src/sandbox/index.ts delete mode 100644 src-extensions/src/types.ts delete mode 100644 src-extensions/src/types/exported.d.ts delete mode 100644 src-extensions/src/types/sandbox.d.ts delete mode 100644 src-extensions/tsconfig.json delete mode 100644 src-extensions/webpack.config.js delete mode 100644 src-extensions/yarn.lock diff --git a/src-extensions/build.js b/src-extensions/build.js deleted file mode 100644 index ed2b18f7..00000000 --- a/src-extensions/build.js +++ /dev/null @@ -1,61 +0,0 @@ -const { inject } = require("postject"); -const fs = require("node:fs"); -const which = require("which"); -const { exec } = require("node:child_process"); - -const overrideTarget = process.argv[3]; -console.log(overrideTarget); - -const nodePath = which - .sync("node", { - all: true, - }) - .filter( - (v) => !v.startsWith("/tmp") && !v.includes("Temp") && !v.includes("/T/"), - )[0]; -console.log(nodePath); - -fs.copyFile(nodePath, "./server", (err) => { - if (err) console.error(err); - - const buffer = fs.readFileSync("./sea-prep.blob"); - inject("server", "NODE_SEA_BLOB", buffer, { - sentinelFuse: "NODE_SEA_FUSE_fce680ab2cc467b6e072b8b5df1996b2", - }).then(() => { - console.log("done injectng"); - - const proc = exec( - "rustc -Vv | grep host | cut -f2 -d' '", - (err, stdout, stderr) => { - console.log("inside exec", err, stdout); - if (err) { - console.error("error", err); - return; - } - - stdout = overrideTarget ? overrideTarget : stdout; - - fs.mkdirSync("../src-tauri/binaries", { - recursive: true, - }); - - fs.renameSync( - "./server", - `../src-tauri/binaries/exthost-${stdout.trim()}${stdout.includes("windows") ? ".exe" : ""}`, - ); - fs.copyFileSync("./dist/bridge.js", `../src-tauri/bridge.js`); - fs.copyFileSync("./dist/events.js", `../src-tauri/events.js`); - fs.copyFileSync( - "./dist/setup-sandbox.js", - `../src-tauri/setup-sandbox.js`, - ); - fs.copyFileSync( - "./dist/setup-node-sandbox.js", - `../src-tauri/setup-node-sandbox.js`, - ); - }, - ); - - console.log("finished execution"); - }); -}); diff --git a/src-extensions/package.json b/src-extensions/package.json deleted file mode 100644 index 07bf6a4b..00000000 --- a/src-extensions/package.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "name": "extension_bridge", - "version": "1.0.0", - "main": "src/index.ts", - "private": "true", - "license": "MIT", - "scripts": { - "postject": "node build.js", - "build": "yarn webpack && node prepack.js && node --experimental-sea-config sea-config.json && yarn postject", - "start": "yarn webpack && node prepack.js && node dist/main.js" - }, - "dependencies": { - "@grpc/grpc-js": "^1.10.1", - "@grpc/proto-loader": "^0.7.10", - "async-mutex": "^0.5.0", - "loglevel": "^1.9.1", - "patch-package": "^8.0.0", - "postinstall-postinstall": "^2.1.0", - "proto": "1.0.9", - "protobufjs": "^7.2.6", - "ts-loader": "^9.5.1", - "tsc": "^2.0.4", - "tslib": "^2.6.3", - "typescript": "^5.3.3", - "uuid": "^9.0.1", - "vm2": "^3.9.19", - "webpack": "^5.90.3", - "webpack-cli": "^5.1.4" - }, - "devDependencies": { - "postject": "^1.0.0-alpha.5" - }, - "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e" -} diff --git a/src-extensions/prepack.js b/src-extensions/prepack.js deleted file mode 100644 index ccf7bb37..00000000 --- a/src-extensions/prepack.js +++ /dev/null @@ -1,10 +0,0 @@ -const fs = require("node:fs") - -async function copyVm2() { - await fs.promises.copyFile('./node_modules/vm2/lib/bridge.js', './dist/bridge.js') - await fs.promises.copyFile('./node_modules/vm2/lib/events.js', './dist/events.js') - await fs.promises.copyFile('./node_modules/vm2/lib/setup-sandbox.js', './dist/setup-sandbox.js') - await fs.promises.copyFile('./node_modules/vm2/lib/setup-node-sandbox.js', './dist/setup-node-sandbox.js') -} - -copyVm2() \ No newline at end of file diff --git a/src-extensions/sea-config.json b/src-extensions/sea-config.json deleted file mode 100644 index f010e167..00000000 --- a/src-extensions/sea-config.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "main": "dist/main.js", - "output": "sea-prep.blob", - "assets": { - "bridge.js": "dist/bridge.js", - "events.js": "dist/events.js", - "setup-sandbox.js": "dist/setup-sandbox.js", - "setup-node-sandbox.js": "dist/setup-node-sandbox.js" - } -} \ No newline at end of file diff --git a/src-extensions/sea-prep.blob b/src-extensions/sea-prep.blob deleted file mode 100644 index 2ae129a4f801a0fe353b5dfca428fe3825890111..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 633731 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�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. All rights reserved. - * Licensed under the GNU General Public License. - * - * See LICENSE in the project root for license information. - */ - -export const extensionRequestsKeys = [ - "getSongs", - "getEntity", - "updateSong", - "update-song", - "addPlaylist", - "addSongToPlaylist", - "removeSong", - "getPreferences", - "getSecurePreferences", - "setPreferences", - "setSecurePreferences", - "registerOauth", - "openExternal", - "registerAccount", - "setArtistEditableInfo", - "setAlbumEditableInfo", -] as const; -export const extensionUIRequestsKeys = [ - "getCurrentSong", - "getVolume", - "getTime", - "getQueue", - "getPlayerState", - "openLoginModal", - "closeLoginModal", - "showToast", - "updatePreferences", - "extensionUpdated", -] as const; -export const playerControlRequests = [ - "play", - "pause", - "stop", - "next", - "prev", -] as const; -export const mainRequestsKeys = [ - "getInstalledExtensions", - "findNewExtensions", - "toggleExtensionStatus", - "removeExtension", - "stopProcess", - "getExtensionIcon", - "extraExtensionEvents", - "getExtensionContextMenu", - "onClickedContextMenu", - "set-log-level", - "getAccounts", - "performAccountLogin", - "getDisplayName", -] as const; - -export const providerExtensionKeys = ["getExtensionProviderScopes"] as const; - -export type extensionUIRequests = - | (typeof extensionUIRequestsKeys)[number] - | (typeof playerControlRequests)[number]; -export type extensionRequests = - | (typeof extensionRequestsKeys)[number] - | extensionUIRequests; -export type mainRequests = (typeof mainRequestsKeys)[number]; -export type providerFetchRequests = (typeof providerExtensionKeys)[number]; diff --git a/src-extensions/src/index.ts b/src-extensions/src/index.ts deleted file mode 100644 index 1a4f6778..00000000 --- a/src-extensions/src/index.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { createConnection } from "node:net"; -import { ExtensionHostIPCHandler } from "./sandbox"; -import { EventEmitter } from "node:events"; -import { Mutex } from "async-mutex"; - -const IPC_PATH = - process.argv[process.argv.findIndex((val) => val === "-ipcPath") + 1]; - -console.log("got IPC path", process.argv); - -const client = createConnection(IPC_PATH); - -const mutex = new Mutex(); - -client.on("connect", (err) => { - if (err) { - console.error(err); - return; - } - - const bus = new EventEmitter(); - const extHandler = new ExtensionHostIPCHandler(bus); - - const channelMap = {}; - bus.on("request", (data) => { - const channel = data?.channel; - if (channel) { - channelMap[channel] = true; - - mutex.runExclusive(() => { - client.write(`${JSON.stringify(data)}\n`); - }); - } - }); - - let oldBuffer: Buffer; - - client.on("data", async (data) => { - let newData = Buffer.concat([oldBuffer ?? Buffer.alloc(0), data]); - - while (true) { - const index = newData.findIndex((val) => val === "\n".charCodeAt(0)); - if (index === -1) { - oldBuffer = newData; - return; - } - - const line = newData.subarray(0, index).toString(); - newData = newData.subarray(index + 1, newData.length); - try { - const parsed = JSON.parse(line.toString().trim()); - const channel = parsed?.channel; - if (channel && channelMap[channel]) { - bus.emit(channel, parsed); - continue; - } - - const dataRet = await extHandler.parseMessage(parsed); - - const ret: mainHostMessage = { - type: parsed.type, - data: dataRet, - channel: parsed.channel, - extensionName: parsed.extensionName, - }; - - mutex.runExclusive(() => { - client.write(`${JSON.stringify(ret)}\n`); - }); - } catch (e) { - console.error(e); - } - } - }); -}); diff --git a/src-extensions/src/sandbox/api.ts b/src-extensions/src/sandbox/api.ts deleted file mode 100644 index 82379a82..00000000 --- a/src-extensions/src/sandbox/api.ts +++ /dev/null @@ -1,505 +0,0 @@ -/* - * api.ts is a part of Moosync. - * - * Copyright 2022 by Sahil Gupte . All rights reserved. - * Licensed under the GNU General Public License. - * - * See LICENSE in the project root for license information. - */ - -import * as crypto from "node:crypto"; -import type { extensionRequests } from "../constants"; -import type EventEmitter from "node:events"; - -export class ExtensionRequestGenerator implements ExtendedExtensionAPI { - private packageName: string; - player: PlayerControls; - utils: Utils; - - #communicator: ExtensionCommunicator; - #bus: EventEmitter; - - private eventCallbackMap: { [key: string]: unknown } = {}; - - private contextMenuMap: ExtendedExtensionContextMenuItems[] = - []; - - private accountsMap: AccountDetails[] = []; - - constructor( - packageName: string, - communicator: ExtensionCommunicator, - bus: EventEmitter, - ) { - this.packageName = packageName; - this.player = new PlayerControls(this.packageName, bus); - this.utils = new Utils(packageName); - this.#communicator = communicator; - this.#bus = bus; - } - - public async getSongs(options: SongAPIOptions) { - return sendAsync(this.#bus, this.packageName, "getSongs", options); - } - - public async getEntity( - options: EntityApiOptions, - ) { - return sendAsync(this.#bus, this.packageName, "getEntity", options); - } - - public async getCurrentSong() { - return sendAsync(this.#bus, this.packageName, "getCurrentSong"); - } - - public async getVolume() { - return sendAsync(this.#bus, this.packageName, "getVolume"); - } - - public async getTime() { - return sendAsync(this.#bus, this.packageName, "getTime"); - } - - public async getQueue() { - return sendAsync(this.#bus, this.packageName, "getQueue"); - } - - public async getPlayerState() { - return sendAsync( - this.#bus, - this.packageName, - "getPlayerState", - ); - } - - public async getPreferences( - key?: string, - defaultValue?: unknown, - ): Promise { - return sendAsync(this.#bus, this.packageName, "getPreferences", { - packageName: this.packageName, - key, - defaultValue, - }); - } - - public async getSecure( - key?: string, - defaultValue?: unknown, - ): Promise { - return sendAsync(this.#bus, this.packageName, "getSecurePreferences", { - packageName: this.packageName, - key, - defaultValue, - }); - } - - public async setPreferences(key: string, value: unknown): Promise { - return sendAsync(this.#bus, this.packageName, "setPreferences", { - packageName: this.packageName, - key, - value, - }); - } - - public async setSecure(key: string, value: unknown): Promise { - return sendAsync( - this.#bus, - this.packageName, - "setSecurePreferences", - { - packageName: this.packageName, - key, - value, - }, - ); - } - - public async addSongs(...songs: Song[]) { - return sendAsync<(Song | undefined)[]>( - this.#bus, - this.packageName, - "updateSong", - songs, - ); - } - - public async updateSong(song: Song) { - return sendAsync(this.#bus, this.packageName, "update-song", song); - } - - public async removeSong(song: Song | string) { - let parsedSong: Song | undefined; - if (typeof song === "string") { - const searchRes = await this.getSongs({ - song: { - _id: song, - }, - }); - - parsedSong = searchRes?.at(0); - } else { - parsedSong = song; - } - - if (parsedSong) { - return sendAsync(this.#bus, this.packageName, "removeSong", song); - } - } - - public async addPlaylist(playlist: Omit) { - return ( - (await sendAsync( - this.#bus, - this.packageName, - "addPlaylist", - playlist, - )) ?? "" - ); - } - - public async addSongsToPlaylist(playlistID: string, ...songs: Song[]) { - return sendAsync(this.#bus, this.packageName, "addSongToPlaylist", { - playlistID, - songs, - }); - } - - public async registerOAuth(path: string) { - return sendAsync(this.#bus, this.packageName, "registerOauth", path); - } - - public async openExternalURL(url: string): Promise { - return sendAsync(this.#bus, this.packageName, "openExternal", url); - } - - public async showToast( - message: string, - duration?: number, - type?: "success" | "info" | "error" | "default", - ) { - return sendAsync(this.#bus, this.packageName, "showToast", { - type, - duration, - message, - }); - } - - public async registerAccount( - name: string, - bgColor: string, - icon: string, - signinCallback: AccountDetails["signinCallback"], - signoutCallback: AccountDetails["signoutCallback"], - ): Promise { - const id = `account:${this.packageName}:${this.accountsMap.length}`; - const final: AccountDetails = { - id, - packageName: this.packageName, - name, - bgColor, - icon, - signinCallback, - signoutCallback, - loggedIn: false, - }; - this.accountsMap.push(final); - await sendAsync( - this.#bus, - this.packageName, - "registerAccount", - final, - ); - return id; - } - - public async changeAccountAuthStatus( - id: string, - loggedIn: boolean, - username?: string, - ) { - const item = this.accountsMap.find((val) => val.id === id); - if (item) { - item.username = username; - item.loggedIn = loggedIn; - await sendAsync( - this.#bus, - this.packageName, - "registerAccount", - item, - ); - } - } - - public async openLoginModal(data: LoginModalOptions) { - return ( - (await sendAsync(this.#bus, this.packageName, "openLoginModal", { - packageName: this.packageName, - ...data, - })) ?? false - ); - } - - public async closeLoginModal() { - return await sendAsync( - this.#bus, - this.packageName, - "closeLoginModal", - ); - } - - private _extensionUpdateDebounce: ReturnType | undefined; - private async extensionUpdated() { - if (this._extensionUpdateDebounce) { - clearTimeout(this._extensionUpdateDebounce); - } - this._extensionUpdateDebounce = setTimeout(() => { - return sendAsync(this.#bus, this.packageName, "extensionUpdated"); - }, 300); - } - - public on(eventName: ExtraExtensionEventTypes, callback: unknown) { - console.debug( - "Registering listener for", - eventName, - "in package", - this.packageName, - ); - this.eventCallbackMap[eventName] = callback; - - this.extensionUpdated(); - - if (eventName === "requestedPlaylists") { - this.registerPlaylistProvider(); - } - return callback; - } - - public off(eventName: T) { - console.debug( - "Removing listener for", - eventName, - "in package", - this.packageName, - ); - delete this.eventCallbackMap[eventName]; - } - - public async _emit( - event: ExtraExtensionEvents, - ) { - const callback = this.eventCallbackMap[event.type] as ( - ...data: ExtraExtensionEventData - ) => Promise>; - if (callback && typeof callback === "function") { - return (await callback( - ...event.data, - )) as ExtraExtensionEventReturnType; - } - } - - private generateExtendedContextMenuItems( - ...items: ExtensionContextMenuItem[] - ): ExtendedExtensionContextMenuItems[] { - const ret: ExtendedExtensionContextMenuItems[] = []; - for (const m of items) { - let children: ExtendedExtensionContextMenuItems[] | undefined = - undefined; - if (m.children) { - children = this.generateExtendedContextMenuItems(...m.children); - } - ret.push({ - ...m, - id: crypto.randomUUID(), - children, - packageName: this.packageName, - }); - } - - console.debug("Generated extended type for context menu items"); - - return ret; - } - - public setContextMenuItem( - ...items: ExtensionContextMenuItem[] - ): number { - console.debug( - "Adding context menu items for types", - items.map((val) => val.type).join(", "), - ); - return this.contextMenuMap.push( - ...this.generateExtendedContextMenuItems(...items), - ); - } - - public removeContextMenuItem(index: number) { - console.debug("Removing context menu items at", index); - this.contextMenuMap.splice(index, 1); - } - - public getContextMenuItems() { - return this.contextMenuMap; - } - - public getInstalledExtensions() { - return Array.from(this.#communicator.extensionRetriever()).map( - (val) => val.packageName, - ); - } - - public _getContextMenuItems(): ExtendedExtensionContextMenuItems[] { - return JSON.parse(JSON.stringify(this.getContextMenuItems())); - } - - public _getAccountDetails(): AccountDetails[] { - return this.accountsMap; - } - - public registerSearchProvider() { - console.warn("Deprecated API, please update the extension"); - } - - public registerArtistSongProvider() { - console.warn("Deprecated API, please update the extension"); - } - - public registerAlbumSongProvider() { - console.warn("Deprecated API, please update the extension"); - } - - private registerPlaylistProvider() { - console.warn("Deprecated API, please update the extension"); - } - - public setArtistEditableInfo( - artist_id: string, - object: Record, - ) { - return sendAsync( - this.#bus, - this.packageName, - "setArtistEditableInfo", - { - artist_id, - object, - }, - ); - } - - public setAlbumEditableInfo( - album_id: string, - object: Record, - ) { - return sendAsync( - this.#bus, - this.packageName, - "setAlbumEditableInfo", - { - album_id, - object, - }, - ); - } - - public _isEventCallbackRegistered(key: string) { - return !!this.eventCallbackMap[key]; - } - - addUserPreference(pref: ExtensionPreferenceGroup): void { - this.#communicator.addPreference(this.packageName, pref); - } - removeUserPreference(key: string): void { - this.#communicator.removePreference(this.packageName, key); - } -} - -class Utils implements utils { - private _packageName: string; - - constructor(packageName: string) { - this._packageName = packageName; - } - - public getArtistExtraInfo(artist: Artists) { - if (artist?.artist_extra_info?.extensions) - return artist.artist_extra_info.extensions[this.packageName] as Record< - string, - string - >; - return undefined; - } - - public getAlbumExtraInfo(album: Album) { - if (album?.album_extra_info?.extensions) - return album?.album_extra_info?.extensions[this.packageName] as Record< - string, - string - >; - return undefined; - } - - public get packageName(): string { - return this._packageName; - } - - public get customRequestBaseUrl() { - return `extension://${this.packageName}`; - } -} - -class PlayerControls implements playerControls { - private packageName: string; - #bus: EventEmitter; - - constructor(packageName: string, bus: EventEmitter) { - this.packageName = packageName; - this.#bus = bus; - } - - play(): Promise { - return sendAsync(this.#bus, this.packageName, "play"); - } - - pause(): Promise { - return sendAsync(this.#bus, this.packageName, "pause"); - } - - stop(): Promise { - return sendAsync(this.#bus, this.packageName, "stop"); - } - - nextSong(): Promise { - return sendAsync(this.#bus, this.packageName, "next"); - } - - prevSong(): Promise { - return sendAsync(this.#bus, this.packageName, "prev"); - } -} - -function sendAsync( - bus: EventEmitter, - packageName: string, - type: extensionRequests, - data?: unknown, -): Promise { - const channel = crypto.randomUUID(); - return new Promise((resolve) => { - const listener: (data: extensionReplyMessage) => void = ( - data: extensionReplyMessage, - ) => { - if (data.channel === channel) { - bus.off(channel, listener); - resolve(data.data as T); - } - }; - bus.on(channel, listener); - bus.emit("request", { - type, - channel, - data, - extensionName: packageName, - } as extensionRequestMessage); - }); -} diff --git a/src-extensions/src/sandbox/common.ts b/src-extensions/src/sandbox/common.ts deleted file mode 100644 index 8beed23c..00000000 --- a/src-extensions/src/sandbox/common.ts +++ /dev/null @@ -1,309 +0,0 @@ -import { v4 } from "uuid"; - -export function arrayDiff(arr1: T[], arr2: T[]) { - return arr1.filter((x) => !arr2.includes(x)); -} - -export function convertDuration(n: number) { - if (n) { - if (!Number.isFinite(n) || n < 0) { - return "Live"; - } - const tmp = new Date(n * 1000).toISOString().substring(11, 19); - - if (tmp[0] === "0" && tmp[1] === "0") { - return tmp.substring(3); - } - - return tmp; - } - return "00:00"; -} - -export function getVersion(verS: string) { - try { - return parseInt(verS.split(".").join("")); - } catch (e) { - console.warn( - "Failed to parse", - verS, - ". Please use x.y.z as extension versioning format", - e, - ); - } - - return 0; -} - -export function isEmpty(val: T | undefined): val is undefined { - return typeof val === "undefined" || val === null; -} - -function sortAsc(first: unknown, second: unknown) { - if (typeof first === "string" && typeof second === "string") - return first.localeCompare(second); - - if (typeof first === "number" && typeof second === "number") - return first - second; - - return 0; -} - -function getSortField(song: Song, field: SongSortOptions["type"]) { - if (field === "album") { - return song.album?.album_name; - } - - if ((field as string) === "artist") { - return song.artists?.[0].artist_name; - } - - if (field === "genre") { - return song.genre?.[0]; - } - - return song[field as keyof Song]; -} - -export function sortSongListFn(options: SongSortOptions[]) { - const fn = (a: Song, b: Song) => { - for (const o of options) { - const first: unknown = getSortField(a, o.type); - const second: unknown = getSortField(b, o.type); - - if (!isEmpty(first) && !isEmpty(second)) { - if (first !== second) { - if (!o.asc) { - return sortAsc(second, first); - } - return sortAsc(first, second); - } - } - } - - return 0; - }; - - return fn; -} - -export function sortSongList( - songList: Song[], - options: SongSortOptions[], -): Song[] { - let parsedOptions = options; - if (!Array.isArray(options)) parsedOptions = [options]; - return songList.sort(sortSongListFn(parsedOptions)); -} - -const iso8601DurationRegex = - /(-)?P(?:([.,\d]+)Y)?(?:([.,\d]+)M)?(?:([.,\d]+)W)?(?:([.,\d]+)D)?T(?:([.,\d]+)H)?(?:([.,\d]+)M)?(?:([.,\d]+)S)?/; - -export function parseISO8601Duration(duration: string): number { - const matches = duration.match(iso8601DurationRegex); - - // Don't care about anything over days - if (matches) { - return ( - parseInt(matches[8] ?? "0") + - parseInt(matches[7] ?? "0") * 60 + - parseInt(matches[6] ?? "0") * 60 * 60 + - parseInt(matches[5] ?? "0") * 60 * 60 * 24 - ); - } - return 0; -} - -export function humanByteSize(size: number, bitrate = false): string { - const thresh = bitrate ? 1000 : 1024; - const dp = 2; - - if (Math.abs(size) < thresh) { - return `${size} B`; - } - - const units = bitrate - ? ["kbps", "Mbps", "Gbps", "Tbps", "Pbps", "Ebps", "Zbps", "Ybps"] - : ["KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"]; - let u = -1; - const r = 10 ** dp; - - let parsedSize = size; - do { - parsedSize /= thresh; - ++u; - } while ( - Math.round(Math.abs(parsedSize) * r) / r >= thresh && - u < units.length - 1 - ); - - return `${parsedSize.toFixed(dp)} ${units[u]}`; -} - -export function getErrorMessage(...args: unknown[]) { - const ret = []; - for (const data of args) { - if (data instanceof Error) { - ret.push(data.name); - ret.push(data.message); - ret.push(data.stack); - } else { - ret.push(data); - } - } - - return ret; -} - -export function sanitizeArtistName(name: string) { - return name - .trim() - .replace(/([a-z])([A-Z])/g, "$1 $2") - .toLowerCase() - .replaceAll("vevo", ""); -} - -export function dotIndex( - obj: Record, - is: string | string[], - value?: unknown, -): unknown { - if (typeof is === "string") return dotIndex(obj, is.split("."), value); - else if (is.length === 1 && value !== undefined) { - obj[is[0]] === value; - return obj; - } else if (is.length === 0) return obj; - else - return dotIndex(obj[is[0]] as Record, is.slice(1), value); -} - -function isObject(item: unknown): item is Record { - return !!(item && typeof item === "object" && !Array.isArray(item)); -} - -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export function mergeDeep( - target: Record, - ...sources: unknown[] -): Record { - if (!sources.length) return target; - const source = sources.shift(); - - if (isObject(target) && isObject(source)) { - for (const key in source) { - if (isObject(source[key])) { - if (!target[key]) Object.assign(target, { [key]: {} }); - mergeDeep(target[key] as Record, source[key]); - } else { - Object.assign(target, { [key]: source[key] }); - } - } - } - - return mergeDeep(target, ...sources); -} - -// https://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex -export function escapeRegExp(str: string) { - return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); -} - -// https://stackoverflow.com/a/19270021 -export function getRandomFromArray(arr: unknown[], n: number) { - const result = new Array(n); - let len = arr.length; - const taken = new Array(len); - - let m = Math.min(n, len - 1); - while (m--) { - const x = Math.floor(Math.random() * len); - result[m] = arr[x in taken ? taken[x] : x]; - taken[x] = --len in taken ? taken[len] : len; - } - return result; -} - -export function sanitizeSong(ext: string, ...songs: Song[]): Song[] { - return songs.map((val) => ({ - ...val, - artists: sanitizeArtists(ext, ...(val.artists ?? [])), - album: val.album && sanitizeAlbums(ext, val.album)[0], - _id: `${ext}:${val._id ?? v4()}`, - providerExtension: ext, - })); -} - -interface ExtendedPlaylist extends Playlist { - extension?: string; - isLocal: boolean; -} - -export function sanitizePlaylist( - ext: string, - isLocal: boolean, - ...playlists: Playlist[] -): ExtendedPlaylist[] { - return playlists.map((val) => ({ - ...val, - playlist_id: `${ext}:${val.playlist_id ?? v4()}`, - extension: ext, - isLocal, - })); -} - -export function sanitizeAlbums(ext: string, ...albums: Album[]): Album[] { - return albums.map((val) => ({ - ...val, - album_id: `${ext}:${val.album_id ?? v4()}`, - album_extra_info: { - extensions: { - [ext]: sanitizeExtraInfo(val.album_extra_info?.extensions?.[ext]), - }, - }, - })); -} - -export function sanitizeExtraInfo(extra_info?: Record) { - const ret: Record = {}; - if (extra_info) { - for (const [key, val] of Object.entries(extra_info)) { - if (typeof val !== "string") { - ret[key] = JSON.stringify(val); - } else { - ret[key] = val as string; - } - } - } - - return ret; -} - -export function sanitizeArtists(ext: string, ...artists: Artists[]): Artists[] { - return artists.map((val) => ({ - ...val, - artist_id: `${ext}:${val.artist_id ?? v4()}`, - artist_extra_info: { - extensions: { - [ext]: sanitizeExtraInfo(val.artist_extra_info?.extensions?.[ext]), - }, - }, - })); -} - -export const sleep = (ms: number) => new Promise((r) => setTimeout(r, ms)); - -export function isAlbum(data: unknown): data is Album { - return !!(data as Album).album_id; -} - -export function isArtist(data: unknown): data is Artists { - return !!(data as Artists).artist_id; -} - -export function isGenre(data: unknown): data is Genre { - return !!(data as Genre).genre_id; -} - -export async function* emptyGen() { - yield { songs: [] }; -} diff --git a/src-extensions/src/sandbox/commonConstants.ts b/src-extensions/src/sandbox/commonConstants.ts deleted file mode 100644 index 536c7e9d..00000000 --- a/src-extensions/src/sandbox/commonConstants.ts +++ /dev/null @@ -1,16 +0,0 @@ -export enum ProviderScopes { - SEARCH = "search", - PLAYLISTS = "playlists", - PLAYLIST_SONGS = "playlistSongs", - ARTIST_SONGS = "artistSongs", - ALBUM_SONGS = "albumSongs", - RECOMMENDATIONS = "recommendations", - SCROBBLES = "scrobbles", - PLAYLIST_FROM_URL = "playlistFromUrl", - SONG_FROM_URL = "songFromUrl", - SEARCH_ALBUM = "searchAlbum", - SEARCH_ARTIST = "searchArtist", - PLAYBACK_DETAILS = "playbackDetails", -} - -export const FAVORITES_PLAYLIST_ID = "favorites_playlist"; diff --git a/src-extensions/src/sandbox/extensionFinder.ts b/src-extensions/src/sandbox/extensionFinder.ts deleted file mode 100644 index d7c34329..00000000 --- a/src-extensions/src/sandbox/extensionFinder.ts +++ /dev/null @@ -1,97 +0,0 @@ -/* - * extensionFinder.ts is a part of Moosync. - * - * Copyright 2021-2022 by Sahil Gupte . All rights reserved. - * Licensed under the GNU General Public License. - * - * See LICENSE in the project root for license information. - */ - -import { promises as fsP } from "node:fs"; -import * as path from "node:path"; - -export abstract class AbstractExtensionFinder { - abstract findExtensions(): AsyncGenerator; -} - -export class ExtensionFinder extends AbstractExtensionFinder { - private searchPaths: string[]; - - constructor(searchPaths: string[]) { - super(); - this.searchPaths = searchPaths; - } - - private async parseJson(filePath: string) { - const raw = await fsP.readFile(filePath, "utf-8"); - return JSON.parse(raw); - } - - public async *findExtensions(): AsyncGenerator { - // const path = require("node:path"); - for (const searchPath of this.searchPaths) { - try { - // Should proceed if file exists - await fsP.access(searchPath); - - const dirents = await fsP.readdir(searchPath, { withFileTypes: true }); - const filtered = dirents.filter((val) => val.isDirectory()); - for (const folder of filtered) { - const extDir = await fsP.readdir(path.join(searchPath, folder.name), { - withFileTypes: true, - }); - const possibleManifests = extDir.filter( - (val) => val.isFile() && val.name === "package.json", - ); - if (possibleManifests && possibleManifests.length > 0) { - const manifestPath = path.join( - searchPath, - folder.name, - possibleManifests[0].name, - ); - const manifest = await this.parseJson(manifestPath); - if (manifest.moosyncExtension) { - const modulePath = path.join( - searchPath, - folder.name, - manifest.extensionEntry, - ); - console.debug( - "Found extension at", - path.join(searchPath, folder.name), - ); - yield { - name: manifest.displayName, - packageName: manifest.name, - desc: manifest.description, - author: manifest.author, - version: manifest.version, - entry: modulePath, - extensionPath: path.join(searchPath, folder.name), - extensionIcon: manifest.icon - ? path.join(searchPath, folder.name, manifest.icon) - : undefined, - }; - } - } - } - } catch (e) { - console.warn( - "Extension search path", - searchPath, - "doesn't exist. Creating it.", - e, - ); - - try { - // Create directory if it does not exist - fsP.mkdir(searchPath); - } catch (e) { - console.error(e); - } - - return this.findExtensions(); - } - } - } -} diff --git a/src-extensions/src/sandbox/extensionHandler.ts b/src-extensions/src/sandbox/extensionHandler.ts deleted file mode 100644 index fbf452b2..00000000 --- a/src-extensions/src/sandbox/extensionHandler.ts +++ /dev/null @@ -1,420 +0,0 @@ -/* - * extensionHandler.ts is a part of Moosync. - * - * Copyright 2022 by Sahil Gupte . All rights reserved. - * Licensed under the GNU General Public License. - * - * See LICENSE in the project root for license information. - */ - -import type { AbstractExtensionManager } from "./extensionManager"; -import { ExtensionManager } from "./extensionManager"; -import { ExtensionFinder } from "./extensionFinder"; -import type { AbstractExtensionFinder } from "./extensionFinder"; - -import { - getVersion, - sanitizeAlbums, - sanitizeArtists, - sanitizePlaylist, - sanitizeSong, -} from "./common"; -import { ProviderScopes } from "./commonConstants"; -import type { providerFetchRequests } from "../constants"; -import type EventEmitter from "node:events"; - -type CombinedSongsType = - | SongsReturnType - | PlaylistAndSongsReturnType - | RecommendationsReturnType; - -export class ExtensionHandler { - private extensionManager: AbstractExtensionManager; - private extensionFinder: AbstractExtensionFinder; - private _initialized_resolver: () => void; - initialized = new Promise((r) => (this._initialized_resolver = r)); - // eslint-disable-next-line @typescript-eslint/ban-types - // biome-ignore lint/complexity/noBannedTypes: - private preInitializedCalls: { func: Function; args?: unknown[] }[]; - - constructor( - searchPaths: string[], - logsPath: string, - installPath: string, - bus: EventEmitter, - ) { - this.preInitializedCalls = []; - this.extensionManager = new ExtensionManager(logsPath, installPath, bus); - this.extensionFinder = new ExtensionFinder(searchPaths); - - this.registerPlugins().then(() => { - this._initialized_resolver(); - for (const [index, f] of this.preInitializedCalls.entries()) { - if (f.args) { - f.func.bind(this)(...f.args); - } else f.func.bind(this)(); - - this.preInitializedCalls.splice(index); - } - }); - } - - private isDuplicateExtension(ext: UnInitializedExtensionItem) { - const matches = this.extensionManager.getExtensions({ - packageName: ext.packageName, - }); - for (const oldExt of matches) { - const oldVer = getVersion(oldExt.version); - const newVer = getVersion(ext.version); - if (newVer > oldVer) { - this.extensionManager.deregister(oldExt.packageName); - return false; - } - return true; - } - return false; - } - - public async registerPlugins(): Promise { - for await (const ext of this.extensionFinder.findExtensions()) { - if (!this.isDuplicateExtension(ext)) { - await this.extensionManager.instantiateAndRegister(ext); - } - } - } - - public async startAll() { - await this.initialized; - await this.toggleExtStatus(undefined, true); - } - - public async toggleExtStatus( - packageName: string | undefined, - enabled: boolean, - ) { - const ext = this.extensionManager.getExtensions( - packageName ? { packageName } : undefined, - ); - for (const e of ext) { - if (enabled) { - this.sendToExtensions(e.packageName, "onStarted"); - } else { - this.sendToExtensions(e.packageName, "onStopped"); - } - this.extensionManager.setStarted(e.packageName, enabled); - } - } - - public async removeExt(packageName: string) { - // Shut down extension before removing - await this.toggleExtStatus(packageName, false); - - this.extensionManager.deregister(packageName); - } - - public getExtensionIcon(packageName: string) { - const ext = this.extensionManager.getExtensions({ packageName }); - for (const e of ext) { - return { [packageName]: e.extensionIcon }; - } - return undefined; - } - - public getExtensionAccounts(packageName?: string) { - const ext = this.extensionManager.getExtensions({ packageName }); - const accountMap: { [key: string]: AccountDetails[] } = {}; - for (const e of ext) { - accountMap[e.packageName] = e.global.api._getAccountDetails(); - } - - return accountMap; - } - - public getDisplayName(packageName: string) { - const ext = this.extensionManager.getExtensions({ packageName }); - for (const e of ext) { - return e.name; - } - return undefined; - } - - public extensionProvides( - packageName?: string, - ): Record { - const providesMap: Record = {}; - - const exts = this.extensionManager.getExtensions({ packageName }); - for (const e of exts) { - if (!providesMap[e.packageName]) { - providesMap[e.packageName] = []; - } - - if (e.global.api._isEventCallbackRegistered("requestedSearchResult")) { - providesMap[e.packageName].push(ProviderScopes.SEARCH); - } - - if (e.global.api._isEventCallbackRegistered("requestedAlbumSongs")) { - providesMap[e.packageName].push(ProviderScopes.ALBUM_SONGS); - } - - if (e.global.api._isEventCallbackRegistered("requestedArtistSongs")) { - providesMap[e.packageName].push(ProviderScopes.ARTIST_SONGS); - } - - if (e.global.api._isEventCallbackRegistered("requestedPlaylists")) { - providesMap[e.packageName].push(ProviderScopes.PLAYLISTS); - } - - if (e.global.api._isEventCallbackRegistered("requestedPlaylistSongs")) { - providesMap[e.packageName].push(ProviderScopes.PLAYLIST_SONGS); - } - - if (e.global.api._isEventCallbackRegistered("requestedPlaylistFromURL")) { - providesMap[e.packageName].push(ProviderScopes.PLAYLIST_FROM_URL); - } - - if (e.global.api._isEventCallbackRegistered("requestedSongFromURL")) { - providesMap[e.packageName].push(ProviderScopes.SONG_FROM_URL); - } - - if (e.global.api._isEventCallbackRegistered("requestedRecommendations")) { - providesMap[e.packageName].push(ProviderScopes.RECOMMENDATIONS); - } - - if (e.global.api._isEventCallbackRegistered("playbackDetailsRequested")) { - providesMap[e.packageName].push(ProviderScopes.PLAYBACK_DETAILS); - } - } - - return providesMap; - } - - public handleProviderRequests( - type: providerFetchRequests, - packageName: string, - ) { - if (type === "getExtensionProviderScopes") { - return this.extensionProvides(packageName); - } - return undefined; - } - - public async performExtensionAccountLogin( - packageName: string, - accountId: string, - loginStatus: boolean, - ) { - const ext = this.extensionManager.getExtensions({ packageName }); - for (const e of ext) { - const account = e.global.api - ._getAccountDetails() - .find((val) => val.id === accountId); - if (account) { - loginStatus - ? await account.signinCallback() - : await account.signoutCallback(); - } - } - } - - public sendEvent(event: extensionEventMessage) { - const method: keyof MoosyncExtensionTemplate = event.type; - if (this.initialized) { - this.sendToExtensions(event.packageName, method, event.data); - } else { - this.preInitializedCalls.push({ func: this.sendEvent, args: [event] }); - } - } - - private toExtensionDetails(item: ExtensionItem): ExtensionDetails { - return { - name: item.name, - desc: item.desc, - author: item.author, - packageName: item.packageName, - version: item.version, - hasStarted: item.hasStarted, - entry: item.entry, - preferences: item.preferences, - extensionPath: item.extensionPath, - extensionIcon: item.extensionIcon, - }; - } - - public getInstalledExtensions() { - const extensions = this.extensionManager.getExtensions(); - const parsed: ExtensionDetails[] = []; - for (const e of extensions) { - parsed.push(this.toExtensionDetails(e)); - } - return parsed; - } - - public async sendToExtensions( - packageName: string | undefined, - method: keyof MoosyncExtensionTemplate, - args?: unknown, - ) { - for (const ext of this.extensionManager.getExtensions({ - started: method === "onStarted" ? false : true, - packageName, - })) { - try { - console.debug("Trying to send event:", method, "to", ext.packageName); - if (ext.instance[method]) { - console.debug("Extension can handle event, sending"); - (ext.instance[method] as (args: unknown) => Promise)(args); - } - } catch (e) { - console.error(e); - } - } - } - - public async stopAllExtensions() { - console.debug("Stopping all extensions"); - this.toggleExtStatus(undefined, false); - } - - private isForwardRequest(data: unknown | undefined): boolean { - return !!(data as { forwardTo: string })?.forwardTo; - } - - public async sendExtraEventToExtensions( - event: ExtraExtensionEvents, - ) { - const allData: { - [key: string]: ExtraExtensionEventReturnType | undefined; - } = {}; - const EventType: T = event.type; - for (const ext of this.extensionManager.getExtensions({ - started: true, - packageName: event.packageName, - })) { - if (event.type === "requestedPlaylistSongs") { - event.data[0] = ( - event.data as ExtraExtensionEventData<"requestedPlaylistSongs"> - )[0]?.replace(`${ext.packageName}:`, ""); - } - - const resp = await ext.global.api._emit({ - type: event.type, - data: event.data, - }); - - const packageName = ext.packageName; - - if (resp && !this.isForwardRequest(resp)) { - if (event.type === "requestedPlaylists") { - (resp as PlaylistReturnType).playlists = sanitizePlaylist( - packageName, - false, - ...(resp as PlaylistReturnType).playlists, - ); - } - - if (EventType === "requestedPlaylistFromURL") { - (resp as PlaylistAndSongsReturnType).playlist = sanitizePlaylist( - packageName, - false, - (resp as PlaylistAndSongsReturnType).playlist, - )[0]; - (resp as PlaylistAndSongsReturnType).songs = sanitizeSong( - packageName, - ...(resp as PlaylistAndSongsReturnType).songs, - ); - } - - if ( - EventType === "requestedPlaylistSongs" || - EventType === "requestedRecommendations" - ) { - (resp as CombinedSongsType).songs = sanitizeSong( - packageName, - ...(resp as CombinedSongsType).songs, - ); - } - - if ( - EventType === "requestedSongFromURL" || - EventType === "requestedSongFromId" - ) { - (resp as SongReturnType).song = sanitizeSong( - packageName, - (resp as SongReturnType).song, - )[0]; - } - - if (EventType === "requestedSearchResult") { - (resp as SearchReturnType).songs = sanitizeSong( - packageName, - ...(resp as SearchReturnType).songs, - ); - (resp as SearchReturnType).playlists = sanitizePlaylist( - packageName, - false, - ...(resp as SearchReturnType).playlists, - ); - (resp as SearchReturnType).artists = sanitizeArtists( - packageName, - ...(resp as SearchReturnType).artists, - ); - (resp as SearchReturnType).albums = sanitizeAlbums( - packageName, - ...(resp as SearchReturnType).albums, - ); - } - - if (EventType === "requestedArtistSongs") { - (resp as SongsReturnType).songs = sanitizeSong( - packageName, - ...(resp as SongsReturnType).songs, - ); - } - - if (EventType === "requestedAlbumSongs") { - (resp as SongsReturnType).songs = sanitizeSong( - packageName, - ...(resp as SongsReturnType).songs, - ); - } - } - - allData[ext.packageName] = resp; - } - - return allData; - } - - public getExtensionContextMenu( - type: T, - ): ExtensionContextMenuItem[] { - const items: ExtensionContextMenuItem[] = []; - for (const ext of this.extensionManager.getExtensions({ started: true })) { - items.push( - ...ext.global.api - ._getContextMenuItems() - .filter((val) => val.type === type), - ); - } - - return items as ExtensionContextMenuItem[]; - } - - public fireContextMenuCallback( - id: string, - packageName: string, - arg: ExtensionContextMenuHandlerArgs, - ) { - for (const ext of this.extensionManager.getExtensions({ - started: true, - packageName, - })) { - const item = ( - ext.global.api.getContextMenuItems() as ExtendedExtensionContextMenuItems[] - ).find((val) => val.id === id); - - item?.handler?.(arg); - } - } -} diff --git a/src-extensions/src/sandbox/extensionManager.ts b/src-extensions/src/sandbox/extensionManager.ts deleted file mode 100644 index a871b1d7..00000000 --- a/src-extensions/src/sandbox/extensionManager.ts +++ /dev/null @@ -1,264 +0,0 @@ -/* - * extensionManager.ts is a part of Moosync. - * - * Copyright 2022 by Sahil Gupte . All rights reserved. - * Licensed under the GNU General Public License. - * - * See LICENSE in the project root for license information. - */ - -import { ExtensionRequestGenerator } from "./api"; -import { InMemoryRegistry } from "./extensionRegistry"; -import { readFile } from "node:fs/promises"; -import log from "loglevel"; -import * as path from "node:path"; -import { NodeVM } from "vm2"; -import type EventEmitter from "node:events"; - -export abstract class AbstractExtensionManager { - abstract instantiateAndRegister( - extension: UnInitializedExtensionItem, - ): Promise; - abstract deregister(packageName: string): void; - abstract getExtensions( - options?: getExtensionOptions, - ): Iterable; - abstract setStarted(packageName: string, status: boolean): void; -} - -export class ExtensionManager extends AbstractExtensionManager { - private extensionRegistry = new InMemoryRegistry(); - // private logsPath: string; - private installPath: string; - private bus: EventEmitter; - - private extensionCommunicator: ExtensionCommunicator = { - extensionRetriever: this.getExtensions.bind(this), - addPreference: this.addPreference.bind(this), - removePreference: this.removePreference.bind(this), - }; - - constructor(_logsPath: string, installPath: string, bus: EventEmitter) { - super(); - // this.logsPath = logsPath; - this.installPath = installPath; - this.bus = bus; - } - - private register(extensionItem: ExtensionItem) { - this.extensionRegistry.register(extensionItem); - } - - deregister(packageName: string) { - this.extensionRegistry.deregister(packageName); - } - - private getProcessEnv() { - const env = JSON.parse( - JSON.stringify(process.env), - ) as Partial; - env.FanartTVApiKey = undefined; - env.LastFmApiKey = undefined; - env.LastFmSecret = undefined; - env.SpotifyClientID = undefined; - env.SpotifyClientSecret = undefined; - env.YoutubeClientID = undefined; - env.YoutubeClientSecret = undefined; - - env["YOUTUBECLIENTID"] = undefined; - env["YOUTUBECLIENTSECRET"] = undefined; - env["LASTFMAPIKEY"] = undefined; - env["LASTFMSECRET"] = undefined; - env["FANARTTVAPIKEY"] = undefined; - env["GH_TOKEN"] = undefined; - - env["MOOSYNC_VERSION"] = process.env.MOOSYNC_VERSION; - env["installPath"] = this.installPath; - - return env; - } - - private async getVM(entryFilePath: string, extensionPath: string) { - // eslint-disable-next-line @typescript-eslint/no-var-requires - const events = require("node:events"); - const vm = new NodeVM({ - console: "redirect", - sandbox: { - URL, - URLSearchParams, - }, - env: this.getProcessEnv(), - nesting: true, - require: { - external: true, - context: "host", - builtin: ["*"], - root: [path.dirname(entryFilePath), extensionPath], - mock: { - events, - }, - }, - }); - - return vm; - } - - private getGlobalObject(packageName: string, entryFilePath: string) { - const child = log.getLogger(packageName); - // prefixLogger(this.logsPath, child); - - return { - __dirname: path.dirname(entryFilePath), - __filename: entryFilePath, - api: new ExtensionRequestGenerator( - packageName, - this.extensionCommunicator, - this.bus, - ), - logger: child, - }; - } - - private readFileNoCache(path: string) { - return readFile(path, { flag: "rs", encoding: "utf-8" }); - } - - private async checkExtValidityAndGetInstance( - entryFilePath: string, - extensionPath: string, - ): Promise<{ vm: NodeVM; factory: ExtensionFactory } | undefined> { - try { - const file = await this.readFileNoCache(entryFilePath); - const vm = await this.getVM(entryFilePath, extensionPath); - const extension = vm.run(file, entryFilePath); - - let instance: any; - - if (typeof extension === "function") { - instance = new extension(); - } - - if (typeof extension === "object") { - instance = new extension.default(); - } - - if (!Array.isArray(instance.extensionDescriptors)) { - return undefined; - } - - for (const factory of instance.extensionDescriptors) { - if (factory.create) { - return { factory: factory, vm }; - } - } - } catch (e) { - console.error(e); - } - - return undefined; - } - - private setGlobalObjectToVM( - vm: NodeVM, - packageName: string, - entryFilePath: string, - ) { - const globalObj = this.getGlobalObject(packageName, entryFilePath); - vm.freeze(globalObj.api, "api"); - vm.freeze(globalObj.logger, "logger"); - - vm.on("console.log", globalObj.logger.log); - vm.on("console.info", globalObj.logger.info); - vm.on("console.trace", globalObj.logger.trace); - vm.on("console.debug", globalObj.logger.debug); - vm.on("console.warn", globalObj.logger.warn); - vm.on("console.error", globalObj.logger.error); - - return globalObj; - } - - async instantiateAndRegister(extension: UnInitializedExtensionItem) { - const vmObj = await this.checkExtValidityAndGetInstance( - extension.entry, - extension.extensionPath, - ); - if (vmObj) { - const global = this.setGlobalObjectToVM( - vmObj.vm, - extension.packageName, - extension.entry, - ); - - const preferences = await (vmObj.factory.registerUserPreferences?.() ?? - vmObj.factory.registerPreferences?.() ?? - []); - - const instance = await vmObj.factory.create(); - - console.debug("Instantiated", extension.name); - - this.register({ - name: extension.name, - desc: extension.desc, - author: extension.author, - packageName: extension.packageName, - version: extension.version, - hasStarted: false, - entry: extension.entry, - vm: vmObj.vm, - extensionPath: extension.extensionPath, - extensionIcon: extension.extensionIcon, - preferences, - global, - instance, - }); - } - - console.debug(`Registered ${extension.name} - ${extension.desc}`); - } - - getExtensions(options?: getExtensionOptions): Iterable { - return this.extensionRegistry.get(options); - } - - private notifyPreferencesChanged(_: string) { - // process.send?.({ - // type: "updatePreferences", - // channel: v4(), - // data: undefined, - // extensionName: packageName, - // } as extensionUIRequestMessage); - } - - private addPreference( - packageName: string, - preference: ExtensionPreferenceGroup, - ) { - for (const e of this.extensionRegistry.get({ packageName })) { - if (e.preferences.find((val) => val.key === preference.key)) { - console.warn("Preference already exists, skipping..."); - return; - } - e.preferences.push(preference); - this.notifyPreferencesChanged(packageName); - return; - } - } - - private removePreference(packageName: string, key: string) { - for (const e of this.extensionRegistry.get({ packageName })) { - const i = e.preferences.findIndex((val) => val.key === key); - if (i !== -1) { - e.preferences.splice(i, 1); - this.notifyPreferencesChanged(packageName); - } else { - console.warn("Preference with key", key, "does not exist"); - } - return; - } - } - - setStarted(packageName: string, status: boolean) { - this.extensionRegistry.setStarted(packageName, status); - } -} diff --git a/src-extensions/src/sandbox/extensionRegistry.ts b/src-extensions/src/sandbox/extensionRegistry.ts deleted file mode 100644 index d9bf9e2d..00000000 --- a/src-extensions/src/sandbox/extensionRegistry.ts +++ /dev/null @@ -1,54 +0,0 @@ -/* - * extensionRegistry.ts is a part of Moosync. - * - * Copyright 2021-2022 by Sahil Gupte . All rights reserved. - * Licensed under the GNU General Public License. - * - * See LICENSE in the project root for license information. - */ - -export abstract class AbstractExtensionRegistry { - abstract register(extension: ExtensionItem): void - abstract get(options?: getExtensionOptions): Iterable - abstract setStarted(packageName: string, status: boolean): void -} - -export class InMemoryRegistry extends AbstractExtensionRegistry { - private extensionStore: ExtensionItem[] = [] - - register(extension: ExtensionItem) { - this.extensionStore.push(extension) - } - - deregister(packageName: string) { - const index = this.extensionStore.findIndex((val) => val.packageName === packageName) - if (index !== -1) { - this.extensionStore.splice(index, 1) - } - } - - private checkPackageName(packageName: string | undefined, item: ExtensionItem) { - if (packageName) { - return item.packageName === packageName - } - return true - } - - private checkStarted(started: boolean | undefined, item: ExtensionItem) { - if (started !== undefined) { - return item.hasStarted === started - } - return true - } - - get(options?: getExtensionOptions): Iterable { - return this.extensionStore.filter((val) => - options ? !!(this.checkPackageName(options.packageName, val) && this.checkStarted(options.started, val)) : true, - ) - } - - setStarted(packageName: string, status: boolean) { - const extension = this.extensionStore.find((val) => val.packageName === packageName) - if (extension) extension.hasStarted = status - } -} diff --git a/src-extensions/src/sandbox/index.ts b/src-extensions/src/sandbox/index.ts deleted file mode 100644 index 413a1ee5..00000000 --- a/src-extensions/src/sandbox/index.ts +++ /dev/null @@ -1,247 +0,0 @@ -/* - * index.ts is a part of Moosync. - * - * Copyright 2022 by Sahil Gupte . All rights reserved. - * Licensed under the GNU General Public License. - * - * See LICENSE in the project root for license information. - */ - -import type { mainRequests, providerFetchRequests } from "../constants"; -import { mainRequestsKeys, providerExtensionKeys } from "../constants"; -import log from "loglevel"; - -import { ExtensionHandler } from "../sandbox/extensionHandler"; -import type EventEmitter from "node:events"; - -export class ExtensionHostIPCHandler { - private extensionHandler: ExtensionHandler; - private mainRequestHandler: MainRequestHandler; // private logsPath: string; - - constructor(bus: EventEmitter) { - let extensionPath = ""; - let logsPath = ""; - let installPath = ""; - for (const [index, arg] of process.argv.entries()) { - if (process.argv[index + 1]) { - if (arg === "-extensionPath") { - extensionPath = process.argv[index + 1]; - } - - if (arg === "-logPath") { - logsPath = process.argv[index + 1]; - } - - if (arg === "-installPath") { - installPath = process.argv[index + 1]; - } - } - } - - console.log("extension paths", extensionPath, logsPath, installPath); - - // this.logsPath = logsPath; - this.setupLogger(); - - this.extensionHandler = new ExtensionHandler( - [extensionPath], - logsPath, - installPath, - bus, - ); - this.mainRequestHandler = new MainRequestHandler(this.extensionHandler); - - this.registerListeners(); - this.extensionHandler.startAll(); - } - - private setupLogger() { - const logger = log.getLogger("Extension Host"); - // prefixLogger(this.logsPath, logger); - const logLevel = process.env.DEBUG_LOGGING - ? log.levels.DEBUG - : log.levels.INFO; - logger.setLevel(logLevel); - - console.info = (...args: unknown[]) => { - logger.info(...args); - }; - - console.error = (...args: unknown[]) => { - logger.error(...args); - }; - - console.warn = (...args: unknown[]) => { - logger.warn(...args); - }; - - console.debug = (...args: unknown[]) => { - logger.debug(...args); - }; - - console.trace = (...args: unknown[]) => { - logger.trace(...args); - }; - } - - private isExtensionEvent(key: keyof MoosyncExtensionTemplate) { - return key === "onStarted" || key === "onStopped"; - } - - private isMainRequest(key: string) { - return mainRequestsKeys.includes(key as mainRequests); - } - - private isProviderFetchRequest(key: string) { - return providerExtensionKeys.includes(key as providerFetchRequests); - } - - private registerListeners() { - process.setMaxListeners(11); - - process.on("exit", () => this.mainRequestHandler.killSelf()); - process.on("SIGQUIT", () => this.mainRequestHandler.killSelf()); - process.on("SIGINT", () => this.mainRequestHandler.killSelf()); - process.on("SIGUSR1", () => this.mainRequestHandler.killSelf()); - process.on("SIGUSR2", () => this.mainRequestHandler.killSelf()); - process.on("SIGHUP", () => this.mainRequestHandler.killSelf()); - process.on("uncaughtException", (e) => { - console.error("Asynchronous error caught.", e.message ?? e.toString()); - if (e.message === "Channel closed") { - process.exit(); - } - }); - } - - public async parseMessage(message: extensionHostMessage) { - await this.extensionHandler.initialized; - if (this.isExtensionEvent(message.type as keyof MoosyncExtensionTemplate)) { - this.extensionHandler.sendEvent(message as extensionEventMessage); - return; - } - - if (this.isMainRequest(message.type)) { - return this.mainRequestHandler.parseRequest( - message as mainRequestMessage, - ); - } - - if (this.isProviderFetchRequest(message.type)) { - return this.mainRequestHandler.parseProviderRequest( - message as providerFetchRequestMessage, - ); - } - } -} - -class MainRequestHandler { - public handler: ExtensionHandler; - - constructor(handler: ExtensionHandler) { - this.handler = handler; - } - - public async parseProviderRequest(message: providerFetchRequestMessage) { - return this.handler.handleProviderRequests( - message.type, - message.data.packageName, - ); - } - - public async parseRequest(message: mainRequestMessage) { - console.debug("Received message from main process", message.type); - - if (message.type === "findNewExtensions") { - await this.handler.registerPlugins(); - await this.handler.startAll(); - return; - } - - if (message.type === "getInstalledExtensions") { - return this.handler.getInstalledExtensions(); - } - - if (message.type === "getExtensionIcon") { - return this.handler.getExtensionIcon(message.data.packageName); - } - - if (message.type === "toggleExtensionStatus") { - this.handler.toggleExtStatus( - message.data.packageName, - message.data.enabled as boolean, - ); - return; - } - - if (message.type === "removeExtension") { - return this.handler.removeExt(message.data.packageName); - } - - if (message.type === "stopProcess") { - this.killSelf(message.channel); - return; - } - - if (message.type === "extraExtensionEvents") { - return this.handler.sendExtraEventToExtensions( - message.data as unknown as ExtraExtensionEvents, - ); - } - - if (message.type === "getExtensionContextMenu") { - const items = this.handler.getExtensionContextMenu( - message.data.type as ContextMenuTypes, - ); - return items; - } - - if (message.type === "onClickedContextMenu") { - this.handler.fireContextMenuCallback( - message.data.id as string, - message.data.packageName, - message.data.arg as - | Song - | Artists - | Album - | Song[] - | Playlist - | undefined, - ); - - return; - } - - if (message.type === "set-log-level") { - // setLogLevel(message.data.level as LogLevelDesc); - - return; - } - - if (message.type === "getAccounts") { - const items = this.handler.getExtensionAccounts( - message.data?.packageName, - ); - return items; - } - - if (message.type === "performAccountLogin") { - return this.handler.performExtensionAccountLogin( - message.data.packageName, - message.data.accountId as string, - message.data.loginStatus as boolean, - ); - } - - if (message.type === "getDisplayName") { - const name = this.handler.getDisplayName(message.data.packageName); - return name; - } - } - - public killSelf(_?: string) { - this.handler.stopAllExtensions().then(() => { - // if (channel) this.sendToMain(channel); - process.exit(); - }); - } -} diff --git a/src-extensions/src/types.ts b/src-extensions/src/types.ts deleted file mode 100644 index 985a5c03..00000000 --- a/src-extensions/src/types.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Server, ServiceDefinition } from "@grpc/grpc-js"; - -export interface ExtensionAPIServer extends Server { - GetExtensions(): unknown; -} - -export interface ExtensionAPIGRPC { - extensions: { - ExtensionAPI: { - service: ServiceDefinition; - }; - }; -} diff --git a/src-extensions/src/types/exported.d.ts b/src-extensions/src/types/exported.d.ts deleted file mode 100644 index 9b985f74..00000000 --- a/src-extensions/src/types/exported.d.ts +++ /dev/null @@ -1,1114 +0,0 @@ -interface Album { - album_id?: string; - album_name?: string; - album_coverPath_high?: string; - album_coverPath_low?: string; - album_song_count?: number; - album_artist?: string; - album_extra_info?: { - spotify?: { - album_id?: string; - }; - youtube?: { - album_id?: string; - }; - extensions?: Record | undefined>; - }; - year?: number; -} - -interface Artists { - artist_id: string; - artist_name?: string; - artist_mbid?: string; - artist_coverPath?: string; - artist_song_count?: number; - artist_extra_info?: { - youtube?: { - channel_id?: string; - }; - spotify?: { - artist_id?: string; - }; - extensions?: Record | undefined>; - }; -} - -interface Genre { - genre_id: string; - genre_name: string; - genre_song_count: number; -} - -interface Playlist { - playlist_id: string; - playlist_name: string; - playlist_desc?: string; - playlist_coverPath?: string | undefined; - playlist_song_count?: number; - playlist_path?: string; - icon?: string; - extension?: string; -} - -type PlayerTypes = "LOCAL" | "YOUTUBE" | "SPOTIFY" | "URL" | "DASH" | "HLS"; - -interface Song { - _id: string; - path?: string; - size?: number; - title: string; - song_coverPath_low?: string; - song_coverPath_high?: string; - album?: Album; - artists?: Artists[]; - date?: string; - year?: number | string; - - genre?: Genre[]; - lyrics?: string; - releaseType?: string[]; - bitrate?: number; - codec?: string; - container?: string; - duration: number; - sampleRate?: number; - hash?: string; - inode?: string; - deviceno?: string; - url?: string; - playbackUrl?: string; - date_added: number; - providerExtension?: string; - icon?: string; - type: PlayerTypes; - playCount?: number; - showInLibrary?: boolean; - track_no?: number; -} - -interface SearchableSong { - _id?: string; - path?: string; - title?: string; - url?: string; - playbackUrl?: string; - - // MD5 hash - hash?: string; - - size?: number; - inode?: string; - deviceno?: string; - - type?: PlayerTypes; - - // Will return all songs provided by this extension - extension?: boolean | string; - - showInLibrary?: boolean; -} - -type PlayerState = "PLAYING" | "PAUSED" | "STOPPED" | "LOADING"; - -/** - * Interface representing Queue of tracks - */ -interface SongQueue { - /** - * Data is a dictionary with unique songs. Song here won't be repeated - */ - data: { [id: string]: Song }; - - /** - * Order is an array with songID corresponding to {@link SongQueue#data} - * Items may be repeated - */ - order: { id: string; songID: string }[]; - - /** - * Index of current playing song from {@link SongQueue#order} - */ - index: number; -} - -interface ExtensionData { - extensionDescriptors: ExtensionFactory[]; -} - -interface Checkbox { - key: string; - title: string; - enabled: boolean; -} - -interface PathGroup { - path: string; - enabled: boolean; -} - -interface Buttons { - key: string; - title: string; - lastClicked: number; -} - -type ExtensionPreferenceGroup = { - key: string; - title?: string; - description?: string; - index?: number; -} & ( - | { - type: "CheckboxGroup"; - items: Checkbox[]; - } - | { - type: "EditText"; - /** - * Setting inputType to password will store the value as encrypted. It can be retrieved using getSecure - */ - inputType?: "text" | "number" | "password" | "url"; - default: string; - } - | { - type: "FilePicker"; - default: string; - } - | { - type: "DirectoryGroup"; - default: PathGroup[]; - } - | { - type: "ButtonGroup"; - items: Buttons[]; - } - | { - type: "ProgressBar"; - default: number; - } - | { - type: "TextField"; - default: string; - } - | { - type: "InfoField"; - default: string; - } -); - -interface ExtensionFactory { - /** - * @deprecated - * */ - registerPreferences?(): Promise; - - // Return an instance of the plugin - registerUserPreferences?(): Promise; - - /** - * This method is necessary for the extension to be loaded into moosync - */ - create(): Promise; -} - -/** - * Interface defining Moosync extension lifecycle hooks - */ -interface MoosyncExtensionTemplate { - /** - * Method fired when the extension is started - */ - onStarted?(): Promise; - - /** - * Method fired when the extension is stopped - */ - onStopped?(): Promise; -} - -/** - * Sort by key in Song. - * If asc is true then results will be sorted in ascending otherwise descending - */ -type SongSortOptions = { type: keyof Song; asc: boolean }; - -/** - * Options for searching songs from Database - * To search for all tracks with a specific term, surround the term with %. - * Eg. if the term is 'aaa', to get all songs containing 'aaa' in the title, - * put the term as '%aaa%' in 'song.title'. - */ -interface SongAPIOptions { - /** - * To search tracks by properties in song, specify this property. - */ - song?: SearchableSong; - - /** - * To search tracks by properties in album, specify this property. - */ - album?: Partial; - - /** - * To search tracks by properties in artists, specify this property. - */ - artist?: Partial; - - /** - * To search tracks by properties in genre, specify this property. - */ - genre?: Partial; - - /** - * To search tracks by properties in playlist, specify this property. - */ - playlist?: Partial; - - /** - * To sort the results, specify this property - */ - sortBy?: SongSortOptions | SongSortOptions[]; - - /** - * If false, then the exact match of all options will be provided. - * If true, then even if a track matches one of the options, it will be returned. - * In terms of SQL, true will add 'AND' between where queries and false will add 'OR'. - * - * Eg. If song.title is 'aaa' and album.album_name is 'bbb' - * - * In this scenario if inclusive is true, then all tracks having title as 'aaa' - * AND album_name as 'bbb' will be returned - * - * If inclusive is false then songs having title as 'aaa' OR album_name as 'bbb' will be returned - * - * False by default - */ - inclusive?: boolean; - - /** - * If true, then inverts the query. It will return all records which don't match the search criteria - * If false, then it will return all records which match the search criteria - * - * false by default - */ - invert?: boolean; -} - -/** - * Options for searching entities like Albums, Artists, Playlists or Genre - * - */ -type EntityApiOptions = { - /** - * If false, then the exact match of all options will be provided. - * If true, then even if an entity matches one of the options, it will be returned. - * In terms of SQL, true will add 'AND' between where queries and false will add 'OR'. - * - * Eg. If album.album_name is 'aaa' and album.album_id is 'bbb' - * - * In this scenario if inclusive is false, then all albums having album_name as 'aaa' - * AND album_id as 'bbb' will be returned - * - * If inclusive is false then albums having album_name as 'aaa' OR album_id as 'bbb' will be returned - */ - inclusive?: boolean; - - /** - * If true, then inverts the query. It will return all records which don't match the search criteria - * If false, then it will return all records which match the search criteria - * - * false by default - */ - invert?: boolean; -} & (T extends Artists - ? { - artist: Partial | boolean; - } - : T extends Album - ? { - album: Partial | boolean; - } - : T extends Genre - ? { - genre: Partial | boolean; - } - : T extends Playlist - ? { - playlist: Partial | boolean; - } - : Record); - -/** - * Methods to control the audio player in Moosync - */ -interface playerControls { - /** - * Start playing the loaded track - */ - play(): Promise; - - /** - * Pause the track - */ - pause(): Promise; - - /** - * Unload the audio from player - */ - stop(): Promise; - - /** - * Stop current track and load next track in queue - */ - nextSong(): Promise; - - /** - * Stop current track and load previous track in queue - */ - prevSong(): Promise; -} - -type ExtraExtensionEventTypes = - | "requestedPlaylists" - | "requestedPlaylistSongs" - | "oauthCallback" - | "songQueueChanged" - | "seeked" - | "volumeChanged" - | "playerStateChanged" - | "songChanged" - | "preferenceChanged" - | "playbackDetailsRequested" - | "customRequest" - | "requestedSongFromURL" - | "requestedPlaylistFromURL" - | "requestedSearchResult" - | "requestedRecommendations" - | "requestedLyrics" - | "requestedArtistSongs" - | "requestedAlbumSongs" - | "songAdded" - | "songRemoved" - | "playlistAdded" - | "playlistRemoved" - | "requestedSongFromId" - | "getRemoteURL"; - -type ExtraExtensionEventReturnType = - | (T extends "requestedPlaylists" - ? PlaylistReturnType - : T extends - | "requestedPlaylistSongs" - | "requestedArtistSongs" - | "requestedAlbumSongs" - ? SongsWithPageTokenReturnType | ForwardRequestReturnType - : T extends "playbackDetailsRequested" - ? PlaybackDetailsReturnType | ForwardRequestReturnType - : T extends "customRequest" - ? CustomRequestReturnType - : T extends "requestedSongFromURL" | "requestedSongFromId" - ? SongReturnType | ForwardRequestReturnType - : T extends "requestedPlaylistFromURL" - ? PlaylistAndSongsReturnType | ForwardRequestReturnType - : T extends "requestedSearchResult" - ? SearchReturnType | ForwardRequestReturnType - : T extends "requestedRecommendations" - ? RecommendationsReturnType | ForwardRequestReturnType - : T extends "requestedLyrics" | "getRemoteURL" - ? string | ForwardRequestReturnType - : void) - | void; - -type ExtraExtensionEventData = - T extends "requestedPlaylistSongs" - ? [ - playlistID: string, - invalidateCache: boolean, - nextPageToken: unknown | undefined, - ] - : T extends "requestedPlaylists" - ? [invalidateCache: boolean] - : T extends "oauthCallback" - ? [url: string] - : T extends "songQueueChanged" - ? [songQueue: SongQueue] - : T extends "seeked" - ? [newTime: number] - : T extends "volumeChanged" - ? [newVolume: number] - : T extends "playerStateChanged" - ? [newState: PlayerState] - : T extends "songChanged" - ? [song: Song] - : T extends "preferenceChanged" - ? [preference: { key: string; value: unknown }] - : T extends "playbackDetailsRequested" - ? [song: Song] - : T extends "customRequest" - ? [url: string] - : T extends "requestedSongFromURL" - ? [url: string, invalidateCache: boolean] - : T extends "requestedPlaylistFromURL" - ? [url: string, invalidateCache: boolean] - : T extends "requestedSearchResult" - ? [term: string] - : T extends "requestedLyrics" - ? [song: Song] - : T extends "requestedArtistSongs" - ? [ - artist: Artists, - nextPageToken: unknown | undefined, - ] - : T extends "requestedAlbumSongs" - ? [ - album: Album, - nextPageToken: unknown | undefined, - ] - : T extends "songAdded" | "songRemoved" - ? [songs: Song[]] - : T extends - | "playlistAdded" - | "playlistRemoved" - ? [playlists: Playlist[]] - : T extends "requestedSongFromId" - ? [id: string] - : T extends "getRemoteURL" - ? [song: Song] - : never[]; - -type PlaylistReturnType = { - playlists: Playlist[]; -}; - -type SongsReturnType = { - songs: Song[]; -}; - -type SongsWithPageTokenReturnType = { - songs: Song[]; - nextPageToken?: unknown; -}; - -type SearchReturnType = { - songs: Song[]; - playlists: Playlist[]; - artists: Artists[]; - albums: Album[]; -}; - -type PlaybackDetailsReturnType = { - duration: number; - url: string; -}; - -type CustomRequestReturnType = { - mimeType?: string; - data?: Buffer; - redirectUrl?: string; -}; - -type SongReturnType = { - song: Song; -}; - -type PlaylistAndSongsReturnType = { - playlist: Playlist; - songs: Song[]; -}; - -type RecommendationsReturnType = { - songs: Song[]; -}; - -type ExtensionContextMenuItem = { - type: T; - label: string; - disabled?: boolean; - children?: ExtensionContextMenuItem[]; - handler?: (arg: ExtensionContextMenuHandlerArgs) => void; -}; - -type ForwardRequestReturnType = { - forwardTo: "youtube" | "spotify" | string; - transformedData?: ExtraExtensionEventData; -}; - -type ContextMenuTypes = - | "SONGS" - | "GENERAL_SONGS" - | "PLAYLIST" - | "GENERAL_PLAYLIST" - | "PLAYLIST_CONTENT" - | "QUEUE_ITEM" - | "ARTIST" - | "ALBUM" - | "CURRENT_SONG"; - -type ExtensionContextMenuHandlerArgs = - T extends "SONGS" - ? Song[] - : T extends "PLAYLIST" - ? Playlist - : T extends "PLAYLIST_CONTENT" - ? Song[] - : T extends "QUEUE_ITEM" - ? Song - : T extends "ARTIST" - ? Artists - : T extends "ALBUM" - ? Album - : T extends "CURRENT_SONG" - ? Song - : undefined; - -type AccountDetails = { - id: string; - packageName: string; - name: string; - bgColor: string; - icon: string; - loggedIn: boolean; - signinCallback: () => Promise | void; - signoutCallback: () => Promise | void; - username?: string; -}; - -type LoginModalOptions = { - providerName: string; - providerColor: string; - text?: string; - url?: string; -} & ( - | { - manualClick: true; - oauthPath: string; - } - | { - manualClick?: false; - oauthPath?: string; - } -); - -interface utils { - /** - * Helper function that returns extra info stored by this extension only - */ - getArtistExtraInfo(artist: Artists): Record | undefined; - - /** - * Helper function that returns extra info stored by this extension only - */ - getAlbumExtraInfo(album: Album): Record | undefined; - - readonly packageName: string; - readonly customRequestBaseUrl: string; -} - -interface extensionAPI { - utils: utils; - - /** - * Get songs from database filtered by provided options - * @param options filter the results - */ - getSongs(options: SongAPIOptions): Promise; - - /** - * Get entities such as playlists, artists, albums, genres from database by provided options - * @param options filter the results - */ - getEntity( - options: EntityApiOptions, - ): Promise; - - /** - * Get the current playing track. Undefined if no track is playing - */ - getCurrentSong(): Promise; - - /** - * Get state of music player. Undefined is player is broken and audio can't be loaded - */ - getPlayerState(): Promise; - - /** - * Get volume directly from the audio player - */ - getVolume(): Promise; - - /** - * Get current time of the player. - */ - getTime(): Promise; - - /** - * Get the queue of tracks - */ - getQueue(): Promise; - - /** - * Fetch preferences by key. If no key is provided, all preferences - * co-relating to current extension will be fetched. - * - * @param key key of preference to fetch. keys within complex objects can be separated by . - * @param defaultValue If the provided key is not found, then default value will be returned. - */ - getPreferences( - key?: string, - defaultValue?: unknown, - ): Promise; - - /** - * Set preference by key. - * @param key key separated by '.' - * @param value value to be stored for corresponding key - */ - setPreferences(key: string, value: unknown): Promise; - - /** - * Get decrypted value of an encrypted preference - * @param key key of preference to fetch. keys within complex objects can be separated by . - * @param defaultValue If the provided key is not found, then default value will be returned. - */ - getSecure(key: string, defaultValue?: unknown): Promise; - - /** - * Encrypt value and store in preferences - * @param key key separated by '.' - * @param value value to be stored for corresponding key - */ - setSecure(key: string, value: unknown): Promise; - - /** - * Add songs to library - * @param songs 1 or more songs that are to be added to library - * @returns array of booleans with same index as song. True means song has been added successfully - */ - addSongs(...songs: Song[]): Promise<(Song | undefined)[] | undefined>; - - /** - * Update song in library by ID - * @param song song to update - */ - updateSong(song: Song): Promise; - - /** - * @deprecated pass song instead of song_id - * Remove song from library - * @param song_id id of song to remove - */ - removeSong(song_id: string): Promise; - - /** - * Remove song from library - * @param song song to remove - */ - removeSong(song: Song): Promise; - - /** - * Add playlist to library - * @param playlist details of playlist which is to be added to library - * @returns ID of playlist which has been added - */ - addPlaylist(playlist: Omit): Promise; - - /** - * Add songs to playlist in library. The song must also exist in the library - * @param playlistID ID of playlist in which songs are to be added - * @param songs Songs which are to be added in the playlist - */ - addSongsToPlaylist(playlistID: string, ...songs: Song[]): Promise; - - /** - * Register a callback for Oauth on given path. This OAuth can be triggered by calling the url - * moosync://{path} - * If the path matches, the whole URL is passed to this extension. - * @param path path on which the callback will be triggered - */ - registerOAuth(path: string): Promise; - - /** - * Open a url in system browser - * @param url string corresponding to URL which is to be opened - */ - openExternalURL(url: string): Promise; - - /** - * Event fired when playlists are requested by the user - * The callback should return and result playlists or undefined - */ - on( - eventName: "requestedPlaylists", - callback: (invalidateCache: boolean) => Promise, - ): void; - - /** - * Event fired when songs of a single playlist are requested by the user - * The callback should return result songs or undefined - */ - on( - eventName: "requestedPlaylistSongs", - callback: ( - playlistID: string, - invalidateCache: boolean, - nextPageToken?: unknown, - ) => Promise< - | SongsWithPageTokenReturnType - | ForwardRequestReturnType<"requestedPlaylistSongs"> - | void - >, - ): void; - - /** - * Event fired when moosync is passed url containing registered oauth channel name - * Oauth channel should be registered using {@link registerOAuth} - */ - on( - eventName: "oauthCallback", - callback: (url: string) => Promise, - ): void; - - /** - * Event fired when song queue changes order or new song is added or removed - */ - on( - eventName: "songQueueChanged", - callback: (songQueue: SongQueue) => Promise, - ): void; - - /** - * Event fired when user seeks player manually - */ - on(eventName: "seeked", callback: (newTime: number) => Promise): void; - - /** - * Event fired when user changes volume - */ - on( - eventName: "volumeChanged", - callback: (newVolume: number) => Promise, - ): void; - - /** - * Event fired when player changes state to / from paused, stopped, playing, loading - */ - on( - eventName: "playerStateChanged", - callback: (newState: PlayerState) => Promise, - ): void; - - /** - * Event fired when new song is loaded into player - */ - on(eventName: "songChanged", callback: (song: Song) => Promise): void; - - /** - * Event fired when preferences corresponding to the extension are changed - */ - on( - eventName: "preferenceChanged", - callback: (preference: { key: string; value: unknown }) => Promise, - ): void; - - /** - * Event fired when song provided by the extension lacks {@link Song.playbackUrl} or {@link Song.duration} - * Callback should return both playbackUrl and duration even if only either is missing or undefined. - * - * Can be used to dynamically provide playbackUrl and/or duration - */ - on( - eventName: "playbackDetailsRequested", - callback: ( - song: Song, - ) => Promise< - | PlaybackDetailsReturnType - | ForwardRequestReturnType<"playbackDetailsRequested"> - | void - >, - ): void; - - /** - * Event fired when custom url corresponding to the extension is called - * Callback should return data as buffer and mimetype for the same or undefined - * - * if an url ```extension://moosync.extension.packageName/testData``` is provided to Moosync. When the url is fetched, - * this event will be triggered and custom data can be provided at runtime - * - * @example - * const song: Song = { - * ..., - * song_coverPath_high: 'extension://moosync.extension.packageName/coverPathUrl', - * ... - * playbackUrl: 'extension://moosync.extension.packageName/testData' - * } - */ - on( - eventName: "customRequest", - callback: (url: string) => Promise, - ): void; - - /** - * Event fired when user enters url in 'Add song from URL' modal - * Callback should return parsed song or undefined - */ - on( - eventName: "requestedSongFromURL", - callback: ( - url: string, - ) => Promise< - SongReturnType | ForwardRequestReturnType<"requestedSongFromURL"> | void - >, - ): void; - - /** - * Event fired when user enters url in 'Add playlist from URL' modal - * Callback should return a playlist and parsed songs in that playlist or undefined - */ - on( - eventName: "requestedPlaylistFromURL", - callback: ( - url: string, - ) => Promise< - | PlaylistAndSongsReturnType - | ForwardRequestReturnType<"requestedPlaylistFromURL"> - | void - >, - ): void; - - /** - * Event fired when user searches a term in search page - * Callback should return a providerName and result songs or undefined - */ - on( - eventName: "requestedSearchResult", - callback: ( - term: string, - ) => Promise< - | SearchReturnType - | ForwardRequestReturnType<"requestedSearchResult"> - | void - >, - ): void; - - /** - * Event fired when user opens Explore page - * Callback should return a providerName and result songs or undefined - */ - on( - eventName: "requestedRecommendations", - callback: () => Promise< - | RecommendationsReturnType - | ForwardRequestReturnType<"requestedRecommendations"> - | void - >, - ): void; - - /** - * Event fired when lyrics are requested for a song - * Callback should return a string (HTML formatting) with lyrics or undefined - */ - on( - eventName: "requestedLyrics", - callback: ( - song: Song, - ) => Promise | void>, - ): void; - - /** - * Event fired when songs by a particular artist are requested - * Callback should return parsed songs or undefined - */ - on( - eventName: "requestedArtistSongs", - callback: ( - artist: Artists, - nextPageToken?: unknown, - ) => Promise< - | SongsWithPageTokenReturnType - | ForwardRequestReturnType<"requestedArtistSongs"> - | void - >, - ): void; - - /** - * Event fired when songs by a particular album are requested - * Callback should return parsed songs or undefined - */ - on( - eventName: "requestedAlbumSongs", - callback: ( - album: Album, - nextPageToken?: unknown, - ) => Promise< - | SongsWithPageTokenReturnType - | ForwardRequestReturnType<"requestedAlbumSongs"> - | void - >, - ): void; - - /** - * Event fired when the app only has id for the song but requires complete details - * Callback should return parsed song or undefined - */ - on( - eventName: "requestedSongFromId", - callback: ( - url: string, - ) => Promise< - SongReturnType | ForwardRequestReturnType<"requestedSongFromId"> | void - >, - ): void; - - /** - * Event fired when songs are added to library - */ - on(eventName: "songAdded", callback: (songs: Song[]) => Promise): void; - - /** - * Event fired when songs are removed from library - */ - on( - eventName: "songRemoved", - callback: (songs: Song[]) => Promise, - ): void; - - /** - * Event fired when playlist is added to library - */ - on( - eventName: "playlistAdded", - callback: (playlist: Playlist[]) => Promise, - ): void; - - /** - * Event fired when playlist is removed from library - */ - on( - eventName: "playlistRemoved", - callback: (songs: Playlist[]) => Promise, - ): void; - - /** - * Remove callbacks from extra events - * @param eventName name of event whose callback is to be removed - */ - off(eventName: T): void; - - /** - * Adds new context menu item/s - * @param item New menu item to show in context menu - */ - setContextMenuItem( - ...item: ExtensionContextMenuItem[] - ): void; - - /** - * Remove an item from context menu - * @param index index of context menu item which is to be removed - */ - removeContextMenuItem(index: number): void; - - /** - * Get all registered context menu items - */ - getContextMenuItems(): ExtensionContextMenuItem[]; - - /** - * Add an account to show in accounts section in main app. - * The user will then be able to perform login / logout operations on this account - * and also view its details - * - * @param name name of service provider - * @param bgColor background color to use for account card (in hex format. Eg. #000000) - * @param icon icon of account (preferably service provider's icon) - * @param signinCallback callback fired when user wishes to login - * @param signoutCallback callback fired when user wishes to logout - * @returns generated accountId - */ - registerAccount( - name: string, - bgColor: string, - icon: string, - signinCallback: AccountDetails["signinCallback"], - signoutCallback: AccountDetails["signoutCallback"], - ): Promise; - - /** - * Change login status and signed in user's account name. - * - * @param id accountId to change details of. Returned from {@link registerAccount} - * @param loggedIn true if user is logged in otherwise false - * @param accountName name of user's account if logged in otherwise undefined - */ - changeAccountAuthStatus( - id: string, - loggedIn: boolean, - username?: string, - ): Promise; - - /** - * Open login modal. Show the modal if the extension demands the user to open a linux - * to fulfill OAuth requirements. - * - * The modal also allows the user to manually enter a token or manually click a button when - * the task is fulfilled - * - * @param options options to control the oauth modal - */ - openLoginModal(options: LoginModalOptions): Promise; - - /** - * Close login modal if its open - */ - closeLoginModal(): Promise; - - /** - * Show toast on top-right of screen - * @param message message to show in toast - * @param duration duration of toast in milliseconds. Maximum 5000ms - * @param type type of toast. Usually denotes color - */ - showToast( - message: string, - duration?: number, - type?: "success" | "info" | "error" | "default", - ); - - /** - * Set extra info for an artist. This info is editable by the user using "Show info" context menu - * option on artist - * @param object Key-value pairs of editable info - */ - setArtistEditableInfo( - artist_id: string, - object: Record, - ): Promise; - - /** - * Set extra info for an album. This info is editable by the user using "Show info" context menu - * option on album - * @param object Key-value pairs of editable info - */ - setAlbumEditableInfo( - artist_id: string, - object: Record, - ): Promise; - - /** - * Returns a list of package names of all installed extensions - */ - getInstalledExtensions(): string[]; - - addUserPreference(pref: ExtensionPreferenceGroup): void; - removeUserPreference(key: string): void; - - /** - * Object containing controls for player - */ - player: playerControls; -} - -declare global { - const api: extensionAPI; -} diff --git a/src-extensions/src/types/sandbox.d.ts b/src-extensions/src/types/sandbox.d.ts deleted file mode 100644 index 88dd0045..00000000 --- a/src-extensions/src/types/sandbox.d.ts +++ /dev/null @@ -1,193 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -/* - * sandbox.d.ts is a part of Moosync. - * - * Copyright 2022 by Sahil Gupte . All rights reserved. - * Licensed under the GNU General Public License. - * - * See LICENSE in the project root for license information. - */ - -type GithubRepoResponse = { - sha: string; - url: string; - tree: { - path: string; - mode: string; - type: "blob" | "tree"; - sha: string; - url: string; - }[]; -}; - -type FetchedExtensionManifest = { - name: string; - packageName: string; - logo: string; - description: string; - url: string; - release: { - type: "github-release" | "url"; - url: string; - version: string; - }; -}; - -type ExtInstallStatus = { - packageName: string; - status: string; - error?: unknown; - progress: number; -}; - -type extensionEventMessage = { - type: keyof MoosyncExtensionTemplate; - data: unknown; - packageName?: string; -}; - -type extensionRequestMessage = { - type: import("../constants").extensionRequests; - channel: string; - data: unknown; - extensionName: string; -}; - -type extensionUIRequestMessage = { - type: import("../constants").extensionUIRequests; - channel: string; - data: unknown; - extensionName: string; -}; - -type extensionReplyMessage = extensionRequestMessage; - -type extensionHostMessage = - | extensionEventMessage - | mainRequestMessage - | providerFetchRequestMessage; - -type mainRequestMessage = { - type: import("../constants").mainRequests; - channel: string; - data: { - packageName: string; - } & Record; -}; - -type providerFetchRequestMessage = { - type: import("../constants").providerFetchRequests; - channel: string; - data: { - packageName: string; - } & Record; -}; - -type mainReplyMessage = mainRequestMessage; - -type mainHostMessage = - | mainReplyMessage - | extensionRequestMessage - | { - type: "getInstalledExtensions"; - data: ExtensionDetails[]; - }; - -interface installMessage { - success: boolean; - message?: string; -} - -interface ExtensionDetails { - name: string; - packageName: string; - desc: string; - author: string; - version: string; - hasStarted: boolean; - entry: string; - preferences: ExtensionPreferenceGroup[]; - extensionPath: string; - extensionIcon: string | undefined; -} - -type ExtraExtensionEventCombinedReturnType = - { - [key: string]: ExtraExtensionEventReturnType; - }; - -interface ExtraExtensionEvents { - type: T; - data: ExtraExtensionEventData; - packageName?: string; -} - -interface ExtendedExtensionAPI extends extensionAPI { - _emit: ( - event: ExtraExtensionEvents, - ) => Promise | undefined>; - _getContextMenuItems: () => ExtendedExtensionContextMenuItems[]; - _getAccountDetails: () => AccountDetails[]; - _isEventCallbackRegistered: (key: ExtraExtensionEventTypes) => boolean; -} - -interface ExtensionItem extends ExtensionDetails { - instance: MoosyncExtensionTemplate; - preferences: ExtensionPreferenceGroup[]; - vm: import("vm2").NodeVM; - global: { - api: ExtendedExtensionAPI; - }; -} - -interface UnInitializedExtensionItem { - name: string; - packageName: string; - desc: string; - author: string; - version: string; - entry: string; - extensionPath: string; - extensionIcon: string | undefined; -} - -interface getExtensionOptions { - started?: boolean; - packageName?: string; -} - -interface ExtendedExtensionContextMenuItems - extends Omit, "children"> { - id: string; - packageName: string; - children?: ExtendedExtensionContextMenuItems[]; -} - -interface ExtensionCommunicator { - extensionRetriever: ( - options?: getExtensionOptions, - ) => Iterable; - addPreference: ( - packageName: string, - preference: ExtensionPreferenceGroup, - ) => void; - removePreference: (packageName: string, key: string) => void; -} - -interface NodeRequire { - ( - dependencies: string[], - callback: (...args: unknown[]) => unknown, - errorback?: (err: unknown) => void, - ): unknown; - config(data: unknown): unknown; - onError: (err: Error) => void; - __$__nodeRequire(moduleName: string): T; - getStats(): ReadonlyArray; - hasDependencyCycle(): boolean; - define( - amdModuleId: string, - dependencies: string[], - callback: (...args: unknown[]) => unknown, - ): unknown; -} diff --git a/src-extensions/tsconfig.json b/src-extensions/tsconfig.json deleted file mode 100644 index 55311b8b..00000000 --- a/src-extensions/tsconfig.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "compilerOptions": { - "target": "es2022", - "module": "CommonJS", - "lib": [ - "ES2022" - ], - "moduleResolution": "Node", - "rootDir": ".", - "outDir": "build", - "allowSyntheticDefaultImports": true, - "importHelpers": true, - "alwaysStrict": true, - "sourceMap": true, - "forceConsistentCasingInFileNames": true, - "noFallthroughCasesInSwitch": true, - "noImplicitReturns": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noImplicitAny": false, - "noImplicitThis": false, - "strictNullChecks": false, - "typeRoots": [ - "src/types" - ] - }, - "include": [ - "src/**/*.ts", - "__tests__/**/*" - ] -} \ No newline at end of file diff --git a/src-extensions/webpack.config.js b/src-extensions/webpack.config.js deleted file mode 100644 index 39c27f3b..00000000 --- a/src-extensions/webpack.config.js +++ /dev/null @@ -1,29 +0,0 @@ -const path = require("node:path"); - -module.exports = { - entry: "./src/index.ts", - mode: "development", - target: "node", - module: { - parser: { - javascript: { - commonjsMagicComments: true, - }, - }, - rules: [ - { - test: /\.tsx?$/, - use: "ts-loader", - exclude: /node_modules/, - }, - ], - }, - resolve: { - extensions: [".tsx", ".ts", ".js"], - }, - output: { - filename: "main.js", - path: path.resolve(__dirname, "dist"), - // libraryTarget: "commonjs2", - }, -}; diff --git a/src-extensions/yarn.lock b/src-extensions/yarn.lock deleted file mode 100644 index cf8ec09f..00000000 --- a/src-extensions/yarn.lock +++ /dev/null @@ -1,1463 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@discoveryjs/json-ext@^0.5.0": - version "0.5.7" - resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" - integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== - -"@grpc/grpc-js@^1.10.1": - version "1.10.1" - resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.10.1.tgz#be450560c990c08274bc19d514e181ea205ccaa8" - integrity sha512-55ONqFytZExfOIjF1RjXPcVmT/jJqFzbbDqxK9jmRV4nxiYWtL9hENSW1Jfx0SdZfrvoqd44YJ/GJTqfRrawSQ== - dependencies: - "@grpc/proto-loader" "^0.7.8" - "@types/node" ">=12.12.47" - -"@grpc/proto-loader@^0.7.10", "@grpc/proto-loader@^0.7.8": - version "0.7.10" - resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.7.10.tgz#6bf26742b1b54d0a473067743da5d3189d06d720" - integrity sha512-CAqDfoaQ8ykFd9zqBDn4k6iWT9loLAlc2ETmDFS9JCD70gDcnA4L3AFEo2iV7KyAtAAHFW9ftq1Fz+Vsgq80RQ== - dependencies: - lodash.camelcase "^4.3.0" - long "^5.0.0" - protobufjs "^7.2.4" - yargs "^17.7.2" - -"@jridgewell/gen-mapping@^0.3.0": - 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/source-map@^0.3.3": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.5.tgz#a3bb4d5c6825aab0d281268f47f6ad5853431e91" - integrity sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ== - dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": - version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== - -"@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.9": - 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" - -"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" - integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== - -"@protobufjs/base64@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" - integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== - -"@protobufjs/codegen@^2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" - integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== - -"@protobufjs/eventemitter@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" - integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== - -"@protobufjs/fetch@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" - integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== - dependencies: - "@protobufjs/aspromise" "^1.1.1" - "@protobufjs/inquire" "^1.1.0" - -"@protobufjs/float@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" - integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== - -"@protobufjs/inquire@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" - integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== - -"@protobufjs/path@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" - integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== - -"@protobufjs/pool@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" - integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== - -"@protobufjs/utf8@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" - integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== - -"@types/eslint-scope@^3.7.3": - version "3.7.7" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz#3108bd5f18b0cdb277c867b3dd449c9ed7079ac5" - integrity sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg== - dependencies: - "@types/eslint" "*" - "@types/estree" "*" - -"@types/eslint@*": - version "8.56.5" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.56.5.tgz#94b88cab77588fcecdd0771a6d576fa1c0af9d02" - integrity sha512-u5/YPJHo1tvkSF2CE0USEkxon82Z5DBy2xR+qfyYNszpX9qcs4sT6uq2kBbj4BXY1+DBGDPnrhMZV3pKWGNukw== - dependencies: - "@types/estree" "*" - "@types/json-schema" "*" - -"@types/estree@*", "@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/json-schema@*", "@types/json-schema@^7.0.8": - version "7.0.15" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" - integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== - -"@types/node@*", "@types/node@>=12.12.47", "@types/node@>=13.7.0": - version "20.11.25" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.25.tgz#0f50d62f274e54dd7a49f7704cc16bfbcccaf49f" - integrity sha512-TBHyJxk2b7HceLVGFcpAUjsa5zIdsPWlR6XHfyGzd0SFu+/NFgQgMAl96MSDZgQDvJAvV6BKsFOrt6zIL09JDw== - dependencies: - undici-types "~5.26.4" - -"@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.6.tgz#db046555d3c413f8966ca50a95176a0e2c642e24" - integrity sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q== - dependencies: - "@webassemblyjs/helper-numbers" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - -"@webassemblyjs/floating-point-hex-parser@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz#dacbcb95aff135c8260f77fa3b4c5fea600a6431" - integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== - -"@webassemblyjs/helper-api-error@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768" - integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== - -"@webassemblyjs/helper-buffer@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz#b66d73c43e296fd5e88006f18524feb0f2c7c093" - integrity sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA== - -"@webassemblyjs/helper-numbers@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz#cbce5e7e0c1bd32cf4905ae444ef64cea919f1b5" - integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== - dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.11.6" - "@webassemblyjs/helper-api-error" "1.11.6" - "@xtuc/long" "4.2.2" - -"@webassemblyjs/helper-wasm-bytecode@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9" - integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== - -"@webassemblyjs/helper-wasm-section@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz#ff97f3863c55ee7f580fd5c41a381e9def4aa577" - integrity sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-buffer" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/wasm-gen" "1.11.6" - -"@webassemblyjs/ieee754@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz#bb665c91d0b14fffceb0e38298c329af043c6e3a" - integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== - dependencies: - "@xtuc/ieee754" "^1.2.0" - -"@webassemblyjs/leb128@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz#70e60e5e82f9ac81118bc25381a0b283893240d7" - integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== - dependencies: - "@xtuc/long" "4.2.2" - -"@webassemblyjs/utf8@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz#90f8bc34c561595fe156603be7253cdbcd0fab5a" - integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== - -"@webassemblyjs/wasm-edit@^1.11.5": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz#c72fa8220524c9b416249f3d94c2958dfe70ceab" - integrity sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-buffer" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/helper-wasm-section" "1.11.6" - "@webassemblyjs/wasm-gen" "1.11.6" - "@webassemblyjs/wasm-opt" "1.11.6" - "@webassemblyjs/wasm-parser" "1.11.6" - "@webassemblyjs/wast-printer" "1.11.6" - -"@webassemblyjs/wasm-gen@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz#fb5283e0e8b4551cc4e9c3c0d7184a65faf7c268" - integrity sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/ieee754" "1.11.6" - "@webassemblyjs/leb128" "1.11.6" - "@webassemblyjs/utf8" "1.11.6" - -"@webassemblyjs/wasm-opt@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz#d9a22d651248422ca498b09aa3232a81041487c2" - integrity sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-buffer" "1.11.6" - "@webassemblyjs/wasm-gen" "1.11.6" - "@webassemblyjs/wasm-parser" "1.11.6" - -"@webassemblyjs/wasm-parser@1.11.6", "@webassemblyjs/wasm-parser@^1.11.5": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz#bb85378c527df824004812bbdb784eea539174a1" - integrity sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-api-error" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/ieee754" "1.11.6" - "@webassemblyjs/leb128" "1.11.6" - "@webassemblyjs/utf8" "1.11.6" - -"@webassemblyjs/wast-printer@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz#a7bf8dd7e362aeb1668ff43f35cb849f188eff20" - integrity sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@xtuc/long" "4.2.2" - -"@webpack-cli/configtest@^2.1.1": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-2.1.1.tgz#3b2f852e91dac6e3b85fb2a314fb8bef46d94646" - integrity sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw== - -"@webpack-cli/info@^2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-2.0.2.tgz#cc3fbf22efeb88ff62310cf885c5b09f44ae0fdd" - integrity sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A== - -"@webpack-cli/serve@^2.0.5": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-2.0.5.tgz#325db42395cd49fe6c14057f9a900e427df8810e" - integrity sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ== - -"@xtuc/ieee754@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" - integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== - -"@xtuc/long@4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" - integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== - -"@yarnpkg/lockfile@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" - integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== - -acorn-import-assertions@^1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz#507276249d684797c84e0734ef84860334cfb1ac" - integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA== - -acorn-walk@^8.2.0: - version "8.3.2" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.2.tgz#7703af9415f1b6db9315d6895503862e231d34aa" - integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== - -acorn@^8.7.0, acorn@^8.7.1, acorn@^8.8.2: - version "8.11.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" - integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== - -ajv-keywords@^3.5.2: - version "3.5.2" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" - integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== - -ajv@^6.12.5: - 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-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" - -async-mutex@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/async-mutex/-/async-mutex-0.5.0.tgz#353c69a0b9e75250971a64ac203b0ebfddd75482" - integrity sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA== - dependencies: - tslib "^2.4.0" - -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== - -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== - -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" - -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" - -browserslist@^4.21.10: - version "4.23.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" - integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== - dependencies: - caniuse-lite "^1.0.30001587" - electron-to-chromium "^1.4.668" - node-releases "^2.0.14" - update-browserslist-db "^1.0.13" - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -call-bind@^1.0.5: - 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" - -caniuse-lite@^1.0.30001587: - version "1.0.30001596" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001596.tgz#da06b79c3d9c3d9958eb307aa832ac68ead79bee" - integrity sha512-zpkZ+kEr6We7w63ORkoJ2pOfBwBkY/bJrG/UZ90qNb45Isblu8wzDgevEOrRL1r9dWayHjYiiyCMEXPn4DweGQ== - -chalk@^4.1.0, 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" - -chrome-trace-event@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" - integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== - -ci-info@^3.7.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" - integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== - -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-deep@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" - integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== - dependencies: - is-plain-object "^2.0.4" - kind-of "^6.0.2" - shallow-clone "^3.0.0" - -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.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== - -colorette@^2.0.14: - version "2.0.20" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" - integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== - -commander@^10.0.1: - version "10.0.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" - integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== - -commander@^2.20.0: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -commander@^9.4.0: - version "9.5.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-9.5.0.tgz#bc08d1eb5cedf7ccb797a96199d41c7bc3e60d30" - integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ== - -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== - -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" - -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" - -electron-to-chromium@^1.4.668: - version "1.4.698" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.698.tgz#0b3992ad3b572b646ce3f22e0145eab4abc559a7" - integrity sha512-f9iZD1t3CLy1AS6vzM5EKGa6p9pRcOeEFXRFbaG2Ta+Oe7MkfRQ3fsvPYidzHe1h4i0JvIvpcY55C+B6BZNGtQ== - -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== - -enhanced-resolve@^5.0.0, enhanced-resolve@^5.15.0: - version "5.15.1" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.1.tgz#384391e025f099e67b4b00bfd7f0906a408214e1" - integrity sha512-3d3JRbwsCLJsYgvb6NuWEG44jjPSOMuS73L/6+7BZuoKm3W+qXnSoIYVHi8dG7Qcg4inAY4jbzkZ7MnskePeDg== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - -envinfo@^7.7.3: - version "7.11.1" - resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.11.1.tgz#2ffef77591057081b0129a8fd8cf6118da1b94e1" - integrity sha512-8PiZgZNIB4q/Lw4AhOvAfB/ityHAd2bli3lESSWmWSzSsl5dKpy5N1d1Rfkd2teq/g9xN90lc6o98DOjMeYHpg== - -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.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-module-lexer@^1.2.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.4.1.tgz#41ea21b43908fe6a287ffcbe4300f790555331f5" - integrity sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w== - -escalade@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" - integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== - -eslint-scope@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -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@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -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== - -events@^3.2.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - -fast-deep-equal@^3.1.1: - 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-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== - -fastest-levenshtein@^1.0.12: - version "1.0.16" - resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" - integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== - -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-up@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -find-yarn-workspace-root@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz#f47fb8d239c900eb78179aa81b66673eac88f7bd" - integrity sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ== - dependencies: - micromatch "^4.0.2" - -flat@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" - integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== - -fs-extra@^9.0.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.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.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - -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.1.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" - -glob-to-regexp@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" - integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== - -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" - -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.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.9: - 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== - -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.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: - 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.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -hasown@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.1.tgz#26f48f039de2c0f8d3356c223fb8d50253519faa" - integrity sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA== - dependencies: - function-bind "^1.1.2" - -import-local@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" - integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" - -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== - -interpret@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-3.1.1.tgz#5be0ceed67ca79c6c4bc5cf0d7ee843dcea110c4" - integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ== - -is-core-module@^2.13.0: - version "2.13.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" - integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== - dependencies: - hasown "^2.0.0" - -is-docker@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" - integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== - -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-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-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-wsl@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== - dependencies: - is-docker "^2.0.0" - -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== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== - -jest-worker@^27.4.5: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" - integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -json-parse-even-better-errors@^2.3.1: - 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-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@^1.0.2: - version "1.1.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.1.1.tgz#52d4361b47d49168bcc4e564189a42e5a7439454" - integrity sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg== - dependencies: - call-bind "^1.0.5" - isarray "^2.0.5" - jsonify "^0.0.1" - object-keys "^1.1.1" - -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" - -jsonify@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.1.tgz#2aa3111dae3d34a0f151c63f3a45d995d9420978" - integrity sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg== - -kind-of@^6.0.2: - version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -klaw-sync@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c" - integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ== - dependencies: - graceful-fs "^4.1.11" - -loader-runner@^4.2.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" - integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -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== - -loglevel@^1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.9.1.tgz#d63976ac9bcd03c7c873116d41c2a85bafff1be7" - integrity sha512-hP3I3kCrDIMuRwAwHltphhDM1r8i55H33GgqjXbrisuJhF4kRhW1dNuxsRklp4bXl8DSdLaNLuiL4A/LWRfxvg== - -long@^5.0.0: - version "5.2.3" - resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1" - integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q== - -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" - -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== - -micromatch@^4.0.0, micromatch@^4.0.2: - 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-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.27: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -minimatch@^3.1.1: - 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" - -minimist@^1.2.6: - version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -neo-async@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - -node-releases@^2.0.14: - version "2.0.14" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" - integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== - -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== - -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" - -open@^7.4.2: - version "7.4.2" - resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" - integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== - dependencies: - is-docker "^2.0.0" - is-wsl "^2.1.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-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -patch-package@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-8.0.0.tgz#d191e2f1b6e06a4624a0116bcb88edd6714ede61" - integrity sha512-da8BVIhzjtgScwDJ2TtKsfT5JFWz1hYoBl9rUQ1f38MC2HwnEIkK8VN3dKMKcP7P7bvvgzNDbfNHtx3MsQb5vA== - dependencies: - "@yarnpkg/lockfile" "^1.1.0" - chalk "^4.1.2" - ci-info "^3.7.0" - cross-spawn "^7.0.3" - find-yarn-workspace-root "^2.0.0" - fs-extra "^9.0.0" - json-stable-stringify "^1.0.2" - klaw-sync "^6.0.0" - minimist "^1.2.6" - open "^7.4.2" - rimraf "^2.6.3" - semver "^7.5.3" - slash "^2.0.0" - tmp "^0.0.33" - yaml "^2.2.2" - -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== - -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - -picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -postinstall-postinstall@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/postinstall-postinstall/-/postinstall-postinstall-2.1.0.tgz#4f7f77441ef539d1512c40bd04c71b06a4704ca3" - integrity sha512-7hQX6ZlZXIoRiWNrbMQaLzUUfH+sSx39u8EJ9HYuDc1kLo9IXKWjM5RSquZN1ad5GnH8CGFM78fsAAQi3OKEEQ== - -postject@^1.0.0-alpha.5: - version "1.0.0-alpha.6" - resolved "https://registry.yarnpkg.com/postject/-/postject-1.0.0-alpha.6.tgz#9d022332272e2cfce8dea4cfce1ee6dd1b2ee135" - integrity sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A== - dependencies: - commander "^9.4.0" - -proto@1.0.9: - version "1.0.9" - resolved "https://registry.yarnpkg.com/proto/-/proto-1.0.9.tgz#249b2dcf1b47db0f8a79abba474fd10747e9eb1c" - integrity sha512-QP/jcZW3JquBdyEBCIdfkMr/0EMA/W6sCcpMZzs0AwlK04yZQ2D/w3cNvbYD0xoncSnHIIgB8Np5uwbDuo3XAw== - -protobufjs@^7.2.4, protobufjs@^7.2.6: - version "7.2.6" - resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.2.6.tgz#4a0ccd79eb292717aacf07530a07e0ed20278215" - integrity sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw== - dependencies: - "@protobufjs/aspromise" "^1.1.2" - "@protobufjs/base64" "^1.1.2" - "@protobufjs/codegen" "^2.0.4" - "@protobufjs/eventemitter" "^1.1.0" - "@protobufjs/fetch" "^1.1.0" - "@protobufjs/float" "^1.0.2" - "@protobufjs/inquire" "^1.1.0" - "@protobufjs/path" "^1.1.2" - "@protobufjs/pool" "^1.1.0" - "@protobufjs/utf8" "^1.1.0" - "@types/node" ">=13.7.0" - long "^5.0.0" - -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== - -randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -rechoir@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.8.0.tgz#49f866e0d32146142da3ad8f0eff352b3215ff22" - integrity sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ== - dependencies: - resolve "^1.20.0" - -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== - -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.0.0" - -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@^1.20.0: - 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" - -rimraf@^2.6.3: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - -safe-buffer@^5.1.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== - -schema-utils@^3.1.1, schema-utils@^3.2.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" - integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== - dependencies: - "@types/json-schema" "^7.0.8" - ajv "^6.12.5" - ajv-keywords "^3.5.2" - -semver@^7.3.4, semver@^7.5.3: - version "7.6.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" - integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== - dependencies: - lru-cache "^6.0.0" - -serialize-javascript@^6.0.1: - version "6.0.2" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" - integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== - dependencies: - randombytes "^2.1.0" - -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" - -shallow-clone@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" - integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== - dependencies: - kind-of "^6.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== - -slash@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" - integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== - -source-map-support@~0.5.20: - version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.6.0: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -source-map@^0.7.4: - version "0.7.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" - integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== - -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" - -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" - -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.0.0: - 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-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== - -tapable@^2.1.1, tapable@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" - integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== - -terser-webpack-plugin@^5.3.10: - version "5.3.10" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz#904f4c9193c6fd2a03f693a2150c62a92f40d199" - integrity sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w== - dependencies: - "@jridgewell/trace-mapping" "^0.3.20" - jest-worker "^27.4.5" - schema-utils "^3.1.1" - serialize-javascript "^6.0.1" - terser "^5.26.0" - -terser@^5.26.0: - version "5.29.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.29.1.tgz#44e58045b70c09792ba14bfb7b4e14ca8755b9fa" - integrity sha512-lZQ/fyaIGxsbGxApKmoPTODIzELy3++mXhS5hOqaAWZjQtpq/hFHAc+rm29NND1rYRxRWKcjuARNwULNXa5RtQ== - dependencies: - "@jridgewell/source-map" "^0.3.3" - acorn "^8.8.2" - commander "^2.20.0" - source-map-support "~0.5.20" - -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" - -ts-loader@^9.5.1: - version "9.5.1" - resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.5.1.tgz#63d5912a86312f1fbe32cef0859fb8b2193d9b89" - integrity sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg== - dependencies: - chalk "^4.1.0" - enhanced-resolve "^5.0.0" - micromatch "^4.0.0" - semver "^7.3.4" - source-map "^0.7.4" - -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== - -tslib@^2.4.0, tslib@^2.6.3: - version "2.6.3" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" - integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== - -typescript@^5.3.3: - version "5.3.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37" - integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== - -undici-types@~5.26.4: - version "5.26.5" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" - integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== - -universalify@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" - integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== - -update-browserslist-db@^1.0.13: - version "1.0.13" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" - integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" - -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" - -uuid@^9.0.1: - version "9.0.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" - integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== - -vm2@^3.9.19: - version "3.9.19" - resolved "https://registry.yarnpkg.com/vm2/-/vm2-3.9.19.tgz#be1e1d7a106122c6c492b4d51c2e8b93d3ed6a4a" - integrity sha512-J637XF0DHDMV57R6JyVsTak7nIL8gy5KH4r1HiwWLf/4GBbb5MKL5y7LpmF4A8E2nR6XmzpmMFQ7V7ppPTmUQg== - dependencies: - acorn "^8.7.0" - acorn-walk "^8.2.0" - -watchpack@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" - integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== - dependencies: - glob-to-regexp "^0.4.1" - graceful-fs "^4.1.2" - -webpack-cli@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-5.1.4.tgz#c8e046ba7eaae4911d7e71e2b25b776fcc35759b" - integrity sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg== - dependencies: - "@discoveryjs/json-ext" "^0.5.0" - "@webpack-cli/configtest" "^2.1.1" - "@webpack-cli/info" "^2.0.2" - "@webpack-cli/serve" "^2.0.5" - colorette "^2.0.14" - commander "^10.0.1" - cross-spawn "^7.0.3" - envinfo "^7.7.3" - fastest-levenshtein "^1.0.12" - import-local "^3.0.2" - interpret "^3.1.1" - rechoir "^0.8.0" - webpack-merge "^5.7.3" - -webpack-merge@^5.7.3: - version "5.10.0" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.10.0.tgz#a3ad5d773241e9c682803abf628d4cd62b8a4177" - integrity sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA== - dependencies: - clone-deep "^4.0.1" - flat "^5.0.2" - wildcard "^2.0.0" - -webpack-sources@^3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" - integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== - -webpack@^5.90.3: - version "5.90.3" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.90.3.tgz#37b8f74d3ded061ba789bb22b31e82eed75bd9ac" - integrity sha512-h6uDYlWCctQRuXBs1oYpVe6sFcWedl0dpcVaTf/YF67J9bKvwJajFulMVSYKHrksMB3I/pIagRzDxwxkebuzKA== - dependencies: - "@types/eslint-scope" "^3.7.3" - "@types/estree" "^1.0.5" - "@webassemblyjs/ast" "^1.11.5" - "@webassemblyjs/wasm-edit" "^1.11.5" - "@webassemblyjs/wasm-parser" "^1.11.5" - acorn "^8.7.1" - acorn-import-assertions "^1.9.0" - browserslist "^4.21.10" - chrome-trace-event "^1.0.2" - enhanced-resolve "^5.15.0" - es-module-lexer "^1.2.1" - eslint-scope "5.1.1" - events "^3.2.0" - glob-to-regexp "^0.4.1" - graceful-fs "^4.2.9" - json-parse-even-better-errors "^2.3.1" - loader-runner "^4.2.0" - mime-types "^2.1.27" - neo-async "^2.6.2" - schema-utils "^3.2.0" - tapable "^2.1.1" - terser-webpack-plugin "^5.3.10" - watchpack "^2.4.0" - webpack-sources "^3.2.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" - -wildcard@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" - integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== - -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" - -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== - -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== - -yaml@^2.2.2: - version "2.4.1" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.1.tgz#2e57e0b5e995292c25c75d2658f0664765210eed" - integrity sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg== - -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@^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"