From bbac1838a6320f5590163e6186e0898c3acafff9 Mon Sep 17 00:00:00 2001 From: Micah Benac Date: Sun, 2 Feb 2025 05:08:23 +0100 Subject: [PATCH 01/26] initial commit --- .eslintrc.js | 89 ----- .gitignore | 33 +- .npmignore | 9 - .npmrc | 1 - docgen.json | 12 - example/README.md | 1 - example/index.html | 15 - example/main.js | 85 ----- example/renderer.js | 26 -- example/style.css | 36 -- jsdoc.json | 3 - package.json | 139 +++++--- src/client.js | 660 ------------------------------------ src/constants.js | 178 ---------- src/index.js | 10 - src/transports/index.js | 6 - src/transports/ipc.js | 173 ---------- src/transports/websocket.js | 77 ----- src/util.js | 50 --- test/rp.js | 27 -- webpack.config.js | 12 - 21 files changed, 111 insertions(+), 1531 deletions(-) delete mode 100644 .eslintrc.js delete mode 100644 .npmignore delete mode 100644 .npmrc delete mode 100644 docgen.json delete mode 100644 example/README.md delete mode 100644 example/index.html delete mode 100644 example/main.js delete mode 100644 example/renderer.js delete mode 100644 example/style.css delete mode 100644 jsdoc.json delete mode 100644 src/client.js delete mode 100644 src/constants.js delete mode 100644 src/index.js delete mode 100644 src/transports/index.js delete mode 100644 src/transports/ipc.js delete mode 100644 src/transports/websocket.js delete mode 100644 src/util.js delete mode 100644 test/rp.js delete mode 100644 webpack.config.js diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index c7c2cb7..0000000 --- a/.eslintrc.js +++ /dev/null @@ -1,89 +0,0 @@ -'use strict'; - -module.exports = { - root: true, - extends: 'airbnb-base', - parser: 'babel-eslint', - parserOptions: { - ecmaVersion: 2018, - sourceType: 'script', - }, - env: { - es6: true, - node: true, - }, - overrides: [ - { - files: ['*.jsx'], - parserOptions: { - sourceType: 'module', - ecmaFeatures: { jsx: true }, - }, - }, - { - files: ['*.mjs'], - parserOptions: { sourceType: 'module' }, - env: { - node: true, - }, - rules: { - 'no-restricted-globals': ['error', 'require'], - }, - }, - { - files: ['*.web.js'], - env: { browser: true }, - }, - ], - rules: { - 'strict': ['error', 'global'], - 'indent': ['error', 2, { - SwitchCase: 1, - FunctionDeclaration: { - parameters: 'first', - }, - FunctionExpression: { - parameters: 'first', - }, - CallExpression: { - arguments: 'first', - }, - }], - 'no-bitwise': 'off', - 'no-iterator': 'off', - 'global-require': 'off', - 'quote-props': ['error', 'consistent-as-needed'], - 'brace-style': ['error', '1tbs', { allowSingleLine: false }], - 'curly': ['error', 'all'], - 'no-param-reassign': 'off', - 'arrow-parens': ['error', 'always'], - 'no-multi-assign': 'off', - 'no-underscore-dangle': 'off', - 'no-restricted-syntax': 'off', - 'object-curly-newline': 'off', - 'prefer-const': ['error', { destructuring: 'all' }], - 'class-methods-use-this': 'off', - 'implicit-arrow-linebreak': 'off', - 'lines-between-class-members': 'off', - 'import/no-dynamic-require': 'off', - 'import/no-extraneous-dependencies': ['error', { - devDependencies: true, - }], - 'import/extensions': 'off', - 'import/prefer-default-export': 'off', - 'import/no-unresolved': 'off', - }, - globals: { - WebAssembly: false, - BigInt: false, - BigInt64Array: false, - BigUint64Array: false, - URL: false, - Atomics: false, - SharedArrayBuffer: false, - globalThis: false, - FinalizationGroup: false, - WeakRef: false, - queueMicrotask: false, - }, -}; diff --git a/.gitignore b/.gitignore index ee23ad8..9050096 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,28 @@ -node_modules/** -package-lock.json -browser.js -test/auth.js -docs-out +# Packages +node_modules + +# Log files +logs +*.log +npm-debug.log* + +# Runtime data +pids +*.pid +*.seed + +# Env +.env + +# Dist +dist +dist-docs + +# Docs +docs/**/* +!docs/README.md + +# Miscellaneous +.turbo +.tmp +coverage diff --git a/.npmignore b/.npmignore deleted file mode 100644 index 7a016ce..0000000 --- a/.npmignore +++ /dev/null @@ -1,9 +0,0 @@ -node_modules -example -test -package-lock.json -shrinkwrap.yml -docs.json -docgen.json -jsdoc.json -webpack.config.js diff --git a/.npmrc b/.npmrc deleted file mode 100644 index 43c97e7..0000000 --- a/.npmrc +++ /dev/null @@ -1 +0,0 @@ -package-lock=false diff --git a/docgen.json b/docgen.json deleted file mode 100644 index 480ee15..0000000 --- a/docgen.json +++ /dev/null @@ -1,12 +0,0 @@ -[ - { - "name": "General", - "files": [ - { - "path": "../README.md", - "name": "Welcome", - "id": "welcome" - } - ] - } -] diff --git a/example/README.md b/example/README.md deleted file mode 100644 index 39ed81d..0000000 --- a/example/README.md +++ /dev/null @@ -1 +0,0 @@ -To run this example simply run `npm run example` diff --git a/example/index.html b/example/index.html deleted file mode 100644 index 70a235b..0000000 --- a/example/index.html +++ /dev/null @@ -1,15 +0,0 @@ - - - - - BOOP TEH SNEK (RPC Example) - - - -

BOOP TEH SNEK

-
🐍
-

0 BOOPS

- - - - diff --git a/example/main.js b/example/main.js deleted file mode 100644 index 85cecb5..0000000 --- a/example/main.js +++ /dev/null @@ -1,85 +0,0 @@ -'use strict'; - -/* eslint-disable no-console */ - -const { app, BrowserWindow } = require('electron'); -const path = require('path'); -const url = require('url'); -const DiscordRPC = require('../'); - -let mainWindow; - -function createWindow() { - mainWindow = new BrowserWindow({ - width: 340, - height: 380, - resizable: false, - titleBarStyle: 'hidden', - webPreferences: { - nodeIntegration: true, - }, - }); - - mainWindow.loadURL(url.format({ - pathname: path.join(__dirname, 'index.html'), - protocol: 'file:', - slashes: true, - })); - - mainWindow.on('closed', () => { - mainWindow = null; - }); -} - -app.on('ready', createWindow); - -app.on('window-all-closed', () => { - app.quit(); -}); - -app.on('activate', () => { - if (mainWindow === null) { - createWindow(); - } -}); - -// Set this to your Client ID. -const clientId = '280984871685062656'; - -// Only needed if you want to use spectate, join, or ask to join -DiscordRPC.register(clientId); - -const rpc = new DiscordRPC.Client({ transport: 'ipc' }); -const startTimestamp = new Date(); - -async function setActivity() { - if (!rpc || !mainWindow) { - return; - } - - const boops = await mainWindow.webContents.executeJavaScript('window.boops'); - - // You'll need to have snek_large and snek_small assets uploaded to - // https://discord.com/developers/applications//rich-presence/assets - rpc.setActivity({ - details: `booped ${boops} times`, - state: 'in slither party', - startTimestamp, - largeImageKey: 'snek_large', - largeImageText: 'tea is delicious', - smallImageKey: 'snek_small', - smallImageText: 'i am my own pillows', - instance: false, - }); -} - -rpc.on('ready', () => { - setActivity(); - - // activity can only be set every 15 seconds - setInterval(() => { - setActivity(); - }, 15e3); -}); - -rpc.login({ clientId }).catch(console.error); diff --git a/example/renderer.js b/example/renderer.js deleted file mode 100644 index a65131f..0000000 --- a/example/renderer.js +++ /dev/null @@ -1,26 +0,0 @@ -'use strict'; - -/* eslint-env browser */ - -const { webFrame } = require('electron'); - -const snek = document.getElementById('snek'); -const counter = document.getElementById('boops'); - -webFrame.setVisualZoomLevelLimits(1, 1); -webFrame.setLayoutZoomLevelLimits(0, 0); - -window.boops = 0; -function boop() { - window.boops += 1; - counter.innerHTML = `${window.boops} BOOPS`; -} - -snek.onmousedown = () => { - snek.style['font-size'] = '550%'; - boop(); -}; - -snek.onmouseup = () => { - snek.style['font-size'] = '500%'; -}; diff --git a/example/style.css b/example/style.css deleted file mode 100644 index 344d1cb..0000000 --- a/example/style.css +++ /dev/null @@ -1,36 +0,0 @@ -body, html { - margin: 0px; - height: 100%; - cursor: default; - font-family: sans-serif; - -webkit-touch-callout: none; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - -webkit-app-region: drag; -} - -h1 { - text-align: center; - margin: auto; - padding-top: 1em; -} - -#game { - height: 60%; - display: grid; - -webkit-app-region: no-drag; -} - -#snek { - cursor: pointer; - font-size: 500%; - margin: auto; -} - -#boops { - text-align: center; - -webkit-app-region: no-drag; -} diff --git a/jsdoc.json b/jsdoc.json deleted file mode 100644 index e64f528..0000000 --- a/jsdoc.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "plugins": ["node_modules/jsdoc-strip-async-await"] -} diff --git a/package.json b/package.json index 71125ae..b4de2a6 100644 --- a/package.json +++ b/package.json @@ -1,58 +1,85 @@ { - "name": "discord-rpc", - "version": "4.0.1", - "description": "A simple RPC client for Discord", - "keywords": [ - "discord", - "rpc", - "rich presence", - "remote procedural call" - ], - "main": "src/index.js", - "jsdelivr": "browser.js", - "unpkg": "browser.js", - "author": "snek ", - "license": "MIT", - "homepage": "https://github.com/discordjs/RPC#readme", - "bugs": { - "url": "https://github.com/discordjs/RPC/issues" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/discordjs/RPC.git" - }, - "scripts": { - "lint": "eslint src test --ext=js", - "docs": "mkdir -p docs-out && docgen --source src --output docs-out/master.json --jsdoc jsdoc.json --custom docgen.json", - "example": "electron example/main.js", - "build:browser": "webpack-cli", - "prepublishOnly": "npm run lint && npm run build:browser" - }, - "dependencies": { - "node-fetch": "^2.6.1", - "ws": "^7.3.1" - }, - "optionalDependencies": { - "register-scheme": "github:devsnek/node-register-scheme" - }, - "devDependencies": { - "babel-eslint": "^10.0.3", - "discord.js-docgen": "github:discordjs/docgen", - "electron": "^7.1.9", - "eslint": "^6.1.0", - "eslint-config-airbnb-base": "14.0.0", - "eslint-plugin-import": "^2.18.2", - "jsdoc-strip-async-await": "^0.1.0", - "webpack": "^4.40.0", - "webpack-cli": "^3.3.8" - }, - "browser": { - "net": false, - "ws": false, - "uws": false, - "erlpack": false, - "electron": false, - "register-scheme": false, - "./src/transports/IPC.js": false - } + "$schema": "https://json.schemastore.org/package.json", + "name": "@discordjs/rpc", + "version": "0.1.0", + "description": "A simple RPC client for Discord", + "scripts": { + "build": "tsc --noEmit && tsup", + "build:docs": "tsc -p tsconfig.docs.json", + "test": "vitest run", + "lint": "prettier --check . && cross-env TIMING=1 eslint --format=pretty src", + "format": "prettier --write . && cross-env TIMING=1 eslint --fix --format=pretty src", + "fmt": "pnpm run format", + "docs": "pnpm run build:docs && api-extractor run --local", + "prepack": "pnpm run build && pnpm run lint", + "changelog": "git cliff --prepend ./CHANGELOG.md -u -c ./cliff.toml -r ../../ --include-path 'packages/rpc/*'", + "release": "cliff-jumper" + }, + "type": "module", + "exports": { + ".": { + "require": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + }, + "import": { + "types": "./dist/index.d.mts", + "default": "./dist/index.mjs" + } + } + }, + "main": "./dist/index.js", + "module": "./dist/index.mjs", + "types": "./dist/index.d.ts", + "directories": { + "lib": "src", + "test": "__tests__" + }, + "files": [ + "dist" + ], + "contributors": [ + "Crawl ", + "SpaceEEC ", + "Vlad Frangu ", + "Aura Román " + ], + "license": "Apache-2.0", + "keywords": [], + "repository": { + "type": "git", + "url": "https://github.com/discordjs/RPC.git" + }, + "bugs": { + "url": "https://github.com/discordjs/RPC/issues" + }, + "homepage": "https://discord.js.org", + "funding": "https://github.com/discordjs/RPC?sponsor", + "dependencies": { + "@discordjs/rest": "^2.4.2", + "@vladfrangu/async_event_emitter": "^2.4.6", + "discord-api-types": "^0.37.117" + }, + "devDependencies": { + "@favware/cliff-jumper": "^4.1.0", + "@types/node": "^22.10.2", + "@vitest/coverage-v8": "^2.1.8", + "cross-env": "^7.0.3", + "esbuild-plugin-version-injector": "^1.2.1", + "eslint": "^8.57.1", + "eslint-config-neon": "^0.1.62", + "eslint-formatter-pretty": "^6.0.1", + "prettier": "^3.4.2", + "tsup": "^8.3.5", + "turbo": "^2.3.3", + "typescript": "~5.5.4", + "vitest": "^2.1.8" + }, + "engines": { + "node": ">=22" + }, + "publishConfig": { + "access": "public", + "provenance": true + } } diff --git a/src/client.js b/src/client.js deleted file mode 100644 index 0ff29da..0000000 --- a/src/client.js +++ /dev/null @@ -1,660 +0,0 @@ -'use strict'; - -const EventEmitter = require('events'); -const { setTimeout, clearTimeout } = require('timers'); -const fetch = require('node-fetch'); -const transports = require('./transports'); -const { RPCCommands, RPCEvents, RelationshipTypes } = require('./constants'); -const { pid: getPid, uuid } = require('./util'); - -function subKey(event, args) { - return `${event}${JSON.stringify(args)}`; -} - -/** - * @typedef {RPCClientOptions} - * @extends {ClientOptions} - * @prop {string} transport RPC transport. one of `ipc` or `websocket` - */ - -/** - * The main hub for interacting with Discord RPC - * @extends {BaseClient} - */ -class RPCClient extends EventEmitter { - /** - * @param {RPCClientOptions} [options] Options for the client. - * You must provide a transport - */ - constructor(options = {}) { - super(); - - this.options = options; - - this.accessToken = null; - this.clientId = null; - - /** - * Application used in this client - * @type {?ClientApplication} - */ - this.application = null; - - /** - * User used in this application - * @type {?User} - */ - this.user = null; - - const Transport = transports[options.transport]; - if (!Transport) { - throw new TypeError('RPC_INVALID_TRANSPORT', options.transport); - } - - this.fetch = (method, path, { data, query } = {}) => - fetch(`${this.fetch.endpoint}${path}${query ? new URLSearchParams(query) : ''}`, { - method, - body: data, - headers: { - Authorization: `Bearer ${this.accessToken}`, - }, - }).then(async (r) => { - const body = await r.json(); - if (!r.ok) { - const e = new Error(r.status); - e.body = body; - throw e; - } - return body; - }); - - this.fetch.endpoint = 'https://discord.com/api'; - - /** - * Raw transport userd - * @type {RPCTransport} - * @private - */ - this.transport = new Transport(this); - this.transport.on('message', this._onRpcMessage.bind(this)); - - /** - * Map of nonces being expected from the transport - * @type {Map} - * @private - */ - this._expecting = new Map(); - - this._connectPromise = undefined; - } - - /** - * Search and connect to RPC - */ - connect(clientId) { - if (this._connectPromise) { - return this._connectPromise; - } - this._connectPromise = new Promise((resolve, reject) => { - this.clientId = clientId; - const timeout = setTimeout(() => reject(new Error('RPC_CONNECTION_TIMEOUT')), 10e3); - timeout.unref(); - this.once('connected', () => { - clearTimeout(timeout); - resolve(this); - }); - this.transport.once('close', () => { - this._expecting.forEach((e) => { - e.reject(new Error('connection closed')); - }); - this.emit('disconnected'); - reject(new Error('connection closed')); - }); - this.transport.connect().catch(reject); - }); - return this._connectPromise; - } - - /** - * @typedef {RPCLoginOptions} - * @param {string} clientId Client ID - * @param {string} [clientSecret] Client secret - * @param {string} [accessToken] Access token - * @param {string} [rpcToken] RPC token - * @param {string} [tokenEndpoint] Token endpoint - * @param {string[]} [scopes] Scopes to authorize with - */ - - /** - * Performs authentication flow. Automatically calls Client#connect if needed. - * @param {RPCLoginOptions} options Options for authentication. - * At least one property must be provided to perform login. - * @example client.login({ clientId: '1234567', clientSecret: 'abcdef123' }); - * @returns {Promise} - */ - async login(options = {}) { - let { clientId, accessToken } = options; - await this.connect(clientId); - if (!options.scopes) { - this.emit('ready'); - return this; - } - if (!accessToken) { - accessToken = await this.authorize(options); - } - return this.authenticate(accessToken); - } - - /** - * Request - * @param {string} cmd Command - * @param {Object} [args={}] Arguments - * @param {string} [evt] Event - * @returns {Promise} - * @private - */ - request(cmd, args, evt) { - return new Promise((resolve, reject) => { - const nonce = uuid(); - this.transport.send({ cmd, args, evt, nonce }); - this._expecting.set(nonce, { resolve, reject }); - }); - } - - /** - * Message handler - * @param {Object} message message - * @private - */ - _onRpcMessage(message) { - if (message.cmd === RPCCommands.DISPATCH && message.evt === RPCEvents.READY) { - if (message.data.user) { - this.user = message.data.user; - } - this.emit('connected'); - } else if (this._expecting.has(message.nonce)) { - const { resolve, reject } = this._expecting.get(message.nonce); - if (message.evt === 'ERROR') { - const e = new Error(message.data.message); - e.code = message.data.code; - e.data = message.data; - reject(e); - } else { - resolve(message.data); - } - this._expecting.delete(message.nonce); - } else { - this.emit(message.evt, message.data); - } - } - - /** - * Authorize - * @param {Object} options options - * @returns {Promise} - * @private - */ - async authorize({ scopes, clientSecret, rpcToken, redirectUri, prompt } = {}) { - if (clientSecret && rpcToken === true) { - const body = await this.fetch('POST', '/oauth2/token/rpc', { - data: new URLSearchParams({ - client_id: this.clientId, - client_secret: clientSecret, - }), - }); - rpcToken = body.rpc_token; - } - - const { code } = await this.request('AUTHORIZE', { - scopes, - client_id: this.clientId, - prompt, - rpc_token: rpcToken, - }); - - const response = await this.fetch('POST', '/oauth2/token', { - data: new URLSearchParams({ - client_id: this.clientId, - client_secret: clientSecret, - code, - grant_type: 'authorization_code', - redirect_uri: redirectUri, - }), - }); - - return response.access_token; - } - - /** - * Authenticate - * @param {string} accessToken access token - * @returns {Promise} - * @private - */ - authenticate(accessToken) { - return this.request('AUTHENTICATE', { access_token: accessToken }) - .then(({ application, user }) => { - this.accessToken = accessToken; - this.application = application; - this.user = user; - this.emit('ready'); - return this; - }); - } - - - /** - * Fetch a guild - * @param {Snowflake} id Guild ID - * @param {number} [timeout] Timeout request - * @returns {Promise} - */ - getGuild(id, timeout) { - return this.request(RPCCommands.GET_GUILD, { guild_id: id, timeout }); - } - - /** - * Fetch all guilds - * @param {number} [timeout] Timeout request - * @returns {Promise>} - */ - getGuilds(timeout) { - return this.request(RPCCommands.GET_GUILDS, { timeout }); - } - - /** - * Get a channel - * @param {Snowflake} id Channel ID - * @param {number} [timeout] Timeout request - * @returns {Promise} - */ - getChannel(id, timeout) { - return this.request(RPCCommands.GET_CHANNEL, { channel_id: id, timeout }); - } - - /** - * Get all channels - * @param {Snowflake} [id] Guild ID - * @param {number} [timeout] Timeout request - * @returns {Promise>} - */ - async getChannels(id, timeout) { - const { channels } = await this.request(RPCCommands.GET_CHANNELS, { - timeout, - guild_id: id, - }); - return channels; - } - - /** - * @typedef {CertifiedDevice} - * @prop {string} type One of `AUDIO_INPUT`, `AUDIO_OUTPUT`, `VIDEO_INPUT` - * @prop {string} uuid This device's Windows UUID - * @prop {object} vendor Vendor information - * @prop {string} vendor.name Vendor's name - * @prop {string} vendor.url Vendor's url - * @prop {object} model Model information - * @prop {string} model.name Model's name - * @prop {string} model.url Model's url - * @prop {string[]} related Array of related product's Windows UUIDs - * @prop {boolean} echoCancellation If the device has echo cancellation - * @prop {boolean} noiseSuppression If the device has noise suppression - * @prop {boolean} automaticGainControl If the device has automatic gain control - * @prop {boolean} hardwareMute If the device has a hardware mute - */ - - /** - * Tell discord which devices are certified - * @param {CertifiedDevice[]} devices Certified devices to send to discord - * @returns {Promise} - */ - setCertifiedDevices(devices) { - return this.request(RPCCommands.SET_CERTIFIED_DEVICES, { - devices: devices.map((d) => ({ - type: d.type, - id: d.uuid, - vendor: d.vendor, - model: d.model, - related: d.related, - echo_cancellation: d.echoCancellation, - noise_suppression: d.noiseSuppression, - automatic_gain_control: d.automaticGainControl, - hardware_mute: d.hardwareMute, - })), - }); - } - - /** - * @typedef {UserVoiceSettings} - * @prop {Snowflake} id ID of the user these settings apply to - * @prop {?Object} [pan] Pan settings, an object with `left` and `right` set between - * 0.0 and 1.0, inclusive - * @prop {?number} [volume=100] The volume - * @prop {bool} [mute] If the user is muted - */ - - /** - * Set the voice settings for a user, by id - * @param {Snowflake} id ID of the user to set - * @param {UserVoiceSettings} settings Settings - * @returns {Promise} - */ - setUserVoiceSettings(id, settings) { - return this.request(RPCCommands.SET_USER_VOICE_SETTINGS, { - user_id: id, - pan: settings.pan, - mute: settings.mute, - volume: settings.volume, - }); - } - - /** - * Move the user to a voice channel - * @param {Snowflake} id ID of the voice channel - * @param {Object} [options] Options - * @param {number} [options.timeout] Timeout for the command - * @param {boolean} [options.force] Force this move. This should only be done if you - * have explicit permission from the user. - * @returns {Promise} - */ - selectVoiceChannel(id, { timeout, force = false } = {}) { - return this.request(RPCCommands.SELECT_VOICE_CHANNEL, { channel_id: id, timeout, force }); - } - - /** - * Move the user to a text channel - * @param {Snowflake} id ID of the voice channel - * @param {Object} [options] Options - * @param {number} [options.timeout] Timeout for the command - * have explicit permission from the user. - * @returns {Promise} - */ - selectTextChannel(id, { timeout } = {}) { - return this.request(RPCCommands.SELECT_TEXT_CHANNEL, { channel_id: id, timeout }); - } - - /** - * Get current voice settings - * @returns {Promise} - */ - getVoiceSettings() { - return this.request(RPCCommands.GET_VOICE_SETTINGS) - .then((s) => ({ - automaticGainControl: s.automatic_gain_control, - echoCancellation: s.echo_cancellation, - noiseSuppression: s.noise_suppression, - qos: s.qos, - silenceWarning: s.silence_warning, - deaf: s.deaf, - mute: s.mute, - input: { - availableDevices: s.input.available_devices, - device: s.input.device_id, - volume: s.input.volume, - }, - output: { - availableDevices: s.output.available_devices, - device: s.output.device_id, - volume: s.output.volume, - }, - mode: { - type: s.mode.type, - autoThreshold: s.mode.auto_threshold, - threshold: s.mode.threshold, - shortcut: s.mode.shortcut, - delay: s.mode.delay, - }, - })); - } - - /** - * Set current voice settings, overriding the current settings until this session disconnects. - * This also locks the settings for any other rpc sessions which may be connected. - * @param {Object} args Settings - * @returns {Promise} - */ - setVoiceSettings(args) { - return this.request(RPCCommands.SET_VOICE_SETTINGS, { - automatic_gain_control: args.automaticGainControl, - echo_cancellation: args.echoCancellation, - noise_suppression: args.noiseSuppression, - qos: args.qos, - silence_warning: args.silenceWarning, - deaf: args.deaf, - mute: args.mute, - input: args.input ? { - device_id: args.input.device, - volume: args.input.volume, - } : undefined, - output: args.output ? { - device_id: args.output.device, - volume: args.output.volume, - } : undefined, - mode: args.mode ? { - type: args.mode.type, - auto_threshold: args.mode.autoThreshold, - threshold: args.mode.threshold, - shortcut: args.mode.shortcut, - delay: args.mode.delay, - } : undefined, - }); - } - - /** - * Capture a shortcut using the client - * The callback takes (key, stop) where `stop` is a function that will stop capturing. - * This `stop` function must be called before disconnecting or else the user will have - * to restart their client. - * @param {Function} callback Callback handling keys - * @returns {Promise} - */ - captureShortcut(callback) { - const subid = subKey(RPCEvents.CAPTURE_SHORTCUT_CHANGE); - const stop = () => { - this._subscriptions.delete(subid); - return this.request(RPCCommands.CAPTURE_SHORTCUT, { action: 'STOP' }); - }; - this._subscriptions.set(subid, ({ shortcut }) => { - callback(shortcut, stop); - }); - return this.request(RPCCommands.CAPTURE_SHORTCUT, { action: 'START' }) - .then(() => stop); - } - - /** - * Sets the presence for the logged in user. - * @param {object} args The rich presence to pass. - * @param {number} [pid] The application's process ID. Defaults to the executing process' PID. - * @returns {Promise} - */ - setActivity(args = {}, pid = getPid()) { - let timestamps; - let assets; - let party; - let secrets; - if (args.startTimestamp || args.endTimestamp) { - timestamps = { - start: args.startTimestamp, - end: args.endTimestamp, - }; - if (timestamps.start instanceof Date) { - timestamps.start = Math.round(timestamps.start.getTime()); - } - if (timestamps.end instanceof Date) { - timestamps.end = Math.round(timestamps.end.getTime()); - } - if (timestamps.start > 2147483647000) { - throw new RangeError('timestamps.start must fit into a unix timestamp'); - } - if (timestamps.end > 2147483647000) { - throw new RangeError('timestamps.end must fit into a unix timestamp'); - } - } - if ( - args.largeImageKey || args.largeImageText - || args.smallImageKey || args.smallImageText - ) { - assets = { - large_image: args.largeImageKey, - large_text: args.largeImageText, - small_image: args.smallImageKey, - small_text: args.smallImageText, - }; - } - if (args.partySize || args.partyId || args.partyMax) { - party = { id: args.partyId }; - if (args.partySize || args.partyMax) { - party.size = [args.partySize, args.partyMax]; - } - } - if (args.matchSecret || args.joinSecret || args.spectateSecret) { - secrets = { - match: args.matchSecret, - join: args.joinSecret, - spectate: args.spectateSecret, - }; - } - - return this.request(RPCCommands.SET_ACTIVITY, { - pid, - activity: { - state: args.state, - details: args.details, - timestamps, - assets, - party, - secrets, - buttons: args.buttons, - instance: !!args.instance, - }, - }); - } - - /** - * Clears the currently set presence, if any. This will hide the "Playing X" message - * displayed below the user's name. - * @param {number} [pid] The application's process ID. Defaults to the executing process' PID. - * @returns {Promise} - */ - clearActivity(pid = getPid()) { - return this.request(RPCCommands.SET_ACTIVITY, { - pid, - }); - } - - /** - * Invite a user to join the game the RPC user is currently playing - * @param {User} user The user to invite - * @returns {Promise} - */ - sendJoinInvite(user) { - return this.request(RPCCommands.SEND_ACTIVITY_JOIN_INVITE, { - user_id: user.id || user, - }); - } - - /** - * Request to join the game the user is playing - * @param {User} user The user whose game you want to request to join - * @returns {Promise} - */ - sendJoinRequest(user) { - return this.request(RPCCommands.SEND_ACTIVITY_JOIN_REQUEST, { - user_id: user.id || user, - }); - } - - /** - * Reject a join request from a user - * @param {User} user The user whose request you wish to reject - * @returns {Promise} - */ - closeJoinRequest(user) { - return this.request(RPCCommands.CLOSE_ACTIVITY_JOIN_REQUEST, { - user_id: user.id || user, - }); - } - - createLobby(type, capacity, metadata) { - return this.request(RPCCommands.CREATE_LOBBY, { - type, - capacity, - metadata, - }); - } - - updateLobby(lobby, { type, owner, capacity, metadata } = {}) { - return this.request(RPCCommands.UPDATE_LOBBY, { - id: lobby.id || lobby, - type, - owner_id: (owner && owner.id) || owner, - capacity, - metadata, - }); - } - - deleteLobby(lobby) { - return this.request(RPCCommands.DELETE_LOBBY, { - id: lobby.id || lobby, - }); - } - - connectToLobby(id, secret) { - return this.request(RPCCommands.CONNECT_TO_LOBBY, { - id, - secret, - }); - } - - sendToLobby(lobby, data) { - return this.request(RPCCommands.SEND_TO_LOBBY, { - id: lobby.id || lobby, - data, - }); - } - - disconnectFromLobby(lobby) { - return this.request(RPCCommands.DISCONNECT_FROM_LOBBY, { - id: lobby.id || lobby, - }); - } - - updateLobbyMember(lobby, user, metadata) { - return this.request(RPCCommands.UPDATE_LOBBY_MEMBER, { - lobby_id: lobby.id || lobby, - user_id: user.id || user, - metadata, - }); - } - - getRelationships() { - const types = Object.keys(RelationshipTypes); - return this.request(RPCCommands.GET_RELATIONSHIPS) - .then((o) => o.relationships.map((r) => ({ - ...r, - type: types[r.type], - }))); - } - - /** - * Subscribe to an event - * @param {string} event Name of event e.g. `MESSAGE_CREATE` - * @param {Object} [args] Args for event e.g. `{ channel_id: '1234' }` - * @returns {Promise} - */ - async subscribe(event, args) { - await this.request(RPCCommands.SUBSCRIBE, args, event); - return { - unsubscribe: () => this.request(RPCCommands.UNSUBSCRIBE, args, event), - }; - } - - /** - * Destroy the client - */ - async destroy() { - await this.transport.close(); - } -} - -module.exports = RPCClient; diff --git a/src/constants.js b/src/constants.js deleted file mode 100644 index 441f832..0000000 --- a/src/constants.js +++ /dev/null @@ -1,178 +0,0 @@ -'use strict'; - -function keyMirror(arr) { - const tmp = {}; - for (const value of arr) { - tmp[value] = value; - } - return tmp; -} - - -exports.browser = typeof window !== 'undefined'; - -exports.RPCCommands = keyMirror([ - 'DISPATCH', - 'AUTHORIZE', - 'AUTHENTICATE', - 'GET_GUILD', - 'GET_GUILDS', - 'GET_CHANNEL', - 'GET_CHANNELS', - 'CREATE_CHANNEL_INVITE', - 'GET_RELATIONSHIPS', - 'GET_USER', - 'SUBSCRIBE', - 'UNSUBSCRIBE', - 'SET_USER_VOICE_SETTINGS', - 'SET_USER_VOICE_SETTINGS_2', - 'SELECT_VOICE_CHANNEL', - 'GET_SELECTED_VOICE_CHANNEL', - 'SELECT_TEXT_CHANNEL', - 'GET_VOICE_SETTINGS', - 'SET_VOICE_SETTINGS_2', - 'SET_VOICE_SETTINGS', - 'CAPTURE_SHORTCUT', - 'SET_ACTIVITY', - 'SEND_ACTIVITY_JOIN_INVITE', - 'CLOSE_ACTIVITY_JOIN_REQUEST', - 'ACTIVITY_INVITE_USER', - 'ACCEPT_ACTIVITY_INVITE', - 'INVITE_BROWSER', - 'DEEP_LINK', - 'CONNECTIONS_CALLBACK', - 'BRAINTREE_POPUP_BRIDGE_CALLBACK', - 'GIFT_CODE_BROWSER', - 'GUILD_TEMPLATE_BROWSER', - 'OVERLAY', - 'BROWSER_HANDOFF', - 'SET_CERTIFIED_DEVICES', - 'GET_IMAGE', - 'CREATE_LOBBY', - 'UPDATE_LOBBY', - 'DELETE_LOBBY', - 'UPDATE_LOBBY_MEMBER', - 'CONNECT_TO_LOBBY', - 'DISCONNECT_FROM_LOBBY', - 'SEND_TO_LOBBY', - 'SEARCH_LOBBIES', - 'CONNECT_TO_LOBBY_VOICE', - 'DISCONNECT_FROM_LOBBY_VOICE', - 'SET_OVERLAY_LOCKED', - 'OPEN_OVERLAY_ACTIVITY_INVITE', - 'OPEN_OVERLAY_GUILD_INVITE', - 'OPEN_OVERLAY_VOICE_SETTINGS', - 'VALIDATE_APPLICATION', - 'GET_ENTITLEMENT_TICKET', - 'GET_APPLICATION_TICKET', - 'START_PURCHASE', - 'GET_SKUS', - 'GET_ENTITLEMENTS', - 'GET_NETWORKING_CONFIG', - 'NETWORKING_SYSTEM_METRICS', - 'NETWORKING_PEER_METRICS', - 'NETWORKING_CREATE_TOKEN', - 'SET_USER_ACHIEVEMENT', - 'GET_USER_ACHIEVEMENTS', -]); - -exports.RPCEvents = keyMirror([ - 'CURRENT_USER_UPDATE', - 'GUILD_STATUS', - 'GUILD_CREATE', - 'CHANNEL_CREATE', - 'RELATIONSHIP_UPDATE', - 'VOICE_CHANNEL_SELECT', - 'VOICE_STATE_CREATE', - 'VOICE_STATE_DELETE', - 'VOICE_STATE_UPDATE', - 'VOICE_SETTINGS_UPDATE', - 'VOICE_SETTINGS_UPDATE_2', - 'VOICE_CONNECTION_STATUS', - 'SPEAKING_START', - 'SPEAKING_STOP', - 'GAME_JOIN', - 'GAME_SPECTATE', - 'ACTIVITY_JOIN', - 'ACTIVITY_JOIN_REQUEST', - 'ACTIVITY_SPECTATE', - 'ACTIVITY_INVITE', - 'NOTIFICATION_CREATE', - 'MESSAGE_CREATE', - 'MESSAGE_UPDATE', - 'MESSAGE_DELETE', - 'LOBBY_DELETE', - 'LOBBY_UPDATE', - 'LOBBY_MEMBER_CONNECT', - 'LOBBY_MEMBER_DISCONNECT', - 'LOBBY_MEMBER_UPDATE', - 'LOBBY_MESSAGE', - 'CAPTURE_SHORTCUT_CHANGE', - 'OVERLAY', - 'OVERLAY_UPDATE', - 'ENTITLEMENT_CREATE', - 'ENTITLEMENT_DELETE', - 'USER_ACHIEVEMENT_UPDATE', - 'READY', - 'ERROR', -]); - -exports.RPCErrors = { - CAPTURE_SHORTCUT_ALREADY_LISTENING: 5004, - GET_GUILD_TIMED_OUT: 5002, - INVALID_ACTIVITY_JOIN_REQUEST: 4012, - INVALID_ACTIVITY_SECRET: 5005, - INVALID_CHANNEL: 4005, - INVALID_CLIENTID: 4007, - INVALID_COMMAND: 4002, - INVALID_ENTITLEMENT: 4015, - INVALID_EVENT: 4004, - INVALID_GIFT_CODE: 4016, - INVALID_GUILD: 4003, - INVALID_INVITE: 4011, - INVALID_LOBBY: 4013, - INVALID_LOBBY_SECRET: 4014, - INVALID_ORIGIN: 4008, - INVALID_PAYLOAD: 4000, - INVALID_PERMISSIONS: 4006, - INVALID_TOKEN: 4009, - INVALID_USER: 4010, - LOBBY_FULL: 5007, - NO_ELIGIBLE_ACTIVITY: 5006, - OAUTH2_ERROR: 5000, - PURCHASE_CANCELED: 5008, - PURCHASE_ERROR: 5009, - RATE_LIMITED: 5011, - SELECT_CHANNEL_TIMED_OUT: 5001, - SELECT_VOICE_FORCE_REQUIRED: 5003, - SERVICE_UNAVAILABLE: 1001, - TRANSACTION_ABORTED: 1002, - UNAUTHORIZED_FOR_ACHIEVEMENT: 5010, - UNKNOWN_ERROR: 1000, -}; - -exports.RPCCloseCodes = { - CLOSE_NORMAL: 1000, - CLOSE_UNSUPPORTED: 1003, - CLOSE_ABNORMAL: 1006, - INVALID_CLIENTID: 4000, - INVALID_ORIGIN: 4001, - RATELIMITED: 4002, - TOKEN_REVOKED: 4003, - INVALID_VERSION: 4004, - INVALID_ENCODING: 4005, -}; - -exports.LobbyTypes = { - PRIVATE: 1, - PUBLIC: 2, -}; - -exports.RelationshipTypes = { - NONE: 0, - FRIEND: 1, - BLOCKED: 2, - PENDING_INCOMING: 3, - PENDING_OUTGOING: 4, - IMPLICIT: 5, -}; diff --git a/src/index.js b/src/index.js deleted file mode 100644 index a3444b3..0000000 --- a/src/index.js +++ /dev/null @@ -1,10 +0,0 @@ -'use strict'; - -const util = require('./util'); - -module.exports = { - Client: require('./client'), - register(id) { - return util.register(`discord-${id}`); - }, -}; diff --git a/src/transports/index.js b/src/transports/index.js deleted file mode 100644 index 42db529..0000000 --- a/src/transports/index.js +++ /dev/null @@ -1,6 +0,0 @@ -'use strict'; - -module.exports = { - ipc: require('./ipc'), - websocket: require('./websocket'), -}; diff --git a/src/transports/ipc.js b/src/transports/ipc.js deleted file mode 100644 index f050a01..0000000 --- a/src/transports/ipc.js +++ /dev/null @@ -1,173 +0,0 @@ -'use strict'; - -const net = require('net'); -const EventEmitter = require('events'); -const fetch = require('node-fetch'); -const { uuid } = require('../util'); - -const OPCodes = { - HANDSHAKE: 0, - FRAME: 1, - CLOSE: 2, - PING: 3, - PONG: 4, -}; - -function getIPCPath(id) { - if (process.platform === 'win32') { - return `\\\\?\\pipe\\discord-ipc-${id}`; - } - const { env: { XDG_RUNTIME_DIR, TMPDIR, TMP, TEMP } } = process; - const prefix = XDG_RUNTIME_DIR || TMPDIR || TMP || TEMP || '/tmp'; - return `${prefix.replace(/\/$/, '')}/discord-ipc-${id}`; -} - -function getIPC(id = 0) { - return new Promise((resolve, reject) => { - const path = getIPCPath(id); - const onerror = () => { - if (id < 10) { - resolve(getIPC(id + 1)); - } else { - reject(new Error('Could not connect')); - } - }; - const sock = net.createConnection(path, () => { - sock.removeListener('error', onerror); - resolve(sock); - }); - sock.once('error', onerror); - }); -} - -async function findEndpoint(tries = 0) { - if (tries > 30) { - throw new Error('Could not find endpoint'); - } - const endpoint = `http://127.0.0.1:${6463 + (tries % 10)}`; - try { - const r = await fetch(endpoint); - if (r.status === 404) { - return endpoint; - } - return findEndpoint(tries + 1); - } catch (e) { - return findEndpoint(tries + 1); - } -} - -function encode(op, data) { - data = JSON.stringify(data); - const len = Buffer.byteLength(data); - const packet = Buffer.alloc(8 + len); - packet.writeInt32LE(op, 0); - packet.writeInt32LE(len, 4); - packet.write(data, 8, len); - return packet; -} - -const working = { - full: '', - op: undefined, -}; - -function decode(socket, callback) { - const packet = socket.read(); - if (!packet) { - return; - } - - let { op } = working; - let raw; - if (working.full === '') { - op = working.op = packet.readInt32LE(0); - const len = packet.readInt32LE(4); - raw = packet.slice(8, len + 8); - } else { - raw = packet.toString(); - } - - try { - const data = JSON.parse(working.full + raw); - callback({ op, data }); // eslint-disable-line callback-return - working.full = ''; - working.op = undefined; - } catch (err) { - working.full += raw; - } - - decode(socket, callback); -} - -class IPCTransport extends EventEmitter { - constructor(client) { - super(); - this.client = client; - this.socket = null; - } - - async connect() { - const socket = this.socket = await getIPC(); - socket.on('close', this.onClose.bind(this)); - socket.on('error', this.onClose.bind(this)); - this.emit('open'); - socket.write(encode(OPCodes.HANDSHAKE, { - v: 1, - client_id: this.client.clientId, - })); - socket.pause(); - socket.on('readable', () => { - decode(socket, ({ op, data }) => { - switch (op) { - case OPCodes.PING: - this.send(data, OPCodes.PONG); - break; - case OPCodes.FRAME: - if (!data) { - return; - } - if (data.cmd === 'AUTHORIZE' && data.evt !== 'ERROR') { - findEndpoint() - .then((endpoint) => { - this.client.request.endpoint = endpoint; - }) - .catch((e) => { - this.client.emit('error', e); - }); - } - this.emit('message', data); - break; - case OPCodes.CLOSE: - this.emit('close', data); - break; - default: - break; - } - }); - }); - } - - onClose(e) { - this.emit('close', e); - } - - send(data, op = OPCodes.FRAME) { - this.socket.write(encode(op, data)); - } - - async close() { - return new Promise((r) => { - this.once('close', r); - this.send({}, OPCodes.CLOSE); - this.socket.end(); - }); - } - - ping() { - this.send(uuid(), OPCodes.PING); - } -} - -module.exports = IPCTransport; -module.exports.encode = encode; -module.exports.decode = decode; diff --git a/src/transports/websocket.js b/src/transports/websocket.js deleted file mode 100644 index bd5a671..0000000 --- a/src/transports/websocket.js +++ /dev/null @@ -1,77 +0,0 @@ -'use strict'; - -const EventEmitter = require('events'); -const { browser } = require('../constants'); - -// eslint-disable-next-line -const WebSocket = browser ? window.WebSocket : require('ws'); - -const pack = (d) => JSON.stringify(d); -const unpack = (s) => JSON.parse(s); - -class WebSocketTransport extends EventEmitter { - constructor(client) { - super(); - this.client = client; - this.ws = null; - this.tries = 0; - } - - async connect() { - const port = 6463 + (this.tries % 10); - this.tries += 1; - - this.ws = new WebSocket( - `ws://127.0.0.1:${port}/?v=1&client_id=${this.client.clientId}`, - browser ? undefined : { origin: this.client.options.origin }, - ); - this.ws.onopen = this.onOpen.bind(this); - this.ws.onclose = this.onClose.bind(this); - this.ws.onerror = this.onError.bind(this); - this.ws.onmessage = this.onMessage.bind(this); - } - - onOpen() { - this.emit('open'); - } - - onClose(event) { - if (!event.wasClean) { - return; - } - this.emit('close', event); - } - - onError(event) { - try { - this.ws.close(); - } catch {} // eslint-disable-line no-empty - - if (this.tries > 20) { - this.emit('error', event.error); - } else { - setTimeout(() => { - this.connect(); - }, 250); - } - } - - onMessage(event) { - this.emit('message', unpack(event.data)); - } - - send(data) { - this.ws.send(pack(data)); - } - - ping() {} // eslint-disable-line no-empty-function - - close() { - return new Promise((r) => { - this.once('close', r); - this.ws.close(); - }); - } -} - -module.exports = WebSocketTransport; diff --git a/src/util.js b/src/util.js deleted file mode 100644 index 2fdc937..0000000 --- a/src/util.js +++ /dev/null @@ -1,50 +0,0 @@ -'use strict'; - -let register; -try { - const { app } = require('electron'); - register = app.setAsDefaultProtocolClient.bind(app); -} catch (err) { - try { - register = require('register-scheme'); - } catch (e) {} // eslint-disable-line no-empty -} - -if (typeof register !== 'function') { - register = () => false; -} - -function pid() { - if (typeof process !== 'undefined') { - return process.pid; - } - return null; -} - -const uuid4122 = () => { - let uuid = ''; - for (let i = 0; i < 32; i += 1) { - if (i === 8 || i === 12 || i === 16 || i === 20) { - uuid += '-'; - } - let n; - if (i === 12) { - n = 4; - } else { - const random = Math.random() * 16 | 0; - if (i === 16) { - n = (random & 3) | 0; - } else { - n = random; - } - } - uuid += n.toString(16); - } - return uuid; -}; - -module.exports = { - pid, - register, - uuid: uuid4122, -}; diff --git a/test/rp.js b/test/rp.js deleted file mode 100644 index be8f343..0000000 --- a/test/rp.js +++ /dev/null @@ -1,27 +0,0 @@ -'use strict'; - -/* eslint-disable no-console */ - -try { - require('wtfnode').init(); -} catch (err) {} // eslint-disable-line no-empty - -const { Client } = require('../'); - -const client = new Client({ - transport: 'ipc', -}); - -client.on('VOICE_CHANNEL_SELECT', (args) => { - client.subscribe('VOICE_STATE_UPDATE', { channel_id: args.channel_id }); -}); - -client.on('VOICE_STATE_UPDATE', (args) => { - console.log(args); -}); - -client.on('ready', async () => { - client.subscribe('VOICE_CHANNEL_SELECT'); -}); - -client.login(require('./auth')).catch(console.error); diff --git a/webpack.config.js b/webpack.config.js deleted file mode 100644 index ef471a7..0000000 --- a/webpack.config.js +++ /dev/null @@ -1,12 +0,0 @@ -'use strict'; - -module.exports = { - mode: 'production', - entry: require.resolve('.'), - output: { - path: __dirname, - filename: 'browser.js', - library: 'RPC', - libraryTarget: 'umd', - }, -}; From 6c193d11a1340efc3fd5634eb3f897c52bc82096 Mon Sep 17 00:00:00 2001 From: Micah Benac Date: Sun, 2 Feb 2025 05:08:23 +0100 Subject: [PATCH 02/26] initial commit --- .cliff-jumperrc.json | 5 + .lintstagedrc.js | 2 + .prettierignore | 7 + .prettierrc.js | 2 + cliff.toml | 80 + examples/README.md | 1 + examples/index.html | 15 + examples/main.js | 87 + examples/renderer.js | 26 + examples/style.css | 37 + pnpm-lock.yaml | 7606 ++++++++++++++++++++++++++++++++++++++++++ src/client.ts | 687 ++++ src/constants.ts | 3611 ++++++++++++++++++++ src/index.ts | 11 + src/ipc.ts | 203 ++ src/util.ts | 9 + tsconfig.docs.json | 11 + tsconfig.eslint.json | 22 + tsconfig.json | 51 + tsup.config.ts | 56 + 20 files changed, 12529 insertions(+) create mode 100644 .cliff-jumperrc.json create mode 100644 .lintstagedrc.js create mode 100644 .prettierignore create mode 100644 .prettierrc.js create mode 100644 cliff.toml create mode 100644 examples/README.md create mode 100644 examples/index.html create mode 100644 examples/main.js create mode 100644 examples/renderer.js create mode 100644 examples/style.css create mode 100644 pnpm-lock.yaml create mode 100644 src/client.ts create mode 100644 src/constants.ts create mode 100644 src/index.ts create mode 100644 src/ipc.ts create mode 100644 src/util.ts create mode 100644 tsconfig.docs.json create mode 100644 tsconfig.eslint.json create mode 100644 tsconfig.json create mode 100644 tsup.config.ts diff --git a/.cliff-jumperrc.json b/.cliff-jumperrc.json new file mode 100644 index 0000000..9ae17bb --- /dev/null +++ b/.cliff-jumperrc.json @@ -0,0 +1,5 @@ +{ + "name": "rpc", + "org": "discordjs", + "identifierBase": false +} diff --git a/.lintstagedrc.js b/.lintstagedrc.js new file mode 100644 index 0000000..c46f610 --- /dev/null +++ b/.lintstagedrc.js @@ -0,0 +1,2 @@ +/** @type {import('lint-staged').Config} */ +module.exports = require('../../.lintstagedrc.json'); diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..9aef795 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,7 @@ +.turbo +coverage +dist +dist-docs +docs/docs.api.json +CHANGELOG.md +tsup.config.bundled* diff --git a/.prettierrc.js b/.prettierrc.js new file mode 100644 index 0000000..f723230 --- /dev/null +++ b/.prettierrc.js @@ -0,0 +1,2 @@ +/** @type {import('prettier').Config} */ +module.exports = require('../../.prettierrc.json'); diff --git a/cliff.toml b/cliff.toml new file mode 100644 index 0000000..3ea07a5 --- /dev/null +++ b/cliff.toml @@ -0,0 +1,80 @@ +[changelog] +header = """ +# Changelog + +All notable changes to this project will be documented in this file.\n +""" +body = """ +{%- macro remote_url() -%} + https://github.com/{{ remote.github.owner }}/{{ remote.github.repo }} +{%- endmacro -%} +{% if version %}\ + # [{{ version | trim_start_matches(pat="v") }}]\ + {% if previous %}\ + {% if previous.version %}\ + ({{ self::remote_url() }}/compare/{{ previous.version }}...{{ version }})\ + {% else %}\ + ({{ self::remote_url() }}/tree/{{ version }})\ + {% endif %}\ + {% endif %} \ + - ({{ timestamp | date(format="%Y-%m-%d") }}) +{% else %}\ + # [unreleased] +{% endif %}\ +{% for group, commits in commits | group_by(attribute="group") %} + ## {{ group | upper_first }} + {% for commit in commits %} + - {% if commit.scope %}\ + **{{commit.scope}}:** \ + {% endif %}\ + {{ commit.message | upper_first }} ([{{ commit.id | truncate(length=7, end="") }}]({{ self::remote_url() }}/commit/{{ commit.id }}))\ + {% if commit.github.username %} by @{{ commit.github.username }}{%- endif %}\ + {% if commit.breaking %}\ + {% for footer in commit.footers %}\ + {% if footer.breaking %}\ + \n{% raw %} {% endraw %}- **{{ footer.token }}{{ footer.separator }}** {{ footer.value }}\ + {% endif %}\ + {% endfor %}\ + {% endif %}\ + {% endfor %} +{% endfor %}\ +{% if github.contributors | filter(attribute="is_first_time", value=true) | length %}\ + \n### New Contributors\n + {% for contributor in github.contributors | filter(attribute="is_first_time", value=true) %}\ + * @{{ contributor.username }} made their first contribution in #{{ contributor.pr_number }} + {% endfor %}\ +{% endif %}\n +""" +trim = true +footer = "" + +[git] +conventional_commits = true +filter_unconventional = true +commit_parsers = [ + { message = "^feat", group = "Features"}, + { message = "^fix", group = "Bug Fixes"}, + { message = "^docs", group = "Documentation"}, + { message = "^perf", group = "Performance"}, + { message = "^refactor", group = "Refactor"}, + { message = "^typings", group = "Typings"}, + { message = "^types", group = "Typings"}, + { message = ".*deprecated", body = ".*deprecated", group = "Deprecation"}, + { message = "^revert", skip = true}, + { message = "^style", group = "Styling"}, + { message = "^test", group = "Testing"}, + { message = "^chore", skip = true}, + { message = "^ci", skip = true}, + { message = "^build", skip = true}, + { body = ".*security", group = "Security"}, +] +filter_commits = true +protect_breaking_commits = true +tag_pattern = "@discordjs/rpc@[0-9]*" +ignore_tags = "" +topo_order = false +sort_commits = "newest" + +[remote.github] +owner = "discordjs" +repo = "discord.js" diff --git a/examples/README.md b/examples/README.md new file mode 100644 index 0000000..39ed81d --- /dev/null +++ b/examples/README.md @@ -0,0 +1 @@ +To run this example simply run `npm run example` diff --git a/examples/index.html b/examples/index.html new file mode 100644 index 0000000..0cbd092 --- /dev/null +++ b/examples/index.html @@ -0,0 +1,15 @@ + + + + + BOOP TEH SNEK (RPC Example) + + + +

BOOP TEH SNEK

+
🐍
+

0 BOOPS

+ + + + diff --git a/examples/main.js b/examples/main.js new file mode 100644 index 0000000..93457f1 --- /dev/null +++ b/examples/main.js @@ -0,0 +1,87 @@ +'use strict'; + +/* eslint-disable no-console */ + +const { app, BrowserWindow } = require('electron'); +const path = require('path'); +const url = require('url'); +const DiscordRPC = require('../'); + +let mainWindow; + +function createWindow() { + mainWindow = new BrowserWindow({ + width: 340, + height: 380, + resizable: false, + titleBarStyle: 'hidden', + webPreferences: { + nodeIntegration: true, + }, + }); + + mainWindow.loadURL( + url.format({ + pathname: path.join(__dirname, 'index.html'), + protocol: 'file:', + slashes: true, + }), + ); + + mainWindow.on('closed', () => { + mainWindow = null; + }); +} + +app.on('ready', createWindow); + +app.on('window-all-closed', () => { + app.quit(); +}); + +app.on('activate', () => { + if (mainWindow === null) { + createWindow(); + } +}); + +// Set this to your Client ID. +const clientId = '280984871685062656'; + +// Only needed if you want to use spectate, join, or ask to join +DiscordRPC.register(clientId); + +const rpc = new DiscordRPC.Client({ transport: 'ipc' }); +const startTimestamp = new Date(); + +async function setActivity() { + if (!rpc || !mainWindow) { + return; + } + + const boops = await mainWindow.webContents.executeJavaScript('window.boops'); + + // You'll need to have snek_large and snek_small assets uploaded to + // https://discord.com/developers/applications//rich-presence/assets + rpc.setActivity({ + details: `booped ${boops} times`, + state: 'in slither party', + startTimestamp, + largeImageKey: 'snek_large', + largeImageText: 'tea is delicious', + smallImageKey: 'snek_small', + smallImageText: 'i am my own pillows', + instance: false, + }); +} + +rpc.on('ready', () => { + setActivity(); + + // activity can only be set every 15 seconds + setInterval(() => { + setActivity(); + }, 15e3); +}); + +rpc.login({ clientId }).catch(console.error); diff --git a/examples/renderer.js b/examples/renderer.js new file mode 100644 index 0000000..8f9d7aa --- /dev/null +++ b/examples/renderer.js @@ -0,0 +1,26 @@ +'use strict'; + +/* eslint-env browser */ + +const { webFrame } = require('electron'); + +const snek = document.getElementById('snek'); +const counter = document.getElementById('boops'); + +webFrame.setVisualZoomLevelLimits(1, 1); +webFrame.setLayoutZoomLevelLimits(0, 0); + +window.boops = 0; +function boop() { + window.boops += 1; + counter.innerHTML = `${window.boops} BOOPS`; +} + +snek.onmousedown = () => { + snek.style['font-size'] = '550%'; + boop(); +}; + +snek.onmouseup = () => { + snek.style['font-size'] = '500%'; +}; diff --git a/examples/style.css b/examples/style.css new file mode 100644 index 0000000..5045688 --- /dev/null +++ b/examples/style.css @@ -0,0 +1,37 @@ +body, +html { + margin: 0px; + height: 100%; + cursor: default; + font-family: sans-serif; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-app-region: drag; +} + +h1 { + text-align: center; + margin: auto; + padding-top: 1em; +} + +#game { + height: 60%; + display: grid; + -webkit-app-region: no-drag; +} + +#snek { + cursor: pointer; + font-size: 500%; + margin: auto; +} + +#boops { + text-align: center; + -webkit-app-region: no-drag; +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..45c31f1 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,7606 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@discordjs/rest': + specifier: ^2.4.2 + version: 2.4.2 + '@vladfrangu/async_event_emitter': + specifier: ^2.4.6 + version: 2.4.6 + discord-api-types: + specifier: ^0.37.117 + version: 0.37.119 + devDependencies: + '@favware/cliff-jumper': + specifier: ^4.1.0 + version: 4.1.0 + '@types/node': + specifier: ^22.10.2 + version: 22.13.0 + '@vitest/coverage-v8': + specifier: ^2.1.8 + version: 2.1.8(vitest@2.1.8(@types/node@22.13.0)) + cross-env: + specifier: ^7.0.3 + version: 7.0.3 + esbuild-plugin-version-injector: + specifier: ^1.2.1 + version: 1.2.1 + eslint: + specifier: ^8.57.1 + version: 8.57.1 + eslint-config-neon: + specifier: ^0.1.62 + version: 0.1.62(eslint@8.57.1)(svelte@3.59.2)(typescript@5.5.4) + eslint-formatter-pretty: + specifier: ^6.0.1 + version: 6.0.1 + prettier: + specifier: ^3.4.2 + version: 3.4.2 + tsup: + specifier: ^8.3.5 + version: 8.3.6(postcss@8.5.1)(typescript@5.5.4)(yaml@2.7.0) + turbo: + specifier: ^2.3.3 + version: 2.4.0 + typescript: + specifier: ~5.5.4 + version: 5.5.4 + vitest: + specifier: ^2.1.8 + version: 2.1.8(@types/node@22.13.0) + +packages: + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@angular-eslint/bundled-angular-compiler@17.5.3': + resolution: {integrity: sha512-x9jZ6mME9wxumErPGonWERXX/9TJ7mzEkQhOKt3BxBFm0sy9XQqLMAenp1PBSg3RF3rH7EEVdB2+jb75RtHp0g==} + + '@angular-eslint/eslint-plugin-template@17.5.3': + resolution: {integrity: sha512-RkRFagxqBPV2xdNyeQQROUm6I1Izto1Z3Wy73lCk2zq1RhVgbznniH/epmOIE8PMkHmMKmZ765FV++J/90p4Ig==} + peerDependencies: + eslint: ^7.20.0 || ^8.0.0 + typescript: '*' + + '@angular-eslint/eslint-plugin@17.5.3': + resolution: {integrity: sha512-2gMRZ+SkiygrPDtCJwMfjmwIFOcvxxC4NRX/MqRo6udsa0gtqPrc8acRbwrmAXlullmhzmaeUfkHpGDSzW8pFw==} + peerDependencies: + eslint: ^7.20.0 || ^8.0.0 + typescript: '*' + + '@angular-eslint/template-parser@17.5.3': + resolution: {integrity: sha512-NYybOsMkJUtFOW2JWALicipq0kK5+jGwA1MYyRoXjdbDlXltHUb9qkXj7p0fE6uRutBGXDl4288s8g/fZCnAIA==} + peerDependencies: + eslint: ^7.20.0 || ^8.0.0 + typescript: '*' + + '@angular-eslint/utils@17.5.3': + resolution: {integrity: sha512-0nNm1FUOLhVHrdK2PP5dZCYYVmTIkEJ4CmlwpuC4JtCLbD5XAHQpY/ZW5Ff5n1b7KfJt1Zy//jlhkkIaw3LaBQ==} + peerDependencies: + eslint: ^7.20.0 || ^8.0.0 + typescript: '*' + + '@astrojs/compiler@2.10.3': + resolution: {integrity: sha512-bL/O7YBxsFt55YHU021oL+xz+B/9HvGNId3F9xURN16aeqDK9juHGktdkCSXz+U4nqFACq6ZFvWomOzhV+zfPw==} + + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.26.5': + resolution: {integrity: sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.26.7': + resolution: {integrity: sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/template@7.25.9': + resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.26.7': + resolution: {integrity: sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.26.7': + resolution: {integrity: sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==} + engines: {node: '>=6.9.0'} + + '@bcoe/v8-coverage@0.2.3': + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + + '@conventional-changelog/git-client@1.0.1': + resolution: {integrity: sha512-PJEqBwAleffCMETaVm/fUgHldzBE35JFk3/9LL6NUA5EXa3qednu+UT6M7E5iBu3zIQZCULYIiZ90fBYHt6xUw==} + engines: {node: '>=18'} + peerDependencies: + conventional-commits-filter: ^5.0.0 + conventional-commits-parser: ^6.0.0 + peerDependenciesMeta: + conventional-commits-filter: + optional: true + conventional-commits-parser: + optional: true + + '@discordjs/collection@2.1.1': + resolution: {integrity: sha512-LiSusze9Tc7qF03sLCujF5iZp7K+vRNEDBZ86FT9aQAv3vxMLihUvKvpsCWiQ2DJq1tVckopKm1rxomgNUc9hg==} + engines: {node: '>=18'} + + '@discordjs/rest@2.4.2': + resolution: {integrity: sha512-9bOvXYLQd5IBg/kKGuEFq3cstVxAMJ6wMxO2U3wjrgO+lHv8oNCT+BBRpuzVQh7BoXKvk/gpajceGvQUiRoJ8g==} + engines: {node: '>=18'} + + '@discordjs/util@1.1.1': + resolution: {integrity: sha512-eddz6UnOBEB1oITPinyrB2Pttej49M9FZQY8NxgEvc3tq6ZICZ19m70RsmzRdDHk80O9NoYN/25AqJl8vPVf/g==} + engines: {node: '>=18'} + + '@es-joy/jsdoccomment@0.46.0': + resolution: {integrity: sha512-C3Axuq1xd/9VqFZpW4YAzOx5O9q/LP46uIQy/iNDpHG3fmPa6TBtvfglMCs3RBiBxAIi0Go97r8+jvTt55XMyQ==} + engines: {node: '>=16'} + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.24.2': + resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.24.2': + resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.24.2': + resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.24.2': + resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.24.2': + resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.24.2': + resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.24.2': + resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.24.2': + resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.24.2': + resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.24.2': + resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.24.2': + resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.24.2': + resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.24.2': + resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.24.2': + resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.24.2': + resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.24.2': + resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.24.2': + resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.24.2': + resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.24.2': + resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.24.2': + resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.24.2': + resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.24.2': + resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.24.2': + resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.24.2': + resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.24.2': + resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.4.1': + resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.57.1': + resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@favware/cliff-jumper@4.1.0': + resolution: {integrity: sha512-z8U6XecZr3F7nkq2d+dg+QXaHcBh+DugUuVQGwIEo2vpAPOFkZ0Xnz3YbnTu0zPlr9lDEWL/rbnGEr0lwCaGOA==} + engines: {node: '>=v18'} + hasBin: true + + '@favware/colorette-spinner@1.0.1': + resolution: {integrity: sha512-PPYtcLzhSafdylp8NBOxMCYIcLqTUMNiQc7ciBoAIvxNG2egM+P7e2nNPui5+Svyk89Q+Tnbrp139ZRIIBw3IA==} + engines: {node: '>=v16'} + + '@humanwhocodes/config-array@0.13.0': + resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@microsoft/tsdoc-config@0.16.2': + resolution: {integrity: sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==} + + '@microsoft/tsdoc@0.14.2': + resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} + + '@next/eslint-plugin-next@14.2.23': + resolution: {integrity: sha512-efRC7m39GoiU1fXZRgGySqYbQi6ZyLkuGlvGst7IwkTTczehQTJA/7PoMg4MMjUZvZEGpiSEu+oJBAjPawiC3Q==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@nolyfill/is-core-module@1.0.39': + resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} + engines: {node: '>=12.4.0'} + + '@npmcli/config@8.3.4': + resolution: {integrity: sha512-01rtHedemDNhUXdicU7s+QYz/3JyV5Naj84cvdXGH4mgCdL+agmSYaLF4LUG4vMCLzhBO8YtS0gPpH1FGvbgAw==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@npmcli/git@5.0.8': + resolution: {integrity: sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@npmcli/map-workspaces@3.0.6': + resolution: {integrity: sha512-tkYs0OYnzQm6iIRdfy+LcLBjcKuQCeE5YLb8KnrIlutJfheNaPvPpgoFEyEFgbjzl5PLZ3IA/BWAwRU0eHuQDA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@npmcli/name-from-folder@2.0.0': + resolution: {integrity: sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@npmcli/package-json@5.2.1': + resolution: {integrity: sha512-f7zYC6kQautXHvNbLEWgD/uGu1+xCn9izgqBfgItWSx22U0ZDekxN08A1vM8cTxj/cRVe0Q94Ode+tdoYmIOOQ==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@npmcli/promise-spawn@7.0.2': + resolution: {integrity: sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@octokit/auth-token@5.1.2': + resolution: {integrity: sha512-JcQDsBdg49Yky2w2ld20IHAlwr8d/d8N6NiOXbtuoPCqzbsiJgF633mVUw3x4mo0H5ypataQIX7SFu3yy44Mpw==} + engines: {node: '>= 18'} + + '@octokit/core@6.1.3': + resolution: {integrity: sha512-z+j7DixNnfpdToYsOutStDgeRzJSMnbj8T1C/oQjB6Aa+kRfNjs/Fn7W6c8bmlt6mfy3FkgeKBRnDjxQow5dow==} + engines: {node: '>= 18'} + + '@octokit/endpoint@10.1.2': + resolution: {integrity: sha512-XybpFv9Ms4hX5OCHMZqyODYqGTZ3H6K6Vva+M9LR7ib/xr1y1ZnlChYv9H680y77Vd/i/k+thXApeRASBQkzhA==} + engines: {node: '>= 18'} + + '@octokit/graphql@8.2.0': + resolution: {integrity: sha512-gejfDywEml/45SqbWTWrhfwvLBrcGYhOn50sPOjIeVvH6i7D16/9xcFA8dAJNp2HMcd+g4vru41g4E2RBiZvfQ==} + engines: {node: '>= 18'} + + '@octokit/openapi-types@23.0.1': + resolution: {integrity: sha512-izFjMJ1sir0jn0ldEKhZ7xegCTj/ObmEDlEfpFrx4k/JyZSMRHbO3/rBwgE7f3m2DHt+RrNGIVw4wSmwnm3t/g==} + + '@octokit/plugin-retry@7.1.3': + resolution: {integrity: sha512-8nKOXvYWnzv89gSyIvgFHmCBAxfQAOPRlkacUHL9r5oWtp5Whxl8Skb2n3ACZd+X6cYijD6uvmrQuPH/UCL5zQ==} + engines: {node: '>= 18'} + peerDependencies: + '@octokit/core': '>=6' + + '@octokit/request-error@6.1.6': + resolution: {integrity: sha512-pqnVKYo/at0NuOjinrgcQYpEbv4snvP3bKMRqHaD9kIsk9u1LCpb2smHZi8/qJfgeNqLo5hNW4Z7FezNdEo0xg==} + engines: {node: '>= 18'} + + '@octokit/request@9.2.0': + resolution: {integrity: sha512-kXLfcxhC4ozCnAXy2ff+cSxpcF0A1UqxjvYMqNuPIeOAzJbVWQ+dy5G2fTylofB/gTbObT8O6JORab+5XtA1Kw==} + engines: {node: '>= 18'} + + '@octokit/types@13.8.0': + resolution: {integrity: sha512-x7DjTIbEpEWXK99DMd01QfWy0hd5h4EN+Q7shkdKds3otGQP+oWE/y0A76i1OvH9fygo4ddvNf7ZvF0t78P98A==} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@pkgr/core@0.1.1': + resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + + '@rollup/rollup-android-arm-eabi@4.34.0': + resolution: {integrity: sha512-Eeao7ewDq79jVEsrtWIj5RNqB8p2knlm9fhR6uJ2gqP7UfbLrTrxevudVrEPDM7Wkpn/HpRC2QfazH7MXLz3vQ==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.34.0': + resolution: {integrity: sha512-yVh0Kf1f0Fq4tWNf6mWcbQBCLDpDrDEl88lzPgKhrgTcDrTtlmun92ywEF9dCjmYO3EFiSuJeeo9cYRxl2FswA==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.34.0': + resolution: {integrity: sha512-gCs0ErAZ9s0Osejpc3qahTsqIPUDjSKIyxK/0BGKvL+Tn0n3Kwvj8BrCv7Y5sR1Ypz1K2qz9Ny0VvkVyoXBVUQ==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.34.0': + resolution: {integrity: sha512-aIB5Anc8hngk15t3GUkiO4pv42ykXHfmpXGS+CzM9CTyiWyT8HIS5ygRAy7KcFb/wiw4Br+vh1byqcHRTfq2tQ==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.34.0': + resolution: {integrity: sha512-kpdsUdMlVJMRMaOf/tIvxk8TQdzHhY47imwmASOuMajg/GXpw8GKNd8LNwIHE5Yd1onehNpcUB9jHY6wgw9nHQ==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.34.0': + resolution: {integrity: sha512-D0RDyHygOBCQiqookcPevrvgEarN0CttBecG4chOeIYCNtlKHmf5oi5kAVpXV7qs0Xh/WO2RnxeicZPtT50V0g==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.34.0': + resolution: {integrity: sha512-mCIw8j5LPDXmCOW8mfMZwT6F/Kza03EnSr4wGYEswrEfjTfVsFOxvgYfuRMxTuUF/XmRb9WSMD5GhCWDe2iNrg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.34.0': + resolution: {integrity: sha512-AwwldAu4aCJPob7zmjuDUMvvuatgs8B/QiVB0KwkUarAcPB3W+ToOT+18TQwY4z09Al7G0BvCcmLRop5zBLTag==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.34.0': + resolution: {integrity: sha512-e7kDUGVP+xw05pV65ZKb0zulRploU3gTu6qH1qL58PrULDGxULIS0OSDQJLH7WiFnpd3ZKUU4VM3u/Z7Zw+e7Q==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.34.0': + resolution: {integrity: sha512-SXYJw3zpwHgaBqTXeAZ31qfW/v50wq4HhNVvKFhRr5MnptRX2Af4KebLWR1wpxGJtLgfS2hEPuALRIY3LPAAcA==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loongarch64-gnu@4.34.0': + resolution: {integrity: sha512-e5XiCinINCI4RdyU3sFyBH4zzz7LiQRvHqDtRe9Dt8o/8hTBaYpdPimayF00eY2qy5j4PaaWK0azRgUench6WQ==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.34.0': + resolution: {integrity: sha512-3SWN3e0bAsm9ToprLFBSro8nJe6YN+5xmB11N4FfNf92wvLye/+Rh5JGQtKOpwLKt6e61R1RBc9g+luLJsc23A==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.34.0': + resolution: {integrity: sha512-B1Oqt3GLh7qmhvfnc2WQla4NuHlcxAD5LyueUi5WtMc76ZWY+6qDtQYqnxARx9r+7mDGfamD+8kTJO0pKUJeJA==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.34.0': + resolution: {integrity: sha512-UfUCo0h/uj48Jq2lnhX0AOhZPSTAq3Eostas+XZ+GGk22pI+Op1Y6cxQ1JkUuKYu2iU+mXj1QjPrZm9nNWV9rg==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.34.0': + resolution: {integrity: sha512-chZLTUIPbgcpm+Z7ALmomXW8Zh+wE2icrG+K6nt/HenPLmtwCajhQC5flNSk1Xy5EDMt/QAOz2MhzfOfJOLSiA==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.34.0': + resolution: {integrity: sha512-jo0UolK70O28BifvEsFD/8r25shFezl0aUk2t0VJzREWHkq19e+pcLu4kX5HiVXNz5qqkD+aAq04Ct8rkxgbyQ==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.34.0': + resolution: {integrity: sha512-Vmg0NhAap2S54JojJchiu5An54qa6t/oKT7LmDaWggpIcaiL8WcWHEN6OQrfTdL6mQ2GFyH7j2T5/3YPEDOOGA==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.34.0': + resolution: {integrity: sha512-CV2aqhDDOsABKHKhNcs1SZFryffQf8vK2XrxP6lxC99ELZAdvsDgPklIBfd65R8R+qvOm1SmLaZ/Fdq961+m7A==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.34.0': + resolution: {integrity: sha512-g2ASy1QwHP88y5KWvblUolJz9rN+i4ZOsYzkEwcNfaNooxNUXG+ON6F5xFo0NIItpHqxcdAyls05VXpBnludGw==} + cpu: [x64] + os: [win32] + + '@rushstack/eslint-patch@1.10.5': + resolution: {integrity: sha512-kkKUDVlII2DQiKy7UstOR1ErJP8kUKAQ4oa+SQtM0K+lPdmmjj0YnnxBgtTVYH7mUKtbsxeFC9y0AmK7Yb78/A==} + + '@sapphire/async-queue@1.5.5': + resolution: {integrity: sha512-cvGzxbba6sav2zZkH8GPf2oGk9yYoD5qrNWdu9fRehifgnFZJMV+nuy2nON2roRO4yQQ+v7MK/Pktl/HgfsUXg==} + engines: {node: '>=v14.0.0', npm: '>=7.0.0'} + + '@sapphire/result@2.7.2': + resolution: {integrity: sha512-DJbCGmvi8UZAu/hh85auQL8bODFlpcS3cWjRJZ5/cXTLekmGvs/CrRxrIzwbA6+poyYojo5rK4qu8trmjfneog==} + engines: {node: '>=v14.0.0', npm: '>=7.0.0'} + + '@sapphire/snowflake@3.5.5': + resolution: {integrity: sha512-xzvBr1Q1c4lCe7i6sRnrofxeO1QTP/LKQ6A6qy0iB4x5yfiSfARMEQEghojzTNALDTcv8En04qYNIco9/K9eZQ==} + engines: {node: '>=v14.0.0', npm: '>=7.0.0'} + + '@sapphire/utilities@3.17.0': + resolution: {integrity: sha512-bbqjnKKrCgyT0C3+KOjIBzE6z6/v764EFuV7Uxw9WeIdkqGhwepl6tuNEzgiek/JdtEcODaPeX0K1aCt53yCcA==} + engines: {node: '>=v14.0.0'} + + '@sec-ant/readable-stream@0.4.1': + resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + + '@sindresorhus/merge-streams@4.0.0': + resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} + engines: {node: '>=18'} + + '@types/acorn@4.0.6': + resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} + + '@types/concat-stream@2.0.3': + resolution: {integrity: sha512-3qe4oQAPNwVNwK4C9c8u+VJqv9kez+2MR4qJpoPFfXtgxxif1QbFusvXzK0/Wra2VX07smostI2VMmJNSpZjuQ==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/eslint@8.56.12': + resolution: {integrity: sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==} + + '@types/estree-jsx@1.0.5': + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/is-empty@1.2.3': + resolution: {integrity: sha512-4J1l5d79hoIvsrKh5VUKVRA1aIdsOb10Hu5j3J2VfP/msDnfTdGPmNp2E1Wg+vs97Bktzo+MZePFFXSGoykYJw==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/mdast@3.0.15': + resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/node@22.13.0': + resolution: {integrity: sha512-ClIbNe36lawluuvq3+YYhnIN2CELi+6q8NpnM7PYp4hBn/TatfboPgVSm2rwKRfnV2M+Ty9GWDFI64KEe+kysA==} + + '@types/normalize-package-data@2.4.4': + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + + '@types/semver@7.5.8': + resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + + '@types/supports-color@8.1.3': + resolution: {integrity: sha512-Hy6UMpxhE3j1tLpl27exp1XqHD7n8chAiNPzWfz16LPZoMMoSc4dzLl6w9qijkEb/r5O1ozdu1CWGA2L83ZeZg==} + + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@types/yargs-parser@21.0.3': + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + + '@types/yargs@17.0.33': + resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} + + '@typescript-eslint/eslint-plugin@7.18.0': + resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + '@typescript-eslint/parser': ^7.0.0 + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/experimental-utils@5.62.0': + resolution: {integrity: sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + + '@typescript-eslint/parser@7.18.0': + resolution: {integrity: sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@5.62.0': + resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/scope-manager@7.11.0': + resolution: {integrity: sha512-27tGdVEiutD4POirLZX4YzT180vevUURJl4wJGmm6TrQoiYwuxTIY98PBp6L2oN+JQxzE0URvYlzJaBHIekXAw==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/scope-manager@7.18.0': + resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/type-utils@7.11.0': + resolution: {integrity: sha512-WmppUEgYy+y1NTseNMJ6mCFxt03/7jTOy08bcg7bxJJdsM4nuhnchyBbE8vryveaJUf62noH7LodPSo5Z0WUCg==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/type-utils@7.18.0': + resolution: {integrity: sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@5.62.0': + resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/types@7.11.0': + resolution: {integrity: sha512-MPEsDRZTyCiXkD4vd3zywDCifi7tatc4K37KqTprCvaXptP7Xlpdw0NR2hRJTetG5TxbWDB79Ys4kLmHliEo/w==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/types@7.18.0': + resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/typescript-estree@5.62.0': + resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/typescript-estree@7.11.0': + resolution: {integrity: sha512-cxkhZ2C/iyi3/6U9EPc5y+a6csqHItndvN/CzbNXTNrsC3/ASoYQZEt9uMaEp+xFNjasqQyszp5TumAVKKvJeQ==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/typescript-estree@7.18.0': + resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@5.62.0': + resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + + '@typescript-eslint/utils@7.11.0': + resolution: {integrity: sha512-xlAWwPleNRHwF37AhrZurOxA1wyXowW4PqVXZVUNCLjB48CqdPJoJWkrpH2nij9Q3Lb7rtWindtoXwxjxlKKCA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + + '@typescript-eslint/utils@7.18.0': + resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + + '@typescript-eslint/visitor-keys@5.62.0': + resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/visitor-keys@7.11.0': + resolution: {integrity: sha512-7syYk4MzjxTEk0g/w3iqtgxnFQspDJfn6QKD36xMuuhTzjcxY7F8EmBLnALjVyaOF1/bVocu3bS/2/F7rXrveQ==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/visitor-keys@7.18.0': + resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + '@vitest/coverage-v8@2.1.8': + resolution: {integrity: sha512-2Y7BPlKH18mAZYAW1tYByudlCYrQyl5RGvnnDYJKW5tCiO5qg3KSAy3XAxcxKz900a0ZXxWtKrMuZLe3lKBpJw==} + peerDependencies: + '@vitest/browser': 2.1.8 + vitest: 2.1.8 + peerDependenciesMeta: + '@vitest/browser': + optional: true + + '@vitest/expect@2.1.8': + resolution: {integrity: sha512-8ytZ/fFHq2g4PJVAtDX57mayemKgDR6X3Oa2Foro+EygiOJHUXhCqBAAKQYYajZpFoIfvBCF1j6R6IYRSIUFuw==} + + '@vitest/mocker@2.1.8': + resolution: {integrity: sha512-7guJ/47I6uqfttp33mgo6ga5Gr1VnL58rcqYKyShoRK9ebu8T5Rs6HN3s1NABiBeVTdWNrwUMcHH54uXZBN4zA==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@2.1.8': + resolution: {integrity: sha512-9HiSZ9zpqNLKlbIDRWOnAWqgcA7xu+8YxXSekhr0Ykab7PAYFkhkwoqVArPOtJhPmYeE2YHgKZlj3CP36z2AJQ==} + + '@vitest/runner@2.1.8': + resolution: {integrity: sha512-17ub8vQstRnRlIU5k50bG+QOMLHRhYPAna5tw8tYbj+jzjcspnwnwtPtiOlkuKC4+ixDPTuLZiqiWWQ2PSXHVg==} + + '@vitest/snapshot@2.1.8': + resolution: {integrity: sha512-20T7xRFbmnkfcmgVEz+z3AU/3b0cEzZOt/zmnvZEctg64/QZbSDJEVm9fLnnlSi74KibmRsO9/Qabi+t0vCRPg==} + + '@vitest/spy@2.1.8': + resolution: {integrity: sha512-5swjf2q95gXeYPevtW0BLk6H8+bPlMb4Vw/9Em4hFxDcaOxS+e0LOX4yqNxoHzMR2akEB2xfpnWUzkZokmgWDg==} + + '@vitest/utils@2.1.8': + resolution: {integrity: sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA==} + + '@vladfrangu/async_event_emitter@2.4.6': + resolution: {integrity: sha512-RaI5qZo6D2CVS6sTHFKg1v5Ohq/+Bo2LZ5gzUEwZ/WkHhwtGTCB/sVLw8ijOkAUxasZ+WshN/Rzj4ywsABJ5ZA==} + engines: {node: '>=v14.0.0', npm: '>=7.0.0'} + + abbrev@2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ansi-escapes@6.2.1: + resolution: {integrity: sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==} + engines: {node: '>=14.16'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + are-docs-informative@0.0.2: + resolution: {integrity: sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==} + engines: {node: '>=14'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + + array-includes@3.1.8: + resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} + engines: {node: '>= 0.4'} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} + + array.prototype.flat@1.3.3: + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} + engines: {node: '>= 0.4'} + + array.prototype.tosorted@1.1.4: + resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} + engines: {node: '>= 0.4'} + + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + + ast-types-flow@0.0.8: + resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + + astro-eslint-parser@0.16.3: + resolution: {integrity: sha512-CGaBseNtunAV2DCpwBXqTKq8+9Tw65XZetMaC0FsMoZuLj0gxNIkbCf2QyKYScVrNOU7/ayfNdVw8ZCSHBiqCg==} + engines: {node: ^14.18.0 || >=16.0.0} + + astrojs-compiler-sync@0.3.5: + resolution: {integrity: sha512-y420rhIIJ2HHDkYeqKArBHSdJNIIGMztLH90KGIX3zjcJyt/cr9Z2wYA8CP5J1w6KE7xqMh0DAkhfjhNDpQb2Q==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@astrojs/compiler': '>=0.27.0' + + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + axe-core@4.10.2: + resolution: {integrity: sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==} + engines: {node: '>=4'} + + axobject-query@4.0.0: + resolution: {integrity: sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==} + + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} + + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + before-after-hook@3.0.2: + resolution: {integrity: sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==} + + bent@7.3.12: + resolution: {integrity: sha512-T3yrKnVGB63zRuoco/7Ybl7BwwGZR0lceoVG5XmQyMIH9s19SV5m+a8qam4if0zQuAmOQTyPTPmsQBdAorGK3w==} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + bottleneck@2.19.5: + resolution: {integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.24.4: + resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + + builtins@5.1.0: + resolution: {integrity: sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==} + + bundle-require@5.1.0: + resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: '>=0.18' + + bytesish@0.4.4: + resolution: {integrity: sha512-i4uu6M4zuMUiyfZN4RU2+i9+peJh//pXhd9x1oSe1LBkZ3LEbCoygu8W0bXTukU1Jme2txKuotpCZRaC3FLxcQ==} + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + call-bind-apply-helpers@1.0.1: + resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} + engines: {node: '>= 0.4'} + + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.3: + resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + caniuse-lite@1.0.30001696: + resolution: {integrity: sha512-pDCPkvzfa39ehJtJ+OwGT/2yvT2SbjfHhiIW2LWOAcMQ7BzwxT/XuyUp4OTOd0XFWA6BKw0JalnBHgSi5DGJBQ==} + + caseless@0.12.0: + resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + chai@5.1.2: + resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==} + engines: {node: '>=12'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.4.1: + resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@1.1.4: + resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@1.2.4: + resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + character-reference-invalid@1.1.4: + resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} + + character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + ci-info@4.1.0: + resolution: {integrity: sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A==} + engines: {node: '>=8'} + + clean-regexp@1.0.0: + resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} + engines: {node: '>=4'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + comment-parser@1.4.1: + resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==} + engines: {node: '>= 12.0.0'} + + common-tags@1.8.2: + resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} + engines: {node: '>=4.0.0'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + concat-stream@2.0.0: + resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} + engines: {'0': node >= 6.0} + + consola@3.4.0: + resolution: {integrity: sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==} + engines: {node: ^14.18.0 || >=16.10.0} + + conventional-changelog-preset-loader@5.0.0: + resolution: {integrity: sha512-SetDSntXLk8Jh1NOAl1Gu5uLiCNSYenB5tm0YVeZKePRIgDW9lQImromTwLa3c/Gae298tsgOM+/CYT9XAl0NA==} + engines: {node: '>=18'} + + conventional-commits-filter@5.0.0: + resolution: {integrity: sha512-tQMagCOC59EVgNZcC5zl7XqO30Wki9i9J3acbUvkaosCT6JX3EeFwJD7Qqp4MCikRnzS18WXV3BLIQ66ytu6+Q==} + engines: {node: '>=18'} + + conventional-commits-parser@6.0.0: + resolution: {integrity: sha512-TbsINLp48XeMXR8EvGjTnKGsZqBemisPoyWESlpRyR8lif0lcwzqz+NMtYSj1ooF/WYjSuu7wX0CtdeeMEQAmA==} + engines: {node: '>=18'} + hasBin: true + + conventional-recommended-bump@10.0.0: + resolution: {integrity: sha512-RK/fUnc2btot0oEVtrj3p2doImDSs7iiz/bftFCDzels0Qs1mxLghp+DFHMaOC0qiCI6sWzlTDyBFSYuot6pRA==} + engines: {node: '>=18'} + hasBin: true + + core-js-compat@3.40.0: + resolution: {integrity: sha512-0XEDpr5y5mijvw8Lbc6E5AkjrHfp7eEoPlu36SWeAbcL8fn1G1ANe8DBlo2XoNN89oVpxWwOjYIPVzR4ZvsKCQ==} + + cross-env@7.0.3: + resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} + engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} + hasBin: true + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + damerau-levenshtein@1.0.8: + resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize@5.0.1: + resolution: {integrity: sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==} + engines: {node: '>=10'} + + decode-named-character-reference@1.0.2: + resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + diff@5.2.0: + resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + engines: {node: '>=0.3.1'} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + discord-api-types@0.37.119: + resolution: {integrity: sha512-WasbGFXEB+VQWXlo6IpW3oUv73Yuau1Ig4AZF/m13tXcTKnMpc/mHjpztIlz4+BM9FG9BHQkEXiPto3bKduQUg==} + + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + electron-to-chromium@1.5.90: + resolution: {integrity: sha512-C3PN4aydfW91Natdyd449Kw+BzhLmof6tzy5W1pFC5SpQxVXT+oyiyOG9AgYYSN9OdA/ik3YkCrpwqI8ug5Tug==} + + emoji-regex@10.4.0: + resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + enhanced-resolve@5.18.0: + resolution: {integrity: sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==} + engines: {node: '>=10.13.0'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + err-code@2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-abstract@1.23.9: + resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-iterator-helpers@1.2.1: + resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} + engines: {node: '>= 0.4'} + + es-module-lexer@1.6.0: + resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.0.2: + resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + + esbuild-plugin-version-injector@1.2.1: + resolution: {integrity: sha512-OKrLqniWutFlv36lKm2lIhJS1L5hncmbC4NXWjEt2a4bcMuyZ5TcZ/idUpH1Vju5FVlGX122cYcRhkMxHlq5GA==} + engines: {node: '>=v14.0.0', npm: '>=7.0.0'} + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.24.2: + resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-compat-utils@0.5.1: + resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==} + engines: {node: '>=12'} + peerDependencies: + eslint: '>=6.0.0' + + eslint-config-neon@0.1.62: + resolution: {integrity: sha512-zOXnVRkzos+zVu99O+nqVTu/1rjzsknz/Z+x+he937MwHAFnRohofOqaqLDAslK15NGnEDiQ+J4bqoD2oWtA2A==} + engines: {node: '>=16.0.0'} + + eslint-config-prettier@9.1.0: + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-etc@5.2.1: + resolution: {integrity: sha512-lFJBSiIURdqQKq9xJhvSJFyPA+VeTh5xvk24e8pxVL7bwLBtGF60C/KRkLTMrvCZ6DA3kbPuYhLWY0TZMlqTsg==} + peerDependencies: + eslint: ^8.0.0 + typescript: '>=4.0.0' + + eslint-formatter-pretty@6.0.1: + resolution: {integrity: sha512-znAUcXmBthdIUmlnRkPSxz3zSJHFUhfHF/nJPcCMVKg/mOa4yUie2Olqg1Ghbi5JJRBZVU3rIgzWSObvIspxMA==} + engines: {node: '>=18'} + + eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + + eslint-import-resolver-typescript@3.7.0: + resolution: {integrity: sha512-Vrwyi8HHxY97K5ebydMtffsWAn1SCR9eol49eCd5fJS4O1WV7PaAjbcjmbfJJSMz/t4Mal212Uz/fQZrOB8mow==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + eslint-plugin-import-x: '*' + peerDependenciesMeta: + eslint-plugin-import: + optional: true + eslint-plugin-import-x: + optional: true + + eslint-mdx@3.1.5: + resolution: {integrity: sha512-ynztX0k7CQ3iDL7fDEIeg3g0O/d6QPv7IBI9fdYLhXp5fAp0fi8X22xF/D3+Pk0f90R27uwqa1clHpay6t0l8Q==} + engines: {node: '>=18.0.0'} + peerDependencies: + eslint: '>=8.0.0' + + eslint-module-utils@2.12.0: + resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + + eslint-plugin-astro@0.33.1: + resolution: {integrity: sha512-wVyxAf8Ulmljv5qJQLgspWe17LR4hLXcksIENtUlEC3W7rleBVEKXS+hIqzBfCbpkBLZpl1tsYes1AGpYHd13w==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '>=7.0.0' + + eslint-plugin-cypress@2.15.2: + resolution: {integrity: sha512-CtcFEQTDKyftpI22FVGpx8bkpKyYXBlNge6zSo0pl5/qJvBAnzaD76Vu2AsP16d6mTj478Ldn2mhgrWV+Xr0vQ==} + peerDependencies: + eslint: '>= 3.2.1' + + eslint-plugin-es-x@7.8.0: + resolution: {integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '>=8' + + eslint-plugin-i@2.29.1: + resolution: {integrity: sha512-ORizX37MelIWLbMyqI7hi8VJMf7A0CskMmYkB+lkCX3aF4pkGV7kwx5bSEb4qx7Yce2rAf9s34HqDRPjGRZPNQ==} + engines: {node: '>=12'} + peerDependencies: + eslint: ^7.2.0 || ^8 + + eslint-plugin-jsdoc@48.11.0: + resolution: {integrity: sha512-d12JHJDPNo7IFwTOAItCeJY1hcqoIxE0lHA8infQByLilQ9xkqrRa6laWCnsuCrf+8rUnvxXY1XuTbibRBNylA==} + engines: {node: '>=18'} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 + + eslint-plugin-jsx-a11y@6.10.2: + resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==} + engines: {node: '>=4.0'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 + + eslint-plugin-markdown@3.0.1: + resolution: {integrity: sha512-8rqoc148DWdGdmYF6WSQFT3uQ6PO7zXYgeBpHAOAakX/zpq+NvFYbDA/H7PYzHajwtmaOzAwfxyl++x0g1/N9A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + + eslint-plugin-mdx@3.1.5: + resolution: {integrity: sha512-lUE7tP7IrIRHU3gTtASDe5u4YM2SvQveYVJfuo82yn3MLh/B/v05FNySURCK4aIxIYF1QYo3IRemQG/lyQzpAg==} + engines: {node: '>=18.0.0'} + peerDependencies: + eslint: '>=8.0.0' + + eslint-plugin-n@16.6.2: + resolution: {integrity: sha512-6TyDmZ1HXoFQXnhCTUjVFULReoBPOAjpuiKELMkeP40yffI/1ZRO+d9ug/VC6fqISo2WkuIBk3cvuRPALaWlOQ==} + engines: {node: '>=16.0.0'} + peerDependencies: + eslint: '>=7.0.0' + + eslint-plugin-promise@6.6.0: + resolution: {integrity: sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 + + eslint-plugin-react-hooks@4.6.2: + resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + + eslint-plugin-react@7.37.4: + resolution: {integrity: sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + + eslint-plugin-rxjs-angular@2.0.1: + resolution: {integrity: sha512-HJ/JHhjDJKyFUmM8o7rS91WNkNv7W7Z/okR5X3hqG7tKVMLOJi4T63Aa74ECuCdowmdfW75p2RrW4R8WeoZIKQ==} + peerDependencies: + eslint: ^8.0.0 + typescript: '>=4.0.0' + + eslint-plugin-rxjs@5.0.3: + resolution: {integrity: sha512-fcVkqLmYLRfRp+ShafjpUKuaZ+cw/sXAvM5dfSxiEr7M28QZ/NY7vaOr09FB4rSaZsQyLBnNPh5SL+4EgKjh8Q==} + peerDependencies: + eslint: ^8.0.0 + typescript: '>=4.0.0' + + eslint-plugin-sonarjs@0.25.1: + resolution: {integrity: sha512-5IOKvj/GMBNqjxBdItfotfRHo7w48496GOu1hxdeXuD0mB1JBlDCViiLHETDTfA8pDAVSBimBEQoetRXYceQEw==} + engines: {node: '>=16'} + peerDependencies: + eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + + eslint-plugin-svelte3@4.0.0: + resolution: {integrity: sha512-OIx9lgaNzD02+MDFNLw0GEUbuovNcglg+wnd/UY0fbZmlQSz7GlQiQ1f+yX0XvC07XPcDOnFcichqI3xCwp71g==} + peerDependencies: + eslint: '>=8.0.0' + svelte: ^3.2.0 + + eslint-plugin-tsdoc@0.2.17: + resolution: {integrity: sha512-xRmVi7Zx44lOBuYqG8vzTXuL6IdGOeF9nHX17bjJ8+VE6fsxpdGem0/SBTmAwgYMKYB1WBkqRJVQ+n8GK041pA==} + + eslint-plugin-typescript-sort-keys@3.3.0: + resolution: {integrity: sha512-bRW3Rc/VNdrSP9OoY5wgjjaXCOOkZKpzvl/Mk6l8Sg8CMehVIcg9K4y33l+ZcZiknpl0aR6rKusxuCJNGZWmVw==} + engines: {node: '>= 16'} + peerDependencies: + '@typescript-eslint/parser': '>=6' + eslint: ^7 || ^8 + typescript: ^3 || ^4 || ^5 + + eslint-plugin-unicorn@52.0.0: + resolution: {integrity: sha512-1Yzm7/m+0R4djH0tjDjfVei/ju2w3AzUGjG6q8JnuNIL5xIwsflyCooW5sfBvQp2pMYQFSWWCFONsjCax1EHng==} + engines: {node: '>=16'} + peerDependencies: + eslint: '>=8.56.0' + + eslint-plugin-vue@9.32.0: + resolution: {integrity: sha512-b/Y05HYmnB/32wqVcjxjHZzNpwxj1onBOvqW89W+V+XNG1dRuaFbNd3vT9CLbr2LXjEoq+3vn8DanWf7XU22Ug==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 + + eslint-rule-docs@1.1.235: + resolution: {integrity: sha512-+TQ+x4JdTnDoFEXXb3fDvfGOwnyNV7duH8fXWTPD1ieaBmB8omj7Gw/pMBBu4uI2uJCCU8APDaQJzWuXnTsH4A==} + + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-scope@8.2.0: + resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.2.0: + resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@8.57.1: + resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + hasBin: true + + espree@10.3.0: + resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + + estree-util-visit@2.0.0: + resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + + execa@9.5.2: + resolution: {integrity: sha512-EHlpxMCpHWSAh1dgS6bVeoLAXGnJNdR93aabr4QCGbzOM73o5XmRfM/e5FUqsw3aagP8S8XEWUWFAxnRBnAF0Q==} + engines: {node: ^18.19.0 || >=20.5.0} + + expect-type@1.1.0: + resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==} + engines: {node: '>=12.0.0'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + fast-content-type-parse@2.0.1: + resolution: {integrity: sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fastq@1.19.0: + resolution: {integrity: sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==} + + fdir@6.4.3: + resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + figures@6.1.0: + resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} + engines: {node: '>=18'} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flatted@3.3.2: + resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} + + for-each@0.3.4: + resolution: {integrity: sha512-kKaIINnFpzW6ffJNDjjyjrk21BkDx38c0xa/klsT8VzLCaMEefv4ZTacrcVR4DmgTeBra++jMDAfS/tS799YDw==} + engines: {node: '>= 0.4'} + + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + engines: {node: '>=14'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-east-asian-width@1.3.0: + resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==} + engines: {node: '>=18'} + + get-intrinsic@1.2.7: + resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + + get-stream@9.0.1: + resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} + engines: {node: '>=18'} + + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.10.0: + resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} + + git-cliff-darwin-arm64@2.8.0: + resolution: {integrity: sha512-rurUV2d1Z2n+c2+wUrO0gZaFb3c1G+ej0bPfKTPfde/CblxiysMkh+4dz23NrVbc8IlS5rSYv/JFGVaVSBNJRw==} + cpu: [arm64] + os: [darwin] + + git-cliff-darwin-x64@2.8.0: + resolution: {integrity: sha512-Wtj+FGWZBWmeYUAGlkfz7QPz4+VVxxDPMhQ/7iwKVA3iryIX0slGfzYpqMurEFnTAMr0r+4IU3Q4O/ib7iUscg==} + cpu: [x64] + os: [darwin] + + git-cliff-linux-arm64@2.8.0: + resolution: {integrity: sha512-k4RdfMdORXyefznWlQb+7wDgo7XgQF9qg8hJC34bwyJK2sODirrGau3uTx1/9Fi37g+pAOM7wM+LYppHCTZ2bQ==} + cpu: [arm64] + os: [linux] + + git-cliff-linux-x64@2.8.0: + resolution: {integrity: sha512-FcWX4GHgodYrQlZR03fzooanStgR03JNWvyaMQB1asplQ18nlziK2UyA+PESCIxOQmeLXauqoCApfzmdtp5myg==} + cpu: [x64] + os: [linux] + + git-cliff-windows-arm64@2.8.0: + resolution: {integrity: sha512-GJSrqmBVTbMtBJI3/YCDxLviZZDgYgnKqYgquBk2u2AELAnnuWFnVFQ7ZEBUqgFF2UJu9EdV2Nv6MV8d/wnP0g==} + cpu: [arm64] + os: [win32] + + git-cliff-windows-x64@2.8.0: + resolution: {integrity: sha512-8jl0YMXPYjUmVygUEeQ4wf1zte3Rv8LPq1sIklUKl80XE4g2Gm/8EIWbKpUPLQH6IncRwepY6VuMgpVpPXbwNw==} + cpu: [x64] + os: [win32] + + git-cliff@2.8.0: + resolution: {integrity: sha512-iKF5QTXAb9+iVvmu5HpnMPWYw7fs74xkpAaRbSf29+dZaMTTNRIUST/y+Ir2S1bDUWWJNjXlwT9ZT62JuYLQnA==} + engines: {node: '>=18.19 || >=20.6 || >=21'} + hasBin: true + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@10.3.10: + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globals@15.14.0: + resolution: {integrity: sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==} + engines: {node: '>=18'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + + hosted-git-info@7.0.2: + resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} + engines: {node: ^16.14.0 || >=18.0.0} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + human-signals@8.0.0: + resolution: {integrity: sha512-/1/GPCpDUCCYwlERiYjxoczfP0zfvZMU/OWgQPMya9AbAE24vseigFdhAMObpc8Q4lc/kjutPfUddDYyAmejnA==} + engines: {node: '>=18.18.0'} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + ignore@6.0.2: + resolution: {integrity: sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==} + engines: {node: '>= 4'} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + import-meta-resolve@4.1.0: + resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@4.1.3: + resolution: {integrity: sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + + irregular-plurals@3.5.0: + resolution: {integrity: sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ==} + engines: {node: '>=8'} + + is-alphabetical@1.0.4: + resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} + + is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + is-alphanumerical@1.0.4: + resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} + + is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + + is-boolean-object@1.2.1: + resolution: {integrity: sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==} + engines: {node: '>= 0.4'} + + is-builtin-module@3.2.1: + resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} + engines: {node: '>=6'} + + is-bun-module@1.3.0: + resolution: {integrity: sha512-DgXeu5UWI0IsMQundYb5UAOzm6G2eVnarJ0byP6Tm55iZNKceD59LNPA2L4VvsScTtHcw0yEkVwSf7PC+QoLSA==} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + + is-decimal@1.0.4: + resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} + + is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + + is-empty@1.2.0: + resolution: {integrity: sha512-F2FnH/otLNJv0J6wc73A5Xo7oHLNnqplYqZhUu01tD54DIPvxIRSTSLkrUB/M0nHO4vo1O9PDfN4KoTxCzLh/w==} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-function@1.1.0: + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-hexadecimal@1.0.4: + resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} + + is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-stream@4.0.1: + resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} + engines: {node: '>=18'} + + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.1.0: + resolution: {integrity: sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isexe@3.1.1: + resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} + engines: {node: '>=16'} + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@5.0.6: + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} + engines: {node: '>=10'} + + istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} + + iterator.prototype@1.1.5: + resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} + engines: {node: '>= 0.4'} + + jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jju@1.4.0: + resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + + joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsdoc-type-pratt-parser@4.0.0: + resolution: {integrity: sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==} + engines: {node: '>=12.0.0'} + + jsesc@0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-parse-even-better-errors@3.0.2: + resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + language-subtag-registry@0.3.23: + resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} + + language-tags@1.0.9: + resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} + engines: {node: '>=0.10'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + lines-and-columns@2.0.4: + resolution: {integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + load-plugin@6.0.3: + resolution: {integrity: sha512-kc0X2FEUZr145odl68frm+lMJuQ23+rTXYmR6TImqPtbpmXC4vVXbWKDQ9IzndA0HfyQamWfKLhzsqGSTxE63w==} + + load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-symbols@6.0.0: + resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} + engines: {node: '>=18'} + + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + loupe@3.1.3: + resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + magic-bytes.js@1.10.0: + resolution: {integrity: sha512-/k20Lg2q8LE5xiaaSkMXk4sfvI+9EGEykFS4b0CHHGWqDYU0bGUFSwchNOMA56D7TCs9GwVTkqe9als1/ns8UQ==} + + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + + magicast@0.3.5: + resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + mdast-util-from-markdown@0.8.5: + resolution: {integrity: sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==} + + mdast-util-from-markdown@2.0.2: + resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} + + mdast-util-mdx-expression@2.0.1: + resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} + + mdast-util-mdx-jsx@3.2.0: + resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==} + + mdast-util-mdx@3.0.0: + resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} + + mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + + mdast-util-to-string@2.0.0: + resolution: {integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + + meow@13.2.0: + resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} + engines: {node: '>=18'} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromark-core-commonmark@2.0.2: + resolution: {integrity: sha512-FKjQKbxd1cibWMM1P9N+H8TwlgGgSkWZMmfuVucLCHaYqeSvJ0hFeHsIa65pA2nYbes0f8LDHPMrd9X7Ujxg9w==} + + micromark-extension-mdx-expression@3.0.0: + resolution: {integrity: sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==} + + micromark-extension-mdx-jsx@3.0.1: + resolution: {integrity: sha512-vNuFb9czP8QCtAQcEJn0UJQJZA8Dk6DXKBqx+bg/w0WGuSxDxNr7hErW89tHUY31dUW4NqEOWwmEUNhjTFmHkg==} + + micromark-extension-mdx-md@2.0.0: + resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} + + micromark-extension-mdxjs-esm@3.0.0: + resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==} + + micromark-extension-mdxjs@3.0.0: + resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} + + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + + micromark-factory-mdx-expression@2.0.2: + resolution: {integrity: sha512-5E5I2pFzJyg2CtemqAbcyCktpHXuJbABnsb32wX2U8IQKhhVFBqkcZR5LRm1WVoFqa4kTueZK4abep7wdo9nrw==} + + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-events-to-acorn@2.0.2: + resolution: {integrity: sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==} + + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-subtokenize@2.0.4: + resolution: {integrity: sha512-N6hXjrin2GTJDe3MVjf5FuXpm12PGm80BrUAeub9XFXca8JZbP+oIwY4LJSVwFUCL1IPm/WwSVUN7goFHmSGGQ==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.1: + resolution: {integrity: sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==} + + micromark@2.11.4: + resolution: {integrity: sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==} + + micromark@4.0.1: + resolution: {integrity: sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nanoid@3.3.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare-lite@1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + + nopt@7.2.1: + resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + + normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + + normalize-package-data@6.0.2: + resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} + engines: {node: ^16.14.0 || >=18.0.0} + + npm-install-checks@6.3.0: + resolution: {integrity: sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-normalize-package-bin@3.0.1: + resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-package-arg@11.0.3: + resolution: {integrity: sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==} + engines: {node: ^16.14.0 || >=18.0.0} + + npm-pick-manifest@9.1.0: + resolution: {integrity: sha512-nkc+3pIIhqHVQr085X9d2JzPzLyjzQS96zbruppqC9aZRm/x8xx6xhI98gHtsfELP2bE+loHq8ZaHFHhe+NauA==} + engines: {node: ^16.14.0 || >=18.0.0} + + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + npm-run-path@6.0.0: + resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} + engines: {node: '>=18'} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.3: + resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + object.entries@1.1.8: + resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + + object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} + engines: {node: '>= 0.4'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-entities@2.0.0: + resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} + + parse-entities@4.0.2: + resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + + parse-imports@2.2.1: + resolution: {integrity: sha512-OL/zLggRp8mFhKL0rNORUTR4yBYujK/uU+xZL+/0Rgm2QE4nLO9v8PzEweSJEbMGKmDRjJE4R3IMJlL2di4JeQ==} + engines: {node: '>= 18'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse-json@7.1.1: + resolution: {integrity: sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==} + engines: {node: '>=16'} + + parse-ms@4.0.0: + resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} + engines: {node: '>=18'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + + pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + plur@5.1.0: + resolution: {integrity: sha512-VP/72JeXqak2KiOzjgKtQen5y3IZHn+9GOuLDafPv0eXa47xq0At93XahYBs26MsifCQ4enGKwbjBTKgb9QJXg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + + possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + + postcss-load-config@6.0.1: + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} + peerDependencies: + jiti: '>=1.21.0' + postcss: '>=8.0.9' + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + jiti: + optional: true + postcss: + optional: true + tsx: + optional: true + yaml: + optional: true + + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + + postcss@8.5.1: + resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier@3.4.2: + resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==} + engines: {node: '>=14'} + hasBin: true + + pretty-ms@9.2.0: + resolution: {integrity: sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==} + engines: {node: '>=18'} + + proc-log@4.2.0: + resolution: {integrity: sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + promise-inflight@1.0.1: + resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} + peerDependencies: + bluebird: '*' + peerDependenciesMeta: + bluebird: + optional: true + + promise-retry@2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + read-package-json-fast@3.0.2: + resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + + read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@4.1.1: + resolution: {integrity: sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==} + engines: {node: '>= 14.18.0'} + + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + + regexp-tree@0.1.27: + resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} + hasBin: true + + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + + regjsparser@0.10.0: + resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==} + hasBin: true + + remark-mdx@3.1.0: + resolution: {integrity: sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA==} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + requireindex@1.2.0: + resolution: {integrity: sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==} + engines: {node: '>=0.10.5'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve@1.19.0: + resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==} + + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + + resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + hasBin: true + + retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rollup@4.34.0: + resolution: {integrity: sha512-+4C/cgJ9w6sudisA0nZz0+O7lTP9a3CzNLsoDwaRumM8QHwghUsu6tqHXiTmNUp/rqNiM14++7dkzHDyCRs0Jg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rxjs-report-usage@1.0.6: + resolution: {integrity: sha512-omv1DIv5z1kV+zDAEjaDjWSkx8w5TbFp5NZoPwUipwzYVcor/4So9ZU3bUyQ1c8lxY5Q0Es/ztWW7PGjY7to0Q==} + hasBin: true + + sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.0: + resolution: {integrity: sha512-DrfFnPzblFmNrIZzg5RzHegbiRWg7KMR7btwi2yjHwx06zsUbO5g613sVwEV7FTwmzJu+Io0lJe2GJ3LxqpvBQ==} + engines: {node: '>=10'} + hasBin: true + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slashes@3.0.12: + resolution: {integrity: sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA==} + + smol-toml@1.3.1: + resolution: {integrity: sha512-tEYNll18pPKHroYSmLLrksq233j021G0giwW7P3D24jC54pQ5W5BXMsQ/Mvw1OJCmEYDgY+lrzT+3nNUtoNfXQ==} + engines: {node: '>= 18'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map@0.8.0-beta.0: + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} + engines: {node: '>= 8'} + + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-expression-parse@4.0.0: + resolution: {integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==} + + spdx-license-ids@3.0.21: + resolution: {integrity: sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==} + + stable-hash@0.0.4: + resolution: {integrity: sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + std-env@3.8.0: + resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string-width@6.1.0: + resolution: {integrity: sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ==} + engines: {node: '>=16'} + + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + + string.prototype.includes@2.0.1: + resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==} + engines: {node: '>= 0.4'} + + string.prototype.matchall@4.0.12: + resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} + engines: {node: '>= 0.4'} + + string.prototype.repeat@1.0.0: + resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} + + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + strip-final-newline@4.0.0: + resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} + engines: {node: '>=18'} + + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@9.4.0: + resolution: {integrity: sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==} + engines: {node: '>=12'} + + supports-hyperlinks@3.1.0: + resolution: {integrity: sha512-2rn0BZ+/f7puLOHZm1HOJfwBggfaHXUpPUSSG/SWM4TWp5KCfmNYwnC3hruy2rZlMnmWZ+QAGpZfchu3f3695A==} + engines: {node: '>=14.18'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + svelte@3.59.2: + resolution: {integrity: sha512-vzSyuGr3eEoAtT/A6bmajosJZIUWySzY2CzB3w2pgPvnkUjGqlDnsNnA0PMO+mMAhuyMul6C2uuZzY6ELSkzyA==} + engines: {node: '>= 8'} + + synckit@0.9.2: + resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==} + engines: {node: ^14.18.0 || >=16.0.0} + + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + test-exclude@7.0.1: + resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} + engines: {node: '>=18'} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + + tinyglobby@0.2.10: + resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==} + engines: {node: '>=12.0.0'} + + tinypool@1.0.2: + resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@1.2.0: + resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} + engines: {node: '>=14.0.0'} + + tinyspy@3.0.2: + resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} + engines: {node: '>=14.0.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + + ts-api-utils@1.4.3: + resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tsup@8.3.6: + resolution: {integrity: sha512-XkVtlDV/58S9Ye0JxUUTcrQk4S+EqlOHKzg6Roa62rdjL1nGWNUstG0xgI4vanHdfIpjP448J8vlN0oK6XOJ5g==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + '@microsoft/api-extractor': ^7.36.0 + '@swc/core': ^1 + postcss: ^8.4.12 + typescript: '>=4.5.0' + peerDependenciesMeta: + '@microsoft/api-extractor': + optional: true + '@swc/core': + optional: true + postcss: + optional: true + typescript: + optional: true + + tsutils-etc@1.4.2: + resolution: {integrity: sha512-2Dn5SxTDOu6YWDNKcx1xu2YUy6PUeKrWZB/x2cQ8vY2+iz3JRembKn/iZ0JLT1ZudGNwQQvtFX9AwvRHbXuPUg==} + hasBin: true + peerDependencies: + tsutils: ^3.0.0 + typescript: '>=4.0.0' + + tsutils@3.21.0: + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + + turbo-darwin-64@2.4.0: + resolution: {integrity: sha512-kVMScnPUa3R4n7woNmkR15kOY0aUwCLJcUyH5UC59ggKqr5HIHwweKYK8N1pwBQso0LQF4I9i93hIzfJguCcwQ==} + cpu: [x64] + os: [darwin] + + turbo-darwin-arm64@2.4.0: + resolution: {integrity: sha512-8JObIpfun1guA7UlFR5jC/SOVm49lRscxMxfg5jZ5ABft79rhFC+ygN9AwAhGKv6W2DUhIh2xENkSgu4EDmUyg==} + cpu: [arm64] + os: [darwin] + + turbo-linux-64@2.4.0: + resolution: {integrity: sha512-xWDGGcRlBuGV7HXWAVuTY6vsQi4aZxGMAnuiuNDg8Ij1aHGohOM0RUsWMXjxz4vuJmjk9+/D6NQqHH3AJEXezg==} + cpu: [x64] + os: [linux] + + turbo-linux-arm64@2.4.0: + resolution: {integrity: sha512-c3En99xMguc/Pdtk/rZP53LnDdw0W6lgUc04he8r8F+UHYSNvgzHh0WGXXmCC6lGbBH72kPhhGx4bAwyvi7dug==} + cpu: [arm64] + os: [linux] + + turbo-windows-64@2.4.0: + resolution: {integrity: sha512-/gOORuOlyA8JDPzyA16CD3wvyRcuBFePa1URAnFUof9hXQmKxK0VvSDO79cYZFsJSchCKNJpckUS0gYxGsWwoA==} + cpu: [x64] + os: [win32] + + turbo-windows-arm64@2.4.0: + resolution: {integrity: sha512-/DJIdTFijEMM5LSiEpSfarDOMOlYqJV+EzmppqWtHqDsOLF4hbbIBH9sJR6OOp5dURAu5eURBYdmvBRz9Lo6TA==} + cpu: [arm64] + os: [win32] + + turbo@2.4.0: + resolution: {integrity: sha512-ah/yQp2oMif1X0u7fBJ4MLMygnkbKnW5O8SG6pJvloPCpHfFoZctkSVQiJ3VnvNTq71V2JJIdwmOeu1i34OQyg==} + hasBin: true + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + + type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + + type-fest@3.13.1: + resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} + engines: {node: '>=14.16'} + + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} + + typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + + typescript-eslint@7.18.0: + resolution: {integrity: sha512-PonBkP603E3tt05lDkbOMyaxJjvKqQrXsnow72sVeOFINDE/qNmnnd+f9b4N+U7W6MXnnYyrhtmF2t08QWwUbA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + typescript@5.5.4: + resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} + engines: {node: '>=14.17'} + hasBin: true + + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + + undici-types@6.20.0: + resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + + undici@6.19.8: + resolution: {integrity: sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g==} + engines: {node: '>=18.17'} + + unicorn-magic@0.3.0: + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} + engines: {node: '>=18'} + + unified-engine@11.2.2: + resolution: {integrity: sha512-15g/gWE7qQl9tQ3nAEbMd5h9HV1EACtFs6N9xaRBZICoCwnNGbal1kOs++ICf4aiTdItZxU2s/kYWhW7htlqJg==} + + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + + unist-util-inspect@8.1.0: + resolution: {integrity: sha512-mOlg8Mp33pR0eeFpo5d2902ojqFFOKMMG2hF8bmH7ZlhnmjFgh0NI3/ZDwdaBJNbvrS7LZFVrBVtIE9KZ9s7vQ==} + + unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + + unist-util-position-from-estree@2.0.0: + resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} + + unist-util-stringify-position@2.0.3: + resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + + universal-user-agent@7.0.2: + resolution: {integrity: sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==} + + update-browserslist-db@1.1.2: + resolution: {integrity: sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + uvu@0.5.6: + resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} + engines: {node: '>=8'} + hasBin: true + + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + + validate-npm-package-name@5.0.1: + resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + + vfile-reporter@8.1.1: + resolution: {integrity: sha512-qxRZcnFSQt6pWKn3PAk81yLK2rO2i7CDXpy8v8ZquiEOMLSnPw6BMSi9Y1sUCwGGl7a9b3CJT1CKpnRF7pp66g==} + + vfile-sort@4.0.0: + resolution: {integrity: sha512-lffPI1JrbHDTToJwcq0rl6rBmkjQmMuXkAxsZPRS9DXbaJQvc642eCg6EGxcX2i1L+esbuhq+2l9tBll5v8AeQ==} + + vfile-statistics@3.0.0: + resolution: {integrity: sha512-/qlwqwWBWFOmpXujL/20P+Iuydil0rZZNglR+VNm6J0gpLHwuVM5s7g2TfVoswbXjZ4HuIhLMySEyIw5i7/D8w==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + + vite-node@2.1.8: + resolution: {integrity: sha512-uPAwSr57kYjAUux+8E2j0q0Fxpn8M9VoyfGiRI8Kfktz9NcYMCenwY5RnZxnF1WTu3TGiYipirIzacLL3VVGFg==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + + vite@5.4.14: + resolution: {integrity: sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vitest@2.1.8: + resolution: {integrity: sha512-1vBKTZskHw/aosXqQUlVWWlGUxSJR8YtiyZDJAFeW2kPAeX6S3Sool0mjspO+kXLuxVWlEDDowBAeqeAQefqLQ==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 2.1.8 + '@vitest/ui': 2.1.8 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + vue-eslint-parser@9.4.3: + resolution: {integrity: sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '>=6.0.0' + + walk-up-path@3.0.1: + resolution: {integrity: sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==} + + webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + + whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.18: + resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + which@4.0.0: + resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} + engines: {node: ^16.13.0 || >=18.0.0} + hasBin: true + + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + xml-name-validator@4.0.0: + resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} + engines: {node: '>=12'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yaml@2.7.0: + resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==} + engines: {node: '>= 14'} + hasBin: true + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yoctocolors@2.1.1: + resolution: {integrity: sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==} + engines: {node: '>=18'} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + + '@angular-eslint/bundled-angular-compiler@17.5.3': {} + + '@angular-eslint/eslint-plugin-template@17.5.3(eslint@8.57.1)(typescript@5.5.4)': + dependencies: + '@angular-eslint/bundled-angular-compiler': 17.5.3 + '@angular-eslint/utils': 17.5.3(eslint@8.57.1)(typescript@5.5.4) + '@typescript-eslint/type-utils': 7.11.0(eslint@8.57.1)(typescript@5.5.4) + '@typescript-eslint/utils': 7.11.0(eslint@8.57.1)(typescript@5.5.4) + aria-query: 5.3.0 + axobject-query: 4.0.0 + eslint: 8.57.1 + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@angular-eslint/eslint-plugin@17.5.3(eslint@8.57.1)(typescript@5.5.4)': + dependencies: + '@angular-eslint/bundled-angular-compiler': 17.5.3 + '@angular-eslint/utils': 17.5.3(eslint@8.57.1)(typescript@5.5.4) + '@typescript-eslint/utils': 7.11.0(eslint@8.57.1)(typescript@5.5.4) + eslint: 8.57.1 + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@angular-eslint/template-parser@17.5.3(eslint@8.57.1)(typescript@5.5.4)': + dependencies: + '@angular-eslint/bundled-angular-compiler': 17.5.3 + eslint: 8.57.1 + eslint-scope: 8.2.0 + typescript: 5.5.4 + + '@angular-eslint/utils@17.5.3(eslint@8.57.1)(typescript@5.5.4)': + dependencies: + '@angular-eslint/bundled-angular-compiler': 17.5.3 + '@typescript-eslint/utils': 7.11.0(eslint@8.57.1)(typescript@5.5.4) + eslint: 8.57.1 + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@astrojs/compiler@2.10.3': {} + + '@babel/code-frame@7.26.2': + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/generator@7.26.5': + dependencies: + '@babel/parser': 7.26.7 + '@babel/types': 7.26.7 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.1.0 + + '@babel/helper-string-parser@7.25.9': {} + + '@babel/helper-validator-identifier@7.25.9': {} + + '@babel/parser@7.26.7': + dependencies: + '@babel/types': 7.26.7 + + '@babel/template@7.25.9': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.26.7 + '@babel/types': 7.26.7 + + '@babel/traverse@7.26.7': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.5 + '@babel/parser': 7.26.7 + '@babel/template': 7.25.9 + '@babel/types': 7.26.7 + debug: 4.4.0 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.26.7': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + + '@bcoe/v8-coverage@0.2.3': {} + + '@conventional-changelog/git-client@1.0.1(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.0.0)': + dependencies: + '@types/semver': 7.5.8 + semver: 7.7.0 + optionalDependencies: + conventional-commits-filter: 5.0.0 + conventional-commits-parser: 6.0.0 + + '@discordjs/collection@2.1.1': {} + + '@discordjs/rest@2.4.2': + dependencies: + '@discordjs/collection': 2.1.1 + '@discordjs/util': 1.1.1 + '@sapphire/async-queue': 1.5.5 + '@sapphire/snowflake': 3.5.5 + '@vladfrangu/async_event_emitter': 2.4.6 + discord-api-types: 0.37.119 + magic-bytes.js: 1.10.0 + tslib: 2.8.1 + undici: 6.19.8 + + '@discordjs/util@1.1.1': {} + + '@es-joy/jsdoccomment@0.46.0': + dependencies: + comment-parser: 1.4.1 + esquery: 1.6.0 + jsdoc-type-pratt-parser: 4.0.0 + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/aix-ppc64@0.24.2': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.24.2': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-arm@0.24.2': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/android-x64@0.24.2': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.24.2': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.24.2': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.24.2': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.24.2': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.24.2': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-arm@0.24.2': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.24.2': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.24.2': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.24.2': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.24.2': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.24.2': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.24.2': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/linux-x64@0.24.2': + optional: true + + '@esbuild/netbsd-arm64@0.24.2': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.24.2': + optional: true + + '@esbuild/openbsd-arm64@0.24.2': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.24.2': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.24.2': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.24.2': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.24.2': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@esbuild/win32-x64@0.24.2': + optional: true + + '@eslint-community/eslint-utils@4.4.1(eslint@8.57.1)': + dependencies: + eslint: 8.57.1 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.1': {} + + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.12.6 + debug: 4.4.0 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.2 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@8.57.1': {} + + '@favware/cliff-jumper@4.1.0': + dependencies: + '@favware/colorette-spinner': 1.0.1 + '@octokit/auth-token': 5.1.2 + '@octokit/core': 6.1.3 + '@octokit/plugin-retry': 7.1.3(@octokit/core@6.1.3) + '@sapphire/result': 2.7.2 + '@sapphire/utilities': 3.17.0 + colorette: 2.0.20 + commander: 12.1.0 + conventional-recommended-bump: 10.0.0 + execa: 9.5.2 + git-cliff: 2.8.0 + js-yaml: 4.1.0 + semver: 7.7.0 + smol-toml: 1.3.1 + + '@favware/colorette-spinner@1.0.1': + dependencies: + colorette: 2.0.20 + + '@humanwhocodes/config-array@0.13.0': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.4.0 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@istanbuljs/schema@0.1.3': {} + + '@jridgewell/gen-mapping@0.3.8': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@microsoft/tsdoc-config@0.16.2': + dependencies: + '@microsoft/tsdoc': 0.14.2 + ajv: 6.12.6 + jju: 1.4.0 + resolve: 1.19.0 + + '@microsoft/tsdoc@0.14.2': {} + + '@next/eslint-plugin-next@14.2.23': + dependencies: + glob: 10.3.10 + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.0 + + '@nolyfill/is-core-module@1.0.39': {} + + '@npmcli/config@8.3.4': + dependencies: + '@npmcli/map-workspaces': 3.0.6 + '@npmcli/package-json': 5.2.1 + ci-info: 4.1.0 + ini: 4.1.3 + nopt: 7.2.1 + proc-log: 4.2.0 + semver: 7.7.0 + walk-up-path: 3.0.1 + transitivePeerDependencies: + - bluebird + + '@npmcli/git@5.0.8': + dependencies: + '@npmcli/promise-spawn': 7.0.2 + ini: 4.1.3 + lru-cache: 10.4.3 + npm-pick-manifest: 9.1.0 + proc-log: 4.2.0 + promise-inflight: 1.0.1 + promise-retry: 2.0.1 + semver: 7.7.0 + which: 4.0.0 + transitivePeerDependencies: + - bluebird + + '@npmcli/map-workspaces@3.0.6': + dependencies: + '@npmcli/name-from-folder': 2.0.0 + glob: 10.4.5 + minimatch: 9.0.5 + read-package-json-fast: 3.0.2 + + '@npmcli/name-from-folder@2.0.0': {} + + '@npmcli/package-json@5.2.1': + dependencies: + '@npmcli/git': 5.0.8 + glob: 10.4.5 + hosted-git-info: 7.0.2 + json-parse-even-better-errors: 3.0.2 + normalize-package-data: 6.0.2 + proc-log: 4.2.0 + semver: 7.7.0 + transitivePeerDependencies: + - bluebird + + '@npmcli/promise-spawn@7.0.2': + dependencies: + which: 4.0.0 + + '@octokit/auth-token@5.1.2': {} + + '@octokit/core@6.1.3': + dependencies: + '@octokit/auth-token': 5.1.2 + '@octokit/graphql': 8.2.0 + '@octokit/request': 9.2.0 + '@octokit/request-error': 6.1.6 + '@octokit/types': 13.8.0 + before-after-hook: 3.0.2 + universal-user-agent: 7.0.2 + + '@octokit/endpoint@10.1.2': + dependencies: + '@octokit/types': 13.8.0 + universal-user-agent: 7.0.2 + + '@octokit/graphql@8.2.0': + dependencies: + '@octokit/request': 9.2.0 + '@octokit/types': 13.8.0 + universal-user-agent: 7.0.2 + + '@octokit/openapi-types@23.0.1': {} + + '@octokit/plugin-retry@7.1.3(@octokit/core@6.1.3)': + dependencies: + '@octokit/core': 6.1.3 + '@octokit/request-error': 6.1.6 + '@octokit/types': 13.8.0 + bottleneck: 2.19.5 + + '@octokit/request-error@6.1.6': + dependencies: + '@octokit/types': 13.8.0 + + '@octokit/request@9.2.0': + dependencies: + '@octokit/endpoint': 10.1.2 + '@octokit/request-error': 6.1.6 + '@octokit/types': 13.8.0 + fast-content-type-parse: 2.0.1 + universal-user-agent: 7.0.2 + + '@octokit/types@13.8.0': + dependencies: + '@octokit/openapi-types': 23.0.1 + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@pkgr/core@0.1.1': {} + + '@rollup/rollup-android-arm-eabi@4.34.0': + optional: true + + '@rollup/rollup-android-arm64@4.34.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.34.0': + optional: true + + '@rollup/rollup-darwin-x64@4.34.0': + optional: true + + '@rollup/rollup-freebsd-arm64@4.34.0': + optional: true + + '@rollup/rollup-freebsd-x64@4.34.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.34.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.34.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.34.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.34.0': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.34.0': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.34.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.34.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.34.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.34.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.34.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.34.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.34.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.34.0': + optional: true + + '@rushstack/eslint-patch@1.10.5': {} + + '@sapphire/async-queue@1.5.5': {} + + '@sapphire/result@2.7.2': {} + + '@sapphire/snowflake@3.5.5': {} + + '@sapphire/utilities@3.17.0': {} + + '@sec-ant/readable-stream@0.4.1': {} + + '@sindresorhus/merge-streams@4.0.0': {} + + '@types/acorn@4.0.6': + dependencies: + '@types/estree': 1.0.6 + + '@types/concat-stream@2.0.3': + dependencies: + '@types/node': 22.13.0 + + '@types/debug@4.1.12': + dependencies: + '@types/ms': 2.1.0 + + '@types/eslint@8.56.12': + dependencies: + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 + + '@types/estree-jsx@1.0.5': + dependencies: + '@types/estree': 1.0.6 + + '@types/estree@1.0.6': {} + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/is-empty@1.2.3': {} + + '@types/json-schema@7.0.15': {} + + '@types/mdast@3.0.15': + dependencies: + '@types/unist': 2.0.11 + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/ms@2.1.0': {} + + '@types/node@22.13.0': + dependencies: + undici-types: 6.20.0 + + '@types/normalize-package-data@2.4.4': {} + + '@types/semver@7.5.8': {} + + '@types/supports-color@8.1.3': {} + + '@types/unist@2.0.11': {} + + '@types/unist@3.0.3': {} + + '@types/yargs-parser@21.0.3': {} + + '@types/yargs@17.0.33': + dependencies: + '@types/yargs-parser': 21.0.3 + + '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1)(typescript@5.5.4)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.5.4) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.1)(typescript@5.5.4) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 7.18.0 + eslint: 8.57.1 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 1.4.3(typescript@5.5.4) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/experimental-utils@5.62.0(eslint@8.57.1)(typescript@5.5.4)': + dependencies: + '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.5.4) + eslint: 8.57.1 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4)': + dependencies: + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 7.18.0 + debug: 4.4.0 + eslint: 8.57.1 + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@5.62.0': + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + + '@typescript-eslint/scope-manager@7.11.0': + dependencies: + '@typescript-eslint/types': 7.11.0 + '@typescript-eslint/visitor-keys': 7.11.0 + + '@typescript-eslint/scope-manager@7.18.0': + dependencies: + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 + + '@typescript-eslint/type-utils@7.11.0(eslint@8.57.1)(typescript@5.5.4)': + dependencies: + '@typescript-eslint/typescript-estree': 7.11.0(typescript@5.5.4) + '@typescript-eslint/utils': 7.11.0(eslint@8.57.1)(typescript@5.5.4) + debug: 4.4.0 + eslint: 8.57.1 + ts-api-utils: 1.4.3(typescript@5.5.4) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/type-utils@7.18.0(eslint@8.57.1)(typescript@5.5.4)': + dependencies: + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.5.4) + debug: 4.4.0 + eslint: 8.57.1 + ts-api-utils: 1.4.3(typescript@5.5.4) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@5.62.0': {} + + '@typescript-eslint/types@7.11.0': {} + + '@typescript-eslint/types@7.18.0': {} + + '@typescript-eslint/typescript-estree@5.62.0(typescript@5.5.4)': + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + debug: 4.4.0 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.7.0 + tsutils: 3.21.0(typescript@5.5.4) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/typescript-estree@7.11.0(typescript@5.5.4)': + dependencies: + '@typescript-eslint/types': 7.11.0 + '@typescript-eslint/visitor-keys': 7.11.0 + debug: 4.4.0 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.0 + ts-api-utils: 1.4.3(typescript@5.5.4) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/typescript-estree@7.18.0(typescript@5.5.4)': + dependencies: + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 + debug: 4.4.0 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.0 + ts-api-utils: 1.4.3(typescript@5.5.4) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@5.62.0(eslint@8.57.1)(typescript@5.5.4)': + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.8 + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.5.4) + eslint: 8.57.1 + eslint-scope: 5.1.1 + semver: 7.7.0 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/utils@7.11.0(eslint@8.57.1)(typescript@5.5.4)': + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) + '@typescript-eslint/scope-manager': 7.11.0 + '@typescript-eslint/types': 7.11.0 + '@typescript-eslint/typescript-estree': 7.11.0(typescript@5.5.4) + eslint: 8.57.1 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@5.5.4)': + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) + eslint: 8.57.1 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/visitor-keys@5.62.0': + dependencies: + '@typescript-eslint/types': 5.62.0 + eslint-visitor-keys: 3.4.3 + + '@typescript-eslint/visitor-keys@7.11.0': + dependencies: + '@typescript-eslint/types': 7.11.0 + eslint-visitor-keys: 3.4.3 + + '@typescript-eslint/visitor-keys@7.18.0': + dependencies: + '@typescript-eslint/types': 7.18.0 + eslint-visitor-keys: 3.4.3 + + '@ungap/structured-clone@1.3.0': {} + + '@vitest/coverage-v8@2.1.8(vitest@2.1.8(@types/node@22.13.0))': + dependencies: + '@ampproject/remapping': 2.3.0 + '@bcoe/v8-coverage': 0.2.3 + debug: 4.4.0 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 5.0.6 + istanbul-reports: 3.1.7 + magic-string: 0.30.17 + magicast: 0.3.5 + std-env: 3.8.0 + test-exclude: 7.0.1 + tinyrainbow: 1.2.0 + vitest: 2.1.8(@types/node@22.13.0) + transitivePeerDependencies: + - supports-color + + '@vitest/expect@2.1.8': + dependencies: + '@vitest/spy': 2.1.8 + '@vitest/utils': 2.1.8 + chai: 5.1.2 + tinyrainbow: 1.2.0 + + '@vitest/mocker@2.1.8(vite@5.4.14(@types/node@22.13.0))': + dependencies: + '@vitest/spy': 2.1.8 + estree-walker: 3.0.3 + magic-string: 0.30.17 + optionalDependencies: + vite: 5.4.14(@types/node@22.13.0) + + '@vitest/pretty-format@2.1.8': + dependencies: + tinyrainbow: 1.2.0 + + '@vitest/runner@2.1.8': + dependencies: + '@vitest/utils': 2.1.8 + pathe: 1.1.2 + + '@vitest/snapshot@2.1.8': + dependencies: + '@vitest/pretty-format': 2.1.8 + magic-string: 0.30.17 + pathe: 1.1.2 + + '@vitest/spy@2.1.8': + dependencies: + tinyspy: 3.0.2 + + '@vitest/utils@2.1.8': + dependencies: + '@vitest/pretty-format': 2.1.8 + loupe: 3.1.3 + tinyrainbow: 1.2.0 + + '@vladfrangu/async_event_emitter@2.4.6': {} + + abbrev@2.0.0: {} + + acorn-jsx@5.3.2(acorn@8.14.0): + dependencies: + acorn: 8.14.0 + + acorn@8.14.0: {} + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-escapes@6.2.1: {} + + ansi-regex@5.0.1: {} + + ansi-regex@6.1.0: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} + + any-promise@1.3.0: {} + + are-docs-informative@0.0.2: {} + + argparse@2.0.1: {} + + aria-query@5.3.0: + dependencies: + dequal: 2.0.3 + + aria-query@5.3.2: {} + + array-buffer-byte-length@1.0.2: + dependencies: + call-bound: 1.0.3 + is-array-buffer: 3.0.5 + + array-includes@3.1.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 + get-intrinsic: 1.2.7 + is-string: 1.1.1 + + array-union@2.1.0: {} + + array.prototype.findlast@1.2.5: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.0.2 + + array.prototype.flat@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-shim-unscopables: 1.0.2 + + array.prototype.flatmap@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-shim-unscopables: 1.0.2 + + array.prototype.tosorted@1.1.4: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + es-shim-unscopables: 1.0.2 + + arraybuffer.prototype.slice@1.0.4: + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + is-array-buffer: 3.0.5 + + assertion-error@2.0.1: {} + + ast-types-flow@0.0.8: {} + + astro-eslint-parser@0.16.3: + dependencies: + '@astrojs/compiler': 2.10.3 + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + astrojs-compiler-sync: 0.3.5(@astrojs/compiler@2.10.3) + debug: 4.4.0 + entities: 4.5.0 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + semver: 7.7.0 + transitivePeerDependencies: + - supports-color + + astrojs-compiler-sync@0.3.5(@astrojs/compiler@2.10.3): + dependencies: + '@astrojs/compiler': 2.10.3 + synckit: 0.9.2 + + async-function@1.0.0: {} + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.0.0 + + axe-core@4.10.2: {} + + axobject-query@4.0.0: + dependencies: + dequal: 2.0.3 + + axobject-query@4.1.0: {} + + bail@2.0.2: {} + + balanced-match@1.0.2: {} + + before-after-hook@3.0.2: {} + + bent@7.3.12: + dependencies: + bytesish: 0.4.4 + caseless: 0.12.0 + is-stream: 2.0.1 + + boolbase@1.0.0: {} + + bottleneck@2.19.5: {} + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.24.4: + dependencies: + caniuse-lite: 1.0.30001696 + electron-to-chromium: 1.5.90 + node-releases: 2.0.19 + update-browserslist-db: 1.1.2(browserslist@4.24.4) + + buffer-from@1.1.2: {} + + builtin-modules@3.3.0: {} + + builtins@5.1.0: + dependencies: + semver: 7.7.0 + + bundle-require@5.1.0(esbuild@0.24.2): + dependencies: + esbuild: 0.24.2 + load-tsconfig: 0.2.5 + + bytesish@0.4.4: {} + + cac@6.7.14: {} + + call-bind-apply-helpers@1.0.1: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-define-property: 1.0.1 + get-intrinsic: 1.2.7 + set-function-length: 1.2.2 + + call-bound@1.0.3: + dependencies: + call-bind-apply-helpers: 1.0.1 + get-intrinsic: 1.2.7 + + callsites@3.1.0: {} + + caniuse-lite@1.0.30001696: {} + + caseless@0.12.0: {} + + ccount@2.0.1: {} + + chai@5.1.2: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.3 + pathval: 2.0.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@5.4.1: {} + + character-entities-html4@2.1.0: {} + + character-entities-legacy@1.1.4: {} + + character-entities-legacy@3.0.0: {} + + character-entities@1.2.4: {} + + character-entities@2.0.2: {} + + character-reference-invalid@1.1.4: {} + + character-reference-invalid@2.0.1: {} + + check-error@2.1.1: {} + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.1 + + ci-info@4.1.0: {} + + clean-regexp@1.0.0: + dependencies: + escape-string-regexp: 1.0.5 + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + colorette@2.0.20: {} + + commander@12.1.0: {} + + commander@4.1.1: {} + + comment-parser@1.4.1: {} + + common-tags@1.8.2: {} + + concat-map@0.0.1: {} + + concat-stream@2.0.0: + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.2 + typedarray: 0.0.6 + + consola@3.4.0: {} + + conventional-changelog-preset-loader@5.0.0: {} + + conventional-commits-filter@5.0.0: {} + + conventional-commits-parser@6.0.0: + dependencies: + meow: 13.2.0 + + conventional-recommended-bump@10.0.0: + dependencies: + '@conventional-changelog/git-client': 1.0.1(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.0.0) + conventional-changelog-preset-loader: 5.0.0 + conventional-commits-filter: 5.0.0 + conventional-commits-parser: 6.0.0 + meow: 13.2.0 + + core-js-compat@3.40.0: + dependencies: + browserslist: 4.24.4 + + cross-env@7.0.3: + dependencies: + cross-spawn: 7.0.6 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + cssesc@3.0.0: {} + + damerau-levenshtein@1.0.8: {} + + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + debug@3.2.7: + dependencies: + ms: 2.1.3 + + debug@4.4.0: + dependencies: + ms: 2.1.3 + + decamelize@5.0.1: {} + + decode-named-character-reference@1.0.2: + dependencies: + character-entities: 2.0.2 + + deep-eql@5.0.2: {} + + deep-is@0.1.4: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + dequal@2.0.3: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + diff@5.2.0: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + discord-api-types@0.37.119: {} + + doctrine@2.1.0: + dependencies: + esutils: 2.0.3 + + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + eastasianwidth@0.2.0: {} + + electron-to-chromium@1.5.90: {} + + emoji-regex@10.4.0: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + enhanced-resolve@5.18.0: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + + entities@4.5.0: {} + + err-code@2.0.3: {} + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + es-abstract@1.23.9: + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.2.7 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-regex: 1.2.1 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.0 + math-intrinsics: 1.1.0 + object-inspect: 1.13.3 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.18 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-iterator-helpers@1.2.1: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + es-set-tostringtag: 2.1.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.7 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + iterator.prototype: 1.1.5 + safe-array-concat: 1.1.3 + + es-module-lexer@1.6.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es-shim-unscopables@1.0.2: + dependencies: + hasown: 2.0.2 + + es-to-primitive@1.3.0: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + + esbuild-plugin-version-injector@1.2.1: + dependencies: + '@sapphire/result': 2.7.2 + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + esbuild@0.24.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.24.2 + '@esbuild/android-arm': 0.24.2 + '@esbuild/android-arm64': 0.24.2 + '@esbuild/android-x64': 0.24.2 + '@esbuild/darwin-arm64': 0.24.2 + '@esbuild/darwin-x64': 0.24.2 + '@esbuild/freebsd-arm64': 0.24.2 + '@esbuild/freebsd-x64': 0.24.2 + '@esbuild/linux-arm': 0.24.2 + '@esbuild/linux-arm64': 0.24.2 + '@esbuild/linux-ia32': 0.24.2 + '@esbuild/linux-loong64': 0.24.2 + '@esbuild/linux-mips64el': 0.24.2 + '@esbuild/linux-ppc64': 0.24.2 + '@esbuild/linux-riscv64': 0.24.2 + '@esbuild/linux-s390x': 0.24.2 + '@esbuild/linux-x64': 0.24.2 + '@esbuild/netbsd-arm64': 0.24.2 + '@esbuild/netbsd-x64': 0.24.2 + '@esbuild/openbsd-arm64': 0.24.2 + '@esbuild/openbsd-x64': 0.24.2 + '@esbuild/sunos-x64': 0.24.2 + '@esbuild/win32-arm64': 0.24.2 + '@esbuild/win32-ia32': 0.24.2 + '@esbuild/win32-x64': 0.24.2 + + escalade@3.2.0: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@4.0.0: {} + + eslint-compat-utils@0.5.1(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + semver: 7.7.0 + + eslint-config-neon@0.1.62(eslint@8.57.1)(svelte@3.59.2)(typescript@5.5.4): + dependencies: + '@angular-eslint/eslint-plugin': 17.5.3(eslint@8.57.1)(typescript@5.5.4) + '@angular-eslint/eslint-plugin-template': 17.5.3(eslint@8.57.1)(typescript@5.5.4) + '@angular-eslint/template-parser': 17.5.3(eslint@8.57.1)(typescript@5.5.4) + '@next/eslint-plugin-next': 14.2.23 + '@rushstack/eslint-patch': 1.10.5 + '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1)(typescript@5.5.4) + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.5.4) + astro-eslint-parser: 0.16.3 + eslint-config-prettier: 9.1.0(eslint@8.57.1) + eslint-import-resolver-typescript: 3.7.0(eslint-plugin-i@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1))(eslint@8.57.1) + eslint-mdx: 3.1.5(eslint@8.57.1) + eslint-plugin-astro: 0.33.1(eslint@8.57.1) + eslint-plugin-cypress: 2.15.2(eslint@8.57.1) + eslint-plugin-import: eslint-plugin-i@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1) + eslint-plugin-jsdoc: 48.11.0(eslint@8.57.1) + eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1) + eslint-plugin-mdx: 3.1.5(eslint@8.57.1) + eslint-plugin-n: 16.6.2(eslint@8.57.1) + eslint-plugin-promise: 6.6.0(eslint@8.57.1) + eslint-plugin-react: 7.37.4(eslint@8.57.1) + eslint-plugin-react-hooks: 4.6.2(eslint@8.57.1) + eslint-plugin-rxjs: 5.0.3(eslint@8.57.1)(typescript@5.5.4) + eslint-plugin-rxjs-angular: 2.0.1(eslint@8.57.1)(typescript@5.5.4) + eslint-plugin-sonarjs: 0.25.1(eslint@8.57.1) + eslint-plugin-svelte3: 4.0.0(eslint@8.57.1)(svelte@3.59.2) + eslint-plugin-tsdoc: 0.2.17 + eslint-plugin-typescript-sort-keys: 3.3.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1)(typescript@5.5.4) + eslint-plugin-unicorn: 52.0.0(eslint@8.57.1) + eslint-plugin-vue: 9.32.0(eslint@8.57.1) + globals: 15.14.0 + typescript-eslint: 7.18.0(eslint@8.57.1)(typescript@5.5.4) + vue-eslint-parser: 9.4.3(eslint@8.57.1) + transitivePeerDependencies: + - bluebird + - eslint + - eslint-import-resolver-webpack + - eslint-plugin-import-x + - supports-color + - svelte + - typescript + + eslint-config-prettier@9.1.0(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + + eslint-etc@5.2.1(eslint@8.57.1)(typescript@5.5.4): + dependencies: + '@typescript-eslint/experimental-utils': 5.62.0(eslint@8.57.1)(typescript@5.5.4) + eslint: 8.57.1 + tsutils: 3.21.0(typescript@5.5.4) + tsutils-etc: 1.4.2(tsutils@3.21.0(typescript@5.5.4))(typescript@5.5.4) + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + eslint-formatter-pretty@6.0.1: + dependencies: + '@types/eslint': 8.56.12 + ansi-escapes: 6.2.1 + chalk: 5.4.1 + eslint-rule-docs: 1.1.235 + log-symbols: 6.0.0 + plur: 5.1.0 + string-width: 7.2.0 + supports-hyperlinks: 3.1.0 + + eslint-import-resolver-node@0.3.9: + dependencies: + debug: 3.2.7 + is-core-module: 2.16.1 + resolve: 1.22.10 + transitivePeerDependencies: + - supports-color + + eslint-import-resolver-typescript@3.7.0(eslint-plugin-i@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1))(eslint@8.57.1): + dependencies: + '@nolyfill/is-core-module': 1.0.39 + debug: 4.4.0 + enhanced-resolve: 5.18.0 + eslint: 8.57.1 + fast-glob: 3.3.3 + get-tsconfig: 4.10.0 + is-bun-module: 1.3.0 + is-glob: 4.0.3 + stable-hash: 0.0.4 + optionalDependencies: + eslint-plugin-import: eslint-plugin-i@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1) + transitivePeerDependencies: + - supports-color + + eslint-mdx@3.1.5(eslint@8.57.1): + dependencies: + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + eslint: 8.57.1 + espree: 9.6.1 + estree-util-visit: 2.0.0 + remark-mdx: 3.1.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + synckit: 0.9.2 + tslib: 2.8.1 + unified: 11.0.5 + unified-engine: 11.2.2 + unist-util-visit: 5.0.0 + uvu: 0.5.6 + vfile: 6.0.3 + transitivePeerDependencies: + - bluebird + - supports-color + + eslint-module-utils@2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0(eslint-plugin-i@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.5.4) + eslint: 8.57.1 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.7.0(eslint-plugin-i@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1))(eslint@8.57.1) + transitivePeerDependencies: + - supports-color + + eslint-plugin-astro@0.33.1(eslint@8.57.1): + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) + '@jridgewell/sourcemap-codec': 1.5.0 + '@typescript-eslint/types': 5.62.0 + astro-eslint-parser: 0.16.3 + eslint: 8.57.1 + eslint-compat-utils: 0.5.1(eslint@8.57.1) + globals: 13.24.0 + postcss: 8.5.1 + postcss-selector-parser: 6.1.2 + transitivePeerDependencies: + - supports-color + + eslint-plugin-cypress@2.15.2(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + globals: 13.24.0 + + eslint-plugin-es-x@7.8.0(eslint@8.57.1): + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) + '@eslint-community/regexpp': 4.12.1 + eslint: 8.57.1 + eslint-compat-utils: 0.5.1(eslint@8.57.1) + + eslint-plugin-i@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1): + dependencies: + debug: 4.4.0 + doctrine: 3.0.0 + eslint: 8.57.1 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0(eslint-plugin-i@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + get-tsconfig: 4.10.0 + is-glob: 4.0.3 + minimatch: 3.1.2 + semver: 7.7.0 + transitivePeerDependencies: + - '@typescript-eslint/parser' + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + + eslint-plugin-jsdoc@48.11.0(eslint@8.57.1): + dependencies: + '@es-joy/jsdoccomment': 0.46.0 + are-docs-informative: 0.0.2 + comment-parser: 1.4.1 + debug: 4.4.0 + escape-string-regexp: 4.0.0 + eslint: 8.57.1 + espree: 10.3.0 + esquery: 1.6.0 + parse-imports: 2.2.1 + semver: 7.7.0 + spdx-expression-parse: 4.0.0 + synckit: 0.9.2 + transitivePeerDependencies: + - supports-color + + eslint-plugin-jsx-a11y@6.10.2(eslint@8.57.1): + dependencies: + aria-query: 5.3.2 + array-includes: 3.1.8 + array.prototype.flatmap: 1.3.3 + ast-types-flow: 0.0.8 + axe-core: 4.10.2 + axobject-query: 4.1.0 + damerau-levenshtein: 1.0.8 + emoji-regex: 9.2.2 + eslint: 8.57.1 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + language-tags: 1.0.9 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + safe-regex-test: 1.1.0 + string.prototype.includes: 2.0.1 + + eslint-plugin-markdown@3.0.1(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + mdast-util-from-markdown: 0.8.5 + transitivePeerDependencies: + - supports-color + + eslint-plugin-mdx@3.1.5(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + eslint-mdx: 3.1.5(eslint@8.57.1) + eslint-plugin-markdown: 3.0.1(eslint@8.57.1) + remark-mdx: 3.1.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + tslib: 2.8.1 + unified: 11.0.5 + vfile: 6.0.3 + transitivePeerDependencies: + - bluebird + - supports-color + + eslint-plugin-n@16.6.2(eslint@8.57.1): + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) + builtins: 5.1.0 + eslint: 8.57.1 + eslint-plugin-es-x: 7.8.0(eslint@8.57.1) + get-tsconfig: 4.10.0 + globals: 13.24.0 + ignore: 5.3.2 + is-builtin-module: 3.2.1 + is-core-module: 2.16.1 + minimatch: 3.1.2 + resolve: 1.22.10 + semver: 7.7.0 + + eslint-plugin-promise@6.6.0(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + + eslint-plugin-react-hooks@4.6.2(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + + eslint-plugin-react@7.37.4(eslint@8.57.1): + dependencies: + array-includes: 3.1.8 + array.prototype.findlast: 1.2.5 + array.prototype.flatmap: 1.3.3 + array.prototype.tosorted: 1.1.4 + doctrine: 2.1.0 + es-iterator-helpers: 1.2.1 + eslint: 8.57.1 + estraverse: 5.3.0 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.2 + object.entries: 1.1.8 + object.fromentries: 2.0.8 + object.values: 1.2.1 + prop-types: 15.8.1 + resolve: 2.0.0-next.5 + semver: 6.3.1 + string.prototype.matchall: 4.0.12 + string.prototype.repeat: 1.0.0 + + eslint-plugin-rxjs-angular@2.0.1(eslint@8.57.1)(typescript@5.5.4): + dependencies: + '@typescript-eslint/experimental-utils': 5.62.0(eslint@8.57.1)(typescript@5.5.4) + common-tags: 1.8.2 + eslint: 8.57.1 + eslint-etc: 5.2.1(eslint@8.57.1)(typescript@5.5.4) + requireindex: 1.2.0 + tslib: 2.8.1 + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + eslint-plugin-rxjs@5.0.3(eslint@8.57.1)(typescript@5.5.4): + dependencies: + '@typescript-eslint/experimental-utils': 5.62.0(eslint@8.57.1)(typescript@5.5.4) + common-tags: 1.8.2 + decamelize: 5.0.1 + eslint: 8.57.1 + eslint-etc: 5.2.1(eslint@8.57.1)(typescript@5.5.4) + requireindex: 1.2.0 + rxjs-report-usage: 1.0.6 + tslib: 2.8.1 + tsutils: 3.21.0(typescript@5.5.4) + tsutils-etc: 1.4.2(tsutils@3.21.0(typescript@5.5.4))(typescript@5.5.4) + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + eslint-plugin-sonarjs@0.25.1(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + + eslint-plugin-svelte3@4.0.0(eslint@8.57.1)(svelte@3.59.2): + dependencies: + eslint: 8.57.1 + svelte: 3.59.2 + + eslint-plugin-tsdoc@0.2.17: + dependencies: + '@microsoft/tsdoc': 0.14.2 + '@microsoft/tsdoc-config': 0.16.2 + + eslint-plugin-typescript-sort-keys@3.3.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1)(typescript@5.5.4): + dependencies: + '@typescript-eslint/experimental-utils': 5.62.0(eslint@8.57.1)(typescript@5.5.4) + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.5.4) + eslint: 8.57.1 + json-schema: 0.4.0 + natural-compare-lite: 1.4.0 + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + eslint-plugin-unicorn@52.0.0(eslint@8.57.1): + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) + '@eslint/eslintrc': 2.1.4 + ci-info: 4.1.0 + clean-regexp: 1.0.0 + core-js-compat: 3.40.0 + eslint: 8.57.1 + esquery: 1.6.0 + indent-string: 4.0.0 + is-builtin-module: 3.2.1 + jsesc: 3.1.0 + pluralize: 8.0.0 + read-pkg-up: 7.0.1 + regexp-tree: 0.1.27 + regjsparser: 0.10.0 + semver: 7.7.0 + strip-indent: 3.0.0 + transitivePeerDependencies: + - supports-color + + eslint-plugin-vue@9.32.0(eslint@8.57.1): + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) + eslint: 8.57.1 + globals: 13.24.0 + natural-compare: 1.4.0 + nth-check: 2.1.1 + postcss-selector-parser: 6.1.2 + semver: 7.7.0 + vue-eslint-parser: 9.4.3(eslint@8.57.1) + xml-name-validator: 4.0.0 + transitivePeerDependencies: + - supports-color + + eslint-rule-docs@1.1.235: {} + + eslint-scope@5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-scope@8.2.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.2.0: {} + + eslint@8.57.1: + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) + '@eslint-community/regexpp': 4.12.1 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.1 + '@humanwhocodes/config-array': 0.13.0 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.3.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.0 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + espree@10.3.0: + dependencies: + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + eslint-visitor-keys: 4.2.0 + + espree@9.6.1: + dependencies: + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + eslint-visitor-keys: 3.4.3 + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@4.3.0: {} + + estraverse@5.3.0: {} + + estree-util-is-identifier-name@3.0.0: {} + + estree-util-visit@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/unist': 3.0.3 + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.6 + + esutils@2.0.3: {} + + execa@8.0.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + + execa@9.5.2: + dependencies: + '@sindresorhus/merge-streams': 4.0.0 + cross-spawn: 7.0.6 + figures: 6.1.0 + get-stream: 9.0.1 + human-signals: 8.0.0 + is-plain-obj: 4.1.0 + is-stream: 4.0.1 + npm-run-path: 6.0.0 + pretty-ms: 9.2.0 + signal-exit: 4.1.0 + strip-final-newline: 4.0.0 + yoctocolors: 2.1.1 + + expect-type@1.1.0: {} + + extend@3.0.2: {} + + fast-content-type-parse@2.0.1: {} + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fastq@1.19.0: + dependencies: + reusify: 1.0.4 + + fdir@6.4.3(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + + figures@6.1.0: + dependencies: + is-unicode-supported: 2.1.0 + + file-entry-cache@6.0.1: + dependencies: + flat-cache: 3.2.0 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@3.2.0: + dependencies: + flatted: 3.3.2 + keyv: 4.5.4 + rimraf: 3.0.2 + + flatted@3.3.2: {} + + for-each@0.3.4: + dependencies: + is-callable: 1.2.7 + + foreground-child@3.3.0: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + function.prototype.name@1.1.8: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 + + functions-have-names@1.2.3: {} + + get-caller-file@2.0.5: {} + + get-east-asian-width@1.3.0: {} + + get-intrinsic@1.2.7: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-stream@8.0.1: {} + + get-stream@9.0.1: + dependencies: + '@sec-ant/readable-stream': 0.4.1 + is-stream: 4.0.1 + + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + + get-tsconfig@4.10.0: + dependencies: + resolve-pkg-maps: 1.0.0 + + git-cliff-darwin-arm64@2.8.0: + optional: true + + git-cliff-darwin-x64@2.8.0: + optional: true + + git-cliff-linux-arm64@2.8.0: + optional: true + + git-cliff-linux-x64@2.8.0: + optional: true + + git-cliff-windows-arm64@2.8.0: + optional: true + + git-cliff-windows-x64@2.8.0: + optional: true + + git-cliff@2.8.0: + dependencies: + execa: 8.0.1 + optionalDependencies: + git-cliff-darwin-arm64: 2.8.0 + git-cliff-darwin-x64: 2.8.0 + git-cliff-linux-arm64: 2.8.0 + git-cliff-linux-x64: 2.8.0 + git-cliff-windows-arm64: 2.8.0 + git-cliff-windows-x64: 2.8.0 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@10.3.10: + dependencies: + foreground-child: 3.3.0 + jackspeak: 2.3.6 + minimatch: 9.0.5 + minipass: 7.1.2 + path-scurry: 1.11.1 + + glob@10.4.5: + dependencies: + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + globals@11.12.0: {} + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + + globals@15.14.0: {} + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + graphemer@1.4.0: {} + + has-bigints@1.1.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hosted-git-info@2.8.9: {} + + hosted-git-info@7.0.2: + dependencies: + lru-cache: 10.4.3 + + html-escaper@2.0.2: {} + + human-signals@5.0.0: {} + + human-signals@8.0.0: {} + + ignore@5.3.2: {} + + ignore@6.0.2: {} + + import-fresh@3.3.0: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + import-meta-resolve@4.1.0: {} + + imurmurhash@0.1.4: {} + + indent-string@4.0.0: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + ini@4.1.3: {} + + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 + + irregular-plurals@3.5.0: {} + + is-alphabetical@1.0.4: {} + + is-alphabetical@2.0.1: {} + + is-alphanumerical@1.0.4: + dependencies: + is-alphabetical: 1.0.4 + is-decimal: 1.0.4 + + is-alphanumerical@2.0.1: + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + get-intrinsic: 1.2.7 + + is-arrayish@0.2.1: {} + + is-async-function@2.1.1: + dependencies: + async-function: 1.0.0 + call-bound: 1.0.3 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 + + is-boolean-object@1.2.1: + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + + is-builtin-module@3.2.1: + dependencies: + builtin-modules: 3.3.0 + + is-bun-module@1.3.0: + dependencies: + semver: 7.7.0 + + is-callable@1.2.7: {} + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-data-view@1.0.2: + dependencies: + call-bound: 1.0.3 + get-intrinsic: 1.2.7 + is-typed-array: 1.1.15 + + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + + is-decimal@1.0.4: {} + + is-decimal@2.0.1: {} + + is-empty@1.2.0: {} + + is-extglob@2.1.1: {} + + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.3 + + is-fullwidth-code-point@3.0.0: {} + + is-generator-function@1.1.0: + dependencies: + call-bound: 1.0.3 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-hexadecimal@1.0.4: {} + + is-hexadecimal@2.0.1: {} + + is-map@2.0.3: {} + + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + + is-number@7.0.0: {} + + is-path-inside@3.0.3: {} + + is-plain-obj@4.1.0: {} + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.3 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.3 + + is-stream@2.0.1: {} + + is-stream@3.0.0: {} + + is-stream@4.0.1: {} + + is-string@1.1.1: + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.3 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.18 + + is-unicode-supported@1.3.0: {} + + is-unicode-supported@2.1.0: {} + + is-weakmap@2.0.2: {} + + is-weakref@1.1.0: + dependencies: + call-bound: 1.0.3 + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.3 + get-intrinsic: 1.2.7 + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + isexe@3.1.1: {} + + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-lib-source-maps@5.0.6: + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + debug: 4.4.0 + istanbul-lib-coverage: 3.2.2 + transitivePeerDependencies: + - supports-color + + istanbul-reports@3.1.7: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + iterator.prototype@1.1.5: + dependencies: + define-data-property: 1.1.4 + es-object-atoms: 1.1.1 + get-intrinsic: 1.2.7 + get-proto: 1.0.1 + has-symbols: 1.1.0 + set-function-name: 2.0.2 + + jackspeak@2.3.6: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jju@1.4.0: {} + + joycon@3.1.1: {} + + js-tokens@4.0.0: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsdoc-type-pratt-parser@4.0.0: {} + + jsesc@0.5.0: {} + + jsesc@3.1.0: {} + + json-buffer@3.0.1: {} + + json-parse-even-better-errors@2.3.1: {} + + json-parse-even-better-errors@3.0.2: {} + + json-schema-traverse@0.4.1: {} + + json-schema@0.4.0: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + jsx-ast-utils@3.3.5: + dependencies: + array-includes: 3.1.8 + array.prototype.flat: 1.3.3 + object.assign: 4.1.7 + object.values: 1.2.1 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + kleur@3.0.3: {} + + kleur@4.1.5: {} + + language-subtag-registry@0.3.23: {} + + language-tags@1.0.9: + dependencies: + language-subtag-registry: 0.3.23 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lilconfig@3.1.3: {} + + lines-and-columns@1.2.4: {} + + lines-and-columns@2.0.4: {} + + load-plugin@6.0.3: + dependencies: + '@npmcli/config': 8.3.4 + import-meta-resolve: 4.1.0 + transitivePeerDependencies: + - bluebird + + load-tsconfig@0.2.5: {} + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.merge@4.6.2: {} + + lodash.sortby@4.7.0: {} + + lodash@4.17.21: {} + + log-symbols@6.0.0: + dependencies: + chalk: 5.4.1 + is-unicode-supported: 1.3.0 + + longest-streak@3.1.0: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + loupe@3.1.3: {} + + lru-cache@10.4.3: {} + + magic-bytes.js@1.10.0: {} + + magic-string@0.30.17: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + + magicast@0.3.5: + dependencies: + '@babel/parser': 7.26.7 + '@babel/types': 7.26.7 + source-map-js: 1.2.1 + + make-dir@4.0.0: + dependencies: + semver: 7.7.0 + + math-intrinsics@1.1.0: {} + + mdast-util-from-markdown@0.8.5: + dependencies: + '@types/mdast': 3.0.15 + mdast-util-to-string: 2.0.0 + micromark: 2.11.4 + parse-entities: 2.0.0 + unist-util-stringify-position: 2.0.3 + transitivePeerDependencies: + - supports-color + + mdast-util-from-markdown@2.0.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-expression@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-jsx@3.2.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx@3.0.0: + dependencies: + mdast-util-from-markdown: 2.0.2 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdxjs-esm@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.0 + + mdast-util-to-markdown@2.1.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + mdast-util-to-string@2.0.0: {} + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + + meow@13.2.0: {} + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + micromark-core-commonmark@2.0.2: + dependencies: + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.0.4 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-extension-mdx-expression@3.0.0: + dependencies: + '@types/estree': 1.0.6 + devlop: 1.1.0 + micromark-factory-mdx-expression: 2.0.2 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-extension-mdx-jsx@3.0.1: + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.6 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + micromark-factory-mdx-expression: 2.0.2 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + vfile-message: 4.0.2 + + micromark-extension-mdx-md@2.0.0: + dependencies: + micromark-util-types: 2.0.1 + + micromark-extension-mdxjs-esm@3.0.0: + dependencies: + '@types/estree': 1.0.6 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.2 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 + + micromark-extension-mdxjs@3.0.0: + dependencies: + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + micromark-extension-mdx-expression: 3.0.0 + micromark-extension-mdx-jsx: 3.0.1 + micromark-extension-mdx-md: 2.0.0 + micromark-extension-mdxjs-esm: 3.0.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-factory-destination@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-factory-label@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-factory-mdx-expression@2.0.2: + dependencies: + '@types/estree': 1.0.6 + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 + + micromark-factory-space@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.1 + + micromark-factory-title@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-factory-whitespace@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-util-chunked@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-classify-character@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-util-combine-extensions@2.0.1: + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-decode-string@2.0.1: + dependencies: + decode-named-character-reference: 1.0.2 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 + + micromark-util-encode@2.0.1: {} + + micromark-util-events-to-acorn@2.0.2: + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.6 + '@types/unist': 3.0.3 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + vfile-message: 4.0.2 + + micromark-util-html-tag-name@2.0.1: {} + + micromark-util-normalize-identifier@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-resolve-all@2.0.1: + dependencies: + micromark-util-types: 2.0.1 + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-subtokenize@2.0.4: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.1: {} + + micromark@2.11.4: + dependencies: + debug: 4.4.0 + parse-entities: 2.0.0 + transitivePeerDependencies: + - supports-color + + micromark@4.0.1: + dependencies: + '@types/debug': 4.1.12 + debug: 4.4.0 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.2 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.0.4 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + transitivePeerDependencies: + - supports-color + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mimic-fn@4.0.0: {} + + min-indent@1.0.1: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minipass@7.1.2: {} + + mri@1.2.0: {} + + ms@2.1.3: {} + + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + nanoid@3.3.8: {} + + natural-compare-lite@1.4.0: {} + + natural-compare@1.4.0: {} + + node-releases@2.0.19: {} + + nopt@7.2.1: + dependencies: + abbrev: 2.0.0 + + normalize-package-data@2.5.0: + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.10 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + + normalize-package-data@6.0.2: + dependencies: + hosted-git-info: 7.0.2 + semver: 7.7.0 + validate-npm-package-license: 3.0.4 + + npm-install-checks@6.3.0: + dependencies: + semver: 7.7.0 + + npm-normalize-package-bin@3.0.1: {} + + npm-package-arg@11.0.3: + dependencies: + hosted-git-info: 7.0.2 + proc-log: 4.2.0 + semver: 7.7.0 + validate-npm-package-name: 5.0.1 + + npm-pick-manifest@9.1.0: + dependencies: + npm-install-checks: 6.3.0 + npm-normalize-package-bin: 3.0.1 + npm-package-arg: 11.0.3 + semver: 7.7.0 + + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + + npm-run-path@6.0.0: + dependencies: + path-key: 4.0.0 + unicorn-magic: 0.3.0 + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + object-assign@4.1.1: {} + + object-inspect@1.13.3: {} + + object-keys@1.1.1: {} + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + + object.entries@1.1.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + object.fromentries@2.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 + + object.values@1.2.1: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@6.0.0: + dependencies: + mimic-fn: 4.0.0 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.2.7 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-try@2.2.0: {} + + package-json-from-dist@1.0.1: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-entities@2.0.0: + dependencies: + character-entities: 1.2.4 + character-entities-legacy: 1.1.4 + character-reference-invalid: 1.1.4 + is-alphanumerical: 1.0.4 + is-decimal: 1.0.4 + is-hexadecimal: 1.0.4 + + parse-entities@4.0.2: + dependencies: + '@types/unist': 2.0.11 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.0.2 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + + parse-imports@2.2.1: + dependencies: + es-module-lexer: 1.6.0 + slashes: 3.0.12 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.26.2 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + parse-json@7.1.1: + dependencies: + '@babel/code-frame': 7.26.2 + error-ex: 1.3.2 + json-parse-even-better-errors: 3.0.2 + lines-and-columns: 2.0.4 + type-fest: 3.13.1 + + parse-ms@4.0.0: {} + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-type@4.0.0: {} + + pathe@1.1.2: {} + + pathval@2.0.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.2: {} + + pirates@4.0.6: {} + + plur@5.1.0: + dependencies: + irregular-plurals: 3.5.0 + + pluralize@8.0.0: {} + + possible-typed-array-names@1.0.0: {} + + postcss-load-config@6.0.1(postcss@8.5.1)(yaml@2.7.0): + dependencies: + lilconfig: 3.1.3 + optionalDependencies: + postcss: 8.5.1 + yaml: 2.7.0 + + postcss-selector-parser@6.1.2: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss@8.5.1: + dependencies: + nanoid: 3.3.8 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prelude-ls@1.2.1: {} + + prettier@3.4.2: {} + + pretty-ms@9.2.0: + dependencies: + parse-ms: 4.0.0 + + proc-log@4.2.0: {} + + promise-inflight@1.0.1: {} + + promise-retry@2.0.1: + dependencies: + err-code: 2.0.3 + retry: 0.12.0 + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + punycode@2.3.1: {} + + queue-microtask@1.2.3: {} + + react-is@16.13.1: {} + + read-package-json-fast@3.0.2: + dependencies: + json-parse-even-better-errors: 3.0.2 + npm-normalize-package-bin: 3.0.1 + + read-pkg-up@7.0.1: + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + + read-pkg@5.2.0: + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdirp@4.1.1: {} + + reflect.getprototypeof@1.0.10: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.2.7 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + + regexp-tree@0.1.27: {} + + regexp.prototype.flags@1.5.4: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + + regjsparser@0.10.0: + dependencies: + jsesc: 0.5.0 + + remark-mdx@3.1.0: + dependencies: + mdast-util-mdx: 3.0.0 + micromark-extension-mdxjs: 3.0.0 + transitivePeerDependencies: + - supports-color + + remark-parse@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + micromark-util-types: 2.0.1 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-stringify@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-to-markdown: 2.1.2 + unified: 11.0.5 + + require-directory@2.1.1: {} + + requireindex@1.2.0: {} + + resolve-from@4.0.0: {} + + resolve-from@5.0.0: {} + + resolve-pkg-maps@1.0.0: {} + + resolve@1.19.0: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + + resolve@1.22.10: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + resolve@2.0.0-next.5: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + retry@0.12.0: {} + + reusify@1.0.4: {} + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + rollup@4.34.0: + dependencies: + '@types/estree': 1.0.6 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.34.0 + '@rollup/rollup-android-arm64': 4.34.0 + '@rollup/rollup-darwin-arm64': 4.34.0 + '@rollup/rollup-darwin-x64': 4.34.0 + '@rollup/rollup-freebsd-arm64': 4.34.0 + '@rollup/rollup-freebsd-x64': 4.34.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.34.0 + '@rollup/rollup-linux-arm-musleabihf': 4.34.0 + '@rollup/rollup-linux-arm64-gnu': 4.34.0 + '@rollup/rollup-linux-arm64-musl': 4.34.0 + '@rollup/rollup-linux-loongarch64-gnu': 4.34.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.34.0 + '@rollup/rollup-linux-riscv64-gnu': 4.34.0 + '@rollup/rollup-linux-s390x-gnu': 4.34.0 + '@rollup/rollup-linux-x64-gnu': 4.34.0 + '@rollup/rollup-linux-x64-musl': 4.34.0 + '@rollup/rollup-win32-arm64-msvc': 4.34.0 + '@rollup/rollup-win32-ia32-msvc': 4.34.0 + '@rollup/rollup-win32-x64-msvc': 4.34.0 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + rxjs-report-usage@1.0.6: + dependencies: + '@babel/parser': 7.26.7 + '@babel/traverse': 7.26.7 + '@babel/types': 7.26.7 + bent: 7.3.12 + chalk: 4.1.2 + glob: 7.2.3 + prompts: 2.4.2 + transitivePeerDependencies: + - supports-color + + sade@1.8.1: + dependencies: + mri: 1.2.0 + + safe-array-concat@1.1.3: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + get-intrinsic: 1.2.7 + has-symbols: 1.1.0 + isarray: 2.0.5 + + safe-buffer@5.2.1: {} + + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-regex: 1.2.1 + + semver@5.7.2: {} + + semver@6.3.1: {} + + semver@7.7.0: {} + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.7 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.3 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + object-inspect: 1.13.3 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + object-inspect: 1.13.3 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.3 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + siginfo@2.0.0: {} + + signal-exit@4.1.0: {} + + sisteransi@1.0.5: {} + + slash@3.0.0: {} + + slashes@3.0.12: {} + + smol-toml@1.3.1: {} + + source-map-js@1.2.1: {} + + source-map@0.8.0-beta.0: + dependencies: + whatwg-url: 7.1.0 + + spdx-correct@3.2.0: + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.21 + + spdx-exceptions@2.5.0: {} + + spdx-expression-parse@3.0.1: + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.21 + + spdx-expression-parse@4.0.0: + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.21 + + spdx-license-ids@3.0.21: {} + + stable-hash@0.0.4: {} + + stackback@0.0.2: {} + + std-env@3.8.0: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + string-width@6.1.0: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 10.4.0 + strip-ansi: 7.1.0 + + string-width@7.2.0: + dependencies: + emoji-regex: 10.4.0 + get-east-asian-width: 1.3.0 + strip-ansi: 7.1.0 + + string.prototype.includes@2.0.1: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + + string.prototype.matchall@4.0.12: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.2.7 + gopd: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + regexp.prototype.flags: 1.5.4 + set-function-name: 2.0.2 + side-channel: 1.1.0 + + string.prototype.repeat@1.0.0: + dependencies: + define-properties: 1.2.1 + es-abstract: 1.23.9 + + string.prototype.trim@1.2.10: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 + + string.prototype.trimend@1.0.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 + + strip-final-newline@3.0.0: {} + + strip-final-newline@4.0.0: {} + + strip-indent@3.0.0: + dependencies: + min-indent: 1.0.1 + + strip-json-comments@3.1.1: {} + + sucrase@3.35.0: + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + commander: 4.1.1 + glob: 10.4.5 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@9.4.0: {} + + supports-hyperlinks@3.1.0: + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + svelte@3.59.2: {} + + synckit@0.9.2: + dependencies: + '@pkgr/core': 0.1.1 + tslib: 2.8.1 + + tapable@2.2.1: {} + + test-exclude@7.0.1: + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 10.4.5 + minimatch: 9.0.5 + + text-table@0.2.0: {} + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + tinybench@2.9.0: {} + + tinyexec@0.3.2: {} + + tinyglobby@0.2.10: + dependencies: + fdir: 6.4.3(picomatch@4.0.2) + picomatch: 4.0.2 + + tinypool@1.0.2: {} + + tinyrainbow@1.2.0: {} + + tinyspy@3.0.2: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + tr46@1.0.1: + dependencies: + punycode: 2.3.1 + + tree-kill@1.2.2: {} + + trough@2.2.0: {} + + ts-api-utils@1.4.3(typescript@5.5.4): + dependencies: + typescript: 5.5.4 + + ts-interface-checker@0.1.13: {} + + tslib@1.14.1: {} + + tslib@2.8.1: {} + + tsup@8.3.6(postcss@8.5.1)(typescript@5.5.4)(yaml@2.7.0): + dependencies: + bundle-require: 5.1.0(esbuild@0.24.2) + cac: 6.7.14 + chokidar: 4.0.3 + consola: 3.4.0 + debug: 4.4.0 + esbuild: 0.24.2 + joycon: 3.1.1 + picocolors: 1.1.1 + postcss-load-config: 6.0.1(postcss@8.5.1)(yaml@2.7.0) + resolve-from: 5.0.0 + rollup: 4.34.0 + source-map: 0.8.0-beta.0 + sucrase: 3.35.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.10 + tree-kill: 1.2.2 + optionalDependencies: + postcss: 8.5.1 + typescript: 5.5.4 + transitivePeerDependencies: + - jiti + - supports-color + - tsx + - yaml + + tsutils-etc@1.4.2(tsutils@3.21.0(typescript@5.5.4))(typescript@5.5.4): + dependencies: + '@types/yargs': 17.0.33 + tsutils: 3.21.0(typescript@5.5.4) + typescript: 5.5.4 + yargs: 17.7.2 + + tsutils@3.21.0(typescript@5.5.4): + dependencies: + tslib: 1.14.1 + typescript: 5.5.4 + + turbo-darwin-64@2.4.0: + optional: true + + turbo-darwin-arm64@2.4.0: + optional: true + + turbo-linux-64@2.4.0: + optional: true + + turbo-linux-arm64@2.4.0: + optional: true + + turbo-windows-64@2.4.0: + optional: true + + turbo-windows-arm64@2.4.0: + optional: true + + turbo@2.4.0: + optionalDependencies: + turbo-darwin-64: 2.4.0 + turbo-darwin-arm64: 2.4.0 + turbo-linux-64: 2.4.0 + turbo-linux-arm64: 2.4.0 + turbo-windows-64: 2.4.0 + turbo-windows-arm64: 2.4.0 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-fest@0.20.2: {} + + type-fest@0.6.0: {} + + type-fest@0.8.1: {} + + type-fest@3.13.1: {} + + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + + typed-array-byte-length@1.0.3: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.4 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + + typed-array-byte-offset@1.0.4: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + for-each: 0.3.4 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + + typed-array-length@1.0.7: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.4 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.0.0 + reflect.getprototypeof: 1.0.10 + + typedarray@0.0.6: {} + + typescript-eslint@7.18.0(eslint@8.57.1)(typescript@5.5.4): + dependencies: + '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1)(typescript@5.5.4) + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.5.4) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.5.4) + eslint: 8.57.1 + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + typescript@5.5.4: {} + + unbox-primitive@1.1.0: + dependencies: + call-bound: 1.0.3 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + + undici-types@6.20.0: {} + + undici@6.19.8: {} + + unicorn-magic@0.3.0: {} + + unified-engine@11.2.2: + dependencies: + '@types/concat-stream': 2.0.3 + '@types/debug': 4.1.12 + '@types/is-empty': 1.2.3 + '@types/node': 22.13.0 + '@types/unist': 3.0.3 + concat-stream: 2.0.0 + debug: 4.4.0 + extend: 3.0.2 + glob: 10.4.5 + ignore: 6.0.2 + is-empty: 1.2.0 + is-plain-obj: 4.1.0 + load-plugin: 6.0.3 + parse-json: 7.1.1 + trough: 2.2.0 + unist-util-inspect: 8.1.0 + vfile: 6.0.3 + vfile-message: 4.0.2 + vfile-reporter: 8.1.1 + vfile-statistics: 3.0.0 + yaml: 2.7.0 + transitivePeerDependencies: + - bluebird + - supports-color + + unified@11.0.5: + dependencies: + '@types/unist': 3.0.3 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.3 + + unist-util-inspect@8.1.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-is@6.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position-from-estree@2.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-stringify-position@2.0.3: + dependencies: + '@types/unist': 2.0.11 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.1: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + + unist-util-visit@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + universal-user-agent@7.0.2: {} + + update-browserslist-db@1.1.2(browserslist@4.24.4): + dependencies: + browserslist: 4.24.4 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + util-deprecate@1.0.2: {} + + uvu@0.5.6: + dependencies: + dequal: 2.0.3 + diff: 5.2.0 + kleur: 4.1.5 + sade: 1.8.1 + + validate-npm-package-license@3.0.4: + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + + validate-npm-package-name@5.0.1: {} + + vfile-message@4.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile-reporter@8.1.1: + dependencies: + '@types/supports-color': 8.1.3 + string-width: 6.1.0 + supports-color: 9.4.0 + unist-util-stringify-position: 4.0.0 + vfile: 6.0.3 + vfile-message: 4.0.2 + vfile-sort: 4.0.0 + vfile-statistics: 3.0.0 + + vfile-sort@4.0.0: + dependencies: + vfile: 6.0.3 + vfile-message: 4.0.2 + + vfile-statistics@3.0.0: + dependencies: + vfile: 6.0.3 + vfile-message: 4.0.2 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.2 + + vite-node@2.1.8(@types/node@22.13.0): + dependencies: + cac: 6.7.14 + debug: 4.4.0 + es-module-lexer: 1.6.0 + pathe: 1.1.2 + vite: 5.4.14(@types/node@22.13.0) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + vite@5.4.14(@types/node@22.13.0): + dependencies: + esbuild: 0.21.5 + postcss: 8.5.1 + rollup: 4.34.0 + optionalDependencies: + '@types/node': 22.13.0 + fsevents: 2.3.3 + + vitest@2.1.8(@types/node@22.13.0): + dependencies: + '@vitest/expect': 2.1.8 + '@vitest/mocker': 2.1.8(vite@5.4.14(@types/node@22.13.0)) + '@vitest/pretty-format': 2.1.8 + '@vitest/runner': 2.1.8 + '@vitest/snapshot': 2.1.8 + '@vitest/spy': 2.1.8 + '@vitest/utils': 2.1.8 + chai: 5.1.2 + debug: 4.4.0 + expect-type: 1.1.0 + magic-string: 0.30.17 + pathe: 1.1.2 + std-env: 3.8.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinypool: 1.0.2 + tinyrainbow: 1.2.0 + vite: 5.4.14(@types/node@22.13.0) + vite-node: 2.1.8(@types/node@22.13.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 22.13.0 + transitivePeerDependencies: + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + vue-eslint-parser@9.4.3(eslint@8.57.1): + dependencies: + debug: 4.4.0 + eslint: 8.57.1 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.6.0 + lodash: 4.17.21 + semver: 7.7.0 + transitivePeerDependencies: + - supports-color + + walk-up-path@3.0.1: {} + + webidl-conversions@4.0.2: {} + + whatwg-url@7.1.0: + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + + which-boxed-primitive@1.1.1: + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.1 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.3 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.0 + is-regex: 1.2.1 + is-weakref: 1.1.0 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.18 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + + which-typed-array@1.1.18: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 + for-each: 0.3.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + which@4.0.0: + dependencies: + isexe: 3.1.1 + + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + word-wrap@1.2.5: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} + + xml-name-validator@4.0.0: {} + + y18n@5.0.8: {} + + yaml@2.7.0: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yocto-queue@0.1.0: {} + + yoctocolors@2.1.1: {} + + zwitch@2.0.4: {} diff --git a/src/client.ts b/src/client.ts new file mode 100644 index 0000000..ae36231 --- /dev/null +++ b/src/client.ts @@ -0,0 +1,687 @@ +import { randomUUID } from 'node:crypto'; +import type { Channel } from 'node:diagnostics_channel'; +import { setTimeout, clearTimeout } from 'node:timers'; +import { AsyncEventEmitter } from '@vladfrangu/async_event_emitter'; +import type { APIApplication, APIUser, OAuth2Scopes, Snowflake } from 'discord-api-types/v10'; +import type { MappedRPCCommandsArgs, RPCMessage } from './constants'; +import { RPCCommands, RPCEvents, RelationshipType } from './constants'; +import { IPCTransport } from './ipc'; +import { getPid } from './util'; + +export interface RPCLoginOptions { + accessToken: string; + clientId: string; + clientSecret: string; + /** + * https://discord.com/developers/docs/topics/oauth2#authorization-code-grant + * + * for authorization requests + */ + prompt?: 'consent' | 'none'; + /** + * https://discord.com/developers/docs/topics/oauth2#authorization-code-grant + * + * for authorization requests + */ + redirectUri?: string; + rpcToken: string; + scopes: OAuth2Scopes[]; + tokenEndpoint: string; + username: string; +} + +export interface RPCAuthorizationOptions extends Partial { + +} + +function subKey(event: RPCEvents, args: unknown) { + return `${event}${JSON.stringify(args)}`; +} + +/** + * The client for interacting with Discord RPC + */ +export class RPCClient extends AsyncEventEmitter { + public options: Partial; + + public accessToken: string | null; + + public clientId: string | null; + + public application: APIApplication | null; + + public user: APIUser | null; + + public transport: IPCTransport; + + /** + * Map of nonces being expected from the transport + */ + readonly #expected_nonces: Map; + + /** + * Promise for connection + */ + #connectPromise: Promise | undefined; + + public constructor(options: Partial = {}) { + super(); + + this.options = options; + + this.accessToken = null; + this.clientId = null; + this.application = null; + this.user = null; + + this.transport = new IPCTransport(this); + this.transport.on('message', this.#onRpcMessage.bind(this)); + + this.#expected_nonces = new Map(); + + this.#connectPromise = undefined; + } + + /** + * Search and connect to RPC + */ + public async connect(clientId: string): Promise { + if (this.#connectPromise) { + return this.#connectPromise; + } + + const { promise, resolve, reject } = Promise.withResolvers(); + this.#connectPromise = promise; + this.clientId = clientId; + const timeout = setTimeout(() => reject(new Error('RPC_CONNECTION_TIMEOUT')), 10e3); + timeout.unref(); + this.once('connected', () => { + clearTimeout(timeout); + resolve(this); + }); + + this.transport.once('close', () => { + for (const exp_nonce of this.#expected_nonces.values()) { + exp_nonce.reject(new Error('connection closed')); + } + + this.emit('disconnected'); + reject(new Error('connection closed')); + }); + + try { + await this.transport.connect(); + } catch (error) { + reject(error); + } + + return this.#connectPromise; + } + + /** + * Performs authentication flow. Automatically calls Client#connect if needed. + * + * @param options - Options for authentication. + * At least one property must be provided to perform login. + * @example + * logging in with a client id and secret + * ```ts + * client.login({ clientId: '1234567', clientSecret: 'abcdef123' }); + * ``` + */ + public async login(options: Partial = {}): Promise { + const { clientId } = options ?? this.options; + if (!clientId) { + throw new Error('A client id must be provided to login'); + } + + await this.connect(clientId); + + if (!options.scopes) { + this.emit('ready'); + return this; + } + + let { accessToken } = options ?? this.options; + if (!accessToken) { + accessToken = await this.authorize(options); + } + + return this.authenticate(accessToken!); + } + + /** + * Request + * + * @param cmd - Command + * @param args - Arguments + * @param evt - Event + */ + async #request(cmd: Cmd, args: MappedRPCCommandsArgs[Cmd], evt?: RPCEvents) { + return new Promise((resolve, reject) => { + const nonce = randomUUID(); + this.transport.send({ cmd, args, evt, nonce }); + this.#expected_nonces.set(nonce, { resolve, reject }); + }); + } + + /** + * Message handler + * + * @param message - message + */ + #onRpcMessage(message: RPCMessage) { + if (message.cmd === RPCCommands.Dispatch && message.evt === RPCEvents.Ready) { + if (message.data.user) { + this.user = message.data.user; + } + + this.emit('connected'); + } else if (message.cmd !== RPCCommands.Dispatch && this.#expected_nonces.has(message.nonce)) { + const { resolve, reject } = this.#expected_nonces.get(message.nonce)!; + if (message.evt === RPCEvents.Error) { + const e = new Error(message.data.message); + e.code = message.data.code; + e.data = message.data; + reject(e); + } else { + resolve(message.data); + } + + this.#expected_nonces.delete(message.nonce); + } else { + this.emit(message.evt, message.data); + } + } + + /** + * Authorize + * + * @param options - authorization options + */ + private async authorize({ scopes, clientSecret, rpcToken, redirectUri, prompt }: Partial = {}): Promise { + if (clientSecret && rpcToken === true) { + const body = await this.fetch('POST', '/oauth2/token/rpc', { + data: new URLSearchParams({ + client_id: this.clientId, + client_secret: clientSecret, + }), + }); + rpcToken = body.rpc_token; + } + + const { code } = await this.#request('AUTHORIZE', { + scopes, + client_id: this.clientId, + prompt, + rpc_token: rpcToken, + }); + + const response = await this.fetch('POST', '/oauth2/token', { + data: new URLSearchParams({ + client_id: this.clientId, + client_secret: clientSecret, + code, + grant_type: 'authorization_code', + redirect_uri: redirectUri, + }), + }); + + return response.access_token; + } + + /** + * Authenticate + * + * @param {string} accessToken access token + * @returns {Promise} + * @private + */ + async authenticate(accessToken: string): Promise { + return this.#request('AUTHENTICATE', { access_token: accessToken }) + .then(({ application, user }) => { + this.accessToken = accessToken; + this.application = application; + this.user = user; + this.emit('ready'); + return this; + }); + } + + + /** + * Fetch a guild + * + * @param {Snowflake} id Guild ID + * @param {number} [timeout] Timeout request + * @returns {Promise} + */ + async getGuild(id: Snowflake, timeout: number): Promise { + return this.#request(RPCCommands.GetGuild, { guild_id: id, timeout }); + } + + /** + * Fetch all guilds + * + * @param {number} [timeout] Timeout request + * @returns {Promise>} + */ + async getGuilds(timeout: number): Promise> { + return this.#request(RPCCommands.GetGuilds, { timeout }); + } + + /** + * Get a channel + * + * @param {Snowflake} id Channel ID + * @param {number} [timeout] Timeout request + * @returns {Promise} + */ + async getChannel(id: Snowflake, timeout: number): Promise { + return this.#request(RPCCommands.GetChannel, { channel_id: id, timeout }); + } + + /** + * Get all channels + * + * @param {Snowflake} [id] Guild ID + * @param {number} [timeout] Timeout request + * @returns {Promise>} + */ + async getChannels(id: Snowflake, timeout: number): Promise> { + const { channels } = await this.#request(RPCCommands.GetChannels, { + timeout, + guild_id: id, + }); + return channels; + } + + /** + * @typedef {CertifiedDevice} + * @prop {string} type One of `AUDIO_INPUT`, `AUDIO_OUTPUT`, `VIDEO_INPUT` + * @prop {string} uuid This device's Windows UUID + * @prop {object} vendor Vendor information + * @prop {string} vendor.name Vendor's name + * @prop {string} vendor.url Vendor's url + * @prop {object} model Model information + * @prop {string} model.name Model's name + * @prop {string} model.url Model's url + * @prop {string[]} related Array of related product's Windows UUIDs + * @prop {boolean} echoCancellation If the device has echo cancellation + * @prop {boolean} noiseSuppression If the device has noise suppression + * @prop {boolean} automaticGainControl If the device has automatic gain control + * @prop {boolean} hardwareMute If the device has a hardware mute + */ + + /** + * Tell discord which devices are certified + * + * @param {CertifiedDevice[]} devices Certified devices to send to discord + * @returns {Promise} + */ + async setCertifiedDevices(devices: CertifiedDevice[]): Promise { + return this.#request(RPCCommands.SetCertifiedDevices, { + devices: devices.map((d) => ({ + type: d.type, + id: d.uuid, + vendor: d.vendor, + model: d.model, + related: d.related, + echo_cancellation: d.echoCancellation, + noise_suppression: d.noiseSuppression, + automatic_gain_control: d.automaticGainControl, + hardware_mute: d.hardwareMute, + })), + }); + } + + /** + * @typedef {UserVoiceSettings} + * @prop {Snowflake} id ID of the user these settings apply to + * @prop {?object} [pan] Pan settings, an object with `left` and `right` set between + * 0.0 and 1.0, inclusive + * @prop {?number} [volume=100] The volume + * @prop {bool} [mute] If the user is muted + */ + + /** + * Set the voice settings for a user, by id + * + * @param {Snowflake} id ID of the user to set + * @param {UserVoiceSettings} settings Settings + * @returns {Promise} + */ + async setUserVoiceSettings(id: Snowflake, settings: UserVoiceSettings): Promise { + return this.#request(RPCCommands.SetUserVoiceSettings, { + user_id: id, + pan: settings.pan, + mute: settings.mute, + volume: settings.volume, + }); + } + + /** + * Move the user to a voice channel + * + * @param {Snowflake} id ID of the voice channel + * @param {object} [options] Options + * @param {number} [options.timeout] Timeout for the command + * @param {boolean} [options.force] Force this move. This should only be done if you + * have explicit permission from the user. + * @returns {Promise} + */ + async selectVoiceChannel(id: Snowflake, { timeout, force = false }: { force?: boolean; timeout?: number; } = {}): Promise { + return this.#request(RPCCommands.SelectVoiceChannel, { channel_id: id, timeout, force }); + } + + /** + * Move the user to a text channel + * + * @param {Snowflake} id ID of the voice channel + * @param {object} [options] Options + * @param {number} [options.timeout] Timeout for the command + * have explicit permission from the user. + * @returns {Promise} + */ + async selectTextChannel(id: Snowflake, { timeout }: { timeout?: number; } = {}): Promise { + return this.#request(RPCCommands.SelectTextChannel, { channel_id: id, timeout }); + } + + /** + * Get current voice settings + * + * @returns {Promise} + */ + async getVoiceSettings(): Promise { + return this.#request(RPCCommands.GetVoiceSettings) + .then((s) => ({ + automaticGainControl: s.automatic_gain_control, + echoCancellation: s.echo_cancellation, + noiseSuppression: s.noise_suppression, + qos: s.qos, + silenceWarning: s.silence_warning, + deaf: s.deaf, + mute: s.mute, + input: { + availableDevices: s.input.available_devices, + device: s.input.device_id, + volume: s.input.volume, + }, + output: { + availableDevices: s.output.available_devices, + device: s.output.device_id, + volume: s.output.volume, + }, + mode: { + type: s.mode.type, + autoThreshold: s.mode.auto_threshold, + threshold: s.mode.threshold, + shortcut: s.mode.shortcut, + delay: s.mode.delay, + }, + })); + } + + /** + * Set current voice settings, overriding the current settings until this session disconnects. + * This also locks the settings for any other rpc sessions which may be connected. + * + * @param {object} args Settings + * @returns {Promise} + */ + async setVoiceSettings(args: object): Promise { + return this.#request(RPCCommands.SetVoiceSettings, { + automatic_gain_control: args.automaticGainControl, + echo_cancellation: args.echoCancellation, + noise_suppression: args.noiseSuppression, + qos: args.qos, + silence_warning: args.silenceWarning, + deaf: args.deaf, + mute: args.mute, + input: args.input ? { + device_id: args.input.device, + volume: args.input.volume, + } : undefined, + output: args.output ? { + device_id: args.output.device, + volume: args.output.volume, + } : undefined, + mode: args.mode ? { + type: args.mode.type, + auto_threshold: args.mode.autoThreshold, + threshold: args.mode.threshold, + shortcut: args.mode.shortcut, + delay: args.mode.delay, + } : undefined, + }); + } + + /** + * Capture a shortcut using the client + * The callback takes (key, stop) where `stop` is a function that will stop capturing. + * This `stop` function must be called before disconnecting or else the user will have + * to restart their client. + * + * @param {Function} callback Callback handling keys + * @returns {Promise} + */ + async captureShortcut(callback: Function): Promise { + const subid = subKey(RPCEvents.CaptureShortcutChange); + const stop = async () => { + this._subscriptions.delete(subid); + return this.#request(RPCCommands.CaptureShortcut, { action: 'STOP' }); + }; + + this._subscriptions.set(subid, ({ shortcut }) => { + callback(shortcut, stop); + }); + return this.#request(RPCCommands.CaptureShortcut, { action: 'START' }) + .then(() => stop); + } + + /** + * Sets the presence for the logged in user. + * + * @param {object} args The rich presence to pass. + * @param {number} [pid] The application's process ID. Defaults to the executing process' PID. + * @returns {Promise} + */ + public async setActivity(args: object = {}, pid: number = getPid()): Promise { + let timestamps; + let assets; + let party; + let secrets; + if (args.startTimestamp || args.endTimestamp) { + timestamps = { + start: args.startTimestamp, + end: args.endTimestamp, + }; + if (timestamps.start instanceof Date) { + timestamps.start = Math.round(timestamps.start.getTime()); + } + + if (timestamps.end instanceof Date) { + timestamps.end = Math.round(timestamps.end.getTime()); + } + + if (timestamps.start > 2_147_483_647_000) { + throw new RangeError('timestamps.start must fit into a unix timestamp'); + } + + if (timestamps.end > 2_147_483_647_000) { + throw new RangeError('timestamps.end must fit into a unix timestamp'); + } + } + + if ( + args.largeImageKey || args.largeImageText + || args.smallImageKey || args.smallImageText + ) { + assets = { + large_image: args.largeImageKey, + large_text: args.largeImageText, + small_image: args.smallImageKey, + small_text: args.smallImageText, + }; + } + + if (args.partySize || args.partyId || args.partyMax) { + party = { id: args.partyId }; + if (args.partySize || args.partyMax) { + party.size = [args.partySize, args.partyMax]; + } + } + + if (args.matchSecret || args.joinSecret || args.spectateSecret) { + secrets = { + match: args.matchSecret, + join: args.joinSecret, + spectate: args.spectateSecret, + }; + } + + return this.#request(RPCCommands.SetActivity, { + pid, + activity: { + state: args.state, + details: args.details, + timestamps, + assets, + party, + secrets, + buttons: args.buttons, + instance: Boolean(args.instance), + }, + }); + } + + /** + * Clears the currently set presence, if any. This will hide the "Playing X" message + * displayed below the user's name. + * + * @param {number} [pid] The application's process ID. Defaults to the executing process' PID. + * @returns {Promise} + */ + public async clearActivity(pid: number = getPid()): Promise { + return this.#request(RPCCommands.SetActivity, { + pid, + }); + } + + /** + * Invite a user to join the game the RPC user is currently playing + * + * @param {User} user The user to invite + * @returns {Promise} + */ + public async sendJoinInvite(user: User): Promise { + return this.#request(RPCCommands.SendActivityJoinInvite, { + user_id: user.id || user, + }); + } + + /** + * Request to join the game the user is playing + * + * @param {User} user The user whose game you want to request to join + * @returns {Promise} + */ + public async sendJoinRequest(user: User): Promise { + return this.#request(RPCCommands.CloseActivityJoinRequest, { + user_id: user.id || user, + }); + } + + /** + * Reject a join request from a user + * + * @param {User} user The user whose request you wish to reject + * @returns {Promise} + */ + public async closeJoinRequest(user: User): Promise { + return this.#request(RPCCommands.CloseActivityJoinRequest, { + user_id: user.id || user, + }); + } + + public async createLobby(type, capacity, metadata) { + return this.#request(RPCCommands.CreateLobby, { + type, + capacity, + metadata, + }); + } + + public async updateLobby(lobby, { type, owner, capacity, metadata } = {}) { + return this.#request(RPCCommands.UpdateLobby, { + id: lobby.id || lobby, + type, + owner_id: (owner?.id) || owner, + capacity, + metadata, + }); + } + + public async deleteLobby(lobby) { + return this.#request(RPCCommands.DeleteLobby, { + id: lobby.id || lobby, + }); + } + + public async connectToLobby(id, secret) { + return this.#request(RPCCommands.ConnectToLobby, { + id, + secret, + }); + } + + public async sendToLobby(lobby, data) { + return this.#request(RPCCommands.SendToLobby, { + id: lobby.id || lobby, + data, + }); + } + + public async disconnectFromLobby(lobby) { + return this.#request(RPCCommands.DisconnectFromLobby, { + id: lobby.id || lobby, + }); + } + + public async updateLobbyMember(lobby, user, metadata) { + return this.#request(RPCCommands.UpdateLobbyMember, { + lobby_id: lobby.id || lobby, + user_id: user.id || user, + metadata, + }); + } + + public async getRelationships() { + const types = Object.keys(RelationshipType); + return this.#request(RPCCommands.GetRelationships) + .then((o) => o.relationships.map((r) => ({ + ...r, + type: types[r.type], + }))); + } + + /** + * Subscribe to an event + * + * @param event - Name of event e.g. `MESSAGE_CREATE` + * @param args - Args for event e.g. `{ channel_id: '1234' }` + */ + public async subscribe(event: string, args: object): Promise { + await this.#request(RPCCommands.Subscribe, args, event); + return { + unsubscribe: async () => this.#request(RPCCommands.Unsubscribe, args, event), + }; + } + + /** + * Destroy the client + */ + public async destroy() { + await this.transport.close(); + } +} diff --git a/src/constants.ts b/src/constants.ts new file mode 100644 index 0000000..6e61438 --- /dev/null +++ b/src/constants.ts @@ -0,0 +1,3611 @@ + +/* eslint-disable tsdoc/syntax */ +/* eslint-disable @typescript-eslint/no-empty-interface */ + +import type { Snowflake } from "discord-api-types/globals"; +import type { OAuth2Scopes, APIUser, APIPartialGuild, APIMessage, ChannelType, APIVoiceState, APIPartialChannel, GatewayActivity } from "discord-api-types/v10"; + +export const RPCVersion = '1'; + +/** + * https://discord.com/developers/docs/topics/rpc#authenticate-oauth2-application-structure + */ +export interface RPCOAuth2Application { + /** + * Application description + */ + description: string; + /** + * Hash of the icon + */ + icon: string; + /** + * Application client id + */ + id: Snowflake; + /** + * Application name + */ + name: string; + /** + * Array of rpc origin urls + */ + rpc_origins: string[]; +} + +export interface RPCDeviceVendor { + /** + * name of the vendor + */ + name: string; + /** + * url for the vendor + */ + url: string; +} + +export interface RPCDeviceModel { + /** + * name of the model + */ + name: string; + /** + * url for the model + */ + url: string; +} + +export enum RPCDeviceType { + AudioInput = 'audioinput', + AudioOutput = 'audiooutput', + VideoInput = 'videoinput', +} + +export interface BaseRPCDevice { + /** + * the device's Windows UUID + */ + id: string; + /** + * the model of the product + */ + model: RPCDeviceModel; + /** + * UUIDs of related devices + */ + related: string[]; + /** + * the type of device + */ + type: Type; + /** + * the hardware vendor + */ + vendor: RPCDeviceVendor; +} + +/** + * https://discord.com/developers/docs/topics/rpc#setcertifieddevices-device-object + */ +export type RPCDevice = + Type extends RPCDeviceType.AudioInput ? + BaseRPCDevice & { + /** + * if the device's native automatic gain control is enabled + */ + automatic_gain_control: boolean; + /** + * if the device's native echo cancellation is enabled + */ + echo_cancellation: boolean; + /** + * if the device is hardware muted + */ + hardware_mute: boolean; + /** + * if the device's native noise suppression is enabled + */ + noise_suppression: boolean; + } + : BaseRPCDevice; + +export interface RPCVoiceAvailableDevice { + /** + * device id + */ + id: string; + /** + * device name + */ + name: string; +} + +/** + * https://discord.com/developers/docs/topics/rpc#getvoicesettings-voice-settings-input-object + */ +export interface RPCVoiceSettingsInput { + /** + * array of read-only device objects containing `id` and `name` string keys + */ + available_devices: RPCVoiceAvailableDevice[]; + /** + * device id + */ + device_id: string; + /** + * input voice level (min: 0.0, max: 100.0) + */ + volume: number; +} + +/** + * https://discord.com/developers/docs/topics/rpc#getvoicesettings-voice-settings-output-object + */ +export interface RPCVoiceSettingsOutput { + /** + * array of read-only device objects containing `id` and `name` string keys + */ + available_devices: RPCVoiceAvailableDevice[]; + /** + * device id + */ + device_id: string; + /** + * input voice level (min: 0.0, max: 200.0) + */ + volume: number; +} + +export enum RPCVoiceSettingsModeType { + PushToTalk = 'PUSH_TO_TALK', + VoiceActivity = 'VOICE_ACTIVITY', +} + +/** + * https://discord.com/developers/docs/topics/rpc#getvoicesettings-key-types + */ +export enum RPCVoiceShortcutKeyComboKeyType { + KeyboardKey, + MouseButton, + KeyboardModifierKey, + GamepadButton, +} + +/** + * https://discord.com/developers/docs/topics/rpc#getvoicesettings-shortcut-key-combo-object + */ +export interface RPCVoiceShortcutKeyCombo { + /** + * key code + */ + code: number; + /** + * key name + */ + name: string; + /** + * type of key + */ + type: RPCVoiceShortcutKeyComboKeyType; +} + +/** + * https://discord.com/developers/docs/topics/rpc#getvoicesettings-voice-settings-mode-object + */ +export interface RPCVoiceSettingsMode { + /** + * voice activity threshold automatically sets its threshold + */ + auto_threshold: boolean; + /** + * threshold for voice activity (in dB) (min: -100.0, max: 0.0) + */ + threshold: number; + /** + * voice setting mode type (can be `PUSH_TO_TALK` or `VOICE_ACTIVITY`) + */ + type: RPCVoiceSettingsModeType; +} + +export enum VoiceConnectionStates { + /** + * TCP authenticating + */ + Authenticating = 'AUTHENTICATING', + /** + * Waiting for voice endpoint + */ + AwaitingEndpoint = 'AWAITING_ENDPOINT', + /** + * TCP connected + */ + Connected = 'CONNECTED', + /** + * TCP connecting + */ + Connecting = 'CONNECTING', + /** + * TCP disconnected + */ + Disconnected = 'DISCONNECTED', + /** + * WebRTC ice checking + */ + IceChecking = 'ICE_CHECKING', + /** + * No route to host + */ + NoRoute = 'NO_ROUTE', + /** + * TCP connected, Voice connected + */ + VoiceConnected = 'VOICE_CONNECTED', + /** + * TCP connected, Voice connecting + */ + VoiceConnecting = 'VOICE_CONNECTING', + /** + * TCP connected, Voice disconnected + */ + VoiceDisconnected = 'VOICE_DISCONNECTED' +} + +/** + * @unstable + */ +export enum LobbyType { + Private = 1, + Public, +} + +/** + * @unstable + */ +export enum RelationshipType { + None, + Friend, + Blocked, + PendingIncoming, + PendingOutgoing, + Implicit, +} + +/** + * https://discord.com/developers/docs/topics/opcodes-and-status-codes#rpc-rpc-error-codes + */ +export enum RPCErrorCodes { + /** + * An unknown error occurred. + */ + UnknownError = 1_000, + /** + * @unstable + */ + ServiceUnavailable, + /** + * @unstable + */ + TransactionAborted, + /** + * You sent an invalid payload. + */ + InvalidPayload = 4_000, + /** + * Invalid command name specified. + */ + InvalidCommand = 4_002, + /** + * Invalid guild ID specified. + */ + InvalidGuild, + /** + * Invalid event name specified. + */ + InvalidEvent, + /** + * Invalid channel ID specified. + */ + InvalidChannel, + /** + * You lack permissions to access the given resource. + */ + InvalidPermissions, + /** + * An invalid OAuth2 application ID was used to authorize or authenticate with. + */ + InvalidClientId, + /** + * An invalid OAuth2 application origin was used to authorize or authenticate with. + */ + InvalidOrigin, + /** + * An invalid OAuth2 token was used to authorize or authenticate with. + */ + InvalidToken, + /** + * The specified user ID was invalid. + */ + InvalidUser, + /** + * @unstable + */ + InvalidInvite, + /** + * @unstable + */ + InvalidActivityJoinRequest, + /** + * @unstable + */ + InvalidLobby, + /** + * @unstable + */ + InvalidLobbySecret, + /** + * @unstable + */ + InvalidEntitlement, + /** + * @unstable + */ + InvalidGiftCode, + /** + * A standard OAuth2 error occurred; check the data object for the OAuth2 error details. + */ + OAuth2Error = 5_000, + /** + * An asynchronous `SELECT_TEXT_CHANNEL`/`SELECT_VOICE_CHANNEL` command timed out. + */ + SelectChannelTimedOut, + /** + * An asynchronous `GET_GUILD` command timed out. + */ + GetGuildTimedOut, + /** + * You tried to join a user to a voice channel but the user was already in one. + */ + SelectVoiceForceRequired, + /** + * You tried to capture more than one shortcut key at once. + */ + CaptureShortcutAlreadyListening, + /** + * @unstable + */ + InvalidActivitySecret, + /** + * @unstable + */ + NoEligibleActivity, + /** + * @unstable + */ + LobbyFull, + /** + * @unstable + */ + PurchaseCanceled, + /** + * @unstable + */ + PurchaseError, + /** + * @unstable + */ + UnauthorizedForAchievement, + /** + * @unstable + */ + RateLimited, +} + +/** + * https://discord.com/developers/docs/topics/opcodes-and-status-codes#rpc-rpc-close-event-codes + */ +export enum RPCCloseEventCodes { + /** + * @unstable + */ + CloseNormal = 1_000, + /** + * @unstable + */ + CloseUnsupported = 1_003, + /** + * @unstable + */ + CloseAbnormal = 1_006, + /** + * You connected to the RPC server with an invalid client ID. + */ + InvalidClientId = 4_000, + /** + * You connected to the RPC server with an invalid origin. + */ + InvalidOrigin, + /** + * You are being rate limited. + */ + RateLimited, + /** + * The OAuth2 token associated with a connection was revoked, get a new one! + */ + TokenRevoked, + /** + * The RPC Server version specified in the connection string was not valid. + */ + InvalidVersion, + /** + * The encoding specified in the connection string was not valid. + */ + InvalidEncoding, +} + + +/** + * https://discord.com/developers/docs/topics/rpc#commands-and-events-rpc-commands + */ +export enum RPCCommands { + /** + * @unstable + */ + AcceptActivityInvite = 'ACCEPT_ACTIVITY_INVITE', + /** + * @unstable + */ + ActivityInviteUser = 'ACTIVITY_INVITE_USER', + /** + * Used to authenticate an existing client with your app + */ + Authenticate = 'AUTHENTICATE', + /** + * Used to authorize a new client with your app + */ + Authorize = 'AUTHORIZE', + /** + * @unstable + */ + BraintreePopupBridgeCallback = 'BRAINTREE_POPUP_BRIDGE_CALLBACK', + /** + * @unstable + */ + BrowserHandoff = 'BROWSER_HANDOFF', + CaptureShortcut = 'CAPTURE_SHORTCUT', + /** + * used to reject a Rich Presence Ask to Join request + */ + CloseActivityRequest = 'CLOSE_ACTIVITY_REQUEST', + /** + * @unstable + */ + ConnectToLobby = 'CONNECT_TO_LOBBY', + /** + * @unstable + */ + ConnectToLobbyVoice = 'CONNECT_TO_LOBBY_VOICE', + /** + * @unstable + */ + ConnectionsCallback = 'CONNECTIONS_CALLBACK', + CreateChannelInvite = 'CREATE_CHANNEL_INVITE', + /** + * @unstable + */ + CreateLobby = 'CREATE_LOBBY', + /** + * @unstable + */ + DeepLink = 'DEEP_LINK', + /** + * @unstable + */ + DeleteLobby = 'DELETE_LOBBY', + /** + * @unstable + */ + DisconnectFromLobby = 'DISCONNECT_FROM_LOBBY', + /** + * @unstable + */ + DisconnectFromLobbyVoice = 'DISCONNECT_FROM_LOBBY_VOICE', + /** + * Event dispatch + */ + Dispatch = 'DISPATCH', + /** + * @unstable + */ + GetApplicationTicket = 'GET_APPLICATION_TICKET', + /** + * Used to retrieve channel information from the client + */ + GetChannel = 'GET_CHANNEL', + /** + * Used to retrieve a list of channels for a guild from the client + */ + GetChannels = 'GET_CHANNELS', + /** + * @unstable + */ + GetEntitlementTicket = 'GET_ENTITLEMENT_TICKET', + /** + * @unstable + */ + GetEntitlements = 'GET_ENTITLEMENTS', + /** + * Used to retrieve guild information from the client + */ + GetGuild = 'GET_GUILD', + /** + * Used to retrieve a list of guilds from the client + */ + GetGuilds = 'GET_GUILDS', + /** + * @unstable + */ + GetImage = 'GET_IMAGE', + /** + * @unstable + */ + GetNetworkingConfig = 'GET_NETWORKING_CONFIG', + /** + * @unstable + */ + GetRelationships = 'GET_RELATIONSHIPS', + /** + * Used to get the current voice channel the client is in + */ + GetSelectedVoiceChannel = 'GET_SELECTED_VOICE_CHANNEL', + /** + * @unstable + */ + GetSkus = 'GET_SKUS', + /** + * @unstable + */ + GetUser = 'GET_USER', + /** + * @unstable + */ + GetUserAchievements = 'GET_USER_ACHIEVEMENTS', + /** + * Used to retrieve the client's voice settings + */ + GetVoiceSettings = 'GET_VOICE_SETTINGS', + /** + * @unstable + */ + GiftCodeBrowser = 'GIFT_CODE_BROWSER', + /** + * @unstable + */ + GuildTemplateBrowser = 'GUILD_TEMPLATE_BROWSER', + /** + * @unstable + */ + InviteBrowser = 'INVITE_BROWSER', + /** + * @unstable + */ + NetworkingCreateToken = 'NETWORKING_CREATE_TOKEN', + /** + * @unstable + */ + NetworkingPeerMetrics = 'NETWORKING_PEER_METRICS', + /** + * @unstable + */ + NetworkingSystemMetrics = 'NETWORKING_SYSTEM_METRICS', + /** + * @unstable + */ + OpenOverlayActivityInvite = 'OPEN_OVERLAY_ACTIVITY_INVITE', + /** + * @unstable + */ + OpenOverlayGuildInvite = 'OPEN_OVERLAY_GUILD_INVITE', + /** + * @unstable + */ + OpenOverlayVoiceSettings = 'OPEN_OVERLAY_VOICE_SETTINGS', + /** + * @unstable + */ + Overlay = 'OVERLAY', + /** + * @unstable + */ + SearchLobbies = 'SEARCH_LOBBIES', + /** + * Used to join or leave a text channel, group dm, or dm + */ + SelectTextChannel = 'SELECT_TEXT_CHANNEL', + /** + * Used to join or leave a voice channel, group dm, or dm + */ + SelectVoiceChannel = 'SELECT_VOICE_CHANNEL', + /** + * Used to consent to a Rich Presence Ask to Join request + */ + SendActivityJoinInvite = 'SEND_ACTIVITY_JOIN_INVITE', + /** + * @unstable + */ + SendToLobby = 'SEND_TO_LOBBY', + /** + * Used to update a user's Rich Presence + */ + SetActivity = 'SET_ACTIVITY', + /** + * Used to send info about certified hardware devices + */ + SetCertifiedDevices = 'SET_CERTIFIED_DEVICES', + /** + * @unstable + */ + SetOverlayLocked = 'SET_OVERLAY_LOCKED', + /** + * @unstable + */ + SetUserAchievement = 'SET_USER_ACHIEVEMENT', + /** + * Used to change voice settings of users in voice channels + */ + SetUserVoiceSettings = 'SET_USER_VOICE_SETTINGS', + SetUserVoiceSettings2 = 'SET_USER_VOICE_SETTINGS_2', + /** + * Used to set the client's voice settings + */ + SetVoiceSettings = 'SET_VOICE_SETTINGS', + SetVoiceSettings2 = 'SET_VOICE_SETTINGS_2', + /** + * @unstable + */ + StartPurchase = 'START_PURCHASE', + /** + * Used to subscribe to an RPC event + */ + Subscribe = 'SUBSCRIBE', + /** + * Used to unsubscribe from an RPC event + */ + Unsubscribe = 'UNSUBSCRIBE', + /** + * @unstable + */ + UpdateLobby = 'UPDATE_LOBBY', + /** + * @unstable + */ + UpdateLobbyMember = 'UPDATE_LOBBY_MEMBER', + /** + * @unstable + */ + ValidateApplication = 'VALIDATE_APPLICATION', +} + +/** + * https://discord.com/developers/docs/topics/rpc#authorize-authorize-response-structure + */ +export interface RPCAuthorizeResultData { + /** + * OAuth2 authorization code + */ + code: string; +} + +/** + * https://discord.com/developers/docs/topics/rpc#authorize-authorize-argument-structure + */ +export interface RPCAuthorizeArgs { + /** + * OAuth2 application id + */ + client_id: string; + /** + * one-time use RPC token + */ + rpc_token: string; + /** + * scopes to authorize + */ + scopes: OAuth2Scopes[]; + /** + * username to create a guest account with if the user does not have Discord + */ + username: string; +} + +/** + * https://discord.com/developers/docs/topics/rpc#authenticate-authenticate-argument-structure + */ +export interface RPCAuthenticateArgs { + /** + * OAuth2 access token + */ + access_token: string; +} + +/** + * https://discord.com/developers/docs/topics/rpc#authenticate-authenticate-response-structure + */ +export interface RPCAuthenticateResultData { + /** + * Application the user authorized + */ + application: RPCOAuth2Application; + /** + * Expiration date of OAuth2 token + */ + expires: string; + /** + * Authorized scopes + */ + scopes: OAuth2Scopes[]; + /** + * The authed user + */ + user: APIUser; +} + +export interface RPCGetGuildsArgs {} + +/** + * https://discord.com/developers/docs/topics/rpc#getguilds-get-guilds-response-structure + */ +export interface RPCGetGuildsResultData { + /** + * The guilds the user is in + */ + guilds: APIPartialGuild[]; +} + +/** + * https://discord.com/developers/docs/topics/rpc#getguild-get-guild-argument-structure + */ +export interface RPCGetGuildArgs { + /** + * Id of the guild to get + */ + guild_id: Snowflake; + /** + * Asynchronously get guild with time to wait before timing out + */ + timeout?: number; +} + +/** + * https://discord.com/developers/docs/topics/rpc#getguild-get-guild-response-structure + */ +export interface RPCGetGuildResultData { + /** + * Guild icon url + */ + icon_url: string | null; + /** + * Guild id + */ + id: Snowflake; + /** + * Members of the guild + * + * @deprecated This will always be an empty array + */ + members: []; + /** + * Guild name + */ + name: string; +} + +/** + * https://discord.com/developers/docs/topics/rpc#getchannel + */ +export interface RPCGetChannelArgs { + /** + * Id of the channel to get + */ + channel_id: Snowflake; +} + +/** + * https://discord.com/developers/docs/topics/rpc#getchannel-get-channel-response-structure + */ +export interface RPCGetChannelResultData { + /** + * (voice) bitrate of voice channel + */ + bitrate?: number; + /** + * Channel's guild id + */ + guild_id: Snowflake; + /** + * Channel id + */ + id: Snowflake; + /** + * (text) channel's messages + */ + messages?: APIMessage[]; + /** + * Channel name + */ + name: string; + /** + * Position of channel in channel list + */ + position: number; + /** + * (text) channel topic + */ + topic?: string; + /** + * Channel type + */ + type: ChannelType; + /** + * (voice) user limit of voice channel (0 for none) + */ + user_limit?: number; + /** + * (voice) channel's voice states + */ + voice_states?: APIVoiceState[]; +} + +/** + * https://discord.com/developers/docs/topics/rpc#getchannels-get-channels-argument-structure + */ +export interface RPCGetChannelsArgs { + /** + * Id of the guild to get channels for + */ + guild_id: Snowflake; +} + +/** + * https://discord.com/developers/docs/topics/rpc#getchannels-get-channels-response-structure + */ +export interface RPCGetChannelsResultData { + /** + * Guild channels the user is in + */ + channels: APIPartialChannel[]; +} + +/** + * https://discord.com/developers/docs/topics/rpc#setuservoicesettings-pan-object + */ +export interface RPCVoicePan { + /** + * Left pan of user (min: 0.0, max: 1.0) + */ + left: number; + /** + * Right pan of user (min: 0.0, max: 1.0) + */ + right: number; +} + +/** + * https://discord.com/developers/docs/topics/rpc#setuservoicesettings + * + * @note Discord only supports a single modifier of voice settings at a time over RPC. If an app changes voice settings, it will lock voice settings so that other apps connected simultaneously lose the ability to change voice settings. Settings reset to what they were before being changed after the controlling app disconnects. When an app that has previously set voice settings connects, the client will swap to that app's configured voice settings and lock voice settings again. + */ +export interface RPCSetUserVoiceSettingsArgs { + /** + * Set the mute state of the user + */ + mute?: boolean; + /** + * Set the pan of the user + */ + pan?: RPCVoicePan; + /** + * User id + */ + user_id: Snowflake; + /** + * Set the volume of user (defaults to 100, min 0, max 200) + */ + volume?: number; +} + +/** + * https://discord.com/developers/docs/topics/rpc#setuservoicesettings-set-user-voice-settings-argument-and-response-structure + */ +export type RPCSetUserVoiceSettingsResultData = Required; + +/** + * https://discord.com/developers/docs/topics/rpc#selectvoicechannel-select-voice-channel-argument-structure + * + * @warning When trying to join the user to a voice channel, you will receive a `5003` error coded response if the user is already in a voice channel. The `force` parameter should only be specified in response to the case where a user is already in a voice channel and they have approved to be moved by your app to a new voice channel. + */ +export interface RPCSelectVoiceChannelArgs { + /** + * Channel id to join (or `null` to leave) + */ + channel_id: Snowflake | null; + /** + * Forces a user to join a voice channel + */ + force?: boolean; + /** + * After joining the voice channel, navigate to it in the client + */ + navigate?: boolean; + /** + * Asynchronously join channel with time to wait before timing out + */ + timeout?: number; +} + +/** + * https://discord.com/developers/docs/topics/rpc#selectvoicechannel + */ +export type RPCSelectVoiceChannelResultData = RPCGetChannelResultData | null; + +/** + * https://discord.com/developers/docs/topics/rpc#getselectedvoicechannel + */ +export type RPCGetSelectedVoiceChannelResultData = RPCGetChannelResultData | null; + +/** + * https://discord.com/developers/docs/topics/rpc#getselectedvoicechannel + */ +export interface RPCGetSelectedVoiceChannelArgs {} + +/** + * @unstable + */ +export interface RPCGetUserResultData {} +/** + * @unstable + */ +export interface RPCGetUserArgs {} + +/** + * https://discord.com/developers/docs/topics/rpc#getvoicesettings-get-voice-settings-response-structure + */ +export interface RPCGetVoiceSettingsResultData { + /** + * state of automatic gain control + */ + automatic_gain_control: boolean; + /** + * state of self-deafen + */ + deaf: boolean; + /** + * state of echo cancellation + */ + echo_cancellation: boolean; + /** + * input settings + */ + input: RPCVoiceSettingsInput; + /** + * voice mode settings + */ + mode: RPCVoiceSettingsMode; + /** + * state of self-mute + */ + mute: boolean; + /** + * state of noise suppression + */ + noise_suppression: boolean; + /** + * output settings + */ + output: RPCVoiceSettingsOutput; + /** + * state of voice quality of service + */ + qos: boolean; + /** + * state of silence warning notice + */ + silence_warning: boolean; +} + +export interface RPCGetVoiceSettingsArgs {} + +/** + * Returns the [Get Channel](https://discord.com/developers/docs/topics/rpc#getchannel) response, or `null` if none. + */ +export type RPCSelectTextChannelResultData = RPCGetChannelResultData | null; +/** + * https://discord.com/developers/docs/topics/rpc#selecttextchannel-select-text-channel-argument-structure + */ +export interface RPCSelectTextChannelArgs { + /** + * channel id to join (or `null` to leave) + */ + channel_id: Snowflake | null; + /** + * asynchronously join channel with time to wait before timing out + */ + timeout?: number; +} + + +export interface RPCSetActivityResultData {} +/** + * https://discord.com/developers/docs/topics/rpc#setactivity-set-activity-argument-structure + */ +export interface RPCSetActivityArgs { + /** + * the rich presence to assign to the user + */ + activity: Omit; + /** + * the application's process id + */ + pid: number; +} + +/** + * https://discord.com/developers/docs/topics/rpc#setvoicesettings-set-voice-settings-argument-and-response-structure + */ +export type RPCSetVoiceSettingsResultData = RPCGetVoiceSettingsResultData; +/** + * https://discord.com/developers/docs/topics/rpc#setvoicesettings-set-voice-settings-argument-and-response-structure + * + * @note Discord only supports a single modifier of voice settings at a time over RPC. If an app changes voice settings, it will lock voice settings so that other apps connected simultaneously lose the ability to change voice settings. Settings reset to what they were before being changed after the controlling app disconnects. When an app that has previously set voice settings connects, the client will swap to that app's configured voice settings and lock voice settings again. + */ +export type RPCSetVoiceSettingsArgs = RPCGetVoiceSettingsResultData; + +/** + * https://discord.com/developers/docs/topics/rpc#subscribe-subscribe-response-structure + */ +export interface RPCSubscribeResultData { + /** + * event name now subscribed to + */ + evt: RPCEvents; +} +/** + * https://discord.com/developers/docs/topics/rpc#subscribe + */ +export type RPCSubscribeArgs = + | RPCSubscribeActivityInviteArgs + | RPCSubscribeActivityJoinArgs + | RPCSubscribeActivityJoinRequestArgs + | RPCSubscribeActivitySpectateArgs + | RPCSubscribeCaptureShortcutChangeArgs + | RPCSubscribeChannelCreateArgs + | RPCSubscribeCurrentUserUpdateArgs + | RPCSubscribeEntitlementCreateArgs + | RPCSubscribeEntitlementDeleteArgs + | RPCSubscribeGameJoinArgs + | RPCSubscribeGameSpectateArgs + | RPCSubscribeGuildCreateArgs + | RPCSubscribeGuildStatusArgs + | RPCSubscribeLobbyDeleteArgs + | RPCSubscribeLobbyMemberConnectArgs + | RPCSubscribeLobbyMemberDisconnectArgs + | RPCSubscribeLobbyMemberUpdateArgs + | RPCSubscribeLobbyMessageArgs + | RPCSubscribeLobbyUpdateArgs + | RPCSubscribeMessageCreateArgs + | RPCSubscribeMessageDeleteArgs + | RPCSubscribeMessageUpdateArgs + | RPCSubscribeNotificationCreateArgs + | RPCSubscribeOverlayArgs + | RPCSubscribeOverlayUpdateArgs + | RPCSubscribeRelationshipUpdateArgs + | RPCSubscribeSpeakingStartArgs + | RPCSubscribeSpeakingStopArgs + | RPCSubscribeUserAchievementUpdateArgs + | RPCSubscribeVoiceChannelSelectArgs + | RPCSubscribeVoiceConnectionStatusArgs + | RPCSubscribeVoiceSettingsUpdate2Args + | RPCSubscribeVoiceSettingsUpdateArgs + | RPCSubscribeVoiceStateCreateArgs + | RPCSubscribeVoiceStateDeleteArgs + | RPCSubscribeVoiceStateUpdateArgs; + +/** + * https://discord.com/developers/docs/topics/rpc#unsubscribe-unsubscribe-response-structure + */ +export interface RPCUnsubscribeResultData { + /** + * event name now unsubscribed from + */ + evt: RPCEvents; +} +/** + * https://discord.com/developers/docs/topics/rpc#unsubscribe + */ +export type RPCUnsubscribeArgs = RPCSubscribeArgs; + +/** + * @unstable + */ +export interface RPCAcceptActivityInviteResultData {} +/** + * @unstable + */ +export interface RPCAcceptActivityInviteArgs {} + +/** + * @unstable + */ +export interface RPCActivityInviteUserResultData {} +/** + * @unstable + */ +export interface RPCActivityInviteUserArgs {} + +/** + * @unstable + */ +export interface RPCBraintreePopupBridgeCallbackResultData {} +/** + * @unstable + */ +export interface RPCBraintreePopupBridgeCallbackArgs {} + +/** + * @unstable + */ +export interface RPCBrowserHandoffResultData {} +/** + * @unstable + */ +export interface RPCBrowserHandoffArgs {} + +/** + * @unstable + */ +export interface RPCCaptureShortcutResultData {} +/** + * @unstable + */ +export interface RPCCaptureShortcutArgs {} + +export interface RPCCloseActivityRequestResultData {} +/** + * https://discord.com/developers/docs/topics/rpc#closeactivityrequest-close-activity-request-argument-structure + */ +export interface RPCCloseActivityRequestArgs { + /** + * the id of the requesting user + */ + user_id: Snowflake; +} + +/** + * @unstable + */ +export interface RPCConnectToLobbyResultData {} +/** + * @unstable + */ +export interface RPCConnectToLobbyArgs {} + +/** + * @unstable + */ +export interface RPCConnectToLobbyVoiceResultData {} +/** + * @unstable + */ +export interface RPCConnectToLobbyVoiceArgs {} + +/** + * @unstable + */ +export interface RPCConnectionsCallbackResultData {} +/** + * @unstable + */ +export interface RPCConnectionsCallbackArgs {} + +/** + * @unstable + */ +export interface RPCCreateChannelInviteResultData {} +/** + * @unstable + */ +export interface RPCCreateChannelInviteArgs {} + +/** + * @unstable + */ +export interface RPCCreateLobbyResultData {} +/** + * @unstable + */ +export interface RPCCreateLobbyArgs {} + +/** + * @unstable + */ +export interface RPCDeepLinkResultData {} +/** + * @unstable + */ +export interface RPCDeepLinkArgs {} + +/** + * @unstable + */ +export interface RPCDeleteLobbyResultData {} +/** + * @unstable + */ +export interface RPCDeleteLobbyArgs {} + +/** + * @unstable + */ +export interface RPCDisconnectFromLobbyResultData {} +/** + * @unstable + */ +export interface RPCDisconnectFromLobbyArgs {} + +/** + * @unstable + */ +export interface RPCDisconnectFromLobbyVoiceResultData {} +/** + * @unstable + */ +export interface RPCDisconnectFromLobbyVoiceArgs {} + +/** + * @unstable + */ +export interface RPCGetApplicationTicketResultData {} +/** + * @unstable + */ +export interface RPCGetApplicationTicketArgs {} + +/** + * @unstable + */ +export interface RPCGetEntitlementTicketResultData {} +/** + * @unstable + */ +export interface RPCGetEntitlementTicketArgs {} + +/** + * @unstable + */ +export interface RPCGetEntitlementsResultData {} +/** + * @unstable + */ +export interface RPCGetEntitlementsArgs {} + +/** + * @unstable + */ +export interface RPCGetImageResultData {} +/** + * @unstable + */ +export interface RPCGetImageArgs {} + +/** + * @unstable + */ +export interface RPCGetNetworkingConfigResultData {} +/** + * @unstable + */ +export interface RPCGetNetworkingConfigArgs {} + +/** + * @unstable + */ +export interface RPCGetRelationshipsResultData {} +/** + * @unstable + */ +export interface RPCGetRelationshipsArgs {} + +/** + * @unstable + */ +export interface RPCGetSkusResultData {} +/** + * @unstable + */ +export interface RPCGetSkusArgs {} + +/** + * @unstable + */ +export interface RPCGetUserAchievementsResultData {} +/** + * @unstable + */ +export interface RPCGetUserAchievementsArgs {} + +/** + * @unstable + */ +export interface RPCGiftCodeBrowserResultData {} +/** + * @unstable + */ +export interface RPCGiftCodeBrowserArgs {} + +/** + * @unstable + */ +export interface RPCGuildTemplateBrowserResultData {} +/** + * @unstable + */ +export interface RPCGuildTemplateBrowserArgs {} + +/** + * @unstable + */ +export interface RPCInviteBrowserResultData {} +/** + * @unstable + */ +export interface RPCInviteBrowserArgs {} + +/** + * @unstable + */ +export interface RPCNetworkingCreateTokenResultData {} +/** + * @unstable + */ +export interface RPCNetworkingCreateTokenArgs {} + +/** + * @unstable + */ +export interface RPCNetworkingPeerMetricsResultData {} +/** + * @unstable + */ +export interface RPCNetworkingPeerMetricsArgs {} + +/** + * @unstable + */ +export interface RPCNetworkingSystemMetricsResultData {} +/** + * @unstable + */ +export interface RPCNetworkingSystemMetricsArgs {} + +/** + * @unstable + */ +export interface RPCOpenOverlayActivityInviteResultData {} +/** + * @unstable + */ +export interface RPCOpenOverlayActivityInviteArgs {} + +/** + * @unstable + */ +export interface RPCOpenOverlayGuildInviteResultData {} +/** + * @unstable + */ +export interface RPCOpenOverlayGuildInviteArgs {} + +/** + * @unstable + */ +export interface RPCOpenOverlayVoiceSettingsResultData {} +/** + * @unstable + */ +export interface RPCOpenOverlayVoiceSettingsArgs {} + +/** + * @unstable + */ +export interface RPCOverlayResultData {} +/** + * @unstable + */ +export interface RPCOverlayArgs {} + +/** + * @unstable + */ +export interface RPCSearchLobbiesResultData {} +/** + * @unstable + */ +export interface RPCSearchLobbiesArgs {} + +export interface RPCSendActivityJoinInviteResultData {} +/** + * https://discord.com/developers/docs/topics/rpc#sendactivityjoininvite-send-activity-join-invite-argument-structure + */ +export interface RPCSendActivityJoinInviteArgs { + /** + * the id of the requesting user + */ + user_id: Snowflake; +} + +/** + * @unstable + */ +export interface RPCSendToLobbyResultData {} +/** + * @unstable + */ +export interface RPCSendToLobbyArgs {} + +export type RPCSetCertifiedDevicesResultData = null; +/** + * https://discord.com/developers/docs/topics/rpc#setcertifieddevices-set-certified-devices-argument-structure + */ +export interface RPCSetCertifiedDevicesArgs { + /** + * a list of devices for your manufacturer, in order of priority + */ + devices: RPCDevice[]; +} + +/** + * @unstable + */ +export interface RPCSetOverlayLockedResultData {} +/** + * @unstable + */ +export interface RPCSetOverlayLockedArgs {} + +/** + * @unstable + */ +export interface RPCSetUserAchievementResultData {} +/** + * @unstable + */ +export interface RPCSetUserAchievementArgs {} + +/** + * @unstable + */ +export type RPCSetUserVoiceSettings2ResultData = RPCSetUserVoiceSettingsResultData; +/** + * @unstable + */ +export type RPCSetUserVoiceSettings2Args = RPCSetUserVoiceSettingsArgs; + +/** + * @unstable + */ +export type RPCSetVoiceSettings2ResultData = RPCSetVoiceSettingsResultData; +/** + * @unstable + */ +export type RPCSetVoiceSettings2Args = RPCSetVoiceSettingsArgs; + +/** + * @unstable + */ +export interface RPCStartPurchaseResultData {} +/** + * @unstable + */ +export interface RPCStartPurchaseArgs {} + +/** + * @unstable + */ +export interface RPCUpdateLobbyResultData {} +/** + * @unstable + */ +export interface RPCUpdateLobbyArgs {} + +/** + * @unstable + */ +export interface RPCUpdateLobbyMemberResultData {} +/** + * @unstable + */ +export interface RPCUpdateLobbyMemberArgs {} + +/** + * @unstable + */ +export interface RPCValidateApplicationResultData {} +/** + * @unstable + */ +export interface RPCValidateApplicationArgs {} + +/** + * https://discord.com/developers/docs/topics/rpc#commands-and-events-rpc-events + */ +export enum RPCEvents { + /** + * @unstable + */ + ActivityInvite = 'ACTIVITY_INVITE', + ActivityJoin = 'ACTIVITY_JOIN', + ActivityJoinRequest = 'ACTIVITY_JOIN_REQUEST', + ActivitySpectate = 'ACTIVITY_SPECTATE', + /** + * @unstable + */ + CaptureShortcutChange = 'CAPTURE_SHORTCUT_CHANGE', + ChannelCreate = 'CHANNEL_CREATE', + CurrentUserUpdate = 'CURRENT_USER_UPDATE', + /** + * @unstable + */ + EntitlementCreate = 'ENTITLEMENT_CREATE', + /** + * @unstable + */ + EntitlementDelete = 'ENTITLEMENT_DELETE', + Error = 'ERROR', + /** + * @unstable + */ + GameJoin = 'GAME_JOIN', + /** + * @unstable + */ + GameSpectate = 'GAME_SPECTATE', + GuildCreate = 'GUILD_CREATE', + GuildStatus = 'GUILD_STATUS', + /** + * @unstable + */ + LobbyDelete = 'LOBBY_DELETE', + /** + * @unstable + */ + LobbyMemberConnect = 'LOBBY_MEMBER_CONNECT', + /** + * @unstable + */ + LobbyMemberDisconnect = 'LOBBY_MEMBER_DISCONNECT', + /** + * @unstable + */ + LobbyMemberUpdate = 'LOBBY_MEMBER_UPDATE', + /** + * @unstable + */ + LobbyMessage = 'LOBBY_MESSAGE', + /** + * @unstable + */ + LobbyUpdate = 'LOBBY_UPDATE', + /** + * Dispatches message objects, with the exception of deletions, which only contains the id in the message object. + */ + MessageCreate = 'MESSAGE_CREATE', + /** + * Dispatches message objects, with the exception of deletions, which only contains the id in the message object. + */ + MessageDelete = 'MESSAGE_DELETE', + /** + * Dispatches message objects, with the exception of deletions, which only contains the id in the message object. + */ + MessageUpdate = 'MESSAGE_UPDATE', + /** + * This event requires the `rpc.notifications.read` [OAuth2 scope](https://discord.com/developers/docs/topics/oauth2#shared-resources-oauth2-scopes). + */ + NotificationCreate = 'NOTIFICATION_CREATE', + /** + * @unstable + */ + Overlay = 'OVERLAY', + /** + * @unstable + */ + OverlayUpdate = 'OVERLAY_UPDATE', + Ready = 'READY', + /** + * @unstable + */ + RelationshipUpdate = 'RELATIONSHIP_UPDATE', + SpeakingStart = 'SPEAKING_START', + SpeakingStop = 'SPEAKING_STOP', + UserAchievementUpdate = 'USER_ACHIEVEMENT_UPDATE', + VoiceChannelSelect = 'VOICE_CHANNEL_SELECT', + VoiceConnectionStatus = 'VOICE_CONNECTION_STATUS', + VoiceSettingsUpdate = 'VOICE_SETTINGS_UPDATE', + /** + * @unstable + */ + VoiceSettingsUpdate2 = 'VOICE_SETTINGS_UPDATE_2', + /** + * Dispatches channel voice state objects + */ + VoiceStateCreate = 'VOICE_STATE_CREATE', + /** + * Dispatches channel voice state objects + */ + VoiceStateDelete = 'VOICE_STATE_DELETE', + /** + * Dispatches channel voice state objects + */ + VoiceStateUpdate = 'VOICE_STATE_UPDATE', +} + +/** + * @unstable + */ + +export interface RPCSubscribeActivityInviteArgs {} + + +export interface RPCSubscribeActivityJoinArgs {} + + +export interface RPCSubscribeActivityJoinRequestArgs {} + + +export interface RPCSubscribeActivitySpectateArgs {} + +/** + * @unstable + */ + +export interface RPCSubscribeCaptureShortcutChangeArgs {} + + +export interface RPCSubscribeChannelCreateArgs {} + +/** + * @unstable + */ + +export interface RPCSubscribeCurrentUserUpdateArgs {} + +/** + * @unstable + */ + +export interface RPCSubscribeEntitlementCreateArgs {} + +/** + * @unstable + */ + +export interface RPCSubscribeEntitlementDeleteArgs {} + +/** + * @unstable + */ + +export interface RPCSubscribeGameJoinArgs {} + +/** + * @unstable + */ + +export interface RPCSubscribeGameSpectateArgs {} + + +export interface RPCSubscribeGuildCreateArgs {} + +/** + * https://discord.com/developers/docs/topics/rpc#guildstatus-guild-status-argument-structure + */ +export interface RPCSubscribeGuildStatusArgs { + /** + * id of guild to listen to updates of + */ + guild_id: Snowflake; +} + +/** + * @unstable + */ + +export interface RPCSubscribeLobbyDeleteArgs {} + +/** + * @unstable + */ + +export interface RPCSubscribeLobbyMemberConnectArgs {} + +/** + * @unstable + */ + +export interface RPCSubscribeLobbyMemberDisconnectArgs {} + +/** + * @unstable + */ + +export interface RPCSubscribeLobbyMemberUpdateArgs {} + +/** + * @unstable + */ + +export interface RPCSubscribeLobbyMessageArgs {} + +/** + * @unstable + */ + +export interface RPCSubscribeLobbyUpdateArgs {} + +/** + * https://discord.com/developers/docs/topics/rpc#messagecreatemessageupdatemessagedelete-message-argument-structure + */ +export interface RPCSubscribeMessageCreateArgs { + /** + * id of channel to listen to updates of + */ + channel_id: Snowflake; +} + +/** + * https://discord.com/developers/docs/topics/rpc#messagecreatemessageupdatemessagedelete-message-argument-structure + */ +export interface RPCSubscribeMessageDeleteArgs { + /** + * id of channel to listen to updates of + */ + channel_id: Snowflake; +} + +/** + * https://discord.com/developers/docs/topics/rpc#messagecreatemessageupdatemessagedelete-message-argument-structure + */ +export interface RPCSubscribeMessageUpdateArgs { + /** + * id of channel to listen to updates of + */ + channel_id: Snowflake; +} + + +export interface RPCSubscribeNotificationCreateArgs {} + +/** + * @unstable + */ + +export interface RPCSubscribeOverlayArgs {} + +/** + * @unstable + */ + +export interface RPCSubscribeOverlayUpdateArgs {} + +/** + * @unstable + */ + +export interface RPCSubscribeRelationshipUpdateArgs {} + +/** + * https://discord.com/developers/docs/topics/rpc#speakingstartspeakingstop-speaking-argument-structure + */ +export interface RPCSubscribeSpeakingStartArgs { + /** + * id of channel to listen to updates of + */ + channel_id: Snowflake; +} + +/** + * https://discord.com/developers/docs/topics/rpc#speakingstartspeakingstop-speaking-argument-structure + */ +export interface RPCSubscribeSpeakingStopArgs { + /** + * id of channel to listen to updates of + */ + channel_id: Snowflake; +} + +/** + * @unstable + */ + +export interface RPCSubscribeUserAchievementUpdateArgs {} + + +export interface RPCSubscribeVoiceChannelSelectArgs {} + +/** + * @unstable + */ + +export interface RPCSubscribeVoiceConnectionStatusArgs {} + + +export interface RPCSubscribeVoiceSettingsUpdateArgs {} + +/** + * @unstable + */ + +export interface RPCSubscribeVoiceSettingsUpdate2Args {} + +/** + * https://discord.com/developers/docs/topics/rpc#voicestatecreatevoicestateupdatevoicestatedelete-voice-state-argument-structure + */ +export interface RPCSubscribeVoiceStateCreateArgs { + /** + * id of channel to listen to updates of + */ + channel_id: Snowflake; +} + +/** + * https://discord.com/developers/docs/topics/rpc#voicestatecreatevoicestateupdatevoicestatedelete-voice-state-argument-structure + */ +export interface RPCSubscribeVoiceStateDeleteArgs { + /** + * id of channel to listen to updates of + */ + channel_id: Snowflake; +} + +/** + * https://discord.com/developers/docs/topics/rpc#voicestatecreatevoicestateupdatevoicestatedelete-voice-state-argument-structure + */ +export interface RPCSubscribeVoiceStateUpdateArgs { + /** + * id of channel to listen to updates of + */ + channel_id: Snowflake; +} + +/** + * @unstable + */ + +export interface RPCActivityInviteDispatchData {} + +/** + * https://discord.com/developers/docs/topics/rpc#activityjoin-activity-join-dispatch-data-structure + */ +export interface RPCActivityJoinDispatchData { + /** + * the [`join_secret`](https://discord.com/developers/docs/developer-tools/game-sdk#activitysecrets-struct) for the given invite + */ + secret: string; +} + +/** + * https://discord.com/developers/docs/topics/rpc#activityjoinrequest-activity-join-request-data-structure + */ +export interface RPCActivityJoinRequestDispatchData { + /** + * information about the user requesting to join + */ + user: APIUser; +} + +/** + * https://discord.com/developers/docs/topics/rpc#activityspectate-activity-spectate-dispatch-data-structure + */ +export interface RPCActivitySpectateDispatchData { + /** + * the [`spectate_secret`](https://discord.com/developers/docs/developer-tools/game-sdk#activitysecrets-struct) for the given invite + */ + secret: string; +} + +/** + * @unstable + */ + +export interface RPCCaptureShortcutChangeDispatchData {} + +/** + * https://discord.com/developers/docs/topics/rpc#channelcreate-channel-create-dispatch-data-structure + */ +export interface RPCChannelCreateDispatchData { + /** + * channel id + */ + id: Snowflake; + /** + * name of the channel + */ + name: string; + /** + * channel type + */ + type: ChannelType; +} + +/** + * @unstable + */ + +export interface RPCCurrentUserUpdateDispatchData {} + +/** + * @unstable + */ + +export interface RPCEntitlementCreateDispatchData {} + +/** + * @unstable + */ + +export interface RPCEntitlementDeleteDispatchData {} + +/** + * https://discord.com/developers/docs/topics/rpc#error-error-data-structure + */ +export interface RPCErrorDispatchData { + /** + * RPC Error Code + */ + code: RPCErrorCodes; + /** + * Error description + */ + message: string; +} + +/** + * @unstable + */ +export interface RPCGameJoinDispatchData {} + +/** + * @unstable + */ +export interface RPCGameSpectateDispatchData {} + +/** + * https://discord.com/developers/docs/topics/rpc#guildcreate-guild-create-dispatch-data-structure + */ +export interface RPCGuildCreateDispatchData { + /** + * guild id + */ + id: Snowflake; + /** + * name of the guild + */ + name: string; +} + +/** + * https://discord.com/developers/docs/topics/rpc#guildstatus-guild-status-dispatch-data-structure + */ +export interface RPCGuildStatusDispatchData { + /** + * guild with requested id + */ + guild: APIPartialGuild; + /** + * number of online users in guild + * + * @deprecated This will always be 0 + */ + online: number; +} + +/** + * @unstable + */ +export interface RPCLobbyDeleteDispatchData {} + +/** + * @unstable + */ +export interface RPCLobbyMemberConnectDispatchData {} + +/** + * @unstable + */ +export interface RPCLobbyMemberDisconnectDispatchData {} + +/** + * @unstable + */ +export interface RPCLobbyMemberUpdateDispatchData {} + +/** + * @unstable + */ +export interface RPCLobbyMessageDispatchData {} + +/** + * @unstable + */ +export interface RPCLobbyUpdateDispatchData {} + +/** + * https://discord.com/developers/docs/topics/rpc#messagecreatemessageupdatemessagedelete-example-message-dispatch-payload + */ +export interface RPCMessageCreateDispatchData { + /** + * id of channel where message was sent + */ + channel_id: Snowflake; + /** + * message that was created + */ + message: APIMessage; +} + +/** + * https://discord.com/developers/docs/topics/rpc#messagecreatemessageupdatemessagedelete-example-message-dispatch-payload + */ +export interface RPCMessageDeleteDispatchData { + /** + * id of channel where message was deleted + */ + channel_id: Snowflake; + /** + * message that was deleted (only id) + */ + message: Pick; +} + +/** + * https://discord.com/developers/docs/topics/rpc#messagecreatemessageupdatemessagedelete-example-message-dispatch-payload + */ +export interface RPCMessageUpdateDispatchData { + /** + * id of channel where message was updated + */ + channel_id: Snowflake; + /** + * message that was updated + */ + message: APIMessage; +} + +/** + * https://discord.com/developers/docs/topics/rpc#notificationcreate-notification-create-dispatch-data-structure + */ +export interface RPCNotificationCreateDispatchData { + /** + * body of the notification + */ + body: string; + /** + * id of channel where notification occurred + */ + channel_id: Snowflake; + /** + * icon url of the notification + */ + icon_url: string; + /** + * message that generated this notification + */ + message: APIMessage; + /** + * title of the notification + */ + title: string; +} + +/** + * @unstable + */ +export interface RPCOverlayDispatchData {} + +/** + * @unstable + */ +export interface RPCOverlayUpdateDispatchData {} + +/** + * https://discord.com/developers/docs/topics/rpc#ready-rpc-server-configuration-object + */ +export interface RPCServerConfiguration { + /** + * server's api endpoint + */ + api_endpoint: string; + /** + * server's cdn + */ + cdn_host: string; + /** + * server's environment + */ + environment: string; +} + +/** + * https://discord.com/developers/docs/topics/rpc#ready-ready-dispatch-data-structure + */ +export interface RPCReadyDispatchData { + /** + * server configuration + */ + config: RPCServerConfiguration; + /** + * the user to whom you are connected + */ + user: APIUser; + /** + * RPC version + */ + v: 1; +} + +/** + * @unstable + */ +export interface RPCRelationshipUpdateDispatchData {} + +/** + * https://discord.com/developers/docs/topics/rpc#speakingstartspeakingstop-speaking-dispatch-data-structure + */ +export interface RPCSpeakingStartDispatchData { + /** + * id of user who started speaking + */ + user_id: Snowflake; +} + +/** + * https://discord.com/developers/docs/topics/rpc#speakingstartspeakingstop-speaking-dispatch-data-structure + */ +export interface RPCSpeakingStopDispatchData { + /** + * id of user who stopped speaking + */ + user_id: Snowflake; +} + +/** + * @unstable + */ +export interface RPCUserAchievementUpdateDispatchData {} + +/** + * https://discord.com/developers/docs/topics/rpc#voicechannelselect-voice-channel-select-dispatch-data-structure + */ +export interface RPCVoiceChannelSelectDispatchData { + /** + * id of channel (`null` if none) + */ + channel_id: Snowflake | null; + /** + * id of guild (`null` if none) + */ + guild_id: Snowflake | null; +} + +/** + * https://discord.com/developers/docs/topics/rpc#voiceconnectionstatus-voice-connection-status-dispatch-data-structure + */ +export interface RPCVoiceConnectionStatusDispatchData { + /** + * average ping (in ms) + */ + average_ping: number; + /** + * hostname of the connected voice server + */ + hostname: string; + /** + * last ping (in ms) + */ + last_ping: number; + /** + * last 20 pings (in ms) + */ + pings: number[]; + /** + * voice connection states + */ + state: VoiceConnectionStates; +} + +export type RPCVoiceSettingsUpdateDispatchData = RPCGetVoiceSettingsResultData; + +/** + * @unstable + */ +export type RPCVoiceSettingsUpdate2DispatchData = RPCGetVoiceSettingsResultData; + +/** + * https://discord.com/developers/docs/topics/rpc#voicestatecreatevoicestateupdatevoicestatedelete-example-voice-state-dispatch-payload + */ +export interface RPCVoiceStateCreateDispatchData { + /** + * is user muted for the client user + */ + mute: boolean; + /** + * nickname of user + */ + nick: string; + /** + * pan of user + */ + pan: RPCVoicePan; + /** + * user who joined voice channel + */ + user: APIUser; + /** + * voice state of user + */ + voice_state: APIVoiceState; + /** + * volume of user + */ + volume: number; +} + +/** + * https://discord.com/developers/docs/topics/rpc#voicestatecreatevoicestateupdatevoicestatedelete-example-voice-state-dispatch-payload + */ +export interface RPCVoiceStateDeleteDispatchData { + /** + * is user muted for the client user + */ + mute: boolean; + /** + * nickname of user + */ + nick: string; + /** + * pan of user + */ + pan: RPCVoicePan; + /** + * user who joined voice channel + */ + user: APIUser; + /** + * voice state of user + */ + voice_state: APIVoiceState; + /** + * volume of user + */ + volume: number; +} + +/** + * https://discord.com/developers/docs/topics/rpc#voicestatecreatevoicestateupdatevoicestatedelete-example-voice-state-dispatch-payload + */ +export interface RPCVoiceStateUpdateDispatchData { + /** + * is user muted for the client user + */ + mute: boolean; + /** + * nickname of user + */ + nick: string; + /** + * pan of user + */ + pan: RPCVoicePan; + /** + * user who joined voice channel + */ + user: APIUser; + /** + * voice state of user + */ + voice_state: APIVoiceState; + /** + * volume of user + */ + volume: number; +} + +export interface BaseRPCMessage { + cmd: Cmd; +} + +export interface RPCCommandMessage extends BaseRPCMessage { + nonce: string; +} + +export interface RPCSubscribeMessage< + Evt extends RPCEvents, + Cmd extends RPCCommands.Subscribe | RPCCommands.Unsubscribe = RPCCommands.Subscribe | RPCCommands.Unsubscribe, +> extends RPCCommandMessage { + evt: Evt; +} + +export interface RPCCommandAuthorizePayload extends RPCCommandMessage { + args: RPCAuthorizeArgs; +} + +export interface RPCCommandAuthenticatePayload extends RPCCommandMessage { + args: RPCAuthenticateArgs; +} + +export interface RPCCommandGetChannelPayload extends RPCCommandMessage { + args: RPCGetChannelArgs; +} + +export interface RPCCommandGetChannelsPayload extends RPCCommandMessage { + args: RPCGetChannelsArgs; +} + +export interface RPCCommandGetGuildPayload extends RPCCommandMessage { + args: RPCGetGuildArgs; +} + +export interface RPCCommandGetGuildsPayload extends RPCCommandMessage { + args: RPCGetGuildsArgs; +} + +export interface RPCCommandGetUserPayload extends RPCCommandMessage { + args: RPCGetUserArgs; +} + +export interface RPCCommandGetVoiceSettingsPayload extends RPCCommandMessage { + args: RPCGetVoiceSettingsArgs; +} + +export interface RPCCommandSelectTextChannelPayload extends RPCCommandMessage { + args: RPCSelectTextChannelArgs; +} + +export interface RPCCommandSelectVoiceChannelPayload extends RPCCommandMessage { + args: RPCSelectVoiceChannelArgs; +} + +export interface RPCCommandSetActivityPayload extends RPCCommandMessage { + args: RPCSetActivityArgs; +} + +export interface RPCCommandSetVoiceSettingsPayload extends RPCCommandMessage { + args: RPCSetVoiceSettingsArgs; +} + +export type RPCCommandSubscribePayload = + | RPCSubscribeActivityInvite + | RPCSubscribeActivityJoin + | RPCSubscribeActivityJoinRequest + | RPCSubscribeActivitySpectate + | RPCSubscribeCaptureShortcutChange + | RPCSubscribeChannelCreate + | RPCSubscribeCurrentUserUpdate + | RPCSubscribeEntitlementCreate + | RPCSubscribeEntitlementDelete + | RPCSubscribeGameJoin + | RPCSubscribeGameSpectate + | RPCSubscribeGuildCreate + | RPCSubscribeGuildStatus + | RPCSubscribeLobbyDelete + | RPCSubscribeLobbyMemberConnect + | RPCSubscribeLobbyMemberDisconnect + | RPCSubscribeLobbyMemberUpdate + | RPCSubscribeLobbyMessage + | RPCSubscribeLobbyUpdate + | RPCSubscribeMessageCreate + | RPCSubscribeMessageDelete + | RPCSubscribeMessageUpdate + | RPCSubscribeNotificationCreate + | RPCSubscribeOverlay + | RPCSubscribeOverlayUpdate + | RPCSubscribeRelationshipUpdate + | RPCSubscribeSpeakingStart + | RPCSubscribeSpeakingStop + | RPCSubscribeUserAchievementUpdate + | RPCSubscribeVoiceChannelSelect + | RPCSubscribeVoiceConnectionStatus + | RPCSubscribeVoiceSettingsUpdate + | RPCSubscribeVoiceSettingsUpdate2 + | RPCSubscribeVoiceStateCreate + | RPCSubscribeVoiceStateDelete + | RPCSubscribeVoiceStateUpdate; + +export type RPCCommandUnsubscribePayload = RPCCommandSubscribePayload; + +export interface RPCCommandAcceptActivityInvitePayload extends RPCCommandMessage { + args: RPCAcceptActivityInviteArgs; +} + +export interface RPCCommandActivityInviteUserPayload extends RPCCommandMessage { + args: RPCActivityInviteUserArgs; +} + +export interface RPCCommandBraintreePopupBridgeCallbackPayload + extends RPCCommandMessage { + args: RPCBraintreePopupBridgeCallbackArgs; +} + +export interface RPCCommandBrowserPayload extends RPCCommandMessage { + args: RPCBrowserHandoffArgs; +} + +export interface RPCCommandCaptureShortcutPayload extends RPCCommandMessage { + args: RPCCaptureShortcutArgs; +} + +export interface RPCCommandCloseActivityJoinRequestPayload extends RPCCommandMessage { + args: RPCCloseActivityRequestArgs; +} + +export interface RPCCommandConnectToLobbyPayload extends RPCCommandMessage { + args: RPCConnectToLobbyArgs; +} + +export interface RPCCommandConnectToLobbyVoicePayload extends RPCCommandMessage { + args: RPCConnectToLobbyVoiceArgs; +} + +export interface RPCCommandConnectionsCallbackPayload extends RPCCommandMessage { + args: RPCConnectionsCallbackArgs; +} + +export interface RPCCommandCreateChannelInvitePayload extends RPCCommandMessage { + args: RPCCreateChannelInviteArgs; +} + +export interface RPCCommandCreateLobbyPayload extends RPCCommandMessage { + args: RPCCreateLobbyArgs; +} + +export interface RPCCommandDeepLinkPayload extends RPCCommandMessage { + args: RPCDeepLinkArgs; +} + +export interface RPCCommandDeleteLobbyPayload extends RPCCommandMessage { + args: RPCDeleteLobbyArgs; +} + +export interface RPCCommandDisconnectFromLobbyPayload extends RPCCommandMessage { + args: RPCDisconnectFromLobbyArgs; +} + +export interface RPCCommandDisconnectFromLobbyVoicePayload + extends RPCCommandMessage { + args: RPCDisconnectFromLobbyVoiceArgs; +} + +export interface RPCCommandGetApplicationTicketPayload extends RPCCommandMessage { + args: RPCGetApplicationTicketArgs; +} + +export interface RPCCommandGetEntitlementTicketPayload extends RPCCommandMessage { + args: RPCGetEntitlementTicketArgs; +} + +export interface RPCCommandGetEntitlementsPayload extends RPCCommandMessage { + args: RPCGetEntitlementsArgs; +} + +export interface RPCCommandGetImagePayload extends RPCCommandMessage { + args: RPCGetImageArgs; +} + +export interface RPCCommandGetNetworkingConfigPayload extends RPCCommandMessage { + args: RPCGetNetworkingConfigArgs; +} + +export interface RPCCommandGetRelationshipsPayload extends RPCCommandMessage { + args: RPCGetRelationshipsArgs; +} + +export interface RPCCommandGetSelectedVoiceChannelPayload + extends RPCCommandMessage { + args: RPCGetSelectedVoiceChannelArgs; +} + +export interface RPCCommandGetSkusPayload extends RPCCommandMessage { + args: RPCGetSkusArgs; +} + +export interface RPCCommandGetUserAchievementsPayload extends RPCCommandMessage { + args: RPCGetUserAchievementsArgs; +} + +export interface RPCCommandGiftCodeBrowserPayload extends RPCCommandMessage { + args: RPCGiftCodeBrowserArgs; +} + +export interface RPCCommandGuildTemplateBrowserPayload extends RPCCommandMessage { + args: RPCGuildTemplateBrowserArgs; +} + +export interface RPCCommandInviteBrowserPayload extends RPCCommandMessage { + args: RPCInviteBrowserArgs; +} + +export interface RPCCommandNetworkingCreateTokenPayload extends RPCCommandMessage { + args: RPCNetworkingCreateTokenArgs; +} + +export interface RPCCommandNetworkingPeerMetricsPayload extends RPCCommandMessage { + args: RPCNetworkingPeerMetricsArgs; +} + +export interface RPCCommandNetworkingSystemMetricsPayload + extends RPCCommandMessage { + args: RPCNetworkingSystemMetricsArgs; +} + +export interface RPCCommandOpenOverlayActivityInvitePayload + extends RPCCommandMessage { + args: RPCOpenOverlayActivityInviteArgs; +} + +export interface RPCCommandOpenOverlayGuildInvitePayload extends RPCCommandMessage { + args: RPCOpenOverlayGuildInviteArgs; +} + +export interface RPCCommandOpenOverlayVoiceSettingsPayload + extends RPCCommandMessage { + args: RPCOpenOverlayVoiceSettingsArgs; +} + +export interface RPCCommandOverlayPayload extends RPCCommandMessage { + args: RPCOverlayArgs; +} + +export interface RPCCommandSearchLobbiesPayload extends RPCCommandMessage { + args: RPCSearchLobbiesArgs; +} + +export interface RPCCommandSendActivityJoinInvitePayload extends RPCCommandMessage { + args: RPCSendActivityJoinInviteArgs; +} + +export interface RPCCommandSendToLobbyPayload extends RPCCommandMessage { + args: RPCSendToLobbyArgs; +} + +export interface RPCCommandSetCertifiedDevicesPayload extends RPCCommandMessage { + args: RPCSetCertifiedDevicesArgs; +} + +export interface RPCCommandSetOverlayLockedPayload extends RPCCommandMessage { + args: RPCSetOverlayLockedArgs; +} + +export interface RPCCommandSetUserAchievementPayload extends RPCCommandMessage { + args: RPCSetUserAchievementArgs; +} + +export interface RPCCommandSetUserVoiceSettingsPayload extends RPCCommandMessage { + args: RPCSetUserVoiceSettingsArgs; +} + +export interface RPCCommandSetUserVoiceSettings2Payload extends RPCCommandMessage { + args: RPCSetUserVoiceSettings2Args; +} + +export interface RPCCommandSetVoiceSettings2Payload extends RPCCommandMessage { + args: RPCSetVoiceSettings2Args; +} + +export interface RPCCommandStartPurchasePayload extends RPCCommandMessage { + args: RPCStartPurchaseArgs; +} + +export interface RPCCommandUpdateLobbyPayload extends RPCCommandMessage { + args: RPCUpdateLobbyArgs; +} + +export interface RPCCommandUpdateLobbyMemberPayload extends RPCCommandMessage { + args: RPCUpdateLobbyMemberArgs; +} + +export interface RPCCommandValidateApplicationPayload extends RPCCommandMessage { + args: RPCValidateApplicationArgs; +} + +export interface RPCSubscribeActivityInvite extends RPCSubscribeMessage { + args: RPCSubscribeActivityInviteArgs; + evt: RPCEvents.ActivityInvite; +} + +export interface RPCSubscribeActivityJoin extends RPCSubscribeMessage { + args: RPCSubscribeActivityJoinArgs; + evt: RPCEvents.ActivityJoin; +} + +export interface RPCSubscribeActivityJoinRequest extends RPCSubscribeMessage { + args: RPCSubscribeActivityJoinRequestArgs; + evt: RPCEvents.ActivityJoinRequest; +} + +export interface RPCSubscribeActivitySpectate extends RPCSubscribeMessage { + args: RPCSubscribeActivitySpectateArgs; + evt: RPCEvents.ActivitySpectate; +} + +export interface RPCSubscribeCaptureShortcutChange extends RPCSubscribeMessage { + args: RPCSubscribeCaptureShortcutChangeArgs; + evt: RPCEvents.CaptureShortcutChange; +} + +export interface RPCSubscribeChannelCreate extends RPCSubscribeMessage { + args: RPCSubscribeChannelCreateArgs; + evt: RPCEvents.ChannelCreate; +} + +export interface RPCSubscribeCurrentUserUpdate extends RPCSubscribeMessage { + args: RPCSubscribeCurrentUserUpdateArgs; + evt: RPCEvents.CurrentUserUpdate; +} + +export interface RPCSubscribeEntitlementCreate extends RPCSubscribeMessage { + args: RPCSubscribeEntitlementCreateArgs; + evt: RPCEvents.EntitlementCreate; +} + +export interface RPCSubscribeEntitlementDelete extends RPCSubscribeMessage { + args: RPCSubscribeEntitlementDeleteArgs; + evt: RPCEvents.EntitlementDelete; +} + +export interface RPCSubscribeGameJoin extends RPCSubscribeMessage { + args: RPCSubscribeGameJoinArgs; + evt: RPCEvents.GameJoin; +} + +export interface RPCSubscribeGameSpectate extends RPCSubscribeMessage { + args: RPCSubscribeGameSpectateArgs; + evt: RPCEvents.GameSpectate; +} + +export interface RPCSubscribeGuildCreate extends RPCSubscribeMessage { + args: RPCSubscribeGuildCreateArgs; + evt: RPCEvents.GuildCreate; +} + +export interface RPCSubscribeGuildStatus extends RPCSubscribeMessage { + args: RPCSubscribeGuildStatusArgs; + evt: RPCEvents.GuildStatus; +} + +export interface RPCSubscribeLobbyDelete extends RPCSubscribeMessage { + args: RPCSubscribeLobbyDeleteArgs; + evt: RPCEvents.LobbyDelete; +} + +export interface RPCSubscribeLobbyMemberConnect extends RPCSubscribeMessage { + args: RPCSubscribeLobbyMemberConnectArgs; + evt: RPCEvents.LobbyMemberConnect; +} + +export interface RPCSubscribeLobbyMemberDisconnect extends RPCSubscribeMessage { + args: RPCSubscribeLobbyMemberDisconnectArgs; + evt: RPCEvents.LobbyMemberDisconnect; +} + +export interface RPCSubscribeLobbyMemberUpdate extends RPCSubscribeMessage { + args: RPCSubscribeLobbyMemberUpdateArgs; + evt: RPCEvents.LobbyMemberUpdate; +} + +export interface RPCSubscribeLobbyMessage extends RPCSubscribeMessage { + args: RPCSubscribeLobbyMessageArgs; + evt: RPCEvents.LobbyMessage; +} + +export interface RPCSubscribeLobbyUpdate extends RPCSubscribeMessage { + args: RPCSubscribeLobbyUpdateArgs; + evt: RPCEvents.LobbyUpdate; +} + +export interface RPCSubscribeMessageCreate extends RPCSubscribeMessage { + args: RPCSubscribeMessageCreateArgs; + evt: RPCEvents.MessageCreate; +} + +export interface RPCSubscribeMessageDelete extends RPCSubscribeMessage { + args: RPCSubscribeMessageDeleteArgs; + evt: RPCEvents.MessageDelete; +} + +export interface RPCSubscribeMessageUpdate extends RPCSubscribeMessage { + args: RPCSubscribeMessageUpdateArgs; + evt: RPCEvents.MessageUpdate; +} + +export interface RPCSubscribeNotificationCreate extends RPCSubscribeMessage { + args: RPCSubscribeNotificationCreateArgs; + evt: RPCEvents.NotificationCreate; +} + +export interface RPCSubscribeOverlay extends RPCSubscribeMessage { + args: RPCSubscribeOverlayArgs; + evt: RPCEvents.Overlay; +} + +export interface RPCSubscribeOverlayUpdate extends RPCSubscribeMessage { + args: RPCSubscribeOverlayUpdateArgs; + evt: RPCEvents.OverlayUpdate; +} + +export interface RPCSubscribeRelationshipUpdate extends RPCSubscribeMessage { + args: RPCSubscribeRelationshipUpdateArgs; + evt: RPCEvents.RelationshipUpdate; +} + +export interface RPCSubscribeSpeakingStart extends RPCSubscribeMessage { + args: RPCSubscribeSpeakingStartArgs; + evt: RPCEvents.SpeakingStart; +} + +export interface RPCSubscribeSpeakingStop extends RPCSubscribeMessage { + args: RPCSubscribeSpeakingStopArgs; + evt: RPCEvents.SpeakingStop; +} + +export interface RPCSubscribeUserAchievementUpdate extends RPCSubscribeMessage { + args: RPCSubscribeUserAchievementUpdateArgs; + evt: RPCEvents.UserAchievementUpdate; +} + +export interface RPCSubscribeVoiceChannelSelect extends RPCSubscribeMessage { + args: RPCSubscribeVoiceChannelSelectArgs; + evt: RPCEvents.VoiceChannelSelect; +} + +export interface RPCSubscribeVoiceConnectionStatus extends RPCSubscribeMessage { + args: RPCSubscribeVoiceConnectionStatusArgs; + evt: RPCEvents.VoiceConnectionStatus; +} + +export interface RPCSubscribeVoiceSettingsUpdate extends RPCSubscribeMessage { + args: RPCSubscribeVoiceSettingsUpdateArgs; + evt: RPCEvents.VoiceSettingsUpdate; +} + +export interface RPCSubscribeVoiceSettingsUpdate2 extends RPCSubscribeMessage { + args: RPCSubscribeVoiceSettingsUpdate2Args; + evt: RPCEvents.VoiceSettingsUpdate2; +} + +export interface RPCSubscribeVoiceStateCreate extends RPCSubscribeMessage { + args: RPCSubscribeVoiceStateCreateArgs; + evt: RPCEvents.VoiceStateCreate; +} + +export interface RPCSubscribeVoiceStateDelete extends RPCSubscribeMessage { + args: RPCSubscribeVoiceStateDeleteArgs; + evt: RPCEvents.VoiceStateDelete; +} + +export interface RPCSubscribeVoiceStateUpdate extends RPCSubscribeMessage { + args: RPCSubscribeVoiceStateUpdateArgs; + evt: RPCEvents.VoiceStateUpdate; +} + +export interface RPCAuthorizeResult extends RPCCommandMessage { + data: RPCAuthorizeResultData; +} + +export interface RPCAuthenticateResult extends RPCCommandMessage { + data: RPCAuthenticateResultData; +} + +export interface RPCGetChannelResult extends RPCCommandMessage { + data: RPCGetChannelResultData; +} + +export interface RPCGetChannelsResult extends RPCCommandMessage { + data: RPCGetChannelsResultData; +} + +export interface RPCGetGuildResult extends RPCCommandMessage { + data: RPCGetGuildResultData; +} + +export interface RPCGetGuildsResult extends RPCCommandMessage { + data: RPCGetGuildsResultData; +} + +export interface RPCGetUserResult extends RPCCommandMessage { + data: RPCGetUserResultData; +} + +export interface RPCGetVoiceSettingsResult extends RPCCommandMessage { + data: RPCGetVoiceSettingsResultData; +} + +export interface RPCSelectTextChannelResult extends RPCCommandMessage { + data: RPCSelectTextChannelResultData; +} + +export interface RPCSelectVoiceChannelResult extends RPCCommandMessage { + data: RPCSelectVoiceChannelResultData; +} + +export interface RPCSetActivityResult extends RPCCommandMessage { + data: RPCSetActivityResultData; +} + +export interface RPCSetVoiceSettingsResult extends RPCCommandMessage { + data: RPCSetVoiceSettingsResultData; +} + +export interface RPCSubscribeResult extends RPCCommandMessage { + data: RPCSubscribeResultData; +} + +export interface RPCUnsubscribeResult extends RPCCommandMessage { + data: RPCUnsubscribeResultData; +} + +export interface RPCAcceptActivityInviteResult extends RPCCommandMessage { + data: RPCAcceptActivityInviteResultData; +} + +export interface RPCActivityInviteUserResult extends RPCCommandMessage { + data: RPCActivityInviteUserResultData; +} + +export interface RPCBraintreePopupBridgeCallbackResult + extends RPCCommandMessage { + data: RPCBraintreePopupBridgeCallbackResultData; +} + +export interface RPCBrowserResult extends RPCCommandMessage { + data: RPCBrowserHandoffResultData; +} + +export interface RPCCaptureShortcutResult extends RPCCommandMessage { + data: RPCCaptureShortcutResultData; +} + +export interface RPCCloseActivityRequestResult extends RPCCommandMessage { + data: RPCCloseActivityRequestResultData; +} + +export interface RPCConnectToLobbyResult extends RPCCommandMessage { + data: RPCConnectToLobbyResultData; +} + +export interface RPCConnectToLobbyVoiceResult extends RPCCommandMessage { + data: RPCConnectToLobbyVoiceResultData; +} + +export interface RPCConnectionsCallbackResult extends RPCCommandMessage { + data: RPCConnectionsCallbackResultData; +} + +export interface RPCCreateChannelInviteResult extends RPCCommandMessage { + data: RPCCreateChannelInviteResultData; +} + +export interface RPCCreateLobbyResult extends RPCCommandMessage { + data: RPCCreateLobbyResultData; +} + +export interface RPCDeepLinkResult extends RPCCommandMessage { + data: RPCDeepLinkResultData; +} + +export interface RPCDeleteLobbyResult extends RPCCommandMessage { + data: RPCDeleteLobbyResultData; +} + +export interface RPCDisconnectFromLobbyResult extends RPCCommandMessage { + data: RPCDisconnectFromLobbyResultData; +} + +export interface RPCDisconnectFromLobbyVoiceResult extends RPCCommandMessage { + data: RPCDisconnectFromLobbyVoiceResultData; +} + +export interface RPCGetApplicationTicketResult extends RPCCommandMessage { + data: RPCGetApplicationTicketResultData; +} + +export interface RPCGetEntitlementTicketResult extends RPCCommandMessage { + data: RPCGetEntitlementTicketResultData; +} + +export interface RPCGetEntitlementsResult extends RPCCommandMessage { + data: RPCGetEntitlementsResultData; +} + +export interface RPCGetImageResult extends RPCCommandMessage { + data: RPCGetImageResultData; +} + +export interface RPCGetNetworkingConfigResult extends RPCCommandMessage { + data: RPCGetNetworkingConfigResultData; +} + +export interface RPCGetRelationshipsResult extends RPCCommandMessage { + data: RPCGetRelationshipsResultData; +} + +export interface RPCGetSelectedVoiceChannelResult extends RPCCommandMessage { + data: RPCGetSelectedVoiceChannelResultData; +} + +export interface RPCGetSkusResult extends RPCCommandMessage { + data: RPCGetSkusResultData; +} + +export interface RPCGetUserAchievementsResult extends RPCCommandMessage { + data: RPCGetUserAchievementsResultData; +} + +export interface RPCGiftCodeBrowserResult extends RPCCommandMessage { + data: RPCGiftCodeBrowserResultData; +} + +export interface RPCGuildTemplateBrowserResult extends RPCCommandMessage { + data: RPCGuildTemplateBrowserResultData; +} + +export interface RPCInviteBrowserResult extends RPCCommandMessage { + data: RPCInviteBrowserResultData; +} + +export interface RPCNetworkingCreateTokenResult extends RPCCommandMessage { + data: RPCNetworkingCreateTokenResultData; +} + +export interface RPCNetworkingPeerMetricsResult extends RPCCommandMessage { + data: RPCNetworkingPeerMetricsResultData; +} + +export interface RPCNetworkingSystemMetricsResult extends RPCCommandMessage { + data: RPCNetworkingSystemMetricsResultData; +} + +export interface RPCOpenOverlayActivityInviteResult extends RPCCommandMessage { + data: RPCOpenOverlayActivityInviteResultData; +} + +export interface RPCOpenOverlayGuildInviteResult extends RPCCommandMessage { + data: RPCOpenOverlayGuildInviteResultData; +} + +export interface RPCOpenOverlayVoiceSettingsResult extends RPCCommandMessage { + data: RPCOpenOverlayVoiceSettingsResultData; +} + +export interface RPCOverlayResult extends RPCCommandMessage { + data: RPCOverlayResultData; +} + +export interface RPCSearchLobbiesResult extends RPCCommandMessage { + data: RPCSearchLobbiesResultData; +} + +export interface RPCSendActivityJoinInviteResult extends RPCCommandMessage { + data: RPCSendActivityJoinInviteResultData; +} + +export interface RPCSendToLobbyResult extends RPCCommandMessage { + data: RPCSendToLobbyResultData; +} + +export interface RPCSetCertifiedDevicesResult extends RPCCommandMessage { + data: RPCSetCertifiedDevicesResultData; +} + +export interface RPCSetOverlayLockedResult extends RPCCommandMessage { + data: RPCSetOverlayLockedResultData; +} + +export interface RPCSetUserAchievementResult extends RPCCommandMessage { + data: RPCSetUserAchievementResultData; +} + +export interface RPCSetUserVoiceSettingsResult extends RPCCommandMessage { + data: RPCSetUserVoiceSettingsResultData; +} + +export interface RPCSetUserVoiceSettings2Result extends RPCCommandMessage { + data: RPCSetUserVoiceSettings2ResultData; +} + +export interface RPCSetVoiceSettings2Result extends RPCCommandMessage { + data: RPCSetVoiceSettings2ResultData; +} + +export interface RPCStartPurchaseResult extends RPCCommandMessage { + data: RPCStartPurchaseResultData; +} + +export interface RPCUpdateLobbyResult extends RPCCommandMessage { + data: RPCUpdateLobbyResultData; +} + +export interface RPCUpdateLobbyMemberResult extends RPCCommandMessage { + data: RPCUpdateLobbyMemberResultData; +} + +export interface RPCValidateApplicationResult extends RPCCommandMessage { + data: RPCValidateApplicationResultData; +} + +export type RPCCommandsResult = + | RPCAcceptActivityInviteResult + | RPCActivityInviteUserResult + | RPCAuthenticateResult + | RPCAuthorizeResult + | RPCBraintreePopupBridgeCallbackResult + | RPCBrowserResult + | RPCCaptureShortcutResult + | RPCCloseActivityRequestResult + | RPCConnectionsCallbackResult + | RPCConnectToLobbyResult + | RPCConnectToLobbyVoiceResult + | RPCCreateChannelInviteResult + | RPCCreateLobbyResult + | RPCDeepLinkResult + | RPCDeleteLobbyResult + | RPCDisconnectFromLobbyResult + | RPCDisconnectFromLobbyVoiceResult + | RPCGetApplicationTicketResult + | RPCGetChannelResult + | RPCGetChannelsResult + | RPCGetEntitlementsResult + | RPCGetEntitlementTicketResult + | RPCGetGuildResult + | RPCGetGuildsResult + | RPCGetImageResult + | RPCGetNetworkingConfigResult + | RPCGetRelationshipsResult + | RPCGetSelectedVoiceChannelResult + | RPCGetSkusResult + | RPCGetUserAchievementsResult + | RPCGetUserResult + | RPCGetVoiceSettingsResult + | RPCGiftCodeBrowserResult + | RPCGuildTemplateBrowserResult + | RPCInviteBrowserResult + | RPCNetworkingCreateTokenResult + | RPCNetworkingPeerMetricsResult + | RPCNetworkingSystemMetricsResult + | RPCOpenOverlayActivityInviteResult + | RPCOpenOverlayGuildInviteResult + | RPCOpenOverlayVoiceSettingsResult + | RPCOverlayResult + | RPCSearchLobbiesResult + | RPCSelectTextChannelResult + | RPCSelectVoiceChannelResult + | RPCSendActivityJoinInviteResult + | RPCSendToLobbyResult + | RPCSetActivityResult + | RPCSetCertifiedDevicesResult + | RPCSetOverlayLockedResult + | RPCSetUserAchievementResult + | RPCSetUserVoiceSettings2Result + | RPCSetUserVoiceSettingsResult + | RPCSetVoiceSettings2Result + | RPCSetVoiceSettingsResult + | RPCStartPurchaseResult + | RPCSubscribeResult + | RPCUnsubscribeResult + | RPCUpdateLobbyMemberResult + | RPCUpdateLobbyResult + | RPCValidateApplicationResult; + +export interface RPCActivityInviteDispatch extends BaseRPCMessage { + data: RPCActivityInviteDispatchData; + evt: RPCEvents.ActivityInvite; +} + +export interface RPCActivityJoinDispatch extends BaseRPCMessage { + data: RPCActivityJoinDispatchData; + evt: RPCEvents.ActivityJoin; +} + +export interface RPCActivityJoinRequestDispatch extends BaseRPCMessage { + data: RPCActivityJoinRequestDispatchData; + evt: RPCEvents.ActivityJoinRequest; +} + +export interface RPCActivitySpectateDispatch extends BaseRPCMessage { + data: RPCActivitySpectateDispatchData; + evt: RPCEvents.ActivitySpectate; +} + +export interface RPCCaptureShortcutChangeDispatch extends BaseRPCMessage { + data: RPCCaptureShortcutChangeDispatchData; + evt: RPCEvents.CaptureShortcutChange; +} + +export interface RPCChannelCreateDispatch extends BaseRPCMessage { + data: RPCChannelCreateDispatchData; + evt: RPCEvents.ChannelCreate; +} + +export interface RPCCurrentUserUpdateDispatch extends BaseRPCMessage { + data: RPCCurrentUserUpdateDispatchData; + evt: RPCEvents.CurrentUserUpdate; +} + +export interface RPCEntitlementCreateDispatch extends BaseRPCMessage { + data: RPCEntitlementCreateDispatchData; + evt: RPCEvents.EntitlementCreate; +} + +export interface RPCEntitlementDeleteDispatch extends BaseRPCMessage { + data: RPCEntitlementDeleteDispatchData; + evt: RPCEvents.EntitlementDelete; +} + +export interface RPCErrorDispatch< + Cmd extends Exclude = Exclude, +> extends RPCCommandMessage { + data: RPCErrorDispatchData; + evt: RPCEvents.Error; +} + +export interface RPCGameJoinDispatch extends BaseRPCMessage { + data: RPCGameJoinDispatchData; + evt: RPCEvents.GameJoin; +} + +export interface RPCGameSpectateDispatch extends BaseRPCMessage { + data: RPCGameSpectateDispatchData; + evt: RPCEvents.GameSpectate; +} + +export interface RPCGuildCreateDispatch extends BaseRPCMessage { + data: RPCGuildCreateDispatchData; + evt: RPCEvents.GuildCreate; +} + +export interface RPCGuildStatusDispatch extends BaseRPCMessage { + data: RPCGuildStatusDispatchData; + evt: RPCEvents.GuildStatus; +} + +export interface RPCLobbyDeleteDispatch extends BaseRPCMessage { + data: RPCLobbyDeleteDispatchData; + evt: RPCEvents.LobbyDelete; +} + +export interface RPCLobbyMemberConnectDispatch extends BaseRPCMessage { + data: RPCLobbyMemberConnectDispatchData; + evt: RPCEvents.LobbyMemberConnect; +} + +export interface RPCLobbyMemberDisconnectDispatch extends BaseRPCMessage { + data: RPCLobbyMemberDisconnectDispatchData; + evt: RPCEvents.LobbyMemberDisconnect; +} + +export interface RPCLobbyMemberUpdateDispatch extends BaseRPCMessage { + data: RPCLobbyMemberUpdateDispatchData; + evt: RPCEvents.LobbyMemberUpdate; +} + +export interface RPCLobbyMessageDispatch extends BaseRPCMessage { + data: RPCLobbyMessageDispatchData; + evt: RPCEvents.LobbyMessage; +} + +export interface RPCLobbyUpdateDispatch extends BaseRPCMessage { + data: RPCLobbyUpdateDispatchData; + evt: RPCEvents.LobbyUpdate; +} + +export interface RPCMessageCreateDispatch extends BaseRPCMessage { + data: RPCMessageCreateDispatchData; + evt: RPCEvents.MessageCreate; +} + +export interface RPCMessageDeleteDispatch extends BaseRPCMessage { + data: RPCMessageDeleteDispatchData; + evt: RPCEvents.MessageDelete; +} + +export interface RPCMessageUpdateDispatch extends BaseRPCMessage { + data: RPCMessageUpdateDispatchData; + evt: RPCEvents.MessageUpdate; +} + +export interface RPCNotificationCreateDispatch extends BaseRPCMessage { + data: RPCNotificationCreateDispatchData; + evt: RPCEvents.NotificationCreate; +} + +export interface RPCOverlayDispatch extends BaseRPCMessage { + data: RPCOverlayDispatchData; + evt: RPCEvents.Overlay; +} + +export interface RPCOverlayUpdateDispatch extends BaseRPCMessage { + data: RPCOverlayUpdateDispatchData; + evt: RPCEvents.OverlayUpdate; +} + +export interface RPCReadyDispatch extends BaseRPCMessage { + data: RPCReadyDispatchData; + evt: RPCEvents.Ready; +} + +export interface RPCRelationshipUpdateDispatch extends BaseRPCMessage { + data: RPCRelationshipUpdateDispatchData; + evt: RPCEvents.RelationshipUpdate; +} + +export interface RPCSpeakingStartDispatch extends BaseRPCMessage { + data: RPCSpeakingStartDispatchData; + evt: RPCEvents.SpeakingStart; +} + +export interface RPCSpeakingStopDispatch extends BaseRPCMessage { + data: RPCSpeakingStopDispatchData; + evt: RPCEvents.SpeakingStop; +} + +export interface RPCUserAchievementUpdateDispatch extends BaseRPCMessage { + data: RPCUserAchievementUpdateDispatchData; + evt: RPCEvents.UserAchievementUpdate; +} + +export interface RPCVoiceChannelSelectDispatch extends BaseRPCMessage { + data: RPCVoiceChannelSelectDispatchData; + evt: RPCEvents.VoiceChannelSelect; +} + +export interface RPCVoiceConnectionStatusDispatch extends BaseRPCMessage { + data: RPCVoiceConnectionStatusDispatchData; + evt: RPCEvents.VoiceConnectionStatus; +} + +export interface RPCVoiceSettingsUpdateDispatch extends BaseRPCMessage { + data: RPCVoiceSettingsUpdateDispatchData; + evt: RPCEvents.VoiceSettingsUpdate; +} + +export interface RPCVoiceSettingsUpdate2Dispatch extends BaseRPCMessage { + data: RPCVoiceSettingsUpdate2DispatchData; + evt: RPCEvents.VoiceSettingsUpdate2; +} + +export interface RPCVoiceStateCreateDispatch extends BaseRPCMessage { + data: RPCVoiceStateCreateDispatchData; + evt: RPCEvents.VoiceStateCreate; +} + +export interface RPCVoiceStateDeleteDispatch extends BaseRPCMessage { + data: RPCVoiceStateDeleteDispatchData; + evt: RPCEvents.VoiceStateDelete; +} + +export interface RPCVoiceStateUpdateDispatch extends BaseRPCMessage { + data: RPCVoiceStateUpdateDispatchData; + evt: RPCEvents.VoiceStateUpdate; +} + +export type RPCEventsDispatch = + | RPCActivityInviteDispatch + | RPCActivityJoinDispatch + | RPCActivityJoinRequestDispatch + | RPCActivitySpectateDispatch + | RPCCaptureShortcutChangeDispatch + | RPCChannelCreateDispatch + | RPCCurrentUserUpdateDispatch + | RPCEntitlementCreateDispatch + | RPCEntitlementDeleteDispatch + | RPCErrorDispatch + | RPCGameJoinDispatch + | RPCGameSpectateDispatch + | RPCGuildCreateDispatch + | RPCGuildStatusDispatch + | RPCLobbyDeleteDispatch + | RPCLobbyMemberConnectDispatch + | RPCLobbyMemberDisconnectDispatch + | RPCLobbyMemberUpdateDispatch + | RPCLobbyMessageDispatch + | RPCLobbyUpdateDispatch + | RPCMessageCreateDispatch + | RPCMessageDeleteDispatch + | RPCMessageUpdateDispatch + | RPCNotificationCreateDispatch + | RPCOverlayDispatch + | RPCOverlayUpdateDispatch + | RPCReadyDispatch + | RPCRelationshipUpdateDispatch + | RPCSpeakingStartDispatch + | RPCSpeakingStopDispatch + | RPCUserAchievementUpdateDispatch + | RPCVoiceChannelSelectDispatch + | RPCVoiceConnectionStatusDispatch + | RPCVoiceSettingsUpdate2Dispatch + | RPCVoiceSettingsUpdateDispatch + | RPCVoiceStateCreateDispatch + | RPCVoiceStateDeleteDispatch + | RPCVoiceStateUpdateDispatch; + +export type RPCMessage = RPCCommandsResult | RPCEventsDispatch; + +export type RPCMessagePayload = + | RPCCommandAcceptActivityInvitePayload + | RPCCommandActivityInviteUserPayload + | RPCCommandAuthenticatePayload + | RPCCommandAuthorizePayload + | RPCCommandBraintreePopupBridgeCallbackPayload + | RPCCommandBrowserPayload + | RPCCommandCaptureShortcutPayload + | RPCCommandCloseActivityJoinRequestPayload + | RPCCommandConnectionsCallbackPayload + | RPCCommandConnectToLobbyPayload + | RPCCommandConnectToLobbyVoicePayload + | RPCCommandCreateChannelInvitePayload + | RPCCommandCreateLobbyPayload + | RPCCommandDeepLinkPayload + | RPCCommandDeleteLobbyPayload + | RPCCommandDisconnectFromLobbyPayload + | RPCCommandDisconnectFromLobbyVoicePayload + | RPCCommandGetApplicationTicketPayload + | RPCCommandGetChannelPayload + | RPCCommandGetChannelsPayload + | RPCCommandGetEntitlementsPayload + | RPCCommandGetEntitlementTicketPayload + | RPCCommandGetGuildPayload + | RPCCommandGetGuildsPayload + | RPCCommandGetImagePayload + | RPCCommandGetNetworkingConfigPayload + | RPCCommandGetRelationshipsPayload + | RPCCommandGetSelectedVoiceChannelPayload + | RPCCommandGetSkusPayload + | RPCCommandGetUserAchievementsPayload + | RPCCommandGetUserPayload + | RPCCommandGetVoiceSettingsPayload + | RPCCommandGiftCodeBrowserPayload + | RPCCommandGuildTemplateBrowserPayload + | RPCCommandInviteBrowserPayload + | RPCCommandNetworkingCreateTokenPayload + | RPCCommandNetworkingPeerMetricsPayload + | RPCCommandNetworkingSystemMetricsPayload + | RPCCommandOpenOverlayActivityInvitePayload + | RPCCommandOpenOverlayGuildInvitePayload + | RPCCommandOpenOverlayVoiceSettingsPayload + | RPCCommandOverlayPayload + | RPCCommandSearchLobbiesPayload + | RPCCommandSelectTextChannelPayload + | RPCCommandSelectVoiceChannelPayload + | RPCCommandSendActivityJoinInvitePayload + | RPCCommandSendToLobbyPayload + | RPCCommandSetActivityPayload + | RPCCommandSetCertifiedDevicesPayload + | RPCCommandSetOverlayLockedPayload + | RPCCommandSetUserAchievementPayload + | RPCCommandSetUserVoiceSettings2Payload + | RPCCommandSetUserVoiceSettingsPayload + | RPCCommandSetVoiceSettings2Payload + | RPCCommandSetVoiceSettingsPayload + | RPCCommandStartPurchasePayload + | RPCCommandSubscribePayload + | RPCCommandUnsubscribePayload + | RPCCommandUpdateLobbyMemberPayload + | RPCCommandUpdateLobbyPayload + | RPCCommandValidateApplicationPayload; + + // TODO: get rid of all types above as they will be within discord-api-types soon + + export interface MappedRPCCommandsResultsData { + [RPCCommands.Authorize]: RPCAuthorizeResultData; + [RPCCommands.Authenticate]: RPCAuthenticateResultData; + [RPCCommands.GetChannel]: RPCGetChannelResultData; + [RPCCommands.GetChannels]: RPCGetChannelsResultData; + [RPCCommands.GetGuild]: RPCGetGuildResultData; + [RPCCommands.GetGuilds]: RPCGetGuildsResultData; + [RPCCommands.GetUser]: RPCGetUserResultData; + [RPCCommands.GetVoiceSettings]: RPCGetVoiceSettingsResultData; + [RPCCommands.SelectTextChannel]: RPCSelectTextChannelResultData; + [RPCCommands.SelectVoiceChannel]: RPCSelectVoiceChannelResultData; + [RPCCommands.SetActivity]: RPCSetActivityResultData; + [RPCCommands.SetVoiceSettings]: RPCSetVoiceSettingsResultData; + [RPCCommands.Subscribe]: RPCSubscribeResultData; + [RPCCommands.Unsubscribe]: RPCSubscribeResultData; + [RPCCommands.AcceptActivityInvite]: RPCAcceptActivityInviteResultData; + [RPCCommands.ActivityInviteUser]: RPCActivityInviteUserResultData; + [RPCCommands.BraintreePopupBridgeCallback]: RPCBraintreePopupBridgeCallbackResultData; + [RPCCommands.BrowserHandoff]: RPCBrowserHandoffResultData; + [RPCCommands.CaptureShortcut]: RPCCaptureShortcutResultData; + [RPCCommands.CloseActivityRequest]: RPCCloseActivityRequestResultData; + [RPCCommands.ConnectToLobby]: RPCConnectToLobbyResultData; + [RPCCommands.ConnectToLobbyVoice]: RPCConnectToLobbyVoiceResultData; + [RPCCommands.ConnectionsCallback]: RPCConnectionsCallbackResultData; + [RPCCommands.CreateChannelInvite]: RPCCreateChannelInviteResultData; + [RPCCommands.CreateLobby]: RPCCreateLobbyResultData; + [RPCCommands.DeepLink]: RPCDeepLinkResultData; + [RPCCommands.DeleteLobby]: RPCDeleteLobbyResultData; + [RPCCommands.DisconnectFromLobby]: RPCDisconnectFromLobbyResultData; + [RPCCommands.DisconnectFromLobbyVoice]: RPCDisconnectFromLobbyVoiceResultData; + [RPCCommands.GetApplicationTicket]: RPCGetApplicationTicketResultData; + [RPCCommands.GetEntitlementTicket]: RPCGetEntitlementTicketResultData; + [RPCCommands.GetEntitlements]: RPCGetEntitlementsResultData; + [RPCCommands.GetImage]: RPCGetImageResultData; + [RPCCommands.GetNetworkingConfig]: RPCGetNetworkingConfigResultData; + [RPCCommands.GetRelationships]: RPCGetRelationshipsResultData; + [RPCCommands.GetSelectedVoiceChannel]: RPCGetSelectedVoiceChannelResultData; + [RPCCommands.GetSkus]: RPCGetSkusResultData; + [RPCCommands.GetUserAchievements]: RPCGetUserAchievementsResultData; + [RPCCommands.GiftCodeBrowser]: RPCGiftCodeBrowserResultData; + [RPCCommands.GuildTemplateBrowser]: RPCGuildTemplateBrowserResultData; + [RPCCommands.InviteBrowser]: RPCInviteBrowserResultData; + [RPCCommands.NetworkingCreateToken]: RPCNetworkingCreateTokenResultData; + [RPCCommands.NetworkingPeerMetrics]: RPCNetworkingPeerMetricsResultData; + [RPCCommands.NetworkingSystemMetrics]: RPCNetworkingSystemMetricsResultData; + [RPCCommands.OpenOverlayActivityInvite]: RPCOpenOverlayActivityInviteResultData; + [RPCCommands.OpenOverlayGuildInvite]: RPCOpenOverlayGuildInviteResultData; + [RPCCommands.OpenOverlayVoiceSettings]: RPCOpenOverlayVoiceSettingsResultData; + [RPCCommands.Overlay]: RPCOverlayResultData; + [RPCCommands.SearchLobbies]: RPCSearchLobbiesResultData; + [RPCCommands.SendActivityJoinInvite]: RPCSendActivityJoinInviteResultData; + [RPCCommands.SendToLobby]: RPCSendToLobbyResultData; + [RPCCommands.SetCertifiedDevices]: RPCSetCertifiedDevicesResultData; + [RPCCommands.SetOverlayLocked]: RPCSetOverlayLockedResultData; + [RPCCommands.SetUserAchievement]: RPCSetUserAchievementResultData; + [RPCCommands.SetUserVoiceSettings]: RPCSetUserVoiceSettingsResultData; + [RPCCommands.SetUserVoiceSettings2]: RPCSetUserVoiceSettings2ResultData; + [RPCCommands.SetVoiceSettings2]: RPCSetVoiceSettings2ResultData; + [RPCCommands.StartPurchase]: RPCStartPurchaseResultData; + [RPCCommands.UpdateLobby]: RPCUpdateLobbyResultData; + [RPCCommands.UpdateLobbyMember]: RPCUpdateLobbyMemberResultData; + [RPCCommands.ValidateApplication]: RPCValidateApplicationResultData; + } + + export interface MappedRPCCommandsArgs { + [RPCCommands.Authorize]: RPCAuthorizeArgs; + [RPCCommands.Authenticate]: RPCAuthenticateArgs; + [RPCCommands.GetChannel]: RPCGetChannelArgs; + [RPCCommands.GetChannels]: RPCGetChannelsArgs; + [RPCCommands.GetGuild]: RPCGetGuildArgs; + [RPCCommands.GetGuilds]: RPCGetGuildsArgs; + [RPCCommands.GetUser]: RPCGetUserArgs; + [RPCCommands.GetVoiceSettings]: RPCGetVoiceSettingsArgs; + [RPCCommands.SelectTextChannel]: RPCSelectTextChannelArgs; + [RPCCommands.SelectVoiceChannel]: RPCSelectVoiceChannelArgs; + [RPCCommands.SetActivity]: RPCSetActivityArgs; + [RPCCommands.SetVoiceSettings]: RPCSetVoiceSettingsArgs; + [RPCCommands.Subscribe]: RPCCommandSubscribePayload['args']; + [RPCCommands.Unsubscribe]: RPCCommandSubscribePayload['args']; + [RPCCommands.AcceptActivityInvite]: RPCAcceptActivityInviteArgs; + [RPCCommands.ActivityInviteUser]: RPCActivityInviteUserArgs; + [RPCCommands.BraintreePopupBridgeCallback]: RPCBraintreePopupBridgeCallbackArgs; + [RPCCommands.BrowserHandoff]: RPCBrowserHandoffArgs; + [RPCCommands.CaptureShortcut]: RPCCaptureShortcutArgs; + [RPCCommands.CloseActivityRequest]: RPCCloseActivityRequestArgs; + [RPCCommands.ConnectToLobby]: RPCConnectToLobbyArgs; + [RPCCommands.ConnectToLobbyVoice]: RPCConnectToLobbyVoiceArgs; + [RPCCommands.ConnectionsCallback]: RPCConnectionsCallbackArgs; + [RPCCommands.CreateChannelInvite]: RPCCreateChannelInviteArgs; + [RPCCommands.CreateLobby]: RPCCreateLobbyArgs; + [RPCCommands.DeepLink]: RPCDeepLinkArgs; + [RPCCommands.DeleteLobby]: RPCDeleteLobbyArgs; + [RPCCommands.DisconnectFromLobby]: RPCDisconnectFromLobbyArgs; + [RPCCommands.DisconnectFromLobbyVoice]: RPCDisconnectFromLobbyVoiceArgs; + [RPCCommands.GetApplicationTicket]: RPCGetApplicationTicketArgs; + [RPCCommands.GetEntitlementTicket]: RPCGetEntitlementTicketArgs; + [RPCCommands.GetEntitlements]: RPCGetEntitlementsArgs; + [RPCCommands.GetImage]: RPCGetImageArgs; + [RPCCommands.GetNetworkingConfig]: RPCGetNetworkingConfigArgs; + [RPCCommands.GetRelationships]: RPCGetRelationshipsArgs; + [RPCCommands.GetSelectedVoiceChannel]: RPCGetSelectedVoiceChannelArgs; + [RPCCommands.GetSkus]: RPCGetSkusArgs; + [RPCCommands.GetUserAchievements]: RPCGetUserAchievementsArgs; + [RPCCommands.GiftCodeBrowser]: RPCGiftCodeBrowserArgs; + [RPCCommands.GuildTemplateBrowser]: RPCGuildTemplateBrowserArgs; + [RPCCommands.InviteBrowser]: RPCInviteBrowserArgs; + [RPCCommands.NetworkingCreateToken]: RPCNetworkingCreateTokenArgs; + [RPCCommands.NetworkingPeerMetrics]: RPCNetworkingPeerMetricsArgs; + [RPCCommands.NetworkingSystemMetrics]: RPCNetworkingSystemMetricsArgs; + [RPCCommands.OpenOverlayActivityInvite]: RPCOpenOverlayActivityInviteArgs; + [RPCCommands.OpenOverlayGuildInvite]: RPCOpenOverlayGuildInviteArgs; + [RPCCommands.OpenOverlayVoiceSettings]: RPCOpenOverlayVoiceSettingsArgs; + [RPCCommands.Overlay]: RPCOverlayArgs; + [RPCCommands.SearchLobbies]: RPCSearchLobbiesArgs; + [RPCCommands.SendActivityJoinInvite]: RPCSendActivityJoinInviteArgs; + [RPCCommands.SendToLobby]: RPCSendToLobbyArgs; + [RPCCommands.SetCertifiedDevices]: RPCSetCertifiedDevicesArgs; + [RPCCommands.SetOverlayLocked]: RPCSetOverlayLockedArgs; + [RPCCommands.SetUserAchievement]: RPCSetUserAchievementArgs; + [RPCCommands.SetUserVoiceSettings]: RPCSetUserVoiceSettingsArgs; + [RPCCommands.SetUserVoiceSettings2]: RPCSetUserVoiceSettings2Args; + [RPCCommands.SetVoiceSettings2]: RPCSetVoiceSettings2Args; + [RPCCommands.StartPurchase]: RPCStartPurchaseArgs; + [RPCCommands.UpdateLobby]: RPCUpdateLobbyArgs; + [RPCCommands.UpdateLobbyMember]: RPCUpdateLobbyMemberArgs; + [RPCCommands.ValidateApplication]: RPCValidateApplicationArgs; + } + + export interface MappedRPCSubscribeEventsArgs { + [RPCEvents.ActivityInvite]: RPCSubscribeActivityInviteArgs; + [RPCEvents.ActivityJoin]: RPCSubscribeActivityJoinArgs; + [RPCEvents.ActivityJoinRequest]: RPCSubscribeActivityJoinRequestArgs; + [RPCEvents.ActivitySpectate]: RPCSubscribeActivitySpectateArgs; + [RPCEvents.CaptureShortcutChange]: RPCSubscribeCaptureShortcutChangeArgs; + [RPCEvents.ChannelCreate]: RPCSubscribeChannelCreateArgs; + [RPCEvents.CurrentUserUpdate]: RPCSubscribeCurrentUserUpdateArgs; + [RPCEvents.EntitlementCreate]: RPCSubscribeEntitlementCreateArgs; + [RPCEvents.EntitlementDelete]: RPCSubscribeEntitlementDeleteArgs; + [RPCEvents.GameJoin]: RPCSubscribeGameJoinArgs; + [RPCEvents.GameSpectate]: RPCSubscribeGameSpectateArgs; + [RPCEvents.GuildCreate]: RPCSubscribeGuildCreateArgs; + [RPCEvents.GuildStatus]: RPCSubscribeGuildStatusArgs; + [RPCEvents.LobbyDelete]: RPCSubscribeLobbyDeleteArgs; + [RPCEvents.LobbyMemberConnect]: RPCSubscribeLobbyMemberConnectArgs; + [RPCEvents.LobbyMemberDisconnect]: RPCSubscribeLobbyMemberDisconnectArgs; + [RPCEvents.LobbyMemberUpdate]: RPCSubscribeLobbyMemberUpdateArgs; + [RPCEvents.LobbyMessage]: RPCSubscribeLobbyMessageArgs; + [RPCEvents.LobbyUpdate]: RPCSubscribeLobbyUpdateArgs; + [RPCEvents.MessageCreate]: RPCSubscribeMessageCreateArgs; + [RPCEvents.MessageDelete]: RPCSubscribeMessageDeleteArgs; + [RPCEvents.MessageUpdate]: RPCSubscribeMessageUpdateArgs; + [RPCEvents.NotificationCreate]: RPCSubscribeNotificationCreateArgs; + [RPCEvents.Overlay]: RPCSubscribeOverlayArgs; + [RPCEvents.OverlayUpdate]: RPCSubscribeOverlayUpdateArgs; + [RPCEvents.RelationshipUpdate]: RPCSubscribeRelationshipUpdateArgs; + [RPCEvents.SpeakingStart]: RPCSubscribeSpeakingStartArgs; + [RPCEvents.SpeakingStop]: RPCSubscribeSpeakingStopArgs; + [RPCEvents.UserAchievementUpdate]: RPCSubscribeUserAchievementUpdateArgs; + [RPCEvents.VoiceChannelSelect]: RPCSubscribeVoiceChannelSelectArgs; + [RPCEvents.VoiceConnectionStatus]: RPCSubscribeVoiceConnectionStatusArgs; + [RPCEvents.VoiceSettingsUpdate]: RPCSubscribeVoiceSettingsUpdateArgs; + [RPCEvents.VoiceSettingsUpdate2]: RPCSubscribeVoiceSettingsUpdate2Args; + [RPCEvents.VoiceStateCreate]: RPCSubscribeVoiceStateCreateArgs; + [RPCEvents.VoiceStateDelete]: RPCSubscribeVoiceStateDeleteArgs; + [RPCEvents.VoiceStateUpdate]: RPCSubscribeVoiceStateUpdateArgs; + } + + export interface MappedRPCEventsDispatchData { + [RPCEvents.ActivityInvite]: RPCActivityInviteDispatchData; + [RPCEvents.ActivityJoin]: RPCActivityJoinDispatchData; + [RPCEvents.ActivityJoinRequest]: RPCActivityJoinRequestDispatchData; + [RPCEvents.ActivitySpectate]: RPCActivitySpectateDispatchData; + [RPCEvents.CaptureShortcutChange]: RPCCaptureShortcutChangeDispatchData; + [RPCEvents.ChannelCreate]: RPCChannelCreateDispatchData; + [RPCEvents.CurrentUserUpdate]: RPCCurrentUserUpdateDispatchData; + [RPCEvents.EntitlementCreate]: RPCEntitlementCreateDispatchData; + [RPCEvents.EntitlementDelete]: RPCEntitlementDeleteDispatchData; + [RPCEvents.Error]: RPCErrorDispatchData; + [RPCEvents.GameJoin]: RPCGameJoinDispatchData; + [RPCEvents.GameSpectate]: RPCGameSpectateDispatchData; + [RPCEvents.GuildCreate]: RPCGuildCreateDispatchData; + [RPCEvents.GuildStatus]: RPCGuildStatusDispatchData; + [RPCEvents.LobbyDelete]: RPCLobbyDeleteDispatchData; + [RPCEvents.LobbyMemberConnect]: RPCLobbyMemberConnectDispatchData; + [RPCEvents.LobbyMemberDisconnect]: RPCLobbyMemberDisconnectDispatchData; + [RPCEvents.LobbyMemberUpdate]: RPCLobbyMemberUpdateDispatchData; + [RPCEvents.LobbyMessage]: RPCLobbyMessageDispatchData; + [RPCEvents.LobbyUpdate]: RPCLobbyUpdateDispatchData; + [RPCEvents.MessageCreate]: RPCMessageCreateDispatchData; + [RPCEvents.MessageDelete]: RPCMessageDeleteDispatchData; + [RPCEvents.MessageUpdate]: RPCMessageUpdateDispatchData; + [RPCEvents.NotificationCreate]: RPCNotificationCreateDispatchData; + [RPCEvents.Overlay]: RPCOverlayDispatchData; + [RPCEvents.OverlayUpdate]: RPCOverlayUpdateDispatchData; + [RPCEvents.Ready]: RPCReadyDispatchData; + [RPCEvents.RelationshipUpdate]: RPCRelationshipUpdateDispatchData; + [RPCEvents.SpeakingStart]: RPCSpeakingStartDispatchData; + [RPCEvents.SpeakingStop]: RPCSpeakingStopDispatchData; + [RPCEvents.UserAchievementUpdate]: RPCUserAchievementUpdateDispatchData; + [RPCEvents.VoiceChannelSelect]: RPCVoiceChannelSelectDispatchData; + [RPCEvents.VoiceConnectionStatus]: RPCVoiceConnectionStatusDispatchData; + [RPCEvents.VoiceSettingsUpdate]: RPCVoiceSettingsUpdateDispatchData; + [RPCEvents.VoiceSettingsUpdate2]: RPCVoiceSettingsUpdate2DispatchData; + [RPCEvents.VoiceStateCreate]: RPCVoiceStateCreateDispatchData; + [RPCEvents.VoiceStateDelete]: RPCVoiceStateDeleteDispatchData; + [RPCEvents.VoiceStateUpdate]: RPCVoiceStateUpdateDispatchData; + } diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..1235171 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,11 @@ +export * from './client'; +export * from './constants'; +export * from './ipc'; +export * from './util'; + +/** + * The {@link https://github.com/discordjs/discord.js/blob/main/packages/rpc#readme | @discordjs/rpc} version + * that you are currently using. + */ +// This needs to explicitly be `string` so it is not typed as a "const string" that gets injected by esbuild +export const version = '[VI]{{inject}}[/VI]' as string; diff --git a/src/ipc.ts b/src/ipc.ts new file mode 100644 index 0000000..0c60871 --- /dev/null +++ b/src/ipc.ts @@ -0,0 +1,203 @@ +import { Buffer } from 'node:buffer'; +import { randomUUID } from 'node:crypto'; +import { realpath } from 'node:fs/promises'; +import { createConnection, type Socket } from 'node:net'; +import process from 'node:process'; +import { AsyncEventEmitter } from '@vladfrangu/async_event_emitter'; +import type { RPCClient } from './client'; + +enum OPCodes { + Handshake, + Frame, + Close, + Ping, + Pong, +} + +async function getIPCPath(id: number) { + if (process.platform === 'win32') { + return `\\\\?\\pipe\\discord-ipc-${id}`; + } + + const { XDG_RUNTIME_DIR, TMPDIR, TMP, TEMP } = process.env; + const prefix = await realpath(XDG_RUNTIME_DIR ?? TMPDIR ?? TMP ?? TEMP ?? '/tmp'); + + return `${prefix.replace(/\/$/, '')}/discord-ipc-${id}`; +} + +async function getIPC(id = 0): Promise { + const { promise, resolve, reject } = Promise.withResolvers(); + + const path = await getIPCPath(id); + + const onError = async () => { + if (id < 10) { + return getIPC(id + 1); + } + + reject(new Error('Could not connect')); + return undefined; + }; + + const socket = createConnection(path, () => { + socket.removeListener('error', onError); + + resolve(socket); + }); + + socket.once('error', onError); + + return promise; +} + +async function findEndpoint(tries = 0): Promise { + if (tries > 30) { + throw new Error('Could not find endpoint'); + } + + const endpoint = `http://127.0.0.1:${6_463 + (tries % 10)}`; + + try { + const response = await fetch(endpoint); + + if (response.status === 404) return endpoint; + + return await findEndpoint(tries + 1); + } catch { + return findEndpoint(tries + 1); + } +} + + +export function encode(op: number, data: RPCPayload) { + const stringifiedData = JSON.stringify(data); + const length = Buffer.byteLength(stringifiedData); + const packet = Buffer.alloc(8 + length); + + packet.writeInt32LE(op, 0); + packet.writeInt32LE(length, 4); + packet.write(stringifiedData, 8, length); + + return packet; +} + +interface WorkingData { + full: string; + op: number | undefined +} + +const working: WorkingData = { + full: '', + op: undefined, +}; + +export function decode(socket, callback) { + const packet = socket.read(); + if (!packet) { + return; + } + + let { op } = working; + let raw; + if (working.full === '') { + op = working.op = packet.readInt32LE(0); + const len = packet.readInt32LE(4); + raw = packet.slice(8, len + 8); + } else { + raw = packet.toString(); + } + + try { + const data = JSON.parse(working.full + raw); + callback({ op, data }); + working.full = ''; + working.op = undefined; + } catch { + working.full += raw; + } + + decode(socket, callback); +} + +export class IPCTransport extends AsyncEventEmitter { + private socket: Socket | null + + public constructor(public readonly client: RPCClient) { + super(); + + this.socket = null; + } + + public async connect() { + this.socket = await getIPC(); + + const socket = this.socket; + + socket.on('close', this.onClose.bind(this)); + socket.on('error', this.onClose.bind(this)); + + this.emit('open'); + + socket.write(encode(OPCodes.Handshake, { + v: 1, + client_id: this.client.clientId, + })); + + socket.pause(); + + socket.on('readable', () => { + decode(socket, ({ op, data }) => { + switch (op) { + case OPCodes.PING: + this.send(data, OPCodes.PONG); + break; + case OPCodes.FRAME: + if (!data) { + return; + } + + if (data.cmd === 'AUTHORIZE' && data.evt !== 'ERROR') { + findEndpoint() + .then((endpoint) => { + this.client.request.endpoint = endpoint; + }) + .catch((error) => { + this.client.emit('error', error); + }); + } + + this.emit('message', data); + break; + case OPCodes.CLOSE: + this.emit('close', data); + break; + default: + break; + } + }); + }); + } + + + public onClose(error: boolean) { + this.emit('close', error); + } + + public send(data: RPCPayload, op = OPCodes.Frame) { + this.socket!.write(encode(op, data)); + } + + public async close() { + const { promise, resolve } = Promise.withResolvers(); + + this.once('close', resolve); + this.send({}, OPCodes.Close); + this.socket?.end(); + + return promise; + } + + public ping() { + this.send(randomUUID(), OPCodes.Ping); + } +} diff --git a/src/util.ts b/src/util.ts new file mode 100644 index 0000000..8dda554 --- /dev/null +++ b/src/util.ts @@ -0,0 +1,9 @@ +import process from 'node:process'; + +export function getPid() { + if (typeof process !== 'undefined') { + return process.pid; + } + + return null; +} diff --git a/tsconfig.docs.json b/tsconfig.docs.json new file mode 100644 index 0000000..ca2aaec --- /dev/null +++ b/tsconfig.docs.json @@ -0,0 +1,11 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig.json", + "extends": "./tsconfig.json", + "compilerOptions": { + "emitDeclarationOnly": true, + "declarationMap": true, + "outDir": "dist-docs" + }, + "include": ["src/**/*.ts"], + "exclude": ["node_modules"] +} diff --git a/tsconfig.eslint.json b/tsconfig.eslint.json new file mode 100644 index 0000000..163783a --- /dev/null +++ b/tsconfig.eslint.json @@ -0,0 +1,22 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig.json", + "extends": "./tsconfig.json", + "compilerOptions": { + "allowJs": true + }, + "include": [ + "*.ts", + "*.js", + "*.cjs", + "*.mjs", + "src/**/*.ts", + "src/**/*.js", + "src/**/*.cjs", + "src/**/*.mjs", + "bin", + "scripts", + "__tests__", + "__mocks__" + ], + "exclude": ["node_modules"] +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..f352562 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,51 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig.json", + // Mapped from https://www.typescriptlang.org/tsconfig + "compilerOptions": { + // Type Checking + "allowUnreachableCode": false, + "allowUnusedLabels": false, + "exactOptionalPropertyTypes": true, + "noFallthroughCasesInSwitch": true, + "noImplicitOverride": true, + "noImplicitReturns": true, + "noPropertyAccessFromIndexSignature": false, + "noUncheckedIndexedAccess": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "strict": true, + + // Modules + "allowArbitraryExtensions": false, + "allowImportingTsExtensions": false, + "module": "ESNext", + "moduleResolution": "Bundler", + "resolveJsonModule": true, + "resolvePackageJsonExports": true, + "resolvePackageJsonImports": true, + + // Emit + "declaration": true, + "declarationMap": true, + "importHelpers": false, + "newLine": "lf", + "noEmitHelpers": true, + "outDir": "dist", + "removeComments": false, + "sourceMap": true, + + // Interop Constraints + "allowSyntheticDefaultImports": true, + "esModuleInterop": false, + "forceConsistentCasingInFileNames": true, + "isolatedModules": true, + + // Language and Environment + "experimentalDecorators": true, + "lib": ["ESNext", "esnext.disposable"], + "target": "ESNext", + "useDefineForClassFields": true + }, + "include": ["src/**/*.ts", "src/**/*.js", "src/**/*.cjs", "src/**/*.mjs", "bin"], + "exclude": ["node_modules"] +} diff --git a/tsup.config.ts b/tsup.config.ts new file mode 100644 index 0000000..cb6285d --- /dev/null +++ b/tsup.config.ts @@ -0,0 +1,56 @@ +import { esbuildPluginVersionInjector } from 'esbuild-plugin-version-injector'; +import type { Options } from 'tsup'; +import { defineConfig } from 'tsup'; + +export function createTsupConfig({ + entry = ['src/index.ts'], + external = [], + noExternal = [], + platform = 'node', + format = ['esm', 'cjs'], + target = 'es2022', + skipNodeModulesBundle = true, + clean = true, + shims = format.includes('cjs'), + cjsInterop = format.includes('cjs'), + minify = false, + terserOptions = { + mangle: false, + keep_classnames: true, + keep_fnames: true, + }, + splitting = false, + keepNames = true, + dts = true, + sourcemap = true, + esbuildPlugins = [], + treeshake = false, + outDir = 'dist', +}: Options = {}) { + return defineConfig({ + entry, + external, + noExternal, + platform, + format, + skipNodeModulesBundle, + target, + clean, + shims, + cjsInterop, + minify, + terserOptions, + splitting, + keepNames, + dts, + sourcemap, + esbuildPlugins, + treeshake, + outDir, + }); +} + +export default createTsupConfig({ + esbuildPlugins: [esbuildPluginVersionInjector()], +}); + From 0b3a1dcc3c2de3339ee80b8bf970fa91a8ffb325 Mon Sep 17 00:00:00 2001 From: Micah Benac Date: Sun, 2 Feb 2025 15:27:26 +0100 Subject: [PATCH 03/26] chore: requested changes --- cliff.toml | 29 +++++++++++++-------------- package.json | 11 ++++++----- pnpm-lock.yaml | 50 +++++++++++++++++++++++------------------------ src/client.ts | 11 +++++------ src/util.ts | 16 +++++++++++++-- webpack.config.js | 12 ++++++++++++ 6 files changed, 76 insertions(+), 53 deletions(-) create mode 100644 webpack.config.js diff --git a/cliff.toml b/cliff.toml index 3ea07a5..2fc1fd6 100644 --- a/cliff.toml +++ b/cliff.toml @@ -52,21 +52,20 @@ footer = "" conventional_commits = true filter_unconventional = true commit_parsers = [ - { message = "^feat", group = "Features"}, - { message = "^fix", group = "Bug Fixes"}, - { message = "^docs", group = "Documentation"}, - { message = "^perf", group = "Performance"}, - { message = "^refactor", group = "Refactor"}, - { message = "^typings", group = "Typings"}, - { message = "^types", group = "Typings"}, - { message = ".*deprecated", body = ".*deprecated", group = "Deprecation"}, - { message = "^revert", skip = true}, - { message = "^style", group = "Styling"}, - { message = "^test", group = "Testing"}, - { message = "^chore", skip = true}, - { message = "^ci", skip = true}, - { message = "^build", skip = true}, - { body = ".*security", group = "Security"}, + { message = "^feat", group = "Features" }, + { message = "^fix", group = "Bug Fixes" }, + { message = "^docs", group = "Documentation" }, + { message = "^perf", group = "Performance" }, + { message = "^refactor", group = "Refactor" }, + { message = "^types", group = "Typings" }, + { message = ".*deprecated", body = ".*deprecated", group = "Deprecation" }, + { message = "^revert", skip = true }, + { message = "^style", group = "Styling" }, + { message = "^test", group = "Testing" }, + { message = "^chore", skip = true }, + { message = "^ci", skip = true }, + { message = "^build", skip = true }, + { body = ".*security", group = "Security" }, ] filter_commits = true protect_breaking_commits = true diff --git a/package.json b/package.json index b4de2a6..654f364 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "$schema": "https://json.schemastore.org/package.json", - "name": "@discordjs/rpc", + "name": "discord-rpc", "version": "0.1.0", "description": "A simple RPC client for Discord", "scripts": { @@ -42,9 +42,10 @@ "Crawl ", "SpaceEEC ", "Vlad Frangu ", - "Aura Román " + "Aura Román ", + "snek " ], - "license": "Apache-2.0", + "license": "MIT", "keywords": [], "repository": { "type": "git", @@ -62,7 +63,7 @@ }, "devDependencies": { "@favware/cliff-jumper": "^4.1.0", - "@types/node": "^22.10.2", + "@types/node": "22.12.0", "@vitest/coverage-v8": "^2.1.8", "cross-env": "^7.0.3", "esbuild-plugin-version-injector": "^1.2.1", @@ -76,7 +77,7 @@ "vitest": "^2.1.8" }, "engines": { - "node": ">=22" + "node": ">=22.12.0" }, "publishConfig": { "access": "public", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 45c31f1..c208c10 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -22,11 +22,11 @@ importers: specifier: ^4.1.0 version: 4.1.0 '@types/node': - specifier: ^22.10.2 - version: 22.13.0 + specifier: 22.12.0 + version: 22.12.0 '@vitest/coverage-v8': specifier: ^2.1.8 - version: 2.1.8(vitest@2.1.8(@types/node@22.13.0)) + version: 2.1.8(vitest@2.1.8(@types/node@22.12.0)) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -56,7 +56,7 @@ importers: version: 5.5.4 vitest: specifier: ^2.1.8 - version: 2.1.8(@types/node@22.13.0) + version: 2.1.8(@types/node@22.12.0) packages: @@ -762,8 +762,8 @@ packages: '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/node@22.13.0': - resolution: {integrity: sha512-ClIbNe36lawluuvq3+YYhnIN2CELi+6q8NpnM7PYp4hBn/TatfboPgVSm2rwKRfnV2M+Ty9GWDFI64KEe+kysA==} + '@types/node@22.12.0': + resolution: {integrity: sha512-Fll2FZ1riMjNmlmJOdAyY5pUbkftXslB5DgEzlIuNaiWhXd00FhWxVC/r4yV/4wBb9JfImTu+jiSvXTkJ7F/gA==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -4105,7 +4105,7 @@ snapshots: '@types/concat-stream@2.0.3': dependencies: - '@types/node': 22.13.0 + '@types/node': 22.12.0 '@types/debug@4.1.12': dependencies: @@ -4140,7 +4140,7 @@ snapshots: '@types/ms@2.1.0': {} - '@types/node@22.13.0': + '@types/node@22.12.0': dependencies: undici-types: 6.20.0 @@ -4342,7 +4342,7 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - '@vitest/coverage-v8@2.1.8(vitest@2.1.8(@types/node@22.13.0))': + '@vitest/coverage-v8@2.1.8(vitest@2.1.8(@types/node@22.12.0))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 0.2.3 @@ -4356,7 +4356,7 @@ snapshots: std-env: 3.8.0 test-exclude: 7.0.1 tinyrainbow: 1.2.0 - vitest: 2.1.8(@types/node@22.13.0) + vitest: 2.1.8(@types/node@22.12.0) transitivePeerDependencies: - supports-color @@ -4367,13 +4367,13 @@ snapshots: chai: 5.1.2 tinyrainbow: 1.2.0 - '@vitest/mocker@2.1.8(vite@5.4.14(@types/node@22.13.0))': + '@vitest/mocker@2.1.8(vite@5.4.14(@types/node@22.12.0))': dependencies: '@vitest/spy': 2.1.8 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 5.4.14(@types/node@22.13.0) + vite: 5.4.14(@types/node@22.12.0) '@vitest/pretty-format@2.1.8': dependencies: @@ -5004,7 +5004,7 @@ snapshots: eslint-mdx: 3.1.5(eslint@8.57.1) eslint-plugin-astro: 0.33.1(eslint@8.57.1) eslint-plugin-cypress: 2.15.2(eslint@8.57.1) - eslint-plugin-import: eslint-plugin-i@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1) + eslint-plugin-import: eslint-plugin-i@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint-import-resolver-typescript@3.7.0(eslint-plugin-i@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) eslint-plugin-jsdoc: 48.11.0(eslint@8.57.1) eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1) eslint-plugin-mdx: 3.1.5(eslint@8.57.1) @@ -5077,7 +5077,7 @@ snapshots: is-glob: 4.0.3 stable-hash: 0.0.4 optionalDependencies: - eslint-plugin-import: eslint-plugin-i@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1) + eslint-plugin-import: eslint-plugin-i@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint-import-resolver-typescript@3.7.0(eslint-plugin-i@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) transitivePeerDependencies: - supports-color @@ -5139,7 +5139,7 @@ snapshots: eslint: 8.57.1 eslint-compat-utils: 0.5.1(eslint@8.57.1) - eslint-plugin-i@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1): + eslint-plugin-i@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint-import-resolver-typescript@3.7.0(eslint-plugin-i@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): dependencies: debug: 4.4.0 doctrine: 3.0.0 @@ -7305,7 +7305,7 @@ snapshots: '@types/concat-stream': 2.0.3 '@types/debug': 4.1.12 '@types/is-empty': 1.2.3 - '@types/node': 22.13.0 + '@types/node': 22.12.0 '@types/unist': 3.0.3 concat-stream: 2.0.0 debug: 4.4.0 @@ -7427,13 +7427,13 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-node@2.1.8(@types/node@22.13.0): + vite-node@2.1.8(@types/node@22.12.0): dependencies: cac: 6.7.14 debug: 4.4.0 es-module-lexer: 1.6.0 pathe: 1.1.2 - vite: 5.4.14(@types/node@22.13.0) + vite: 5.4.14(@types/node@22.12.0) transitivePeerDependencies: - '@types/node' - less @@ -7445,19 +7445,19 @@ snapshots: - supports-color - terser - vite@5.4.14(@types/node@22.13.0): + vite@5.4.14(@types/node@22.12.0): dependencies: esbuild: 0.21.5 postcss: 8.5.1 rollup: 4.34.0 optionalDependencies: - '@types/node': 22.13.0 + '@types/node': 22.12.0 fsevents: 2.3.3 - vitest@2.1.8(@types/node@22.13.0): + vitest@2.1.8(@types/node@22.12.0): dependencies: '@vitest/expect': 2.1.8 - '@vitest/mocker': 2.1.8(vite@5.4.14(@types/node@22.13.0)) + '@vitest/mocker': 2.1.8(vite@5.4.14(@types/node@22.12.0)) '@vitest/pretty-format': 2.1.8 '@vitest/runner': 2.1.8 '@vitest/snapshot': 2.1.8 @@ -7473,11 +7473,11 @@ snapshots: tinyexec: 0.3.2 tinypool: 1.0.2 tinyrainbow: 1.2.0 - vite: 5.4.14(@types/node@22.13.0) - vite-node: 2.1.8(@types/node@22.13.0) + vite: 5.4.14(@types/node@22.12.0) + vite-node: 2.1.8(@types/node@22.12.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.13.0 + '@types/node': 22.12.0 transitivePeerDependencies: - less - lightningcss diff --git a/src/client.ts b/src/client.ts index ae36231..7627546 100644 --- a/src/client.ts +++ b/src/client.ts @@ -1,12 +1,11 @@ -import { randomUUID } from 'node:crypto'; -import type { Channel } from 'node:diagnostics_channel'; -import { setTimeout, clearTimeout } from 'node:timers'; import { AsyncEventEmitter } from '@vladfrangu/async_event_emitter'; import type { APIApplication, APIUser, OAuth2Scopes, Snowflake } from 'discord-api-types/v10'; +import { randomUUID } from 'node:crypto'; +import { clearTimeout, setTimeout } from 'node:timers'; import type { MappedRPCCommandsArgs, RPCMessage } from './constants'; import { RPCCommands, RPCEvents, RelationshipType } from './constants'; import { IPCTransport } from './ipc'; -import { getPid } from './util'; +import { getPid } from './util'; export interface RPCLoginOptions { accessToken: string; @@ -210,7 +209,7 @@ export class RPCClient extends AsyncEventEmitter { rpcToken = body.rpc_token; } - const { code } = await this.#request('AUTHORIZE', { + const { code } = await this.#request(RPCCommands.Authorize, { scopes, client_id: this.clientId, prompt, @@ -238,7 +237,7 @@ export class RPCClient extends AsyncEventEmitter { * @private */ async authenticate(accessToken: string): Promise { - return this.#request('AUTHENTICATE', { access_token: accessToken }) + return this.#request(RPCCommands.Authenticate, { access_token: accessToken }) .then(({ application, user }) => { this.accessToken = accessToken; this.application = application; diff --git a/src/util.ts b/src/util.ts index 8dda554..482b198 100644 --- a/src/util.ts +++ b/src/util.ts @@ -1,7 +1,19 @@ -import process from 'node:process'; +let register; +try { + const { app } = require('electron'); + register = app.setAsDefaultProtocolClient.bind(app); +} catch (err) { + try { + register = require('register-scheme'); + } catch (e) {} // eslint-disable-line no-empty +} + +if (typeof register !== 'function') { + register = () => false; +} export function getPid() { - if (typeof process !== 'undefined') { + if (typeof globalThis.process !== 'undefined') { return process.pid; } diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 0000000..1067c9b --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,12 @@ +'use strict'; + +module.exports = { + mode: 'production', + entry: require.resolve('.'), + output: { + path: __dirname, + filename: 'browser.js', + library: 'RPC', + libraryTarget: 'umd', + }, +}; \ No newline at end of file From ab84d6e99ed2f83f6ca85b8748ca1ca387e0e8ec Mon Sep 17 00:00:00 2001 From: Micah Benac Date: Sun, 2 Feb 2025 16:12:17 +0100 Subject: [PATCH 04/26] chore: minor changes --- src/client.ts | 20 ++++++++++++-------- src/constants.ts | 27 +++++++++++++++++++++++++-- 2 files changed, 37 insertions(+), 10 deletions(-) diff --git a/src/client.ts b/src/client.ts index 7627546..07efbb8 100644 --- a/src/client.ts +++ b/src/client.ts @@ -2,7 +2,7 @@ import { AsyncEventEmitter } from '@vladfrangu/async_event_emitter'; import type { APIApplication, APIUser, OAuth2Scopes, Snowflake } from 'discord-api-types/v10'; import { randomUUID } from 'node:crypto'; import { clearTimeout, setTimeout } from 'node:timers'; -import type { MappedRPCCommandsArgs, RPCMessage } from './constants'; +import type { MappedRPCCommandsArgs, RPCCallableCommands, RPCMessage } from './constants'; import { RPCCommands, RPCEvents, RelationshipType } from './constants'; import { IPCTransport } from './ipc'; import { getPid } from './util'; @@ -156,9 +156,13 @@ export class RPCClient extends AsyncEventEmitter { * @param args - Arguments * @param evt - Event */ - async #request(cmd: Cmd, args: MappedRPCCommandsArgs[Cmd], evt?: RPCEvents) { + async #request(cmd: Cmd, args: MappedRPCCommandsArgs[Cmd], evt?: RPCEvents) { return new Promise((resolve, reject) => { const nonce = randomUUID(); + const payload: { cmd: Cmd, args: MappedRPCCommandsArgs[Cmd], nonce: string, evt?: RPCEvents } = { cmd, args, nonce }; + if (cmd === RPCCommands.Subscribe || cmd === RPCCommands.Unsubscribe) { + payload.evt = evt!; + } this.transport.send({ cmd, args, evt, nonce }); this.#expected_nonces.set(nonce, { resolve, reject }); }); @@ -485,7 +489,7 @@ export class RPCClient extends AsyncEventEmitter { * @param {number} [pid] The application's process ID. Defaults to the executing process' PID. * @returns {Promise} */ - public async setActivity(args: object = {}, pid: number = getPid()): Promise { + public async setActivity(args: object = {}, pid: number | null = getPid()): Promise { let timestamps; let assets; let party; @@ -540,7 +544,7 @@ export class RPCClient extends AsyncEventEmitter { } return this.#request(RPCCommands.SetActivity, { - pid, + pid: pid ?? 0, activity: { state: args.state, details: args.details, @@ -561,9 +565,9 @@ export class RPCClient extends AsyncEventEmitter { * @param {number} [pid] The application's process ID. Defaults to the executing process' PID. * @returns {Promise} */ - public async clearActivity(pid: number = getPid()): Promise { + public async clearActivity(pid: number | null = getPid()): Promise { return this.#request(RPCCommands.SetActivity, { - pid, + pid: pid ?? 0, }); } @@ -586,7 +590,7 @@ export class RPCClient extends AsyncEventEmitter { * @returns {Promise} */ public async sendJoinRequest(user: User): Promise { - return this.#request(RPCCommands.CloseActivityJoinRequest, { + return this.#request(RPCCommands.SendActivityJoinRequest, { user_id: user.id || user, }); } @@ -598,7 +602,7 @@ export class RPCClient extends AsyncEventEmitter { * @returns {Promise} */ public async closeJoinRequest(user: User): Promise { - return this.#request(RPCCommands.CloseActivityJoinRequest, { + return this.#request(RPCCommands.CloseActivityRequest, { user_id: user.id || user, }); } diff --git a/src/constants.ts b/src/constants.ts index 6e61438..32d77f2 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -3,7 +3,7 @@ /* eslint-disable @typescript-eslint/no-empty-interface */ import type { Snowflake } from "discord-api-types/globals"; -import type { OAuth2Scopes, APIUser, APIPartialGuild, APIMessage, ChannelType, APIVoiceState, APIPartialChannel, GatewayActivity } from "discord-api-types/v10"; +import type { APIMessage, APIPartialChannel, APIPartialGuild, APIUser, APIVoiceState, ChannelType, GatewayActivity, OAuth2Scopes } from "discord-api-types/v10"; export const RPCVersion = '1'; @@ -629,6 +629,11 @@ export enum RPCCommands { * Used to consent to a Rich Presence Ask to Join request */ SendActivityJoinInvite = 'SEND_ACTIVITY_JOIN_INVITE', + /** + * Request to join the game the user is playing + * @unstable + */ + SendActivityJoinRequest = 'SEND_ACTIVITY_JOIN_REQUEST', /** * @unstable */ @@ -1041,7 +1046,7 @@ export interface RPCSetActivityArgs { /** * the rich presence to assign to the user */ - activity: Omit; + activity?: Omit; /** * the application's process id */ @@ -1442,6 +1447,21 @@ export interface RPCSendActivityJoinInviteArgs { user_id: Snowflake; } +/** + * @unstable + */ +export interface RPCSendActivityJoinRequestResultData {} + +/** + * @unstable + */ +export interface RPCSendActivityJoinRequestArgs { + /** + * the id of the user to request to join + */ + user_id: Snowflake; +} + /** * @unstable */ @@ -3517,6 +3537,7 @@ export type RPCMessagePayload = [RPCCommands.Overlay]: RPCOverlayArgs; [RPCCommands.SearchLobbies]: RPCSearchLobbiesArgs; [RPCCommands.SendActivityJoinInvite]: RPCSendActivityJoinInviteArgs; + [RPCCommands.SendActivityJoinRequest]: RPCSendActivityJoinRequestArgs; [RPCCommands.SendToLobby]: RPCSendToLobbyArgs; [RPCCommands.SetCertifiedDevices]: RPCSetCertifiedDevicesArgs; [RPCCommands.SetOverlayLocked]: RPCSetOverlayLockedArgs; @@ -3529,6 +3550,8 @@ export type RPCMessagePayload = [RPCCommands.UpdateLobbyMember]: RPCUpdateLobbyMemberArgs; [RPCCommands.ValidateApplication]: RPCValidateApplicationArgs; } + + export type RPCCallableCommands = Exclude; export interface MappedRPCSubscribeEventsArgs { [RPCEvents.ActivityInvite]: RPCSubscribeActivityInviteArgs; From 0e4c98978ab560f230f90652151c3e862d36c5fd Mon Sep 17 00:00:00 2001 From: Danial Raza Date: Mon, 3 Feb 2025 13:43:40 +0100 Subject: [PATCH 05/26] fix: lintstaged and prettier configs --- .github/workflows/docs.yml | 4 +- .lintstagedrc.js | 2 - .lintstagedrc.json | 6 + .prettierrc.js | 2 - .prettierrc.json | 9 + README.md | 8 +- src/client.ts | 1342 ++++++++++++++++++------------------ src/constants.ts | 509 +++++++------- src/ipc.ts | 139 ++-- src/util.ts | 20 +- tsup.config.ts | 1 - webpack.config.js | 18 +- 12 files changed, 1043 insertions(+), 1017 deletions(-) delete mode 100644 .lintstagedrc.js create mode 100644 .lintstagedrc.json delete mode 100644 .prettierrc.js create mode 100644 .prettierrc.json diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 6407e65..57fd074 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -11,8 +11,8 @@ jobs: - uses: actions/setup-node@v1 with: node-version: '15' - - run: "npm install" - - run: "npm run docs" + - run: 'npm install' + - run: 'npm run docs' - uses: JamesIves/github-pages-deploy-action@3.7.1 with: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.lintstagedrc.js b/.lintstagedrc.js deleted file mode 100644 index c46f610..0000000 --- a/.lintstagedrc.js +++ /dev/null @@ -1,2 +0,0 @@ -/** @type {import('lint-staged').Config} */ -module.exports = require('../../.lintstagedrc.json'); diff --git a/.lintstagedrc.json b/.lintstagedrc.json new file mode 100644 index 0000000..0174106 --- /dev/null +++ b/.lintstagedrc.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://json.schemastore.org/lintstagedrc.schema.json", + "*": "prettier --ignore-unknown --write", + "{src/**,__tests__/**}.{mjs,js,cjs,ts,tsx}": "eslint --fix", + "src/**.ts": "vitest related --run --config ../../vitest.config.ts" +} diff --git a/.prettierrc.js b/.prettierrc.js deleted file mode 100644 index f723230..0000000 --- a/.prettierrc.js +++ /dev/null @@ -1,2 +0,0 @@ -/** @type {import('prettier').Config} */ -module.exports = require('../../.prettierrc.json'); diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..7920c42 --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,9 @@ +{ + "$schema": "https://json.schemastore.org/prettierrc.json", + "printWidth": 120, + "useTabs": true, + "singleQuote": true, + "quoteProps": "as-needed", + "trailingComma": "all", + "endOfLine": "lf" +} diff --git a/README.md b/README.md index 4e39e0b..c4093a4 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ ### [Rich Presence Example](https://github.com/discordjs/RPC/blob/master/example) -### __Browser__ Example +### **Browser** Example ```javascript const clientId = '287406016902594560'; @@ -26,10 +26,10 @@ const scopes = ['rpc', 'rpc.api', 'messages.read']; const client = new RPC.Client({ transport: 'websocket' }); client.on('ready', () => { - console.log('Logged in as', client.application.name); - console.log('Authed for user', client.user.username); + console.log('Logged in as', client.application.name); + console.log('Authed for user', client.user.username); - client.selectVoiceChannel('81384788862181376'); + client.selectVoiceChannel('81384788862181376'); }); // Log in to RPC with client id diff --git a/src/client.ts b/src/client.ts index 07efbb8..6079600 100644 --- a/src/client.ts +++ b/src/client.ts @@ -11,680 +11,698 @@ export interface RPCLoginOptions { accessToken: string; clientId: string; clientSecret: string; - /** - * https://discord.com/developers/docs/topics/oauth2#authorization-code-grant - * - * for authorization requests - */ + /** + * https://discord.com/developers/docs/topics/oauth2#authorization-code-grant + * + * for authorization requests + */ prompt?: 'consent' | 'none'; - /** - * https://discord.com/developers/docs/topics/oauth2#authorization-code-grant - * - * for authorization requests - */ + /** + * https://discord.com/developers/docs/topics/oauth2#authorization-code-grant + * + * for authorization requests + */ redirectUri?: string; rpcToken: string; scopes: OAuth2Scopes[]; - tokenEndpoint: string; - username: string; + tokenEndpoint: string; + username: string; } -export interface RPCAuthorizationOptions extends Partial { - -} +export interface RPCAuthorizationOptions extends Partial {} function subKey(event: RPCEvents, args: unknown) { - return `${event}${JSON.stringify(args)}`; + return `${event}${JSON.stringify(args)}`; } /** * The client for interacting with Discord RPC */ export class RPCClient extends AsyncEventEmitter { - public options: Partial; - - public accessToken: string | null; - - public clientId: string | null; - - public application: APIApplication | null; - - public user: APIUser | null; - - public transport: IPCTransport; - - /** - * Map of nonces being expected from the transport - */ - readonly #expected_nonces: Map; - - /** - * Promise for connection - */ - #connectPromise: Promise | undefined; - - public constructor(options: Partial = {}) { - super(); - - this.options = options; - - this.accessToken = null; - this.clientId = null; - this.application = null; - this.user = null; - - this.transport = new IPCTransport(this); - this.transport.on('message', this.#onRpcMessage.bind(this)); - - this.#expected_nonces = new Map(); - - this.#connectPromise = undefined; - } - - /** - * Search and connect to RPC - */ - public async connect(clientId: string): Promise { - if (this.#connectPromise) { - return this.#connectPromise; - } - - const { promise, resolve, reject } = Promise.withResolvers(); - this.#connectPromise = promise; - this.clientId = clientId; - const timeout = setTimeout(() => reject(new Error('RPC_CONNECTION_TIMEOUT')), 10e3); - timeout.unref(); - this.once('connected', () => { - clearTimeout(timeout); - resolve(this); - }); - - this.transport.once('close', () => { - for (const exp_nonce of this.#expected_nonces.values()) { - exp_nonce.reject(new Error('connection closed')); - } - - this.emit('disconnected'); - reject(new Error('connection closed')); - }); - - try { - await this.transport.connect(); - } catch (error) { - reject(error); - } - - return this.#connectPromise; - } - - /** - * Performs authentication flow. Automatically calls Client#connect if needed. - * - * @param options - Options for authentication. - * At least one property must be provided to perform login. - * @example - * logging in with a client id and secret - * ```ts - * client.login({ clientId: '1234567', clientSecret: 'abcdef123' }); - * ``` - */ - public async login(options: Partial = {}): Promise { - const { clientId } = options ?? this.options; - if (!clientId) { - throw new Error('A client id must be provided to login'); - } - - await this.connect(clientId); - - if (!options.scopes) { - this.emit('ready'); - return this; - } - - let { accessToken } = options ?? this.options; - if (!accessToken) { - accessToken = await this.authorize(options); - } - - return this.authenticate(accessToken!); - } - - /** - * Request - * - * @param cmd - Command - * @param args - Arguments - * @param evt - Event - */ - async #request(cmd: Cmd, args: MappedRPCCommandsArgs[Cmd], evt?: RPCEvents) { - return new Promise((resolve, reject) => { - const nonce = randomUUID(); - const payload: { cmd: Cmd, args: MappedRPCCommandsArgs[Cmd], nonce: string, evt?: RPCEvents } = { cmd, args, nonce }; - if (cmd === RPCCommands.Subscribe || cmd === RPCCommands.Unsubscribe) { - payload.evt = evt!; - } - this.transport.send({ cmd, args, evt, nonce }); - this.#expected_nonces.set(nonce, { resolve, reject }); - }); - } - - /** - * Message handler - * - * @param message - message - */ - #onRpcMessage(message: RPCMessage) { - if (message.cmd === RPCCommands.Dispatch && message.evt === RPCEvents.Ready) { - if (message.data.user) { - this.user = message.data.user; - } - - this.emit('connected'); - } else if (message.cmd !== RPCCommands.Dispatch && this.#expected_nonces.has(message.nonce)) { - const { resolve, reject } = this.#expected_nonces.get(message.nonce)!; - if (message.evt === RPCEvents.Error) { - const e = new Error(message.data.message); - e.code = message.data.code; - e.data = message.data; - reject(e); - } else { - resolve(message.data); - } - - this.#expected_nonces.delete(message.nonce); - } else { - this.emit(message.evt, message.data); - } - } - - /** - * Authorize - * - * @param options - authorization options - */ - private async authorize({ scopes, clientSecret, rpcToken, redirectUri, prompt }: Partial = {}): Promise { - if (clientSecret && rpcToken === true) { - const body = await this.fetch('POST', '/oauth2/token/rpc', { - data: new URLSearchParams({ - client_id: this.clientId, - client_secret: clientSecret, - }), - }); - rpcToken = body.rpc_token; - } - - const { code } = await this.#request(RPCCommands.Authorize, { - scopes, - client_id: this.clientId, - prompt, - rpc_token: rpcToken, - }); - - const response = await this.fetch('POST', '/oauth2/token', { - data: new URLSearchParams({ - client_id: this.clientId, - client_secret: clientSecret, - code, - grant_type: 'authorization_code', - redirect_uri: redirectUri, - }), - }); - - return response.access_token; - } - - /** - * Authenticate - * - * @param {string} accessToken access token - * @returns {Promise} - * @private - */ - async authenticate(accessToken: string): Promise { - return this.#request(RPCCommands.Authenticate, { access_token: accessToken }) - .then(({ application, user }) => { - this.accessToken = accessToken; - this.application = application; - this.user = user; - this.emit('ready'); - return this; - }); - } - - - /** - * Fetch a guild - * - * @param {Snowflake} id Guild ID - * @param {number} [timeout] Timeout request - * @returns {Promise} - */ - async getGuild(id: Snowflake, timeout: number): Promise { - return this.#request(RPCCommands.GetGuild, { guild_id: id, timeout }); - } - - /** - * Fetch all guilds - * - * @param {number} [timeout] Timeout request - * @returns {Promise>} - */ - async getGuilds(timeout: number): Promise> { - return this.#request(RPCCommands.GetGuilds, { timeout }); - } - - /** - * Get a channel - * - * @param {Snowflake} id Channel ID - * @param {number} [timeout] Timeout request - * @returns {Promise} - */ - async getChannel(id: Snowflake, timeout: number): Promise { - return this.#request(RPCCommands.GetChannel, { channel_id: id, timeout }); - } - - /** - * Get all channels - * - * @param {Snowflake} [id] Guild ID - * @param {number} [timeout] Timeout request - * @returns {Promise>} - */ - async getChannels(id: Snowflake, timeout: number): Promise> { - const { channels } = await this.#request(RPCCommands.GetChannels, { - timeout, - guild_id: id, - }); - return channels; - } - - /** - * @typedef {CertifiedDevice} - * @prop {string} type One of `AUDIO_INPUT`, `AUDIO_OUTPUT`, `VIDEO_INPUT` - * @prop {string} uuid This device's Windows UUID - * @prop {object} vendor Vendor information - * @prop {string} vendor.name Vendor's name - * @prop {string} vendor.url Vendor's url - * @prop {object} model Model information - * @prop {string} model.name Model's name - * @prop {string} model.url Model's url - * @prop {string[]} related Array of related product's Windows UUIDs - * @prop {boolean} echoCancellation If the device has echo cancellation - * @prop {boolean} noiseSuppression If the device has noise suppression - * @prop {boolean} automaticGainControl If the device has automatic gain control - * @prop {boolean} hardwareMute If the device has a hardware mute - */ - - /** - * Tell discord which devices are certified - * - * @param {CertifiedDevice[]} devices Certified devices to send to discord - * @returns {Promise} - */ - async setCertifiedDevices(devices: CertifiedDevice[]): Promise { - return this.#request(RPCCommands.SetCertifiedDevices, { - devices: devices.map((d) => ({ - type: d.type, - id: d.uuid, - vendor: d.vendor, - model: d.model, - related: d.related, - echo_cancellation: d.echoCancellation, - noise_suppression: d.noiseSuppression, - automatic_gain_control: d.automaticGainControl, - hardware_mute: d.hardwareMute, - })), - }); - } - - /** - * @typedef {UserVoiceSettings} - * @prop {Snowflake} id ID of the user these settings apply to - * @prop {?object} [pan] Pan settings, an object with `left` and `right` set between - * 0.0 and 1.0, inclusive - * @prop {?number} [volume=100] The volume - * @prop {bool} [mute] If the user is muted - */ - - /** - * Set the voice settings for a user, by id - * - * @param {Snowflake} id ID of the user to set - * @param {UserVoiceSettings} settings Settings - * @returns {Promise} - */ - async setUserVoiceSettings(id: Snowflake, settings: UserVoiceSettings): Promise { - return this.#request(RPCCommands.SetUserVoiceSettings, { - user_id: id, - pan: settings.pan, - mute: settings.mute, - volume: settings.volume, - }); - } - - /** - * Move the user to a voice channel - * - * @param {Snowflake} id ID of the voice channel - * @param {object} [options] Options - * @param {number} [options.timeout] Timeout for the command - * @param {boolean} [options.force] Force this move. This should only be done if you - * have explicit permission from the user. - * @returns {Promise} - */ - async selectVoiceChannel(id: Snowflake, { timeout, force = false }: { force?: boolean; timeout?: number; } = {}): Promise { - return this.#request(RPCCommands.SelectVoiceChannel, { channel_id: id, timeout, force }); - } - - /** - * Move the user to a text channel - * - * @param {Snowflake} id ID of the voice channel - * @param {object} [options] Options - * @param {number} [options.timeout] Timeout for the command - * have explicit permission from the user. - * @returns {Promise} - */ - async selectTextChannel(id: Snowflake, { timeout }: { timeout?: number; } = {}): Promise { - return this.#request(RPCCommands.SelectTextChannel, { channel_id: id, timeout }); - } - - /** - * Get current voice settings - * - * @returns {Promise} - */ - async getVoiceSettings(): Promise { - return this.#request(RPCCommands.GetVoiceSettings) - .then((s) => ({ - automaticGainControl: s.automatic_gain_control, - echoCancellation: s.echo_cancellation, - noiseSuppression: s.noise_suppression, - qos: s.qos, - silenceWarning: s.silence_warning, - deaf: s.deaf, - mute: s.mute, - input: { - availableDevices: s.input.available_devices, - device: s.input.device_id, - volume: s.input.volume, - }, - output: { - availableDevices: s.output.available_devices, - device: s.output.device_id, - volume: s.output.volume, - }, - mode: { - type: s.mode.type, - autoThreshold: s.mode.auto_threshold, - threshold: s.mode.threshold, - shortcut: s.mode.shortcut, - delay: s.mode.delay, - }, - })); - } - - /** - * Set current voice settings, overriding the current settings until this session disconnects. - * This also locks the settings for any other rpc sessions which may be connected. - * - * @param {object} args Settings - * @returns {Promise} - */ - async setVoiceSettings(args: object): Promise { - return this.#request(RPCCommands.SetVoiceSettings, { - automatic_gain_control: args.automaticGainControl, - echo_cancellation: args.echoCancellation, - noise_suppression: args.noiseSuppression, - qos: args.qos, - silence_warning: args.silenceWarning, - deaf: args.deaf, - mute: args.mute, - input: args.input ? { - device_id: args.input.device, - volume: args.input.volume, - } : undefined, - output: args.output ? { - device_id: args.output.device, - volume: args.output.volume, - } : undefined, - mode: args.mode ? { - type: args.mode.type, - auto_threshold: args.mode.autoThreshold, - threshold: args.mode.threshold, - shortcut: args.mode.shortcut, - delay: args.mode.delay, - } : undefined, - }); - } - - /** - * Capture a shortcut using the client - * The callback takes (key, stop) where `stop` is a function that will stop capturing. - * This `stop` function must be called before disconnecting or else the user will have - * to restart their client. - * - * @param {Function} callback Callback handling keys - * @returns {Promise} - */ - async captureShortcut(callback: Function): Promise { - const subid = subKey(RPCEvents.CaptureShortcutChange); - const stop = async () => { - this._subscriptions.delete(subid); - return this.#request(RPCCommands.CaptureShortcut, { action: 'STOP' }); - }; - - this._subscriptions.set(subid, ({ shortcut }) => { - callback(shortcut, stop); - }); - return this.#request(RPCCommands.CaptureShortcut, { action: 'START' }) - .then(() => stop); - } - - /** - * Sets the presence for the logged in user. - * - * @param {object} args The rich presence to pass. - * @param {number} [pid] The application's process ID. Defaults to the executing process' PID. - * @returns {Promise} - */ - public async setActivity(args: object = {}, pid: number | null = getPid()): Promise { - let timestamps; - let assets; - let party; - let secrets; - if (args.startTimestamp || args.endTimestamp) { - timestamps = { - start: args.startTimestamp, - end: args.endTimestamp, - }; - if (timestamps.start instanceof Date) { - timestamps.start = Math.round(timestamps.start.getTime()); - } - - if (timestamps.end instanceof Date) { - timestamps.end = Math.round(timestamps.end.getTime()); - } - - if (timestamps.start > 2_147_483_647_000) { - throw new RangeError('timestamps.start must fit into a unix timestamp'); - } - - if (timestamps.end > 2_147_483_647_000) { - throw new RangeError('timestamps.end must fit into a unix timestamp'); - } - } - - if ( - args.largeImageKey || args.largeImageText - || args.smallImageKey || args.smallImageText - ) { - assets = { - large_image: args.largeImageKey, - large_text: args.largeImageText, - small_image: args.smallImageKey, - small_text: args.smallImageText, - }; - } - - if (args.partySize || args.partyId || args.partyMax) { - party = { id: args.partyId }; - if (args.partySize || args.partyMax) { - party.size = [args.partySize, args.partyMax]; - } - } - - if (args.matchSecret || args.joinSecret || args.spectateSecret) { - secrets = { - match: args.matchSecret, - join: args.joinSecret, - spectate: args.spectateSecret, - }; - } - - return this.#request(RPCCommands.SetActivity, { - pid: pid ?? 0, - activity: { - state: args.state, - details: args.details, - timestamps, - assets, - party, - secrets, - buttons: args.buttons, - instance: Boolean(args.instance), - }, - }); - } - - /** - * Clears the currently set presence, if any. This will hide the "Playing X" message - * displayed below the user's name. - * - * @param {number} [pid] The application's process ID. Defaults to the executing process' PID. - * @returns {Promise} - */ - public async clearActivity(pid: number | null = getPid()): Promise { - return this.#request(RPCCommands.SetActivity, { - pid: pid ?? 0, - }); - } - - /** - * Invite a user to join the game the RPC user is currently playing - * - * @param {User} user The user to invite - * @returns {Promise} - */ - public async sendJoinInvite(user: User): Promise { - return this.#request(RPCCommands.SendActivityJoinInvite, { - user_id: user.id || user, - }); - } - - /** - * Request to join the game the user is playing - * - * @param {User} user The user whose game you want to request to join - * @returns {Promise} - */ - public async sendJoinRequest(user: User): Promise { - return this.#request(RPCCommands.SendActivityJoinRequest, { - user_id: user.id || user, - }); - } - - /** - * Reject a join request from a user - * - * @param {User} user The user whose request you wish to reject - * @returns {Promise} - */ - public async closeJoinRequest(user: User): Promise { - return this.#request(RPCCommands.CloseActivityRequest, { - user_id: user.id || user, - }); - } - - public async createLobby(type, capacity, metadata) { - return this.#request(RPCCommands.CreateLobby, { - type, - capacity, - metadata, - }); - } - - public async updateLobby(lobby, { type, owner, capacity, metadata } = {}) { - return this.#request(RPCCommands.UpdateLobby, { - id: lobby.id || lobby, - type, - owner_id: (owner?.id) || owner, - capacity, - metadata, - }); - } - - public async deleteLobby(lobby) { - return this.#request(RPCCommands.DeleteLobby, { - id: lobby.id || lobby, - }); - } - - public async connectToLobby(id, secret) { - return this.#request(RPCCommands.ConnectToLobby, { - id, - secret, - }); - } - - public async sendToLobby(lobby, data) { - return this.#request(RPCCommands.SendToLobby, { - id: lobby.id || lobby, - data, - }); - } - - public async disconnectFromLobby(lobby) { - return this.#request(RPCCommands.DisconnectFromLobby, { - id: lobby.id || lobby, - }); - } - - public async updateLobbyMember(lobby, user, metadata) { - return this.#request(RPCCommands.UpdateLobbyMember, { - lobby_id: lobby.id || lobby, - user_id: user.id || user, - metadata, - }); - } - - public async getRelationships() { - const types = Object.keys(RelationshipType); - return this.#request(RPCCommands.GetRelationships) - .then((o) => o.relationships.map((r) => ({ - ...r, - type: types[r.type], - }))); - } - - /** - * Subscribe to an event - * - * @param event - Name of event e.g. `MESSAGE_CREATE` - * @param args - Args for event e.g. `{ channel_id: '1234' }` - */ - public async subscribe(event: string, args: object): Promise { - await this.#request(RPCCommands.Subscribe, args, event); - return { - unsubscribe: async () => this.#request(RPCCommands.Unsubscribe, args, event), - }; - } - - /** - * Destroy the client - */ - public async destroy() { - await this.transport.close(); - } + public options: Partial; + + public accessToken: string | null; + + public clientId: string | null; + + public application: APIApplication | null; + + public user: APIUser | null; + + public transport: IPCTransport; + + /** + * Map of nonces being expected from the transport + */ + readonly #expected_nonces: Map< + string, + { reject(this: void, reason?: unknown): void; resolve(this: void, value: unknown): void } + >; + + /** + * Promise for connection + */ + #connectPromise: Promise | undefined; + + public constructor(options: Partial = {}) { + super(); + + this.options = options; + + this.accessToken = null; + this.clientId = null; + this.application = null; + this.user = null; + + this.transport = new IPCTransport(this); + this.transport.on('message', this.#onRpcMessage.bind(this)); + + this.#expected_nonces = new Map(); + + this.#connectPromise = undefined; + } + + /** + * Search and connect to RPC + */ + public async connect(clientId: string): Promise { + if (this.#connectPromise) { + return this.#connectPromise; + } + + const { promise, resolve, reject } = Promise.withResolvers(); + this.#connectPromise = promise; + this.clientId = clientId; + const timeout = setTimeout(() => reject(new Error('RPC_CONNECTION_TIMEOUT')), 10e3); + timeout.unref(); + this.once('connected', () => { + clearTimeout(timeout); + resolve(this); + }); + + this.transport.once('close', () => { + for (const exp_nonce of this.#expected_nonces.values()) { + exp_nonce.reject(new Error('connection closed')); + } + + this.emit('disconnected'); + reject(new Error('connection closed')); + }); + + try { + await this.transport.connect(); + } catch (error) { + reject(error); + } + + return this.#connectPromise; + } + + /** + * Performs authentication flow. Automatically calls Client#connect if needed. + * + * @param options - Options for authentication. + * At least one property must be provided to perform login. + * @example + * logging in with a client id and secret + * ```ts + * client.login({ clientId: '1234567', clientSecret: 'abcdef123' }); + * ``` + */ + public async login(options: Partial = {}): Promise { + const { clientId } = options ?? this.options; + if (!clientId) { + throw new Error('A client id must be provided to login'); + } + + await this.connect(clientId); + + if (!options.scopes) { + this.emit('ready'); + return this; + } + + let { accessToken } = options ?? this.options; + if (!accessToken) { + accessToken = await this.authorize(options); + } + + return this.authenticate(accessToken!); + } + + /** + * Request + * + * @param cmd - Command + * @param args - Arguments + * @param evt - Event + */ + async #request( + cmd: Cmd, + args: MappedRPCCommandsArgs[Cmd], + evt?: RPCEvents, + ) { + return new Promise((resolve, reject) => { + const nonce = randomUUID(); + const payload: { cmd: Cmd; args: MappedRPCCommandsArgs[Cmd]; nonce: string; evt?: RPCEvents } = { + cmd, + args, + nonce, + }; + if (cmd === RPCCommands.Subscribe || cmd === RPCCommands.Unsubscribe) { + payload.evt = evt!; + } + this.transport.send({ cmd, args, evt, nonce }); + this.#expected_nonces.set(nonce, { resolve, reject }); + }); + } + + /** + * Message handler + * + * @param message - message + */ + #onRpcMessage(message: RPCMessage) { + if (message.cmd === RPCCommands.Dispatch && message.evt === RPCEvents.Ready) { + if (message.data.user) { + this.user = message.data.user; + } + + this.emit('connected'); + } else if (message.cmd !== RPCCommands.Dispatch && this.#expected_nonces.has(message.nonce)) { + const { resolve, reject } = this.#expected_nonces.get(message.nonce)!; + if (message.evt === RPCEvents.Error) { + const e = new Error(message.data.message); + e.code = message.data.code; + e.data = message.data; + reject(e); + } else { + resolve(message.data); + } + + this.#expected_nonces.delete(message.nonce); + } else { + this.emit(message.evt, message.data); + } + } + + /** + * Authorize + * + * @param options - authorization options + */ + private async authorize({ + scopes, + clientSecret, + rpcToken, + redirectUri, + prompt, + }: Partial = {}): Promise { + if (clientSecret && rpcToken === true) { + const body = await this.fetch('POST', '/oauth2/token/rpc', { + data: new URLSearchParams({ + client_id: this.clientId, + client_secret: clientSecret, + }), + }); + rpcToken = body.rpc_token; + } + + const { code } = await this.#request(RPCCommands.Authorize, { + scopes, + client_id: this.clientId, + prompt, + rpc_token: rpcToken, + }); + + const response = await this.fetch('POST', '/oauth2/token', { + data: new URLSearchParams({ + client_id: this.clientId, + client_secret: clientSecret, + code, + grant_type: 'authorization_code', + redirect_uri: redirectUri, + }), + }); + + return response.access_token; + } + + /** + * Authenticate + * + * @param {string} accessToken access token + * @returns {Promise} + * @private + */ + async authenticate(accessToken: string): Promise { + return this.#request(RPCCommands.Authenticate, { access_token: accessToken }).then(({ application, user }) => { + this.accessToken = accessToken; + this.application = application; + this.user = user; + this.emit('ready'); + return this; + }); + } + + /** + * Fetch a guild + * + * @param {Snowflake} id Guild ID + * @param {number} [timeout] Timeout request + * @returns {Promise} + */ + async getGuild(id: Snowflake, timeout: number): Promise { + return this.#request(RPCCommands.GetGuild, { guild_id: id, timeout }); + } + + /** + * Fetch all guilds + * + * @param {number} [timeout] Timeout request + * @returns {Promise>} + */ + async getGuilds(timeout: number): Promise> { + return this.#request(RPCCommands.GetGuilds, { timeout }); + } + + /** + * Get a channel + * + * @param {Snowflake} id Channel ID + * @param {number} [timeout] Timeout request + * @returns {Promise} + */ + async getChannel(id: Snowflake, timeout: number): Promise { + return this.#request(RPCCommands.GetChannel, { channel_id: id, timeout }); + } + + /** + * Get all channels + * + * @param {Snowflake} [id] Guild ID + * @param {number} [timeout] Timeout request + * @returns {Promise>} + */ + async getChannels(id: Snowflake, timeout: number): Promise> { + const { channels } = await this.#request(RPCCommands.GetChannels, { + timeout, + guild_id: id, + }); + return channels; + } + + /** + * @typedef {CertifiedDevice} + * @prop {string} type One of `AUDIO_INPUT`, `AUDIO_OUTPUT`, `VIDEO_INPUT` + * @prop {string} uuid This device's Windows UUID + * @prop {object} vendor Vendor information + * @prop {string} vendor.name Vendor's name + * @prop {string} vendor.url Vendor's url + * @prop {object} model Model information + * @prop {string} model.name Model's name + * @prop {string} model.url Model's url + * @prop {string[]} related Array of related product's Windows UUIDs + * @prop {boolean} echoCancellation If the device has echo cancellation + * @prop {boolean} noiseSuppression If the device has noise suppression + * @prop {boolean} automaticGainControl If the device has automatic gain control + * @prop {boolean} hardwareMute If the device has a hardware mute + */ + + /** + * Tell discord which devices are certified + * + * @param {CertifiedDevice[]} devices Certified devices to send to discord + * @returns {Promise} + */ + async setCertifiedDevices(devices: CertifiedDevice[]): Promise { + return this.#request(RPCCommands.SetCertifiedDevices, { + devices: devices.map((d) => ({ + type: d.type, + id: d.uuid, + vendor: d.vendor, + model: d.model, + related: d.related, + echo_cancellation: d.echoCancellation, + noise_suppression: d.noiseSuppression, + automatic_gain_control: d.automaticGainControl, + hardware_mute: d.hardwareMute, + })), + }); + } + + /** + * @typedef {UserVoiceSettings} + * @prop {Snowflake} id ID of the user these settings apply to + * @prop {?object} [pan] Pan settings, an object with `left` and `right` set between + * 0.0 and 1.0, inclusive + * @prop {?number} [volume=100] The volume + * @prop {bool} [mute] If the user is muted + */ + + /** + * Set the voice settings for a user, by id + * + * @param {Snowflake} id ID of the user to set + * @param {UserVoiceSettings} settings Settings + * @returns {Promise} + */ + async setUserVoiceSettings(id: Snowflake, settings: UserVoiceSettings): Promise { + return this.#request(RPCCommands.SetUserVoiceSettings, { + user_id: id, + pan: settings.pan, + mute: settings.mute, + volume: settings.volume, + }); + } + + /** + * Move the user to a voice channel + * + * @param {Snowflake} id ID of the voice channel + * @param {object} [options] Options + * @param {number} [options.timeout] Timeout for the command + * @param {boolean} [options.force] Force this move. This should only be done if you + * have explicit permission from the user. + * @returns {Promise} + */ + async selectVoiceChannel( + id: Snowflake, + { timeout, force = false }: { force?: boolean; timeout?: number } = {}, + ): Promise { + return this.#request(RPCCommands.SelectVoiceChannel, { channel_id: id, timeout, force }); + } + + /** + * Move the user to a text channel + * + * @param {Snowflake} id ID of the voice channel + * @param {object} [options] Options + * @param {number} [options.timeout] Timeout for the command + * have explicit permission from the user. + * @returns {Promise} + */ + async selectTextChannel(id: Snowflake, { timeout }: { timeout?: number } = {}): Promise { + return this.#request(RPCCommands.SelectTextChannel, { channel_id: id, timeout }); + } + + /** + * Get current voice settings + * + * @returns {Promise} + */ + async getVoiceSettings(): Promise { + return this.#request(RPCCommands.GetVoiceSettings).then((s) => ({ + automaticGainControl: s.automatic_gain_control, + echoCancellation: s.echo_cancellation, + noiseSuppression: s.noise_suppression, + qos: s.qos, + silenceWarning: s.silence_warning, + deaf: s.deaf, + mute: s.mute, + input: { + availableDevices: s.input.available_devices, + device: s.input.device_id, + volume: s.input.volume, + }, + output: { + availableDevices: s.output.available_devices, + device: s.output.device_id, + volume: s.output.volume, + }, + mode: { + type: s.mode.type, + autoThreshold: s.mode.auto_threshold, + threshold: s.mode.threshold, + shortcut: s.mode.shortcut, + delay: s.mode.delay, + }, + })); + } + + /** + * Set current voice settings, overriding the current settings until this session disconnects. + * This also locks the settings for any other rpc sessions which may be connected. + * + * @param {object} args Settings + * @returns {Promise} + */ + async setVoiceSettings(args: object): Promise { + return this.#request(RPCCommands.SetVoiceSettings, { + automatic_gain_control: args.automaticGainControl, + echo_cancellation: args.echoCancellation, + noise_suppression: args.noiseSuppression, + qos: args.qos, + silence_warning: args.silenceWarning, + deaf: args.deaf, + mute: args.mute, + input: args.input + ? { + device_id: args.input.device, + volume: args.input.volume, + } + : undefined, + output: args.output + ? { + device_id: args.output.device, + volume: args.output.volume, + } + : undefined, + mode: args.mode + ? { + type: args.mode.type, + auto_threshold: args.mode.autoThreshold, + threshold: args.mode.threshold, + shortcut: args.mode.shortcut, + delay: args.mode.delay, + } + : undefined, + }); + } + + /** + * Capture a shortcut using the client + * The callback takes (key, stop) where `stop` is a function that will stop capturing. + * This `stop` function must be called before disconnecting or else the user will have + * to restart their client. + * + * @param {Function} callback Callback handling keys + * @returns {Promise} + */ + async captureShortcut(callback: Function): Promise { + const subid = subKey(RPCEvents.CaptureShortcutChange); + const stop = async () => { + this._subscriptions.delete(subid); + return this.#request(RPCCommands.CaptureShortcut, { action: 'STOP' }); + }; + + this._subscriptions.set(subid, ({ shortcut }) => { + callback(shortcut, stop); + }); + return this.#request(RPCCommands.CaptureShortcut, { action: 'START' }).then(() => stop); + } + + /** + * Sets the presence for the logged in user. + * + * @param {object} args The rich presence to pass. + * @param {number} [pid] The application's process ID. Defaults to the executing process' PID. + * @returns {Promise} + */ + public async setActivity(args: object = {}, pid: number | null = getPid()): Promise { + let timestamps; + let assets; + let party; + let secrets; + if (args.startTimestamp || args.endTimestamp) { + timestamps = { + start: args.startTimestamp, + end: args.endTimestamp, + }; + if (timestamps.start instanceof Date) { + timestamps.start = Math.round(timestamps.start.getTime()); + } + + if (timestamps.end instanceof Date) { + timestamps.end = Math.round(timestamps.end.getTime()); + } + + if (timestamps.start > 2_147_483_647_000) { + throw new RangeError('timestamps.start must fit into a unix timestamp'); + } + + if (timestamps.end > 2_147_483_647_000) { + throw new RangeError('timestamps.end must fit into a unix timestamp'); + } + } + + if (args.largeImageKey || args.largeImageText || args.smallImageKey || args.smallImageText) { + assets = { + large_image: args.largeImageKey, + large_text: args.largeImageText, + small_image: args.smallImageKey, + small_text: args.smallImageText, + }; + } + + if (args.partySize || args.partyId || args.partyMax) { + party = { id: args.partyId }; + if (args.partySize || args.partyMax) { + party.size = [args.partySize, args.partyMax]; + } + } + + if (args.matchSecret || args.joinSecret || args.spectateSecret) { + secrets = { + match: args.matchSecret, + join: args.joinSecret, + spectate: args.spectateSecret, + }; + } + + return this.#request(RPCCommands.SetActivity, { + pid: pid ?? 0, + activity: { + state: args.state, + details: args.details, + timestamps, + assets, + party, + secrets, + buttons: args.buttons, + instance: Boolean(args.instance), + }, + }); + } + + /** + * Clears the currently set presence, if any. This will hide the "Playing X" message + * displayed below the user's name. + * + * @param {number} [pid] The application's process ID. Defaults to the executing process' PID. + * @returns {Promise} + */ + public async clearActivity(pid: number | null = getPid()): Promise { + return this.#request(RPCCommands.SetActivity, { + pid: pid ?? 0, + }); + } + + /** + * Invite a user to join the game the RPC user is currently playing + * + * @param {User} user The user to invite + * @returns {Promise} + */ + public async sendJoinInvite(user: User): Promise { + return this.#request(RPCCommands.SendActivityJoinInvite, { + user_id: user.id || user, + }); + } + + /** + * Request to join the game the user is playing + * + * @param {User} user The user whose game you want to request to join + * @returns {Promise} + */ + public async sendJoinRequest(user: User): Promise { + return this.#request(RPCCommands.SendActivityJoinRequest, { + user_id: user.id || user, + }); + } + + /** + * Reject a join request from a user + * + * @param {User} user The user whose request you wish to reject + * @returns {Promise} + */ + public async closeJoinRequest(user: User): Promise { + return this.#request(RPCCommands.CloseActivityRequest, { + user_id: user.id || user, + }); + } + + public async createLobby(type, capacity, metadata) { + return this.#request(RPCCommands.CreateLobby, { + type, + capacity, + metadata, + }); + } + + public async updateLobby(lobby, { type, owner, capacity, metadata } = {}) { + return this.#request(RPCCommands.UpdateLobby, { + id: lobby.id || lobby, + type, + owner_id: owner?.id || owner, + capacity, + metadata, + }); + } + + public async deleteLobby(lobby) { + return this.#request(RPCCommands.DeleteLobby, { + id: lobby.id || lobby, + }); + } + + public async connectToLobby(id, secret) { + return this.#request(RPCCommands.ConnectToLobby, { + id, + secret, + }); + } + + public async sendToLobby(lobby, data) { + return this.#request(RPCCommands.SendToLobby, { + id: lobby.id || lobby, + data, + }); + } + + public async disconnectFromLobby(lobby) { + return this.#request(RPCCommands.DisconnectFromLobby, { + id: lobby.id || lobby, + }); + } + + public async updateLobbyMember(lobby, user, metadata) { + return this.#request(RPCCommands.UpdateLobbyMember, { + lobby_id: lobby.id || lobby, + user_id: user.id || user, + metadata, + }); + } + + public async getRelationships() { + const types = Object.keys(RelationshipType); + return this.#request(RPCCommands.GetRelationships).then((o) => + o.relationships.map((r) => ({ + ...r, + type: types[r.type], + })), + ); + } + + /** + * Subscribe to an event + * + * @param event - Name of event e.g. `MESSAGE_CREATE` + * @param args - Args for event e.g. `{ channel_id: '1234' }` + */ + public async subscribe(event: string, args: object): Promise { + await this.#request(RPCCommands.Subscribe, args, event); + return { + unsubscribe: async () => this.#request(RPCCommands.Unsubscribe, args, event), + }; + } + + /** + * Destroy the client + */ + public async destroy() { + await this.transport.close(); + } } diff --git a/src/constants.ts b/src/constants.ts index 32d77f2..4e59487 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -1,9 +1,17 @@ - /* eslint-disable tsdoc/syntax */ /* eslint-disable @typescript-eslint/no-empty-interface */ -import type { Snowflake } from "discord-api-types/globals"; -import type { APIMessage, APIPartialChannel, APIPartialGuild, APIUser, APIVoiceState, ChannelType, GatewayActivity, OAuth2Scopes } from "discord-api-types/v10"; +import type { Snowflake } from 'discord-api-types/globals'; +import type { + APIMessage, + APIPartialChannel, + APIPartialGuild, + APIUser, + APIVoiceState, + ChannelType, + GatewayActivity, + OAuth2Scopes, +} from 'discord-api-types/v10'; export const RPCVersion = '1'; @@ -87,9 +95,8 @@ export interface BaseRPCDevice { /** * https://discord.com/developers/docs/topics/rpc#setcertifieddevices-device-object */ -export type RPCDevice = - Type extends RPCDeviceType.AudioInput ? - BaseRPCDevice & { +export type RPCDevice = Type extends RPCDeviceType.AudioInput + ? BaseRPCDevice & { /** * if the device's native automatic gain control is enabled */ @@ -107,7 +114,7 @@ export type RPCDevice = */ noise_suppression: boolean; } - : BaseRPCDevice; + : BaseRPCDevice; export interface RPCVoiceAvailableDevice { /** @@ -247,7 +254,7 @@ export enum VoiceConnectionStates { /** * TCP connected, Voice disconnected */ - VoiceDisconnected = 'VOICE_DISCONNECTED' + VoiceDisconnected = 'VOICE_DISCONNECTED', } /** @@ -442,7 +449,6 @@ export enum RPCCloseEventCodes { InvalidEncoding, } - /** * https://discord.com/developers/docs/topics/rpc#commands-and-events-rpc-commands */ @@ -1016,7 +1022,7 @@ export interface RPCGetVoiceSettingsResultData { */ silence_warning: boolean; } - + export interface RPCGetVoiceSettingsArgs {} /** @@ -1037,7 +1043,6 @@ export interface RPCSelectTextChannelArgs { timeout?: number; } - export interface RPCSetActivityResultData {} /** * https://discord.com/developers/docs/topics/rpc#setactivity-set-activity-argument-structure @@ -1670,58 +1675,53 @@ export enum RPCEvents { /** * @unstable */ - + export interface RPCSubscribeActivityInviteArgs {} - export interface RPCSubscribeActivityJoinArgs {} - export interface RPCSubscribeActivityJoinRequestArgs {} - export interface RPCSubscribeActivitySpectateArgs {} /** * @unstable */ - + export interface RPCSubscribeCaptureShortcutChangeArgs {} - export interface RPCSubscribeChannelCreateArgs {} /** * @unstable */ - + export interface RPCSubscribeCurrentUserUpdateArgs {} /** * @unstable */ - + export interface RPCSubscribeEntitlementCreateArgs {} /** * @unstable */ - + export interface RPCSubscribeEntitlementDeleteArgs {} /** * @unstable */ - + export interface RPCSubscribeGameJoinArgs {} /** * @unstable */ - + export interface RPCSubscribeGameSpectateArgs {} - export interface RPCSubscribeGuildCreateArgs {} /** @@ -1737,37 +1737,37 @@ export interface RPCSubscribeGuildStatusArgs { /** * @unstable */ - + export interface RPCSubscribeLobbyDeleteArgs {} /** * @unstable */ - + export interface RPCSubscribeLobbyMemberConnectArgs {} /** * @unstable */ - + export interface RPCSubscribeLobbyMemberDisconnectArgs {} /** * @unstable */ - + export interface RPCSubscribeLobbyMemberUpdateArgs {} /** * @unstable */ - + export interface RPCSubscribeLobbyMessageArgs {} /** * @unstable */ - + export interface RPCSubscribeLobbyUpdateArgs {} /** @@ -1800,25 +1800,24 @@ export interface RPCSubscribeMessageUpdateArgs { channel_id: Snowflake; } - export interface RPCSubscribeNotificationCreateArgs {} /** * @unstable */ - + export interface RPCSubscribeOverlayArgs {} /** * @unstable */ - + export interface RPCSubscribeOverlayUpdateArgs {} /** * @unstable */ - + export interface RPCSubscribeRelationshipUpdateArgs {} /** @@ -1844,25 +1843,23 @@ export interface RPCSubscribeSpeakingStopArgs { /** * @unstable */ - + export interface RPCSubscribeUserAchievementUpdateArgs {} - export interface RPCSubscribeVoiceChannelSelectArgs {} /** * @unstable */ - + export interface RPCSubscribeVoiceConnectionStatusArgs {} - export interface RPCSubscribeVoiceSettingsUpdateArgs {} /** * @unstable */ - + export interface RPCSubscribeVoiceSettingsUpdate2Args {} /** @@ -1898,7 +1895,7 @@ export interface RPCSubscribeVoiceStateUpdateArgs { /** * @unstable */ - + export interface RPCActivityInviteDispatchData {} /** @@ -1934,7 +1931,7 @@ export interface RPCActivitySpectateDispatchData { /** * @unstable */ - + export interface RPCCaptureShortcutChangeDispatchData {} /** @@ -1958,19 +1955,19 @@ export interface RPCChannelCreateDispatchData { /** * @unstable */ - + export interface RPCCurrentUserUpdateDispatchData {} /** * @unstable */ - + export interface RPCEntitlementCreateDispatchData {} /** * @unstable */ - + export interface RPCEntitlementDeleteDispatchData {} /** @@ -3419,216 +3416,216 @@ export type RPCMessagePayload = | RPCCommandUpdateLobbyMemberPayload | RPCCommandUpdateLobbyPayload | RPCCommandValidateApplicationPayload; - - // TODO: get rid of all types above as they will be within discord-api-types soon - - export interface MappedRPCCommandsResultsData { - [RPCCommands.Authorize]: RPCAuthorizeResultData; - [RPCCommands.Authenticate]: RPCAuthenticateResultData; - [RPCCommands.GetChannel]: RPCGetChannelResultData; - [RPCCommands.GetChannels]: RPCGetChannelsResultData; - [RPCCommands.GetGuild]: RPCGetGuildResultData; - [RPCCommands.GetGuilds]: RPCGetGuildsResultData; - [RPCCommands.GetUser]: RPCGetUserResultData; - [RPCCommands.GetVoiceSettings]: RPCGetVoiceSettingsResultData; - [RPCCommands.SelectTextChannel]: RPCSelectTextChannelResultData; - [RPCCommands.SelectVoiceChannel]: RPCSelectVoiceChannelResultData; - [RPCCommands.SetActivity]: RPCSetActivityResultData; - [RPCCommands.SetVoiceSettings]: RPCSetVoiceSettingsResultData; - [RPCCommands.Subscribe]: RPCSubscribeResultData; - [RPCCommands.Unsubscribe]: RPCSubscribeResultData; - [RPCCommands.AcceptActivityInvite]: RPCAcceptActivityInviteResultData; - [RPCCommands.ActivityInviteUser]: RPCActivityInviteUserResultData; - [RPCCommands.BraintreePopupBridgeCallback]: RPCBraintreePopupBridgeCallbackResultData; - [RPCCommands.BrowserHandoff]: RPCBrowserHandoffResultData; - [RPCCommands.CaptureShortcut]: RPCCaptureShortcutResultData; - [RPCCommands.CloseActivityRequest]: RPCCloseActivityRequestResultData; - [RPCCommands.ConnectToLobby]: RPCConnectToLobbyResultData; - [RPCCommands.ConnectToLobbyVoice]: RPCConnectToLobbyVoiceResultData; - [RPCCommands.ConnectionsCallback]: RPCConnectionsCallbackResultData; - [RPCCommands.CreateChannelInvite]: RPCCreateChannelInviteResultData; - [RPCCommands.CreateLobby]: RPCCreateLobbyResultData; - [RPCCommands.DeepLink]: RPCDeepLinkResultData; - [RPCCommands.DeleteLobby]: RPCDeleteLobbyResultData; - [RPCCommands.DisconnectFromLobby]: RPCDisconnectFromLobbyResultData; - [RPCCommands.DisconnectFromLobbyVoice]: RPCDisconnectFromLobbyVoiceResultData; - [RPCCommands.GetApplicationTicket]: RPCGetApplicationTicketResultData; - [RPCCommands.GetEntitlementTicket]: RPCGetEntitlementTicketResultData; - [RPCCommands.GetEntitlements]: RPCGetEntitlementsResultData; - [RPCCommands.GetImage]: RPCGetImageResultData; - [RPCCommands.GetNetworkingConfig]: RPCGetNetworkingConfigResultData; - [RPCCommands.GetRelationships]: RPCGetRelationshipsResultData; - [RPCCommands.GetSelectedVoiceChannel]: RPCGetSelectedVoiceChannelResultData; - [RPCCommands.GetSkus]: RPCGetSkusResultData; - [RPCCommands.GetUserAchievements]: RPCGetUserAchievementsResultData; - [RPCCommands.GiftCodeBrowser]: RPCGiftCodeBrowserResultData; - [RPCCommands.GuildTemplateBrowser]: RPCGuildTemplateBrowserResultData; - [RPCCommands.InviteBrowser]: RPCInviteBrowserResultData; - [RPCCommands.NetworkingCreateToken]: RPCNetworkingCreateTokenResultData; - [RPCCommands.NetworkingPeerMetrics]: RPCNetworkingPeerMetricsResultData; - [RPCCommands.NetworkingSystemMetrics]: RPCNetworkingSystemMetricsResultData; - [RPCCommands.OpenOverlayActivityInvite]: RPCOpenOverlayActivityInviteResultData; - [RPCCommands.OpenOverlayGuildInvite]: RPCOpenOverlayGuildInviteResultData; - [RPCCommands.OpenOverlayVoiceSettings]: RPCOpenOverlayVoiceSettingsResultData; - [RPCCommands.Overlay]: RPCOverlayResultData; - [RPCCommands.SearchLobbies]: RPCSearchLobbiesResultData; - [RPCCommands.SendActivityJoinInvite]: RPCSendActivityJoinInviteResultData; - [RPCCommands.SendToLobby]: RPCSendToLobbyResultData; - [RPCCommands.SetCertifiedDevices]: RPCSetCertifiedDevicesResultData; - [RPCCommands.SetOverlayLocked]: RPCSetOverlayLockedResultData; - [RPCCommands.SetUserAchievement]: RPCSetUserAchievementResultData; - [RPCCommands.SetUserVoiceSettings]: RPCSetUserVoiceSettingsResultData; - [RPCCommands.SetUserVoiceSettings2]: RPCSetUserVoiceSettings2ResultData; - [RPCCommands.SetVoiceSettings2]: RPCSetVoiceSettings2ResultData; - [RPCCommands.StartPurchase]: RPCStartPurchaseResultData; - [RPCCommands.UpdateLobby]: RPCUpdateLobbyResultData; - [RPCCommands.UpdateLobbyMember]: RPCUpdateLobbyMemberResultData; - [RPCCommands.ValidateApplication]: RPCValidateApplicationResultData; - } - - export interface MappedRPCCommandsArgs { - [RPCCommands.Authorize]: RPCAuthorizeArgs; - [RPCCommands.Authenticate]: RPCAuthenticateArgs; - [RPCCommands.GetChannel]: RPCGetChannelArgs; - [RPCCommands.GetChannels]: RPCGetChannelsArgs; - [RPCCommands.GetGuild]: RPCGetGuildArgs; - [RPCCommands.GetGuilds]: RPCGetGuildsArgs; - [RPCCommands.GetUser]: RPCGetUserArgs; - [RPCCommands.GetVoiceSettings]: RPCGetVoiceSettingsArgs; - [RPCCommands.SelectTextChannel]: RPCSelectTextChannelArgs; - [RPCCommands.SelectVoiceChannel]: RPCSelectVoiceChannelArgs; - [RPCCommands.SetActivity]: RPCSetActivityArgs; - [RPCCommands.SetVoiceSettings]: RPCSetVoiceSettingsArgs; - [RPCCommands.Subscribe]: RPCCommandSubscribePayload['args']; - [RPCCommands.Unsubscribe]: RPCCommandSubscribePayload['args']; - [RPCCommands.AcceptActivityInvite]: RPCAcceptActivityInviteArgs; - [RPCCommands.ActivityInviteUser]: RPCActivityInviteUserArgs; - [RPCCommands.BraintreePopupBridgeCallback]: RPCBraintreePopupBridgeCallbackArgs; - [RPCCommands.BrowserHandoff]: RPCBrowserHandoffArgs; - [RPCCommands.CaptureShortcut]: RPCCaptureShortcutArgs; - [RPCCommands.CloseActivityRequest]: RPCCloseActivityRequestArgs; - [RPCCommands.ConnectToLobby]: RPCConnectToLobbyArgs; - [RPCCommands.ConnectToLobbyVoice]: RPCConnectToLobbyVoiceArgs; - [RPCCommands.ConnectionsCallback]: RPCConnectionsCallbackArgs; - [RPCCommands.CreateChannelInvite]: RPCCreateChannelInviteArgs; - [RPCCommands.CreateLobby]: RPCCreateLobbyArgs; - [RPCCommands.DeepLink]: RPCDeepLinkArgs; - [RPCCommands.DeleteLobby]: RPCDeleteLobbyArgs; - [RPCCommands.DisconnectFromLobby]: RPCDisconnectFromLobbyArgs; - [RPCCommands.DisconnectFromLobbyVoice]: RPCDisconnectFromLobbyVoiceArgs; - [RPCCommands.GetApplicationTicket]: RPCGetApplicationTicketArgs; - [RPCCommands.GetEntitlementTicket]: RPCGetEntitlementTicketArgs; - [RPCCommands.GetEntitlements]: RPCGetEntitlementsArgs; - [RPCCommands.GetImage]: RPCGetImageArgs; - [RPCCommands.GetNetworkingConfig]: RPCGetNetworkingConfigArgs; - [RPCCommands.GetRelationships]: RPCGetRelationshipsArgs; - [RPCCommands.GetSelectedVoiceChannel]: RPCGetSelectedVoiceChannelArgs; - [RPCCommands.GetSkus]: RPCGetSkusArgs; - [RPCCommands.GetUserAchievements]: RPCGetUserAchievementsArgs; - [RPCCommands.GiftCodeBrowser]: RPCGiftCodeBrowserArgs; - [RPCCommands.GuildTemplateBrowser]: RPCGuildTemplateBrowserArgs; - [RPCCommands.InviteBrowser]: RPCInviteBrowserArgs; - [RPCCommands.NetworkingCreateToken]: RPCNetworkingCreateTokenArgs; - [RPCCommands.NetworkingPeerMetrics]: RPCNetworkingPeerMetricsArgs; - [RPCCommands.NetworkingSystemMetrics]: RPCNetworkingSystemMetricsArgs; - [RPCCommands.OpenOverlayActivityInvite]: RPCOpenOverlayActivityInviteArgs; - [RPCCommands.OpenOverlayGuildInvite]: RPCOpenOverlayGuildInviteArgs; - [RPCCommands.OpenOverlayVoiceSettings]: RPCOpenOverlayVoiceSettingsArgs; - [RPCCommands.Overlay]: RPCOverlayArgs; - [RPCCommands.SearchLobbies]: RPCSearchLobbiesArgs; - [RPCCommands.SendActivityJoinInvite]: RPCSendActivityJoinInviteArgs; - [RPCCommands.SendActivityJoinRequest]: RPCSendActivityJoinRequestArgs; - [RPCCommands.SendToLobby]: RPCSendToLobbyArgs; - [RPCCommands.SetCertifiedDevices]: RPCSetCertifiedDevicesArgs; - [RPCCommands.SetOverlayLocked]: RPCSetOverlayLockedArgs; - [RPCCommands.SetUserAchievement]: RPCSetUserAchievementArgs; - [RPCCommands.SetUserVoiceSettings]: RPCSetUserVoiceSettingsArgs; - [RPCCommands.SetUserVoiceSettings2]: RPCSetUserVoiceSettings2Args; - [RPCCommands.SetVoiceSettings2]: RPCSetVoiceSettings2Args; - [RPCCommands.StartPurchase]: RPCStartPurchaseArgs; - [RPCCommands.UpdateLobby]: RPCUpdateLobbyArgs; - [RPCCommands.UpdateLobbyMember]: RPCUpdateLobbyMemberArgs; - [RPCCommands.ValidateApplication]: RPCValidateApplicationArgs; - } - - export type RPCCallableCommands = Exclude; - - export interface MappedRPCSubscribeEventsArgs { - [RPCEvents.ActivityInvite]: RPCSubscribeActivityInviteArgs; - [RPCEvents.ActivityJoin]: RPCSubscribeActivityJoinArgs; - [RPCEvents.ActivityJoinRequest]: RPCSubscribeActivityJoinRequestArgs; - [RPCEvents.ActivitySpectate]: RPCSubscribeActivitySpectateArgs; - [RPCEvents.CaptureShortcutChange]: RPCSubscribeCaptureShortcutChangeArgs; - [RPCEvents.ChannelCreate]: RPCSubscribeChannelCreateArgs; - [RPCEvents.CurrentUserUpdate]: RPCSubscribeCurrentUserUpdateArgs; - [RPCEvents.EntitlementCreate]: RPCSubscribeEntitlementCreateArgs; - [RPCEvents.EntitlementDelete]: RPCSubscribeEntitlementDeleteArgs; - [RPCEvents.GameJoin]: RPCSubscribeGameJoinArgs; - [RPCEvents.GameSpectate]: RPCSubscribeGameSpectateArgs; - [RPCEvents.GuildCreate]: RPCSubscribeGuildCreateArgs; - [RPCEvents.GuildStatus]: RPCSubscribeGuildStatusArgs; - [RPCEvents.LobbyDelete]: RPCSubscribeLobbyDeleteArgs; - [RPCEvents.LobbyMemberConnect]: RPCSubscribeLobbyMemberConnectArgs; - [RPCEvents.LobbyMemberDisconnect]: RPCSubscribeLobbyMemberDisconnectArgs; - [RPCEvents.LobbyMemberUpdate]: RPCSubscribeLobbyMemberUpdateArgs; - [RPCEvents.LobbyMessage]: RPCSubscribeLobbyMessageArgs; - [RPCEvents.LobbyUpdate]: RPCSubscribeLobbyUpdateArgs; - [RPCEvents.MessageCreate]: RPCSubscribeMessageCreateArgs; - [RPCEvents.MessageDelete]: RPCSubscribeMessageDeleteArgs; - [RPCEvents.MessageUpdate]: RPCSubscribeMessageUpdateArgs; - [RPCEvents.NotificationCreate]: RPCSubscribeNotificationCreateArgs; - [RPCEvents.Overlay]: RPCSubscribeOverlayArgs; - [RPCEvents.OverlayUpdate]: RPCSubscribeOverlayUpdateArgs; - [RPCEvents.RelationshipUpdate]: RPCSubscribeRelationshipUpdateArgs; - [RPCEvents.SpeakingStart]: RPCSubscribeSpeakingStartArgs; - [RPCEvents.SpeakingStop]: RPCSubscribeSpeakingStopArgs; - [RPCEvents.UserAchievementUpdate]: RPCSubscribeUserAchievementUpdateArgs; - [RPCEvents.VoiceChannelSelect]: RPCSubscribeVoiceChannelSelectArgs; - [RPCEvents.VoiceConnectionStatus]: RPCSubscribeVoiceConnectionStatusArgs; - [RPCEvents.VoiceSettingsUpdate]: RPCSubscribeVoiceSettingsUpdateArgs; - [RPCEvents.VoiceSettingsUpdate2]: RPCSubscribeVoiceSettingsUpdate2Args; - [RPCEvents.VoiceStateCreate]: RPCSubscribeVoiceStateCreateArgs; - [RPCEvents.VoiceStateDelete]: RPCSubscribeVoiceStateDeleteArgs; - [RPCEvents.VoiceStateUpdate]: RPCSubscribeVoiceStateUpdateArgs; - } - - export interface MappedRPCEventsDispatchData { - [RPCEvents.ActivityInvite]: RPCActivityInviteDispatchData; - [RPCEvents.ActivityJoin]: RPCActivityJoinDispatchData; - [RPCEvents.ActivityJoinRequest]: RPCActivityJoinRequestDispatchData; - [RPCEvents.ActivitySpectate]: RPCActivitySpectateDispatchData; - [RPCEvents.CaptureShortcutChange]: RPCCaptureShortcutChangeDispatchData; - [RPCEvents.ChannelCreate]: RPCChannelCreateDispatchData; - [RPCEvents.CurrentUserUpdate]: RPCCurrentUserUpdateDispatchData; - [RPCEvents.EntitlementCreate]: RPCEntitlementCreateDispatchData; - [RPCEvents.EntitlementDelete]: RPCEntitlementDeleteDispatchData; - [RPCEvents.Error]: RPCErrorDispatchData; - [RPCEvents.GameJoin]: RPCGameJoinDispatchData; - [RPCEvents.GameSpectate]: RPCGameSpectateDispatchData; - [RPCEvents.GuildCreate]: RPCGuildCreateDispatchData; - [RPCEvents.GuildStatus]: RPCGuildStatusDispatchData; - [RPCEvents.LobbyDelete]: RPCLobbyDeleteDispatchData; - [RPCEvents.LobbyMemberConnect]: RPCLobbyMemberConnectDispatchData; - [RPCEvents.LobbyMemberDisconnect]: RPCLobbyMemberDisconnectDispatchData; - [RPCEvents.LobbyMemberUpdate]: RPCLobbyMemberUpdateDispatchData; - [RPCEvents.LobbyMessage]: RPCLobbyMessageDispatchData; - [RPCEvents.LobbyUpdate]: RPCLobbyUpdateDispatchData; - [RPCEvents.MessageCreate]: RPCMessageCreateDispatchData; - [RPCEvents.MessageDelete]: RPCMessageDeleteDispatchData; - [RPCEvents.MessageUpdate]: RPCMessageUpdateDispatchData; - [RPCEvents.NotificationCreate]: RPCNotificationCreateDispatchData; - [RPCEvents.Overlay]: RPCOverlayDispatchData; - [RPCEvents.OverlayUpdate]: RPCOverlayUpdateDispatchData; - [RPCEvents.Ready]: RPCReadyDispatchData; - [RPCEvents.RelationshipUpdate]: RPCRelationshipUpdateDispatchData; - [RPCEvents.SpeakingStart]: RPCSpeakingStartDispatchData; - [RPCEvents.SpeakingStop]: RPCSpeakingStopDispatchData; - [RPCEvents.UserAchievementUpdate]: RPCUserAchievementUpdateDispatchData; - [RPCEvents.VoiceChannelSelect]: RPCVoiceChannelSelectDispatchData; - [RPCEvents.VoiceConnectionStatus]: RPCVoiceConnectionStatusDispatchData; - [RPCEvents.VoiceSettingsUpdate]: RPCVoiceSettingsUpdateDispatchData; - [RPCEvents.VoiceSettingsUpdate2]: RPCVoiceSettingsUpdate2DispatchData; - [RPCEvents.VoiceStateCreate]: RPCVoiceStateCreateDispatchData; - [RPCEvents.VoiceStateDelete]: RPCVoiceStateDeleteDispatchData; - [RPCEvents.VoiceStateUpdate]: RPCVoiceStateUpdateDispatchData; - } + +// TODO: get rid of all types above as they will be within discord-api-types soon + +export interface MappedRPCCommandsResultsData { + [RPCCommands.Authorize]: RPCAuthorizeResultData; + [RPCCommands.Authenticate]: RPCAuthenticateResultData; + [RPCCommands.GetChannel]: RPCGetChannelResultData; + [RPCCommands.GetChannels]: RPCGetChannelsResultData; + [RPCCommands.GetGuild]: RPCGetGuildResultData; + [RPCCommands.GetGuilds]: RPCGetGuildsResultData; + [RPCCommands.GetUser]: RPCGetUserResultData; + [RPCCommands.GetVoiceSettings]: RPCGetVoiceSettingsResultData; + [RPCCommands.SelectTextChannel]: RPCSelectTextChannelResultData; + [RPCCommands.SelectVoiceChannel]: RPCSelectVoiceChannelResultData; + [RPCCommands.SetActivity]: RPCSetActivityResultData; + [RPCCommands.SetVoiceSettings]: RPCSetVoiceSettingsResultData; + [RPCCommands.Subscribe]: RPCSubscribeResultData; + [RPCCommands.Unsubscribe]: RPCSubscribeResultData; + [RPCCommands.AcceptActivityInvite]: RPCAcceptActivityInviteResultData; + [RPCCommands.ActivityInviteUser]: RPCActivityInviteUserResultData; + [RPCCommands.BraintreePopupBridgeCallback]: RPCBraintreePopupBridgeCallbackResultData; + [RPCCommands.BrowserHandoff]: RPCBrowserHandoffResultData; + [RPCCommands.CaptureShortcut]: RPCCaptureShortcutResultData; + [RPCCommands.CloseActivityRequest]: RPCCloseActivityRequestResultData; + [RPCCommands.ConnectToLobby]: RPCConnectToLobbyResultData; + [RPCCommands.ConnectToLobbyVoice]: RPCConnectToLobbyVoiceResultData; + [RPCCommands.ConnectionsCallback]: RPCConnectionsCallbackResultData; + [RPCCommands.CreateChannelInvite]: RPCCreateChannelInviteResultData; + [RPCCommands.CreateLobby]: RPCCreateLobbyResultData; + [RPCCommands.DeepLink]: RPCDeepLinkResultData; + [RPCCommands.DeleteLobby]: RPCDeleteLobbyResultData; + [RPCCommands.DisconnectFromLobby]: RPCDisconnectFromLobbyResultData; + [RPCCommands.DisconnectFromLobbyVoice]: RPCDisconnectFromLobbyVoiceResultData; + [RPCCommands.GetApplicationTicket]: RPCGetApplicationTicketResultData; + [RPCCommands.GetEntitlementTicket]: RPCGetEntitlementTicketResultData; + [RPCCommands.GetEntitlements]: RPCGetEntitlementsResultData; + [RPCCommands.GetImage]: RPCGetImageResultData; + [RPCCommands.GetNetworkingConfig]: RPCGetNetworkingConfigResultData; + [RPCCommands.GetRelationships]: RPCGetRelationshipsResultData; + [RPCCommands.GetSelectedVoiceChannel]: RPCGetSelectedVoiceChannelResultData; + [RPCCommands.GetSkus]: RPCGetSkusResultData; + [RPCCommands.GetUserAchievements]: RPCGetUserAchievementsResultData; + [RPCCommands.GiftCodeBrowser]: RPCGiftCodeBrowserResultData; + [RPCCommands.GuildTemplateBrowser]: RPCGuildTemplateBrowserResultData; + [RPCCommands.InviteBrowser]: RPCInviteBrowserResultData; + [RPCCommands.NetworkingCreateToken]: RPCNetworkingCreateTokenResultData; + [RPCCommands.NetworkingPeerMetrics]: RPCNetworkingPeerMetricsResultData; + [RPCCommands.NetworkingSystemMetrics]: RPCNetworkingSystemMetricsResultData; + [RPCCommands.OpenOverlayActivityInvite]: RPCOpenOverlayActivityInviteResultData; + [RPCCommands.OpenOverlayGuildInvite]: RPCOpenOverlayGuildInviteResultData; + [RPCCommands.OpenOverlayVoiceSettings]: RPCOpenOverlayVoiceSettingsResultData; + [RPCCommands.Overlay]: RPCOverlayResultData; + [RPCCommands.SearchLobbies]: RPCSearchLobbiesResultData; + [RPCCommands.SendActivityJoinInvite]: RPCSendActivityJoinInviteResultData; + [RPCCommands.SendToLobby]: RPCSendToLobbyResultData; + [RPCCommands.SetCertifiedDevices]: RPCSetCertifiedDevicesResultData; + [RPCCommands.SetOverlayLocked]: RPCSetOverlayLockedResultData; + [RPCCommands.SetUserAchievement]: RPCSetUserAchievementResultData; + [RPCCommands.SetUserVoiceSettings]: RPCSetUserVoiceSettingsResultData; + [RPCCommands.SetUserVoiceSettings2]: RPCSetUserVoiceSettings2ResultData; + [RPCCommands.SetVoiceSettings2]: RPCSetVoiceSettings2ResultData; + [RPCCommands.StartPurchase]: RPCStartPurchaseResultData; + [RPCCommands.UpdateLobby]: RPCUpdateLobbyResultData; + [RPCCommands.UpdateLobbyMember]: RPCUpdateLobbyMemberResultData; + [RPCCommands.ValidateApplication]: RPCValidateApplicationResultData; +} + +export interface MappedRPCCommandsArgs { + [RPCCommands.Authorize]: RPCAuthorizeArgs; + [RPCCommands.Authenticate]: RPCAuthenticateArgs; + [RPCCommands.GetChannel]: RPCGetChannelArgs; + [RPCCommands.GetChannels]: RPCGetChannelsArgs; + [RPCCommands.GetGuild]: RPCGetGuildArgs; + [RPCCommands.GetGuilds]: RPCGetGuildsArgs; + [RPCCommands.GetUser]: RPCGetUserArgs; + [RPCCommands.GetVoiceSettings]: RPCGetVoiceSettingsArgs; + [RPCCommands.SelectTextChannel]: RPCSelectTextChannelArgs; + [RPCCommands.SelectVoiceChannel]: RPCSelectVoiceChannelArgs; + [RPCCommands.SetActivity]: RPCSetActivityArgs; + [RPCCommands.SetVoiceSettings]: RPCSetVoiceSettingsArgs; + [RPCCommands.Subscribe]: RPCCommandSubscribePayload['args']; + [RPCCommands.Unsubscribe]: RPCCommandSubscribePayload['args']; + [RPCCommands.AcceptActivityInvite]: RPCAcceptActivityInviteArgs; + [RPCCommands.ActivityInviteUser]: RPCActivityInviteUserArgs; + [RPCCommands.BraintreePopupBridgeCallback]: RPCBraintreePopupBridgeCallbackArgs; + [RPCCommands.BrowserHandoff]: RPCBrowserHandoffArgs; + [RPCCommands.CaptureShortcut]: RPCCaptureShortcutArgs; + [RPCCommands.CloseActivityRequest]: RPCCloseActivityRequestArgs; + [RPCCommands.ConnectToLobby]: RPCConnectToLobbyArgs; + [RPCCommands.ConnectToLobbyVoice]: RPCConnectToLobbyVoiceArgs; + [RPCCommands.ConnectionsCallback]: RPCConnectionsCallbackArgs; + [RPCCommands.CreateChannelInvite]: RPCCreateChannelInviteArgs; + [RPCCommands.CreateLobby]: RPCCreateLobbyArgs; + [RPCCommands.DeepLink]: RPCDeepLinkArgs; + [RPCCommands.DeleteLobby]: RPCDeleteLobbyArgs; + [RPCCommands.DisconnectFromLobby]: RPCDisconnectFromLobbyArgs; + [RPCCommands.DisconnectFromLobbyVoice]: RPCDisconnectFromLobbyVoiceArgs; + [RPCCommands.GetApplicationTicket]: RPCGetApplicationTicketArgs; + [RPCCommands.GetEntitlementTicket]: RPCGetEntitlementTicketArgs; + [RPCCommands.GetEntitlements]: RPCGetEntitlementsArgs; + [RPCCommands.GetImage]: RPCGetImageArgs; + [RPCCommands.GetNetworkingConfig]: RPCGetNetworkingConfigArgs; + [RPCCommands.GetRelationships]: RPCGetRelationshipsArgs; + [RPCCommands.GetSelectedVoiceChannel]: RPCGetSelectedVoiceChannelArgs; + [RPCCommands.GetSkus]: RPCGetSkusArgs; + [RPCCommands.GetUserAchievements]: RPCGetUserAchievementsArgs; + [RPCCommands.GiftCodeBrowser]: RPCGiftCodeBrowserArgs; + [RPCCommands.GuildTemplateBrowser]: RPCGuildTemplateBrowserArgs; + [RPCCommands.InviteBrowser]: RPCInviteBrowserArgs; + [RPCCommands.NetworkingCreateToken]: RPCNetworkingCreateTokenArgs; + [RPCCommands.NetworkingPeerMetrics]: RPCNetworkingPeerMetricsArgs; + [RPCCommands.NetworkingSystemMetrics]: RPCNetworkingSystemMetricsArgs; + [RPCCommands.OpenOverlayActivityInvite]: RPCOpenOverlayActivityInviteArgs; + [RPCCommands.OpenOverlayGuildInvite]: RPCOpenOverlayGuildInviteArgs; + [RPCCommands.OpenOverlayVoiceSettings]: RPCOpenOverlayVoiceSettingsArgs; + [RPCCommands.Overlay]: RPCOverlayArgs; + [RPCCommands.SearchLobbies]: RPCSearchLobbiesArgs; + [RPCCommands.SendActivityJoinInvite]: RPCSendActivityJoinInviteArgs; + [RPCCommands.SendActivityJoinRequest]: RPCSendActivityJoinRequestArgs; + [RPCCommands.SendToLobby]: RPCSendToLobbyArgs; + [RPCCommands.SetCertifiedDevices]: RPCSetCertifiedDevicesArgs; + [RPCCommands.SetOverlayLocked]: RPCSetOverlayLockedArgs; + [RPCCommands.SetUserAchievement]: RPCSetUserAchievementArgs; + [RPCCommands.SetUserVoiceSettings]: RPCSetUserVoiceSettingsArgs; + [RPCCommands.SetUserVoiceSettings2]: RPCSetUserVoiceSettings2Args; + [RPCCommands.SetVoiceSettings2]: RPCSetVoiceSettings2Args; + [RPCCommands.StartPurchase]: RPCStartPurchaseArgs; + [RPCCommands.UpdateLobby]: RPCUpdateLobbyArgs; + [RPCCommands.UpdateLobbyMember]: RPCUpdateLobbyMemberArgs; + [RPCCommands.ValidateApplication]: RPCValidateApplicationArgs; +} + +export type RPCCallableCommands = Exclude; + +export interface MappedRPCSubscribeEventsArgs { + [RPCEvents.ActivityInvite]: RPCSubscribeActivityInviteArgs; + [RPCEvents.ActivityJoin]: RPCSubscribeActivityJoinArgs; + [RPCEvents.ActivityJoinRequest]: RPCSubscribeActivityJoinRequestArgs; + [RPCEvents.ActivitySpectate]: RPCSubscribeActivitySpectateArgs; + [RPCEvents.CaptureShortcutChange]: RPCSubscribeCaptureShortcutChangeArgs; + [RPCEvents.ChannelCreate]: RPCSubscribeChannelCreateArgs; + [RPCEvents.CurrentUserUpdate]: RPCSubscribeCurrentUserUpdateArgs; + [RPCEvents.EntitlementCreate]: RPCSubscribeEntitlementCreateArgs; + [RPCEvents.EntitlementDelete]: RPCSubscribeEntitlementDeleteArgs; + [RPCEvents.GameJoin]: RPCSubscribeGameJoinArgs; + [RPCEvents.GameSpectate]: RPCSubscribeGameSpectateArgs; + [RPCEvents.GuildCreate]: RPCSubscribeGuildCreateArgs; + [RPCEvents.GuildStatus]: RPCSubscribeGuildStatusArgs; + [RPCEvents.LobbyDelete]: RPCSubscribeLobbyDeleteArgs; + [RPCEvents.LobbyMemberConnect]: RPCSubscribeLobbyMemberConnectArgs; + [RPCEvents.LobbyMemberDisconnect]: RPCSubscribeLobbyMemberDisconnectArgs; + [RPCEvents.LobbyMemberUpdate]: RPCSubscribeLobbyMemberUpdateArgs; + [RPCEvents.LobbyMessage]: RPCSubscribeLobbyMessageArgs; + [RPCEvents.LobbyUpdate]: RPCSubscribeLobbyUpdateArgs; + [RPCEvents.MessageCreate]: RPCSubscribeMessageCreateArgs; + [RPCEvents.MessageDelete]: RPCSubscribeMessageDeleteArgs; + [RPCEvents.MessageUpdate]: RPCSubscribeMessageUpdateArgs; + [RPCEvents.NotificationCreate]: RPCSubscribeNotificationCreateArgs; + [RPCEvents.Overlay]: RPCSubscribeOverlayArgs; + [RPCEvents.OverlayUpdate]: RPCSubscribeOverlayUpdateArgs; + [RPCEvents.RelationshipUpdate]: RPCSubscribeRelationshipUpdateArgs; + [RPCEvents.SpeakingStart]: RPCSubscribeSpeakingStartArgs; + [RPCEvents.SpeakingStop]: RPCSubscribeSpeakingStopArgs; + [RPCEvents.UserAchievementUpdate]: RPCSubscribeUserAchievementUpdateArgs; + [RPCEvents.VoiceChannelSelect]: RPCSubscribeVoiceChannelSelectArgs; + [RPCEvents.VoiceConnectionStatus]: RPCSubscribeVoiceConnectionStatusArgs; + [RPCEvents.VoiceSettingsUpdate]: RPCSubscribeVoiceSettingsUpdateArgs; + [RPCEvents.VoiceSettingsUpdate2]: RPCSubscribeVoiceSettingsUpdate2Args; + [RPCEvents.VoiceStateCreate]: RPCSubscribeVoiceStateCreateArgs; + [RPCEvents.VoiceStateDelete]: RPCSubscribeVoiceStateDeleteArgs; + [RPCEvents.VoiceStateUpdate]: RPCSubscribeVoiceStateUpdateArgs; +} + +export interface MappedRPCEventsDispatchData { + [RPCEvents.ActivityInvite]: RPCActivityInviteDispatchData; + [RPCEvents.ActivityJoin]: RPCActivityJoinDispatchData; + [RPCEvents.ActivityJoinRequest]: RPCActivityJoinRequestDispatchData; + [RPCEvents.ActivitySpectate]: RPCActivitySpectateDispatchData; + [RPCEvents.CaptureShortcutChange]: RPCCaptureShortcutChangeDispatchData; + [RPCEvents.ChannelCreate]: RPCChannelCreateDispatchData; + [RPCEvents.CurrentUserUpdate]: RPCCurrentUserUpdateDispatchData; + [RPCEvents.EntitlementCreate]: RPCEntitlementCreateDispatchData; + [RPCEvents.EntitlementDelete]: RPCEntitlementDeleteDispatchData; + [RPCEvents.Error]: RPCErrorDispatchData; + [RPCEvents.GameJoin]: RPCGameJoinDispatchData; + [RPCEvents.GameSpectate]: RPCGameSpectateDispatchData; + [RPCEvents.GuildCreate]: RPCGuildCreateDispatchData; + [RPCEvents.GuildStatus]: RPCGuildStatusDispatchData; + [RPCEvents.LobbyDelete]: RPCLobbyDeleteDispatchData; + [RPCEvents.LobbyMemberConnect]: RPCLobbyMemberConnectDispatchData; + [RPCEvents.LobbyMemberDisconnect]: RPCLobbyMemberDisconnectDispatchData; + [RPCEvents.LobbyMemberUpdate]: RPCLobbyMemberUpdateDispatchData; + [RPCEvents.LobbyMessage]: RPCLobbyMessageDispatchData; + [RPCEvents.LobbyUpdate]: RPCLobbyUpdateDispatchData; + [RPCEvents.MessageCreate]: RPCMessageCreateDispatchData; + [RPCEvents.MessageDelete]: RPCMessageDeleteDispatchData; + [RPCEvents.MessageUpdate]: RPCMessageUpdateDispatchData; + [RPCEvents.NotificationCreate]: RPCNotificationCreateDispatchData; + [RPCEvents.Overlay]: RPCOverlayDispatchData; + [RPCEvents.OverlayUpdate]: RPCOverlayUpdateDispatchData; + [RPCEvents.Ready]: RPCReadyDispatchData; + [RPCEvents.RelationshipUpdate]: RPCRelationshipUpdateDispatchData; + [RPCEvents.SpeakingStart]: RPCSpeakingStartDispatchData; + [RPCEvents.SpeakingStop]: RPCSpeakingStopDispatchData; + [RPCEvents.UserAchievementUpdate]: RPCUserAchievementUpdateDispatchData; + [RPCEvents.VoiceChannelSelect]: RPCVoiceChannelSelectDispatchData; + [RPCEvents.VoiceConnectionStatus]: RPCVoiceConnectionStatusDispatchData; + [RPCEvents.VoiceSettingsUpdate]: RPCVoiceSettingsUpdateDispatchData; + [RPCEvents.VoiceSettingsUpdate2]: RPCVoiceSettingsUpdate2DispatchData; + [RPCEvents.VoiceStateCreate]: RPCVoiceStateCreateDispatchData; + [RPCEvents.VoiceStateDelete]: RPCVoiceStateDeleteDispatchData; + [RPCEvents.VoiceStateUpdate]: RPCVoiceStateUpdateDispatchData; +} diff --git a/src/ipc.ts b/src/ipc.ts index 0c60871..6933da2 100644 --- a/src/ipc.ts +++ b/src/ipc.ts @@ -5,6 +5,7 @@ import { createConnection, type Socket } from 'node:net'; import process from 'node:process'; import { AsyncEventEmitter } from '@vladfrangu/async_event_emitter'; import type { RPCClient } from './client'; +import { RPCCommands, RPCEvents } from './constants'; enum OPCodes { Handshake, @@ -68,7 +69,6 @@ async function findEndpoint(tries = 0): Promise { } } - export function encode(op: number, data: RPCPayload) { const stringifiedData = JSON.stringify(data); const length = Buffer.byteLength(stringifiedData); @@ -83,7 +83,7 @@ export function encode(op: number, data: RPCPayload) { interface WorkingData { full: string; - op: number | undefined + op: number | undefined; } const working: WorkingData = { @@ -92,35 +92,35 @@ const working: WorkingData = { }; export function decode(socket, callback) { - const packet = socket.read(); - if (!packet) { - return; - } - - let { op } = working; - let raw; - if (working.full === '') { - op = working.op = packet.readInt32LE(0); - const len = packet.readInt32LE(4); - raw = packet.slice(8, len + 8); - } else { - raw = packet.toString(); - } - - try { - const data = JSON.parse(working.full + raw); - callback({ op, data }); - working.full = ''; - working.op = undefined; - } catch { - working.full += raw; - } - - decode(socket, callback); + const packet = socket.read(); + if (!packet) { + return; + } + + let { op } = working; + let raw; + if (working.full === '') { + op = working.op = packet.readInt32LE(0); + const len = packet.readInt32LE(4); + raw = packet.slice(8, len + 8); + } else { + raw = packet.toString(); + } + + try { + const data = JSON.parse(working.full + raw); + callback({ op, data }); + working.full = ''; + working.op = undefined; + } catch { + working.full += raw; + } + + decode(socket, callback); } export class IPCTransport extends AsyncEventEmitter { - private socket: Socket | null + private socket: Socket | null; public constructor(public readonly client: RPCClient) { super(); @@ -134,50 +134,51 @@ export class IPCTransport extends AsyncEventEmitter { const socket = this.socket; socket.on('close', this.onClose.bind(this)); - socket.on('error', this.onClose.bind(this)); + socket.on('error', this.onClose.bind(this)); this.emit('open'); - - socket.write(encode(OPCodes.Handshake, { - v: 1, - client_id: this.client.clientId, - })); - - socket.pause(); - - socket.on('readable', () => { - decode(socket, ({ op, data }) => { - switch (op) { - case OPCodes.PING: - this.send(data, OPCodes.PONG); - break; - case OPCodes.FRAME: - if (!data) { - return; - } - - if (data.cmd === 'AUTHORIZE' && data.evt !== 'ERROR') { - findEndpoint() - .then((endpoint) => { - this.client.request.endpoint = endpoint; - }) - .catch((error) => { - this.client.emit('error', error); - }); - } - - this.emit('message', data); - break; - case OPCodes.CLOSE: - this.emit('close', data); - break; - default: - break; - } - }); - }); - } + socket.write( + encode(OPCodes.Handshake, { + v: 1, + client_id: this.client.clientId, + }), + ); + + socket.pause(); + + socket.on('readable', () => { + decode(socket, ({ op, data }) => { + switch (op) { + case OPCodes.Ping: + this.send(data, OPCodes.Pong); + break; + case OPCodes.Frame: + if (!data) { + return; + } + + if (data.cmd === RPCCommands.Authorize && data.evt !== RPCEvents.Error) { + findEndpoint() + .then((endpoint) => { + this.client.request.endpoint = endpoint; + }) + .catch((error) => { + this.client.emit('error', error); + }); + } + + this.emit('message', data); + break; + case OPCodes.Close: + this.emit('close', data); + break; + default: + break; + } + }); + }); + } public onClose(error: boolean) { this.emit('close', error); diff --git a/src/util.ts b/src/util.ts index 482b198..4947e39 100644 --- a/src/util.ts +++ b/src/util.ts @@ -1,21 +1,21 @@ let register; try { - const { app } = require('electron'); - register = app.setAsDefaultProtocolClient.bind(app); + const { app } = require('electron'); + register = app.setAsDefaultProtocolClient.bind(app); } catch (err) { - try { - register = require('register-scheme'); - } catch (e) {} // eslint-disable-line no-empty + try { + register = require('register-scheme'); + } catch (e) {} // eslint-disable-line no-empty } if (typeof register !== 'function') { - register = () => false; + register = () => false; } export function getPid() { - if (typeof globalThis.process !== 'undefined') { - return process.pid; - } + if (typeof globalThis.process !== 'undefined') { + return process.pid; + } - return null; + return null; } diff --git a/tsup.config.ts b/tsup.config.ts index cb6285d..886498c 100644 --- a/tsup.config.ts +++ b/tsup.config.ts @@ -53,4 +53,3 @@ export function createTsupConfig({ export default createTsupConfig({ esbuildPlugins: [esbuildPluginVersionInjector()], }); - diff --git a/webpack.config.js b/webpack.config.js index 1067c9b..75aad27 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,12 +1,12 @@ 'use strict'; module.exports = { - mode: 'production', - entry: require.resolve('.'), - output: { - path: __dirname, - filename: 'browser.js', - library: 'RPC', - libraryTarget: 'umd', - }, -}; \ No newline at end of file + mode: 'production', + entry: require.resolve('.'), + output: { + path: __dirname, + filename: 'browser.js', + library: 'RPC', + libraryTarget: 'umd', + }, +}; From 92e4dd7cc07940401a709c67e050674da0552a73 Mon Sep 17 00:00:00 2001 From: Micah Benac Date: Sun, 9 Feb 2025 02:18:00 +0100 Subject: [PATCH 06/26] fix: types and methods --- src/client.ts | 311 ++++++++++++++++++++++++----------------------- src/constants.ts | 49 ++++++-- 2 files changed, 199 insertions(+), 161 deletions(-) diff --git a/src/client.ts b/src/client.ts index 6079600..6018829 100644 --- a/src/client.ts +++ b/src/client.ts @@ -1,8 +1,28 @@ import { AsyncEventEmitter } from '@vladfrangu/async_event_emitter'; -import type { APIApplication, APIUser, OAuth2Scopes, Snowflake } from 'discord-api-types/v10'; +import type { APIApplication, APIUser, GatewayActivity, OAuth2Scopes, Snowflake } from 'discord-api-types/v10'; import { randomUUID } from 'node:crypto'; import { clearTimeout, setTimeout } from 'node:timers'; -import type { MappedRPCCommandsArgs, RPCCallableCommands, RPCMessage } from './constants'; +import type { + LobbyType, + MappedRPCCommandsArgs, + RPCCallableCommands, + RPCCertifiedDevice, + RPCGetChannelResultData, + RPCGetChannelsResultData, + RPCGetGuildResultData, + RPCGetGuildsResultData, + RPCGetVoiceSettingsResultData, + RPCLobbyMetadata, + RPCMessage, + RPCSelectTextChannelArgs, + RPCSelectTextChannelResultData, + RPCSelectVoiceChannelArgs, + RPCSelectVoiceChannelResultData, + RPCSetCertifiedDevicesResultData, + RPCSetUserVoiceSettingsArgs, + RPCSetUserVoiceSettingsResultData, + RPCUpdateLobbyArgs, +} from './constants'; import { RPCCommands, RPCEvents, RelationshipType } from './constants'; import { IPCTransport } from './ipc'; import { getPid } from './util'; @@ -159,7 +179,7 @@ export class RPCClient extends AsyncEventEmitter { */ async #request( cmd: Cmd, - args: MappedRPCCommandsArgs[Cmd], + args: MappedRPCCommandsArgs[Cmd] = {} as MappedRPCCommandsArgs[Cmd], evt?: RPCEvents, ) { return new Promise((resolve, reject) => { @@ -182,16 +202,19 @@ export class RPCClient extends AsyncEventEmitter { * * @param message - message */ - #onRpcMessage(message: RPCMessage) { + #onRpcMessage(message: RPCMessage): void { if (message.cmd === RPCCommands.Dispatch && message.evt === RPCEvents.Ready) { if (message.data.user) { this.user = message.data.user; } this.emit('connected'); - } else if (message.cmd !== RPCCommands.Dispatch && this.#expected_nonces.has(message.nonce)) { + } else if (message.cmd !== RPCCommands.Dispatch) { + if (!this.#expected_nonces.has(message.nonce)) { + return; + } const { resolve, reject } = this.#expected_nonces.get(message.nonce)!; - if (message.evt === RPCEvents.Error) { + if ('evt' in message && message.evt === RPCEvents.Error) { const e = new Error(message.data.message); e.code = message.data.code; e.data = message.data; @@ -217,7 +240,7 @@ export class RPCClient extends AsyncEventEmitter { rpcToken, redirectUri, prompt, - }: Partial = {}): Promise { + }: Partial = {}): Promise { if (clientSecret && rpcToken === true) { const body = await this.fetch('POST', '/oauth2/token/rpc', { data: new URLSearchParams({ @@ -251,11 +274,10 @@ export class RPCClient extends AsyncEventEmitter { /** * Authenticate * - * @param {string} accessToken access token - * @returns {Promise} + * @param accessToken access token * @private */ - async authenticate(accessToken: string): Promise { + async authenticate(accessToken: string): Promise { return this.#request(RPCCommands.Authenticate, { access_token: accessToken }).then(({ application, user }) => { this.accessToken = accessToken; this.application = application; @@ -268,176 +290,115 @@ export class RPCClient extends AsyncEventEmitter { /** * Fetch a guild * - * @param {Snowflake} id Guild ID - * @param {number} [timeout] Timeout request - * @returns {Promise} + * @param id Guild Id + * @param timeout Timeout request */ - async getGuild(id: Snowflake, timeout: number): Promise { + async getGuild(id: Snowflake, timeout: number): Promise { return this.#request(RPCCommands.GetGuild, { guild_id: id, timeout }); } /** * Fetch all guilds * - * @param {number} [timeout] Timeout request - * @returns {Promise>} + * @param timeout Timeout request */ - async getGuilds(timeout: number): Promise> { + async getGuilds(timeout: number): Promise { return this.#request(RPCCommands.GetGuilds, { timeout }); } /** * Get a channel * - * @param {Snowflake} id Channel ID - * @param {number} [timeout] Timeout request - * @returns {Promise} + * @param id Channel Id */ - async getChannel(id: Snowflake, timeout: number): Promise { - return this.#request(RPCCommands.GetChannel, { channel_id: id, timeout }); + async getChannel(id: Snowflake): Promise { + return this.#request(RPCCommands.GetChannel, { channel_id: id }); } /** * Get all channels * - * @param {Snowflake} [id] Guild ID - * @param {number} [timeout] Timeout request - * @returns {Promise>} - */ - async getChannels(id: Snowflake, timeout: number): Promise> { - const { channels } = await this.#request(RPCCommands.GetChannels, { - timeout, - guild_id: id, - }); + * @param id Guild Id + */ + async getChannels(id: Snowflake): Promise { + const { channels } = await this.#request(RPCCommands.GetChannels, { guild_id: id }); return channels; } - /** - * @typedef {CertifiedDevice} - * @prop {string} type One of `AUDIO_INPUT`, `AUDIO_OUTPUT`, `VIDEO_INPUT` - * @prop {string} uuid This device's Windows UUID - * @prop {object} vendor Vendor information - * @prop {string} vendor.name Vendor's name - * @prop {string} vendor.url Vendor's url - * @prop {object} model Model information - * @prop {string} model.name Model's name - * @prop {string} model.url Model's url - * @prop {string[]} related Array of related product's Windows UUIDs - * @prop {boolean} echoCancellation If the device has echo cancellation - * @prop {boolean} noiseSuppression If the device has noise suppression - * @prop {boolean} automaticGainControl If the device has automatic gain control - * @prop {boolean} hardwareMute If the device has a hardware mute - */ - /** * Tell discord which devices are certified * - * @param {CertifiedDevice[]} devices Certified devices to send to discord - * @returns {Promise} + * @param devices Certified devices to send to discord */ - async setCertifiedDevices(devices: CertifiedDevice[]): Promise { + async setCertifiedDevices(devices: RPCCertifiedDevice[]): Promise { return this.#request(RPCCommands.SetCertifiedDevices, { - devices: devices.map((d) => ({ - type: d.type, - id: d.uuid, - vendor: d.vendor, - model: d.model, - related: d.related, - echo_cancellation: d.echoCancellation, - noise_suppression: d.noiseSuppression, - automatic_gain_control: d.automaticGainControl, - hardware_mute: d.hardwareMute, - })), + devices, }); } - /** - * @typedef {UserVoiceSettings} - * @prop {Snowflake} id ID of the user these settings apply to - * @prop {?object} [pan] Pan settings, an object with `left` and `right` set between - * 0.0 and 1.0, inclusive - * @prop {?number} [volume=100] The volume - * @prop {bool} [mute] If the user is muted - */ - /** * Set the voice settings for a user, by id * - * @param {Snowflake} id ID of the user to set - * @param {UserVoiceSettings} settings Settings - * @returns {Promise} + * @param id Id of the user to set + * @param settings Settings to set */ - async setUserVoiceSettings(id: Snowflake, settings: UserVoiceSettings): Promise { + async setUserVoiceSettings( + id: Snowflake, + settings: Omit, 'user_id'>, + ): Promise { return this.#request(RPCCommands.SetUserVoiceSettings, { user_id: id, - pan: settings.pan, - mute: settings.mute, - volume: settings.volume, + ...settings, }); } /** * Move the user to a voice channel * - * @param {Snowflake} id ID of the voice channel - * @param {object} [options] Options - * @param {number} [options.timeout] Timeout for the command - * @param {boolean} [options.force] Force this move. This should only be done if you + * @param id Id of the voice channel + * @param options Options + * @param options.timeout Timeout for the command + * @param options.force Force this move. This should only be done if you + * * have explicit permission from the user. - * @returns {Promise} */ async selectVoiceChannel( id: Snowflake, - { timeout, force = false }: { force?: boolean; timeout?: number } = {}, - ): Promise { - return this.#request(RPCCommands.SelectVoiceChannel, { channel_id: id, timeout, force }); + { timeout, force = false }: Omit = {}, + ): Promise { + const args: RPCSelectVoiceChannelArgs = { channel_id: id, force }; + if (timeout) { + args.timeout = timeout; + } + return this.#request(RPCCommands.SelectVoiceChannel, args); } /** * Move the user to a text channel * - * @param {Snowflake} id ID of the voice channel - * @param {object} [options] Options - * @param {number} [options.timeout] Timeout for the command + * @param id Id of the voice channel + * @param options Options + * @param options.timeout Timeout for the command + * * have explicit permission from the user. - * @returns {Promise} */ - async selectTextChannel(id: Snowflake, { timeout }: { timeout?: number } = {}): Promise { - return this.#request(RPCCommands.SelectTextChannel, { channel_id: id, timeout }); + async selectTextChannel( + id: Snowflake, + { timeout }: Omit = {}, + ): Promise { + const args: RPCSelectTextChannelArgs = { channel_id: id }; + if (timeout) { + args.timeout = timeout; + } + return this.#request(RPCCommands.SelectTextChannel, args); } /** * Get current voice settings * - * @returns {Promise} */ - async getVoiceSettings(): Promise { - return this.#request(RPCCommands.GetVoiceSettings).then((s) => ({ - automaticGainControl: s.automatic_gain_control, - echoCancellation: s.echo_cancellation, - noiseSuppression: s.noise_suppression, - qos: s.qos, - silenceWarning: s.silence_warning, - deaf: s.deaf, - mute: s.mute, - input: { - availableDevices: s.input.available_devices, - device: s.input.device_id, - volume: s.input.volume, - }, - output: { - availableDevices: s.output.available_devices, - device: s.output.device_id, - volume: s.output.volume, - }, - mode: { - type: s.mode.type, - autoThreshold: s.mode.auto_threshold, - threshold: s.mode.threshold, - shortcut: s.mode.shortcut, - delay: s.mode.delay, - }, - })); + async getVoiceSettings(): Promise { + return this.#request(RPCCommands.GetVoiceSettings); } /** @@ -445,9 +406,8 @@ export class RPCClient extends AsyncEventEmitter { * This also locks the settings for any other rpc sessions which may be connected. * * @param {object} args Settings - * @returns {Promise} */ - async setVoiceSettings(args: object): Promise { + async setVoiceSettings(args: object): Promise { return this.#request(RPCCommands.SetVoiceSettings, { automatic_gain_control: args.automaticGainControl, echo_cancellation: args.echoCancellation, @@ -481,6 +441,7 @@ export class RPCClient extends AsyncEventEmitter { } /** + * @unstable * Capture a shortcut using the client * The callback takes (key, stop) where `stop` is a function that will stop capturing. * This `stop` function must be called before disconnecting or else the user will have @@ -490,7 +451,7 @@ export class RPCClient extends AsyncEventEmitter { * @returns {Promise} */ async captureShortcut(callback: Function): Promise { - const subid = subKey(RPCEvents.CaptureShortcutChange); + const subid = subKey(RPCEvents.CaptureShortcutChange, {}); const stop = async () => { this._subscriptions.delete(subid); return this.#request(RPCCommands.CaptureShortcut, { action: 'STOP' }); @@ -505,11 +466,10 @@ export class RPCClient extends AsyncEventEmitter { /** * Sets the presence for the logged in user. * - * @param {object} args The rich presence to pass. - * @param {number} [pid] The application's process ID. Defaults to the executing process' PID. - * @returns {Promise} + * @param args The rich presence to pass. + * @param pid The application's process ID. Defaults to the executing process' PID. */ - public async setActivity(args: object = {}, pid: number | null = getPid()): Promise { + public async setActivity(args: Partial = {}, pid: number | null = getPid()): Promise { let timestamps; let assets; let party; @@ -582,7 +542,7 @@ export class RPCClient extends AsyncEventEmitter { * @param {number} [pid] The application's process ID. Defaults to the executing process' PID. * @returns {Promise} */ - public async clearActivity(pid: number | null = getPid()): Promise { + public async clearActivity(pid: number | null = getPid()): Promise { return this.#request(RPCCommands.SetActivity, { pid: pid ?? 0, }); @@ -591,40 +551,45 @@ export class RPCClient extends AsyncEventEmitter { /** * Invite a user to join the game the RPC user is currently playing * - * @param {User} user The user to invite - * @returns {Promise} + * @param userId The id of the user to invite */ - public async sendJoinInvite(user: User): Promise { + public async sendJoinInvite(userId: Snowflake): Promise { return this.#request(RPCCommands.SendActivityJoinInvite, { - user_id: user.id || user, + user_id: userId, }); } /** * Request to join the game the user is playing * - * @param {User} user The user whose game you want to request to join + * @param userId The id of the user whose game you want to request to join * @returns {Promise} */ - public async sendJoinRequest(user: User): Promise { + public async sendJoinRequest(userId: Snowflake): Promise { return this.#request(RPCCommands.SendActivityJoinRequest, { - user_id: user.id || user, + user_id: userId, }); } /** * Reject a join request from a user * - * @param {User} user The user whose request you wish to reject - * @returns {Promise} + * @param userId The id of the user whose request you wish to reject */ - public async closeJoinRequest(user: User): Promise { + public async closeJoinRequest(userId: Snowflake): Promise { return this.#request(RPCCommands.CloseActivityRequest, { - user_id: user.id || user, + user_id: userId, }); } - public async createLobby(type, capacity, metadata) { + /** + * @unstable + * @param type + * @param capacity + * @param metadata + * @returns + */ + public async createLobby(type: LobbyType, capacity: number, metadata: RPCLobbyMetadata) { return this.#request(RPCCommands.CreateLobby, { type, capacity, @@ -632,50 +597,88 @@ export class RPCClient extends AsyncEventEmitter { }); } - public async updateLobby(lobby, { type, owner, capacity, metadata } = {}) { + /** + * @unstable + * @param id lobby id + * @param updateLobbyArgs arguments to update the lobby + * @returns + */ + public async updateLobby( + id: string, + { type, owner_id, capacity, metadata }: Omit = {} as RPCUpdateLobbyArgs, + ) { return this.#request(RPCCommands.UpdateLobby, { - id: lobby.id || lobby, + id, type, - owner_id: owner?.id || owner, + owner_id, capacity, metadata, }); } - public async deleteLobby(lobby) { + /** + * @unstable + * @param id lobby id + * @returns deleted lobby + */ + public async deleteLobby(id: string) { return this.#request(RPCCommands.DeleteLobby, { - id: lobby.id || lobby, + id, }); } - public async connectToLobby(id, secret) { + /** + * @unstable + * @param id lobby id + * @param secret secret to access the lobby + * @returns connected lobby + */ + public async connectToLobby(id: string, secret: string) { return this.#request(RPCCommands.ConnectToLobby, { id, secret, }); } - public async sendToLobby(lobby, data) { + /** + * @unstable + * @param lobbyId id of the lobby + * @param data data to send + */ + public async sendToLobby(lobbyId: string, data: unknown) { return this.#request(RPCCommands.SendToLobby, { - id: lobby.id || lobby, + id: lobbyId, data, }); } - public async disconnectFromLobby(lobby) { + /** + * @unstable + * @param lobbyId id of the lobby + */ + public async disconnectFromLobby(lobbyId: string) { return this.#request(RPCCommands.DisconnectFromLobby, { - id: lobby.id || lobby, + id: lobbyId, }); } - public async updateLobbyMember(lobby, user, metadata) { + /** + * @unstable + * @param lobbyId id of the lobby + * @param userId id of the user + * @param metadata metadata to update + */ + public async updateLobbyMember(lobbyId: string, userId: Snowflake, metadata: RPCLobbyMetadata) { return this.#request(RPCCommands.UpdateLobbyMember, { - lobby_id: lobby.id || lobby, - user_id: user.id || user, + lobby_id: lobbyId, + user_id: userId, metadata, }); } + /** + * @unstable + */ public async getRelationships() { const types = Object.keys(RelationshipType); return this.#request(RPCCommands.GetRelationships).then((o) => @@ -692,7 +695,7 @@ export class RPCClient extends AsyncEventEmitter { * @param event - Name of event e.g. `MESSAGE_CREATE` * @param args - Args for event e.g. `{ channel_id: '1234' }` */ - public async subscribe(event: string, args: object): Promise { + public async subscribe(event: RPCEvents, args: object): Promise { await this.#request(RPCCommands.Subscribe, args, event); return { unsubscribe: async () => this.#request(RPCCommands.Unsubscribe, args, event), diff --git a/src/constants.ts b/src/constants.ts index 4e59487..5a49a6d 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -15,6 +15,11 @@ import type { export const RPCVersion = '1'; +/** + * @unstable + */ +export type RPCLobbyMetadata = unknown; + /** * https://discord.com/developers/docs/topics/rpc#authenticate-oauth2-application-structure */ @@ -69,7 +74,7 @@ export enum RPCDeviceType { VideoInput = 'videoinput', } -export interface BaseRPCDevice { +export interface BaseRPCCertifiedDevice { /** * the device's Windows UUID */ @@ -95,8 +100,8 @@ export interface BaseRPCDevice { /** * https://discord.com/developers/docs/topics/rpc#setcertifieddevices-device-object */ -export type RPCDevice = Type extends RPCDeviceType.AudioInput - ? BaseRPCDevice & { +export type RPCCertifiedDevice = Type extends RPCDeviceType.AudioInput + ? BaseRPCCertifiedDevice & { /** * if the device's native automatic gain control is enabled */ @@ -114,7 +119,7 @@ export type RPCDevice = Type extends */ noise_suppression: boolean; } - : BaseRPCDevice; + : BaseRPCCertifiedDevice; export interface RPCVoiceAvailableDevice { /** @@ -1051,7 +1056,10 @@ export interface RPCSetActivityArgs { /** * the rich presence to assign to the user */ - activity?: Omit; + activity?: Partial< + Omit & + Partial> + >; /** * the application's process id */ @@ -1484,7 +1492,7 @@ export interface RPCSetCertifiedDevicesArgs { /** * a list of devices for your manufacturer, in order of priority */ - devices: RPCDevice[]; + devices: RPCCertifiedDevice[]; } /** @@ -1539,7 +1547,28 @@ export interface RPCUpdateLobbyResultData {} /** * @unstable */ -export interface RPCUpdateLobbyArgs {} +export interface RPCUpdateLobbyArgs { + /** + * id of the lobby to update + */ + id: Snowflake; + /** + * lobby type + */ + type: LobbyType; + /** + * id of the owner of the lobby + */ + owner_id: Snowflake; + /** + * capacity of the lobby + */ + capacity: number; + /** + * metadata for the lobby + */ + metadata: RPCLobbyMetadata; +} /** * @unstable @@ -3419,6 +3448,12 @@ export type RPCMessagePayload = // TODO: get rid of all types above as they will be within discord-api-types soon +export enum Events { + Ready = 'ready', + Connected = 'connected', + Disconnected = 'disconnected', +} + export interface MappedRPCCommandsResultsData { [RPCCommands.Authorize]: RPCAuthorizeResultData; [RPCCommands.Authenticate]: RPCAuthenticateResultData; From c57e2fee5e12fc1ac097bc7b4d2395dd20e12b20 Mon Sep 17 00:00:00 2001 From: Micah Benac Date: Sun, 9 Feb 2025 04:40:54 +0100 Subject: [PATCH 07/26] fix: resolve all type errors --- src/RPCEventError.ts | 17 ++++ src/client.ts | 218 +++++++++++++++++-------------------------- src/constants.ts | 53 ++++++++++- src/ipc.ts | 56 +++++------ 4 files changed, 182 insertions(+), 162 deletions(-) create mode 100644 src/RPCEventError.ts diff --git a/src/RPCEventError.ts b/src/RPCEventError.ts new file mode 100644 index 0000000..778e531 --- /dev/null +++ b/src/RPCEventError.ts @@ -0,0 +1,17 @@ +import { RPCErrorCodes, RPCErrorDispatchData } from './constants'; + +export class RPCEventError extends Error { + code?: RPCErrorCodes; + data?: RPCErrorDispatchData; + + constructor(data: RPCErrorDispatchData | string) { + if (typeof data === 'string') { + super(data); + return; + } + super(data.message); + this.name = 'RPCEventError'; + this.code = data.code; + this.data = data; + } +} diff --git a/src/client.ts b/src/client.ts index 6018829..7f9ecea 100644 --- a/src/client.ts +++ b/src/client.ts @@ -1,10 +1,19 @@ +import { REST } from '@discordjs/rest'; import { AsyncEventEmitter } from '@vladfrangu/async_event_emitter'; -import type { APIApplication, APIUser, GatewayActivity, OAuth2Scopes, Snowflake } from 'discord-api-types/v10'; +import { + RESTPostOAuth2AccessTokenResult, + Routes, + type APIUser, + type OAuth2Scopes, + type Snowflake, +} from 'discord-api-types/v10'; import { randomUUID } from 'node:crypto'; import { clearTimeout, setTimeout } from 'node:timers'; import type { LobbyType, MappedRPCCommandsArgs, + MappedRPCCommandsResultsData, + NullableFields, RPCCallableCommands, RPCCertifiedDevice, RPCGetChannelResultData, @@ -14,17 +23,22 @@ import type { RPCGetVoiceSettingsResultData, RPCLobbyMetadata, RPCMessage, + RPCOAuth2Application, RPCSelectTextChannelArgs, RPCSelectTextChannelResultData, RPCSelectVoiceChannelArgs, RPCSelectVoiceChannelResultData, + RPCSetActivityArgs, RPCSetCertifiedDevicesResultData, RPCSetUserVoiceSettingsArgs, RPCSetUserVoiceSettingsResultData, + RPCSetVoiceSettingsArgs, + RPCSubscribeArgs, RPCUpdateLobbyArgs, } from './constants'; -import { RPCCommands, RPCEvents, RelationshipType } from './constants'; +import { RPCCaptureShortcutAction, RPCCommands, RPCEvents } from './constants'; import { IPCTransport } from './ipc'; +import { RPCEventError } from './RPCEventError'; import { getPid } from './util'; export interface RPCLoginOptions { @@ -51,7 +65,11 @@ export interface RPCLoginOptions { export interface RPCAuthorizationOptions extends Partial {} -function subKey(event: RPCEvents, args: unknown) { +export interface Oauth2RPCTokenExchangeResult { + rpc_token: string; +} + +function subKey(event: RPCEvents, args?: RPCSubscribeArgs) { return `${event}${JSON.stringify(args)}`; } @@ -65,7 +83,7 @@ export class RPCClient extends AsyncEventEmitter { public clientId: string | null; - public application: APIApplication | null; + public application: RPCOAuth2Application | null; public user: APIUser | null; @@ -84,6 +102,8 @@ export class RPCClient extends AsyncEventEmitter { */ #connectPromise: Promise | undefined; + #subscriptions: Map = new Map(); + public constructor(options: Partial = {}) { super(); @@ -122,7 +142,7 @@ export class RPCClient extends AsyncEventEmitter { this.transport.once('close', () => { for (const exp_nonce of this.#expected_nonces.values()) { - exp_nonce.reject(new Error('connection closed')); + exp_nonce.reject(new RPCEventError('connection closed')); } this.emit('disconnected'); @@ -182,19 +202,21 @@ export class RPCClient extends AsyncEventEmitter { args: MappedRPCCommandsArgs[Cmd] = {} as MappedRPCCommandsArgs[Cmd], evt?: RPCEvents, ) { - return new Promise((resolve, reject) => { - const nonce = randomUUID(); - const payload: { cmd: Cmd; args: MappedRPCCommandsArgs[Cmd]; nonce: string; evt?: RPCEvents } = { - cmd, - args, - nonce, - }; - if (cmd === RPCCommands.Subscribe || cmd === RPCCommands.Unsubscribe) { - payload.evt = evt!; - } - this.transport.send({ cmd, args, evt, nonce }); - this.#expected_nonces.set(nonce, { resolve, reject }); - }); + return new Promise( + (resolve: (value: MappedRPCCommandsResultsData[Cmd]) => void, reject: (reason: RPCEventError) => void) => { + const nonce = randomUUID(); + const payload: { cmd: Cmd; args: MappedRPCCommandsArgs[Cmd]; nonce: string; evt?: RPCEvents } = { + cmd, + args, + nonce, + }; + if (cmd === RPCCommands.Subscribe || cmd === RPCCommands.Unsubscribe) { + payload.evt = evt!; + } + this.transport.send({ cmd, args, evt, nonce }); + this.#expected_nonces.set(nonce, { resolve, reject }); + }, + ); } /** @@ -215,9 +237,7 @@ export class RPCClient extends AsyncEventEmitter { } const { resolve, reject } = this.#expected_nonces.get(message.nonce)!; if ('evt' in message && message.evt === RPCEvents.Error) { - const e = new Error(message.data.message); - e.code = message.data.code; - e.data = message.data; + const e = new RPCEventError(message.data); reject(e); } else { resolve(message.data); @@ -241,32 +261,34 @@ export class RPCClient extends AsyncEventEmitter { redirectUri, prompt, }: Partial = {}): Promise { - if (clientSecret && rpcToken === true) { - const body = await this.fetch('POST', '/oauth2/token/rpc', { - data: new URLSearchParams({ - client_id: this.clientId, + const rest = new REST().setToken(this.accessToken!); + + if (clientSecret) { + const response = (await rest.post(`${Routes.oauth2TokenExchange()}/rpc`, { + body: new URLSearchParams({ + client_id: this.clientId!, client_secret: clientSecret, }), - }); - rpcToken = body.rpc_token; + })) as Oauth2RPCTokenExchangeResult; + rpcToken = response.rpc_token; } const { code } = await this.#request(RPCCommands.Authorize, { - scopes, - client_id: this.clientId, - prompt, - rpc_token: rpcToken, + scopes: scopes!, + client_id: this.clientId!, + prompt: prompt!, + rpc_token: rpcToken!, }); - const response = await this.fetch('POST', '/oauth2/token', { - data: new URLSearchParams({ - client_id: this.clientId, - client_secret: clientSecret, + const response = (await rest.post(Routes.oauth2TokenExchange(), { + body: new URLSearchParams({ + client_id: this.clientId!, + client_secret: clientSecret!, code, grant_type: 'authorization_code', - redirect_uri: redirectUri, + redirect_uri: redirectUri!, }), - }); + })) as RESTPostOAuth2AccessTokenResult; return response.access_token; } @@ -320,7 +342,7 @@ export class RPCClient extends AsyncEventEmitter { * * @param id Guild Id */ - async getChannels(id: Snowflake): Promise { + async getChannels(id: Snowflake): Promise { const { channels } = await this.#request(RPCCommands.GetChannels, { guild_id: id }); return channels; } @@ -405,39 +427,10 @@ export class RPCClient extends AsyncEventEmitter { * Set current voice settings, overriding the current settings until this session disconnects. * This also locks the settings for any other rpc sessions which may be connected. * - * @param {object} args Settings - */ - async setVoiceSettings(args: object): Promise { - return this.#request(RPCCommands.SetVoiceSettings, { - automatic_gain_control: args.automaticGainControl, - echo_cancellation: args.echoCancellation, - noise_suppression: args.noiseSuppression, - qos: args.qos, - silence_warning: args.silenceWarning, - deaf: args.deaf, - mute: args.mute, - input: args.input - ? { - device_id: args.input.device, - volume: args.input.volume, - } - : undefined, - output: args.output - ? { - device_id: args.output.device, - volume: args.output.volume, - } - : undefined, - mode: args.mode - ? { - type: args.mode.type, - auto_threshold: args.mode.autoThreshold, - threshold: args.mode.threshold, - shortcut: args.mode.shortcut, - delay: args.mode.delay, - } - : undefined, - }); + * @param args Settings + */ + async setVoiceSettings(args: RPCSetVoiceSettingsArgs): Promise { + return this.#request(RPCCommands.SetVoiceSettings, args); } /** @@ -451,16 +444,16 @@ export class RPCClient extends AsyncEventEmitter { * @returns {Promise} */ async captureShortcut(callback: Function): Promise { - const subid = subKey(RPCEvents.CaptureShortcutChange, {}); + const subid = subKey(RPCEvents.CaptureShortcutChange); const stop = async () => { - this._subscriptions.delete(subid); - return this.#request(RPCCommands.CaptureShortcut, { action: 'STOP' }); + this.#subscriptions.delete(subid); + return this.#request(RPCCommands.CaptureShortcut, { action: RPCCaptureShortcutAction.Stop }); }; - this._subscriptions.set(subid, ({ shortcut }) => { + this.#subscriptions.set(subid, ({ shortcut }: { shortcut: unknown }) => { callback(shortcut, stop); }); - return this.#request(RPCCommands.CaptureShortcut, { action: 'START' }).then(() => stop); + return this.#request(RPCCommands.CaptureShortcut, { action: RPCCaptureShortcutAction.Start }).then(() => stop); } /** @@ -469,69 +462,40 @@ export class RPCClient extends AsyncEventEmitter { * @param args The rich presence to pass. * @param pid The application's process ID. Defaults to the executing process' PID. */ - public async setActivity(args: Partial = {}, pid: number | null = getPid()): Promise { - let timestamps; - let assets; - let party; - let secrets; - if (args.startTimestamp || args.endTimestamp) { - timestamps = { - start: args.startTimestamp, - end: args.endTimestamp, - }; - if (timestamps.start instanceof Date) { - timestamps.start = Math.round(timestamps.start.getTime()); - } - - if (timestamps.end instanceof Date) { - timestamps.end = Math.round(timestamps.end.getTime()); - } + public async setActivity(args: RPCSetActivityArgs['activity'] = {}, pid: number | null = getPid()): Promise { + const newActivity: NullableFields = { + details: args.details, + state: args.state, + instance: Boolean(args.instance), + buttons: args?.buttons, + }; - if (timestamps.start > 2_147_483_647_000) { + if (args.timestamps) { + newActivity.timestamps = args.timestamps; + if ('start' in newActivity.timestamps && newActivity.timestamps.start > 2_147_483_647_000) { throw new RangeError('timestamps.start must fit into a unix timestamp'); } - if (timestamps.end > 2_147_483_647_000) { + if ('end' in newActivity.timestamps && newActivity.timestamps.end > 2_147_483_647_000) { throw new RangeError('timestamps.end must fit into a unix timestamp'); } } - if (args.largeImageKey || args.largeImageText || args.smallImageKey || args.smallImageText) { - assets = { - large_image: args.largeImageKey, - large_text: args.largeImageText, - small_image: args.smallImageKey, - small_text: args.smallImageText, - }; + if ('assets' in args) { + newActivity.assets = args.assets; } - if (args.partySize || args.partyId || args.partyMax) { - party = { id: args.partyId }; - if (args.partySize || args.partyMax) { - party.size = [args.partySize, args.partyMax]; - } + if ('party' in args) { + newActivity.party = args.party; } - if (args.matchSecret || args.joinSecret || args.spectateSecret) { - secrets = { - match: args.matchSecret, - join: args.joinSecret, - spectate: args.spectateSecret, - }; + if ('secrets' in args) { + newActivity.secrets = args.secrets; } return this.#request(RPCCommands.SetActivity, { pid: pid ?? 0, - activity: { - state: args.state, - details: args.details, - timestamps, - assets, - party, - secrets, - buttons: args.buttons, - instance: Boolean(args.instance), - }, + activity: newActivity as Exclude, }); } @@ -680,13 +644,7 @@ export class RPCClient extends AsyncEventEmitter { * @unstable */ public async getRelationships() { - const types = Object.keys(RelationshipType); - return this.#request(RPCCommands.GetRelationships).then((o) => - o.relationships.map((r) => ({ - ...r, - type: types[r.type], - })), - ); + return this.#request(RPCCommands.GetRelationships); } /** diff --git a/src/constants.ts b/src/constants.ts index 5a49a6d..6a17efd 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -15,6 +15,14 @@ import type { export const RPCVersion = '1'; +/** + * @unstable + */ +export enum RPCCaptureShortcutAction { + Start = 'START', + Stop = 'STOP', +} + /** * @unstable */ @@ -282,6 +290,24 @@ export enum RelationshipType { Implicit, } +/** + * @unstable + */ +export interface Relationship { + /** + * the id of the user + */ + id: Snowflake; + /** + * relationship type + */ + type: RelationshipType; + /** + * user + */ + user: APIUser; +} + /** * https://discord.com/developers/docs/topics/opcodes-and-status-codes#rpc-rpc-error-codes */ @@ -723,6 +749,11 @@ export interface RPCAuthorizeArgs { * one-time use RPC token */ rpc_token: string; + /** + * @unstable Authorize Arguments doesn't document this field + * https://discord.com/developers/docs/topics/oauth2#authorization-code-grant + */ + prompt?: 'consent' | 'none'; /** * scopes to authorize */ @@ -730,7 +761,7 @@ export interface RPCAuthorizeArgs { /** * username to create a guest account with if the user does not have Discord */ - username: string; + username?: string; } /** @@ -1184,7 +1215,9 @@ export interface RPCCaptureShortcutResultData {} /** * @unstable */ -export interface RPCCaptureShortcutArgs {} +export interface RPCCaptureShortcutArgs { + action: RPCCaptureShortcutAction; +} export interface RPCCloseActivityRequestResultData {} /** @@ -1326,7 +1359,7 @@ export interface RPCGetNetworkingConfigArgs {} /** * @unstable */ -export interface RPCGetRelationshipsResultData {} +export type RPCGetRelationshipsResultData = Relationship[]; /** * @unstable */ @@ -1961,7 +1994,12 @@ export interface RPCActivitySpectateDispatchData { * @unstable */ -export interface RPCCaptureShortcutChangeDispatchData {} +export interface RPCCaptureShortcutChangeDispatchData { + /** + * the shortcut the user has pressed + */ + shortcut: string; +} /** * https://discord.com/developers/docs/topics/rpc#channelcreate-channel-create-dispatch-data-structure @@ -3505,6 +3543,7 @@ export interface MappedRPCCommandsResultsData { [RPCCommands.Overlay]: RPCOverlayResultData; [RPCCommands.SearchLobbies]: RPCSearchLobbiesResultData; [RPCCommands.SendActivityJoinInvite]: RPCSendActivityJoinInviteResultData; + [RPCCommands.SendActivityJoinRequest]: RPCSendActivityJoinRequestResultData; [RPCCommands.SendToLobby]: RPCSendToLobbyResultData; [RPCCommands.SetCertifiedDevices]: RPCSetCertifiedDevicesResultData; [RPCCommands.SetOverlayLocked]: RPCSetOverlayLockedResultData; @@ -3664,3 +3703,9 @@ export interface MappedRPCEventsDispatchData { [RPCEvents.VoiceStateDelete]: RPCVoiceStateDeleteDispatchData; [RPCEvents.VoiceStateUpdate]: RPCVoiceStateUpdateDispatchData; } + +export type Nullable = T | null | undefined; + +export type NullableFields = { + [P in keyof T]: Nullable; +}; diff --git a/src/ipc.ts b/src/ipc.ts index 6933da2..71e82bb 100644 --- a/src/ipc.ts +++ b/src/ipc.ts @@ -1,11 +1,11 @@ +import { AsyncEventEmitter } from '@vladfrangu/async_event_emitter'; import { Buffer } from 'node:buffer'; import { randomUUID } from 'node:crypto'; import { realpath } from 'node:fs/promises'; import { createConnection, type Socket } from 'node:net'; import process from 'node:process'; -import { AsyncEventEmitter } from '@vladfrangu/async_event_emitter'; import type { RPCClient } from './client'; -import { RPCCommands, RPCEvents } from './constants'; +import { RPCMessagePayload } from './constants'; enum OPCodes { Handshake, @@ -51,25 +51,25 @@ async function getIPC(id = 0): Promise { return promise; } -async function findEndpoint(tries = 0): Promise { - if (tries > 30) { - throw new Error('Could not find endpoint'); - } +// async function findEndpoint(tries = 0): Promise { +// if (tries > 30) { +// throw new Error('Could not find endpoint'); +// } - const endpoint = `http://127.0.0.1:${6_463 + (tries % 10)}`; +// const endpoint = `http://127.0.0.1:${6_463 + (tries % 10)}`; - try { - const response = await fetch(endpoint); +// try { +// const response = await fetch(endpoint); - if (response.status === 404) return endpoint; +// if (response.status === 404) return endpoint; - return await findEndpoint(tries + 1); - } catch { - return findEndpoint(tries + 1); - } -} +// return await findEndpoint(tries + 1); +// } catch { +// return findEndpoint(tries + 1); +// } +// } -export function encode(op: number, data: RPCPayload) { +export function encode(op: number, data: RPCMessagePayload | string | {}) { const stringifiedData = JSON.stringify(data); const length = Buffer.byteLength(stringifiedData); const packet = Buffer.alloc(8 + length); @@ -91,7 +91,7 @@ const working: WorkingData = { op: undefined, }; -export function decode(socket, callback) { +export function decode(socket: Socket, callback: (data: { op: OPCodes; data: RPCMessagePayload }) => void) { const packet = socket.read(); if (!packet) { return; @@ -109,7 +109,7 @@ export function decode(socket, callback) { try { const data = JSON.parse(working.full + raw); - callback({ op, data }); + callback({ op: op!, data }); working.full = ''; working.op = undefined; } catch { @@ -158,15 +158,15 @@ export class IPCTransport extends AsyncEventEmitter { return; } - if (data.cmd === RPCCommands.Authorize && data.evt !== RPCEvents.Error) { - findEndpoint() - .then((endpoint) => { - this.client.request.endpoint = endpoint; - }) - .catch((error) => { - this.client.emit('error', error); - }); - } + // if (data.cmd === RPCCommands.Authorize && !('evt' in data)) { + // findEndpoint() + // .then((endpoint) => { + // this.client.request.endpoint = endpoint; + // }) + // .catch((error) => { + // this.client.emit('error', error); + // }); + // } this.emit('message', data); break; @@ -184,7 +184,7 @@ export class IPCTransport extends AsyncEventEmitter { this.emit('close', error); } - public send(data: RPCPayload, op = OPCodes.Frame) { + public send(data: RPCMessagePayload | string | {}, op = OPCodes.Frame) { this.socket!.write(encode(op, data)); } From 65e68bb551a52e309e60ad9a797f0c1f747be3f9 Mon Sep 17 00:00:00 2001 From: Micah Benac Date: Sun, 9 Feb 2025 18:11:31 +0100 Subject: [PATCH 08/26] fix: import extensions --- src/RPCEventError.ts | 2 +- src/client.ts | 10 +++++----- src/constants.ts | 2 +- src/index.ts | 9 +++++---- src/ipc.ts | 4 ++-- src/util.ts | 6 +----- tsconfig.json | 2 +- 7 files changed, 16 insertions(+), 19 deletions(-) diff --git a/src/RPCEventError.ts b/src/RPCEventError.ts index 778e531..6e9a037 100644 --- a/src/RPCEventError.ts +++ b/src/RPCEventError.ts @@ -1,4 +1,4 @@ -import { RPCErrorCodes, RPCErrorDispatchData } from './constants'; +import { RPCErrorCodes, RPCErrorDispatchData } from './constants.js'; export class RPCEventError extends Error { code?: RPCErrorCodes; diff --git a/src/client.ts b/src/client.ts index 7f9ecea..42d5747 100644 --- a/src/client.ts +++ b/src/client.ts @@ -35,11 +35,11 @@ import type { RPCSetVoiceSettingsArgs, RPCSubscribeArgs, RPCUpdateLobbyArgs, -} from './constants'; -import { RPCCaptureShortcutAction, RPCCommands, RPCEvents } from './constants'; -import { IPCTransport } from './ipc'; -import { RPCEventError } from './RPCEventError'; -import { getPid } from './util'; +} from './constants.js'; +import { RPCCaptureShortcutAction, RPCCommands, RPCEvents } from './constants.js'; +import { IPCTransport } from './ipc.js'; +import { RPCEventError } from './RPCEventError.js'; +import { getPid } from './util.js'; export interface RPCLoginOptions { accessToken: string; diff --git a/src/constants.ts b/src/constants.ts index 6a17efd..7935845 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -1,7 +1,6 @@ /* eslint-disable tsdoc/syntax */ /* eslint-disable @typescript-eslint/no-empty-interface */ -import type { Snowflake } from 'discord-api-types/globals'; import type { APIMessage, APIPartialChannel, @@ -11,6 +10,7 @@ import type { ChannelType, GatewayActivity, OAuth2Scopes, + Snowflake, } from 'discord-api-types/v10'; export const RPCVersion = '1'; diff --git a/src/index.ts b/src/index.ts index 1235171..288c1ce 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,7 +1,8 @@ -export * from './client'; -export * from './constants'; -export * from './ipc'; -export * from './util'; +export * from './client.js'; +export * from './constants.js'; +export * from './ipc.js'; +export * from './RPCEventError.js'; +export * from './util.js'; /** * The {@link https://github.com/discordjs/discord.js/blob/main/packages/rpc#readme | @discordjs/rpc} version diff --git a/src/ipc.ts b/src/ipc.ts index 71e82bb..5f68ffd 100644 --- a/src/ipc.ts +++ b/src/ipc.ts @@ -4,8 +4,8 @@ import { randomUUID } from 'node:crypto'; import { realpath } from 'node:fs/promises'; import { createConnection, type Socket } from 'node:net'; import process from 'node:process'; -import type { RPCClient } from './client'; -import { RPCMessagePayload } from './constants'; +import type { RPCClient } from './client.js'; +import { RPCMessagePayload } from './constants.js'; enum OPCodes { Handshake, diff --git a/src/util.ts b/src/util.ts index 4947e39..33539e1 100644 --- a/src/util.ts +++ b/src/util.ts @@ -1,4 +1,4 @@ -let register; +export let register: (scheme: string) => boolean = () => false; try { const { app } = require('electron'); register = app.setAsDefaultProtocolClient.bind(app); @@ -8,10 +8,6 @@ try { } catch (e) {} // eslint-disable-line no-empty } -if (typeof register !== 'function') { - register = () => false; -} - export function getPid() { if (typeof globalThis.process !== 'undefined') { return process.pid; diff --git a/tsconfig.json b/tsconfig.json index f352562..dc723f5 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -46,6 +46,6 @@ "target": "ESNext", "useDefineForClassFields": true }, - "include": ["src/**/*.ts", "src/**/*.js", "src/**/*.cjs", "src/**/*.mjs", "bin"], + "include": ["src/**/*.ts", "src/**/*.js", "src/**/*.cjs", "src/**/*.mjs", "bin", "test/**/*.ts"], "exclude": ["node_modules"] } From 0aca777258e304c90dfd8c9cfc2ab6a9725af3ce Mon Sep 17 00:00:00 2001 From: Danial Raza Date: Sun, 9 Feb 2025 19:05:09 +0100 Subject: [PATCH 09/26] refactor: update examples --- examples/README.md | 1 - examples/boops-javascript/.editorconfig | 9 + examples/boops-javascript/.eslintignore | 4 + examples/boops-javascript/.eslintrc.cjs | 3 + examples/boops-javascript/.gitignore | 5 + examples/boops-javascript/.npmrc | 1 + examples/boops-javascript/.prettierignore | 6 + examples/boops-javascript/.prettierrc.yaml | 4 + examples/boops-javascript/README.md | 34 + .../boops-javascript/electron-builder.yml | 42 + .../boops-javascript/electron.vite.config.mjs | 11 + examples/boops-javascript/package.json | 32 + examples/boops-javascript/pnpm-lock.yaml | 3652 +++++++++++++++ examples/boops-javascript/src/main/index.js | 114 + .../boops-javascript/src/preload/index.js | 20 + .../boops-javascript/src/renderer/index.html | 22 + .../src/renderer/src/renderer.js | 24 + .../boops-javascript/src/renderer/styles.css | 46 + examples/boops-typescript/.editorconfig | 9 + examples/boops-typescript/.eslintignore | 4 + examples/boops-typescript/.eslintrc.js | 7 + examples/boops-typescript/.gitignore | 5 + examples/boops-typescript/.npmrc | 1 + examples/boops-typescript/.prettierignore | 6 + examples/boops-typescript/.prettierrc.yaml | 4 + examples/boops-typescript/README.md | 34 + .../boops-typescript/electron-builder.yml | 43 + .../boops-typescript/electron.vite.config.ts | 11 + examples/boops-typescript/package.json | 38 + examples/boops-typescript/pnpm-lock.yaml | 3927 +++++++++++++++++ examples/boops-typescript/src/main/index.ts | 112 + .../boops-typescript/src/preload/index.d.ts | 8 + .../boops-typescript/src/preload/index.ts | 22 + .../boops-typescript/src/renderer/index.html | 22 + .../src/renderer/src/renderer.ts | 24 + .../boops-typescript/src/renderer/styles.css | 46 + examples/boops-typescript/tsconfig.json | 4 + examples/boops-typescript/tsconfig.node.json | 8 + examples/boops-typescript/tsconfig.web.json | 7 + examples/index.html | 15 - examples/main.js | 87 - examples/renderer.js | 26 - examples/style.css | 37 - 43 files changed, 8371 insertions(+), 166 deletions(-) delete mode 100644 examples/README.md create mode 100644 examples/boops-javascript/.editorconfig create mode 100644 examples/boops-javascript/.eslintignore create mode 100644 examples/boops-javascript/.eslintrc.cjs create mode 100644 examples/boops-javascript/.gitignore create mode 100644 examples/boops-javascript/.npmrc create mode 100644 examples/boops-javascript/.prettierignore create mode 100644 examples/boops-javascript/.prettierrc.yaml create mode 100644 examples/boops-javascript/README.md create mode 100644 examples/boops-javascript/electron-builder.yml create mode 100644 examples/boops-javascript/electron.vite.config.mjs create mode 100644 examples/boops-javascript/package.json create mode 100644 examples/boops-javascript/pnpm-lock.yaml create mode 100644 examples/boops-javascript/src/main/index.js create mode 100644 examples/boops-javascript/src/preload/index.js create mode 100644 examples/boops-javascript/src/renderer/index.html create mode 100644 examples/boops-javascript/src/renderer/src/renderer.js create mode 100644 examples/boops-javascript/src/renderer/styles.css create mode 100644 examples/boops-typescript/.editorconfig create mode 100644 examples/boops-typescript/.eslintignore create mode 100644 examples/boops-typescript/.eslintrc.js create mode 100644 examples/boops-typescript/.gitignore create mode 100644 examples/boops-typescript/.npmrc create mode 100644 examples/boops-typescript/.prettierignore create mode 100644 examples/boops-typescript/.prettierrc.yaml create mode 100644 examples/boops-typescript/README.md create mode 100644 examples/boops-typescript/electron-builder.yml create mode 100644 examples/boops-typescript/electron.vite.config.ts create mode 100644 examples/boops-typescript/package.json create mode 100644 examples/boops-typescript/pnpm-lock.yaml create mode 100644 examples/boops-typescript/src/main/index.ts create mode 100644 examples/boops-typescript/src/preload/index.d.ts create mode 100644 examples/boops-typescript/src/preload/index.ts create mode 100644 examples/boops-typescript/src/renderer/index.html create mode 100644 examples/boops-typescript/src/renderer/src/renderer.ts create mode 100644 examples/boops-typescript/src/renderer/styles.css create mode 100644 examples/boops-typescript/tsconfig.json create mode 100644 examples/boops-typescript/tsconfig.node.json create mode 100644 examples/boops-typescript/tsconfig.web.json delete mode 100644 examples/index.html delete mode 100644 examples/main.js delete mode 100644 examples/renderer.js delete mode 100644 examples/style.css diff --git a/examples/README.md b/examples/README.md deleted file mode 100644 index 39ed81d..0000000 --- a/examples/README.md +++ /dev/null @@ -1 +0,0 @@ -To run this example simply run `npm run example` diff --git a/examples/boops-javascript/.editorconfig b/examples/boops-javascript/.editorconfig new file mode 100644 index 0000000..9d08a1a --- /dev/null +++ b/examples/boops-javascript/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true diff --git a/examples/boops-javascript/.eslintignore b/examples/boops-javascript/.eslintignore new file mode 100644 index 0000000..a6f34fe --- /dev/null +++ b/examples/boops-javascript/.eslintignore @@ -0,0 +1,4 @@ +node_modules +dist +out +.gitignore diff --git a/examples/boops-javascript/.eslintrc.cjs b/examples/boops-javascript/.eslintrc.cjs new file mode 100644 index 0000000..d1e1ab6 --- /dev/null +++ b/examples/boops-javascript/.eslintrc.cjs @@ -0,0 +1,3 @@ +module.exports = { + extends: ['eslint:recommended', '@electron-toolkit', '@electron-toolkit/eslint-config-prettier'] +} diff --git a/examples/boops-javascript/.gitignore b/examples/boops-javascript/.gitignore new file mode 100644 index 0000000..42bd71b --- /dev/null +++ b/examples/boops-javascript/.gitignore @@ -0,0 +1,5 @@ +node_modules +dist +out +.DS_Store +*.log* diff --git a/examples/boops-javascript/.npmrc b/examples/boops-javascript/.npmrc new file mode 100644 index 0000000..bf2e764 --- /dev/null +++ b/examples/boops-javascript/.npmrc @@ -0,0 +1 @@ +shamefully-hoist=true diff --git a/examples/boops-javascript/.prettierignore b/examples/boops-javascript/.prettierignore new file mode 100644 index 0000000..9c6b791 --- /dev/null +++ b/examples/boops-javascript/.prettierignore @@ -0,0 +1,6 @@ +out +dist +pnpm-lock.yaml +LICENSE.md +tsconfig.json +tsconfig.*.json diff --git a/examples/boops-javascript/.prettierrc.yaml b/examples/boops-javascript/.prettierrc.yaml new file mode 100644 index 0000000..35893b3 --- /dev/null +++ b/examples/boops-javascript/.prettierrc.yaml @@ -0,0 +1,4 @@ +singleQuote: true +semi: false +printWidth: 100 +trailingComma: none diff --git a/examples/boops-javascript/README.md b/examples/boops-javascript/README.md new file mode 100644 index 0000000..da3d670 --- /dev/null +++ b/examples/boops-javascript/README.md @@ -0,0 +1,34 @@ +# boops-javascript + +A minimal Electron application using discord-rpc with JavaScript + +## Recommended IDE Setup + +- [VSCode](https://code.visualstudio.com/) + [ESLint](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint) + [Prettier](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode) + +## Project Setup + +### Install + +```bash +$ pnpm install +``` + +### Development + +```bash +$ pnpm dev +``` + +### Build + +```bash +# For windows +$ pnpm build:win + +# For macOS +$ pnpm build:mac + +# For Linux +$ pnpm build:linux +``` diff --git a/examples/boops-javascript/electron-builder.yml b/examples/boops-javascript/electron-builder.yml new file mode 100644 index 0000000..35f10ee --- /dev/null +++ b/examples/boops-javascript/electron-builder.yml @@ -0,0 +1,42 @@ +appId: com.electron.app +productName: boops-javascript +directories: + buildResources: build +files: + - '!**/.vscode/*' + - '!src/*' + - '!electron.vite.config.{js,ts,mjs,cjs}' + - '!{.eslintignore,.eslintrc.cjs,.prettierignore,.prettierrc.yaml,dev-app-update.yml,CHANGELOG.md,README.md}' + - '!{.env,.env.*,.npmrc,pnpm-lock.yaml}' +asarUnpack: + - resources/** +win: + executableName: boops-javascript +nsis: + artifactName: ${name}-${version}-setup.${ext} + shortcutName: ${productName} + uninstallDisplayName: ${productName} + createDesktopShortcut: always +mac: + entitlementsInherit: build/entitlements.mac.plist + extendInfo: + - NSCameraUsageDescription: Application requests access to the device's camera. + - NSMicrophoneUsageDescription: Application requests access to the device's microphone. + - NSDocumentsFolderUsageDescription: Application requests access to the user's Documents folder. + - NSDownloadsFolderUsageDescription: Application requests access to the user's Downloads folder. + notarize: false +dmg: + artifactName: ${name}-${version}.${ext} +linux: + target: + - AppImage + - snap + - deb + maintainer: electronjs.org + category: Utility +appImage: + artifactName: ${name}-${version}.${ext} +npmRebuild: false +publish: + provider: generic + url: https://example.com/auto-updates diff --git a/examples/boops-javascript/electron.vite.config.mjs b/examples/boops-javascript/electron.vite.config.mjs new file mode 100644 index 0000000..3acc2e8 --- /dev/null +++ b/examples/boops-javascript/electron.vite.config.mjs @@ -0,0 +1,11 @@ +import { defineConfig, externalizeDepsPlugin } from 'electron-vite' + +export default defineConfig({ + main: { + plugins: [externalizeDepsPlugin()] + }, + preload: { + plugins: [externalizeDepsPlugin()] + }, + renderer: {} +}) diff --git a/examples/boops-javascript/package.json b/examples/boops-javascript/package.json new file mode 100644 index 0000000..ac31287 --- /dev/null +++ b/examples/boops-javascript/package.json @@ -0,0 +1,32 @@ +{ + "name": "boops-javascript", + "version": "1.0.0", + "description": "A minimal Electron application using discord-rpc with JavaScript", + "main": "./out/main/index.js", + "scripts": { + "format": "prettier --write .", + "lint": "eslint . --ext .js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix", + "start": "electron-vite preview", + "dev": "electron-vite dev", + "build": "electron-vite build", + "postinstall": "electron-builder install-app-deps", + "build:unpack": "npm run build && electron-builder --dir", + "build:win": "npm run build && electron-builder --win", + "build:mac": "npm run build && electron-builder --mac", + "build:linux": "npm run build && electron-builder --linux" + }, + "dependencies": { + "@electron-toolkit/preload": "^3.0.1", + "@electron-toolkit/utils": "^3.0.0" + }, + "devDependencies": { + "@electron-toolkit/eslint-config": "^1.0.2", + "@electron-toolkit/eslint-config-prettier": "^2.0.0", + "electron": "^31.0.2", + "electron-builder": "^24.13.3", + "electron-vite": "^2.3.0", + "eslint": "^8.57.0", + "prettier": "^3.3.2", + "vite": "^5.3.1" + } +} diff --git a/examples/boops-javascript/pnpm-lock.yaml b/examples/boops-javascript/pnpm-lock.yaml new file mode 100644 index 0000000..a1706c3 --- /dev/null +++ b/examples/boops-javascript/pnpm-lock.yaml @@ -0,0 +1,3652 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@electron-toolkit/preload': + specifier: ^3.0.1 + version: 3.0.1(electron@31.7.7) + '@electron-toolkit/utils': + specifier: ^3.0.0 + version: 3.0.0(electron@31.7.7) + devDependencies: + '@electron-toolkit/eslint-config': + specifier: ^1.0.2 + version: 1.0.2(eslint@8.57.1) + '@electron-toolkit/eslint-config-prettier': + specifier: ^2.0.0 + version: 2.0.0(eslint@8.57.1)(prettier@3.5.0) + electron: + specifier: ^31.0.2 + version: 31.7.7 + electron-builder: + specifier: ^24.13.3 + version: 24.13.3(electron-builder-squirrel-windows@24.13.3) + electron-vite: + specifier: ^2.3.0 + version: 2.3.0(vite@5.4.14(@types/node@22.13.1)) + eslint: + specifier: ^8.57.0 + version: 8.57.1 + prettier: + specifier: ^3.3.2 + version: 3.5.0 + vite: + specifier: ^5.3.1 + version: 5.4.14(@types/node@22.13.1) + +packages: + + 7zip-bin@5.2.0: + resolution: {integrity: sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==} + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.26.8': + resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.26.8': + resolution: {integrity: sha512-l+lkXCHS6tQEc5oUpK28xBOZ6+HwaH7YwoYQbLFiYb4nS2/l1tKnZEtEWkD0GuiYdvArf9qBS0XlQGXzPMsNqQ==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.26.8': + resolution: {integrity: sha512-ef383X5++iZHWAXX0SXQR6ZyQhw/0KtTkrTz61WXRhFM6dhpHulO/RJz79L8S6ugZHJkOOkUrUdxgdF2YiPFnA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.26.5': + resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.25.9': + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.26.0': + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.26.5': + resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.25.9': + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.26.7': + resolution: {integrity: sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.26.8': + resolution: {integrity: sha512-TZIQ25pkSoaKEYYaHbbxkfL36GNsQ6iFiBbeuzAkLnXayKR1yP1zFe+NxuZWWsUyvt8icPU9CCq0sgWGXR1GEw==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-transform-arrow-functions@7.25.9': + resolution: {integrity: sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/template@7.26.8': + resolution: {integrity: sha512-iNKaX3ZebKIsCvJ+0jd6embf+Aulaa3vNBqZ41kM7iTWjx5qzWKXGHiJUW3+nTpQ18SG11hdF8OAzKrpXkb96Q==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.26.8': + resolution: {integrity: sha512-nic9tRkjYH0oB2dzr/JoGIm+4Q6SuYeLEiIiZDwBscRMYFJ+tMAz98fuel9ZnbXViA2I0HVSSRRK8DW5fjXStA==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.26.8': + resolution: {integrity: sha512-eUuWapzEGWFEpHFxgEaBG8e3n6S8L3MSu0oda755rOfabWPnh0Our1AozNFVUxGFIhbKgd1ksprsoDGMinTOTA==} + engines: {node: '>=6.9.0'} + + '@develar/schema-utils@2.6.5': + resolution: {integrity: sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==} + engines: {node: '>= 8.9.0'} + + '@electron-toolkit/eslint-config-prettier@2.0.0': + resolution: {integrity: sha512-L+uG1FvJcAZkPZpSi6B1pmdpyJFyOxWDTjr1Vs47vSryxv/EX1Ch6o4HVsachlDq3fMEkDgojuP2F3ZvVZMoLw==} + peerDependencies: + eslint: '>= 8.0.0' + prettier: '>= 3.0.0' + + '@electron-toolkit/eslint-config@1.0.2': + resolution: {integrity: sha512-GJVuMsxBHfVARfmUoSTCHT0e/QfWlVbXcGk3tgoku0ad6tLjydbv2LpvKi02+Sy2WiEz9L9SkGSw090ukT/F0A==} + peerDependencies: + eslint: '>= 8.0.0' + + '@electron-toolkit/preload@3.0.1': + resolution: {integrity: sha512-EzoQmpK8jqqU8YnM5jRe0GJjGVJPke2KtANqz8QtN2JPT96ViOvProBdK5C6riCm0j1T8jjAGVQCZLQy9OVoIA==} + peerDependencies: + electron: '>=13.0.0' + + '@electron-toolkit/utils@3.0.0': + resolution: {integrity: sha512-GaXHDhiT7KCvMJjXdp/QqpYinq69T/Pdl49Z1XLf8mKGf63dnsODMWyrmIjEQ0z/vG7dO8qF3fvmI6Eb2lUNZA==} + peerDependencies: + electron: '>=13.0.0' + + '@electron/asar@3.2.18': + resolution: {integrity: sha512-2XyvMe3N3Nrs8cV39IKELRHTYUWFKrmqqSY1U+GMlc0jvqjIVnoxhNd2H4JolWQncbJi1DCvb5TNxZuI2fEjWg==} + engines: {node: '>=10.12.0'} + hasBin: true + + '@electron/get@2.0.3': + resolution: {integrity: sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==} + engines: {node: '>=12'} + + '@electron/notarize@2.2.1': + resolution: {integrity: sha512-aL+bFMIkpR0cmmj5Zgy0LMKEpgy43/hw5zadEArgmAMWWlKc5buwFvFT9G/o/YJkvXAJm5q3iuTuLaiaXW39sg==} + engines: {node: '>= 10.0.0'} + + '@electron/osx-sign@1.0.5': + resolution: {integrity: sha512-k9ZzUQtamSoweGQDV2jILiRIHUu7lYlJ3c6IEmjv1hC17rclE+eb9U+f6UFlOOETo0JzY1HNlXy4YOlCvl+Lww==} + engines: {node: '>=12.0.0'} + hasBin: true + + '@electron/universal@1.5.1': + resolution: {integrity: sha512-kbgXxyEauPJiQQUNG2VgUeyfQNFk6hBF11ISN2PNI6agUgPl55pv4eQmaqHzTAzchBvqZ2tQuRVaPStGf0mxGw==} + engines: {node: '>=8.6'} + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.4.1': + resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.57.1': + resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@humanwhocodes/config-array@0.13.0': + resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@malept/cross-spawn-promise@1.1.1': + resolution: {integrity: sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==} + engines: {node: '>= 10'} + + '@malept/flatpak-bundler@0.4.0': + resolution: {integrity: sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==} + engines: {node: '>= 10.0.0'} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@pkgr/core@0.1.1': + resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + + '@rollup/rollup-android-arm-eabi@4.34.6': + resolution: {integrity: sha512-+GcCXtOQoWuC7hhX1P00LqjjIiS/iOouHXhMdiDSnq/1DGTox4SpUvO52Xm+div6+106r+TcvOeo/cxvyEyTgg==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.34.6': + resolution: {integrity: sha512-E8+2qCIjciYUnCa1AiVF1BkRgqIGW9KzJeesQqVfyRITGQN+dFuoivO0hnro1DjT74wXLRZ7QF8MIbz+luGaJA==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.34.6': + resolution: {integrity: sha512-z9Ib+OzqN3DZEjX7PDQMHEhtF+t6Mi2z/ueChQPLS/qUMKY7Ybn5A2ggFoKRNRh1q1T03YTQfBTQCJZiepESAg==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.34.6': + resolution: {integrity: sha512-PShKVY4u0FDAR7jskyFIYVyHEPCPnIQY8s5OcXkdU8mz3Y7eXDJPdyM/ZWjkYdR2m0izD9HHWA8sGcXn+Qrsyg==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.34.6': + resolution: {integrity: sha512-YSwyOqlDAdKqs0iKuqvRHLN4SrD2TiswfoLfvYXseKbL47ht1grQpq46MSiQAx6rQEN8o8URtpXARCpqabqxGQ==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.34.6': + resolution: {integrity: sha512-HEP4CgPAY1RxXwwL5sPFv6BBM3tVeLnshF03HMhJYCNc6kvSqBgTMmsEjb72RkZBAWIqiPUyF1JpEBv5XT9wKQ==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.34.6': + resolution: {integrity: sha512-88fSzjC5xeH9S2Vg3rPgXJULkHcLYMkh8faix8DX4h4TIAL65ekwuQMA/g2CXq8W+NJC43V6fUpYZNjaX3+IIg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.34.6': + resolution: {integrity: sha512-wM4ztnutBqYFyvNeR7Av+reWI/enK9tDOTKNF+6Kk2Q96k9bwhDDOlnCUNRPvromlVXo04riSliMBs/Z7RteEg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.34.6': + resolution: {integrity: sha512-9RyprECbRa9zEjXLtvvshhw4CMrRa3K+0wcp3KME0zmBe1ILmvcVHnypZ/aIDXpRyfhSYSuN4EPdCCj5Du8FIA==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.34.6': + resolution: {integrity: sha512-qTmklhCTyaJSB05S+iSovfo++EwnIEZxHkzv5dep4qoszUMX5Ca4WM4zAVUMbfdviLgCSQOu5oU8YoGk1s6M9Q==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loongarch64-gnu@4.34.6': + resolution: {integrity: sha512-4Qmkaps9yqmpjY5pvpkfOerYgKNUGzQpFxV6rnS7c/JfYbDSU0y6WpbbredB5cCpLFGJEqYX40WUmxMkwhWCjw==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.34.6': + resolution: {integrity: sha512-Zsrtux3PuaxuBTX/zHdLaFmcofWGzaWW1scwLU3ZbW/X+hSsFbz9wDIp6XvnT7pzYRl9MezWqEqKy7ssmDEnuQ==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.34.6': + resolution: {integrity: sha512-aK+Zp+CRM55iPrlyKiU3/zyhgzWBxLVrw2mwiQSYJRobCURb781+XstzvA8Gkjg/hbdQFuDw44aUOxVQFycrAg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.34.6': + resolution: {integrity: sha512-WoKLVrY9ogmaYPXwTH326+ErlCIgMmsoRSx6bO+l68YgJnlOXhygDYSZe/qbUJCSiCiZAQ+tKm88NcWuUXqOzw==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.34.6': + resolution: {integrity: sha512-Sht4aFvmA4ToHd2vFzwMFaQCiYm2lDFho5rPcvPBT5pCdC+GwHG6CMch4GQfmWTQ1SwRKS0dhDYb54khSrjDWw==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.34.6': + resolution: {integrity: sha512-zmmpOQh8vXc2QITsnCiODCDGXFC8LMi64+/oPpPx5qz3pqv0s6x46ps4xoycfUiVZps5PFn1gksZzo4RGTKT+A==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.34.6': + resolution: {integrity: sha512-3/q1qUsO/tLqGBaD4uXsB6coVGB3usxw3qyeVb59aArCgedSF66MPdgRStUd7vbZOsko/CgVaY5fo2vkvPLWiA==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.34.6': + resolution: {integrity: sha512-oLHxuyywc6efdKVTxvc0135zPrRdtYVjtVD5GUm55I3ODxhU/PwkQFD97z16Xzxa1Fz0AEe4W/2hzRtd+IfpOA==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.34.6': + resolution: {integrity: sha512-0PVwmgzZ8+TZ9oGBmdZoQVXflbvuwzN/HRclujpl4N/q3i+y0lqLw8n1bXA8ru3sApDjlmONaNAuYr38y1Kr9w==} + cpu: [x64] + os: [win32] + + '@sindresorhus/is@4.6.0': + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + + '@szmarczak/http-timer@4.0.6': + resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} + engines: {node: '>=10'} + + '@tootallnate/once@2.0.0': + resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} + engines: {node: '>= 10'} + + '@types/cacheable-request@6.0.3': + resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + + '@types/fs-extra@9.0.13': + resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} + + '@types/gensync@1.0.4': + resolution: {integrity: sha512-C3YYeRQWp2fmq9OryX+FoDy8nXS6scQ7dPptD8LnFDAUNcKWJjXQKDNJD3HVm+kOUsXhTOkpi69vI4EuAr95bA==} + + '@types/http-cache-semantics@4.0.4': + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + + '@types/keyv@3.1.4': + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/node@20.17.17': + resolution: {integrity: sha512-/WndGO4kIfMicEQLTi/mDANUu/iVUhT7KboZPdEqqHQ4aTS+3qT3U5gIqWDFV+XouorjfgGqvKILJeHhuQgFYg==} + + '@types/node@22.13.1': + resolution: {integrity: sha512-jK8uzQlrvXqEU91UxiK5J7pKHyzgnI1Qnl0QDHIgVGuolJhRb9EEl28Cj9b3rGR8B2lhFCtvIm5os8lFnO/1Ew==} + + '@types/plist@3.0.5': + resolution: {integrity: sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==} + + '@types/responselike@1.0.3': + resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} + + '@types/verror@1.10.10': + resolution: {integrity: sha512-l4MM0Jppn18hb9xmM6wwD1uTdShpf9Pn80aXTStnK1C94gtPvJcV2FrDmbOQUAQfJ1cKZHktkQUDwEqaAKXMMg==} + + '@types/yauzl@2.10.3': + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + '@xmldom/xmldom@0.8.10': + resolution: {integrity: sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==} + engines: {node: '>=10.0.0'} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + + ajv-keywords@3.5.2: + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + app-builder-bin@4.0.0: + resolution: {integrity: sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA==} + + app-builder-lib@24.13.3: + resolution: {integrity: sha512-FAzX6IBit2POXYGnTCT8YHFO/lr5AapAII6zzhQO3Rw4cEDOgK+t1xhLc5tNcKlicTHlo9zxIwnYCX9X2DLkig==} + engines: {node: '>=14.0.0'} + peerDependencies: + dmg-builder: 24.13.3 + electron-builder-squirrel-windows: 24.13.3 + + archiver-utils@2.1.0: + resolution: {integrity: sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==} + engines: {node: '>= 6'} + + archiver-utils@3.0.4: + resolution: {integrity: sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==} + engines: {node: '>= 10'} + + archiver@5.3.2: + resolution: {integrity: sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==} + engines: {node: '>= 10'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + assert-plus@1.0.0: + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} + engines: {node: '>=0.8'} + + astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + + async-exit-hook@2.0.1: + resolution: {integrity: sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==} + engines: {node: '>=0.12.0'} + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + bluebird-lst@1.0.9: + resolution: {integrity: sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==} + + bluebird@3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + + boolean@3.2.0: + resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + browserslist@4.24.4: + resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + + buffer-equal@1.0.1: + resolution: {integrity: sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==} + engines: {node: '>=0.4'} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + builder-util-runtime@9.2.4: + resolution: {integrity: sha512-upp+biKpN/XZMLim7aguUyW8s0FUpDvOtK6sbanMFDAMBzpHDqdhgVYm6zc9HJ6nWo7u2Lxk60i2M6Jd3aiNrA==} + engines: {node: '>=12.0.0'} + + builder-util@24.13.1: + resolution: {integrity: sha512-NhbCSIntruNDTOVI9fdXz0dihaqX2YuE1D6zZMrwiErzH4ELZHE6mdiB40wEgZNprDia+FghRFgKoAqMZRRjSA==} + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + cacheable-lookup@5.0.4: + resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} + engines: {node: '>=10.6.0'} + + cacheable-request@7.0.4: + resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} + engines: {node: '>=8'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + caniuse-lite@1.0.30001699: + resolution: {integrity: sha512-b+uH5BakXZ9Do9iK+CkDmctUSEqZl+SP056vc5usa0PL+ev5OHw003rZXcnjNDv3L8P5j6rwT6C0BPKSikW08w==} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + + chromium-pickle-js@0.2.0: + resolution: {integrity: sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + cli-truncate@2.1.0: + resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} + engines: {node: '>=8'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone-response@1.0.3: + resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@5.1.0: + resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} + engines: {node: '>= 6'} + + compare-version@0.1.2: + resolution: {integrity: sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==} + engines: {node: '>=0.10.0'} + + compress-commons@4.1.2: + resolution: {integrity: sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==} + engines: {node: '>= 10'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + config-file-ts@0.2.6: + resolution: {integrity: sha512-6boGVaglwblBgJqGyxm4+xCmEGcWgnWHSWHY5jad58awQhB6gftq0G8HbzU39YqCIYHMLAiL1yjwiZ36m/CL8w==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + core-util-is@1.0.2: + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + crc32-stream@4.0.3: + resolution: {integrity: sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==} + engines: {node: '>= 10'} + + crc@3.8.0: + resolution: {integrity: sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + detect-node@2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + + dir-compare@3.3.0: + resolution: {integrity: sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg==} + + dmg-builder@24.13.3: + resolution: {integrity: sha512-rcJUkMfnJpfCboZoOOPf4L29TRtEieHNOeAbYPWPxlaBw/Z1RKrRA86dOI9rwaI4tQSc/RD82zTNHprfUHXsoQ==} + + dmg-license@1.0.11: + resolution: {integrity: sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==} + engines: {node: '>=8'} + os: [darwin] + hasBin: true + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dotenv-expand@5.1.0: + resolution: {integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==} + + dotenv@9.0.2: + resolution: {integrity: sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==} + engines: {node: '>=10'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} + hasBin: true + + electron-builder-squirrel-windows@24.13.3: + resolution: {integrity: sha512-oHkV0iogWfyK+ah9ZIvMDpei1m9ZRpdXcvde1wTpra2U8AFDNNpqJdnin5z+PM1GbQ5BoaKCWas2HSjtR0HwMg==} + + electron-builder@24.13.3: + resolution: {integrity: sha512-yZSgVHft5dNVlo31qmJAe4BVKQfFdwpRw7sFp1iQglDRCDD6r22zfRJuZlhtB5gp9FHUxCMEoWGq10SkCnMAIg==} + engines: {node: '>=14.0.0'} + hasBin: true + + electron-publish@24.13.1: + resolution: {integrity: sha512-2ZgdEqJ8e9D17Hwp5LEq5mLQPjqU3lv/IALvgp+4W8VeNhryfGhYEQC/PgDPMrnWUp+l60Ou5SJLsu+k4mhQ8A==} + + electron-to-chromium@1.5.96: + resolution: {integrity: sha512-8AJUW6dh75Fm/ny8+kZKJzI1pgoE8bKLZlzDU2W1ENd+DXKJrx7I7l9hb8UWR4ojlnb5OlixMt00QWiYJoVw1w==} + + electron-vite@2.3.0: + resolution: {integrity: sha512-lsN2FymgJlp4k6MrcsphGqZQ9fKRdJKasoaiwIrAewN1tapYI/KINLdfEL7n10LuF0pPSNf/IqjzZbB5VINctg==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@swc/core': ^1.0.0 + vite: ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + '@swc/core': + optional: true + + electron@31.7.7: + resolution: {integrity: sha512-HZtZg8EHsDGnswFt0QeV8If8B+et63uD6RJ7I4/xhcXqmTIbI08GoubX/wm+HdY0DwcuPe1/xsgqpmYvjdjRoA==} + engines: {node: '>= 12.20.55'} + hasBin: true + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + err-code@2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es6-error@4.1.1: + resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-config-prettier@9.1.0: + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-plugin-prettier@5.2.3: + resolution: {integrity: sha512-qJ+y0FfCp/mQYQ/vWQ3s7eUlFEL4PyKfAJxsnYTJ4YT73nsJBWqmEpFryxV9OeUiqmsTsYJ5Y+KDNaeP31wrRw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '*' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint@8.57.1: + resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + hasBin: true + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + extract-zip@2.0.1: + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} + hasBin: true + + extsprintf@1.4.1: + resolution: {integrity: sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==} + engines: {'0': node >=0.6.0} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fastq@1.19.0: + resolution: {integrity: sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==} + + fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flatted@3.3.2: + resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} + + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + engines: {node: '>=14'} + + form-data@4.0.1: + resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} + engines: {node: '>= 6'} + + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + + fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + global-agent@3.0.0: + resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==} + engines: {node: '>=10.0'} + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + got@11.8.6: + resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} + engines: {node: '>=10.19.0'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + + http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + + http-proxy-agent@5.0.0: + resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} + engines: {node: '>= 6'} + + http2-wrapper@1.0.3: + resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} + engines: {node: '>=10.19.0'} + + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + + iconv-corefoundation@1.1.7: + resolution: {integrity: sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==} + engines: {node: ^8.11.2 || >=10} + os: [darwin] + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + is-ci@3.0.1: + resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} + hasBin: true + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isbinaryfile@4.0.10: + resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} + engines: {node: '>= 8.0.0'} + + isbinaryfile@5.0.4: + resolution: {integrity: sha512-YKBKVkKhty7s8rxddb40oOkuP0NbaeXrQvLin6QMHL7Ypiy2RW9LwOVrVgZRyOrhQlayMd9t+D8yDy8MKFTSDQ==} + engines: {node: '>= 18.0.0'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jake@10.9.2: + resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} + engines: {node: '>=10'} + hasBin: true + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + lazy-val@1.0.5: + resolution: {integrity: sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==} + + lazystream@1.0.1: + resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} + engines: {node: '>= 0.6.3'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.defaults@4.2.0: + resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} + + lodash.difference@4.5.0: + resolution: {integrity: sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==} + + lodash.flatten@4.4.0: + resolution: {integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.union@4.6.0: + resolution: {integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + lowercase-keys@2.0.0: + resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} + engines: {node: '>=8'} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + + matcher@3.0.0: + resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} + engines: {node: '>=10'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@2.6.0: + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} + hasBin: true + + mimic-response@1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: '>=4'} + + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@3.3.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + node-addon-api@1.7.2: + resolution: {integrity: sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==} + + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-url@6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + p-cancelable@2.1.1: + resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} + engines: {node: '>=8'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + plist@3.1.0: + resolution: {integrity: sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==} + engines: {node: '>=10.4.0'} + + postcss@8.5.1: + resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + + prettier@3.5.0: + resolution: {integrity: sha512-quyMrVt6svPS7CjQ9gKb3GLEX/rl3BCL2oa/QkNcXv4YNVBC9olt3s+H7ukto06q7B1Qz46PbrKLO34PR6vXcA==} + engines: {node: '>=14'} + hasBin: true + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + + promise-retry@2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} + + pump@3.0.2: + resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + + read-config-file@6.3.2: + resolution: {integrity: sha512-M80lpCjnE6Wt6zb98DoW8WHR09nzMSpu8XHtPkiTHrJ5Az9CybfeQhTJ8D7saeBHpGhLPIVyA8lcL6ZmdKwY6Q==} + engines: {node: '>=12.0.0'} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdir-glob@1.1.3: + resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + responselike@2.0.1: + resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + + retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + roarr@2.15.4: + resolution: {integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==} + engines: {node: '>=8.0'} + + rollup@4.34.6: + resolution: {integrity: sha512-wc2cBWqJgkU3Iz5oztRkQbfVkbxoz5EhnCGOrnJvnLnQ7O0WhQUYyv18qQI79O8L7DdHrrlJNeCHd4VGpnaXKQ==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sanitize-filename@1.6.3: + resolution: {integrity: sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==} + + sax@1.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + + semver-compare@1.0.0: + resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + engines: {node: '>=10'} + hasBin: true + + serialize-error@7.0.1: + resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} + engines: {node: '>=10'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-update-notifier@2.0.0: + resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} + engines: {node: '>=10'} + + slice-ansi@3.0.0: + resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} + engines: {node: '>=8'} + + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + + stat-mode@1.0.0: + resolution: {integrity: sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==} + engines: {node: '>= 6'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + sumchecker@3.0.1: + resolution: {integrity: sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==} + engines: {node: '>= 8.0'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + synckit@0.9.2: + resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==} + engines: {node: ^14.18.0 || >=16.0.0} + + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + + tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + + temp-file@3.4.0: + resolution: {integrity: sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + tmp-promise@3.0.3: + resolution: {integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==} + + tmp@0.2.3: + resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} + engines: {node: '>=14.14'} + + truncate-utf8-bytes@1.0.2: + resolution: {integrity: sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-fest@0.13.1: + resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} + engines: {node: '>=10'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + typescript@5.7.3: + resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + + undici-types@6.20.0: + resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + update-browserslist-db@1.1.2: + resolution: {integrity: sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + utf8-byte-length@1.0.5: + resolution: {integrity: sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + verror@1.10.1: + resolution: {integrity: sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==} + engines: {node: '>=0.6.0'} + + vite@5.4.14: + resolution: {integrity: sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + xmlbuilder@15.1.1: + resolution: {integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==} + engines: {node: '>=8.0'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + zip-stream@4.1.1: + resolution: {integrity: sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==} + engines: {node: '>= 10'} + +snapshots: + + 7zip-bin@5.2.0: {} + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + + '@babel/code-frame@7.26.2': + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.26.8': {} + + '@babel/core@7.26.8': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.8 + '@babel/helper-compilation-targets': 7.26.5 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.8) + '@babel/helpers': 7.26.7 + '@babel/parser': 7.26.8 + '@babel/template': 7.26.8 + '@babel/traverse': 7.26.8 + '@babel/types': 7.26.8 + '@types/gensync': 1.0.4 + convert-source-map: 2.0.0 + debug: 4.4.0 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.26.8': + dependencies: + '@babel/parser': 7.26.8 + '@babel/types': 7.26.8 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.26.5': + dependencies: + '@babel/compat-data': 7.26.8 + '@babel/helper-validator-option': 7.25.9 + browserslist: 4.24.4 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-module-imports@7.25.9': + dependencies: + '@babel/traverse': 7.26.8 + '@babel/types': 7.26.8 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.8)': + dependencies: + '@babel/core': 7.26.8 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.26.8 + transitivePeerDependencies: + - supports-color + + '@babel/helper-plugin-utils@7.26.5': {} + + '@babel/helper-string-parser@7.25.9': {} + + '@babel/helper-validator-identifier@7.25.9': {} + + '@babel/helper-validator-option@7.25.9': {} + + '@babel/helpers@7.26.7': + dependencies: + '@babel/template': 7.26.8 + '@babel/types': 7.26.8 + + '@babel/parser@7.26.8': + dependencies: + '@babel/types': 7.26.8 + + '@babel/plugin-transform-arrow-functions@7.25.9(@babel/core@7.26.8)': + dependencies: + '@babel/core': 7.26.8 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/template@7.26.8': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.26.8 + '@babel/types': 7.26.8 + + '@babel/traverse@7.26.8': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.8 + '@babel/parser': 7.26.8 + '@babel/template': 7.26.8 + '@babel/types': 7.26.8 + debug: 4.4.0 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.26.8': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + + '@develar/schema-utils@2.6.5': + dependencies: + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + + '@electron-toolkit/eslint-config-prettier@2.0.0(eslint@8.57.1)(prettier@3.5.0)': + dependencies: + eslint: 8.57.1 + eslint-config-prettier: 9.1.0(eslint@8.57.1) + eslint-plugin-prettier: 5.2.3(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.5.0) + prettier: 3.5.0 + transitivePeerDependencies: + - '@types/eslint' + + '@electron-toolkit/eslint-config@1.0.2(eslint@8.57.1)': + dependencies: + eslint: 8.57.1 + + '@electron-toolkit/preload@3.0.1(electron@31.7.7)': + dependencies: + electron: 31.7.7 + + '@electron-toolkit/utils@3.0.0(electron@31.7.7)': + dependencies: + electron: 31.7.7 + + '@electron/asar@3.2.18': + dependencies: + commander: 5.1.0 + glob: 7.2.3 + minimatch: 3.1.2 + + '@electron/get@2.0.3': + dependencies: + debug: 4.4.0 + env-paths: 2.2.1 + fs-extra: 8.1.0 + got: 11.8.6 + progress: 2.0.3 + semver: 6.3.1 + sumchecker: 3.0.1 + optionalDependencies: + global-agent: 3.0.0 + transitivePeerDependencies: + - supports-color + + '@electron/notarize@2.2.1': + dependencies: + debug: 4.4.0 + fs-extra: 9.1.0 + promise-retry: 2.0.1 + transitivePeerDependencies: + - supports-color + + '@electron/osx-sign@1.0.5': + dependencies: + compare-version: 0.1.2 + debug: 4.4.0 + fs-extra: 10.1.0 + isbinaryfile: 4.0.10 + minimist: 1.2.8 + plist: 3.1.0 + transitivePeerDependencies: + - supports-color + + '@electron/universal@1.5.1': + dependencies: + '@electron/asar': 3.2.18 + '@malept/cross-spawn-promise': 1.1.1 + debug: 4.4.0 + dir-compare: 3.3.0 + fs-extra: 9.1.0 + minimatch: 3.1.2 + plist: 3.1.0 + transitivePeerDependencies: + - supports-color + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@eslint-community/eslint-utils@4.4.1(eslint@8.57.1)': + dependencies: + eslint: 8.57.1 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.1': {} + + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.12.6 + debug: 4.4.0 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@8.57.1': {} + + '@humanwhocodes/config-array@0.13.0': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.4.0 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@jridgewell/gen-mapping@0.3.8': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@malept/cross-spawn-promise@1.1.1': + dependencies: + cross-spawn: 7.0.6 + + '@malept/flatpak-bundler@0.4.0': + dependencies: + debug: 4.4.0 + fs-extra: 9.1.0 + lodash: 4.17.21 + tmp-promise: 3.0.3 + transitivePeerDependencies: + - supports-color + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.0 + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@pkgr/core@0.1.1': {} + + '@rollup/rollup-android-arm-eabi@4.34.6': + optional: true + + '@rollup/rollup-android-arm64@4.34.6': + optional: true + + '@rollup/rollup-darwin-arm64@4.34.6': + optional: true + + '@rollup/rollup-darwin-x64@4.34.6': + optional: true + + '@rollup/rollup-freebsd-arm64@4.34.6': + optional: true + + '@rollup/rollup-freebsd-x64@4.34.6': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.34.6': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.34.6': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.34.6': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.34.6': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.34.6': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.34.6': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.34.6': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.34.6': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.34.6': + optional: true + + '@rollup/rollup-linux-x64-musl@4.34.6': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.34.6': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.34.6': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.34.6': + optional: true + + '@sindresorhus/is@4.6.0': {} + + '@szmarczak/http-timer@4.0.6': + dependencies: + defer-to-connect: 2.0.1 + + '@tootallnate/once@2.0.0': {} + + '@types/cacheable-request@6.0.3': + dependencies: + '@types/http-cache-semantics': 4.0.4 + '@types/keyv': 3.1.4 + '@types/node': 20.17.17 + '@types/responselike': 1.0.3 + + '@types/debug@4.1.12': + dependencies: + '@types/ms': 2.1.0 + + '@types/estree@1.0.6': {} + + '@types/fs-extra@9.0.13': + dependencies: + '@types/node': 22.13.1 + + '@types/gensync@1.0.4': {} + + '@types/http-cache-semantics@4.0.4': {} + + '@types/keyv@3.1.4': + dependencies: + '@types/node': 20.17.17 + + '@types/ms@2.1.0': {} + + '@types/node@20.17.17': + dependencies: + undici-types: 6.19.8 + + '@types/node@22.13.1': + dependencies: + undici-types: 6.20.0 + + '@types/plist@3.0.5': + dependencies: + '@types/node': 22.13.1 + xmlbuilder: 15.1.1 + optional: true + + '@types/responselike@1.0.3': + dependencies: + '@types/node': 20.17.17 + + '@types/verror@1.10.10': + optional: true + + '@types/yauzl@2.10.3': + dependencies: + '@types/node': 20.17.17 + optional: true + + '@ungap/structured-clone@1.3.0': {} + + '@xmldom/xmldom@0.8.10': {} + + acorn-jsx@5.3.2(acorn@8.14.0): + dependencies: + acorn: 8.14.0 + + acorn@8.14.0: {} + + agent-base@6.0.2: + dependencies: + debug: 4.4.0 + transitivePeerDependencies: + - supports-color + + ajv-keywords@3.5.2(ajv@6.12.6): + dependencies: + ajv: 6.12.6 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-regex@5.0.1: {} + + ansi-regex@6.1.0: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} + + app-builder-bin@4.0.0: {} + + app-builder-lib@24.13.3(dmg-builder@24.13.3)(electron-builder-squirrel-windows@24.13.3): + dependencies: + '@develar/schema-utils': 2.6.5 + '@electron/notarize': 2.2.1 + '@electron/osx-sign': 1.0.5 + '@electron/universal': 1.5.1 + '@malept/flatpak-bundler': 0.4.0 + '@types/fs-extra': 9.0.13 + async-exit-hook: 2.0.1 + bluebird-lst: 1.0.9 + builder-util: 24.13.1 + builder-util-runtime: 9.2.4 + chromium-pickle-js: 0.2.0 + debug: 4.4.0 + dmg-builder: 24.13.3(electron-builder-squirrel-windows@24.13.3) + ejs: 3.1.10 + electron-builder-squirrel-windows: 24.13.3(dmg-builder@24.13.3) + electron-publish: 24.13.1 + form-data: 4.0.1 + fs-extra: 10.1.0 + hosted-git-info: 4.1.0 + is-ci: 3.0.1 + isbinaryfile: 5.0.4 + js-yaml: 4.1.0 + lazy-val: 1.0.5 + minimatch: 5.1.6 + read-config-file: 6.3.2 + sanitize-filename: 1.6.3 + semver: 7.7.1 + tar: 6.2.1 + temp-file: 3.4.0 + transitivePeerDependencies: + - supports-color + + archiver-utils@2.1.0: + dependencies: + glob: 7.2.3 + graceful-fs: 4.2.11 + lazystream: 1.0.1 + lodash.defaults: 4.2.0 + lodash.difference: 4.5.0 + lodash.flatten: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.union: 4.6.0 + normalize-path: 3.0.0 + readable-stream: 2.3.8 + + archiver-utils@3.0.4: + dependencies: + glob: 7.2.3 + graceful-fs: 4.2.11 + lazystream: 1.0.1 + lodash.defaults: 4.2.0 + lodash.difference: 4.5.0 + lodash.flatten: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.union: 4.6.0 + normalize-path: 3.0.0 + readable-stream: 3.6.2 + + archiver@5.3.2: + dependencies: + archiver-utils: 2.1.0 + async: 3.2.6 + buffer-crc32: 0.2.13 + readable-stream: 3.6.2 + readdir-glob: 1.1.3 + tar-stream: 2.2.0 + zip-stream: 4.1.1 + + argparse@2.0.1: {} + + assert-plus@1.0.0: + optional: true + + astral-regex@2.0.0: + optional: true + + async-exit-hook@2.0.1: {} + + async@3.2.6: {} + + asynckit@0.4.0: {} + + at-least-node@1.0.0: {} + + balanced-match@1.0.2: {} + + base64-js@1.5.1: {} + + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + + bluebird-lst@1.0.9: + dependencies: + bluebird: 3.7.2 + + bluebird@3.7.2: {} + + boolean@3.2.0: + optional: true + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + browserslist@4.24.4: + dependencies: + caniuse-lite: 1.0.30001699 + electron-to-chromium: 1.5.96 + node-releases: 2.0.19 + update-browserslist-db: 1.1.2(browserslist@4.24.4) + + buffer-crc32@0.2.13: {} + + buffer-equal@1.0.1: {} + + buffer-from@1.1.2: {} + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + builder-util-runtime@9.2.4: + dependencies: + debug: 4.4.0 + sax: 1.4.1 + transitivePeerDependencies: + - supports-color + + builder-util@24.13.1: + dependencies: + 7zip-bin: 5.2.0 + '@types/debug': 4.1.12 + app-builder-bin: 4.0.0 + bluebird-lst: 1.0.9 + builder-util-runtime: 9.2.4 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.0 + fs-extra: 10.1.0 + http-proxy-agent: 5.0.0 + https-proxy-agent: 5.0.1 + is-ci: 3.0.1 + js-yaml: 4.1.0 + source-map-support: 0.5.21 + stat-mode: 1.0.0 + temp-file: 3.4.0 + transitivePeerDependencies: + - supports-color + + cac@6.7.14: {} + + cacheable-lookup@5.0.4: {} + + cacheable-request@7.0.4: + dependencies: + clone-response: 1.0.3 + get-stream: 5.2.0 + http-cache-semantics: 4.1.1 + keyv: 4.5.4 + lowercase-keys: 2.0.0 + normalize-url: 6.1.0 + responselike: 2.0.1 + + callsites@3.1.0: {} + + caniuse-lite@1.0.30001699: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chownr@2.0.0: {} + + chromium-pickle-js@0.2.0: {} + + ci-info@3.9.0: {} + + cli-truncate@2.1.0: + dependencies: + slice-ansi: 3.0.0 + string-width: 4.2.3 + optional: true + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clone-response@1.0.3: + dependencies: + mimic-response: 1.0.1 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@5.1.0: {} + + compare-version@0.1.2: {} + + compress-commons@4.1.2: + dependencies: + buffer-crc32: 0.2.13 + crc32-stream: 4.0.3 + normalize-path: 3.0.0 + readable-stream: 3.6.2 + + concat-map@0.0.1: {} + + config-file-ts@0.2.6: + dependencies: + glob: 10.4.5 + typescript: 5.7.3 + + convert-source-map@2.0.0: {} + + core-util-is@1.0.2: + optional: true + + core-util-is@1.0.3: {} + + crc-32@1.2.2: {} + + crc32-stream@4.0.3: + dependencies: + crc-32: 1.2.2 + readable-stream: 3.6.2 + + crc@3.8.0: + dependencies: + buffer: 5.7.1 + optional: true + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + debug@4.4.0: + dependencies: + ms: 2.1.3 + + decompress-response@6.0.0: + dependencies: + mimic-response: 3.1.0 + + deep-is@0.1.4: {} + + defer-to-connect@2.0.1: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + optional: true + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + optional: true + + delayed-stream@1.0.0: {} + + detect-node@2.1.0: + optional: true + + dir-compare@3.3.0: + dependencies: + buffer-equal: 1.0.1 + minimatch: 3.1.2 + + dmg-builder@24.13.3(electron-builder-squirrel-windows@24.13.3): + dependencies: + app-builder-lib: 24.13.3(dmg-builder@24.13.3)(electron-builder-squirrel-windows@24.13.3) + builder-util: 24.13.1 + builder-util-runtime: 9.2.4 + fs-extra: 10.1.0 + iconv-lite: 0.6.3 + js-yaml: 4.1.0 + optionalDependencies: + dmg-license: 1.0.11 + transitivePeerDependencies: + - electron-builder-squirrel-windows + - supports-color + + dmg-license@1.0.11: + dependencies: + '@types/plist': 3.0.5 + '@types/verror': 1.10.10 + ajv: 6.12.6 + crc: 3.8.0 + iconv-corefoundation: 1.1.7 + plist: 3.1.0 + smart-buffer: 4.2.0 + verror: 1.10.1 + optional: true + + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + + dotenv-expand@5.1.0: {} + + dotenv@9.0.2: {} + + eastasianwidth@0.2.0: {} + + ejs@3.1.10: + dependencies: + jake: 10.9.2 + + electron-builder-squirrel-windows@24.13.3(dmg-builder@24.13.3): + dependencies: + app-builder-lib: 24.13.3(dmg-builder@24.13.3)(electron-builder-squirrel-windows@24.13.3) + archiver: 5.3.2 + builder-util: 24.13.1 + fs-extra: 10.1.0 + transitivePeerDependencies: + - dmg-builder + - supports-color + + electron-builder@24.13.3(electron-builder-squirrel-windows@24.13.3): + dependencies: + app-builder-lib: 24.13.3(dmg-builder@24.13.3)(electron-builder-squirrel-windows@24.13.3) + builder-util: 24.13.1 + builder-util-runtime: 9.2.4 + chalk: 4.1.2 + dmg-builder: 24.13.3(electron-builder-squirrel-windows@24.13.3) + fs-extra: 10.1.0 + is-ci: 3.0.1 + lazy-val: 1.0.5 + read-config-file: 6.3.2 + simple-update-notifier: 2.0.0 + yargs: 17.7.2 + transitivePeerDependencies: + - electron-builder-squirrel-windows + - supports-color + + electron-publish@24.13.1: + dependencies: + '@types/fs-extra': 9.0.13 + builder-util: 24.13.1 + builder-util-runtime: 9.2.4 + chalk: 4.1.2 + fs-extra: 10.1.0 + lazy-val: 1.0.5 + mime: 2.6.0 + transitivePeerDependencies: + - supports-color + + electron-to-chromium@1.5.96: {} + + electron-vite@2.3.0(vite@5.4.14(@types/node@22.13.1)): + dependencies: + '@babel/core': 7.26.8 + '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.26.8) + cac: 6.7.14 + esbuild: 0.21.5 + magic-string: 0.30.17 + picocolors: 1.1.1 + vite: 5.4.14(@types/node@22.13.1) + transitivePeerDependencies: + - supports-color + + electron@31.7.7: + dependencies: + '@electron/get': 2.0.3 + '@types/node': 20.17.17 + extract-zip: 2.0.1 + transitivePeerDependencies: + - supports-color + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + end-of-stream@1.4.4: + dependencies: + once: 1.4.0 + + env-paths@2.2.1: {} + + err-code@2.0.3: {} + + es-define-property@1.0.1: + optional: true + + es-errors@1.3.0: + optional: true + + es6-error@4.1.1: + optional: true + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + escalade@3.2.0: {} + + escape-string-regexp@4.0.0: {} + + eslint-config-prettier@9.1.0(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + + eslint-plugin-prettier@5.2.3(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.5.0): + dependencies: + eslint: 8.57.1 + prettier: 3.5.0 + prettier-linter-helpers: 1.0.0 + synckit: 0.9.2 + optionalDependencies: + eslint-config-prettier: 9.1.0(eslint@8.57.1) + + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint@8.57.1: + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) + '@eslint-community/regexpp': 4.12.1 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.1 + '@humanwhocodes/config-array': 0.13.0 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.3.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.0 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + espree@9.6.1: + dependencies: + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + eslint-visitor-keys: 3.4.3 + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + esutils@2.0.3: {} + + extract-zip@2.0.1: + dependencies: + debug: 4.4.0 + get-stream: 5.2.0 + yauzl: 2.10.0 + optionalDependencies: + '@types/yauzl': 2.10.3 + transitivePeerDependencies: + - supports-color + + extsprintf@1.4.1: + optional: true + + fast-deep-equal@3.1.3: {} + + fast-diff@1.3.0: {} + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fastq@1.19.0: + dependencies: + reusify: 1.0.4 + + fd-slicer@1.1.0: + dependencies: + pend: 1.2.0 + + file-entry-cache@6.0.1: + dependencies: + flat-cache: 3.2.0 + + filelist@1.0.4: + dependencies: + minimatch: 5.1.6 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@3.2.0: + dependencies: + flatted: 3.3.2 + keyv: 4.5.4 + rimraf: 3.0.2 + + flatted@3.3.2: {} + + foreground-child@3.3.0: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + form-data@4.0.1: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + fs-constants@1.0.0: {} + + fs-extra@10.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fs-extra@8.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs-extra@9.1.0: + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fs-minipass@2.1.0: + dependencies: + minipass: 3.3.6 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-stream@5.2.0: + dependencies: + pump: 3.0.2 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@10.4.5: + dependencies: + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + global-agent@3.0.0: + dependencies: + boolean: 3.2.0 + es6-error: 4.1.1 + matcher: 3.0.0 + roarr: 2.15.4 + semver: 7.7.1 + serialize-error: 7.0.1 + optional: true + + globals@11.12.0: {} + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + optional: true + + gopd@1.2.0: + optional: true + + got@11.8.6: + dependencies: + '@sindresorhus/is': 4.6.0 + '@szmarczak/http-timer': 4.0.6 + '@types/cacheable-request': 6.0.3 + '@types/responselike': 1.0.3 + cacheable-lookup: 5.0.4 + cacheable-request: 7.0.4 + decompress-response: 6.0.0 + http2-wrapper: 1.0.3 + lowercase-keys: 2.0.0 + p-cancelable: 2.1.1 + responselike: 2.0.1 + + graceful-fs@4.2.11: {} + + graphemer@1.4.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + optional: true + + hosted-git-info@4.1.0: + dependencies: + lru-cache: 6.0.0 + + http-cache-semantics@4.1.1: {} + + http-proxy-agent@5.0.0: + dependencies: + '@tootallnate/once': 2.0.0 + agent-base: 6.0.2 + debug: 4.4.0 + transitivePeerDependencies: + - supports-color + + http2-wrapper@1.0.3: + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + + https-proxy-agent@5.0.1: + dependencies: + agent-base: 6.0.2 + debug: 4.4.0 + transitivePeerDependencies: + - supports-color + + iconv-corefoundation@1.1.7: + dependencies: + cli-truncate: 2.1.0 + node-addon-api: 1.7.2 + optional: true + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + ieee754@1.2.1: {} + + ignore@5.3.2: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + is-ci@3.0.1: + dependencies: + ci-info: 3.9.0 + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-path-inside@3.0.3: {} + + isarray@1.0.0: {} + + isbinaryfile@4.0.10: {} + + isbinaryfile@5.0.4: {} + + isexe@2.0.0: {} + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jake@10.9.2: + dependencies: + async: 3.2.6 + chalk: 4.1.2 + filelist: 1.0.4 + minimatch: 3.1.2 + + js-tokens@4.0.0: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsesc@3.1.0: {} + + json-buffer@3.0.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json-stringify-safe@5.0.1: + optional: true + + json5@2.2.3: {} + + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 + + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + lazy-val@1.0.5: {} + + lazystream@1.0.1: + dependencies: + readable-stream: 2.3.8 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.defaults@4.2.0: {} + + lodash.difference@4.5.0: {} + + lodash.flatten@4.4.0: {} + + lodash.isplainobject@4.0.6: {} + + lodash.merge@4.6.2: {} + + lodash.union@4.6.0: {} + + lodash@4.17.21: {} + + lowercase-keys@2.0.0: {} + + lru-cache@10.4.3: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + + magic-string@0.30.17: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + + matcher@3.0.0: + dependencies: + escape-string-regexp: 4.0.0 + optional: true + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime@2.6.0: {} + + mimic-response@1.0.1: {} + + mimic-response@3.1.0: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.1 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minimist@1.2.8: {} + + minipass@3.3.6: + dependencies: + yallist: 4.0.0 + + minipass@5.0.0: {} + + minipass@7.1.2: {} + + minizlib@2.1.2: + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + + mkdirp@1.0.4: {} + + ms@2.1.3: {} + + nanoid@3.3.8: {} + + natural-compare@1.4.0: {} + + node-addon-api@1.7.2: + optional: true + + node-releases@2.0.19: {} + + normalize-path@3.0.0: {} + + normalize-url@6.1.0: {} + + object-keys@1.1.1: + optional: true + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + p-cancelable@2.1.1: {} + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + package-json-from-dist@1.0.1: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + pend@1.2.0: {} + + picocolors@1.1.1: {} + + plist@3.1.0: + dependencies: + '@xmldom/xmldom': 0.8.10 + base64-js: 1.5.1 + xmlbuilder: 15.1.1 + + postcss@8.5.1: + dependencies: + nanoid: 3.3.8 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prelude-ls@1.2.1: {} + + prettier-linter-helpers@1.0.0: + dependencies: + fast-diff: 1.3.0 + + prettier@3.5.0: {} + + process-nextick-args@2.0.1: {} + + progress@2.0.3: {} + + promise-retry@2.0.1: + dependencies: + err-code: 2.0.3 + retry: 0.12.0 + + pump@3.0.2: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + punycode@2.3.1: {} + + queue-microtask@1.2.3: {} + + quick-lru@5.1.1: {} + + read-config-file@6.3.2: + dependencies: + config-file-ts: 0.2.6 + dotenv: 9.0.2 + dotenv-expand: 5.1.0 + js-yaml: 4.1.0 + json5: 2.2.3 + lazy-val: 1.0.5 + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdir-glob@1.1.3: + dependencies: + minimatch: 5.1.6 + + require-directory@2.1.1: {} + + resolve-alpn@1.2.1: {} + + resolve-from@4.0.0: {} + + responselike@2.0.1: + dependencies: + lowercase-keys: 2.0.0 + + retry@0.12.0: {} + + reusify@1.0.4: {} + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + roarr@2.15.4: + dependencies: + boolean: 3.2.0 + detect-node: 2.1.0 + globalthis: 1.0.4 + json-stringify-safe: 5.0.1 + semver-compare: 1.0.0 + sprintf-js: 1.1.3 + optional: true + + rollup@4.34.6: + dependencies: + '@types/estree': 1.0.6 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.34.6 + '@rollup/rollup-android-arm64': 4.34.6 + '@rollup/rollup-darwin-arm64': 4.34.6 + '@rollup/rollup-darwin-x64': 4.34.6 + '@rollup/rollup-freebsd-arm64': 4.34.6 + '@rollup/rollup-freebsd-x64': 4.34.6 + '@rollup/rollup-linux-arm-gnueabihf': 4.34.6 + '@rollup/rollup-linux-arm-musleabihf': 4.34.6 + '@rollup/rollup-linux-arm64-gnu': 4.34.6 + '@rollup/rollup-linux-arm64-musl': 4.34.6 + '@rollup/rollup-linux-loongarch64-gnu': 4.34.6 + '@rollup/rollup-linux-powerpc64le-gnu': 4.34.6 + '@rollup/rollup-linux-riscv64-gnu': 4.34.6 + '@rollup/rollup-linux-s390x-gnu': 4.34.6 + '@rollup/rollup-linux-x64-gnu': 4.34.6 + '@rollup/rollup-linux-x64-musl': 4.34.6 + '@rollup/rollup-win32-arm64-msvc': 4.34.6 + '@rollup/rollup-win32-ia32-msvc': 4.34.6 + '@rollup/rollup-win32-x64-msvc': 4.34.6 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + sanitize-filename@1.6.3: + dependencies: + truncate-utf8-bytes: 1.0.2 + + sax@1.4.1: {} + + semver-compare@1.0.0: + optional: true + + semver@6.3.1: {} + + semver@7.7.1: {} + + serialize-error@7.0.1: + dependencies: + type-fest: 0.13.1 + optional: true + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + signal-exit@4.1.0: {} + + simple-update-notifier@2.0.0: + dependencies: + semver: 7.7.1 + + slice-ansi@3.0.0: + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + optional: true + + smart-buffer@4.2.0: + optional: true + + source-map-js@1.2.1: {} + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + sprintf-js@1.1.3: + optional: true + + stat-mode@1.0.0: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 + + strip-json-comments@3.1.1: {} + + sumchecker@3.0.1: + dependencies: + debug: 4.4.0 + transitivePeerDependencies: + - supports-color + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + synckit@0.9.2: + dependencies: + '@pkgr/core': 0.1.1 + tslib: 2.8.1 + + tar-stream@2.2.0: + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + + tar@6.2.1: + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + + temp-file@3.4.0: + dependencies: + async-exit-hook: 2.0.1 + fs-extra: 10.1.0 + + text-table@0.2.0: {} + + tmp-promise@3.0.3: + dependencies: + tmp: 0.2.3 + + tmp@0.2.3: {} + + truncate-utf8-bytes@1.0.2: + dependencies: + utf8-byte-length: 1.0.5 + + tslib@2.8.1: {} + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-fest@0.13.1: + optional: true + + type-fest@0.20.2: {} + + typescript@5.7.3: {} + + undici-types@6.19.8: {} + + undici-types@6.20.0: {} + + universalify@0.1.2: {} + + universalify@2.0.1: {} + + update-browserslist-db@1.1.2(browserslist@4.24.4): + dependencies: + browserslist: 4.24.4 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + utf8-byte-length@1.0.5: {} + + util-deprecate@1.0.2: {} + + verror@1.10.1: + dependencies: + assert-plus: 1.0.0 + core-util-is: 1.0.2 + extsprintf: 1.4.1 + optional: true + + vite@5.4.14(@types/node@22.13.1): + dependencies: + esbuild: 0.21.5 + postcss: 8.5.1 + rollup: 4.34.6 + optionalDependencies: + '@types/node': 22.13.1 + fsevents: 2.3.3 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} + + xmlbuilder@15.1.1: {} + + y18n@5.0.8: {} + + yallist@3.1.1: {} + + yallist@4.0.0: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yauzl@2.10.0: + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + + yocto-queue@0.1.0: {} + + zip-stream@4.1.1: + dependencies: + archiver-utils: 3.0.4 + compress-commons: 4.1.2 + readable-stream: 3.6.2 diff --git a/examples/boops-javascript/src/main/index.js b/examples/boops-javascript/src/main/index.js new file mode 100644 index 0000000..e4e7139 --- /dev/null +++ b/examples/boops-javascript/src/main/index.js @@ -0,0 +1,114 @@ +//@ts-check +import { app, shell, BrowserWindow, ipcMain } from 'electron' +import { join } from 'path' +import { electronApp, optimizer, is } from '@electron-toolkit/utils' +import { Events, register, RPCClient } from '../../../../dist' + +/** @type {BrowserWindow} */ +let mainWindow + +function createWindow() { + // Create the browser window. + mainWindow = new BrowserWindow({ + width: 900, + height: 670, + show: false, + autoHideMenuBar: true, + webPreferences: { + preload: join(__dirname, '../preload/index.js'), + sandbox: false + } + }) + + mainWindow.on('ready-to-show', () => { + mainWindow.show() + }) + + mainWindow.webContents.setWindowOpenHandler((details) => { + shell.openExternal(details.url) + return { action: 'deny' } + }) + + // HMR for renderer base on electron-vite cli. + // Load the remote URL for development or the local html file for production. + if (is.dev && process.env['ELECTRON_RENDERER_URL']) { + mainWindow.loadURL(process.env['ELECTRON_RENDERER_URL']) + } else { + mainWindow.loadFile(join(__dirname, '../renderer/index.html')) + } +} + +// This method will be called when Electron has finished +// initialization and is ready to create browser windows. +// Some APIs can only be used after this event occurs. +app.whenReady().then(() => { + // Set app user model id for windows + electronApp.setAppUserModelId('com.electron') + + // Default open or close DevTools by F12 in development + // and ignore CommandOrControl + R in production. + // see https://github.com/alex8088/electron-toolkit/tree/master/packages/utils + app.on('browser-window-created', (_, window) => { + optimizer.watchWindowShortcuts(window) + }) + + // IPC test + ipcMain.on('ping', () => console.log('pong')) + + createWindow() + + app.on('activate', function () { + // On macOS it's common to re-create a window in the app when the + // dock icon is clicked and there are no other windows open. + if (BrowserWindow.getAllWindows().length === 0) createWindow() + }) +}) + +// Quit when all windows are closed, except on macOS. There, it's common +// for applications and their menu bar to stay active until the user quits +// explicitly with Cmd + Q. +app.on('window-all-closed', () => { + if (process.platform !== 'darwin') { + app.quit() + } +}) + +// In this file you can include the rest of your app"s specific main process +// code. You can also put them in separate files and require them here. + +// Set this to your Client ID. +const clientId = '280984871685062656' + +// Only needed if you want to use spectate, join, or ask to join +register(clientId) + +const client = new RPCClient() +const startTimestamp = new Date().getTime() + +async function setActivity() { + if (!client || !mainWindow) { + return + } + + const boops = await mainWindow.webContents.executeJavaScript( + 'document.querySelector("#boops").innerText' + ) + + await client.setActivity({ + details: `booped ${boops} times`, + state: 'in slither party', + timestamps: { start: startTimestamp }, + instance: false + }) +} + +client.once(Events.Ready, async () => { + await setActivity() + + // Activity can only be set every 15 seconds + setInterval(async () => { + await setActivity() + }, 15e3) +}) + +client.login({ clientId }).catch(console.error) diff --git a/examples/boops-javascript/src/preload/index.js b/examples/boops-javascript/src/preload/index.js new file mode 100644 index 0000000..8d62cb9 --- /dev/null +++ b/examples/boops-javascript/src/preload/index.js @@ -0,0 +1,20 @@ +import { contextBridge } from 'electron' +import { electronAPI } from '@electron-toolkit/preload' + +// Custom APIs for renderer +const api = {} + +// Use `contextBridge` APIs to expose Electron APIs to +// renderer only if context isolation is enabled, otherwise +// just add to the DOM global. +if (process.contextIsolated) { + try { + contextBridge.exposeInMainWorld('electron', electronAPI) + contextBridge.exposeInMainWorld('api', api) + } catch (error) { + console.error(error) + } +} else { + window.electron = electronAPI + window.api = api +} diff --git a/examples/boops-javascript/src/renderer/index.html b/examples/boops-javascript/src/renderer/index.html new file mode 100644 index 0000000..700f006 --- /dev/null +++ b/examples/boops-javascript/src/renderer/index.html @@ -0,0 +1,22 @@ + + + + + BOOP TEH SNEK (RPC JavaScript Example) + + + + + + + +

BOOP TEH SNEK

+
🐍
+

0 BOOPS

+ + + + diff --git a/examples/boops-javascript/src/renderer/src/renderer.js b/examples/boops-javascript/src/renderer/src/renderer.js new file mode 100644 index 0000000..7238af9 --- /dev/null +++ b/examples/boops-javascript/src/renderer/src/renderer.js @@ -0,0 +1,24 @@ +function init() { + window.addEventListener('DOMContentLoaded', () => { + const snek = document.querySelector('#snek') + const counter = document.querySelector('#boops') + + let boops = 0 + + function boop() { + boops += 1 + counter.innerHTML = `${boops} BOOPS` + } + + snek.onmousedown = () => { + snek.style['font-size'] = '550%' + boop() + } + + snek.onmouseup = () => { + snek.style['font-size'] = '500%' + } + }) +} + +init() diff --git a/examples/boops-javascript/src/renderer/styles.css b/examples/boops-javascript/src/renderer/styles.css new file mode 100644 index 0000000..ad08708 --- /dev/null +++ b/examples/boops-javascript/src/renderer/styles.css @@ -0,0 +1,46 @@ +body, +html { + margin: 0px; + height: 100%; + cursor: default; + font-family: sans-serif; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-app-region: drag; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +@media (prefers-color-scheme: dark) { + html { + background-color: black; + color: white; + } +} + +h1 { + text-align: center; + margin: auto; + padding-top: 1em; +} + +#game { + height: 60%; + display: grid; + -webkit-app-region: no-drag; +} + +#snek { + cursor: pointer; + font-size: 500%; + margin: auto; +} + +#boops { + text-align: center; + -webkit-app-region: no-drag; +} diff --git a/examples/boops-typescript/.editorconfig b/examples/boops-typescript/.editorconfig new file mode 100644 index 0000000..9d08a1a --- /dev/null +++ b/examples/boops-typescript/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true diff --git a/examples/boops-typescript/.eslintignore b/examples/boops-typescript/.eslintignore new file mode 100644 index 0000000..a6f34fe --- /dev/null +++ b/examples/boops-typescript/.eslintignore @@ -0,0 +1,4 @@ +node_modules +dist +out +.gitignore diff --git a/examples/boops-typescript/.eslintrc.js b/examples/boops-typescript/.eslintrc.js new file mode 100644 index 0000000..510e905 --- /dev/null +++ b/examples/boops-typescript/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + extends: [ + 'eslint:recommended', + '@electron-toolkit/eslint-config-ts/recommended', + '@electron-toolkit/eslint-config-prettier' + ] +} diff --git a/examples/boops-typescript/.gitignore b/examples/boops-typescript/.gitignore new file mode 100644 index 0000000..42bd71b --- /dev/null +++ b/examples/boops-typescript/.gitignore @@ -0,0 +1,5 @@ +node_modules +dist +out +.DS_Store +*.log* diff --git a/examples/boops-typescript/.npmrc b/examples/boops-typescript/.npmrc new file mode 100644 index 0000000..bf2e764 --- /dev/null +++ b/examples/boops-typescript/.npmrc @@ -0,0 +1 @@ +shamefully-hoist=true diff --git a/examples/boops-typescript/.prettierignore b/examples/boops-typescript/.prettierignore new file mode 100644 index 0000000..9c6b791 --- /dev/null +++ b/examples/boops-typescript/.prettierignore @@ -0,0 +1,6 @@ +out +dist +pnpm-lock.yaml +LICENSE.md +tsconfig.json +tsconfig.*.json diff --git a/examples/boops-typescript/.prettierrc.yaml b/examples/boops-typescript/.prettierrc.yaml new file mode 100644 index 0000000..35893b3 --- /dev/null +++ b/examples/boops-typescript/.prettierrc.yaml @@ -0,0 +1,4 @@ +singleQuote: true +semi: false +printWidth: 100 +trailingComma: none diff --git a/examples/boops-typescript/README.md b/examples/boops-typescript/README.md new file mode 100644 index 0000000..8a28eb0 --- /dev/null +++ b/examples/boops-typescript/README.md @@ -0,0 +1,34 @@ +# boops-typescript + +A minimal Electron application using discord-rpc with TypeScript + +## Recommended IDE Setup + +- [VSCode](https://code.visualstudio.com/) + [ESLint](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint) + [Prettier](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode) + +## Project Setup + +### Install + +```bash +$ pnpm install +``` + +### Development + +```bash +$ pnpm dev +``` + +### Build + +```bash +# For windows +$ pnpm build:win + +# For macOS +$ pnpm build:mac + +# For Linux +$ pnpm build:linux +``` diff --git a/examples/boops-typescript/electron-builder.yml b/examples/boops-typescript/electron-builder.yml new file mode 100644 index 0000000..763c0ad --- /dev/null +++ b/examples/boops-typescript/electron-builder.yml @@ -0,0 +1,43 @@ +appId: com.electron.app +productName: boops-typescript +directories: + buildResources: build +files: + - '!**/.vscode/*' + - '!src/*' + - '!electron.vite.config.{js,ts,mjs,cjs}' + - '!{.eslintignore,.eslintrc.js,.prettierignore,.prettierrc.yaml,dev-app-update.yml,CHANGELOG.md,README.md}' + - '!{.env,.env.*,.npmrc,pnpm-lock.yaml}' + - '!{tsconfig.json,tsconfig.node.json,tsconfig.web.json}' +asarUnpack: + - resources/** +win: + executableName: boops-typescript +nsis: + artifactName: ${name}-${version}-setup.${ext} + shortcutName: ${productName} + uninstallDisplayName: ${productName} + createDesktopShortcut: always +mac: + entitlementsInherit: build/entitlements.mac.plist + extendInfo: + - NSCameraUsageDescription: Application requests access to the device's camera. + - NSMicrophoneUsageDescription: Application requests access to the device's microphone. + - NSDocumentsFolderUsageDescription: Application requests access to the user's Documents folder. + - NSDownloadsFolderUsageDescription: Application requests access to the user's Downloads folder. + notarize: false +dmg: + artifactName: ${name}-${version}.${ext} +linux: + target: + - AppImage + - snap + - deb + maintainer: electronjs.org + category: Utility +appImage: + artifactName: ${name}-${version}.${ext} +npmRebuild: false +publish: + provider: generic + url: https://example.com/auto-updates diff --git a/examples/boops-typescript/electron.vite.config.ts b/examples/boops-typescript/electron.vite.config.ts new file mode 100644 index 0000000..3acc2e8 --- /dev/null +++ b/examples/boops-typescript/electron.vite.config.ts @@ -0,0 +1,11 @@ +import { defineConfig, externalizeDepsPlugin } from 'electron-vite' + +export default defineConfig({ + main: { + plugins: [externalizeDepsPlugin()] + }, + preload: { + plugins: [externalizeDepsPlugin()] + }, + renderer: {} +}) diff --git a/examples/boops-typescript/package.json b/examples/boops-typescript/package.json new file mode 100644 index 0000000..d6641d5 --- /dev/null +++ b/examples/boops-typescript/package.json @@ -0,0 +1,38 @@ +{ + "name": "boops-typescript", + "version": "1.0.0", + "description": "A minimal Electron application using discord-rpc with TypeScript", + "main": "./out/main/index.js", + "scripts": { + "format": "prettier --write .", + "lint": "eslint . --ext .js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix", + "typecheck:node": "tsc --noEmit -p tsconfig.node.json --composite false", + "typecheck:web": "tsc --noEmit -p tsconfig.web.json --composite false", + "typecheck": "npm run typecheck:node && npm run typecheck:web", + "start": "electron-vite preview", + "dev": "electron-vite dev", + "build": "npm run typecheck && electron-vite build", + "postinstall": "electron-builder install-app-deps", + "build:unpack": "npm run build && electron-builder --dir", + "build:win": "npm run build && electron-builder --win", + "build:mac": "npm run build && electron-builder --mac", + "build:linux": "npm run build && electron-builder --linux" + }, + "dependencies": { + "@electron-toolkit/preload": "^3.0.1", + "@electron-toolkit/utils": "^3.0.0" + }, + "devDependencies": { + "@electron-toolkit/eslint-config-prettier": "^2.0.0", + "@electron-toolkit/eslint-config-ts": "^2.0.0", + "@electron-toolkit/tsconfig": "^1.0.1", + "@types/node": "^20.14.8", + "electron": "^31.0.2", + "electron-builder": "^24.13.3", + "electron-vite": "^2.3.0", + "eslint": "^8.57.0", + "prettier": "^3.3.2", + "typescript": "^5.5.2", + "vite": "^5.3.1" + } +} diff --git a/examples/boops-typescript/pnpm-lock.yaml b/examples/boops-typescript/pnpm-lock.yaml new file mode 100644 index 0000000..0a8a99f --- /dev/null +++ b/examples/boops-typescript/pnpm-lock.yaml @@ -0,0 +1,3927 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@electron-toolkit/preload': + specifier: ^3.0.1 + version: 3.0.1(electron@31.7.7) + '@electron-toolkit/utils': + specifier: ^3.0.0 + version: 3.0.0(electron@31.7.7) + devDependencies: + '@electron-toolkit/eslint-config-prettier': + specifier: ^2.0.0 + version: 2.0.0(eslint@8.57.1)(prettier@3.5.0) + '@electron-toolkit/eslint-config-ts': + specifier: ^2.0.0 + version: 2.0.0(eslint@8.57.1)(typescript@5.7.3) + '@electron-toolkit/tsconfig': + specifier: ^1.0.1 + version: 1.0.1(@types/node@20.17.17) + '@types/node': + specifier: ^20.14.8 + version: 20.17.17 + electron: + specifier: ^31.0.2 + version: 31.7.7 + electron-builder: + specifier: ^24.13.3 + version: 24.13.3(electron-builder-squirrel-windows@24.13.3) + electron-vite: + specifier: ^2.3.0 + version: 2.3.0(vite@5.4.14(@types/node@20.17.17)) + eslint: + specifier: ^8.57.0 + version: 8.57.1 + prettier: + specifier: ^3.3.2 + version: 3.5.0 + typescript: + specifier: ^5.5.2 + version: 5.7.3 + vite: + specifier: ^5.3.1 + version: 5.4.14(@types/node@20.17.17) + +packages: + + 7zip-bin@5.2.0: + resolution: {integrity: sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==} + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.26.8': + resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.26.8': + resolution: {integrity: sha512-l+lkXCHS6tQEc5oUpK28xBOZ6+HwaH7YwoYQbLFiYb4nS2/l1tKnZEtEWkD0GuiYdvArf9qBS0XlQGXzPMsNqQ==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.26.8': + resolution: {integrity: sha512-ef383X5++iZHWAXX0SXQR6ZyQhw/0KtTkrTz61WXRhFM6dhpHulO/RJz79L8S6ugZHJkOOkUrUdxgdF2YiPFnA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.26.5': + resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.25.9': + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.26.0': + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.26.5': + resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.25.9': + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.26.7': + resolution: {integrity: sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.26.8': + resolution: {integrity: sha512-TZIQ25pkSoaKEYYaHbbxkfL36GNsQ6iFiBbeuzAkLnXayKR1yP1zFe+NxuZWWsUyvt8icPU9CCq0sgWGXR1GEw==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-transform-arrow-functions@7.25.9': + resolution: {integrity: sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/template@7.26.8': + resolution: {integrity: sha512-iNKaX3ZebKIsCvJ+0jd6embf+Aulaa3vNBqZ41kM7iTWjx5qzWKXGHiJUW3+nTpQ18SG11hdF8OAzKrpXkb96Q==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.26.8': + resolution: {integrity: sha512-nic9tRkjYH0oB2dzr/JoGIm+4Q6SuYeLEiIiZDwBscRMYFJ+tMAz98fuel9ZnbXViA2I0HVSSRRK8DW5fjXStA==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.26.8': + resolution: {integrity: sha512-eUuWapzEGWFEpHFxgEaBG8e3n6S8L3MSu0oda755rOfabWPnh0Our1AozNFVUxGFIhbKgd1ksprsoDGMinTOTA==} + engines: {node: '>=6.9.0'} + + '@develar/schema-utils@2.6.5': + resolution: {integrity: sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==} + engines: {node: '>= 8.9.0'} + + '@electron-toolkit/eslint-config-prettier@2.0.0': + resolution: {integrity: sha512-L+uG1FvJcAZkPZpSi6B1pmdpyJFyOxWDTjr1Vs47vSryxv/EX1Ch6o4HVsachlDq3fMEkDgojuP2F3ZvVZMoLw==} + peerDependencies: + eslint: '>= 8.0.0' + prettier: '>= 3.0.0' + + '@electron-toolkit/eslint-config-ts@2.0.0': + resolution: {integrity: sha512-NGXadMyWH9+ZsgYe/u5E0mqK2qTDq01kKKnyo7oiq/7v/dWoMoPhqSkn69NZvt7WmnFNOm57l71fv6128mAx3Q==} + peerDependencies: + eslint: '>=8.56.0' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@electron-toolkit/preload@3.0.1': + resolution: {integrity: sha512-EzoQmpK8jqqU8YnM5jRe0GJjGVJPke2KtANqz8QtN2JPT96ViOvProBdK5C6riCm0j1T8jjAGVQCZLQy9OVoIA==} + peerDependencies: + electron: '>=13.0.0' + + '@electron-toolkit/tsconfig@1.0.1': + resolution: {integrity: sha512-M0Mol3odspvtCuheyujLNAW7bXq7KFNYVMRtpjFa4ZfES4MuklXBC7Nli/omvc+PRKlrklgAGx3l4VakjNo8jg==} + peerDependencies: + '@types/node': '*' + + '@electron-toolkit/utils@3.0.0': + resolution: {integrity: sha512-GaXHDhiT7KCvMJjXdp/QqpYinq69T/Pdl49Z1XLf8mKGf63dnsODMWyrmIjEQ0z/vG7dO8qF3fvmI6Eb2lUNZA==} + peerDependencies: + electron: '>=13.0.0' + + '@electron/asar@3.2.18': + resolution: {integrity: sha512-2XyvMe3N3Nrs8cV39IKELRHTYUWFKrmqqSY1U+GMlc0jvqjIVnoxhNd2H4JolWQncbJi1DCvb5TNxZuI2fEjWg==} + engines: {node: '>=10.12.0'} + hasBin: true + + '@electron/get@2.0.3': + resolution: {integrity: sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==} + engines: {node: '>=12'} + + '@electron/notarize@2.2.1': + resolution: {integrity: sha512-aL+bFMIkpR0cmmj5Zgy0LMKEpgy43/hw5zadEArgmAMWWlKc5buwFvFT9G/o/YJkvXAJm5q3iuTuLaiaXW39sg==} + engines: {node: '>= 10.0.0'} + + '@electron/osx-sign@1.0.5': + resolution: {integrity: sha512-k9ZzUQtamSoweGQDV2jILiRIHUu7lYlJ3c6IEmjv1hC17rclE+eb9U+f6UFlOOETo0JzY1HNlXy4YOlCvl+Lww==} + engines: {node: '>=12.0.0'} + hasBin: true + + '@electron/universal@1.5.1': + resolution: {integrity: sha512-kbgXxyEauPJiQQUNG2VgUeyfQNFk6hBF11ISN2PNI6agUgPl55pv4eQmaqHzTAzchBvqZ2tQuRVaPStGf0mxGw==} + engines: {node: '>=8.6'} + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.4.1': + resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.57.1': + resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@humanwhocodes/config-array@0.13.0': + resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@malept/cross-spawn-promise@1.1.1': + resolution: {integrity: sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==} + engines: {node: '>= 10'} + + '@malept/flatpak-bundler@0.4.0': + resolution: {integrity: sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==} + engines: {node: '>= 10.0.0'} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@pkgr/core@0.1.1': + resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + + '@rollup/rollup-android-arm-eabi@4.34.6': + resolution: {integrity: sha512-+GcCXtOQoWuC7hhX1P00LqjjIiS/iOouHXhMdiDSnq/1DGTox4SpUvO52Xm+div6+106r+TcvOeo/cxvyEyTgg==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.34.6': + resolution: {integrity: sha512-E8+2qCIjciYUnCa1AiVF1BkRgqIGW9KzJeesQqVfyRITGQN+dFuoivO0hnro1DjT74wXLRZ7QF8MIbz+luGaJA==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.34.6': + resolution: {integrity: sha512-z9Ib+OzqN3DZEjX7PDQMHEhtF+t6Mi2z/ueChQPLS/qUMKY7Ybn5A2ggFoKRNRh1q1T03YTQfBTQCJZiepESAg==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.34.6': + resolution: {integrity: sha512-PShKVY4u0FDAR7jskyFIYVyHEPCPnIQY8s5OcXkdU8mz3Y7eXDJPdyM/ZWjkYdR2m0izD9HHWA8sGcXn+Qrsyg==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.34.6': + resolution: {integrity: sha512-YSwyOqlDAdKqs0iKuqvRHLN4SrD2TiswfoLfvYXseKbL47ht1grQpq46MSiQAx6rQEN8o8URtpXARCpqabqxGQ==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.34.6': + resolution: {integrity: sha512-HEP4CgPAY1RxXwwL5sPFv6BBM3tVeLnshF03HMhJYCNc6kvSqBgTMmsEjb72RkZBAWIqiPUyF1JpEBv5XT9wKQ==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.34.6': + resolution: {integrity: sha512-88fSzjC5xeH9S2Vg3rPgXJULkHcLYMkh8faix8DX4h4TIAL65ekwuQMA/g2CXq8W+NJC43V6fUpYZNjaX3+IIg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.34.6': + resolution: {integrity: sha512-wM4ztnutBqYFyvNeR7Av+reWI/enK9tDOTKNF+6Kk2Q96k9bwhDDOlnCUNRPvromlVXo04riSliMBs/Z7RteEg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.34.6': + resolution: {integrity: sha512-9RyprECbRa9zEjXLtvvshhw4CMrRa3K+0wcp3KME0zmBe1ILmvcVHnypZ/aIDXpRyfhSYSuN4EPdCCj5Du8FIA==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.34.6': + resolution: {integrity: sha512-qTmklhCTyaJSB05S+iSovfo++EwnIEZxHkzv5dep4qoszUMX5Ca4WM4zAVUMbfdviLgCSQOu5oU8YoGk1s6M9Q==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loongarch64-gnu@4.34.6': + resolution: {integrity: sha512-4Qmkaps9yqmpjY5pvpkfOerYgKNUGzQpFxV6rnS7c/JfYbDSU0y6WpbbredB5cCpLFGJEqYX40WUmxMkwhWCjw==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.34.6': + resolution: {integrity: sha512-Zsrtux3PuaxuBTX/zHdLaFmcofWGzaWW1scwLU3ZbW/X+hSsFbz9wDIp6XvnT7pzYRl9MezWqEqKy7ssmDEnuQ==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.34.6': + resolution: {integrity: sha512-aK+Zp+CRM55iPrlyKiU3/zyhgzWBxLVrw2mwiQSYJRobCURb781+XstzvA8Gkjg/hbdQFuDw44aUOxVQFycrAg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.34.6': + resolution: {integrity: sha512-WoKLVrY9ogmaYPXwTH326+ErlCIgMmsoRSx6bO+l68YgJnlOXhygDYSZe/qbUJCSiCiZAQ+tKm88NcWuUXqOzw==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.34.6': + resolution: {integrity: sha512-Sht4aFvmA4ToHd2vFzwMFaQCiYm2lDFho5rPcvPBT5pCdC+GwHG6CMch4GQfmWTQ1SwRKS0dhDYb54khSrjDWw==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.34.6': + resolution: {integrity: sha512-zmmpOQh8vXc2QITsnCiODCDGXFC8LMi64+/oPpPx5qz3pqv0s6x46ps4xoycfUiVZps5PFn1gksZzo4RGTKT+A==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.34.6': + resolution: {integrity: sha512-3/q1qUsO/tLqGBaD4uXsB6coVGB3usxw3qyeVb59aArCgedSF66MPdgRStUd7vbZOsko/CgVaY5fo2vkvPLWiA==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.34.6': + resolution: {integrity: sha512-oLHxuyywc6efdKVTxvc0135zPrRdtYVjtVD5GUm55I3ODxhU/PwkQFD97z16Xzxa1Fz0AEe4W/2hzRtd+IfpOA==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.34.6': + resolution: {integrity: sha512-0PVwmgzZ8+TZ9oGBmdZoQVXflbvuwzN/HRclujpl4N/q3i+y0lqLw8n1bXA8ru3sApDjlmONaNAuYr38y1Kr9w==} + cpu: [x64] + os: [win32] + + '@sindresorhus/is@4.6.0': + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + + '@szmarczak/http-timer@4.0.6': + resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} + engines: {node: '>=10'} + + '@tootallnate/once@2.0.0': + resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} + engines: {node: '>= 10'} + + '@types/cacheable-request@6.0.3': + resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + + '@types/fs-extra@9.0.13': + resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} + + '@types/gensync@1.0.4': + resolution: {integrity: sha512-C3YYeRQWp2fmq9OryX+FoDy8nXS6scQ7dPptD8LnFDAUNcKWJjXQKDNJD3HVm+kOUsXhTOkpi69vI4EuAr95bA==} + + '@types/http-cache-semantics@4.0.4': + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + + '@types/keyv@3.1.4': + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/node@20.17.17': + resolution: {integrity: sha512-/WndGO4kIfMicEQLTi/mDANUu/iVUhT7KboZPdEqqHQ4aTS+3qT3U5gIqWDFV+XouorjfgGqvKILJeHhuQgFYg==} + + '@types/plist@3.0.5': + resolution: {integrity: sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==} + + '@types/responselike@1.0.3': + resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} + + '@types/verror@1.10.10': + resolution: {integrity: sha512-l4MM0Jppn18hb9xmM6wwD1uTdShpf9Pn80aXTStnK1C94gtPvJcV2FrDmbOQUAQfJ1cKZHktkQUDwEqaAKXMMg==} + + '@types/yauzl@2.10.3': + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + + '@typescript-eslint/eslint-plugin@7.18.0': + resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + '@typescript-eslint/parser': ^7.0.0 + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@7.18.0': + resolution: {integrity: sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@7.18.0': + resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/type-utils@7.18.0': + resolution: {integrity: sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@7.18.0': + resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/typescript-estree@7.18.0': + resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@7.18.0': + resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + + '@typescript-eslint/visitor-keys@7.18.0': + resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + '@xmldom/xmldom@0.8.10': + resolution: {integrity: sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==} + engines: {node: '>=10.0.0'} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + + ajv-keywords@3.5.2: + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + app-builder-bin@4.0.0: + resolution: {integrity: sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA==} + + app-builder-lib@24.13.3: + resolution: {integrity: sha512-FAzX6IBit2POXYGnTCT8YHFO/lr5AapAII6zzhQO3Rw4cEDOgK+t1xhLc5tNcKlicTHlo9zxIwnYCX9X2DLkig==} + engines: {node: '>=14.0.0'} + peerDependencies: + dmg-builder: 24.13.3 + electron-builder-squirrel-windows: 24.13.3 + + archiver-utils@2.1.0: + resolution: {integrity: sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==} + engines: {node: '>= 6'} + + archiver-utils@3.0.4: + resolution: {integrity: sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==} + engines: {node: '>= 10'} + + archiver@5.3.2: + resolution: {integrity: sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==} + engines: {node: '>= 10'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + assert-plus@1.0.0: + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} + engines: {node: '>=0.8'} + + astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + + async-exit-hook@2.0.1: + resolution: {integrity: sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==} + engines: {node: '>=0.12.0'} + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + bluebird-lst@1.0.9: + resolution: {integrity: sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==} + + bluebird@3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + + boolean@3.2.0: + resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.24.4: + resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + + buffer-equal@1.0.1: + resolution: {integrity: sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==} + engines: {node: '>=0.4'} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + builder-util-runtime@9.2.4: + resolution: {integrity: sha512-upp+biKpN/XZMLim7aguUyW8s0FUpDvOtK6sbanMFDAMBzpHDqdhgVYm6zc9HJ6nWo7u2Lxk60i2M6Jd3aiNrA==} + engines: {node: '>=12.0.0'} + + builder-util@24.13.1: + resolution: {integrity: sha512-NhbCSIntruNDTOVI9fdXz0dihaqX2YuE1D6zZMrwiErzH4ELZHE6mdiB40wEgZNprDia+FghRFgKoAqMZRRjSA==} + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + cacheable-lookup@5.0.4: + resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} + engines: {node: '>=10.6.0'} + + cacheable-request@7.0.4: + resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} + engines: {node: '>=8'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + caniuse-lite@1.0.30001699: + resolution: {integrity: sha512-b+uH5BakXZ9Do9iK+CkDmctUSEqZl+SP056vc5usa0PL+ev5OHw003rZXcnjNDv3L8P5j6rwT6C0BPKSikW08w==} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + + chromium-pickle-js@0.2.0: + resolution: {integrity: sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + cli-truncate@2.1.0: + resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} + engines: {node: '>=8'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone-response@1.0.3: + resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@5.1.0: + resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} + engines: {node: '>= 6'} + + compare-version@0.1.2: + resolution: {integrity: sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==} + engines: {node: '>=0.10.0'} + + compress-commons@4.1.2: + resolution: {integrity: sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==} + engines: {node: '>= 10'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + config-file-ts@0.2.6: + resolution: {integrity: sha512-6boGVaglwblBgJqGyxm4+xCmEGcWgnWHSWHY5jad58awQhB6gftq0G8HbzU39YqCIYHMLAiL1yjwiZ36m/CL8w==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + core-util-is@1.0.2: + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + crc32-stream@4.0.3: + resolution: {integrity: sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==} + engines: {node: '>= 10'} + + crc@3.8.0: + resolution: {integrity: sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + detect-node@2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + + dir-compare@3.3.0: + resolution: {integrity: sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg==} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + dmg-builder@24.13.3: + resolution: {integrity: sha512-rcJUkMfnJpfCboZoOOPf4L29TRtEieHNOeAbYPWPxlaBw/Z1RKrRA86dOI9rwaI4tQSc/RD82zTNHprfUHXsoQ==} + + dmg-license@1.0.11: + resolution: {integrity: sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==} + engines: {node: '>=8'} + os: [darwin] + hasBin: true + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dotenv-expand@5.1.0: + resolution: {integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==} + + dotenv@9.0.2: + resolution: {integrity: sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==} + engines: {node: '>=10'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} + hasBin: true + + electron-builder-squirrel-windows@24.13.3: + resolution: {integrity: sha512-oHkV0iogWfyK+ah9ZIvMDpei1m9ZRpdXcvde1wTpra2U8AFDNNpqJdnin5z+PM1GbQ5BoaKCWas2HSjtR0HwMg==} + + electron-builder@24.13.3: + resolution: {integrity: sha512-yZSgVHft5dNVlo31qmJAe4BVKQfFdwpRw7sFp1iQglDRCDD6r22zfRJuZlhtB5gp9FHUxCMEoWGq10SkCnMAIg==} + engines: {node: '>=14.0.0'} + hasBin: true + + electron-publish@24.13.1: + resolution: {integrity: sha512-2ZgdEqJ8e9D17Hwp5LEq5mLQPjqU3lv/IALvgp+4W8VeNhryfGhYEQC/PgDPMrnWUp+l60Ou5SJLsu+k4mhQ8A==} + + electron-to-chromium@1.5.96: + resolution: {integrity: sha512-8AJUW6dh75Fm/ny8+kZKJzI1pgoE8bKLZlzDU2W1ENd+DXKJrx7I7l9hb8UWR4ojlnb5OlixMt00QWiYJoVw1w==} + + electron-vite@2.3.0: + resolution: {integrity: sha512-lsN2FymgJlp4k6MrcsphGqZQ9fKRdJKasoaiwIrAewN1tapYI/KINLdfEL7n10LuF0pPSNf/IqjzZbB5VINctg==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@swc/core': ^1.0.0 + vite: ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + '@swc/core': + optional: true + + electron@31.7.7: + resolution: {integrity: sha512-HZtZg8EHsDGnswFt0QeV8If8B+et63uD6RJ7I4/xhcXqmTIbI08GoubX/wm+HdY0DwcuPe1/xsgqpmYvjdjRoA==} + engines: {node: '>= 12.20.55'} + hasBin: true + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + err-code@2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es6-error@4.1.1: + resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-config-prettier@9.1.0: + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-plugin-prettier@5.2.3: + resolution: {integrity: sha512-qJ+y0FfCp/mQYQ/vWQ3s7eUlFEL4PyKfAJxsnYTJ4YT73nsJBWqmEpFryxV9OeUiqmsTsYJ5Y+KDNaeP31wrRw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '*' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint@8.57.1: + resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + hasBin: true + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + extract-zip@2.0.1: + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} + hasBin: true + + extsprintf@1.4.1: + resolution: {integrity: sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==} + engines: {'0': node >=0.6.0} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fastq@1.19.0: + resolution: {integrity: sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==} + + fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flatted@3.3.2: + resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} + + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + engines: {node: '>=14'} + + form-data@4.0.1: + resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} + engines: {node: '>= 6'} + + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + + fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + global-agent@3.0.0: + resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==} + engines: {node: '>=10.0'} + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + got@11.8.6: + resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} + engines: {node: '>=10.19.0'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + + http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + + http-proxy-agent@5.0.0: + resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} + engines: {node: '>= 6'} + + http2-wrapper@1.0.3: + resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} + engines: {node: '>=10.19.0'} + + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + + iconv-corefoundation@1.1.7: + resolution: {integrity: sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==} + engines: {node: ^8.11.2 || >=10} + os: [darwin] + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + is-ci@3.0.1: + resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} + hasBin: true + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isbinaryfile@4.0.10: + resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} + engines: {node: '>= 8.0.0'} + + isbinaryfile@5.0.4: + resolution: {integrity: sha512-YKBKVkKhty7s8rxddb40oOkuP0NbaeXrQvLin6QMHL7Ypiy2RW9LwOVrVgZRyOrhQlayMd9t+D8yDy8MKFTSDQ==} + engines: {node: '>= 18.0.0'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jake@10.9.2: + resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} + engines: {node: '>=10'} + hasBin: true + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + lazy-val@1.0.5: + resolution: {integrity: sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==} + + lazystream@1.0.1: + resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} + engines: {node: '>= 0.6.3'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.defaults@4.2.0: + resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} + + lodash.difference@4.5.0: + resolution: {integrity: sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==} + + lodash.flatten@4.4.0: + resolution: {integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.union@4.6.0: + resolution: {integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + lowercase-keys@2.0.0: + resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} + engines: {node: '>=8'} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + + matcher@3.0.0: + resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} + engines: {node: '>=10'} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@2.6.0: + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} + hasBin: true + + mimic-response@1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: '>=4'} + + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@3.3.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + node-addon-api@1.7.2: + resolution: {integrity: sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==} + + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-url@6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + p-cancelable@2.1.1: + resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} + engines: {node: '>=8'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + plist@3.1.0: + resolution: {integrity: sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==} + engines: {node: '>=10.4.0'} + + postcss@8.5.1: + resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + + prettier@3.5.0: + resolution: {integrity: sha512-quyMrVt6svPS7CjQ9gKb3GLEX/rl3BCL2oa/QkNcXv4YNVBC9olt3s+H7ukto06q7B1Qz46PbrKLO34PR6vXcA==} + engines: {node: '>=14'} + hasBin: true + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + + promise-retry@2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} + + pump@3.0.2: + resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + + read-config-file@6.3.2: + resolution: {integrity: sha512-M80lpCjnE6Wt6zb98DoW8WHR09nzMSpu8XHtPkiTHrJ5Az9CybfeQhTJ8D7saeBHpGhLPIVyA8lcL6ZmdKwY6Q==} + engines: {node: '>=12.0.0'} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdir-glob@1.1.3: + resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + responselike@2.0.1: + resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + + retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + roarr@2.15.4: + resolution: {integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==} + engines: {node: '>=8.0'} + + rollup@4.34.6: + resolution: {integrity: sha512-wc2cBWqJgkU3Iz5oztRkQbfVkbxoz5EhnCGOrnJvnLnQ7O0WhQUYyv18qQI79O8L7DdHrrlJNeCHd4VGpnaXKQ==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sanitize-filename@1.6.3: + resolution: {integrity: sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==} + + sax@1.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + + semver-compare@1.0.0: + resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + engines: {node: '>=10'} + hasBin: true + + serialize-error@7.0.1: + resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} + engines: {node: '>=10'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-update-notifier@2.0.0: + resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} + engines: {node: '>=10'} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slice-ansi@3.0.0: + resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} + engines: {node: '>=8'} + + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + + stat-mode@1.0.0: + resolution: {integrity: sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==} + engines: {node: '>= 6'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + sumchecker@3.0.1: + resolution: {integrity: sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==} + engines: {node: '>= 8.0'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + synckit@0.9.2: + resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==} + engines: {node: ^14.18.0 || >=16.0.0} + + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + + tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + + temp-file@3.4.0: + resolution: {integrity: sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + tmp-promise@3.0.3: + resolution: {integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==} + + tmp@0.2.3: + resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} + engines: {node: '>=14.14'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + truncate-utf8-bytes@1.0.2: + resolution: {integrity: sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==} + + ts-api-utils@1.4.3: + resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-fest@0.13.1: + resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} + engines: {node: '>=10'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + typescript@5.7.3: + resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + update-browserslist-db@1.1.2: + resolution: {integrity: sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + utf8-byte-length@1.0.5: + resolution: {integrity: sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + verror@1.10.1: + resolution: {integrity: sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==} + engines: {node: '>=0.6.0'} + + vite@5.4.14: + resolution: {integrity: sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + xmlbuilder@15.1.1: + resolution: {integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==} + engines: {node: '>=8.0'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + zip-stream@4.1.1: + resolution: {integrity: sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==} + engines: {node: '>= 10'} + +snapshots: + + 7zip-bin@5.2.0: {} + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + + '@babel/code-frame@7.26.2': + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.26.8': {} + + '@babel/core@7.26.8': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.8 + '@babel/helper-compilation-targets': 7.26.5 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.8) + '@babel/helpers': 7.26.7 + '@babel/parser': 7.26.8 + '@babel/template': 7.26.8 + '@babel/traverse': 7.26.8 + '@babel/types': 7.26.8 + '@types/gensync': 1.0.4 + convert-source-map: 2.0.0 + debug: 4.4.0 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.26.8': + dependencies: + '@babel/parser': 7.26.8 + '@babel/types': 7.26.8 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.26.5': + dependencies: + '@babel/compat-data': 7.26.8 + '@babel/helper-validator-option': 7.25.9 + browserslist: 4.24.4 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-module-imports@7.25.9': + dependencies: + '@babel/traverse': 7.26.8 + '@babel/types': 7.26.8 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.8)': + dependencies: + '@babel/core': 7.26.8 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.26.8 + transitivePeerDependencies: + - supports-color + + '@babel/helper-plugin-utils@7.26.5': {} + + '@babel/helper-string-parser@7.25.9': {} + + '@babel/helper-validator-identifier@7.25.9': {} + + '@babel/helper-validator-option@7.25.9': {} + + '@babel/helpers@7.26.7': + dependencies: + '@babel/template': 7.26.8 + '@babel/types': 7.26.8 + + '@babel/parser@7.26.8': + dependencies: + '@babel/types': 7.26.8 + + '@babel/plugin-transform-arrow-functions@7.25.9(@babel/core@7.26.8)': + dependencies: + '@babel/core': 7.26.8 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/template@7.26.8': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.26.8 + '@babel/types': 7.26.8 + + '@babel/traverse@7.26.8': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.8 + '@babel/parser': 7.26.8 + '@babel/template': 7.26.8 + '@babel/types': 7.26.8 + debug: 4.4.0 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.26.8': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + + '@develar/schema-utils@2.6.5': + dependencies: + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + + '@electron-toolkit/eslint-config-prettier@2.0.0(eslint@8.57.1)(prettier@3.5.0)': + dependencies: + eslint: 8.57.1 + eslint-config-prettier: 9.1.0(eslint@8.57.1) + eslint-plugin-prettier: 5.2.3(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.5.0) + prettier: 3.5.0 + transitivePeerDependencies: + - '@types/eslint' + + '@electron-toolkit/eslint-config-ts@2.0.0(eslint@8.57.1)(typescript@5.7.3)': + dependencies: + '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3) + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.7.3) + eslint: 8.57.1 + optionalDependencies: + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@electron-toolkit/preload@3.0.1(electron@31.7.7)': + dependencies: + electron: 31.7.7 + + '@electron-toolkit/tsconfig@1.0.1(@types/node@20.17.17)': + dependencies: + '@types/node': 20.17.17 + + '@electron-toolkit/utils@3.0.0(electron@31.7.7)': + dependencies: + electron: 31.7.7 + + '@electron/asar@3.2.18': + dependencies: + commander: 5.1.0 + glob: 7.2.3 + minimatch: 3.1.2 + + '@electron/get@2.0.3': + dependencies: + debug: 4.4.0 + env-paths: 2.2.1 + fs-extra: 8.1.0 + got: 11.8.6 + progress: 2.0.3 + semver: 6.3.1 + sumchecker: 3.0.1 + optionalDependencies: + global-agent: 3.0.0 + transitivePeerDependencies: + - supports-color + + '@electron/notarize@2.2.1': + dependencies: + debug: 4.4.0 + fs-extra: 9.1.0 + promise-retry: 2.0.1 + transitivePeerDependencies: + - supports-color + + '@electron/osx-sign@1.0.5': + dependencies: + compare-version: 0.1.2 + debug: 4.4.0 + fs-extra: 10.1.0 + isbinaryfile: 4.0.10 + minimist: 1.2.8 + plist: 3.1.0 + transitivePeerDependencies: + - supports-color + + '@electron/universal@1.5.1': + dependencies: + '@electron/asar': 3.2.18 + '@malept/cross-spawn-promise': 1.1.1 + debug: 4.4.0 + dir-compare: 3.3.0 + fs-extra: 9.1.0 + minimatch: 3.1.2 + plist: 3.1.0 + transitivePeerDependencies: + - supports-color + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@eslint-community/eslint-utils@4.4.1(eslint@8.57.1)': + dependencies: + eslint: 8.57.1 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.1': {} + + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.12.6 + debug: 4.4.0 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@8.57.1': {} + + '@humanwhocodes/config-array@0.13.0': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.4.0 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@jridgewell/gen-mapping@0.3.8': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@malept/cross-spawn-promise@1.1.1': + dependencies: + cross-spawn: 7.0.6 + + '@malept/flatpak-bundler@0.4.0': + dependencies: + debug: 4.4.0 + fs-extra: 9.1.0 + lodash: 4.17.21 + tmp-promise: 3.0.3 + transitivePeerDependencies: + - supports-color + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.0 + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@pkgr/core@0.1.1': {} + + '@rollup/rollup-android-arm-eabi@4.34.6': + optional: true + + '@rollup/rollup-android-arm64@4.34.6': + optional: true + + '@rollup/rollup-darwin-arm64@4.34.6': + optional: true + + '@rollup/rollup-darwin-x64@4.34.6': + optional: true + + '@rollup/rollup-freebsd-arm64@4.34.6': + optional: true + + '@rollup/rollup-freebsd-x64@4.34.6': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.34.6': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.34.6': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.34.6': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.34.6': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.34.6': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.34.6': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.34.6': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.34.6': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.34.6': + optional: true + + '@rollup/rollup-linux-x64-musl@4.34.6': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.34.6': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.34.6': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.34.6': + optional: true + + '@sindresorhus/is@4.6.0': {} + + '@szmarczak/http-timer@4.0.6': + dependencies: + defer-to-connect: 2.0.1 + + '@tootallnate/once@2.0.0': {} + + '@types/cacheable-request@6.0.3': + dependencies: + '@types/http-cache-semantics': 4.0.4 + '@types/keyv': 3.1.4 + '@types/node': 20.17.17 + '@types/responselike': 1.0.3 + + '@types/debug@4.1.12': + dependencies: + '@types/ms': 2.1.0 + + '@types/estree@1.0.6': {} + + '@types/fs-extra@9.0.13': + dependencies: + '@types/node': 20.17.17 + + '@types/gensync@1.0.4': {} + + '@types/http-cache-semantics@4.0.4': {} + + '@types/keyv@3.1.4': + dependencies: + '@types/node': 20.17.17 + + '@types/ms@2.1.0': {} + + '@types/node@20.17.17': + dependencies: + undici-types: 6.19.8 + + '@types/plist@3.0.5': + dependencies: + '@types/node': 20.17.17 + xmlbuilder: 15.1.1 + optional: true + + '@types/responselike@1.0.3': + dependencies: + '@types/node': 20.17.17 + + '@types/verror@1.10.10': + optional: true + + '@types/yauzl@2.10.3': + dependencies: + '@types/node': 20.17.17 + optional: true + + '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.7.3) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.1)(typescript@5.7.3) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 7.18.0 + eslint: 8.57.1 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 1.4.3(typescript@5.7.3) + optionalDependencies: + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.3)': + dependencies: + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 7.18.0 + debug: 4.4.0 + eslint: 8.57.1 + optionalDependencies: + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@7.18.0': + dependencies: + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 + + '@typescript-eslint/type-utils@7.18.0(eslint@8.57.1)(typescript@5.7.3)': + dependencies: + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.3) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.7.3) + debug: 4.4.0 + eslint: 8.57.1 + ts-api-utils: 1.4.3(typescript@5.7.3) + optionalDependencies: + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@7.18.0': {} + + '@typescript-eslint/typescript-estree@7.18.0(typescript@5.7.3)': + dependencies: + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 + debug: 4.4.0 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.1 + ts-api-utils: 1.4.3(typescript@5.7.3) + optionalDependencies: + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@5.7.3)': + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.3) + eslint: 8.57.1 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/visitor-keys@7.18.0': + dependencies: + '@typescript-eslint/types': 7.18.0 + eslint-visitor-keys: 3.4.3 + + '@ungap/structured-clone@1.3.0': {} + + '@xmldom/xmldom@0.8.10': {} + + acorn-jsx@5.3.2(acorn@8.14.0): + dependencies: + acorn: 8.14.0 + + acorn@8.14.0: {} + + agent-base@6.0.2: + dependencies: + debug: 4.4.0 + transitivePeerDependencies: + - supports-color + + ajv-keywords@3.5.2(ajv@6.12.6): + dependencies: + ajv: 6.12.6 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-regex@5.0.1: {} + + ansi-regex@6.1.0: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} + + app-builder-bin@4.0.0: {} + + app-builder-lib@24.13.3(dmg-builder@24.13.3)(electron-builder-squirrel-windows@24.13.3): + dependencies: + '@develar/schema-utils': 2.6.5 + '@electron/notarize': 2.2.1 + '@electron/osx-sign': 1.0.5 + '@electron/universal': 1.5.1 + '@malept/flatpak-bundler': 0.4.0 + '@types/fs-extra': 9.0.13 + async-exit-hook: 2.0.1 + bluebird-lst: 1.0.9 + builder-util: 24.13.1 + builder-util-runtime: 9.2.4 + chromium-pickle-js: 0.2.0 + debug: 4.4.0 + dmg-builder: 24.13.3(electron-builder-squirrel-windows@24.13.3) + ejs: 3.1.10 + electron-builder-squirrel-windows: 24.13.3(dmg-builder@24.13.3) + electron-publish: 24.13.1 + form-data: 4.0.1 + fs-extra: 10.1.0 + hosted-git-info: 4.1.0 + is-ci: 3.0.1 + isbinaryfile: 5.0.4 + js-yaml: 4.1.0 + lazy-val: 1.0.5 + minimatch: 5.1.6 + read-config-file: 6.3.2 + sanitize-filename: 1.6.3 + semver: 7.7.1 + tar: 6.2.1 + temp-file: 3.4.0 + transitivePeerDependencies: + - supports-color + + archiver-utils@2.1.0: + dependencies: + glob: 7.2.3 + graceful-fs: 4.2.11 + lazystream: 1.0.1 + lodash.defaults: 4.2.0 + lodash.difference: 4.5.0 + lodash.flatten: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.union: 4.6.0 + normalize-path: 3.0.0 + readable-stream: 2.3.8 + + archiver-utils@3.0.4: + dependencies: + glob: 7.2.3 + graceful-fs: 4.2.11 + lazystream: 1.0.1 + lodash.defaults: 4.2.0 + lodash.difference: 4.5.0 + lodash.flatten: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.union: 4.6.0 + normalize-path: 3.0.0 + readable-stream: 3.6.2 + + archiver@5.3.2: + dependencies: + archiver-utils: 2.1.0 + async: 3.2.6 + buffer-crc32: 0.2.13 + readable-stream: 3.6.2 + readdir-glob: 1.1.3 + tar-stream: 2.2.0 + zip-stream: 4.1.1 + + argparse@2.0.1: {} + + array-union@2.1.0: {} + + assert-plus@1.0.0: + optional: true + + astral-regex@2.0.0: + optional: true + + async-exit-hook@2.0.1: {} + + async@3.2.6: {} + + asynckit@0.4.0: {} + + at-least-node@1.0.0: {} + + balanced-match@1.0.2: {} + + base64-js@1.5.1: {} + + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + + bluebird-lst@1.0.9: + dependencies: + bluebird: 3.7.2 + + bluebird@3.7.2: {} + + boolean@3.2.0: + optional: true + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.24.4: + dependencies: + caniuse-lite: 1.0.30001699 + electron-to-chromium: 1.5.96 + node-releases: 2.0.19 + update-browserslist-db: 1.1.2(browserslist@4.24.4) + + buffer-crc32@0.2.13: {} + + buffer-equal@1.0.1: {} + + buffer-from@1.1.2: {} + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + builder-util-runtime@9.2.4: + dependencies: + debug: 4.4.0 + sax: 1.4.1 + transitivePeerDependencies: + - supports-color + + builder-util@24.13.1: + dependencies: + 7zip-bin: 5.2.0 + '@types/debug': 4.1.12 + app-builder-bin: 4.0.0 + bluebird-lst: 1.0.9 + builder-util-runtime: 9.2.4 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.0 + fs-extra: 10.1.0 + http-proxy-agent: 5.0.0 + https-proxy-agent: 5.0.1 + is-ci: 3.0.1 + js-yaml: 4.1.0 + source-map-support: 0.5.21 + stat-mode: 1.0.0 + temp-file: 3.4.0 + transitivePeerDependencies: + - supports-color + + cac@6.7.14: {} + + cacheable-lookup@5.0.4: {} + + cacheable-request@7.0.4: + dependencies: + clone-response: 1.0.3 + get-stream: 5.2.0 + http-cache-semantics: 4.1.1 + keyv: 4.5.4 + lowercase-keys: 2.0.0 + normalize-url: 6.1.0 + responselike: 2.0.1 + + callsites@3.1.0: {} + + caniuse-lite@1.0.30001699: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chownr@2.0.0: {} + + chromium-pickle-js@0.2.0: {} + + ci-info@3.9.0: {} + + cli-truncate@2.1.0: + dependencies: + slice-ansi: 3.0.0 + string-width: 4.2.3 + optional: true + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clone-response@1.0.3: + dependencies: + mimic-response: 1.0.1 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@5.1.0: {} + + compare-version@0.1.2: {} + + compress-commons@4.1.2: + dependencies: + buffer-crc32: 0.2.13 + crc32-stream: 4.0.3 + normalize-path: 3.0.0 + readable-stream: 3.6.2 + + concat-map@0.0.1: {} + + config-file-ts@0.2.6: + dependencies: + glob: 10.4.5 + typescript: 5.7.3 + + convert-source-map@2.0.0: {} + + core-util-is@1.0.2: + optional: true + + core-util-is@1.0.3: {} + + crc-32@1.2.2: {} + + crc32-stream@4.0.3: + dependencies: + crc-32: 1.2.2 + readable-stream: 3.6.2 + + crc@3.8.0: + dependencies: + buffer: 5.7.1 + optional: true + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + debug@4.4.0: + dependencies: + ms: 2.1.3 + + decompress-response@6.0.0: + dependencies: + mimic-response: 3.1.0 + + deep-is@0.1.4: {} + + defer-to-connect@2.0.1: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + optional: true + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + optional: true + + delayed-stream@1.0.0: {} + + detect-node@2.1.0: + optional: true + + dir-compare@3.3.0: + dependencies: + buffer-equal: 1.0.1 + minimatch: 3.1.2 + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + dmg-builder@24.13.3(electron-builder-squirrel-windows@24.13.3): + dependencies: + app-builder-lib: 24.13.3(dmg-builder@24.13.3)(electron-builder-squirrel-windows@24.13.3) + builder-util: 24.13.1 + builder-util-runtime: 9.2.4 + fs-extra: 10.1.0 + iconv-lite: 0.6.3 + js-yaml: 4.1.0 + optionalDependencies: + dmg-license: 1.0.11 + transitivePeerDependencies: + - electron-builder-squirrel-windows + - supports-color + + dmg-license@1.0.11: + dependencies: + '@types/plist': 3.0.5 + '@types/verror': 1.10.10 + ajv: 6.12.6 + crc: 3.8.0 + iconv-corefoundation: 1.1.7 + plist: 3.1.0 + smart-buffer: 4.2.0 + verror: 1.10.1 + optional: true + + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + + dotenv-expand@5.1.0: {} + + dotenv@9.0.2: {} + + eastasianwidth@0.2.0: {} + + ejs@3.1.10: + dependencies: + jake: 10.9.2 + + electron-builder-squirrel-windows@24.13.3(dmg-builder@24.13.3): + dependencies: + app-builder-lib: 24.13.3(dmg-builder@24.13.3)(electron-builder-squirrel-windows@24.13.3) + archiver: 5.3.2 + builder-util: 24.13.1 + fs-extra: 10.1.0 + transitivePeerDependencies: + - dmg-builder + - supports-color + + electron-builder@24.13.3(electron-builder-squirrel-windows@24.13.3): + dependencies: + app-builder-lib: 24.13.3(dmg-builder@24.13.3)(electron-builder-squirrel-windows@24.13.3) + builder-util: 24.13.1 + builder-util-runtime: 9.2.4 + chalk: 4.1.2 + dmg-builder: 24.13.3(electron-builder-squirrel-windows@24.13.3) + fs-extra: 10.1.0 + is-ci: 3.0.1 + lazy-val: 1.0.5 + read-config-file: 6.3.2 + simple-update-notifier: 2.0.0 + yargs: 17.7.2 + transitivePeerDependencies: + - electron-builder-squirrel-windows + - supports-color + + electron-publish@24.13.1: + dependencies: + '@types/fs-extra': 9.0.13 + builder-util: 24.13.1 + builder-util-runtime: 9.2.4 + chalk: 4.1.2 + fs-extra: 10.1.0 + lazy-val: 1.0.5 + mime: 2.6.0 + transitivePeerDependencies: + - supports-color + + electron-to-chromium@1.5.96: {} + + electron-vite@2.3.0(vite@5.4.14(@types/node@20.17.17)): + dependencies: + '@babel/core': 7.26.8 + '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.26.8) + cac: 6.7.14 + esbuild: 0.21.5 + magic-string: 0.30.17 + picocolors: 1.1.1 + vite: 5.4.14(@types/node@20.17.17) + transitivePeerDependencies: + - supports-color + + electron@31.7.7: + dependencies: + '@electron/get': 2.0.3 + '@types/node': 20.17.17 + extract-zip: 2.0.1 + transitivePeerDependencies: + - supports-color + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + end-of-stream@1.4.4: + dependencies: + once: 1.4.0 + + env-paths@2.2.1: {} + + err-code@2.0.3: {} + + es-define-property@1.0.1: + optional: true + + es-errors@1.3.0: + optional: true + + es6-error@4.1.1: + optional: true + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + escalade@3.2.0: {} + + escape-string-regexp@4.0.0: {} + + eslint-config-prettier@9.1.0(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + + eslint-plugin-prettier@5.2.3(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.5.0): + dependencies: + eslint: 8.57.1 + prettier: 3.5.0 + prettier-linter-helpers: 1.0.0 + synckit: 0.9.2 + optionalDependencies: + eslint-config-prettier: 9.1.0(eslint@8.57.1) + + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint@8.57.1: + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) + '@eslint-community/regexpp': 4.12.1 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.1 + '@humanwhocodes/config-array': 0.13.0 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.3.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.0 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + espree@9.6.1: + dependencies: + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + eslint-visitor-keys: 3.4.3 + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + esutils@2.0.3: {} + + extract-zip@2.0.1: + dependencies: + debug: 4.4.0 + get-stream: 5.2.0 + yauzl: 2.10.0 + optionalDependencies: + '@types/yauzl': 2.10.3 + transitivePeerDependencies: + - supports-color + + extsprintf@1.4.1: + optional: true + + fast-deep-equal@3.1.3: {} + + fast-diff@1.3.0: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fastq@1.19.0: + dependencies: + reusify: 1.0.4 + + fd-slicer@1.1.0: + dependencies: + pend: 1.2.0 + + file-entry-cache@6.0.1: + dependencies: + flat-cache: 3.2.0 + + filelist@1.0.4: + dependencies: + minimatch: 5.1.6 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@3.2.0: + dependencies: + flatted: 3.3.2 + keyv: 4.5.4 + rimraf: 3.0.2 + + flatted@3.3.2: {} + + foreground-child@3.3.0: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + form-data@4.0.1: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + fs-constants@1.0.0: {} + + fs-extra@10.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fs-extra@8.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs-extra@9.1.0: + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fs-minipass@2.1.0: + dependencies: + minipass: 3.3.6 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-stream@5.2.0: + dependencies: + pump: 3.0.2 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@10.4.5: + dependencies: + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + global-agent@3.0.0: + dependencies: + boolean: 3.2.0 + es6-error: 4.1.1 + matcher: 3.0.0 + roarr: 2.15.4 + semver: 7.7.1 + serialize-error: 7.0.1 + optional: true + + globals@11.12.0: {} + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + optional: true + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + gopd@1.2.0: + optional: true + + got@11.8.6: + dependencies: + '@sindresorhus/is': 4.6.0 + '@szmarczak/http-timer': 4.0.6 + '@types/cacheable-request': 6.0.3 + '@types/responselike': 1.0.3 + cacheable-lookup: 5.0.4 + cacheable-request: 7.0.4 + decompress-response: 6.0.0 + http2-wrapper: 1.0.3 + lowercase-keys: 2.0.0 + p-cancelable: 2.1.1 + responselike: 2.0.1 + + graceful-fs@4.2.11: {} + + graphemer@1.4.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + optional: true + + hosted-git-info@4.1.0: + dependencies: + lru-cache: 6.0.0 + + http-cache-semantics@4.1.1: {} + + http-proxy-agent@5.0.0: + dependencies: + '@tootallnate/once': 2.0.0 + agent-base: 6.0.2 + debug: 4.4.0 + transitivePeerDependencies: + - supports-color + + http2-wrapper@1.0.3: + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + + https-proxy-agent@5.0.1: + dependencies: + agent-base: 6.0.2 + debug: 4.4.0 + transitivePeerDependencies: + - supports-color + + iconv-corefoundation@1.1.7: + dependencies: + cli-truncate: 2.1.0 + node-addon-api: 1.7.2 + optional: true + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + ieee754@1.2.1: {} + + ignore@5.3.2: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + is-ci@3.0.1: + dependencies: + ci-info: 3.9.0 + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + is-path-inside@3.0.3: {} + + isarray@1.0.0: {} + + isbinaryfile@4.0.10: {} + + isbinaryfile@5.0.4: {} + + isexe@2.0.0: {} + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jake@10.9.2: + dependencies: + async: 3.2.6 + chalk: 4.1.2 + filelist: 1.0.4 + minimatch: 3.1.2 + + js-tokens@4.0.0: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsesc@3.1.0: {} + + json-buffer@3.0.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json-stringify-safe@5.0.1: + optional: true + + json5@2.2.3: {} + + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 + + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + lazy-val@1.0.5: {} + + lazystream@1.0.1: + dependencies: + readable-stream: 2.3.8 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.defaults@4.2.0: {} + + lodash.difference@4.5.0: {} + + lodash.flatten@4.4.0: {} + + lodash.isplainobject@4.0.6: {} + + lodash.merge@4.6.2: {} + + lodash.union@4.6.0: {} + + lodash@4.17.21: {} + + lowercase-keys@2.0.0: {} + + lru-cache@10.4.3: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + + magic-string@0.30.17: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + + matcher@3.0.0: + dependencies: + escape-string-regexp: 4.0.0 + optional: true + + merge2@1.4.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime@2.6.0: {} + + mimic-response@1.0.1: {} + + mimic-response@3.1.0: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.1 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minimist@1.2.8: {} + + minipass@3.3.6: + dependencies: + yallist: 4.0.0 + + minipass@5.0.0: {} + + minipass@7.1.2: {} + + minizlib@2.1.2: + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + + mkdirp@1.0.4: {} + + ms@2.1.3: {} + + nanoid@3.3.8: {} + + natural-compare@1.4.0: {} + + node-addon-api@1.7.2: + optional: true + + node-releases@2.0.19: {} + + normalize-path@3.0.0: {} + + normalize-url@6.1.0: {} + + object-keys@1.1.1: + optional: true + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + p-cancelable@2.1.1: {} + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + package-json-from-dist@1.0.1: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-type@4.0.0: {} + + pend@1.2.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + plist@3.1.0: + dependencies: + '@xmldom/xmldom': 0.8.10 + base64-js: 1.5.1 + xmlbuilder: 15.1.1 + + postcss@8.5.1: + dependencies: + nanoid: 3.3.8 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prelude-ls@1.2.1: {} + + prettier-linter-helpers@1.0.0: + dependencies: + fast-diff: 1.3.0 + + prettier@3.5.0: {} + + process-nextick-args@2.0.1: {} + + progress@2.0.3: {} + + promise-retry@2.0.1: + dependencies: + err-code: 2.0.3 + retry: 0.12.0 + + pump@3.0.2: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + punycode@2.3.1: {} + + queue-microtask@1.2.3: {} + + quick-lru@5.1.1: {} + + read-config-file@6.3.2: + dependencies: + config-file-ts: 0.2.6 + dotenv: 9.0.2 + dotenv-expand: 5.1.0 + js-yaml: 4.1.0 + json5: 2.2.3 + lazy-val: 1.0.5 + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdir-glob@1.1.3: + dependencies: + minimatch: 5.1.6 + + require-directory@2.1.1: {} + + resolve-alpn@1.2.1: {} + + resolve-from@4.0.0: {} + + responselike@2.0.1: + dependencies: + lowercase-keys: 2.0.0 + + retry@0.12.0: {} + + reusify@1.0.4: {} + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + roarr@2.15.4: + dependencies: + boolean: 3.2.0 + detect-node: 2.1.0 + globalthis: 1.0.4 + json-stringify-safe: 5.0.1 + semver-compare: 1.0.0 + sprintf-js: 1.1.3 + optional: true + + rollup@4.34.6: + dependencies: + '@types/estree': 1.0.6 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.34.6 + '@rollup/rollup-android-arm64': 4.34.6 + '@rollup/rollup-darwin-arm64': 4.34.6 + '@rollup/rollup-darwin-x64': 4.34.6 + '@rollup/rollup-freebsd-arm64': 4.34.6 + '@rollup/rollup-freebsd-x64': 4.34.6 + '@rollup/rollup-linux-arm-gnueabihf': 4.34.6 + '@rollup/rollup-linux-arm-musleabihf': 4.34.6 + '@rollup/rollup-linux-arm64-gnu': 4.34.6 + '@rollup/rollup-linux-arm64-musl': 4.34.6 + '@rollup/rollup-linux-loongarch64-gnu': 4.34.6 + '@rollup/rollup-linux-powerpc64le-gnu': 4.34.6 + '@rollup/rollup-linux-riscv64-gnu': 4.34.6 + '@rollup/rollup-linux-s390x-gnu': 4.34.6 + '@rollup/rollup-linux-x64-gnu': 4.34.6 + '@rollup/rollup-linux-x64-musl': 4.34.6 + '@rollup/rollup-win32-arm64-msvc': 4.34.6 + '@rollup/rollup-win32-ia32-msvc': 4.34.6 + '@rollup/rollup-win32-x64-msvc': 4.34.6 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + sanitize-filename@1.6.3: + dependencies: + truncate-utf8-bytes: 1.0.2 + + sax@1.4.1: {} + + semver-compare@1.0.0: + optional: true + + semver@6.3.1: {} + + semver@7.7.1: {} + + serialize-error@7.0.1: + dependencies: + type-fest: 0.13.1 + optional: true + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + signal-exit@4.1.0: {} + + simple-update-notifier@2.0.0: + dependencies: + semver: 7.7.1 + + slash@3.0.0: {} + + slice-ansi@3.0.0: + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + optional: true + + smart-buffer@4.2.0: + optional: true + + source-map-js@1.2.1: {} + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + sprintf-js@1.1.3: + optional: true + + stat-mode@1.0.0: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 + + strip-json-comments@3.1.1: {} + + sumchecker@3.0.1: + dependencies: + debug: 4.4.0 + transitivePeerDependencies: + - supports-color + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + synckit@0.9.2: + dependencies: + '@pkgr/core': 0.1.1 + tslib: 2.8.1 + + tar-stream@2.2.0: + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + + tar@6.2.1: + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + + temp-file@3.4.0: + dependencies: + async-exit-hook: 2.0.1 + fs-extra: 10.1.0 + + text-table@0.2.0: {} + + tmp-promise@3.0.3: + dependencies: + tmp: 0.2.3 + + tmp@0.2.3: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + truncate-utf8-bytes@1.0.2: + dependencies: + utf8-byte-length: 1.0.5 + + ts-api-utils@1.4.3(typescript@5.7.3): + dependencies: + typescript: 5.7.3 + + tslib@2.8.1: {} + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-fest@0.13.1: + optional: true + + type-fest@0.20.2: {} + + typescript@5.7.3: {} + + undici-types@6.19.8: {} + + universalify@0.1.2: {} + + universalify@2.0.1: {} + + update-browserslist-db@1.1.2(browserslist@4.24.4): + dependencies: + browserslist: 4.24.4 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + utf8-byte-length@1.0.5: {} + + util-deprecate@1.0.2: {} + + verror@1.10.1: + dependencies: + assert-plus: 1.0.0 + core-util-is: 1.0.2 + extsprintf: 1.4.1 + optional: true + + vite@5.4.14(@types/node@20.17.17): + dependencies: + esbuild: 0.21.5 + postcss: 8.5.1 + rollup: 4.34.6 + optionalDependencies: + '@types/node': 20.17.17 + fsevents: 2.3.3 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} + + xmlbuilder@15.1.1: {} + + y18n@5.0.8: {} + + yallist@3.1.1: {} + + yallist@4.0.0: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yauzl@2.10.0: + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + + yocto-queue@0.1.0: {} + + zip-stream@4.1.1: + dependencies: + archiver-utils: 3.0.4 + compress-commons: 4.1.2 + readable-stream: 3.6.2 diff --git a/examples/boops-typescript/src/main/index.ts b/examples/boops-typescript/src/main/index.ts new file mode 100644 index 0000000..8de3501 --- /dev/null +++ b/examples/boops-typescript/src/main/index.ts @@ -0,0 +1,112 @@ +import { app, shell, BrowserWindow, ipcMain } from 'electron' +import { join } from 'path' +import { electronApp, optimizer, is } from '@electron-toolkit/utils' +import { Events, RPCClient, register } from '../../../../dist' + +let mainWindow: BrowserWindow + +function createWindow(): void { + // Create the browser window. + mainWindow = new BrowserWindow({ + width: 900, + height: 670, + show: false, + autoHideMenuBar: true, + webPreferences: { + preload: join(__dirname, '../preload/index.js'), + sandbox: false + } + }) + + mainWindow.on('ready-to-show', () => { + mainWindow.show() + }) + + mainWindow.webContents.setWindowOpenHandler((details) => { + shell.openExternal(details.url) + return { action: 'deny' } + }) + + // HMR for renderer base on electron-vite cli. + // Load the remote URL for development or the local html file for production. + if (is.dev && process.env['ELECTRON_RENDERER_URL']) { + mainWindow.loadURL(process.env['ELECTRON_RENDERER_URL']) + } else { + mainWindow.loadFile(join(__dirname, '../renderer/index.html')) + } +} + +// This method will be called when Electron has finished +// initialization and is ready to create browser windows. +// Some APIs can only be used after this event occurs. +app.whenReady().then(() => { + // Set app user model id for windows + electronApp.setAppUserModelId('com.electron') + + // Default open or close DevTools by F12 in development + // and ignore CommandOrControl + R in production. + // see https://github.com/alex8088/electron-toolkit/tree/master/packages/utils + app.on('browser-window-created', (_, window) => { + optimizer.watchWindowShortcuts(window) + }) + + // IPC test + ipcMain.on('ping', () => console.log('pong')) + + createWindow() + + app.on('activate', function () { + // On macOS it's common to re-create a window in the app when the + // dock icon is clicked and there are no other windows open. + if (BrowserWindow.getAllWindows().length === 0) createWindow() + }) +}) + +// Quit when all windows are closed, except on macOS. There, it's common +// for applications and their menu bar to stay active until the user quits +// explicitly with Cmd + Q. +app.on('window-all-closed', () => { + if (process.platform !== 'darwin') { + app.quit() + } +}) + +// In this file you can include the rest of your app"s specific main process +// code. You can also put them in separate files and require them here. + +// Set this to your Client ID. +const clientId = '280984871685062656' + +// Only needed if you want to use spectate, join, or ask to join +register(clientId) + +const client = new RPCClient() +const startTimestamp = new Date().getTime() + +async function setActivity(): Promise { + if (!client || !mainWindow) { + return + } + + const boops = await mainWindow.webContents.executeJavaScript( + 'document.querySelector("#boops").innerText' + ) + + await client.setActivity({ + details: `booped ${boops} times`, + state: 'in slither party', + timestamps: { start: startTimestamp }, + instance: false + }) +} + +client.once(Events.Ready, async () => { + await setActivity() + + // Activity can only be set every 15 seconds + setInterval(async () => { + await setActivity() + }, 15e3) +}) + +client.login({ clientId }).catch(console.error) diff --git a/examples/boops-typescript/src/preload/index.d.ts b/examples/boops-typescript/src/preload/index.d.ts new file mode 100644 index 0000000..a153669 --- /dev/null +++ b/examples/boops-typescript/src/preload/index.d.ts @@ -0,0 +1,8 @@ +import { ElectronAPI } from '@electron-toolkit/preload' + +declare global { + interface Window { + electron: ElectronAPI + api: unknown + } +} diff --git a/examples/boops-typescript/src/preload/index.ts b/examples/boops-typescript/src/preload/index.ts new file mode 100644 index 0000000..2d18524 --- /dev/null +++ b/examples/boops-typescript/src/preload/index.ts @@ -0,0 +1,22 @@ +import { contextBridge } from 'electron' +import { electronAPI } from '@electron-toolkit/preload' + +// Custom APIs for renderer +const api = {} + +// Use `contextBridge` APIs to expose Electron APIs to +// renderer only if context isolation is enabled, otherwise +// just add to the DOM global. +if (process.contextIsolated) { + try { + contextBridge.exposeInMainWorld('electron', electronAPI) + contextBridge.exposeInMainWorld('api', api) + } catch (error) { + console.error(error) + } +} else { + // @ts-ignore (define in dts) + window.electron = electronAPI + // @ts-ignore (define in dts) + window.api = api +} diff --git a/examples/boops-typescript/src/renderer/index.html b/examples/boops-typescript/src/renderer/index.html new file mode 100644 index 0000000..d4a1ffc --- /dev/null +++ b/examples/boops-typescript/src/renderer/index.html @@ -0,0 +1,22 @@ + + + + + BOOP TEH SNEK (RPC TypeScript Example) + + + + + + + +

BOOP TEH SNEK

+
🐍
+

0 BOOPS

+ + + + diff --git a/examples/boops-typescript/src/renderer/src/renderer.ts b/examples/boops-typescript/src/renderer/src/renderer.ts new file mode 100644 index 0000000..f1ec896 --- /dev/null +++ b/examples/boops-typescript/src/renderer/src/renderer.ts @@ -0,0 +1,24 @@ +function init(): void { + window.addEventListener('DOMContentLoaded', () => { + const snek = document.querySelector('#snek')! + const counter = document.querySelector('#boops')! + + let boops = 0 + + function boop(): void { + boops += 1 + counter.innerHTML = `${boops} BOOPS` + } + + snek.onmousedown = (): void => { + snek.style['font-size'] = '550%' + boop() + } + + snek.onmouseup = (): void => { + snek.style['font-size'] = '500%' + } + }) +} + +init() diff --git a/examples/boops-typescript/src/renderer/styles.css b/examples/boops-typescript/src/renderer/styles.css new file mode 100644 index 0000000..ad08708 --- /dev/null +++ b/examples/boops-typescript/src/renderer/styles.css @@ -0,0 +1,46 @@ +body, +html { + margin: 0px; + height: 100%; + cursor: default; + font-family: sans-serif; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-app-region: drag; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +@media (prefers-color-scheme: dark) { + html { + background-color: black; + color: white; + } +} + +h1 { + text-align: center; + margin: auto; + padding-top: 1em; +} + +#game { + height: 60%; + display: grid; + -webkit-app-region: no-drag; +} + +#snek { + cursor: pointer; + font-size: 500%; + margin: auto; +} + +#boops { + text-align: center; + -webkit-app-region: no-drag; +} diff --git a/examples/boops-typescript/tsconfig.json b/examples/boops-typescript/tsconfig.json new file mode 100644 index 0000000..31bac6e --- /dev/null +++ b/examples/boops-typescript/tsconfig.json @@ -0,0 +1,4 @@ +{ + "files": [], + "references": [{ "path": "./tsconfig.node.json" }, { "path": "./tsconfig.web.json" }] +} diff --git a/examples/boops-typescript/tsconfig.node.json b/examples/boops-typescript/tsconfig.node.json new file mode 100644 index 0000000..db23a68 --- /dev/null +++ b/examples/boops-typescript/tsconfig.node.json @@ -0,0 +1,8 @@ +{ + "extends": "@electron-toolkit/tsconfig/tsconfig.node.json", + "include": ["electron.vite.config.*", "src/main/**/*", "src/preload/**/*"], + "compilerOptions": { + "composite": true, + "types": ["electron-vite/node"] + } +} diff --git a/examples/boops-typescript/tsconfig.web.json b/examples/boops-typescript/tsconfig.web.json new file mode 100644 index 0000000..9f8ebb6 --- /dev/null +++ b/examples/boops-typescript/tsconfig.web.json @@ -0,0 +1,7 @@ +{ + "extends": "@electron-toolkit/tsconfig/tsconfig.web.json", + "include": ["src/renderer/**/*.ts", "src/preload/*.d.ts"], + "compilerOptions": { + "composite": true + } +} diff --git a/examples/index.html b/examples/index.html deleted file mode 100644 index 0cbd092..0000000 --- a/examples/index.html +++ /dev/null @@ -1,15 +0,0 @@ - - - - - BOOP TEH SNEK (RPC Example) - - - -

BOOP TEH SNEK

-
🐍
-

0 BOOPS

- - - - diff --git a/examples/main.js b/examples/main.js deleted file mode 100644 index 93457f1..0000000 --- a/examples/main.js +++ /dev/null @@ -1,87 +0,0 @@ -'use strict'; - -/* eslint-disable no-console */ - -const { app, BrowserWindow } = require('electron'); -const path = require('path'); -const url = require('url'); -const DiscordRPC = require('../'); - -let mainWindow; - -function createWindow() { - mainWindow = new BrowserWindow({ - width: 340, - height: 380, - resizable: false, - titleBarStyle: 'hidden', - webPreferences: { - nodeIntegration: true, - }, - }); - - mainWindow.loadURL( - url.format({ - pathname: path.join(__dirname, 'index.html'), - protocol: 'file:', - slashes: true, - }), - ); - - mainWindow.on('closed', () => { - mainWindow = null; - }); -} - -app.on('ready', createWindow); - -app.on('window-all-closed', () => { - app.quit(); -}); - -app.on('activate', () => { - if (mainWindow === null) { - createWindow(); - } -}); - -// Set this to your Client ID. -const clientId = '280984871685062656'; - -// Only needed if you want to use spectate, join, or ask to join -DiscordRPC.register(clientId); - -const rpc = new DiscordRPC.Client({ transport: 'ipc' }); -const startTimestamp = new Date(); - -async function setActivity() { - if (!rpc || !mainWindow) { - return; - } - - const boops = await mainWindow.webContents.executeJavaScript('window.boops'); - - // You'll need to have snek_large and snek_small assets uploaded to - // https://discord.com/developers/applications//rich-presence/assets - rpc.setActivity({ - details: `booped ${boops} times`, - state: 'in slither party', - startTimestamp, - largeImageKey: 'snek_large', - largeImageText: 'tea is delicious', - smallImageKey: 'snek_small', - smallImageText: 'i am my own pillows', - instance: false, - }); -} - -rpc.on('ready', () => { - setActivity(); - - // activity can only be set every 15 seconds - setInterval(() => { - setActivity(); - }, 15e3); -}); - -rpc.login({ clientId }).catch(console.error); diff --git a/examples/renderer.js b/examples/renderer.js deleted file mode 100644 index 8f9d7aa..0000000 --- a/examples/renderer.js +++ /dev/null @@ -1,26 +0,0 @@ -'use strict'; - -/* eslint-env browser */ - -const { webFrame } = require('electron'); - -const snek = document.getElementById('snek'); -const counter = document.getElementById('boops'); - -webFrame.setVisualZoomLevelLimits(1, 1); -webFrame.setLayoutZoomLevelLimits(0, 0); - -window.boops = 0; -function boop() { - window.boops += 1; - counter.innerHTML = `${window.boops} BOOPS`; -} - -snek.onmousedown = () => { - snek.style['font-size'] = '550%'; - boop(); -}; - -snek.onmouseup = () => { - snek.style['font-size'] = '500%'; -}; diff --git a/examples/style.css b/examples/style.css deleted file mode 100644 index 5045688..0000000 --- a/examples/style.css +++ /dev/null @@ -1,37 +0,0 @@ -body, -html { - margin: 0px; - height: 100%; - cursor: default; - font-family: sans-serif; - -webkit-touch-callout: none; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - -webkit-app-region: drag; -} - -h1 { - text-align: center; - margin: auto; - padding-top: 1em; -} - -#game { - height: 60%; - display: grid; - -webkit-app-region: no-drag; -} - -#snek { - cursor: pointer; - font-size: 500%; - margin: auto; -} - -#boops { - text-align: center; - -webkit-app-region: no-drag; -} From 108b6e2f2921b9182609dd0f42cc736c72902825 Mon Sep 17 00:00:00 2001 From: Micah Benac Date: Sun, 9 Feb 2025 19:29:45 +0100 Subject: [PATCH 10/26] fix: types --- package.json | 3 +- src/client.ts | 5 ++-- src/constants.ts | 76 ++++++++++++++++++++++++------------------------ 3 files changed, 43 insertions(+), 41 deletions(-) diff --git a/package.json b/package.json index 654f364..6b16693 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,8 @@ "docs": "pnpm run build:docs && api-extractor run --local", "prepack": "pnpm run build && pnpm run lint", "changelog": "git cliff --prepend ./CHANGELOG.md -u -c ./cliff.toml -r ../../ --include-path 'packages/rpc/*'", - "release": "cliff-jumper" + "release": "cliff-jumper", + "skibidi": "tsc -p tsconfig.json && node dist/test/index.js" }, "type": "module", "exports": { diff --git a/src/client.ts b/src/client.ts index 42d5747..49743e4 100644 --- a/src/client.ts +++ b/src/client.ts @@ -13,6 +13,7 @@ import type { LobbyType, MappedRPCCommandsArgs, MappedRPCCommandsResultsData, + MappedRPCEventsDispatchData, NullableFields, RPCCallableCommands, RPCCertifiedDevice, @@ -76,7 +77,7 @@ function subKey(event: RPCEvents, args?: RPCSubscribeArgs) { /** * The client for interacting with Discord RPC */ -export class RPCClient extends AsyncEventEmitter { +export class RPCClient extends AsyncEventEmitter { public options: Partial; public accessToken: string | null; @@ -261,7 +262,7 @@ export class RPCClient extends AsyncEventEmitter { redirectUri, prompt, }: Partial = {}): Promise { - const rest = new REST().setToken(this.accessToken!); + const rest = new REST(); if (clientSecret) { const response = (await rest.post(`${Routes.oauth2TokenExchange()}/rpc`, { diff --git a/src/constants.ts b/src/constants.ts index 7935845..51b324d 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -3664,44 +3664,44 @@ export interface MappedRPCSubscribeEventsArgs { } export interface MappedRPCEventsDispatchData { - [RPCEvents.ActivityInvite]: RPCActivityInviteDispatchData; - [RPCEvents.ActivityJoin]: RPCActivityJoinDispatchData; - [RPCEvents.ActivityJoinRequest]: RPCActivityJoinRequestDispatchData; - [RPCEvents.ActivitySpectate]: RPCActivitySpectateDispatchData; - [RPCEvents.CaptureShortcutChange]: RPCCaptureShortcutChangeDispatchData; - [RPCEvents.ChannelCreate]: RPCChannelCreateDispatchData; - [RPCEvents.CurrentUserUpdate]: RPCCurrentUserUpdateDispatchData; - [RPCEvents.EntitlementCreate]: RPCEntitlementCreateDispatchData; - [RPCEvents.EntitlementDelete]: RPCEntitlementDeleteDispatchData; - [RPCEvents.Error]: RPCErrorDispatchData; - [RPCEvents.GameJoin]: RPCGameJoinDispatchData; - [RPCEvents.GameSpectate]: RPCGameSpectateDispatchData; - [RPCEvents.GuildCreate]: RPCGuildCreateDispatchData; - [RPCEvents.GuildStatus]: RPCGuildStatusDispatchData; - [RPCEvents.LobbyDelete]: RPCLobbyDeleteDispatchData; - [RPCEvents.LobbyMemberConnect]: RPCLobbyMemberConnectDispatchData; - [RPCEvents.LobbyMemberDisconnect]: RPCLobbyMemberDisconnectDispatchData; - [RPCEvents.LobbyMemberUpdate]: RPCLobbyMemberUpdateDispatchData; - [RPCEvents.LobbyMessage]: RPCLobbyMessageDispatchData; - [RPCEvents.LobbyUpdate]: RPCLobbyUpdateDispatchData; - [RPCEvents.MessageCreate]: RPCMessageCreateDispatchData; - [RPCEvents.MessageDelete]: RPCMessageDeleteDispatchData; - [RPCEvents.MessageUpdate]: RPCMessageUpdateDispatchData; - [RPCEvents.NotificationCreate]: RPCNotificationCreateDispatchData; - [RPCEvents.Overlay]: RPCOverlayDispatchData; - [RPCEvents.OverlayUpdate]: RPCOverlayUpdateDispatchData; - [RPCEvents.Ready]: RPCReadyDispatchData; - [RPCEvents.RelationshipUpdate]: RPCRelationshipUpdateDispatchData; - [RPCEvents.SpeakingStart]: RPCSpeakingStartDispatchData; - [RPCEvents.SpeakingStop]: RPCSpeakingStopDispatchData; - [RPCEvents.UserAchievementUpdate]: RPCUserAchievementUpdateDispatchData; - [RPCEvents.VoiceChannelSelect]: RPCVoiceChannelSelectDispatchData; - [RPCEvents.VoiceConnectionStatus]: RPCVoiceConnectionStatusDispatchData; - [RPCEvents.VoiceSettingsUpdate]: RPCVoiceSettingsUpdateDispatchData; - [RPCEvents.VoiceSettingsUpdate2]: RPCVoiceSettingsUpdate2DispatchData; - [RPCEvents.VoiceStateCreate]: RPCVoiceStateCreateDispatchData; - [RPCEvents.VoiceStateDelete]: RPCVoiceStateDeleteDispatchData; - [RPCEvents.VoiceStateUpdate]: RPCVoiceStateUpdateDispatchData; + [RPCEvents.ActivityInvite]: [RPCActivityInviteDispatchData]; + [RPCEvents.ActivityJoin]: [RPCActivityJoinDispatchData]; + [RPCEvents.ActivityJoinRequest]: [RPCActivityJoinRequestDispatchData]; + [RPCEvents.ActivitySpectate]: [RPCActivitySpectateDispatchData]; + [RPCEvents.CaptureShortcutChange]: [RPCCaptureShortcutChangeDispatchData]; + [RPCEvents.ChannelCreate]: [RPCChannelCreateDispatchData]; + [RPCEvents.CurrentUserUpdate]: [RPCCurrentUserUpdateDispatchData]; + [RPCEvents.EntitlementCreate]: [RPCEntitlementCreateDispatchData]; + [RPCEvents.EntitlementDelete]: [RPCEntitlementDeleteDispatchData]; + [RPCEvents.Error]: [RPCErrorDispatchData]; + [RPCEvents.GameJoin]: [RPCGameJoinDispatchData]; + [RPCEvents.GameSpectate]: [RPCGameSpectateDispatchData]; + [RPCEvents.GuildCreate]: [RPCGuildCreateDispatchData]; + [RPCEvents.GuildStatus]: [RPCGuildStatusDispatchData]; + [RPCEvents.LobbyDelete]: [RPCLobbyDeleteDispatchData]; + [RPCEvents.LobbyMemberConnect]: [RPCLobbyMemberConnectDispatchData]; + [RPCEvents.LobbyMemberDisconnect]: [RPCLobbyMemberDisconnectDispatchData]; + [RPCEvents.LobbyMemberUpdate]: [RPCLobbyMemberUpdateDispatchData]; + [RPCEvents.LobbyMessage]: [RPCLobbyMessageDispatchData]; + [RPCEvents.LobbyUpdate]: [RPCLobbyUpdateDispatchData]; + [RPCEvents.MessageCreate]: [RPCMessageCreateDispatchData]; + [RPCEvents.MessageDelete]: [RPCMessageDeleteDispatchData]; + [RPCEvents.MessageUpdate]: [RPCMessageUpdateDispatchData]; + [RPCEvents.NotificationCreate]: [RPCNotificationCreateDispatchData]; + [RPCEvents.Overlay]: [RPCOverlayDispatchData]; + [RPCEvents.OverlayUpdate]: [RPCOverlayUpdateDispatchData]; + [RPCEvents.Ready]: [RPCReadyDispatchData]; + [RPCEvents.RelationshipUpdate]: [RPCRelationshipUpdateDispatchData]; + [RPCEvents.SpeakingStart]: [RPCSpeakingStartDispatchData]; + [RPCEvents.SpeakingStop]: [RPCSpeakingStopDispatchData]; + [RPCEvents.UserAchievementUpdate]: [RPCUserAchievementUpdateDispatchData]; + [RPCEvents.VoiceChannelSelect]: [RPCVoiceChannelSelectDispatchData]; + [RPCEvents.VoiceConnectionStatus]: [RPCVoiceConnectionStatusDispatchData]; + [RPCEvents.VoiceSettingsUpdate]: [RPCVoiceSettingsUpdateDispatchData]; + [RPCEvents.VoiceSettingsUpdate2]: [RPCVoiceSettingsUpdate2DispatchData]; + [RPCEvents.VoiceStateCreate]: [RPCVoiceStateCreateDispatchData]; + [RPCEvents.VoiceStateDelete]: [RPCVoiceStateDeleteDispatchData]; + [RPCEvents.VoiceStateUpdate]: [RPCVoiceStateUpdateDispatchData]; } export type Nullable = T | null | undefined; From b4c3acd9e9a07d95a06852b974c854e41d183c9f Mon Sep 17 00:00:00 2001 From: Micah Benac Date: Sun, 9 Feb 2025 19:31:08 +0100 Subject: [PATCH 11/26] skibidi this, skibidi that, how about stop committing that line, Micah --- package.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/package.json b/package.json index 6b16693..654f364 100644 --- a/package.json +++ b/package.json @@ -13,8 +13,7 @@ "docs": "pnpm run build:docs && api-extractor run --local", "prepack": "pnpm run build && pnpm run lint", "changelog": "git cliff --prepend ./CHANGELOG.md -u -c ./cliff.toml -r ../../ --include-path 'packages/rpc/*'", - "release": "cliff-jumper", - "skibidi": "tsc -p tsconfig.json && node dist/test/index.js" + "release": "cliff-jumper" }, "type": "module", "exports": { From 8c952321a071363d2c5c61b74b7fe1d5c86dfa21 Mon Sep 17 00:00:00 2001 From: Micah Benac Date: Sun, 9 Feb 2025 21:23:09 +0100 Subject: [PATCH 12/26] fix-ish: man, idk, authorize is silly --- src/client.ts | 36 ++++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/src/client.ts b/src/client.ts index 49743e4..6d2a212 100644 --- a/src/client.ts +++ b/src/client.ts @@ -1,8 +1,6 @@ -import { REST } from '@discordjs/rest'; import { AsyncEventEmitter } from '@vladfrangu/async_event_emitter'; import { RESTPostOAuth2AccessTokenResult, - Routes, type APIUser, type OAuth2Scopes, type Snowflake, @@ -35,6 +33,7 @@ import type { RPCSetUserVoiceSettingsResultData, RPCSetVoiceSettingsArgs, RPCSubscribeArgs, + RPCUnsubscribeResultData, RPCUpdateLobbyArgs, } from './constants.js'; import { RPCCaptureShortcutAction, RPCCommands, RPCEvents } from './constants.js'; @@ -262,15 +261,23 @@ export class RPCClient extends AsyncEventEmitter { redirectUri, prompt, }: Partial = {}): Promise { - const rest = new REST(); + // TODO: lol, fix authorization issues + // const rest = new REST(); if (clientSecret) { - const response = (await rest.post(`${Routes.oauth2TokenExchange()}/rpc`, { + // const response = (await rest.post(`${Routes.oauth2TokenExchange()}/rpc`, { + // body: new URLSearchParams({ + // client_id: this.clientId!, + // client_secret: clientSecret, + // }), + // })) as Oauth2RPCTokenExchangeResult; + const response = (await fetch(`https://discord.com/api/oauth2/token/rpc`, { + method: 'POST', body: new URLSearchParams({ client_id: this.clientId!, client_secret: clientSecret, }), - })) as Oauth2RPCTokenExchangeResult; + }).then((res) => res.json())) as Oauth2RPCTokenExchangeResult; rpcToken = response.rpc_token; } @@ -281,7 +288,17 @@ export class RPCClient extends AsyncEventEmitter { rpc_token: rpcToken!, }); - const response = (await rest.post(Routes.oauth2TokenExchange(), { + // const response = (await rest.post(Routes.oauth2TokenExchange(), { + // body: new URLSearchParams({ + // client_id: this.clientId!, + // client_secret: clientSecret!, + // code, + // grant_type: 'authorization_code', + // redirect_uri: redirectUri!, + // }), + // })) as RESTPostOAuth2AccessTokenResult; + const response = (await fetch(`https://discord.com/api/oauth2/token`, { + method: 'POST', body: new URLSearchParams({ client_id: this.clientId!, client_secret: clientSecret!, @@ -289,7 +306,7 @@ export class RPCClient extends AsyncEventEmitter { grant_type: 'authorization_code', redirect_uri: redirectUri!, }), - })) as RESTPostOAuth2AccessTokenResult; + }).then((res) => res.json())) as RESTPostOAuth2AccessTokenResult; return response.access_token; } @@ -654,7 +671,10 @@ export class RPCClient extends AsyncEventEmitter { * @param event - Name of event e.g. `MESSAGE_CREATE` * @param args - Args for event e.g. `{ channel_id: '1234' }` */ - public async subscribe(event: RPCEvents, args: object): Promise { + public async subscribe( + event: Evt, + args?: RPCSubscribeArgs, + ): Promise<{ unsubscribe: () => Promise }> { await this.#request(RPCCommands.Subscribe, args, event); return { unsubscribe: async () => this.#request(RPCCommands.Unsubscribe, args, event), From c5f467c14ab51ae390d1acef4b3a6a7c4577df2b Mon Sep 17 00:00:00 2001 From: Micah Benac <66775276+OfficialSirH@users.noreply.github.com> Date: Sun, 9 Feb 2025 21:27:35 +0100 Subject: [PATCH 13/26] Update README.md Co-authored-by: Jiralite <33201955+Jiralite@users.noreply.github.com> --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c4093a4..c25c208 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ ### [Rich Presence Example](https://github.com/discordjs/RPC/blob/master/example) -### **Browser** Example +### Browser Example ```javascript const clientId = '287406016902594560'; From e255cd6081709c647f0c2f75033556620c6b9fc4 Mon Sep 17 00:00:00 2001 From: Micah Benac <66775276+OfficialSirH@users.noreply.github.com> Date: Sun, 9 Feb 2025 21:27:52 +0100 Subject: [PATCH 14/26] Update src/index.ts Co-authored-by: Jiralite <33201955+Jiralite@users.noreply.github.com> --- src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index 288c1ce..4c63615 100644 --- a/src/index.ts +++ b/src/index.ts @@ -5,7 +5,7 @@ export * from './RPCEventError.js'; export * from './util.js'; /** - * The {@link https://github.com/discordjs/discord.js/blob/main/packages/rpc#readme | @discordjs/rpc} version + * The {@link https://github.com/discordjs/RPC#readme | @discordjs/rpc} version * that you are currently using. */ // This needs to explicitly be `string` so it is not typed as a "const string" that gets injected by esbuild From d975f24add77a6379f164c8cbe8462b537809dec Mon Sep 17 00:00:00 2001 From: Micah Benac <66775276+OfficialSirH@users.noreply.github.com> Date: Sun, 9 Feb 2025 21:36:58 +0100 Subject: [PATCH 15/26] Update src/util.ts Co-authored-by: Jiralite <33201955+Jiralite@users.noreply.github.com> --- src/util.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/util.ts b/src/util.ts index 33539e1..56273ef 100644 --- a/src/util.ts +++ b/src/util.ts @@ -2,7 +2,7 @@ export let register: (scheme: string) => boolean = () => false; try { const { app } = require('electron'); register = app.setAsDefaultProtocolClient.bind(app); -} catch (err) { +} catch { try { register = require('register-scheme'); } catch (e) {} // eslint-disable-line no-empty From 7abb7b3df68644e0df456501d1e5262ec0e9dfd6 Mon Sep 17 00:00:00 2001 From: Micah Benac <66775276+OfficialSirH@users.noreply.github.com> Date: Sun, 9 Feb 2025 21:37:08 +0100 Subject: [PATCH 16/26] Update src/util.ts Co-authored-by: Jiralite <33201955+Jiralite@users.noreply.github.com> --- src/util.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/util.ts b/src/util.ts index 56273ef..9034d16 100644 --- a/src/util.ts +++ b/src/util.ts @@ -5,7 +5,7 @@ try { } catch { try { register = require('register-scheme'); - } catch (e) {} // eslint-disable-line no-empty + } catch {} // eslint-disable-line no-empty } export function getPid() { From 49d96b6b5033f949a144bba196c0dce594e7dc69 Mon Sep 17 00:00:00 2001 From: Micah Benac Date: Sun, 9 Feb 2025 21:34:05 +0100 Subject: [PATCH 17/26] chore: revert version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 654f364..cf16181 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package.json", "name": "discord-rpc", - "version": "0.1.0", + "version": "4.0.1", "description": "A simple RPC client for Discord", "scripts": { "build": "tsc --noEmit && tsup", From 93c250007d6f983bbbbbd4908ac3575f9bc5c4f2 Mon Sep 17 00:00:00 2001 From: Micah Benac Date: Sun, 9 Feb 2025 22:10:14 +0100 Subject: [PATCH 18/26] chore: jiralite obligations --- cliff.toml | 2 +- src/client.ts | 3 ++- src/ipc.ts | 14 +++++++++++--- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/cliff.toml b/cliff.toml index 2fc1fd6..bce29b7 100644 --- a/cliff.toml +++ b/cliff.toml @@ -69,7 +69,7 @@ commit_parsers = [ ] filter_commits = true protect_breaking_commits = true -tag_pattern = "@discordjs/rpc@[0-9]*" +tag_pattern = "^[0-9]+" ignore_tags = "" topo_order = false sort_commits = "newest" diff --git a/src/client.ts b/src/client.ts index 6d2a212..4e071d0 100644 --- a/src/client.ts +++ b/src/client.ts @@ -22,6 +22,7 @@ import type { RPCGetVoiceSettingsResultData, RPCLobbyMetadata, RPCMessage, + RPCMessagePayload, RPCOAuth2Application, RPCSelectTextChannelArgs, RPCSelectTextChannelResultData, @@ -213,7 +214,7 @@ export class RPCClient extends AsyncEventEmitter { if (cmd === RPCCommands.Subscribe || cmd === RPCCommands.Unsubscribe) { payload.evt = evt!; } - this.transport.send({ cmd, args, evt, nonce }); + this.transport.send(payload as RPCMessagePayload); this.#expected_nonces.set(nonce, { resolve, reject }); }, ); diff --git a/src/ipc.ts b/src/ipc.ts index 5f68ffd..fcb7bb1 100644 --- a/src/ipc.ts +++ b/src/ipc.ts @@ -15,6 +15,11 @@ enum OPCodes { Pong, } +interface HandshakePayload { + v: number; + client_id: string; +} + async function getIPCPath(id: number) { if (process.platform === 'win32') { return `\\\\?\\pipe\\discord-ipc-${id}`; @@ -69,7 +74,7 @@ async function getIPC(id = 0): Promise { // } // } -export function encode(op: number, data: RPCMessagePayload | string | {}) { +export function encode(op: number, data: RPCMessagePayload | string | HandshakePayload | Record) { const stringifiedData = JSON.stringify(data); const length = Buffer.byteLength(stringifiedData); const packet = Buffer.alloc(8 + length); @@ -141,7 +146,7 @@ export class IPCTransport extends AsyncEventEmitter { socket.write( encode(OPCodes.Handshake, { v: 1, - client_id: this.client.clientId, + client_id: this.client.clientId!, }), ); @@ -184,7 +189,10 @@ export class IPCTransport extends AsyncEventEmitter { this.emit('close', error); } - public send(data: RPCMessagePayload | string | {}, op = OPCodes.Frame) { + public send(data: string, op: OPCodes.Ping): void; + public send(data: RPCMessagePayload, op?: OPCodes.Frame | OPCodes.Pong): void; + public send(data: Record, op: OPCodes.Close): void; + public send(data: RPCMessagePayload | string | Record, op = OPCodes.Frame) { this.socket!.write(encode(op, data)); } From 12440a816e6891e9d88f0f0c250415c8c1bd6bed Mon Sep 17 00:00:00 2001 From: Micah Benac Date: Thu, 13 Feb 2025 21:04:56 +0100 Subject: [PATCH 19/26] refactor: several adjustments for clarity --- src/client.ts | 83 +++++++++++++++--------------------------------- src/constants.ts | 67 ++++++++++++++++++++++++++++++-------- src/util.ts | 16 ++++++++++ 3 files changed, 95 insertions(+), 71 deletions(-) diff --git a/src/client.ts b/src/client.ts index 4e071d0..a7361c5 100644 --- a/src/client.ts +++ b/src/client.ts @@ -1,6 +1,8 @@ import { AsyncEventEmitter } from '@vladfrangu/async_event_emitter'; import { RESTPostOAuth2AccessTokenResult, + RESTPostOAuth2AccessTokenURLEncodedData, + Routes, type APIUser, type OAuth2Scopes, type Snowflake, @@ -37,10 +39,10 @@ import type { RPCUnsubscribeResultData, RPCUpdateLobbyArgs, } from './constants.js'; -import { RPCCaptureShortcutAction, RPCCommands, RPCEvents } from './constants.js'; +import { Events, RPCCaptureShortcutAction, RPCCommands, RPCEvents } from './constants.js'; import { IPCTransport } from './ipc.js'; import { RPCEventError } from './RPCEventError.js'; -import { getPid } from './util.js'; +import { getPid, mergeRPCLoginOptions } from './util.js'; export interface RPCLoginOptions { accessToken: string; @@ -58,18 +60,10 @@ export interface RPCLoginOptions { * for authorization requests */ redirectUri?: string; - rpcToken: string; scopes: OAuth2Scopes[]; - tokenEndpoint: string; username: string; } -export interface RPCAuthorizationOptions extends Partial {} - -export interface Oauth2RPCTokenExchangeResult { - rpc_token: string; -} - function subKey(event: RPCEvents, args?: RPCSubscribeArgs) { return `${event}${JSON.stringify(args)}`; } @@ -136,7 +130,7 @@ export class RPCClient extends AsyncEventEmitter { this.clientId = clientId; const timeout = setTimeout(() => reject(new Error('RPC_CONNECTION_TIMEOUT')), 10e3); timeout.unref(); - this.once('connected', () => { + this.once(RPCEvents.Ready, () => { clearTimeout(timeout); resolve(this); }); @@ -146,7 +140,7 @@ export class RPCClient extends AsyncEventEmitter { exp_nonce.reject(new RPCEventError('connection closed')); } - this.emit('disconnected'); + this.emit(Events.Disconnected); reject(new Error('connection closed')); }); @@ -163,7 +157,6 @@ export class RPCClient extends AsyncEventEmitter { * Performs authentication flow. Automatically calls Client#connect if needed. * * @param options - Options for authentication. - * At least one property must be provided to perform login. * @example * logging in with a client id and secret * ```ts @@ -171,23 +164,24 @@ export class RPCClient extends AsyncEventEmitter { * ``` */ public async login(options: Partial = {}): Promise { - const { clientId } = options ?? this.options; + const finalizedOptions = mergeRPCLoginOptions(options, this.options); + const { clientId } = finalizedOptions; if (!clientId) { throw new Error('A client id must be provided to login'); } await this.connect(clientId); - if (!options.scopes) { - this.emit('ready'); + const { scopes } = finalizedOptions; + if (!scopes) { + this.emit(Events.ApplicationReady); return this; } - let { accessToken } = options ?? this.options; + let { accessToken } = finalizedOptions; if (!accessToken) { - accessToken = await this.authorize(options); + accessToken = await this.authorize(finalizedOptions); } - return this.authenticate(accessToken!); } @@ -231,7 +225,7 @@ export class RPCClient extends AsyncEventEmitter { this.user = message.data.user; } - this.emit('connected'); + this.emit(RPCEvents.Ready, message.data); } else if (message.cmd !== RPCCommands.Dispatch) { if (!this.#expected_nonces.has(message.nonce)) { return; @@ -257,58 +251,33 @@ export class RPCClient extends AsyncEventEmitter { */ private async authorize({ scopes, + clientId, clientSecret, - rpcToken, redirectUri, - prompt, }: Partial = {}): Promise { - // TODO: lol, fix authorization issues - // const rest = new REST(); - - if (clientSecret) { - // const response = (await rest.post(`${Routes.oauth2TokenExchange()}/rpc`, { - // body: new URLSearchParams({ - // client_id: this.clientId!, - // client_secret: clientSecret, - // }), - // })) as Oauth2RPCTokenExchangeResult; - const response = (await fetch(`https://discord.com/api/oauth2/token/rpc`, { - method: 'POST', - body: new URLSearchParams({ - client_id: this.clientId!, - client_secret: clientSecret, - }), - }).then((res) => res.json())) as Oauth2RPCTokenExchangeResult; - rpcToken = response.rpc_token; - } - const { code } = await this.#request(RPCCommands.Authorize, { scopes: scopes!, - client_id: this.clientId!, - prompt: prompt!, - rpc_token: rpcToken!, + client_id: clientId!, }); - // const response = (await rest.post(Routes.oauth2TokenExchange(), { - // body: new URLSearchParams({ - // client_id: this.clientId!, - // client_secret: clientSecret!, - // code, - // grant_type: 'authorization_code', - // redirect_uri: redirectUri!, - // }), - // })) as RESTPostOAuth2AccessTokenResult; - const response = (await fetch(`https://discord.com/api/oauth2/token`, { + const response = (await fetch(`https://discord.com/api${Routes.oauth2TokenExchange()}`, { method: 'POST', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + }, body: new URLSearchParams({ client_id: this.clientId!, client_secret: clientSecret!, code, grant_type: 'authorization_code', redirect_uri: redirectUri!, - }), + } satisfies RESTPostOAuth2AccessTokenURLEncodedData), }).then((res) => res.json())) as RESTPostOAuth2AccessTokenResult; + if (!('access_token' in response)) { + throw new Error(response); + } + return response.access_token; } @@ -323,7 +292,7 @@ export class RPCClient extends AsyncEventEmitter { this.accessToken = accessToken; this.application = application; this.user = user; - this.emit('ready'); + this.emit(Events.ApplicationReady); return this; }); } diff --git a/src/constants.ts b/src/constants.ts index 51b324d..b8249ff 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -15,6 +15,56 @@ import type { export const RPCVersion = '1'; +/** + * @unstable + */ +export interface RPCAPIMessageParsedContentOriginalMatch { + 0: string; + index: 0; +} + +/** + * @unstable + */ +export interface RPCAPIMessageParsedContentText { + type: 'text'; + originalMatch: RPCAPIMessageParsedContentOriginalMatch; + content: string; +} + +/** + * @unstable + */ +export interface RPCAPIMessageParsedContentMention { + type: 'mention'; + userId: Snowflake; + channelId: Snowflake; + guildId: Snowflake; + /** + * same as `userId` + */ + parsedUserId: Snowflake; + content: Omit; +} + +/** + * @unstable + */ +export interface RPCAPIMessage extends Omit { + /** + * the nickname of the user who sent the message + */ + nick?: string; + /** + * the color of the author's name + */ + author_color?: number; + /** + * the content of the message parsed into an array + */ + content_parsed: (RPCAPIMessageParsedContentText | RPCAPIMessageParsedContentMention)[]; +} + /** * @unstable */ @@ -745,15 +795,6 @@ export interface RPCAuthorizeArgs { * OAuth2 application id */ client_id: string; - /** - * one-time use RPC token - */ - rpc_token: string; - /** - * @unstable Authorize Arguments doesn't document this field - * https://discord.com/developers/docs/topics/oauth2#authorization-code-grant - */ - prompt?: 'consent' | 'none'; /** * scopes to authorize */ @@ -1088,8 +1129,7 @@ export interface RPCSetActivityArgs { * the rich presence to assign to the user */ activity?: Partial< - Omit & - Partial> + Omit & Partial> >; /** * the application's process id @@ -2132,7 +2172,7 @@ export interface RPCMessageCreateDispatchData { /** * message that was created */ - message: APIMessage; + message: RPCAPIMessage; } /** @@ -3487,8 +3527,7 @@ export type RPCMessagePayload = // TODO: get rid of all types above as they will be within discord-api-types soon export enum Events { - Ready = 'ready', - Connected = 'connected', + ApplicationReady = 'ready', Disconnected = 'disconnected', } diff --git a/src/util.ts b/src/util.ts index 9034d16..f2c53e5 100644 --- a/src/util.ts +++ b/src/util.ts @@ -1,3 +1,5 @@ +import { RPCLoginOptions } from './client'; + export let register: (scheme: string) => boolean = () => false; try { const { app } = require('electron'); @@ -15,3 +17,17 @@ export function getPid() { return null; } + +export function mergeRPCLoginOptions( + options: Partial, + otheroptions: Partial, +): RPCLoginOptions { + return { + clientId: options.clientId! ?? otheroptions.clientId!, + scopes: options.scopes! ?? otheroptions.scopes!, + clientSecret: options.clientSecret! ?? otheroptions.clientSecret!, + redirectUri: options.redirectUri! ?? otheroptions.redirectUri!, + accessToken: options.accessToken! ?? otheroptions.accessToken!, + username: options.username! ?? otheroptions.username!, + }; +} From 6876207055b97e15f86e1c1b0e2ed36d1515823e Mon Sep 17 00:00:00 2001 From: Micah Benac Date: Thu, 13 Feb 2025 23:49:31 +0100 Subject: [PATCH 20/26] fix: subscribe method types --- src/client.ts | 4 +- src/constants.ts | 105 ++++++++++++++++++++++++++--------------------- 2 files changed, 61 insertions(+), 48 deletions(-) diff --git a/src/client.ts b/src/client.ts index a7361c5..d9c9614 100644 --- a/src/client.ts +++ b/src/client.ts @@ -10,6 +10,7 @@ import { import { randomUUID } from 'node:crypto'; import { clearTimeout, setTimeout } from 'node:timers'; import type { + EventAndArgsParameters, LobbyType, MappedRPCCommandsArgs, MappedRPCCommandsResultsData, @@ -642,8 +643,7 @@ export class RPCClient extends AsyncEventEmitter { * @param args - Args for event e.g. `{ channel_id: '1234' }` */ public async subscribe( - event: Evt, - args?: RPCSubscribeArgs, + ...[event, args]: EventAndArgsParameters ): Promise<{ unsubscribe: () => Promise }> { await this.#request(RPCCommands.Subscribe, args, event); return { diff --git a/src/constants.ts b/src/constants.ts index b8249ff..5b85390 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -1777,54 +1777,59 @@ export enum RPCEvents { /** * @unstable */ +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export type RPCSubscribeActivityInviteArgs = Record; -export interface RPCSubscribeActivityInviteArgs {} +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export type RPCSubscribeActivityJoinArgs = Record; -export interface RPCSubscribeActivityJoinArgs {} +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export type RPCSubscribeActivityJoinRequestArgs = Record; -export interface RPCSubscribeActivityJoinRequestArgs {} - -export interface RPCSubscribeActivitySpectateArgs {} +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export type RPCSubscribeActivitySpectateArgs = Record; /** * @unstable */ +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export type RPCSubscribeCaptureShortcutChangeArgs = Record; -export interface RPCSubscribeCaptureShortcutChangeArgs {} - -export interface RPCSubscribeChannelCreateArgs {} +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export type RPCSubscribeChannelCreateArgs = Record; /** * @unstable */ - -export interface RPCSubscribeCurrentUserUpdateArgs {} +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export type RPCSubscribeCurrentUserUpdateArgs = Record; /** * @unstable */ - -export interface RPCSubscribeEntitlementCreateArgs {} +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export type RPCSubscribeEntitlementCreateArgs = Record; /** * @unstable */ - -export interface RPCSubscribeEntitlementDeleteArgs {} +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export type RPCSubscribeEntitlementDeleteArgs = Record; /** * @unstable */ - -export interface RPCSubscribeGameJoinArgs {} +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export type RPCSubscribeGameJoinArgs = Record; /** * @unstable */ +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export type RPCSubscribeGameSpectateArgs = Record; -export interface RPCSubscribeGameSpectateArgs {} - -export interface RPCSubscribeGuildCreateArgs {} +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export type RPCSubscribeGuildCreateArgs = Record; /** * https://discord.com/developers/docs/topics/rpc#guildstatus-guild-status-argument-structure @@ -1839,38 +1844,38 @@ export interface RPCSubscribeGuildStatusArgs { /** * @unstable */ - -export interface RPCSubscribeLobbyDeleteArgs {} +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export type RPCSubscribeLobbyDeleteArgs = Record; /** * @unstable */ - -export interface RPCSubscribeLobbyMemberConnectArgs {} +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export type RPCSubscribeLobbyMemberConnectArgs = Record; /** * @unstable */ - -export interface RPCSubscribeLobbyMemberDisconnectArgs {} +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export type RPCSubscribeLobbyMemberDisconnectArgs = Record; /** * @unstable */ - -export interface RPCSubscribeLobbyMemberUpdateArgs {} +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export type RPCSubscribeLobbyMemberUpdateArgs = Record; /** * @unstable */ - -export interface RPCSubscribeLobbyMessageArgs {} +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export type RPCSubscribeLobbyMessageArgs = Record; /** * @unstable */ - -export interface RPCSubscribeLobbyUpdateArgs {} +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export type RPCSubscribeLobbyUpdateArgs = Record; /** * https://discord.com/developers/docs/topics/rpc#messagecreatemessageupdatemessagedelete-message-argument-structure @@ -1902,25 +1907,26 @@ export interface RPCSubscribeMessageUpdateArgs { channel_id: Snowflake; } -export interface RPCSubscribeNotificationCreateArgs {} +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export type RPCSubscribeNotificationCreateArgs = Record; /** * @unstable */ - -export interface RPCSubscribeOverlayArgs {} +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export type RPCSubscribeOverlayArgs = Record; /** * @unstable */ - -export interface RPCSubscribeOverlayUpdateArgs {} +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export type RPCSubscribeOverlayUpdateArgs = Record; /** * @unstable */ - -export interface RPCSubscribeRelationshipUpdateArgs {} +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export type RPCSubscribeRelationshipUpdateArgs = Record; /** * https://discord.com/developers/docs/topics/rpc#speakingstartspeakingstop-speaking-argument-structure @@ -1945,24 +1951,26 @@ export interface RPCSubscribeSpeakingStopArgs { /** * @unstable */ +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export type RPCSubscribeUserAchievementUpdateArgs = Record; -export interface RPCSubscribeUserAchievementUpdateArgs {} - -export interface RPCSubscribeVoiceChannelSelectArgs {} +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export type RPCSubscribeVoiceChannelSelectArgs = Record; /** * @unstable */ +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export type RPCSubscribeVoiceConnectionStatusArgs = Record; -export interface RPCSubscribeVoiceConnectionStatusArgs {} - -export interface RPCSubscribeVoiceSettingsUpdateArgs {} +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export type RPCSubscribeVoiceSettingsUpdateArgs = Record; /** * @unstable */ - -export interface RPCSubscribeVoiceSettingsUpdate2Args {} +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export type RPCSubscribeVoiceSettingsUpdate2Args = Record; /** * https://discord.com/developers/docs/topics/rpc#voicestatecreatevoicestateupdatevoicestatedelete-voice-state-argument-structure @@ -3664,6 +3672,8 @@ export interface MappedRPCCommandsArgs { export type RPCCallableCommands = Exclude; export interface MappedRPCSubscribeEventsArgs { + [RPCEvents.Ready]: Record; + [RPCEvents.Error]: Record; [RPCEvents.ActivityInvite]: RPCSubscribeActivityInviteArgs; [RPCEvents.ActivityJoin]: RPCSubscribeActivityJoinArgs; [RPCEvents.ActivityJoinRequest]: RPCSubscribeActivityJoinRequestArgs; @@ -3743,6 +3753,9 @@ export interface MappedRPCEventsDispatchData { [RPCEvents.VoiceStateUpdate]: [RPCVoiceStateUpdateDispatchData]; } +export type EventAndArgsParameters = + MappedRPCSubscribeEventsArgs[Evt] extends Record ? [Evt] : [Evt, MappedRPCSubscribeEventsArgs[Evt]]; + export type Nullable = T | null | undefined; export type NullableFields = { From 5d82bc6cd606952104d203f55c06d3b11ae34ac6 Mon Sep 17 00:00:00 2001 From: Micah Benac Date: Fri, 14 Feb 2025 14:27:38 +0100 Subject: [PATCH 21/26] chore: jiralite mentioned changes --- package.json | 1 - pnpm-lock.yaml | 54 -------------------------------------------------- src/index.ts | 2 +- 3 files changed, 1 insertion(+), 56 deletions(-) diff --git a/package.json b/package.json index cf16181..7dd83ad 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,6 @@ "homepage": "https://discord.js.org", "funding": "https://github.com/discordjs/RPC?sponsor", "dependencies": { - "@discordjs/rest": "^2.4.2", "@vladfrangu/async_event_emitter": "^2.4.6", "discord-api-types": "^0.37.117" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c208c10..5ece821 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,9 +8,6 @@ importers: .: dependencies: - '@discordjs/rest': - specifier: ^2.4.2 - version: 2.4.2 '@vladfrangu/async_event_emitter': specifier: ^2.4.6 version: 2.4.6 @@ -142,18 +139,6 @@ packages: conventional-commits-parser: optional: true - '@discordjs/collection@2.1.1': - resolution: {integrity: sha512-LiSusze9Tc7qF03sLCujF5iZp7K+vRNEDBZ86FT9aQAv3vxMLihUvKvpsCWiQ2DJq1tVckopKm1rxomgNUc9hg==} - engines: {node: '>=18'} - - '@discordjs/rest@2.4.2': - resolution: {integrity: sha512-9bOvXYLQd5IBg/kKGuEFq3cstVxAMJ6wMxO2U3wjrgO+lHv8oNCT+BBRpuzVQh7BoXKvk/gpajceGvQUiRoJ8g==} - engines: {node: '>=18'} - - '@discordjs/util@1.1.1': - resolution: {integrity: sha512-eddz6UnOBEB1oITPinyrB2Pttej49M9FZQY8NxgEvc3tq6ZICZ19m70RsmzRdDHk80O9NoYN/25AqJl8vPVf/g==} - engines: {node: '>=18'} - '@es-joy/jsdoccomment@0.46.0': resolution: {integrity: sha512-C3Axuq1xd/9VqFZpW4YAzOx5O9q/LP46uIQy/iNDpHG3fmPa6TBtvfglMCs3RBiBxAIi0Go97r8+jvTt55XMyQ==} engines: {node: '>=16'} @@ -703,18 +688,10 @@ packages: '@rushstack/eslint-patch@1.10.5': resolution: {integrity: sha512-kkKUDVlII2DQiKy7UstOR1ErJP8kUKAQ4oa+SQtM0K+lPdmmjj0YnnxBgtTVYH7mUKtbsxeFC9y0AmK7Yb78/A==} - '@sapphire/async-queue@1.5.5': - resolution: {integrity: sha512-cvGzxbba6sav2zZkH8GPf2oGk9yYoD5qrNWdu9fRehifgnFZJMV+nuy2nON2roRO4yQQ+v7MK/Pktl/HgfsUXg==} - engines: {node: '>=v14.0.0', npm: '>=7.0.0'} - '@sapphire/result@2.7.2': resolution: {integrity: sha512-DJbCGmvi8UZAu/hh85auQL8bODFlpcS3cWjRJZ5/cXTLekmGvs/CrRxrIzwbA6+poyYojo5rK4qu8trmjfneog==} engines: {node: '>=v14.0.0', npm: '>=7.0.0'} - '@sapphire/snowflake@3.5.5': - resolution: {integrity: sha512-xzvBr1Q1c4lCe7i6sRnrofxeO1QTP/LKQ6A6qy0iB4x5yfiSfARMEQEghojzTNALDTcv8En04qYNIco9/K9eZQ==} - engines: {node: '>=v14.0.0', npm: '>=7.0.0'} - '@sapphire/utilities@3.17.0': resolution: {integrity: sha512-bbqjnKKrCgyT0C3+KOjIBzE6z6/v764EFuV7Uxw9WeIdkqGhwepl6tuNEzgiek/JdtEcODaPeX0K1aCt53yCcA==} engines: {node: '>=v14.0.0'} @@ -2338,9 +2315,6 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - magic-bytes.js@1.10.0: - resolution: {integrity: sha512-/k20Lg2q8LE5xiaaSkMXk4sfvI+9EGEykFS4b0CHHGWqDYU0bGUFSwchNOMA56D7TCs9GwVTkqe9als1/ns8UQ==} - magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} @@ -3310,10 +3284,6 @@ packages: undici-types@6.20.0: resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} - undici@6.19.8: - resolution: {integrity: sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g==} - engines: {node: '>=18.17'} - unicorn-magic@0.3.0: resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} engines: {node: '>=18'} @@ -3646,22 +3616,6 @@ snapshots: conventional-commits-filter: 5.0.0 conventional-commits-parser: 6.0.0 - '@discordjs/collection@2.1.1': {} - - '@discordjs/rest@2.4.2': - dependencies: - '@discordjs/collection': 2.1.1 - '@discordjs/util': 1.1.1 - '@sapphire/async-queue': 1.5.5 - '@sapphire/snowflake': 3.5.5 - '@vladfrangu/async_event_emitter': 2.4.6 - discord-api-types: 0.37.119 - magic-bytes.js: 1.10.0 - tslib: 2.8.1 - undici: 6.19.8 - - '@discordjs/util@1.1.1': {} - '@es-joy/jsdoccomment@0.46.0': dependencies: comment-parser: 1.4.1 @@ -4087,12 +4041,8 @@ snapshots: '@rushstack/eslint-patch@1.10.5': {} - '@sapphire/async-queue@1.5.5': {} - '@sapphire/result@2.7.2': {} - '@sapphire/snowflake@3.5.5': {} - '@sapphire/utilities@3.17.0': {} '@sec-ant/readable-stream@0.4.1': {} @@ -6058,8 +6008,6 @@ snapshots: lru-cache@10.4.3: {} - magic-bytes.js@1.10.0: {} - magic-string@0.30.17: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 @@ -7296,8 +7244,6 @@ snapshots: undici-types@6.20.0: {} - undici@6.19.8: {} - unicorn-magic@0.3.0: {} unified-engine@11.2.2: diff --git a/src/index.ts b/src/index.ts index 4c63615..f1dd466 100644 --- a/src/index.ts +++ b/src/index.ts @@ -5,7 +5,7 @@ export * from './RPCEventError.js'; export * from './util.js'; /** - * The {@link https://github.com/discordjs/RPC#readme | @discordjs/rpc} version + * The {@link https://github.com/discordjs/RPC#readme | discord-rpc} version * that you are currently using. */ // This needs to explicitly be `string` so it is not typed as a "const string" that gets injected by esbuild From afcc2019064a963146550b6848522ae81fedd1f6 Mon Sep 17 00:00:00 2001 From: Micah Benac Date: Mon, 24 Feb 2025 03:16:04 +0100 Subject: [PATCH 22/26] add: more types/adjustments --- src/client.ts | 89 +++++++++++---------------------------------- src/constants.ts | 94 +++++++++++++++++++++++++++++------------------- 2 files changed, 78 insertions(+), 105 deletions(-) diff --git a/src/client.ts b/src/client.ts index d9c9614..93e03b5 100644 --- a/src/client.ts +++ b/src/client.ts @@ -11,19 +11,19 @@ import { randomUUID } from 'node:crypto'; import { clearTimeout, setTimeout } from 'node:timers'; import type { EventAndArgsParameters, - LobbyType, MappedRPCCommandsArgs, MappedRPCCommandsResultsData, MappedRPCEventsDispatchData, NullableFields, RPCCallableCommands, RPCCertifiedDevice, + RPCConnectToLobbyArgs, + RPCCreateLobbyArgs, RPCGetChannelResultData, RPCGetChannelsResultData, RPCGetGuildResultData, RPCGetGuildsResultData, RPCGetVoiceSettingsResultData, - RPCLobbyMetadata, RPCMessage, RPCMessagePayload, RPCOAuth2Application, @@ -31,16 +31,17 @@ import type { RPCSelectTextChannelResultData, RPCSelectVoiceChannelArgs, RPCSelectVoiceChannelResultData, + RPCSendToLobbyArgs, RPCSetActivityArgs, RPCSetCertifiedDevicesResultData, RPCSetUserVoiceSettingsArgs, RPCSetUserVoiceSettingsResultData, RPCSetVoiceSettingsArgs, - RPCSubscribeArgs, RPCUnsubscribeResultData, RPCUpdateLobbyArgs, + RPCUpdateLobbyMemberArgs, } from './constants.js'; -import { Events, RPCCaptureShortcutAction, RPCCommands, RPCEvents } from './constants.js'; +import { Events, RPCCommands, RPCEvents } from './constants.js'; import { IPCTransport } from './ipc.js'; import { RPCEventError } from './RPCEventError.js'; import { getPid, mergeRPCLoginOptions } from './util.js'; @@ -65,10 +66,6 @@ export interface RPCLoginOptions { username: string; } -function subKey(event: RPCEvents, args?: RPCSubscribeArgs) { - return `${event}${JSON.stringify(args)}`; -} - /** * The client for interacting with Discord RPC */ @@ -98,8 +95,6 @@ export class RPCClient extends AsyncEventEmitter { */ #connectPromise: Promise | undefined; - #subscriptions: Map = new Map(); - public constructor(options: Partial = {}) { super(); @@ -422,29 +417,6 @@ export class RPCClient extends AsyncEventEmitter { return this.#request(RPCCommands.SetVoiceSettings, args); } - /** - * @unstable - * Capture a shortcut using the client - * The callback takes (key, stop) where `stop` is a function that will stop capturing. - * This `stop` function must be called before disconnecting or else the user will have - * to restart their client. - * - * @param {Function} callback Callback handling keys - * @returns {Promise} - */ - async captureShortcut(callback: Function): Promise { - const subid = subKey(RPCEvents.CaptureShortcutChange); - const stop = async () => { - this.#subscriptions.delete(subid); - return this.#request(RPCCommands.CaptureShortcut, { action: RPCCaptureShortcutAction.Stop }); - }; - - this.#subscriptions.set(subid, ({ shortcut }: { shortcut: unknown }) => { - callback(shortcut, stop); - }); - return this.#request(RPCCommands.CaptureShortcut, { action: RPCCaptureShortcutAction.Start }).then(() => stop); - } - /** * Sets the presence for the logged in user. * @@ -537,34 +509,26 @@ export class RPCClient extends AsyncEventEmitter { /** * @unstable - * @param type - * @param capacity - * @param metadata + * @param type lobby type + * @param capacity max capacity of the lobby + * @param metadata metadata of the lobby * @returns */ - public async createLobby(type: LobbyType, capacity: number, metadata: RPCLobbyMetadata) { - return this.#request(RPCCommands.CreateLobby, { - type, - capacity, - metadata, - }); + public async createLobby(createLobbyArgs: RPCCreateLobbyArgs) { + return this.#request(RPCCommands.CreateLobby, createLobbyArgs); } /** * @unstable - * @param id lobby id * @param updateLobbyArgs arguments to update the lobby * @returns */ - public async updateLobby( - id: string, - { type, owner_id, capacity, metadata }: Omit = {} as RPCUpdateLobbyArgs, - ) { + public async updateLobby({ id, type, owner_id, capacity, metadata }: RPCUpdateLobbyArgs = {} as RPCUpdateLobbyArgs) { return this.#request(RPCCommands.UpdateLobby, { id, - type, - owner_id, - capacity, + type: type!, + owner_id: owner_id!, + capacity: capacity!, metadata, }); } @@ -586,11 +550,8 @@ export class RPCClient extends AsyncEventEmitter { * @param secret secret to access the lobby * @returns connected lobby */ - public async connectToLobby(id: string, secret: string) { - return this.#request(RPCCommands.ConnectToLobby, { - id, - secret, - }); + public async connectToLobby(connectToLobbyArgs: RPCConnectToLobbyArgs) { + return this.#request(RPCCommands.ConnectToLobby, connectToLobbyArgs); } /** @@ -598,11 +559,8 @@ export class RPCClient extends AsyncEventEmitter { * @param lobbyId id of the lobby * @param data data to send */ - public async sendToLobby(lobbyId: string, data: unknown) { - return this.#request(RPCCommands.SendToLobby, { - id: lobbyId, - data, - }); + public async sendToLobby(sendToLobbyArgs: RPCSendToLobbyArgs) { + return this.#request(RPCCommands.SendToLobby, sendToLobbyArgs); } /** @@ -617,20 +575,15 @@ export class RPCClient extends AsyncEventEmitter { /** * @unstable - * @param lobbyId id of the lobby - * @param userId id of the user * @param metadata metadata to update */ - public async updateLobbyMember(lobbyId: string, userId: Snowflake, metadata: RPCLobbyMetadata) { - return this.#request(RPCCommands.UpdateLobbyMember, { - lobby_id: lobbyId, - user_id: userId, - metadata, - }); + public async updateLobbyMember(updateLobbyMemberArgs: RPCUpdateLobbyMemberArgs) { + return this.#request(RPCCommands.UpdateLobbyMember, updateLobbyMemberArgs); } /** * @unstable + * requires `relationships.read` scope */ public async getRelationships() { return this.#request(RPCCommands.GetRelationships); diff --git a/src/constants.ts b/src/constants.ts index 5b85390..ab49ac4 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -275,6 +275,14 @@ export interface RPCVoiceSettingsMode { * voice setting mode type (can be `PUSH_TO_TALK` or `VOICE_ACTIVITY`) */ type: RPCVoiceSettingsModeType; + /** + * shortcut key combos for PTT + */ + shortcut: RPCVoiceShortcutKeyCombo; + /** + * the PTT release delay (in ms) (min: 0, max: 2000) + */ + delay: number; } export enum VoiceConnectionStates { @@ -1277,7 +1285,16 @@ export interface RPCConnectToLobbyResultData {} /** * @unstable */ -export interface RPCConnectToLobbyArgs {} +export interface RPCConnectToLobbyArgs { + /** + * @unstable id of the lobby to connect to + */ + id: Snowflake; + /** + * @unstable secret for the lobby + */ + secret: string; +} /** * @unstable @@ -1555,7 +1572,16 @@ export interface RPCSendToLobbyResultData {} /** * @unstable */ -export interface RPCSendToLobbyArgs {} +export interface RPCSendToLobbyArgs { + /** + * @unstable id of the lobby to send to + */ + id: Snowflake; + /** + * @unstable data to send + */ + data: unknown; +} export type RPCSetCertifiedDevicesResultData = null; /** @@ -1628,19 +1654,19 @@ export interface RPCUpdateLobbyArgs { /** * lobby type */ - type: LobbyType; + type?: LobbyType; /** * id of the owner of the lobby */ - owner_id: Snowflake; + owner_id?: Snowflake; /** * capacity of the lobby */ - capacity: number; + capacity?: number; /** * metadata for the lobby */ - metadata: RPCLobbyMetadata; + metadata?: RPCLobbyMetadata; } /** @@ -1650,7 +1676,20 @@ export interface RPCUpdateLobbyMemberResultData {} /** * @unstable */ -export interface RPCUpdateLobbyMemberArgs {} +export interface RPCUpdateLobbyMemberArgs { + /** + * @unstable id of the lobby the member is from + */ + lobby_id: Snowflake; + /** + * @unstable id of the member to update + */ + user_id: Snowflake; + /** + * @unstable metadata for the member + */ + metadata?: RPCLobbyMetadata; +} /** * @unstable @@ -1672,10 +1711,6 @@ export enum RPCEvents { ActivityJoin = 'ACTIVITY_JOIN', ActivityJoinRequest = 'ACTIVITY_JOIN_REQUEST', ActivitySpectate = 'ACTIVITY_SPECTATE', - /** - * @unstable - */ - CaptureShortcutChange = 'CAPTURE_SHORTCUT_CHANGE', ChannelCreate = 'CHANNEL_CREATE', CurrentUserUpdate = 'CURRENT_USER_UPDATE', /** @@ -2038,17 +2073,6 @@ export interface RPCActivitySpectateDispatchData { secret: string; } -/** - * @unstable - */ - -export interface RPCCaptureShortcutChangeDispatchData { - /** - * the shortcut the user has pressed - */ - shortcut: string; -} - /** * https://discord.com/developers/docs/topics/rpc#channelcreate-channel-create-dispatch-data-structure */ @@ -2071,7 +2095,7 @@ export interface RPCChannelCreateDispatchData { * @unstable */ -export interface RPCCurrentUserUpdateDispatchData {} +export type RPCCurrentUserUpdateDispatchData = APIUser; /** * @unstable @@ -2296,6 +2320,11 @@ export interface RPCSpeakingStartDispatchData { * id of user who started speaking */ user_id: Snowflake; + /** + * @unstable + * id of channel where user is speaking + */ + channel_id: Snowflake; } /** @@ -2306,6 +2335,11 @@ export interface RPCSpeakingStopDispatchData { * id of user who stopped speaking */ user_id: Snowflake; + /** + * @unstable + * id of channel where user is speaking + */ + channel_id: Snowflake; } /** @@ -2518,7 +2552,6 @@ export type RPCCommandSubscribePayload = | RPCSubscribeActivityJoin | RPCSubscribeActivityJoinRequest | RPCSubscribeActivitySpectate - | RPCSubscribeCaptureShortcutChange | RPCSubscribeChannelCreate | RPCSubscribeCurrentUserUpdate | RPCSubscribeEntitlementCreate @@ -2767,11 +2800,6 @@ export interface RPCSubscribeActivitySpectate extends RPCSubscribeMessage { - args: RPCSubscribeCaptureShortcutChangeArgs; - evt: RPCEvents.CaptureShortcutChange; -} - export interface RPCSubscribeChannelCreate extends RPCSubscribeMessage { args: RPCSubscribeChannelCreateArgs; evt: RPCEvents.ChannelCreate; @@ -3255,11 +3283,6 @@ export interface RPCActivitySpectateDispatch extends BaseRPCMessage { - data: RPCCaptureShortcutChangeDispatchData; - evt: RPCEvents.CaptureShortcutChange; -} - export interface RPCChannelCreateDispatch extends BaseRPCMessage { data: RPCChannelCreateDispatchData; evt: RPCEvents.ChannelCreate; @@ -3432,7 +3455,6 @@ export type RPCEventsDispatch = | RPCActivityJoinDispatch | RPCActivityJoinRequestDispatch | RPCActivitySpectateDispatch - | RPCCaptureShortcutChangeDispatch | RPCChannelCreateDispatch | RPCCurrentUserUpdateDispatch | RPCEntitlementCreateDispatch @@ -3678,7 +3700,6 @@ export interface MappedRPCSubscribeEventsArgs { [RPCEvents.ActivityJoin]: RPCSubscribeActivityJoinArgs; [RPCEvents.ActivityJoinRequest]: RPCSubscribeActivityJoinRequestArgs; [RPCEvents.ActivitySpectate]: RPCSubscribeActivitySpectateArgs; - [RPCEvents.CaptureShortcutChange]: RPCSubscribeCaptureShortcutChangeArgs; [RPCEvents.ChannelCreate]: RPCSubscribeChannelCreateArgs; [RPCEvents.CurrentUserUpdate]: RPCSubscribeCurrentUserUpdateArgs; [RPCEvents.EntitlementCreate]: RPCSubscribeEntitlementCreateArgs; @@ -3717,7 +3738,6 @@ export interface MappedRPCEventsDispatchData { [RPCEvents.ActivityJoin]: [RPCActivityJoinDispatchData]; [RPCEvents.ActivityJoinRequest]: [RPCActivityJoinRequestDispatchData]; [RPCEvents.ActivitySpectate]: [RPCActivitySpectateDispatchData]; - [RPCEvents.CaptureShortcutChange]: [RPCCaptureShortcutChangeDispatchData]; [RPCEvents.ChannelCreate]: [RPCChannelCreateDispatchData]; [RPCEvents.CurrentUserUpdate]: [RPCCurrentUserUpdateDispatchData]; [RPCEvents.EntitlementCreate]: [RPCEntitlementCreateDispatchData]; From c0b7549a4e1a00c473a38b69e0bfbcaf3db3c6de Mon Sep 17 00:00:00 2001 From: Micah Benac Date: Tue, 25 Feb 2025 01:15:02 +0100 Subject: [PATCH 23/26] remove: lobby stuff --- src/client.ts | 93 +----------------------------------------------- src/constants.ts | 33 ++++------------- 2 files changed, 7 insertions(+), 119 deletions(-) diff --git a/src/client.ts b/src/client.ts index 93e03b5..22deed2 100644 --- a/src/client.ts +++ b/src/client.ts @@ -17,8 +17,6 @@ import type { NullableFields, RPCCallableCommands, RPCCertifiedDevice, - RPCConnectToLobbyArgs, - RPCCreateLobbyArgs, RPCGetChannelResultData, RPCGetChannelsResultData, RPCGetGuildResultData, @@ -31,15 +29,12 @@ import type { RPCSelectTextChannelResultData, RPCSelectVoiceChannelArgs, RPCSelectVoiceChannelResultData, - RPCSendToLobbyArgs, RPCSetActivityArgs, RPCSetCertifiedDevicesResultData, RPCSetUserVoiceSettingsArgs, RPCSetUserVoiceSettingsResultData, RPCSetVoiceSettingsArgs, RPCUnsubscribeResultData, - RPCUpdateLobbyArgs, - RPCUpdateLobbyMemberArgs, } from './constants.js'; import { Events, RPCCommands, RPCEvents } from './constants.js'; import { IPCTransport } from './ipc.js'; @@ -484,103 +479,17 @@ export class RPCClient extends AsyncEventEmitter { }); } - /** - * Request to join the game the user is playing - * - * @param userId The id of the user whose game you want to request to join - * @returns {Promise} - */ - public async sendJoinRequest(userId: Snowflake): Promise { - return this.#request(RPCCommands.SendActivityJoinRequest, { - user_id: userId, - }); - } - /** * Reject a join request from a user * * @param userId The id of the user whose request you wish to reject */ public async closeJoinRequest(userId: Snowflake): Promise { - return this.#request(RPCCommands.CloseActivityRequest, { + return this.#request(RPCCommands.CloseActivityJoinRequest, { user_id: userId, }); } - /** - * @unstable - * @param type lobby type - * @param capacity max capacity of the lobby - * @param metadata metadata of the lobby - * @returns - */ - public async createLobby(createLobbyArgs: RPCCreateLobbyArgs) { - return this.#request(RPCCommands.CreateLobby, createLobbyArgs); - } - - /** - * @unstable - * @param updateLobbyArgs arguments to update the lobby - * @returns - */ - public async updateLobby({ id, type, owner_id, capacity, metadata }: RPCUpdateLobbyArgs = {} as RPCUpdateLobbyArgs) { - return this.#request(RPCCommands.UpdateLobby, { - id, - type: type!, - owner_id: owner_id!, - capacity: capacity!, - metadata, - }); - } - - /** - * @unstable - * @param id lobby id - * @returns deleted lobby - */ - public async deleteLobby(id: string) { - return this.#request(RPCCommands.DeleteLobby, { - id, - }); - } - - /** - * @unstable - * @param id lobby id - * @param secret secret to access the lobby - * @returns connected lobby - */ - public async connectToLobby(connectToLobbyArgs: RPCConnectToLobbyArgs) { - return this.#request(RPCCommands.ConnectToLobby, connectToLobbyArgs); - } - - /** - * @unstable - * @param lobbyId id of the lobby - * @param data data to send - */ - public async sendToLobby(sendToLobbyArgs: RPCSendToLobbyArgs) { - return this.#request(RPCCommands.SendToLobby, sendToLobbyArgs); - } - - /** - * @unstable - * @param lobbyId id of the lobby - */ - public async disconnectFromLobby(lobbyId: string) { - return this.#request(RPCCommands.DisconnectFromLobby, { - id: lobbyId, - }); - } - - /** - * @unstable - * @param metadata metadata to update - */ - public async updateLobbyMember(updateLobbyMemberArgs: RPCUpdateLobbyMemberArgs) { - return this.#request(RPCCommands.UpdateLobbyMember, updateLobbyMemberArgs); - } - /** * @unstable * requires `relationships.read` scope diff --git a/src/constants.ts b/src/constants.ts index ab49ac4..b4fcfad 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -570,7 +570,7 @@ export enum RPCCommands { /** * used to reject a Rich Presence Ask to Join request */ - CloseActivityRequest = 'CLOSE_ACTIVITY_REQUEST', + CloseActivityJoinRequest = 'CLOSE_ACTIVITY_JOIN_REQUEST', /** * @unstable */ @@ -724,11 +724,6 @@ export enum RPCCommands { * Used to consent to a Rich Presence Ask to Join request */ SendActivityJoinInvite = 'SEND_ACTIVITY_JOIN_INVITE', - /** - * Request to join the game the user is playing - * @unstable - */ - SendActivityJoinRequest = 'SEND_ACTIVITY_JOIN_REQUEST', /** * @unstable */ @@ -1550,21 +1545,6 @@ export interface RPCSendActivityJoinInviteArgs { user_id: Snowflake; } -/** - * @unstable - */ -export interface RPCSendActivityJoinRequestResultData {} - -/** - * @unstable - */ -export interface RPCSendActivityJoinRequestArgs { - /** - * the id of the user to request to join - */ - user_id: Snowflake; -} - /** * @unstable */ @@ -2607,7 +2587,8 @@ export interface RPCCommandCaptureShortcutPayload extends RPCCommandMessage { +export interface RPCCommandCloseActivityJoinRequestPayload + extends RPCCommandMessage { args: RPCCloseActivityRequestArgs; } @@ -3032,7 +3013,7 @@ export interface RPCCaptureShortcutResult extends RPCCommandMessage { +export interface RPCCloseActivityRequestResult extends RPCCommandMessage { data: RPCCloseActivityRequestResultData; } @@ -3581,7 +3562,7 @@ export interface MappedRPCCommandsResultsData { [RPCCommands.BraintreePopupBridgeCallback]: RPCBraintreePopupBridgeCallbackResultData; [RPCCommands.BrowserHandoff]: RPCBrowserHandoffResultData; [RPCCommands.CaptureShortcut]: RPCCaptureShortcutResultData; - [RPCCommands.CloseActivityRequest]: RPCCloseActivityRequestResultData; + [RPCCommands.CloseActivityJoinRequest]: RPCCloseActivityRequestResultData; [RPCCommands.ConnectToLobby]: RPCConnectToLobbyResultData; [RPCCommands.ConnectToLobbyVoice]: RPCConnectToLobbyVoiceResultData; [RPCCommands.ConnectionsCallback]: RPCConnectionsCallbackResultData; @@ -3612,7 +3593,6 @@ export interface MappedRPCCommandsResultsData { [RPCCommands.Overlay]: RPCOverlayResultData; [RPCCommands.SearchLobbies]: RPCSearchLobbiesResultData; [RPCCommands.SendActivityJoinInvite]: RPCSendActivityJoinInviteResultData; - [RPCCommands.SendActivityJoinRequest]: RPCSendActivityJoinRequestResultData; [RPCCommands.SendToLobby]: RPCSendToLobbyResultData; [RPCCommands.SetCertifiedDevices]: RPCSetCertifiedDevicesResultData; [RPCCommands.SetOverlayLocked]: RPCSetOverlayLockedResultData; @@ -3646,7 +3626,7 @@ export interface MappedRPCCommandsArgs { [RPCCommands.BraintreePopupBridgeCallback]: RPCBraintreePopupBridgeCallbackArgs; [RPCCommands.BrowserHandoff]: RPCBrowserHandoffArgs; [RPCCommands.CaptureShortcut]: RPCCaptureShortcutArgs; - [RPCCommands.CloseActivityRequest]: RPCCloseActivityRequestArgs; + [RPCCommands.CloseActivityJoinRequest]: RPCCloseActivityRequestArgs; [RPCCommands.ConnectToLobby]: RPCConnectToLobbyArgs; [RPCCommands.ConnectToLobbyVoice]: RPCConnectToLobbyVoiceArgs; [RPCCommands.ConnectionsCallback]: RPCConnectionsCallbackArgs; @@ -3677,7 +3657,6 @@ export interface MappedRPCCommandsArgs { [RPCCommands.Overlay]: RPCOverlayArgs; [RPCCommands.SearchLobbies]: RPCSearchLobbiesArgs; [RPCCommands.SendActivityJoinInvite]: RPCSendActivityJoinInviteArgs; - [RPCCommands.SendActivityJoinRequest]: RPCSendActivityJoinRequestArgs; [RPCCommands.SendToLobby]: RPCSendToLobbyArgs; [RPCCommands.SetCertifiedDevices]: RPCSetCertifiedDevicesArgs; [RPCCommands.SetOverlayLocked]: RPCSetOverlayLockedArgs; From 404cca67c4250d65ebfc140067e542ce47f3d6fa Mon Sep 17 00:00:00 2001 From: Micah Benac Date: Tue, 25 Feb 2025 02:34:17 +0100 Subject: [PATCH 24/26] feat: more methods for commands --- src/client.ts | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/client.ts b/src/client.ts index 22deed2..01b17ec 100644 --- a/src/client.ts +++ b/src/client.ts @@ -17,10 +17,12 @@ import type { NullableFields, RPCCallableCommands, RPCCertifiedDevice, + RPCCreateChannelInviteResultData, RPCGetChannelResultData, RPCGetChannelsResultData, RPCGetGuildResultData, RPCGetGuildsResultData, + RPCGetImageArgs, RPCGetVoiceSettingsResultData, RPCMessage, RPCMessagePayload, @@ -326,6 +328,15 @@ export class RPCClient extends AsyncEventEmitter { return channels; } + /** + * Create channel invite + * + * @param id Channel Id + */ + async createChannelInvite(id: Snowflake): Promise { + return this.#request(RPCCommands.CreateChannelInvite, { channel_id: id }); + } + /** * Tell discord which devices are certified * @@ -498,6 +509,24 @@ export class RPCClient extends AsyncEventEmitter { return this.#request(RPCCommands.GetRelationships); } + /** + * Fetches a user + * + * @unstable + */ + public async getUser(id: Snowflake) { + return this.#request(RPCCommands.GetUser, { id }); + } + + /** + * Fetches a user's profile picture + * + * @unstable + */ + public async getImage({ id, format, size }: Omit): Promise { + return (await this.#request(RPCCommands.GetImage, { type: 'user', id, format, size })).data_url; + } + /** * Subscribe to an event * From e4a012ead504207e0e8540c126824c5bbcd6f80f Mon Sep 17 00:00:00 2001 From: Micah Benac Date: Thu, 10 Apr 2025 19:36:47 +0200 Subject: [PATCH 25/26] refactor(types): remove all types in place of discord-api-types --- package.json | 2 +- pnpm-lock.yaml | 10 +- src/RPCEventError.ts | 2 +- src/client.ts | 41 +- src/constants.ts | 3736 ++---------------------------------------- src/ipc.ts | 57 +- 6 files changed, 244 insertions(+), 3604 deletions(-) diff --git a/package.json b/package.json index 7dd83ad..19ded53 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,7 @@ "funding": "https://github.com/discordjs/RPC?sponsor", "dependencies": { "@vladfrangu/async_event_emitter": "^2.4.6", - "discord-api-types": "^0.37.117" + "discord-api-types": "^0.37.120" }, "devDependencies": { "@favware/cliff-jumper": "^4.1.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5ece821..bed5543 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,8 +12,8 @@ importers: specifier: ^2.4.6 version: 2.4.6 discord-api-types: - specifier: ^0.37.117 - version: 0.37.119 + specifier: ^0.37.120 + version: 0.37.120 devDependencies: '@favware/cliff-jumper': specifier: ^4.1.0 @@ -1333,8 +1333,8 @@ packages: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} - discord-api-types@0.37.119: - resolution: {integrity: sha512-WasbGFXEB+VQWXlo6IpW3oUv73Yuau1Ig4AZF/m13tXcTKnMpc/mHjpztIlz4+BM9FG9BHQkEXiPto3bKduQUg==} + discord-api-types@0.37.120: + resolution: {integrity: sha512-7xpNK0EiWjjDFp2nAhHXezE4OUWm7s1zhc/UXXN6hnFFU8dfoPHgV0Hx0RPiCa3ILRpdeh152icc68DGCyXYIw==} doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} @@ -4731,7 +4731,7 @@ snapshots: dependencies: path-type: 4.0.0 - discord-api-types@0.37.119: {} + discord-api-types@0.37.120: {} doctrine@2.1.0: dependencies: diff --git a/src/RPCEventError.ts b/src/RPCEventError.ts index 6e9a037..6961f2e 100644 --- a/src/RPCEventError.ts +++ b/src/RPCEventError.ts @@ -1,4 +1,4 @@ -import { RPCErrorCodes, RPCErrorDispatchData } from './constants.js'; +import { RPCErrorCodes, RPCErrorDispatchData } from 'discord-api-types/v10'; export class RPCEventError extends Error { code?: RPCErrorCodes; diff --git a/src/client.ts b/src/client.ts index 01b17ec..dad7c64 100644 --- a/src/client.ts +++ b/src/client.ts @@ -3,21 +3,10 @@ import { RESTPostOAuth2AccessTokenResult, RESTPostOAuth2AccessTokenURLEncodedData, Routes, - type APIUser, - type OAuth2Scopes, - type Snowflake, -} from 'discord-api-types/v10'; -import { randomUUID } from 'node:crypto'; -import { clearTimeout, setTimeout } from 'node:timers'; -import type { - EventAndArgsParameters, - MappedRPCCommandsArgs, - MappedRPCCommandsResultsData, - MappedRPCEventsDispatchData, - NullableFields, - RPCCallableCommands, RPCCertifiedDevice, + RPCCommands, RPCCreateChannelInviteResultData, + RPCEvents, RPCGetChannelResultData, RPCGetChannelsResultData, RPCGetGuildResultData, @@ -37,8 +26,21 @@ import type { RPCSetUserVoiceSettingsResultData, RPCSetVoiceSettingsArgs, RPCUnsubscribeResultData, + type APIUser, + type OAuth2Scopes, + type Snowflake, +} from 'discord-api-types/v10'; +import { randomUUID } from 'node:crypto'; +import { clearTimeout, setTimeout } from 'node:timers'; +import type { + EventAndArgsParameters, + MappedRPCCommandsArgs, + MappedRPCCommandsResultsData, + MappedRPCEventsDispatchData, + NullableFields, + RPCCallableCommands, } from './constants.js'; -import { Events, RPCCommands, RPCEvents } from './constants.js'; +import { Events } from './constants.js'; import { IPCTransport } from './ipc.js'; import { RPCEventError } from './RPCEventError.js'; import { getPid, mergeRPCLoginOptions } from './util.js'; @@ -207,6 +209,17 @@ export class RPCClient extends AsyncEventEmitter { ); } + /** + * Request but public + */ + public request( + cmd: Cmd, + args: MappedRPCCommandsArgs[Cmd], + evt?: RPCEvents, + ): Promise { + return this.#request(cmd, args, evt); + } + /** * Message handler * diff --git a/src/constants.ts b/src/constants.ts index b4fcfad..2bee90a 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -1,3542 +1,160 @@ -/* eslint-disable tsdoc/syntax */ -/* eslint-disable @typescript-eslint/no-empty-interface */ - -import type { - APIMessage, - APIPartialChannel, - APIPartialGuild, - APIUser, - APIVoiceState, - ChannelType, - GatewayActivity, - OAuth2Scopes, - Snowflake, +import { + RPCAcceptActivityInviteArgs, + RPCAcceptActivityInviteResultData, + RPCActivityInviteDispatchData, + RPCActivityInviteUserArgs, + RPCActivityInviteUserResultData, + RPCActivityJoinDispatchData, + RPCActivityJoinRequestDispatchData, + RPCActivitySpectateDispatchData, + RPCAuthenticateArgs, + RPCAuthenticateResultData, + RPCAuthorizeArgs, + RPCAuthorizeResultData, + RPCBraintreePopupBridgeCallbackArgs, + RPCBraintreePopupBridgeCallbackResultData, + RPCBrowserHandoffArgs, + RPCBrowserHandoffResultData, + RPCChannelCreateDispatchData, + RPCCloseActivityJoinRequestArgs, + RPCCloseActivityJoinRequestResultData, + RPCCommandSubscribePayload, + RPCCommands, + RPCConnectionsCallbackArgs, + RPCConnectionsCallbackResultData, + RPCCreateChannelInviteArgs, + RPCCreateChannelInviteResultData, + RPCCurrentUserUpdateDispatchData, + RPCDeepLinkArgs, + RPCDeepLinkResultData, + RPCEntitlementCreateDispatchData, + RPCEntitlementDeleteDispatchData, + RPCErrorDispatchData, + RPCEvents, + RPCGameJoinDispatchData, + RPCGameSpectateDispatchData, + RPCGetApplicationTicketArgs, + RPCGetApplicationTicketResultData, + RPCGetChannelArgs, + RPCGetChannelResultData, + RPCGetChannelsArgs, + RPCGetChannelsResultData, + RPCGetEntitlementTicketArgs, + RPCGetEntitlementTicketResultData, + RPCGetEntitlementsArgs, + RPCGetEntitlementsResultData, + RPCGetGuildArgs, + RPCGetGuildResultData, + RPCGetGuildsArgs, + RPCGetGuildsResultData, + RPCGetImageArgs, + RPCGetImageResultData, + RPCGetNetworkingConfigArgs, + RPCGetNetworkingConfigResultData, + RPCGetRelationshipsArgs, + RPCGetRelationshipsResultData, + RPCGetSelectedVoiceChannelArgs, + RPCGetSelectedVoiceChannelResultData, + RPCGetSkusArgs, + RPCGetSkusResultData, + RPCGetUserArgs, + RPCGetUserResultData, + RPCGetVoiceSettingsArgs, + RPCGetVoiceSettingsResultData, + RPCGiftCodeBrowserArgs, + RPCGiftCodeBrowserResultData, + RPCGuildCreateDispatchData, + RPCGuildStatusDispatchData, + RPCGuildTemplateBrowserArgs, + RPCGuildTemplateBrowserResultData, + RPCInviteBrowserArgs, + RPCInviteBrowserResultData, + RPCMessageCreateDispatchData, + RPCMessageDeleteDispatchData, + RPCMessageUpdateDispatchData, + RPCNetworkingCreateTokenArgs, + RPCNetworkingCreateTokenResultData, + RPCNetworkingPeerMetricsArgs, + RPCNetworkingPeerMetricsResultData, + RPCNetworkingSystemMetricsArgs, + RPCNetworkingSystemMetricsResultData, + RPCNotificationCreateDispatchData, + RPCOpenOverlayActivityInviteArgs, + RPCOpenOverlayActivityInviteResultData, + RPCOpenOverlayGuildInviteArgs, + RPCOpenOverlayGuildInviteResultData, + RPCOpenOverlayVoiceSettingsArgs, + RPCOpenOverlayVoiceSettingsResultData, + RPCOverlayArgs, + RPCOverlayDispatchData, + RPCOverlayResultData, + RPCOverlayUpdateDispatchData, + RPCReadyDispatchData, + RPCRelationshipUpdateDispatchData, + RPCSelectTextChannelArgs, + RPCSelectTextChannelResultData, + RPCSelectVoiceChannelArgs, + RPCSelectVoiceChannelResultData, + RPCSendActivityJoinInviteArgs, + RPCSendActivityJoinInviteResultData, + RPCSetActivityArgs, + RPCSetActivityResultData, + RPCSetCertifiedDevicesArgs, + RPCSetCertifiedDevicesResultData, + RPCSetOverlayLockedArgs, + RPCSetOverlayLockedResultData, + RPCSetUserVoiceSettings2Args, + RPCSetUserVoiceSettings2ResultData, + RPCSetUserVoiceSettingsArgs, + RPCSetUserVoiceSettingsResultData, + RPCSetVoiceSettings2Args, + RPCSetVoiceSettings2ResultData, + RPCSetVoiceSettingsArgs, + RPCSetVoiceSettingsResultData, + RPCSpeakingStartDispatchData, + RPCSpeakingStopDispatchData, + RPCStartPurchaseArgs, + RPCStartPurchaseResultData, + RPCSubscribeActivityInviteArgs, + RPCSubscribeActivityJoinArgs, + RPCSubscribeActivityJoinRequestArgs, + RPCSubscribeActivitySpectateArgs, + RPCSubscribeChannelCreateArgs, + RPCSubscribeCurrentUserUpdateArgs, + RPCSubscribeEntitlementCreateArgs, + RPCSubscribeEntitlementDeleteArgs, + RPCSubscribeGameJoinArgs, + RPCSubscribeGameSpectateArgs, + RPCSubscribeGuildCreateArgs, + RPCSubscribeGuildStatusArgs, + RPCSubscribeMessageCreateArgs, + RPCSubscribeMessageDeleteArgs, + RPCSubscribeMessageUpdateArgs, + RPCSubscribeNotificationCreateArgs, + RPCSubscribeOverlayArgs, + RPCSubscribeOverlayUpdateArgs, + RPCSubscribeRelationshipUpdateArgs, + RPCSubscribeResultData, + RPCSubscribeSpeakingStartArgs, + RPCSubscribeSpeakingStopArgs, + RPCSubscribeVoiceChannelSelectArgs, + RPCSubscribeVoiceConnectionStatusArgs, + RPCSubscribeVoiceSettingsUpdate2Args, + RPCSubscribeVoiceSettingsUpdateArgs, + RPCSubscribeVoiceStateCreateArgs, + RPCSubscribeVoiceStateDeleteArgs, + RPCSubscribeVoiceStateUpdateArgs, + RPCValidateApplicationArgs, + RPCValidateApplicationResultData, + RPCVoiceChannelSelectDispatchData, + RPCVoiceConnectionStatusDispatchData, + RPCVoiceSettingsUpdate2DispatchData, + RPCVoiceSettingsUpdateDispatchData, + RPCVoiceStateCreateDispatchData, + RPCVoiceStateDeleteDispatchData, + RPCVoiceStateUpdateDispatchData, } from 'discord-api-types/v10'; -export const RPCVersion = '1'; - -/** - * @unstable - */ -export interface RPCAPIMessageParsedContentOriginalMatch { - 0: string; - index: 0; -} - -/** - * @unstable - */ -export interface RPCAPIMessageParsedContentText { - type: 'text'; - originalMatch: RPCAPIMessageParsedContentOriginalMatch; - content: string; -} - -/** - * @unstable - */ -export interface RPCAPIMessageParsedContentMention { - type: 'mention'; - userId: Snowflake; - channelId: Snowflake; - guildId: Snowflake; - /** - * same as `userId` - */ - parsedUserId: Snowflake; - content: Omit; -} - -/** - * @unstable - */ -export interface RPCAPIMessage extends Omit { - /** - * the nickname of the user who sent the message - */ - nick?: string; - /** - * the color of the author's name - */ - author_color?: number; - /** - * the content of the message parsed into an array - */ - content_parsed: (RPCAPIMessageParsedContentText | RPCAPIMessageParsedContentMention)[]; -} - -/** - * @unstable - */ -export enum RPCCaptureShortcutAction { - Start = 'START', - Stop = 'STOP', -} - -/** - * @unstable - */ -export type RPCLobbyMetadata = unknown; - -/** - * https://discord.com/developers/docs/topics/rpc#authenticate-oauth2-application-structure - */ -export interface RPCOAuth2Application { - /** - * Application description - */ - description: string; - /** - * Hash of the icon - */ - icon: string; - /** - * Application client id - */ - id: Snowflake; - /** - * Application name - */ - name: string; - /** - * Array of rpc origin urls - */ - rpc_origins: string[]; -} - -export interface RPCDeviceVendor { - /** - * name of the vendor - */ - name: string; - /** - * url for the vendor - */ - url: string; -} - -export interface RPCDeviceModel { - /** - * name of the model - */ - name: string; - /** - * url for the model - */ - url: string; -} - -export enum RPCDeviceType { - AudioInput = 'audioinput', - AudioOutput = 'audiooutput', - VideoInput = 'videoinput', -} - -export interface BaseRPCCertifiedDevice { - /** - * the device's Windows UUID - */ - id: string; - /** - * the model of the product - */ - model: RPCDeviceModel; - /** - * UUIDs of related devices - */ - related: string[]; - /** - * the type of device - */ - type: Type; - /** - * the hardware vendor - */ - vendor: RPCDeviceVendor; -} - -/** - * https://discord.com/developers/docs/topics/rpc#setcertifieddevices-device-object - */ -export type RPCCertifiedDevice = Type extends RPCDeviceType.AudioInput - ? BaseRPCCertifiedDevice & { - /** - * if the device's native automatic gain control is enabled - */ - automatic_gain_control: boolean; - /** - * if the device's native echo cancellation is enabled - */ - echo_cancellation: boolean; - /** - * if the device is hardware muted - */ - hardware_mute: boolean; - /** - * if the device's native noise suppression is enabled - */ - noise_suppression: boolean; - } - : BaseRPCCertifiedDevice; - -export interface RPCVoiceAvailableDevice { - /** - * device id - */ - id: string; - /** - * device name - */ - name: string; -} - -/** - * https://discord.com/developers/docs/topics/rpc#getvoicesettings-voice-settings-input-object - */ -export interface RPCVoiceSettingsInput { - /** - * array of read-only device objects containing `id` and `name` string keys - */ - available_devices: RPCVoiceAvailableDevice[]; - /** - * device id - */ - device_id: string; - /** - * input voice level (min: 0.0, max: 100.0) - */ - volume: number; -} - -/** - * https://discord.com/developers/docs/topics/rpc#getvoicesettings-voice-settings-output-object - */ -export interface RPCVoiceSettingsOutput { - /** - * array of read-only device objects containing `id` and `name` string keys - */ - available_devices: RPCVoiceAvailableDevice[]; - /** - * device id - */ - device_id: string; - /** - * input voice level (min: 0.0, max: 200.0) - */ - volume: number; -} - -export enum RPCVoiceSettingsModeType { - PushToTalk = 'PUSH_TO_TALK', - VoiceActivity = 'VOICE_ACTIVITY', -} - -/** - * https://discord.com/developers/docs/topics/rpc#getvoicesettings-key-types - */ -export enum RPCVoiceShortcutKeyComboKeyType { - KeyboardKey, - MouseButton, - KeyboardModifierKey, - GamepadButton, -} - -/** - * https://discord.com/developers/docs/topics/rpc#getvoicesettings-shortcut-key-combo-object - */ -export interface RPCVoiceShortcutKeyCombo { - /** - * key code - */ - code: number; - /** - * key name - */ - name: string; - /** - * type of key - */ - type: RPCVoiceShortcutKeyComboKeyType; -} - -/** - * https://discord.com/developers/docs/topics/rpc#getvoicesettings-voice-settings-mode-object - */ -export interface RPCVoiceSettingsMode { - /** - * voice activity threshold automatically sets its threshold - */ - auto_threshold: boolean; - /** - * threshold for voice activity (in dB) (min: -100.0, max: 0.0) - */ - threshold: number; - /** - * voice setting mode type (can be `PUSH_TO_TALK` or `VOICE_ACTIVITY`) - */ - type: RPCVoiceSettingsModeType; - /** - * shortcut key combos for PTT - */ - shortcut: RPCVoiceShortcutKeyCombo; - /** - * the PTT release delay (in ms) (min: 0, max: 2000) - */ - delay: number; -} - -export enum VoiceConnectionStates { - /** - * TCP authenticating - */ - Authenticating = 'AUTHENTICATING', - /** - * Waiting for voice endpoint - */ - AwaitingEndpoint = 'AWAITING_ENDPOINT', - /** - * TCP connected - */ - Connected = 'CONNECTED', - /** - * TCP connecting - */ - Connecting = 'CONNECTING', - /** - * TCP disconnected - */ - Disconnected = 'DISCONNECTED', - /** - * WebRTC ice checking - */ - IceChecking = 'ICE_CHECKING', - /** - * No route to host - */ - NoRoute = 'NO_ROUTE', - /** - * TCP connected, Voice connected - */ - VoiceConnected = 'VOICE_CONNECTED', - /** - * TCP connected, Voice connecting - */ - VoiceConnecting = 'VOICE_CONNECTING', - /** - * TCP connected, Voice disconnected - */ - VoiceDisconnected = 'VOICE_DISCONNECTED', -} - -/** - * @unstable - */ -export enum LobbyType { - Private = 1, - Public, -} - -/** - * @unstable - */ -export enum RelationshipType { - None, - Friend, - Blocked, - PendingIncoming, - PendingOutgoing, - Implicit, -} - -/** - * @unstable - */ -export interface Relationship { - /** - * the id of the user - */ - id: Snowflake; - /** - * relationship type - */ - type: RelationshipType; - /** - * user - */ - user: APIUser; -} - -/** - * https://discord.com/developers/docs/topics/opcodes-and-status-codes#rpc-rpc-error-codes - */ -export enum RPCErrorCodes { - /** - * An unknown error occurred. - */ - UnknownError = 1_000, - /** - * @unstable - */ - ServiceUnavailable, - /** - * @unstable - */ - TransactionAborted, - /** - * You sent an invalid payload. - */ - InvalidPayload = 4_000, - /** - * Invalid command name specified. - */ - InvalidCommand = 4_002, - /** - * Invalid guild ID specified. - */ - InvalidGuild, - /** - * Invalid event name specified. - */ - InvalidEvent, - /** - * Invalid channel ID specified. - */ - InvalidChannel, - /** - * You lack permissions to access the given resource. - */ - InvalidPermissions, - /** - * An invalid OAuth2 application ID was used to authorize or authenticate with. - */ - InvalidClientId, - /** - * An invalid OAuth2 application origin was used to authorize or authenticate with. - */ - InvalidOrigin, - /** - * An invalid OAuth2 token was used to authorize or authenticate with. - */ - InvalidToken, - /** - * The specified user ID was invalid. - */ - InvalidUser, - /** - * @unstable - */ - InvalidInvite, - /** - * @unstable - */ - InvalidActivityJoinRequest, - /** - * @unstable - */ - InvalidLobby, - /** - * @unstable - */ - InvalidLobbySecret, - /** - * @unstable - */ - InvalidEntitlement, - /** - * @unstable - */ - InvalidGiftCode, - /** - * A standard OAuth2 error occurred; check the data object for the OAuth2 error details. - */ - OAuth2Error = 5_000, - /** - * An asynchronous `SELECT_TEXT_CHANNEL`/`SELECT_VOICE_CHANNEL` command timed out. - */ - SelectChannelTimedOut, - /** - * An asynchronous `GET_GUILD` command timed out. - */ - GetGuildTimedOut, - /** - * You tried to join a user to a voice channel but the user was already in one. - */ - SelectVoiceForceRequired, - /** - * You tried to capture more than one shortcut key at once. - */ - CaptureShortcutAlreadyListening, - /** - * @unstable - */ - InvalidActivitySecret, - /** - * @unstable - */ - NoEligibleActivity, - /** - * @unstable - */ - LobbyFull, - /** - * @unstable - */ - PurchaseCanceled, - /** - * @unstable - */ - PurchaseError, - /** - * @unstable - */ - UnauthorizedForAchievement, - /** - * @unstable - */ - RateLimited, -} - -/** - * https://discord.com/developers/docs/topics/opcodes-and-status-codes#rpc-rpc-close-event-codes - */ -export enum RPCCloseEventCodes { - /** - * @unstable - */ - CloseNormal = 1_000, - /** - * @unstable - */ - CloseUnsupported = 1_003, - /** - * @unstable - */ - CloseAbnormal = 1_006, - /** - * You connected to the RPC server with an invalid client ID. - */ - InvalidClientId = 4_000, - /** - * You connected to the RPC server with an invalid origin. - */ - InvalidOrigin, - /** - * You are being rate limited. - */ - RateLimited, - /** - * The OAuth2 token associated with a connection was revoked, get a new one! - */ - TokenRevoked, - /** - * The RPC Server version specified in the connection string was not valid. - */ - InvalidVersion, - /** - * The encoding specified in the connection string was not valid. - */ - InvalidEncoding, -} - -/** - * https://discord.com/developers/docs/topics/rpc#commands-and-events-rpc-commands - */ -export enum RPCCommands { - /** - * @unstable - */ - AcceptActivityInvite = 'ACCEPT_ACTIVITY_INVITE', - /** - * @unstable - */ - ActivityInviteUser = 'ACTIVITY_INVITE_USER', - /** - * Used to authenticate an existing client with your app - */ - Authenticate = 'AUTHENTICATE', - /** - * Used to authorize a new client with your app - */ - Authorize = 'AUTHORIZE', - /** - * @unstable - */ - BraintreePopupBridgeCallback = 'BRAINTREE_POPUP_BRIDGE_CALLBACK', - /** - * @unstable - */ - BrowserHandoff = 'BROWSER_HANDOFF', - CaptureShortcut = 'CAPTURE_SHORTCUT', - /** - * used to reject a Rich Presence Ask to Join request - */ - CloseActivityJoinRequest = 'CLOSE_ACTIVITY_JOIN_REQUEST', - /** - * @unstable - */ - ConnectToLobby = 'CONNECT_TO_LOBBY', - /** - * @unstable - */ - ConnectToLobbyVoice = 'CONNECT_TO_LOBBY_VOICE', - /** - * @unstable - */ - ConnectionsCallback = 'CONNECTIONS_CALLBACK', - CreateChannelInvite = 'CREATE_CHANNEL_INVITE', - /** - * @unstable - */ - CreateLobby = 'CREATE_LOBBY', - /** - * @unstable - */ - DeepLink = 'DEEP_LINK', - /** - * @unstable - */ - DeleteLobby = 'DELETE_LOBBY', - /** - * @unstable - */ - DisconnectFromLobby = 'DISCONNECT_FROM_LOBBY', - /** - * @unstable - */ - DisconnectFromLobbyVoice = 'DISCONNECT_FROM_LOBBY_VOICE', - /** - * Event dispatch - */ - Dispatch = 'DISPATCH', - /** - * @unstable - */ - GetApplicationTicket = 'GET_APPLICATION_TICKET', - /** - * Used to retrieve channel information from the client - */ - GetChannel = 'GET_CHANNEL', - /** - * Used to retrieve a list of channels for a guild from the client - */ - GetChannels = 'GET_CHANNELS', - /** - * @unstable - */ - GetEntitlementTicket = 'GET_ENTITLEMENT_TICKET', - /** - * @unstable - */ - GetEntitlements = 'GET_ENTITLEMENTS', - /** - * Used to retrieve guild information from the client - */ - GetGuild = 'GET_GUILD', - /** - * Used to retrieve a list of guilds from the client - */ - GetGuilds = 'GET_GUILDS', - /** - * @unstable - */ - GetImage = 'GET_IMAGE', - /** - * @unstable - */ - GetNetworkingConfig = 'GET_NETWORKING_CONFIG', - /** - * @unstable - */ - GetRelationships = 'GET_RELATIONSHIPS', - /** - * Used to get the current voice channel the client is in - */ - GetSelectedVoiceChannel = 'GET_SELECTED_VOICE_CHANNEL', - /** - * @unstable - */ - GetSkus = 'GET_SKUS', - /** - * @unstable - */ - GetUser = 'GET_USER', - /** - * @unstable - */ - GetUserAchievements = 'GET_USER_ACHIEVEMENTS', - /** - * Used to retrieve the client's voice settings - */ - GetVoiceSettings = 'GET_VOICE_SETTINGS', - /** - * @unstable - */ - GiftCodeBrowser = 'GIFT_CODE_BROWSER', - /** - * @unstable - */ - GuildTemplateBrowser = 'GUILD_TEMPLATE_BROWSER', - /** - * @unstable - */ - InviteBrowser = 'INVITE_BROWSER', - /** - * @unstable - */ - NetworkingCreateToken = 'NETWORKING_CREATE_TOKEN', - /** - * @unstable - */ - NetworkingPeerMetrics = 'NETWORKING_PEER_METRICS', - /** - * @unstable - */ - NetworkingSystemMetrics = 'NETWORKING_SYSTEM_METRICS', - /** - * @unstable - */ - OpenOverlayActivityInvite = 'OPEN_OVERLAY_ACTIVITY_INVITE', - /** - * @unstable - */ - OpenOverlayGuildInvite = 'OPEN_OVERLAY_GUILD_INVITE', - /** - * @unstable - */ - OpenOverlayVoiceSettings = 'OPEN_OVERLAY_VOICE_SETTINGS', - /** - * @unstable - */ - Overlay = 'OVERLAY', - /** - * @unstable - */ - SearchLobbies = 'SEARCH_LOBBIES', - /** - * Used to join or leave a text channel, group dm, or dm - */ - SelectTextChannel = 'SELECT_TEXT_CHANNEL', - /** - * Used to join or leave a voice channel, group dm, or dm - */ - SelectVoiceChannel = 'SELECT_VOICE_CHANNEL', - /** - * Used to consent to a Rich Presence Ask to Join request - */ - SendActivityJoinInvite = 'SEND_ACTIVITY_JOIN_INVITE', - /** - * @unstable - */ - SendToLobby = 'SEND_TO_LOBBY', - /** - * Used to update a user's Rich Presence - */ - SetActivity = 'SET_ACTIVITY', - /** - * Used to send info about certified hardware devices - */ - SetCertifiedDevices = 'SET_CERTIFIED_DEVICES', - /** - * @unstable - */ - SetOverlayLocked = 'SET_OVERLAY_LOCKED', - /** - * @unstable - */ - SetUserAchievement = 'SET_USER_ACHIEVEMENT', - /** - * Used to change voice settings of users in voice channels - */ - SetUserVoiceSettings = 'SET_USER_VOICE_SETTINGS', - SetUserVoiceSettings2 = 'SET_USER_VOICE_SETTINGS_2', - /** - * Used to set the client's voice settings - */ - SetVoiceSettings = 'SET_VOICE_SETTINGS', - SetVoiceSettings2 = 'SET_VOICE_SETTINGS_2', - /** - * @unstable - */ - StartPurchase = 'START_PURCHASE', - /** - * Used to subscribe to an RPC event - */ - Subscribe = 'SUBSCRIBE', - /** - * Used to unsubscribe from an RPC event - */ - Unsubscribe = 'UNSUBSCRIBE', - /** - * @unstable - */ - UpdateLobby = 'UPDATE_LOBBY', - /** - * @unstable - */ - UpdateLobbyMember = 'UPDATE_LOBBY_MEMBER', - /** - * @unstable - */ - ValidateApplication = 'VALIDATE_APPLICATION', -} - -/** - * https://discord.com/developers/docs/topics/rpc#authorize-authorize-response-structure - */ -export interface RPCAuthorizeResultData { - /** - * OAuth2 authorization code - */ - code: string; -} - -/** - * https://discord.com/developers/docs/topics/rpc#authorize-authorize-argument-structure - */ -export interface RPCAuthorizeArgs { - /** - * OAuth2 application id - */ - client_id: string; - /** - * scopes to authorize - */ - scopes: OAuth2Scopes[]; - /** - * username to create a guest account with if the user does not have Discord - */ - username?: string; -} - -/** - * https://discord.com/developers/docs/topics/rpc#authenticate-authenticate-argument-structure - */ -export interface RPCAuthenticateArgs { - /** - * OAuth2 access token - */ - access_token: string; -} - -/** - * https://discord.com/developers/docs/topics/rpc#authenticate-authenticate-response-structure - */ -export interface RPCAuthenticateResultData { - /** - * Application the user authorized - */ - application: RPCOAuth2Application; - /** - * Expiration date of OAuth2 token - */ - expires: string; - /** - * Authorized scopes - */ - scopes: OAuth2Scopes[]; - /** - * The authed user - */ - user: APIUser; -} - -export interface RPCGetGuildsArgs {} - -/** - * https://discord.com/developers/docs/topics/rpc#getguilds-get-guilds-response-structure - */ -export interface RPCGetGuildsResultData { - /** - * The guilds the user is in - */ - guilds: APIPartialGuild[]; -} - -/** - * https://discord.com/developers/docs/topics/rpc#getguild-get-guild-argument-structure - */ -export interface RPCGetGuildArgs { - /** - * Id of the guild to get - */ - guild_id: Snowflake; - /** - * Asynchronously get guild with time to wait before timing out - */ - timeout?: number; -} - -/** - * https://discord.com/developers/docs/topics/rpc#getguild-get-guild-response-structure - */ -export interface RPCGetGuildResultData { - /** - * Guild icon url - */ - icon_url: string | null; - /** - * Guild id - */ - id: Snowflake; - /** - * Members of the guild - * - * @deprecated This will always be an empty array - */ - members: []; - /** - * Guild name - */ - name: string; -} - -/** - * https://discord.com/developers/docs/topics/rpc#getchannel - */ -export interface RPCGetChannelArgs { - /** - * Id of the channel to get - */ - channel_id: Snowflake; -} - -/** - * https://discord.com/developers/docs/topics/rpc#getchannel-get-channel-response-structure - */ -export interface RPCGetChannelResultData { - /** - * (voice) bitrate of voice channel - */ - bitrate?: number; - /** - * Channel's guild id - */ - guild_id: Snowflake; - /** - * Channel id - */ - id: Snowflake; - /** - * (text) channel's messages - */ - messages?: APIMessage[]; - /** - * Channel name - */ - name: string; - /** - * Position of channel in channel list - */ - position: number; - /** - * (text) channel topic - */ - topic?: string; - /** - * Channel type - */ - type: ChannelType; - /** - * (voice) user limit of voice channel (0 for none) - */ - user_limit?: number; - /** - * (voice) channel's voice states - */ - voice_states?: APIVoiceState[]; -} - -/** - * https://discord.com/developers/docs/topics/rpc#getchannels-get-channels-argument-structure - */ -export interface RPCGetChannelsArgs { - /** - * Id of the guild to get channels for - */ - guild_id: Snowflake; -} - -/** - * https://discord.com/developers/docs/topics/rpc#getchannels-get-channels-response-structure - */ -export interface RPCGetChannelsResultData { - /** - * Guild channels the user is in - */ - channels: APIPartialChannel[]; -} - -/** - * https://discord.com/developers/docs/topics/rpc#setuservoicesettings-pan-object - */ -export interface RPCVoicePan { - /** - * Left pan of user (min: 0.0, max: 1.0) - */ - left: number; - /** - * Right pan of user (min: 0.0, max: 1.0) - */ - right: number; -} - -/** - * https://discord.com/developers/docs/topics/rpc#setuservoicesettings - * - * @note Discord only supports a single modifier of voice settings at a time over RPC. If an app changes voice settings, it will lock voice settings so that other apps connected simultaneously lose the ability to change voice settings. Settings reset to what they were before being changed after the controlling app disconnects. When an app that has previously set voice settings connects, the client will swap to that app's configured voice settings and lock voice settings again. - */ -export interface RPCSetUserVoiceSettingsArgs { - /** - * Set the mute state of the user - */ - mute?: boolean; - /** - * Set the pan of the user - */ - pan?: RPCVoicePan; - /** - * User id - */ - user_id: Snowflake; - /** - * Set the volume of user (defaults to 100, min 0, max 200) - */ - volume?: number; -} - -/** - * https://discord.com/developers/docs/topics/rpc#setuservoicesettings-set-user-voice-settings-argument-and-response-structure - */ -export type RPCSetUserVoiceSettingsResultData = Required; - -/** - * https://discord.com/developers/docs/topics/rpc#selectvoicechannel-select-voice-channel-argument-structure - * - * @warning When trying to join the user to a voice channel, you will receive a `5003` error coded response if the user is already in a voice channel. The `force` parameter should only be specified in response to the case where a user is already in a voice channel and they have approved to be moved by your app to a new voice channel. - */ -export interface RPCSelectVoiceChannelArgs { - /** - * Channel id to join (or `null` to leave) - */ - channel_id: Snowflake | null; - /** - * Forces a user to join a voice channel - */ - force?: boolean; - /** - * After joining the voice channel, navigate to it in the client - */ - navigate?: boolean; - /** - * Asynchronously join channel with time to wait before timing out - */ - timeout?: number; -} - -/** - * https://discord.com/developers/docs/topics/rpc#selectvoicechannel - */ -export type RPCSelectVoiceChannelResultData = RPCGetChannelResultData | null; - -/** - * https://discord.com/developers/docs/topics/rpc#getselectedvoicechannel - */ -export type RPCGetSelectedVoiceChannelResultData = RPCGetChannelResultData | null; - -/** - * https://discord.com/developers/docs/topics/rpc#getselectedvoicechannel - */ -export interface RPCGetSelectedVoiceChannelArgs {} - -/** - * @unstable - */ -export interface RPCGetUserResultData {} -/** - * @unstable - */ -export interface RPCGetUserArgs {} - -/** - * https://discord.com/developers/docs/topics/rpc#getvoicesettings-get-voice-settings-response-structure - */ -export interface RPCGetVoiceSettingsResultData { - /** - * state of automatic gain control - */ - automatic_gain_control: boolean; - /** - * state of self-deafen - */ - deaf: boolean; - /** - * state of echo cancellation - */ - echo_cancellation: boolean; - /** - * input settings - */ - input: RPCVoiceSettingsInput; - /** - * voice mode settings - */ - mode: RPCVoiceSettingsMode; - /** - * state of self-mute - */ - mute: boolean; - /** - * state of noise suppression - */ - noise_suppression: boolean; - /** - * output settings - */ - output: RPCVoiceSettingsOutput; - /** - * state of voice quality of service - */ - qos: boolean; - /** - * state of silence warning notice - */ - silence_warning: boolean; -} - -export interface RPCGetVoiceSettingsArgs {} - -/** - * Returns the [Get Channel](https://discord.com/developers/docs/topics/rpc#getchannel) response, or `null` if none. - */ -export type RPCSelectTextChannelResultData = RPCGetChannelResultData | null; -/** - * https://discord.com/developers/docs/topics/rpc#selecttextchannel-select-text-channel-argument-structure - */ -export interface RPCSelectTextChannelArgs { - /** - * channel id to join (or `null` to leave) - */ - channel_id: Snowflake | null; - /** - * asynchronously join channel with time to wait before timing out - */ - timeout?: number; -} - -export interface RPCSetActivityResultData {} -/** - * https://discord.com/developers/docs/topics/rpc#setactivity-set-activity-argument-structure - */ -export interface RPCSetActivityArgs { - /** - * the rich presence to assign to the user - */ - activity?: Partial< - Omit & Partial> - >; - /** - * the application's process id - */ - pid: number; -} - -/** - * https://discord.com/developers/docs/topics/rpc#setvoicesettings-set-voice-settings-argument-and-response-structure - */ -export type RPCSetVoiceSettingsResultData = RPCGetVoiceSettingsResultData; -/** - * https://discord.com/developers/docs/topics/rpc#setvoicesettings-set-voice-settings-argument-and-response-structure - * - * @note Discord only supports a single modifier of voice settings at a time over RPC. If an app changes voice settings, it will lock voice settings so that other apps connected simultaneously lose the ability to change voice settings. Settings reset to what they were before being changed after the controlling app disconnects. When an app that has previously set voice settings connects, the client will swap to that app's configured voice settings and lock voice settings again. - */ -export type RPCSetVoiceSettingsArgs = RPCGetVoiceSettingsResultData; - -/** - * https://discord.com/developers/docs/topics/rpc#subscribe-subscribe-response-structure - */ -export interface RPCSubscribeResultData { - /** - * event name now subscribed to - */ - evt: RPCEvents; -} -/** - * https://discord.com/developers/docs/topics/rpc#subscribe - */ -export type RPCSubscribeArgs = - | RPCSubscribeActivityInviteArgs - | RPCSubscribeActivityJoinArgs - | RPCSubscribeActivityJoinRequestArgs - | RPCSubscribeActivitySpectateArgs - | RPCSubscribeCaptureShortcutChangeArgs - | RPCSubscribeChannelCreateArgs - | RPCSubscribeCurrentUserUpdateArgs - | RPCSubscribeEntitlementCreateArgs - | RPCSubscribeEntitlementDeleteArgs - | RPCSubscribeGameJoinArgs - | RPCSubscribeGameSpectateArgs - | RPCSubscribeGuildCreateArgs - | RPCSubscribeGuildStatusArgs - | RPCSubscribeLobbyDeleteArgs - | RPCSubscribeLobbyMemberConnectArgs - | RPCSubscribeLobbyMemberDisconnectArgs - | RPCSubscribeLobbyMemberUpdateArgs - | RPCSubscribeLobbyMessageArgs - | RPCSubscribeLobbyUpdateArgs - | RPCSubscribeMessageCreateArgs - | RPCSubscribeMessageDeleteArgs - | RPCSubscribeMessageUpdateArgs - | RPCSubscribeNotificationCreateArgs - | RPCSubscribeOverlayArgs - | RPCSubscribeOverlayUpdateArgs - | RPCSubscribeRelationshipUpdateArgs - | RPCSubscribeSpeakingStartArgs - | RPCSubscribeSpeakingStopArgs - | RPCSubscribeUserAchievementUpdateArgs - | RPCSubscribeVoiceChannelSelectArgs - | RPCSubscribeVoiceConnectionStatusArgs - | RPCSubscribeVoiceSettingsUpdate2Args - | RPCSubscribeVoiceSettingsUpdateArgs - | RPCSubscribeVoiceStateCreateArgs - | RPCSubscribeVoiceStateDeleteArgs - | RPCSubscribeVoiceStateUpdateArgs; - -/** - * https://discord.com/developers/docs/topics/rpc#unsubscribe-unsubscribe-response-structure - */ -export interface RPCUnsubscribeResultData { - /** - * event name now unsubscribed from - */ - evt: RPCEvents; -} -/** - * https://discord.com/developers/docs/topics/rpc#unsubscribe - */ -export type RPCUnsubscribeArgs = RPCSubscribeArgs; - -/** - * @unstable - */ -export interface RPCAcceptActivityInviteResultData {} -/** - * @unstable - */ -export interface RPCAcceptActivityInviteArgs {} - -/** - * @unstable - */ -export interface RPCActivityInviteUserResultData {} -/** - * @unstable - */ -export interface RPCActivityInviteUserArgs {} - -/** - * @unstable - */ -export interface RPCBraintreePopupBridgeCallbackResultData {} -/** - * @unstable - */ -export interface RPCBraintreePopupBridgeCallbackArgs {} - -/** - * @unstable - */ -export interface RPCBrowserHandoffResultData {} -/** - * @unstable - */ -export interface RPCBrowserHandoffArgs {} - -/** - * @unstable - */ -export interface RPCCaptureShortcutResultData {} -/** - * @unstable - */ -export interface RPCCaptureShortcutArgs { - action: RPCCaptureShortcutAction; -} - -export interface RPCCloseActivityRequestResultData {} -/** - * https://discord.com/developers/docs/topics/rpc#closeactivityrequest-close-activity-request-argument-structure - */ -export interface RPCCloseActivityRequestArgs { - /** - * the id of the requesting user - */ - user_id: Snowflake; -} - -/** - * @unstable - */ -export interface RPCConnectToLobbyResultData {} -/** - * @unstable - */ -export interface RPCConnectToLobbyArgs { - /** - * @unstable id of the lobby to connect to - */ - id: Snowflake; - /** - * @unstable secret for the lobby - */ - secret: string; -} - -/** - * @unstable - */ -export interface RPCConnectToLobbyVoiceResultData {} -/** - * @unstable - */ -export interface RPCConnectToLobbyVoiceArgs {} - -/** - * @unstable - */ -export interface RPCConnectionsCallbackResultData {} -/** - * @unstable - */ -export interface RPCConnectionsCallbackArgs {} - -/** - * @unstable - */ -export interface RPCCreateChannelInviteResultData {} -/** - * @unstable - */ -export interface RPCCreateChannelInviteArgs {} - -/** - * @unstable - */ -export interface RPCCreateLobbyResultData {} -/** - * @unstable - */ -export interface RPCCreateLobbyArgs {} - -/** - * @unstable - */ -export interface RPCDeepLinkResultData {} -/** - * @unstable - */ -export interface RPCDeepLinkArgs {} - -/** - * @unstable - */ -export interface RPCDeleteLobbyResultData {} -/** - * @unstable - */ -export interface RPCDeleteLobbyArgs {} - -/** - * @unstable - */ -export interface RPCDisconnectFromLobbyResultData {} -/** - * @unstable - */ -export interface RPCDisconnectFromLobbyArgs {} - -/** - * @unstable - */ -export interface RPCDisconnectFromLobbyVoiceResultData {} -/** - * @unstable - */ -export interface RPCDisconnectFromLobbyVoiceArgs {} - -/** - * @unstable - */ -export interface RPCGetApplicationTicketResultData {} -/** - * @unstable - */ -export interface RPCGetApplicationTicketArgs {} - -/** - * @unstable - */ -export interface RPCGetEntitlementTicketResultData {} -/** - * @unstable - */ -export interface RPCGetEntitlementTicketArgs {} - -/** - * @unstable - */ -export interface RPCGetEntitlementsResultData {} -/** - * @unstable - */ -export interface RPCGetEntitlementsArgs {} - -/** - * @unstable - */ -export interface RPCGetImageResultData {} -/** - * @unstable - */ -export interface RPCGetImageArgs {} - -/** - * @unstable - */ -export interface RPCGetNetworkingConfigResultData {} -/** - * @unstable - */ -export interface RPCGetNetworkingConfigArgs {} - -/** - * @unstable - */ -export type RPCGetRelationshipsResultData = Relationship[]; -/** - * @unstable - */ -export interface RPCGetRelationshipsArgs {} - -/** - * @unstable - */ -export interface RPCGetSkusResultData {} -/** - * @unstable - */ -export interface RPCGetSkusArgs {} - -/** - * @unstable - */ -export interface RPCGetUserAchievementsResultData {} -/** - * @unstable - */ -export interface RPCGetUserAchievementsArgs {} - -/** - * @unstable - */ -export interface RPCGiftCodeBrowserResultData {} -/** - * @unstable - */ -export interface RPCGiftCodeBrowserArgs {} - -/** - * @unstable - */ -export interface RPCGuildTemplateBrowserResultData {} -/** - * @unstable - */ -export interface RPCGuildTemplateBrowserArgs {} - -/** - * @unstable - */ -export interface RPCInviteBrowserResultData {} -/** - * @unstable - */ -export interface RPCInviteBrowserArgs {} - -/** - * @unstable - */ -export interface RPCNetworkingCreateTokenResultData {} -/** - * @unstable - */ -export interface RPCNetworkingCreateTokenArgs {} - -/** - * @unstable - */ -export interface RPCNetworkingPeerMetricsResultData {} -/** - * @unstable - */ -export interface RPCNetworkingPeerMetricsArgs {} - -/** - * @unstable - */ -export interface RPCNetworkingSystemMetricsResultData {} -/** - * @unstable - */ -export interface RPCNetworkingSystemMetricsArgs {} - -/** - * @unstable - */ -export interface RPCOpenOverlayActivityInviteResultData {} -/** - * @unstable - */ -export interface RPCOpenOverlayActivityInviteArgs {} - -/** - * @unstable - */ -export interface RPCOpenOverlayGuildInviteResultData {} -/** - * @unstable - */ -export interface RPCOpenOverlayGuildInviteArgs {} - -/** - * @unstable - */ -export interface RPCOpenOverlayVoiceSettingsResultData {} -/** - * @unstable - */ -export interface RPCOpenOverlayVoiceSettingsArgs {} - -/** - * @unstable - */ -export interface RPCOverlayResultData {} -/** - * @unstable - */ -export interface RPCOverlayArgs {} - -/** - * @unstable - */ -export interface RPCSearchLobbiesResultData {} -/** - * @unstable - */ -export interface RPCSearchLobbiesArgs {} - -export interface RPCSendActivityJoinInviteResultData {} -/** - * https://discord.com/developers/docs/topics/rpc#sendactivityjoininvite-send-activity-join-invite-argument-structure - */ -export interface RPCSendActivityJoinInviteArgs { - /** - * the id of the requesting user - */ - user_id: Snowflake; -} - -/** - * @unstable - */ -export interface RPCSendToLobbyResultData {} -/** - * @unstable - */ -export interface RPCSendToLobbyArgs { - /** - * @unstable id of the lobby to send to - */ - id: Snowflake; - /** - * @unstable data to send - */ - data: unknown; -} - -export type RPCSetCertifiedDevicesResultData = null; -/** - * https://discord.com/developers/docs/topics/rpc#setcertifieddevices-set-certified-devices-argument-structure - */ -export interface RPCSetCertifiedDevicesArgs { - /** - * a list of devices for your manufacturer, in order of priority - */ - devices: RPCCertifiedDevice[]; -} - -/** - * @unstable - */ -export interface RPCSetOverlayLockedResultData {} -/** - * @unstable - */ -export interface RPCSetOverlayLockedArgs {} - -/** - * @unstable - */ -export interface RPCSetUserAchievementResultData {} -/** - * @unstable - */ -export interface RPCSetUserAchievementArgs {} - -/** - * @unstable - */ -export type RPCSetUserVoiceSettings2ResultData = RPCSetUserVoiceSettingsResultData; -/** - * @unstable - */ -export type RPCSetUserVoiceSettings2Args = RPCSetUserVoiceSettingsArgs; - -/** - * @unstable - */ -export type RPCSetVoiceSettings2ResultData = RPCSetVoiceSettingsResultData; -/** - * @unstable - */ -export type RPCSetVoiceSettings2Args = RPCSetVoiceSettingsArgs; - -/** - * @unstable - */ -export interface RPCStartPurchaseResultData {} -/** - * @unstable - */ -export interface RPCStartPurchaseArgs {} - -/** - * @unstable - */ -export interface RPCUpdateLobbyResultData {} -/** - * @unstable - */ -export interface RPCUpdateLobbyArgs { - /** - * id of the lobby to update - */ - id: Snowflake; - /** - * lobby type - */ - type?: LobbyType; - /** - * id of the owner of the lobby - */ - owner_id?: Snowflake; - /** - * capacity of the lobby - */ - capacity?: number; - /** - * metadata for the lobby - */ - metadata?: RPCLobbyMetadata; -} - -/** - * @unstable - */ -export interface RPCUpdateLobbyMemberResultData {} -/** - * @unstable - */ -export interface RPCUpdateLobbyMemberArgs { - /** - * @unstable id of the lobby the member is from - */ - lobby_id: Snowflake; - /** - * @unstable id of the member to update - */ - user_id: Snowflake; - /** - * @unstable metadata for the member - */ - metadata?: RPCLobbyMetadata; -} - -/** - * @unstable - */ -export interface RPCValidateApplicationResultData {} -/** - * @unstable - */ -export interface RPCValidateApplicationArgs {} - -/** - * https://discord.com/developers/docs/topics/rpc#commands-and-events-rpc-events - */ -export enum RPCEvents { - /** - * @unstable - */ - ActivityInvite = 'ACTIVITY_INVITE', - ActivityJoin = 'ACTIVITY_JOIN', - ActivityJoinRequest = 'ACTIVITY_JOIN_REQUEST', - ActivitySpectate = 'ACTIVITY_SPECTATE', - ChannelCreate = 'CHANNEL_CREATE', - CurrentUserUpdate = 'CURRENT_USER_UPDATE', - /** - * @unstable - */ - EntitlementCreate = 'ENTITLEMENT_CREATE', - /** - * @unstable - */ - EntitlementDelete = 'ENTITLEMENT_DELETE', - Error = 'ERROR', - /** - * @unstable - */ - GameJoin = 'GAME_JOIN', - /** - * @unstable - */ - GameSpectate = 'GAME_SPECTATE', - GuildCreate = 'GUILD_CREATE', - GuildStatus = 'GUILD_STATUS', - /** - * @unstable - */ - LobbyDelete = 'LOBBY_DELETE', - /** - * @unstable - */ - LobbyMemberConnect = 'LOBBY_MEMBER_CONNECT', - /** - * @unstable - */ - LobbyMemberDisconnect = 'LOBBY_MEMBER_DISCONNECT', - /** - * @unstable - */ - LobbyMemberUpdate = 'LOBBY_MEMBER_UPDATE', - /** - * @unstable - */ - LobbyMessage = 'LOBBY_MESSAGE', - /** - * @unstable - */ - LobbyUpdate = 'LOBBY_UPDATE', - /** - * Dispatches message objects, with the exception of deletions, which only contains the id in the message object. - */ - MessageCreate = 'MESSAGE_CREATE', - /** - * Dispatches message objects, with the exception of deletions, which only contains the id in the message object. - */ - MessageDelete = 'MESSAGE_DELETE', - /** - * Dispatches message objects, with the exception of deletions, which only contains the id in the message object. - */ - MessageUpdate = 'MESSAGE_UPDATE', - /** - * This event requires the `rpc.notifications.read` [OAuth2 scope](https://discord.com/developers/docs/topics/oauth2#shared-resources-oauth2-scopes). - */ - NotificationCreate = 'NOTIFICATION_CREATE', - /** - * @unstable - */ - Overlay = 'OVERLAY', - /** - * @unstable - */ - OverlayUpdate = 'OVERLAY_UPDATE', - Ready = 'READY', - /** - * @unstable - */ - RelationshipUpdate = 'RELATIONSHIP_UPDATE', - SpeakingStart = 'SPEAKING_START', - SpeakingStop = 'SPEAKING_STOP', - UserAchievementUpdate = 'USER_ACHIEVEMENT_UPDATE', - VoiceChannelSelect = 'VOICE_CHANNEL_SELECT', - VoiceConnectionStatus = 'VOICE_CONNECTION_STATUS', - VoiceSettingsUpdate = 'VOICE_SETTINGS_UPDATE', - /** - * @unstable - */ - VoiceSettingsUpdate2 = 'VOICE_SETTINGS_UPDATE_2', - /** - * Dispatches channel voice state objects - */ - VoiceStateCreate = 'VOICE_STATE_CREATE', - /** - * Dispatches channel voice state objects - */ - VoiceStateDelete = 'VOICE_STATE_DELETE', - /** - * Dispatches channel voice state objects - */ - VoiceStateUpdate = 'VOICE_STATE_UPDATE', -} - -/** - * @unstable - */ -// eslint-disable-next-line @typescript-eslint/no-empty-interface -export type RPCSubscribeActivityInviteArgs = Record; - -// eslint-disable-next-line @typescript-eslint/no-empty-interface -export type RPCSubscribeActivityJoinArgs = Record; - -// eslint-disable-next-line @typescript-eslint/no-empty-interface -export type RPCSubscribeActivityJoinRequestArgs = Record; - -// eslint-disable-next-line @typescript-eslint/no-empty-interface -export type RPCSubscribeActivitySpectateArgs = Record; - -/** - * @unstable - */ -// eslint-disable-next-line @typescript-eslint/no-empty-interface -export type RPCSubscribeCaptureShortcutChangeArgs = Record; - -// eslint-disable-next-line @typescript-eslint/no-empty-interface -export type RPCSubscribeChannelCreateArgs = Record; - -/** - * @unstable - */ -// eslint-disable-next-line @typescript-eslint/no-empty-interface -export type RPCSubscribeCurrentUserUpdateArgs = Record; - -/** - * @unstable - */ -// eslint-disable-next-line @typescript-eslint/no-empty-interface -export type RPCSubscribeEntitlementCreateArgs = Record; - -/** - * @unstable - */ -// eslint-disable-next-line @typescript-eslint/no-empty-interface -export type RPCSubscribeEntitlementDeleteArgs = Record; - -/** - * @unstable - */ -// eslint-disable-next-line @typescript-eslint/no-empty-interface -export type RPCSubscribeGameJoinArgs = Record; - -/** - * @unstable - */ -// eslint-disable-next-line @typescript-eslint/no-empty-interface -export type RPCSubscribeGameSpectateArgs = Record; - -// eslint-disable-next-line @typescript-eslint/no-empty-interface -export type RPCSubscribeGuildCreateArgs = Record; - -/** - * https://discord.com/developers/docs/topics/rpc#guildstatus-guild-status-argument-structure - */ -export interface RPCSubscribeGuildStatusArgs { - /** - * id of guild to listen to updates of - */ - guild_id: Snowflake; -} - -/** - * @unstable - */ -// eslint-disable-next-line @typescript-eslint/no-empty-interface -export type RPCSubscribeLobbyDeleteArgs = Record; - -/** - * @unstable - */ -// eslint-disable-next-line @typescript-eslint/no-empty-interface -export type RPCSubscribeLobbyMemberConnectArgs = Record; - -/** - * @unstable - */ -// eslint-disable-next-line @typescript-eslint/no-empty-interface -export type RPCSubscribeLobbyMemberDisconnectArgs = Record; - -/** - * @unstable - */ -// eslint-disable-next-line @typescript-eslint/no-empty-interface -export type RPCSubscribeLobbyMemberUpdateArgs = Record; - -/** - * @unstable - */ -// eslint-disable-next-line @typescript-eslint/no-empty-interface -export type RPCSubscribeLobbyMessageArgs = Record; - -/** - * @unstable - */ -// eslint-disable-next-line @typescript-eslint/no-empty-interface -export type RPCSubscribeLobbyUpdateArgs = Record; - -/** - * https://discord.com/developers/docs/topics/rpc#messagecreatemessageupdatemessagedelete-message-argument-structure - */ -export interface RPCSubscribeMessageCreateArgs { - /** - * id of channel to listen to updates of - */ - channel_id: Snowflake; -} - -/** - * https://discord.com/developers/docs/topics/rpc#messagecreatemessageupdatemessagedelete-message-argument-structure - */ -export interface RPCSubscribeMessageDeleteArgs { - /** - * id of channel to listen to updates of - */ - channel_id: Snowflake; -} - -/** - * https://discord.com/developers/docs/topics/rpc#messagecreatemessageupdatemessagedelete-message-argument-structure - */ -export interface RPCSubscribeMessageUpdateArgs { - /** - * id of channel to listen to updates of - */ - channel_id: Snowflake; -} - -// eslint-disable-next-line @typescript-eslint/no-empty-interface -export type RPCSubscribeNotificationCreateArgs = Record; - -/** - * @unstable - */ -// eslint-disable-next-line @typescript-eslint/no-empty-interface -export type RPCSubscribeOverlayArgs = Record; - -/** - * @unstable - */ -// eslint-disable-next-line @typescript-eslint/no-empty-interface -export type RPCSubscribeOverlayUpdateArgs = Record; - -/** - * @unstable - */ -// eslint-disable-next-line @typescript-eslint/no-empty-interface -export type RPCSubscribeRelationshipUpdateArgs = Record; - -/** - * https://discord.com/developers/docs/topics/rpc#speakingstartspeakingstop-speaking-argument-structure - */ -export interface RPCSubscribeSpeakingStartArgs { - /** - * id of channel to listen to updates of - */ - channel_id: Snowflake; -} - -/** - * https://discord.com/developers/docs/topics/rpc#speakingstartspeakingstop-speaking-argument-structure - */ -export interface RPCSubscribeSpeakingStopArgs { - /** - * id of channel to listen to updates of - */ - channel_id: Snowflake; -} - -/** - * @unstable - */ -// eslint-disable-next-line @typescript-eslint/no-empty-interface -export type RPCSubscribeUserAchievementUpdateArgs = Record; - -// eslint-disable-next-line @typescript-eslint/no-empty-interface -export type RPCSubscribeVoiceChannelSelectArgs = Record; - -/** - * @unstable - */ -// eslint-disable-next-line @typescript-eslint/no-empty-interface -export type RPCSubscribeVoiceConnectionStatusArgs = Record; - -// eslint-disable-next-line @typescript-eslint/no-empty-interface -export type RPCSubscribeVoiceSettingsUpdateArgs = Record; - -/** - * @unstable - */ -// eslint-disable-next-line @typescript-eslint/no-empty-interface -export type RPCSubscribeVoiceSettingsUpdate2Args = Record; - -/** - * https://discord.com/developers/docs/topics/rpc#voicestatecreatevoicestateupdatevoicestatedelete-voice-state-argument-structure - */ -export interface RPCSubscribeVoiceStateCreateArgs { - /** - * id of channel to listen to updates of - */ - channel_id: Snowflake; -} - -/** - * https://discord.com/developers/docs/topics/rpc#voicestatecreatevoicestateupdatevoicestatedelete-voice-state-argument-structure - */ -export interface RPCSubscribeVoiceStateDeleteArgs { - /** - * id of channel to listen to updates of - */ - channel_id: Snowflake; -} - -/** - * https://discord.com/developers/docs/topics/rpc#voicestatecreatevoicestateupdatevoicestatedelete-voice-state-argument-structure - */ -export interface RPCSubscribeVoiceStateUpdateArgs { - /** - * id of channel to listen to updates of - */ - channel_id: Snowflake; -} - -/** - * @unstable - */ - -export interface RPCActivityInviteDispatchData {} - -/** - * https://discord.com/developers/docs/topics/rpc#activityjoin-activity-join-dispatch-data-structure - */ -export interface RPCActivityJoinDispatchData { - /** - * the [`join_secret`](https://discord.com/developers/docs/developer-tools/game-sdk#activitysecrets-struct) for the given invite - */ - secret: string; -} - -/** - * https://discord.com/developers/docs/topics/rpc#activityjoinrequest-activity-join-request-data-structure - */ -export interface RPCActivityJoinRequestDispatchData { - /** - * information about the user requesting to join - */ - user: APIUser; -} - -/** - * https://discord.com/developers/docs/topics/rpc#activityspectate-activity-spectate-dispatch-data-structure - */ -export interface RPCActivitySpectateDispatchData { - /** - * the [`spectate_secret`](https://discord.com/developers/docs/developer-tools/game-sdk#activitysecrets-struct) for the given invite - */ - secret: string; -} - -/** - * https://discord.com/developers/docs/topics/rpc#channelcreate-channel-create-dispatch-data-structure - */ -export interface RPCChannelCreateDispatchData { - /** - * channel id - */ - id: Snowflake; - /** - * name of the channel - */ - name: string; - /** - * channel type - */ - type: ChannelType; -} - -/** - * @unstable - */ - -export type RPCCurrentUserUpdateDispatchData = APIUser; - -/** - * @unstable - */ - -export interface RPCEntitlementCreateDispatchData {} - -/** - * @unstable - */ - -export interface RPCEntitlementDeleteDispatchData {} - -/** - * https://discord.com/developers/docs/topics/rpc#error-error-data-structure - */ -export interface RPCErrorDispatchData { - /** - * RPC Error Code - */ - code: RPCErrorCodes; - /** - * Error description - */ - message: string; -} - -/** - * @unstable - */ -export interface RPCGameJoinDispatchData {} - -/** - * @unstable - */ -export interface RPCGameSpectateDispatchData {} - -/** - * https://discord.com/developers/docs/topics/rpc#guildcreate-guild-create-dispatch-data-structure - */ -export interface RPCGuildCreateDispatchData { - /** - * guild id - */ - id: Snowflake; - /** - * name of the guild - */ - name: string; -} - -/** - * https://discord.com/developers/docs/topics/rpc#guildstatus-guild-status-dispatch-data-structure - */ -export interface RPCGuildStatusDispatchData { - /** - * guild with requested id - */ - guild: APIPartialGuild; - /** - * number of online users in guild - * - * @deprecated This will always be 0 - */ - online: number; -} - -/** - * @unstable - */ -export interface RPCLobbyDeleteDispatchData {} - -/** - * @unstable - */ -export interface RPCLobbyMemberConnectDispatchData {} - -/** - * @unstable - */ -export interface RPCLobbyMemberDisconnectDispatchData {} - -/** - * @unstable - */ -export interface RPCLobbyMemberUpdateDispatchData {} - -/** - * @unstable - */ -export interface RPCLobbyMessageDispatchData {} - -/** - * @unstable - */ -export interface RPCLobbyUpdateDispatchData {} - -/** - * https://discord.com/developers/docs/topics/rpc#messagecreatemessageupdatemessagedelete-example-message-dispatch-payload - */ -export interface RPCMessageCreateDispatchData { - /** - * id of channel where message was sent - */ - channel_id: Snowflake; - /** - * message that was created - */ - message: RPCAPIMessage; -} - -/** - * https://discord.com/developers/docs/topics/rpc#messagecreatemessageupdatemessagedelete-example-message-dispatch-payload - */ -export interface RPCMessageDeleteDispatchData { - /** - * id of channel where message was deleted - */ - channel_id: Snowflake; - /** - * message that was deleted (only id) - */ - message: Pick; -} - -/** - * https://discord.com/developers/docs/topics/rpc#messagecreatemessageupdatemessagedelete-example-message-dispatch-payload - */ -export interface RPCMessageUpdateDispatchData { - /** - * id of channel where message was updated - */ - channel_id: Snowflake; - /** - * message that was updated - */ - message: APIMessage; -} - -/** - * https://discord.com/developers/docs/topics/rpc#notificationcreate-notification-create-dispatch-data-structure - */ -export interface RPCNotificationCreateDispatchData { - /** - * body of the notification - */ - body: string; - /** - * id of channel where notification occurred - */ - channel_id: Snowflake; - /** - * icon url of the notification - */ - icon_url: string; - /** - * message that generated this notification - */ - message: APIMessage; - /** - * title of the notification - */ - title: string; -} - -/** - * @unstable - */ -export interface RPCOverlayDispatchData {} - -/** - * @unstable - */ -export interface RPCOverlayUpdateDispatchData {} - -/** - * https://discord.com/developers/docs/topics/rpc#ready-rpc-server-configuration-object - */ -export interface RPCServerConfiguration { - /** - * server's api endpoint - */ - api_endpoint: string; - /** - * server's cdn - */ - cdn_host: string; - /** - * server's environment - */ - environment: string; -} - -/** - * https://discord.com/developers/docs/topics/rpc#ready-ready-dispatch-data-structure - */ -export interface RPCReadyDispatchData { - /** - * server configuration - */ - config: RPCServerConfiguration; - /** - * the user to whom you are connected - */ - user: APIUser; - /** - * RPC version - */ - v: 1; -} - -/** - * @unstable - */ -export interface RPCRelationshipUpdateDispatchData {} - -/** - * https://discord.com/developers/docs/topics/rpc#speakingstartspeakingstop-speaking-dispatch-data-structure - */ -export interface RPCSpeakingStartDispatchData { - /** - * id of user who started speaking - */ - user_id: Snowflake; - /** - * @unstable - * id of channel where user is speaking - */ - channel_id: Snowflake; -} - -/** - * https://discord.com/developers/docs/topics/rpc#speakingstartspeakingstop-speaking-dispatch-data-structure - */ -export interface RPCSpeakingStopDispatchData { - /** - * id of user who stopped speaking - */ - user_id: Snowflake; - /** - * @unstable - * id of channel where user is speaking - */ - channel_id: Snowflake; -} - -/** - * @unstable - */ -export interface RPCUserAchievementUpdateDispatchData {} - -/** - * https://discord.com/developers/docs/topics/rpc#voicechannelselect-voice-channel-select-dispatch-data-structure - */ -export interface RPCVoiceChannelSelectDispatchData { - /** - * id of channel (`null` if none) - */ - channel_id: Snowflake | null; - /** - * id of guild (`null` if none) - */ - guild_id: Snowflake | null; -} - -/** - * https://discord.com/developers/docs/topics/rpc#voiceconnectionstatus-voice-connection-status-dispatch-data-structure - */ -export interface RPCVoiceConnectionStatusDispatchData { - /** - * average ping (in ms) - */ - average_ping: number; - /** - * hostname of the connected voice server - */ - hostname: string; - /** - * last ping (in ms) - */ - last_ping: number; - /** - * last 20 pings (in ms) - */ - pings: number[]; - /** - * voice connection states - */ - state: VoiceConnectionStates; -} - -export type RPCVoiceSettingsUpdateDispatchData = RPCGetVoiceSettingsResultData; - -/** - * @unstable - */ -export type RPCVoiceSettingsUpdate2DispatchData = RPCGetVoiceSettingsResultData; - -/** - * https://discord.com/developers/docs/topics/rpc#voicestatecreatevoicestateupdatevoicestatedelete-example-voice-state-dispatch-payload - */ -export interface RPCVoiceStateCreateDispatchData { - /** - * is user muted for the client user - */ - mute: boolean; - /** - * nickname of user - */ - nick: string; - /** - * pan of user - */ - pan: RPCVoicePan; - /** - * user who joined voice channel - */ - user: APIUser; - /** - * voice state of user - */ - voice_state: APIVoiceState; - /** - * volume of user - */ - volume: number; -} - -/** - * https://discord.com/developers/docs/topics/rpc#voicestatecreatevoicestateupdatevoicestatedelete-example-voice-state-dispatch-payload - */ -export interface RPCVoiceStateDeleteDispatchData { - /** - * is user muted for the client user - */ - mute: boolean; - /** - * nickname of user - */ - nick: string; - /** - * pan of user - */ - pan: RPCVoicePan; - /** - * user who joined voice channel - */ - user: APIUser; - /** - * voice state of user - */ - voice_state: APIVoiceState; - /** - * volume of user - */ - volume: number; -} - -/** - * https://discord.com/developers/docs/topics/rpc#voicestatecreatevoicestateupdatevoicestatedelete-example-voice-state-dispatch-payload - */ -export interface RPCVoiceStateUpdateDispatchData { - /** - * is user muted for the client user - */ - mute: boolean; - /** - * nickname of user - */ - nick: string; - /** - * pan of user - */ - pan: RPCVoicePan; - /** - * user who joined voice channel - */ - user: APIUser; - /** - * voice state of user - */ - voice_state: APIVoiceState; - /** - * volume of user - */ - volume: number; -} - -export interface BaseRPCMessage { - cmd: Cmd; -} - -export interface RPCCommandMessage extends BaseRPCMessage { - nonce: string; -} - -export interface RPCSubscribeMessage< - Evt extends RPCEvents, - Cmd extends RPCCommands.Subscribe | RPCCommands.Unsubscribe = RPCCommands.Subscribe | RPCCommands.Unsubscribe, -> extends RPCCommandMessage { - evt: Evt; -} - -export interface RPCCommandAuthorizePayload extends RPCCommandMessage { - args: RPCAuthorizeArgs; -} - -export interface RPCCommandAuthenticatePayload extends RPCCommandMessage { - args: RPCAuthenticateArgs; -} - -export interface RPCCommandGetChannelPayload extends RPCCommandMessage { - args: RPCGetChannelArgs; -} - -export interface RPCCommandGetChannelsPayload extends RPCCommandMessage { - args: RPCGetChannelsArgs; -} - -export interface RPCCommandGetGuildPayload extends RPCCommandMessage { - args: RPCGetGuildArgs; -} - -export interface RPCCommandGetGuildsPayload extends RPCCommandMessage { - args: RPCGetGuildsArgs; -} - -export interface RPCCommandGetUserPayload extends RPCCommandMessage { - args: RPCGetUserArgs; -} - -export interface RPCCommandGetVoiceSettingsPayload extends RPCCommandMessage { - args: RPCGetVoiceSettingsArgs; -} - -export interface RPCCommandSelectTextChannelPayload extends RPCCommandMessage { - args: RPCSelectTextChannelArgs; -} - -export interface RPCCommandSelectVoiceChannelPayload extends RPCCommandMessage { - args: RPCSelectVoiceChannelArgs; -} - -export interface RPCCommandSetActivityPayload extends RPCCommandMessage { - args: RPCSetActivityArgs; -} - -export interface RPCCommandSetVoiceSettingsPayload extends RPCCommandMessage { - args: RPCSetVoiceSettingsArgs; -} - -export type RPCCommandSubscribePayload = - | RPCSubscribeActivityInvite - | RPCSubscribeActivityJoin - | RPCSubscribeActivityJoinRequest - | RPCSubscribeActivitySpectate - | RPCSubscribeChannelCreate - | RPCSubscribeCurrentUserUpdate - | RPCSubscribeEntitlementCreate - | RPCSubscribeEntitlementDelete - | RPCSubscribeGameJoin - | RPCSubscribeGameSpectate - | RPCSubscribeGuildCreate - | RPCSubscribeGuildStatus - | RPCSubscribeLobbyDelete - | RPCSubscribeLobbyMemberConnect - | RPCSubscribeLobbyMemberDisconnect - | RPCSubscribeLobbyMemberUpdate - | RPCSubscribeLobbyMessage - | RPCSubscribeLobbyUpdate - | RPCSubscribeMessageCreate - | RPCSubscribeMessageDelete - | RPCSubscribeMessageUpdate - | RPCSubscribeNotificationCreate - | RPCSubscribeOverlay - | RPCSubscribeOverlayUpdate - | RPCSubscribeRelationshipUpdate - | RPCSubscribeSpeakingStart - | RPCSubscribeSpeakingStop - | RPCSubscribeUserAchievementUpdate - | RPCSubscribeVoiceChannelSelect - | RPCSubscribeVoiceConnectionStatus - | RPCSubscribeVoiceSettingsUpdate - | RPCSubscribeVoiceSettingsUpdate2 - | RPCSubscribeVoiceStateCreate - | RPCSubscribeVoiceStateDelete - | RPCSubscribeVoiceStateUpdate; - -export type RPCCommandUnsubscribePayload = RPCCommandSubscribePayload; - -export interface RPCCommandAcceptActivityInvitePayload extends RPCCommandMessage { - args: RPCAcceptActivityInviteArgs; -} - -export interface RPCCommandActivityInviteUserPayload extends RPCCommandMessage { - args: RPCActivityInviteUserArgs; -} - -export interface RPCCommandBraintreePopupBridgeCallbackPayload - extends RPCCommandMessage { - args: RPCBraintreePopupBridgeCallbackArgs; -} - -export interface RPCCommandBrowserPayload extends RPCCommandMessage { - args: RPCBrowserHandoffArgs; -} - -export interface RPCCommandCaptureShortcutPayload extends RPCCommandMessage { - args: RPCCaptureShortcutArgs; -} - -export interface RPCCommandCloseActivityJoinRequestPayload - extends RPCCommandMessage { - args: RPCCloseActivityRequestArgs; -} - -export interface RPCCommandConnectToLobbyPayload extends RPCCommandMessage { - args: RPCConnectToLobbyArgs; -} - -export interface RPCCommandConnectToLobbyVoicePayload extends RPCCommandMessage { - args: RPCConnectToLobbyVoiceArgs; -} - -export interface RPCCommandConnectionsCallbackPayload extends RPCCommandMessage { - args: RPCConnectionsCallbackArgs; -} - -export interface RPCCommandCreateChannelInvitePayload extends RPCCommandMessage { - args: RPCCreateChannelInviteArgs; -} - -export interface RPCCommandCreateLobbyPayload extends RPCCommandMessage { - args: RPCCreateLobbyArgs; -} - -export interface RPCCommandDeepLinkPayload extends RPCCommandMessage { - args: RPCDeepLinkArgs; -} - -export interface RPCCommandDeleteLobbyPayload extends RPCCommandMessage { - args: RPCDeleteLobbyArgs; -} - -export interface RPCCommandDisconnectFromLobbyPayload extends RPCCommandMessage { - args: RPCDisconnectFromLobbyArgs; -} - -export interface RPCCommandDisconnectFromLobbyVoicePayload - extends RPCCommandMessage { - args: RPCDisconnectFromLobbyVoiceArgs; -} - -export interface RPCCommandGetApplicationTicketPayload extends RPCCommandMessage { - args: RPCGetApplicationTicketArgs; -} - -export interface RPCCommandGetEntitlementTicketPayload extends RPCCommandMessage { - args: RPCGetEntitlementTicketArgs; -} - -export interface RPCCommandGetEntitlementsPayload extends RPCCommandMessage { - args: RPCGetEntitlementsArgs; -} - -export interface RPCCommandGetImagePayload extends RPCCommandMessage { - args: RPCGetImageArgs; -} - -export interface RPCCommandGetNetworkingConfigPayload extends RPCCommandMessage { - args: RPCGetNetworkingConfigArgs; -} - -export interface RPCCommandGetRelationshipsPayload extends RPCCommandMessage { - args: RPCGetRelationshipsArgs; -} - -export interface RPCCommandGetSelectedVoiceChannelPayload - extends RPCCommandMessage { - args: RPCGetSelectedVoiceChannelArgs; -} - -export interface RPCCommandGetSkusPayload extends RPCCommandMessage { - args: RPCGetSkusArgs; -} - -export interface RPCCommandGetUserAchievementsPayload extends RPCCommandMessage { - args: RPCGetUserAchievementsArgs; -} - -export interface RPCCommandGiftCodeBrowserPayload extends RPCCommandMessage { - args: RPCGiftCodeBrowserArgs; -} - -export interface RPCCommandGuildTemplateBrowserPayload extends RPCCommandMessage { - args: RPCGuildTemplateBrowserArgs; -} - -export interface RPCCommandInviteBrowserPayload extends RPCCommandMessage { - args: RPCInviteBrowserArgs; -} - -export interface RPCCommandNetworkingCreateTokenPayload extends RPCCommandMessage { - args: RPCNetworkingCreateTokenArgs; -} - -export interface RPCCommandNetworkingPeerMetricsPayload extends RPCCommandMessage { - args: RPCNetworkingPeerMetricsArgs; -} - -export interface RPCCommandNetworkingSystemMetricsPayload - extends RPCCommandMessage { - args: RPCNetworkingSystemMetricsArgs; -} - -export interface RPCCommandOpenOverlayActivityInvitePayload - extends RPCCommandMessage { - args: RPCOpenOverlayActivityInviteArgs; -} - -export interface RPCCommandOpenOverlayGuildInvitePayload extends RPCCommandMessage { - args: RPCOpenOverlayGuildInviteArgs; -} - -export interface RPCCommandOpenOverlayVoiceSettingsPayload - extends RPCCommandMessage { - args: RPCOpenOverlayVoiceSettingsArgs; -} - -export interface RPCCommandOverlayPayload extends RPCCommandMessage { - args: RPCOverlayArgs; -} - -export interface RPCCommandSearchLobbiesPayload extends RPCCommandMessage { - args: RPCSearchLobbiesArgs; -} - -export interface RPCCommandSendActivityJoinInvitePayload extends RPCCommandMessage { - args: RPCSendActivityJoinInviteArgs; -} - -export interface RPCCommandSendToLobbyPayload extends RPCCommandMessage { - args: RPCSendToLobbyArgs; -} - -export interface RPCCommandSetCertifiedDevicesPayload extends RPCCommandMessage { - args: RPCSetCertifiedDevicesArgs; -} - -export interface RPCCommandSetOverlayLockedPayload extends RPCCommandMessage { - args: RPCSetOverlayLockedArgs; -} - -export interface RPCCommandSetUserAchievementPayload extends RPCCommandMessage { - args: RPCSetUserAchievementArgs; -} - -export interface RPCCommandSetUserVoiceSettingsPayload extends RPCCommandMessage { - args: RPCSetUserVoiceSettingsArgs; -} - -export interface RPCCommandSetUserVoiceSettings2Payload extends RPCCommandMessage { - args: RPCSetUserVoiceSettings2Args; -} - -export interface RPCCommandSetVoiceSettings2Payload extends RPCCommandMessage { - args: RPCSetVoiceSettings2Args; -} - -export interface RPCCommandStartPurchasePayload extends RPCCommandMessage { - args: RPCStartPurchaseArgs; -} - -export interface RPCCommandUpdateLobbyPayload extends RPCCommandMessage { - args: RPCUpdateLobbyArgs; -} - -export interface RPCCommandUpdateLobbyMemberPayload extends RPCCommandMessage { - args: RPCUpdateLobbyMemberArgs; -} - -export interface RPCCommandValidateApplicationPayload extends RPCCommandMessage { - args: RPCValidateApplicationArgs; -} - -export interface RPCSubscribeActivityInvite extends RPCSubscribeMessage { - args: RPCSubscribeActivityInviteArgs; - evt: RPCEvents.ActivityInvite; -} - -export interface RPCSubscribeActivityJoin extends RPCSubscribeMessage { - args: RPCSubscribeActivityJoinArgs; - evt: RPCEvents.ActivityJoin; -} - -export interface RPCSubscribeActivityJoinRequest extends RPCSubscribeMessage { - args: RPCSubscribeActivityJoinRequestArgs; - evt: RPCEvents.ActivityJoinRequest; -} - -export interface RPCSubscribeActivitySpectate extends RPCSubscribeMessage { - args: RPCSubscribeActivitySpectateArgs; - evt: RPCEvents.ActivitySpectate; -} - -export interface RPCSubscribeChannelCreate extends RPCSubscribeMessage { - args: RPCSubscribeChannelCreateArgs; - evt: RPCEvents.ChannelCreate; -} - -export interface RPCSubscribeCurrentUserUpdate extends RPCSubscribeMessage { - args: RPCSubscribeCurrentUserUpdateArgs; - evt: RPCEvents.CurrentUserUpdate; -} - -export interface RPCSubscribeEntitlementCreate extends RPCSubscribeMessage { - args: RPCSubscribeEntitlementCreateArgs; - evt: RPCEvents.EntitlementCreate; -} - -export interface RPCSubscribeEntitlementDelete extends RPCSubscribeMessage { - args: RPCSubscribeEntitlementDeleteArgs; - evt: RPCEvents.EntitlementDelete; -} - -export interface RPCSubscribeGameJoin extends RPCSubscribeMessage { - args: RPCSubscribeGameJoinArgs; - evt: RPCEvents.GameJoin; -} - -export interface RPCSubscribeGameSpectate extends RPCSubscribeMessage { - args: RPCSubscribeGameSpectateArgs; - evt: RPCEvents.GameSpectate; -} - -export interface RPCSubscribeGuildCreate extends RPCSubscribeMessage { - args: RPCSubscribeGuildCreateArgs; - evt: RPCEvents.GuildCreate; -} - -export interface RPCSubscribeGuildStatus extends RPCSubscribeMessage { - args: RPCSubscribeGuildStatusArgs; - evt: RPCEvents.GuildStatus; -} - -export interface RPCSubscribeLobbyDelete extends RPCSubscribeMessage { - args: RPCSubscribeLobbyDeleteArgs; - evt: RPCEvents.LobbyDelete; -} - -export interface RPCSubscribeLobbyMemberConnect extends RPCSubscribeMessage { - args: RPCSubscribeLobbyMemberConnectArgs; - evt: RPCEvents.LobbyMemberConnect; -} - -export interface RPCSubscribeLobbyMemberDisconnect extends RPCSubscribeMessage { - args: RPCSubscribeLobbyMemberDisconnectArgs; - evt: RPCEvents.LobbyMemberDisconnect; -} - -export interface RPCSubscribeLobbyMemberUpdate extends RPCSubscribeMessage { - args: RPCSubscribeLobbyMemberUpdateArgs; - evt: RPCEvents.LobbyMemberUpdate; -} - -export interface RPCSubscribeLobbyMessage extends RPCSubscribeMessage { - args: RPCSubscribeLobbyMessageArgs; - evt: RPCEvents.LobbyMessage; -} - -export interface RPCSubscribeLobbyUpdate extends RPCSubscribeMessage { - args: RPCSubscribeLobbyUpdateArgs; - evt: RPCEvents.LobbyUpdate; -} - -export interface RPCSubscribeMessageCreate extends RPCSubscribeMessage { - args: RPCSubscribeMessageCreateArgs; - evt: RPCEvents.MessageCreate; -} - -export interface RPCSubscribeMessageDelete extends RPCSubscribeMessage { - args: RPCSubscribeMessageDeleteArgs; - evt: RPCEvents.MessageDelete; -} - -export interface RPCSubscribeMessageUpdate extends RPCSubscribeMessage { - args: RPCSubscribeMessageUpdateArgs; - evt: RPCEvents.MessageUpdate; -} - -export interface RPCSubscribeNotificationCreate extends RPCSubscribeMessage { - args: RPCSubscribeNotificationCreateArgs; - evt: RPCEvents.NotificationCreate; -} - -export interface RPCSubscribeOverlay extends RPCSubscribeMessage { - args: RPCSubscribeOverlayArgs; - evt: RPCEvents.Overlay; -} - -export interface RPCSubscribeOverlayUpdate extends RPCSubscribeMessage { - args: RPCSubscribeOverlayUpdateArgs; - evt: RPCEvents.OverlayUpdate; -} - -export interface RPCSubscribeRelationshipUpdate extends RPCSubscribeMessage { - args: RPCSubscribeRelationshipUpdateArgs; - evt: RPCEvents.RelationshipUpdate; -} - -export interface RPCSubscribeSpeakingStart extends RPCSubscribeMessage { - args: RPCSubscribeSpeakingStartArgs; - evt: RPCEvents.SpeakingStart; -} - -export interface RPCSubscribeSpeakingStop extends RPCSubscribeMessage { - args: RPCSubscribeSpeakingStopArgs; - evt: RPCEvents.SpeakingStop; -} - -export interface RPCSubscribeUserAchievementUpdate extends RPCSubscribeMessage { - args: RPCSubscribeUserAchievementUpdateArgs; - evt: RPCEvents.UserAchievementUpdate; -} - -export interface RPCSubscribeVoiceChannelSelect extends RPCSubscribeMessage { - args: RPCSubscribeVoiceChannelSelectArgs; - evt: RPCEvents.VoiceChannelSelect; -} - -export interface RPCSubscribeVoiceConnectionStatus extends RPCSubscribeMessage { - args: RPCSubscribeVoiceConnectionStatusArgs; - evt: RPCEvents.VoiceConnectionStatus; -} - -export interface RPCSubscribeVoiceSettingsUpdate extends RPCSubscribeMessage { - args: RPCSubscribeVoiceSettingsUpdateArgs; - evt: RPCEvents.VoiceSettingsUpdate; -} - -export interface RPCSubscribeVoiceSettingsUpdate2 extends RPCSubscribeMessage { - args: RPCSubscribeVoiceSettingsUpdate2Args; - evt: RPCEvents.VoiceSettingsUpdate2; -} - -export interface RPCSubscribeVoiceStateCreate extends RPCSubscribeMessage { - args: RPCSubscribeVoiceStateCreateArgs; - evt: RPCEvents.VoiceStateCreate; -} - -export interface RPCSubscribeVoiceStateDelete extends RPCSubscribeMessage { - args: RPCSubscribeVoiceStateDeleteArgs; - evt: RPCEvents.VoiceStateDelete; -} - -export interface RPCSubscribeVoiceStateUpdate extends RPCSubscribeMessage { - args: RPCSubscribeVoiceStateUpdateArgs; - evt: RPCEvents.VoiceStateUpdate; -} - -export interface RPCAuthorizeResult extends RPCCommandMessage { - data: RPCAuthorizeResultData; -} - -export interface RPCAuthenticateResult extends RPCCommandMessage { - data: RPCAuthenticateResultData; -} - -export interface RPCGetChannelResult extends RPCCommandMessage { - data: RPCGetChannelResultData; -} - -export interface RPCGetChannelsResult extends RPCCommandMessage { - data: RPCGetChannelsResultData; -} - -export interface RPCGetGuildResult extends RPCCommandMessage { - data: RPCGetGuildResultData; -} - -export interface RPCGetGuildsResult extends RPCCommandMessage { - data: RPCGetGuildsResultData; -} - -export interface RPCGetUserResult extends RPCCommandMessage { - data: RPCGetUserResultData; -} - -export interface RPCGetVoiceSettingsResult extends RPCCommandMessage { - data: RPCGetVoiceSettingsResultData; -} - -export interface RPCSelectTextChannelResult extends RPCCommandMessage { - data: RPCSelectTextChannelResultData; -} - -export interface RPCSelectVoiceChannelResult extends RPCCommandMessage { - data: RPCSelectVoiceChannelResultData; -} - -export interface RPCSetActivityResult extends RPCCommandMessage { - data: RPCSetActivityResultData; -} - -export interface RPCSetVoiceSettingsResult extends RPCCommandMessage { - data: RPCSetVoiceSettingsResultData; -} - -export interface RPCSubscribeResult extends RPCCommandMessage { - data: RPCSubscribeResultData; -} - -export interface RPCUnsubscribeResult extends RPCCommandMessage { - data: RPCUnsubscribeResultData; -} - -export interface RPCAcceptActivityInviteResult extends RPCCommandMessage { - data: RPCAcceptActivityInviteResultData; -} - -export interface RPCActivityInviteUserResult extends RPCCommandMessage { - data: RPCActivityInviteUserResultData; -} - -export interface RPCBraintreePopupBridgeCallbackResult - extends RPCCommandMessage { - data: RPCBraintreePopupBridgeCallbackResultData; -} - -export interface RPCBrowserResult extends RPCCommandMessage { - data: RPCBrowserHandoffResultData; -} - -export interface RPCCaptureShortcutResult extends RPCCommandMessage { - data: RPCCaptureShortcutResultData; -} - -export interface RPCCloseActivityRequestResult extends RPCCommandMessage { - data: RPCCloseActivityRequestResultData; -} - -export interface RPCConnectToLobbyResult extends RPCCommandMessage { - data: RPCConnectToLobbyResultData; -} - -export interface RPCConnectToLobbyVoiceResult extends RPCCommandMessage { - data: RPCConnectToLobbyVoiceResultData; -} - -export interface RPCConnectionsCallbackResult extends RPCCommandMessage { - data: RPCConnectionsCallbackResultData; -} - -export interface RPCCreateChannelInviteResult extends RPCCommandMessage { - data: RPCCreateChannelInviteResultData; -} - -export interface RPCCreateLobbyResult extends RPCCommandMessage { - data: RPCCreateLobbyResultData; -} - -export interface RPCDeepLinkResult extends RPCCommandMessage { - data: RPCDeepLinkResultData; -} - -export interface RPCDeleteLobbyResult extends RPCCommandMessage { - data: RPCDeleteLobbyResultData; -} - -export interface RPCDisconnectFromLobbyResult extends RPCCommandMessage { - data: RPCDisconnectFromLobbyResultData; -} - -export interface RPCDisconnectFromLobbyVoiceResult extends RPCCommandMessage { - data: RPCDisconnectFromLobbyVoiceResultData; -} - -export interface RPCGetApplicationTicketResult extends RPCCommandMessage { - data: RPCGetApplicationTicketResultData; -} - -export interface RPCGetEntitlementTicketResult extends RPCCommandMessage { - data: RPCGetEntitlementTicketResultData; -} - -export interface RPCGetEntitlementsResult extends RPCCommandMessage { - data: RPCGetEntitlementsResultData; -} - -export interface RPCGetImageResult extends RPCCommandMessage { - data: RPCGetImageResultData; -} - -export interface RPCGetNetworkingConfigResult extends RPCCommandMessage { - data: RPCGetNetworkingConfigResultData; -} - -export interface RPCGetRelationshipsResult extends RPCCommandMessage { - data: RPCGetRelationshipsResultData; -} - -export interface RPCGetSelectedVoiceChannelResult extends RPCCommandMessage { - data: RPCGetSelectedVoiceChannelResultData; -} - -export interface RPCGetSkusResult extends RPCCommandMessage { - data: RPCGetSkusResultData; -} - -export interface RPCGetUserAchievementsResult extends RPCCommandMessage { - data: RPCGetUserAchievementsResultData; -} - -export interface RPCGiftCodeBrowserResult extends RPCCommandMessage { - data: RPCGiftCodeBrowserResultData; -} - -export interface RPCGuildTemplateBrowserResult extends RPCCommandMessage { - data: RPCGuildTemplateBrowserResultData; -} - -export interface RPCInviteBrowserResult extends RPCCommandMessage { - data: RPCInviteBrowserResultData; -} - -export interface RPCNetworkingCreateTokenResult extends RPCCommandMessage { - data: RPCNetworkingCreateTokenResultData; -} - -export interface RPCNetworkingPeerMetricsResult extends RPCCommandMessage { - data: RPCNetworkingPeerMetricsResultData; -} - -export interface RPCNetworkingSystemMetricsResult extends RPCCommandMessage { - data: RPCNetworkingSystemMetricsResultData; -} - -export interface RPCOpenOverlayActivityInviteResult extends RPCCommandMessage { - data: RPCOpenOverlayActivityInviteResultData; -} - -export interface RPCOpenOverlayGuildInviteResult extends RPCCommandMessage { - data: RPCOpenOverlayGuildInviteResultData; -} - -export interface RPCOpenOverlayVoiceSettingsResult extends RPCCommandMessage { - data: RPCOpenOverlayVoiceSettingsResultData; -} - -export interface RPCOverlayResult extends RPCCommandMessage { - data: RPCOverlayResultData; -} - -export interface RPCSearchLobbiesResult extends RPCCommandMessage { - data: RPCSearchLobbiesResultData; -} - -export interface RPCSendActivityJoinInviteResult extends RPCCommandMessage { - data: RPCSendActivityJoinInviteResultData; -} - -export interface RPCSendToLobbyResult extends RPCCommandMessage { - data: RPCSendToLobbyResultData; -} - -export interface RPCSetCertifiedDevicesResult extends RPCCommandMessage { - data: RPCSetCertifiedDevicesResultData; -} - -export interface RPCSetOverlayLockedResult extends RPCCommandMessage { - data: RPCSetOverlayLockedResultData; -} - -export interface RPCSetUserAchievementResult extends RPCCommandMessage { - data: RPCSetUserAchievementResultData; -} - -export interface RPCSetUserVoiceSettingsResult extends RPCCommandMessage { - data: RPCSetUserVoiceSettingsResultData; -} - -export interface RPCSetUserVoiceSettings2Result extends RPCCommandMessage { - data: RPCSetUserVoiceSettings2ResultData; -} - -export interface RPCSetVoiceSettings2Result extends RPCCommandMessage { - data: RPCSetVoiceSettings2ResultData; -} - -export interface RPCStartPurchaseResult extends RPCCommandMessage { - data: RPCStartPurchaseResultData; -} - -export interface RPCUpdateLobbyResult extends RPCCommandMessage { - data: RPCUpdateLobbyResultData; -} - -export interface RPCUpdateLobbyMemberResult extends RPCCommandMessage { - data: RPCUpdateLobbyMemberResultData; -} - -export interface RPCValidateApplicationResult extends RPCCommandMessage { - data: RPCValidateApplicationResultData; -} - -export type RPCCommandsResult = - | RPCAcceptActivityInviteResult - | RPCActivityInviteUserResult - | RPCAuthenticateResult - | RPCAuthorizeResult - | RPCBraintreePopupBridgeCallbackResult - | RPCBrowserResult - | RPCCaptureShortcutResult - | RPCCloseActivityRequestResult - | RPCConnectionsCallbackResult - | RPCConnectToLobbyResult - | RPCConnectToLobbyVoiceResult - | RPCCreateChannelInviteResult - | RPCCreateLobbyResult - | RPCDeepLinkResult - | RPCDeleteLobbyResult - | RPCDisconnectFromLobbyResult - | RPCDisconnectFromLobbyVoiceResult - | RPCGetApplicationTicketResult - | RPCGetChannelResult - | RPCGetChannelsResult - | RPCGetEntitlementsResult - | RPCGetEntitlementTicketResult - | RPCGetGuildResult - | RPCGetGuildsResult - | RPCGetImageResult - | RPCGetNetworkingConfigResult - | RPCGetRelationshipsResult - | RPCGetSelectedVoiceChannelResult - | RPCGetSkusResult - | RPCGetUserAchievementsResult - | RPCGetUserResult - | RPCGetVoiceSettingsResult - | RPCGiftCodeBrowserResult - | RPCGuildTemplateBrowserResult - | RPCInviteBrowserResult - | RPCNetworkingCreateTokenResult - | RPCNetworkingPeerMetricsResult - | RPCNetworkingSystemMetricsResult - | RPCOpenOverlayActivityInviteResult - | RPCOpenOverlayGuildInviteResult - | RPCOpenOverlayVoiceSettingsResult - | RPCOverlayResult - | RPCSearchLobbiesResult - | RPCSelectTextChannelResult - | RPCSelectVoiceChannelResult - | RPCSendActivityJoinInviteResult - | RPCSendToLobbyResult - | RPCSetActivityResult - | RPCSetCertifiedDevicesResult - | RPCSetOverlayLockedResult - | RPCSetUserAchievementResult - | RPCSetUserVoiceSettings2Result - | RPCSetUserVoiceSettingsResult - | RPCSetVoiceSettings2Result - | RPCSetVoiceSettingsResult - | RPCStartPurchaseResult - | RPCSubscribeResult - | RPCUnsubscribeResult - | RPCUpdateLobbyMemberResult - | RPCUpdateLobbyResult - | RPCValidateApplicationResult; - -export interface RPCActivityInviteDispatch extends BaseRPCMessage { - data: RPCActivityInviteDispatchData; - evt: RPCEvents.ActivityInvite; -} - -export interface RPCActivityJoinDispatch extends BaseRPCMessage { - data: RPCActivityJoinDispatchData; - evt: RPCEvents.ActivityJoin; -} - -export interface RPCActivityJoinRequestDispatch extends BaseRPCMessage { - data: RPCActivityJoinRequestDispatchData; - evt: RPCEvents.ActivityJoinRequest; -} - -export interface RPCActivitySpectateDispatch extends BaseRPCMessage { - data: RPCActivitySpectateDispatchData; - evt: RPCEvents.ActivitySpectate; -} - -export interface RPCChannelCreateDispatch extends BaseRPCMessage { - data: RPCChannelCreateDispatchData; - evt: RPCEvents.ChannelCreate; -} - -export interface RPCCurrentUserUpdateDispatch extends BaseRPCMessage { - data: RPCCurrentUserUpdateDispatchData; - evt: RPCEvents.CurrentUserUpdate; -} - -export interface RPCEntitlementCreateDispatch extends BaseRPCMessage { - data: RPCEntitlementCreateDispatchData; - evt: RPCEvents.EntitlementCreate; -} - -export interface RPCEntitlementDeleteDispatch extends BaseRPCMessage { - data: RPCEntitlementDeleteDispatchData; - evt: RPCEvents.EntitlementDelete; -} - -export interface RPCErrorDispatch< - Cmd extends Exclude = Exclude, -> extends RPCCommandMessage { - data: RPCErrorDispatchData; - evt: RPCEvents.Error; -} - -export interface RPCGameJoinDispatch extends BaseRPCMessage { - data: RPCGameJoinDispatchData; - evt: RPCEvents.GameJoin; -} - -export interface RPCGameSpectateDispatch extends BaseRPCMessage { - data: RPCGameSpectateDispatchData; - evt: RPCEvents.GameSpectate; -} - -export interface RPCGuildCreateDispatch extends BaseRPCMessage { - data: RPCGuildCreateDispatchData; - evt: RPCEvents.GuildCreate; -} - -export interface RPCGuildStatusDispatch extends BaseRPCMessage { - data: RPCGuildStatusDispatchData; - evt: RPCEvents.GuildStatus; -} - -export interface RPCLobbyDeleteDispatch extends BaseRPCMessage { - data: RPCLobbyDeleteDispatchData; - evt: RPCEvents.LobbyDelete; -} - -export interface RPCLobbyMemberConnectDispatch extends BaseRPCMessage { - data: RPCLobbyMemberConnectDispatchData; - evt: RPCEvents.LobbyMemberConnect; -} - -export interface RPCLobbyMemberDisconnectDispatch extends BaseRPCMessage { - data: RPCLobbyMemberDisconnectDispatchData; - evt: RPCEvents.LobbyMemberDisconnect; -} - -export interface RPCLobbyMemberUpdateDispatch extends BaseRPCMessage { - data: RPCLobbyMemberUpdateDispatchData; - evt: RPCEvents.LobbyMemberUpdate; -} - -export interface RPCLobbyMessageDispatch extends BaseRPCMessage { - data: RPCLobbyMessageDispatchData; - evt: RPCEvents.LobbyMessage; -} - -export interface RPCLobbyUpdateDispatch extends BaseRPCMessage { - data: RPCLobbyUpdateDispatchData; - evt: RPCEvents.LobbyUpdate; -} - -export interface RPCMessageCreateDispatch extends BaseRPCMessage { - data: RPCMessageCreateDispatchData; - evt: RPCEvents.MessageCreate; -} - -export interface RPCMessageDeleteDispatch extends BaseRPCMessage { - data: RPCMessageDeleteDispatchData; - evt: RPCEvents.MessageDelete; -} - -export interface RPCMessageUpdateDispatch extends BaseRPCMessage { - data: RPCMessageUpdateDispatchData; - evt: RPCEvents.MessageUpdate; -} - -export interface RPCNotificationCreateDispatch extends BaseRPCMessage { - data: RPCNotificationCreateDispatchData; - evt: RPCEvents.NotificationCreate; -} - -export interface RPCOverlayDispatch extends BaseRPCMessage { - data: RPCOverlayDispatchData; - evt: RPCEvents.Overlay; -} - -export interface RPCOverlayUpdateDispatch extends BaseRPCMessage { - data: RPCOverlayUpdateDispatchData; - evt: RPCEvents.OverlayUpdate; -} - -export interface RPCReadyDispatch extends BaseRPCMessage { - data: RPCReadyDispatchData; - evt: RPCEvents.Ready; -} - -export interface RPCRelationshipUpdateDispatch extends BaseRPCMessage { - data: RPCRelationshipUpdateDispatchData; - evt: RPCEvents.RelationshipUpdate; -} - -export interface RPCSpeakingStartDispatch extends BaseRPCMessage { - data: RPCSpeakingStartDispatchData; - evt: RPCEvents.SpeakingStart; -} - -export interface RPCSpeakingStopDispatch extends BaseRPCMessage { - data: RPCSpeakingStopDispatchData; - evt: RPCEvents.SpeakingStop; -} - -export interface RPCUserAchievementUpdateDispatch extends BaseRPCMessage { - data: RPCUserAchievementUpdateDispatchData; - evt: RPCEvents.UserAchievementUpdate; -} - -export interface RPCVoiceChannelSelectDispatch extends BaseRPCMessage { - data: RPCVoiceChannelSelectDispatchData; - evt: RPCEvents.VoiceChannelSelect; -} - -export interface RPCVoiceConnectionStatusDispatch extends BaseRPCMessage { - data: RPCVoiceConnectionStatusDispatchData; - evt: RPCEvents.VoiceConnectionStatus; -} - -export interface RPCVoiceSettingsUpdateDispatch extends BaseRPCMessage { - data: RPCVoiceSettingsUpdateDispatchData; - evt: RPCEvents.VoiceSettingsUpdate; -} - -export interface RPCVoiceSettingsUpdate2Dispatch extends BaseRPCMessage { - data: RPCVoiceSettingsUpdate2DispatchData; - evt: RPCEvents.VoiceSettingsUpdate2; -} - -export interface RPCVoiceStateCreateDispatch extends BaseRPCMessage { - data: RPCVoiceStateCreateDispatchData; - evt: RPCEvents.VoiceStateCreate; -} - -export interface RPCVoiceStateDeleteDispatch extends BaseRPCMessage { - data: RPCVoiceStateDeleteDispatchData; - evt: RPCEvents.VoiceStateDelete; -} - -export interface RPCVoiceStateUpdateDispatch extends BaseRPCMessage { - data: RPCVoiceStateUpdateDispatchData; - evt: RPCEvents.VoiceStateUpdate; -} - -export type RPCEventsDispatch = - | RPCActivityInviteDispatch - | RPCActivityJoinDispatch - | RPCActivityJoinRequestDispatch - | RPCActivitySpectateDispatch - | RPCChannelCreateDispatch - | RPCCurrentUserUpdateDispatch - | RPCEntitlementCreateDispatch - | RPCEntitlementDeleteDispatch - | RPCErrorDispatch - | RPCGameJoinDispatch - | RPCGameSpectateDispatch - | RPCGuildCreateDispatch - | RPCGuildStatusDispatch - | RPCLobbyDeleteDispatch - | RPCLobbyMemberConnectDispatch - | RPCLobbyMemberDisconnectDispatch - | RPCLobbyMemberUpdateDispatch - | RPCLobbyMessageDispatch - | RPCLobbyUpdateDispatch - | RPCMessageCreateDispatch - | RPCMessageDeleteDispatch - | RPCMessageUpdateDispatch - | RPCNotificationCreateDispatch - | RPCOverlayDispatch - | RPCOverlayUpdateDispatch - | RPCReadyDispatch - | RPCRelationshipUpdateDispatch - | RPCSpeakingStartDispatch - | RPCSpeakingStopDispatch - | RPCUserAchievementUpdateDispatch - | RPCVoiceChannelSelectDispatch - | RPCVoiceConnectionStatusDispatch - | RPCVoiceSettingsUpdate2Dispatch - | RPCVoiceSettingsUpdateDispatch - | RPCVoiceStateCreateDispatch - | RPCVoiceStateDeleteDispatch - | RPCVoiceStateUpdateDispatch; - -export type RPCMessage = RPCCommandsResult | RPCEventsDispatch; - -export type RPCMessagePayload = - | RPCCommandAcceptActivityInvitePayload - | RPCCommandActivityInviteUserPayload - | RPCCommandAuthenticatePayload - | RPCCommandAuthorizePayload - | RPCCommandBraintreePopupBridgeCallbackPayload - | RPCCommandBrowserPayload - | RPCCommandCaptureShortcutPayload - | RPCCommandCloseActivityJoinRequestPayload - | RPCCommandConnectionsCallbackPayload - | RPCCommandConnectToLobbyPayload - | RPCCommandConnectToLobbyVoicePayload - | RPCCommandCreateChannelInvitePayload - | RPCCommandCreateLobbyPayload - | RPCCommandDeepLinkPayload - | RPCCommandDeleteLobbyPayload - | RPCCommandDisconnectFromLobbyPayload - | RPCCommandDisconnectFromLobbyVoicePayload - | RPCCommandGetApplicationTicketPayload - | RPCCommandGetChannelPayload - | RPCCommandGetChannelsPayload - | RPCCommandGetEntitlementsPayload - | RPCCommandGetEntitlementTicketPayload - | RPCCommandGetGuildPayload - | RPCCommandGetGuildsPayload - | RPCCommandGetImagePayload - | RPCCommandGetNetworkingConfigPayload - | RPCCommandGetRelationshipsPayload - | RPCCommandGetSelectedVoiceChannelPayload - | RPCCommandGetSkusPayload - | RPCCommandGetUserAchievementsPayload - | RPCCommandGetUserPayload - | RPCCommandGetVoiceSettingsPayload - | RPCCommandGiftCodeBrowserPayload - | RPCCommandGuildTemplateBrowserPayload - | RPCCommandInviteBrowserPayload - | RPCCommandNetworkingCreateTokenPayload - | RPCCommandNetworkingPeerMetricsPayload - | RPCCommandNetworkingSystemMetricsPayload - | RPCCommandOpenOverlayActivityInvitePayload - | RPCCommandOpenOverlayGuildInvitePayload - | RPCCommandOpenOverlayVoiceSettingsPayload - | RPCCommandOverlayPayload - | RPCCommandSearchLobbiesPayload - | RPCCommandSelectTextChannelPayload - | RPCCommandSelectVoiceChannelPayload - | RPCCommandSendActivityJoinInvitePayload - | RPCCommandSendToLobbyPayload - | RPCCommandSetActivityPayload - | RPCCommandSetCertifiedDevicesPayload - | RPCCommandSetOverlayLockedPayload - | RPCCommandSetUserAchievementPayload - | RPCCommandSetUserVoiceSettings2Payload - | RPCCommandSetUserVoiceSettingsPayload - | RPCCommandSetVoiceSettings2Payload - | RPCCommandSetVoiceSettingsPayload - | RPCCommandStartPurchasePayload - | RPCCommandSubscribePayload - | RPCCommandUnsubscribePayload - | RPCCommandUpdateLobbyMemberPayload - | RPCCommandUpdateLobbyPayload - | RPCCommandValidateApplicationPayload; - -// TODO: get rid of all types above as they will be within discord-api-types soon - export enum Events { ApplicationReady = 'ready', Disconnected = 'disconnected', @@ -3561,17 +179,10 @@ export interface MappedRPCCommandsResultsData { [RPCCommands.ActivityInviteUser]: RPCActivityInviteUserResultData; [RPCCommands.BraintreePopupBridgeCallback]: RPCBraintreePopupBridgeCallbackResultData; [RPCCommands.BrowserHandoff]: RPCBrowserHandoffResultData; - [RPCCommands.CaptureShortcut]: RPCCaptureShortcutResultData; - [RPCCommands.CloseActivityJoinRequest]: RPCCloseActivityRequestResultData; - [RPCCommands.ConnectToLobby]: RPCConnectToLobbyResultData; - [RPCCommands.ConnectToLobbyVoice]: RPCConnectToLobbyVoiceResultData; + [RPCCommands.CloseActivityJoinRequest]: RPCCloseActivityJoinRequestResultData; [RPCCommands.ConnectionsCallback]: RPCConnectionsCallbackResultData; [RPCCommands.CreateChannelInvite]: RPCCreateChannelInviteResultData; - [RPCCommands.CreateLobby]: RPCCreateLobbyResultData; [RPCCommands.DeepLink]: RPCDeepLinkResultData; - [RPCCommands.DeleteLobby]: RPCDeleteLobbyResultData; - [RPCCommands.DisconnectFromLobby]: RPCDisconnectFromLobbyResultData; - [RPCCommands.DisconnectFromLobbyVoice]: RPCDisconnectFromLobbyVoiceResultData; [RPCCommands.GetApplicationTicket]: RPCGetApplicationTicketResultData; [RPCCommands.GetEntitlementTicket]: RPCGetEntitlementTicketResultData; [RPCCommands.GetEntitlements]: RPCGetEntitlementsResultData; @@ -3580,7 +191,6 @@ export interface MappedRPCCommandsResultsData { [RPCCommands.GetRelationships]: RPCGetRelationshipsResultData; [RPCCommands.GetSelectedVoiceChannel]: RPCGetSelectedVoiceChannelResultData; [RPCCommands.GetSkus]: RPCGetSkusResultData; - [RPCCommands.GetUserAchievements]: RPCGetUserAchievementsResultData; [RPCCommands.GiftCodeBrowser]: RPCGiftCodeBrowserResultData; [RPCCommands.GuildTemplateBrowser]: RPCGuildTemplateBrowserResultData; [RPCCommands.InviteBrowser]: RPCInviteBrowserResultData; @@ -3591,18 +201,13 @@ export interface MappedRPCCommandsResultsData { [RPCCommands.OpenOverlayGuildInvite]: RPCOpenOverlayGuildInviteResultData; [RPCCommands.OpenOverlayVoiceSettings]: RPCOpenOverlayVoiceSettingsResultData; [RPCCommands.Overlay]: RPCOverlayResultData; - [RPCCommands.SearchLobbies]: RPCSearchLobbiesResultData; [RPCCommands.SendActivityJoinInvite]: RPCSendActivityJoinInviteResultData; - [RPCCommands.SendToLobby]: RPCSendToLobbyResultData; [RPCCommands.SetCertifiedDevices]: RPCSetCertifiedDevicesResultData; [RPCCommands.SetOverlayLocked]: RPCSetOverlayLockedResultData; - [RPCCommands.SetUserAchievement]: RPCSetUserAchievementResultData; [RPCCommands.SetUserVoiceSettings]: RPCSetUserVoiceSettingsResultData; [RPCCommands.SetUserVoiceSettings2]: RPCSetUserVoiceSettings2ResultData; [RPCCommands.SetVoiceSettings2]: RPCSetVoiceSettings2ResultData; [RPCCommands.StartPurchase]: RPCStartPurchaseResultData; - [RPCCommands.UpdateLobby]: RPCUpdateLobbyResultData; - [RPCCommands.UpdateLobbyMember]: RPCUpdateLobbyMemberResultData; [RPCCommands.ValidateApplication]: RPCValidateApplicationResultData; } @@ -3625,17 +230,10 @@ export interface MappedRPCCommandsArgs { [RPCCommands.ActivityInviteUser]: RPCActivityInviteUserArgs; [RPCCommands.BraintreePopupBridgeCallback]: RPCBraintreePopupBridgeCallbackArgs; [RPCCommands.BrowserHandoff]: RPCBrowserHandoffArgs; - [RPCCommands.CaptureShortcut]: RPCCaptureShortcutArgs; - [RPCCommands.CloseActivityJoinRequest]: RPCCloseActivityRequestArgs; - [RPCCommands.ConnectToLobby]: RPCConnectToLobbyArgs; - [RPCCommands.ConnectToLobbyVoice]: RPCConnectToLobbyVoiceArgs; + [RPCCommands.CloseActivityJoinRequest]: RPCCloseActivityJoinRequestArgs; [RPCCommands.ConnectionsCallback]: RPCConnectionsCallbackArgs; [RPCCommands.CreateChannelInvite]: RPCCreateChannelInviteArgs; - [RPCCommands.CreateLobby]: RPCCreateLobbyArgs; [RPCCommands.DeepLink]: RPCDeepLinkArgs; - [RPCCommands.DeleteLobby]: RPCDeleteLobbyArgs; - [RPCCommands.DisconnectFromLobby]: RPCDisconnectFromLobbyArgs; - [RPCCommands.DisconnectFromLobbyVoice]: RPCDisconnectFromLobbyVoiceArgs; [RPCCommands.GetApplicationTicket]: RPCGetApplicationTicketArgs; [RPCCommands.GetEntitlementTicket]: RPCGetEntitlementTicketArgs; [RPCCommands.GetEntitlements]: RPCGetEntitlementsArgs; @@ -3644,7 +242,6 @@ export interface MappedRPCCommandsArgs { [RPCCommands.GetRelationships]: RPCGetRelationshipsArgs; [RPCCommands.GetSelectedVoiceChannel]: RPCGetSelectedVoiceChannelArgs; [RPCCommands.GetSkus]: RPCGetSkusArgs; - [RPCCommands.GetUserAchievements]: RPCGetUserAchievementsArgs; [RPCCommands.GiftCodeBrowser]: RPCGiftCodeBrowserArgs; [RPCCommands.GuildTemplateBrowser]: RPCGuildTemplateBrowserArgs; [RPCCommands.InviteBrowser]: RPCInviteBrowserArgs; @@ -3655,18 +252,13 @@ export interface MappedRPCCommandsArgs { [RPCCommands.OpenOverlayGuildInvite]: RPCOpenOverlayGuildInviteArgs; [RPCCommands.OpenOverlayVoiceSettings]: RPCOpenOverlayVoiceSettingsArgs; [RPCCommands.Overlay]: RPCOverlayArgs; - [RPCCommands.SearchLobbies]: RPCSearchLobbiesArgs; [RPCCommands.SendActivityJoinInvite]: RPCSendActivityJoinInviteArgs; - [RPCCommands.SendToLobby]: RPCSendToLobbyArgs; [RPCCommands.SetCertifiedDevices]: RPCSetCertifiedDevicesArgs; [RPCCommands.SetOverlayLocked]: RPCSetOverlayLockedArgs; - [RPCCommands.SetUserAchievement]: RPCSetUserAchievementArgs; [RPCCommands.SetUserVoiceSettings]: RPCSetUserVoiceSettingsArgs; [RPCCommands.SetUserVoiceSettings2]: RPCSetUserVoiceSettings2Args; [RPCCommands.SetVoiceSettings2]: RPCSetVoiceSettings2Args; [RPCCommands.StartPurchase]: RPCStartPurchaseArgs; - [RPCCommands.UpdateLobby]: RPCUpdateLobbyArgs; - [RPCCommands.UpdateLobbyMember]: RPCUpdateLobbyMemberArgs; [RPCCommands.ValidateApplication]: RPCValidateApplicationArgs; } @@ -3687,12 +279,6 @@ export interface MappedRPCSubscribeEventsArgs { [RPCEvents.GameSpectate]: RPCSubscribeGameSpectateArgs; [RPCEvents.GuildCreate]: RPCSubscribeGuildCreateArgs; [RPCEvents.GuildStatus]: RPCSubscribeGuildStatusArgs; - [RPCEvents.LobbyDelete]: RPCSubscribeLobbyDeleteArgs; - [RPCEvents.LobbyMemberConnect]: RPCSubscribeLobbyMemberConnectArgs; - [RPCEvents.LobbyMemberDisconnect]: RPCSubscribeLobbyMemberDisconnectArgs; - [RPCEvents.LobbyMemberUpdate]: RPCSubscribeLobbyMemberUpdateArgs; - [RPCEvents.LobbyMessage]: RPCSubscribeLobbyMessageArgs; - [RPCEvents.LobbyUpdate]: RPCSubscribeLobbyUpdateArgs; [RPCEvents.MessageCreate]: RPCSubscribeMessageCreateArgs; [RPCEvents.MessageDelete]: RPCSubscribeMessageDeleteArgs; [RPCEvents.MessageUpdate]: RPCSubscribeMessageUpdateArgs; @@ -3702,7 +288,6 @@ export interface MappedRPCSubscribeEventsArgs { [RPCEvents.RelationshipUpdate]: RPCSubscribeRelationshipUpdateArgs; [RPCEvents.SpeakingStart]: RPCSubscribeSpeakingStartArgs; [RPCEvents.SpeakingStop]: RPCSubscribeSpeakingStopArgs; - [RPCEvents.UserAchievementUpdate]: RPCSubscribeUserAchievementUpdateArgs; [RPCEvents.VoiceChannelSelect]: RPCSubscribeVoiceChannelSelectArgs; [RPCEvents.VoiceConnectionStatus]: RPCSubscribeVoiceConnectionStatusArgs; [RPCEvents.VoiceSettingsUpdate]: RPCSubscribeVoiceSettingsUpdateArgs; @@ -3726,12 +311,6 @@ export interface MappedRPCEventsDispatchData { [RPCEvents.GameSpectate]: [RPCGameSpectateDispatchData]; [RPCEvents.GuildCreate]: [RPCGuildCreateDispatchData]; [RPCEvents.GuildStatus]: [RPCGuildStatusDispatchData]; - [RPCEvents.LobbyDelete]: [RPCLobbyDeleteDispatchData]; - [RPCEvents.LobbyMemberConnect]: [RPCLobbyMemberConnectDispatchData]; - [RPCEvents.LobbyMemberDisconnect]: [RPCLobbyMemberDisconnectDispatchData]; - [RPCEvents.LobbyMemberUpdate]: [RPCLobbyMemberUpdateDispatchData]; - [RPCEvents.LobbyMessage]: [RPCLobbyMessageDispatchData]; - [RPCEvents.LobbyUpdate]: [RPCLobbyUpdateDispatchData]; [RPCEvents.MessageCreate]: [RPCMessageCreateDispatchData]; [RPCEvents.MessageDelete]: [RPCMessageDeleteDispatchData]; [RPCEvents.MessageUpdate]: [RPCMessageUpdateDispatchData]; @@ -3742,7 +321,6 @@ export interface MappedRPCEventsDispatchData { [RPCEvents.RelationshipUpdate]: [RPCRelationshipUpdateDispatchData]; [RPCEvents.SpeakingStart]: [RPCSpeakingStartDispatchData]; [RPCEvents.SpeakingStop]: [RPCSpeakingStopDispatchData]; - [RPCEvents.UserAchievementUpdate]: [RPCUserAchievementUpdateDispatchData]; [RPCEvents.VoiceChannelSelect]: [RPCVoiceChannelSelectDispatchData]; [RPCEvents.VoiceConnectionStatus]: [RPCVoiceConnectionStatusDispatchData]; [RPCEvents.VoiceSettingsUpdate]: [RPCVoiceSettingsUpdateDispatchData]; diff --git a/src/ipc.ts b/src/ipc.ts index fcb7bb1..3d60b3b 100644 --- a/src/ipc.ts +++ b/src/ipc.ts @@ -1,11 +1,13 @@ import { AsyncEventEmitter } from '@vladfrangu/async_event_emitter'; +import { RPCMessagePayload } from 'discord-api-types/v10'; import { Buffer } from 'node:buffer'; import { randomUUID } from 'node:crypto'; -import { realpath } from 'node:fs/promises'; +import { Dirent } from 'node:fs'; +import { readdir, realpath } from 'node:fs/promises'; import { createConnection, type Socket } from 'node:net'; +import { resolve } from 'node:path'; import process from 'node:process'; import type { RPCClient } from './client.js'; -import { RPCMessagePayload } from './constants.js'; enum OPCodes { Handshake, @@ -20,15 +22,62 @@ interface HandshakePayload { client_id: string; } +function isDiscordIPCDirectory(rootParent: string, parent: string, directory: string) { + if (parent !== rootParent) { + return true; + } + for (const prefix in ['snap.', '.flatpak']) { + if (directory.startsWith(prefix)) { + return true; + } + } + return false; +} + +function discordIpcFilePredicate(entry: Dirent): boolean { + return ( + entry.isSocket() && + entry.name.startsWith('discord-ipc-') && + !isNaN(parseInt(entry.name.slice('discord-ipc-'.length))) + ); +} + async function getIPCPath(id: number) { if (process.platform === 'win32') { return `\\\\?\\pipe\\discord-ipc-${id}`; } const { XDG_RUNTIME_DIR, TMPDIR, TMP, TEMP } = process.env; - const prefix = await realpath(XDG_RUNTIME_DIR ?? TMPDIR ?? TMP ?? TEMP ?? '/tmp'); + let tempPath = await realpath(XDG_RUNTIME_DIR ?? TMPDIR ?? TMP ?? TEMP ?? '/tmp'); + + // iterate recursively over directories to find 'snap.' or '.flatpak' pipe + if (process.platform === 'linux') { + const directoryQueue = []; + let directory = await readdir(tempPath, { withFileTypes: true }); + while (directory.length > 0) { + for (const entry of directory) { + if (entry.isDirectory()) { + if (entry.name === '.' || entry.name === '..') { + continue; + } + const dirPath = resolve(entry.parentPath, entry.name); + if (!isDiscordIPCDirectory(tempPath, dirPath, entry.name)) { + continue; + } + directoryQueue.push(dirPath); + continue; + } + if (discordIpcFilePredicate(entry)) { + return resolve(entry.parentPath, entry.name); + } + } + while (directory.length === 0 && directoryQueue.length > 0) { + directory = await readdir(directoryQueue.shift()!, { withFileTypes: true }); + } + } + } - return `${prefix.replace(/\/$/, '')}/discord-ipc-${id}`; + return `${tempPath.replace(/\/$/, '')}/discord-ipc-${id}`; } async function getIPC(id = 0): Promise { From 89de9db0c07c1f2bb7ef7d8d8af85d60c529b6f4 Mon Sep 17 00:00:00 2001 From: Micah Benac Date: Thu, 1 May 2025 20:50:51 +0200 Subject: [PATCH 26/26] fix: properly handle activity changes --- src/client.ts | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/src/client.ts b/src/client.ts index dad7c64..523ab74 100644 --- a/src/client.ts +++ b/src/client.ts @@ -439,19 +439,20 @@ export class RPCClient extends AsyncEventEmitter { /** * Sets the presence for the logged in user. * - * @param args The rich presence to pass. + * @param activity The rich presence to pass. * @param pid The application's process ID. Defaults to the executing process' PID. */ - public async setActivity(args: RPCSetActivityArgs['activity'] = {}, pid: number | null = getPid()): Promise { + public async setActivity( + activity: RPCSetActivityArgs['activity'] = {}, + pid: number | null = getPid(), + ): Promise { const newActivity: NullableFields = { - details: args.details, - state: args.state, - instance: Boolean(args.instance), - buttons: args?.buttons, + ...activity, + instance: Boolean(activity.instance), }; - if (args.timestamps) { - newActivity.timestamps = args.timestamps; + if (activity.timestamps) { + newActivity.timestamps = activity.timestamps; if ('start' in newActivity.timestamps && newActivity.timestamps.start > 2_147_483_647_000) { throw new RangeError('timestamps.start must fit into a unix timestamp'); } @@ -461,16 +462,16 @@ export class RPCClient extends AsyncEventEmitter { } } - if ('assets' in args) { - newActivity.assets = args.assets; + if ('assets' in activity) { + newActivity.assets = activity.assets; } - if ('party' in args) { - newActivity.party = args.party; + if ('party' in activity) { + newActivity.party = activity.party; } - if ('secrets' in args) { - newActivity.secrets = args.secrets; + if ('secrets' in activity) { + newActivity.secrets = activity.secrets; } return this.#request(RPCCommands.SetActivity, {