this repo has no description

Compare changes

Choose any two refs to compare.

Changed files
+4019 -1758
.github
nix
packages
scripts
+4 -8
.github/workflows/browser.yml
··· 10 10 name: Browser extension builds 11 11 runs-on: ubuntu-latest 12 12 steps: 13 - - uses: actions/checkout@v3 14 - 15 - - uses: pnpm/action-setup@v2 16 - with: 17 - version: 9 18 - run_install: false 19 - - uses: actions/setup-node@v3 13 + - uses: actions/checkout@v4 14 + - uses: pnpm/action-setup@v4 15 + - uses: actions/setup-node@v4 20 16 with: 21 - node-version: 18 17 + node-version: 22 22 18 cache: pnpm 23 19 24 20 - name: Install dependencies
+4 -8
.github/workflows/lint.yml
··· 9 9 name: Lint commits 10 10 runs-on: ubuntu-latest 11 11 steps: 12 - - uses: actions/checkout@v3 13 - 14 - - uses: pnpm/action-setup@v2 15 - with: 16 - version: 9 17 - run_install: false 18 - - uses: actions/setup-node@v3 12 + - uses: actions/checkout@v4 13 + - uses: pnpm/action-setup@v4 14 + - uses: actions/setup-node@v4 19 15 with: 20 - node-version: 18 16 + node-version: 22 21 17 cache: pnpm 22 18 23 19 - name: Install dependencies
+4 -8
.github/workflows/nightly.yml
··· 15 15 name: Nightly builds on GitHub Pages 16 16 runs-on: ubuntu-latest 17 17 steps: 18 - - uses: actions/checkout@v3 19 - 20 - - uses: pnpm/action-setup@v2 21 - with: 22 - version: 9 23 - run_install: false 24 - - uses: actions/setup-node@v3 18 + - uses: actions/checkout@v4 19 + - uses: pnpm/action-setup@v4 20 + - uses: actions/setup-node@v4 25 21 with: 26 - node-version: 18 22 + node-version: 22 27 23 cache: pnpm 28 24 29 25 - name: Install dependencies
+16
.github/workflows/nix.yml
··· 1 + name: Check Nix flake 2 + on: [push, pull_request] 3 + 4 + permissions: 5 + checks: write 6 + 7 + jobs: 8 + nix: 9 + name: Check Nix flake 10 + runs-on: ubuntu-latest 11 + steps: 12 + - uses: actions/checkout@v4 13 + - uses: DeterminateSystems/nix-installer-action@main 14 + 15 + - name: Build default flake output 16 + run: nix build
+4 -8
.github/workflows/release.yml
··· 13 13 name: Release builds to GitHub Releases 14 14 runs-on: ubuntu-latest 15 15 steps: 16 - - uses: actions/checkout@v3 17 - 18 - - uses: pnpm/action-setup@v2 19 - with: 20 - version: 9 21 - run_install: false 22 - - uses: actions/setup-node@v3 16 + - uses: actions/checkout@v4 17 + - uses: pnpm/action-setup@v4 18 + - uses: actions/setup-node@v4 23 19 with: 24 - node-version: 18 20 + node-version: 22 25 21 cache: pnpm 26 22 27 23 - name: Install dependencies
+5 -11
.github/workflows/types.yml
··· 11 11 name: Publish types on npm 12 12 runs-on: ubuntu-latest 13 13 steps: 14 - - uses: actions/checkout@v3 15 - 16 - - uses: pnpm/action-setup@v2 17 - with: 18 - version: 9 19 - run_install: false 20 - - uses: actions/setup-node@v3 14 + - uses: actions/checkout@v4 15 + - uses: pnpm/action-setup@v4 16 + - uses: actions/setup-node@v4 21 17 with: 22 - node-version: 18 18 + node-version: 22 23 19 cache: pnpm 24 20 registry-url: https://registry.npmjs.org 25 21 ··· 31 27 run: pnpm run build 32 28 33 29 - name: Publish types 34 - run: | 35 - cd packages/types 36 - pnpm publish --access public --no-git-checks 30 + run: pnpm publish --filter=./packages/types --access public --no-git-checks 37 31 env: 38 32 NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
+1 -1
.gitignore
··· 3 3 dist.tar.gz 4 4 .DS_Store 5 5 eslint_report.json 6 - 6 + .eslintcache 7 7 # Nix 8 8 /result 9 9 *.drv
+4 -4
.prettierrc
··· 1 1 { 2 - "printWidth": 120, 3 - "trailingComma": "none", 4 - "tabWidth": 2, 5 - "singleQuote": false 2 + "printWidth": 120, 3 + "trailingComma": "none", 4 + "tabWidth": 2, 5 + "singleQuote": false 6 6 }
+2 -24
CHANGELOG.md
··· 1 - ## Moonbase 2 - 3 - - Moved entry to the top of the settings menu 4 - - Added about section 5 - - Fixed the moonlight menu in the tray icon duplicating over time 6 - - Added the ability to switch moonlight branches from the tray icon 7 - - Added the ability to use Markdown in settings descriptions 8 - 9 1 ## Core 10 2 11 - - Fixed the Discord overlay being broken 12 - - Fixed script blocking issue that would, among other things, break TikTok embeds 13 - - Added simple error handling to injected Webpack modules 14 - 15 - ## Libraries 16 - 17 - - Added Component Editor library 18 - - Added Commands library 19 - - Spacepack: Introduced logging for failed finds 20 - - Spacepack: Deprecated findByExports 21 - 22 - ## Misc 23 - 24 - - Updated README 25 - - Introduced new `create-extension` CLI tool 26 - - The manifest schema is now automatically generated 3 + - Updated mappings 4 + - Fixed using remapped paths as patch finds not working
+4 -73
flake.lock
··· 18 18 "type": "github" 19 19 } 20 20 }, 21 - "flake-utils_2": { 22 - "inputs": { 23 - "systems": "systems_2" 24 - }, 25 - "locked": { 26 - "lastModified": 1701680307, 27 - "narHash": "sha256-kAuep2h5ajznlPMD9rnQyffWG8EM/C73lejGofXvdM8=", 28 - "owner": "numtide", 29 - "repo": "flake-utils", 30 - "rev": "4022d587cbbfd70fe950c1e2083a02621806a725", 31 - "type": "github" 32 - }, 33 - "original": { 34 - "owner": "numtide", 35 - "repo": "flake-utils", 36 - "type": "github" 37 - } 38 - }, 39 21 "nixpkgs": { 40 22 "locked": { 41 - "lastModified": 1728067476, 42 - "narHash": "sha256-/uJcVXuBt+VFCPQIX+4YnYrHaubJSx4HoNsJVNRgANM=", 23 + "lastModified": 1744232761, 24 + "narHash": "sha256-gbl9hE39nQRpZaLjhWKmEu5ejtQsgI5TWYrIVVJn30U=", 43 25 "owner": "NixOS", 44 26 "repo": "nixpkgs", 45 - "rev": "6e6b3dd395c3b1eb9be9f2d096383a8d05add030", 27 + "rev": "f675531bc7e6657c10a18b565cfebd8aa9e24c14", 46 28 "type": "github" 47 29 }, 48 30 "original": { 49 31 "owner": "NixOS", 50 - "ref": "nixos-24.05", 51 - "repo": "nixpkgs", 52 - "type": "github" 53 - } 54 - }, 55 - "nixpkgs_2": { 56 - "locked": { 57 - "lastModified": 1736344531, 58 - "narHash": "sha256-8YVQ9ZbSfuUk2bUf2KRj60NRraLPKPS0Q4QFTbc+c2c=", 59 - "owner": "nixos", 60 - "repo": "nixpkgs", 61 - "rev": "bffc22eb12172e6db3c5dde9e3e5628f8e3e7912", 62 - "type": "github" 63 - }, 64 - "original": { 65 - "owner": "nixos", 66 32 "ref": "nixos-unstable", 67 33 "repo": "nixpkgs", 68 34 "type": "github" 69 35 } 70 36 }, 71 - "pnpm2nix": { 72 - "inputs": { 73 - "flake-utils": "flake-utils_2", 74 - "nixpkgs": "nixpkgs_2" 75 - }, 76 - "locked": { 77 - "lastModified": 1736457458, 78 - "narHash": "sha256-eiw+hAsxavEgBfhwrktNI2hwvgeVDzBDYClx/yqka78=", 79 - "owner": "NotNite", 80 - "repo": "pnpm2nix-nzbr", 81 - "rev": "4ac61c6a50623da937dca005e3dbcb8862aafb83", 82 - "type": "github" 83 - }, 84 - "original": { 85 - "owner": "NotNite", 86 - "repo": "pnpm2nix-nzbr", 87 - "type": "github" 88 - } 89 - }, 90 37 "root": { 91 38 "inputs": { 92 39 "flake-utils": "flake-utils", 93 - "nixpkgs": "nixpkgs", 94 - "pnpm2nix": "pnpm2nix" 40 + "nixpkgs": "nixpkgs" 95 41 } 96 42 }, 97 43 "systems": { 98 - "locked": { 99 - "lastModified": 1681028828, 100 - "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", 101 - "owner": "nix-systems", 102 - "repo": "default", 103 - "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", 104 - "type": "github" 105 - }, 106 - "original": { 107 - "owner": "nix-systems", 108 - "repo": "default", 109 - "type": "github" 110 - } 111 - }, 112 - "systems_2": { 113 44 "locked": { 114 45 "lastModified": 1681028828, 115 46 "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+3 -4
flake.nix
··· 2 2 description = "Yet another Discord mod"; 3 3 4 4 inputs = { 5 - nixpkgs.url = "github:NixOS/nixpkgs/nixos-24.05"; 5 + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; 6 6 flake-utils.url = "github:numtide/flake-utils"; 7 - pnpm2nix.url = "github:NotNite/pnpm2nix-nzbr"; 8 7 }; 9 8 10 - outputs = { self, nixpkgs, flake-utils, pnpm2nix }: 11 - let overlay = import ./nix/overlay.nix { inherit pnpm2nix; }; 9 + outputs = { self, nixpkgs, flake-utils }: 10 + let overlay = import ./nix/overlay.nix { }; 12 11 in flake-utils.lib.eachDefaultSystem (system: 13 12 let 14 13 pkgs = import nixpkgs {
+40 -17
nix/default.nix
··· 1 - { pkgs, mkPnpmPackage }: 1 + { 2 + lib, 3 + stdenv, 4 + nodejs_22, 5 + pnpm_10, 6 + }: 7 + 8 + stdenv.mkDerivation (finalAttrs: { 9 + pname = "moonlight"; 10 + version = (builtins.fromJSON (builtins.readFile ./../package.json)).version; 2 11 3 - mkPnpmPackage rec { 4 - workspace = ./..; 5 12 src = ./..; 6 13 7 - # Work around a bug with how it expects dist 8 - components = [ 9 - "packages/core" 10 - "packages/core-extensions" 11 - "packages/injector" 12 - "packages/node-preload" 13 - "packages/types" 14 - "packages/web-preload" 14 + nativeBuildInputs = [ 15 + nodejs_22 16 + pnpm_10.configHook 15 17 ]; 16 - distDirs = [ "dist" ]; 18 + 19 + pnpmDeps = pnpm_10.fetchDeps { 20 + inherit (finalAttrs) pname version src; 21 + hash = "sha256-I+zRCUqJabpGJRFBGW0NrM9xzyzeCjioF54zlCpynBU="; 22 + }; 17 23 18 - copyNodeModules = true; 19 - buildPhase = "pnpm run build"; 20 - installPhase = "cp -r dist $out"; 24 + env = { 25 + NODE_ENV = "production"; 26 + MOONLIGHT_VERSION = "v${finalAttrs.version}"; 27 + }; 28 + 29 + buildPhase = '' 30 + runHook preBuild 21 31 22 - meta = with pkgs.lib; { 32 + pnpm run build 33 + 34 + runHook postBuild 35 + ''; 36 + 37 + installPhase = '' 38 + runHook preInstall 39 + 40 + cp -r dist $out 41 + 42 + runHook postInstall 43 + ''; 44 + 45 + meta = with lib; { 23 46 description = "Yet another Discord mod"; 24 47 homepage = "https://moonlight-mod.github.io/"; 25 48 license = licenses.lgpl3; 26 49 maintainers = with maintainers; [ notnite ]; 27 50 }; 28 - } 51 + })
+3 -6
nix/overlay.nix
··· 1 - { pnpm2nix }: 1 + { ... }: 2 2 3 3 let 4 4 nameTable = { ··· 29 29 ''; 30 30 31 31 packageJson = '' 32 - {"name":"discord","main":"./injector.js","private":true} 32 + {"name":"${name}","main":"./injector.js","private":true} 33 33 ''; 34 34 35 35 in old.installPhase + "\n" + '' ··· 49 49 ''; 50 50 }); 51 51 in final: prev: rec { 52 - moonlight-mod = final.callPackage ./default.nix { 53 - pkgs = final; 54 - mkPnpmPackage = pnpm2nix.packages.${final.system}.mkPnpmPackage; 55 - }; 52 + moonlight-mod = final.callPackage ./default.nix { }; 56 53 discord = mkOverride prev moonlight-mod "discord"; 57 54 discord-ptb = mkOverride prev moonlight-mod "discord-ptb"; 58 55 discord-canary = mkOverride prev moonlight-mod "discord-canary";
+23 -12
package.json
··· 1 1 { 2 2 "name": "moonlight", 3 - "version": "1.3.2", 3 + "version": "1.3.14", 4 + "packageManager": "pnpm@10.7.1", 4 5 "description": "Yet another Discord mod", 5 - "homepage": "https://moonlight-mod.github.io/", 6 6 "license": "LGPL-3.0-or-later", 7 + "homepage": "https://moonlight-mod.github.io/", 7 8 "repository": { 8 9 "type": "git", 9 10 "url": "git+https://github.com/moonlight-mod/moonlight.git" ··· 11 12 "bugs": { 12 13 "url": "https://github.com/moonlight-mod/moonlight/issues" 13 14 }, 15 + "engineStrict": true, 16 + "engines": { 17 + "node": ">=22", 18 + "pnpm": ">=10", 19 + "npm": "pnpm", 20 + "yarn": "pnpm" 21 + }, 14 22 "scripts": { 15 23 "build": "node build.mjs", 16 24 "dev": "node build.mjs --watch", ··· 18 26 "browser": "node build.mjs --browser", 19 27 "browser-mv2": "node build.mjs --browser --mv2", 20 28 "lint": "eslint packages", 21 - "lint:fix": "eslint packages --fix", 22 - "lint:report": "eslint --output-file eslint_report.json --format json packages", 29 + "lint:fix": "pnpm lint --fix", 30 + "lint:report": "pnpm lint --output-file eslint_report.json --format json", 23 31 "typecheck": "tsc --noEmit", 24 32 "check": "pnpm run lint && pnpm run typecheck", 25 - "prepare": "husky install" 33 + "prepare": "husky install", 34 + "updates": "pnpm taze -r" 26 35 }, 27 36 "devDependencies": { 28 - "esbuild": "^0.19.3", 29 - "esbuild-copy-static-files": "^0.1.0", 30 - "eslint": "^9.12.0", 31 - "@moonlight-mod/eslint-config": "github:moonlight-mod/eslint-config", 32 - "husky": "^8.0.3", 33 - "prettier": "^3.1.0", 34 - "typescript": "^5.3.2" 37 + "@moonlight-mod/eslint-config": "catalog:dev", 38 + "@types/node": "catalog:dev", 39 + "esbuild": "catalog:dev", 40 + "esbuild-copy-static-files": "catalog:dev", 41 + "eslint": "catalog:dev", 42 + "husky": "catalog:dev", 43 + "prettier": "catalog:dev", 44 + "taze": "catalog:dev", 45 + "typescript": "catalog:dev" 35 46 } 36 47 }
+2 -1
packages/browser/blockLoading.json
··· 6 6 "type": "block" 7 7 }, 8 8 "condition": { 9 - "urlFilter": "*://discord.com/assets/*.js", 9 + "requestDomains": ["discord.com", "discordapp.com"], 10 + "urlFilter": "*/assets/*.js", 10 11 "resourceTypes": ["script"] 11 12 } 12 13 }
+10 -4
packages/browser/manifest.json
··· 1 1 { 2 + "$schema": "https://json.schemastore.org/chrome-manifest", 2 3 "manifest_version": 3, 3 4 "name": "moonlight", 4 5 "description": "Yet another Discord mod", 5 - "version": "1.3.2", 6 + "version": "1.3.14", 6 7 "permissions": ["declarativeNetRequestWithHostAccess", "webRequest", "scripting", "webNavigation"], 7 - "host_permissions": ["https://moonlight-mod.github.io/*", "https://api.github.com/*", "https://*.discord.com/*"], 8 + "host_permissions": [ 9 + "https://moonlight-mod.github.io/*", 10 + "https://api.github.com/*", 11 + "https://*.discord.com/*", 12 + "https://*.discordapp.com/*" 13 + ], 8 14 "content_scripts": [ 9 15 { 10 16 "js": ["index.js"], 11 - "matches": ["https://*.discord.com/*"], 17 + "matches": ["https://*.discord.com/*", "https://*.discordapp.com/*"], 12 18 "run_at": "document_start", 13 19 "world": "MAIN" 14 20 } ··· 34 40 "web_accessible_resources": [ 35 41 { 36 42 "resources": ["index.js"], 37 - "matches": ["https://*.discord.com/*"] 43 + "matches": ["https://*.discord.com/*", "https://*.discordapp.com/*"] 38 44 } 39 45 ] 40 46 }
+6 -5
packages/browser/manifestv2.json
··· 1 1 { 2 + "$schema": "https://json.schemastore.org/chrome-manifest", 2 3 "manifest_version": 2, 3 4 "name": "moonlight", 4 5 "description": "Yet another Discord mod", 5 - "version": "1.3.2", 6 + "version": "1.3.14", 6 7 "permissions": [ 7 8 "webRequest", 8 9 "webRequestBlocking", 9 10 "scripting", 10 11 "webNavigation", 11 - "https://*.discord.com/assets/*.js", 12 + "https://*.discord.com/*", 13 + "https://*.discordapp.com/*", 12 14 "https://moonlight-mod.github.io/*", 13 - "https://api.github.com/*", 14 - "https://*.discord.com/*" 15 + "https://api.github.com/*" 15 16 ], 16 17 "background": { 17 18 "scripts": ["background.js"] ··· 19 20 "content_scripts": [ 20 21 { 21 22 "js": ["index.js"], 22 - "matches": ["https://*.discord.com/*"], 23 + "matches": ["https://*.discord.com/*", "https://*.discordapp.com/*"], 23 24 "run_at": "document_start", 24 25 "world": "MAIN" 25 26 }
+12 -2
packages/browser/package.json
··· 1 1 { 2 2 "name": "@moonlight-mod/browser", 3 3 "private": true, 4 + "engines": { 5 + "node": ">=22", 6 + "pnpm": ">=10", 7 + "npm": "pnpm", 8 + "yarn": "pnpm" 9 + }, 4 10 "dependencies": { 5 11 "@moonlight-mod/core": "workspace:*", 6 12 "@moonlight-mod/types": "workspace:*", 7 13 "@moonlight-mod/web-preload": "workspace:*", 8 - "@zenfs/core": "^1.0.2", 9 - "@zenfs/dom": "^0.2.16" 14 + "@zenfs/core": "catalog:prod", 15 + "@zenfs/dom": "catalog:prod" 16 + }, 17 + "engineStrict": true, 18 + "devDependencies": { 19 + "@types/chrome": "catalog:dev" 10 20 } 11 21 }
+55 -70
packages/browser/src/background-mv2.js
··· 1 1 /* eslint-disable no-console */ 2 2 /* eslint-disable no-undef */ 3 3 4 - const starterUrls = ["web.", "sentry."]; 5 - let blockLoading = true; 6 - let doing = false; 7 - let collectedUrls = new Set(); 4 + const scriptUrls = ["web.", "sentry."]; 5 + let blockedScripts = new Set(); 8 6 9 - chrome.webNavigation.onBeforeNavigate.addListener(async (details) => { 10 - const url = new URL(details.url); 11 - if (!blockLoading && url.hostname.endsWith("discord.com")) { 12 - console.log("Blocking", details.url); 13 - blockLoading = true; 14 - collectedUrls.clear(); 15 - } 16 - }); 7 + chrome.webRequest.onBeforeRequest.addListener( 8 + async (details) => { 9 + if (details.tabId === -1) return; 17 10 18 - async function doTheThing(urls, tabId) { 19 - console.log("Doing", urls, tabId); 11 + const url = new URL(details.url); 12 + const hasUrl = scriptUrls.some((scriptUrl) => { 13 + return ( 14 + details.url.includes(scriptUrl) && 15 + !url.searchParams.has("inj") && 16 + (url.host.endsWith("discord.com") || url.host.endsWith("discordapp.com")) 17 + ); 18 + }); 19 + if (hasUrl) blockedScripts.add(details.url); 20 20 21 - blockLoading = false; 21 + if (blockedScripts.size === scriptUrls.length) { 22 + const blockedScriptsCopy = Array.from(blockedScripts); 23 + blockedScripts.clear(); 22 24 23 - try { 24 - await chrome.scripting.executeScript({ 25 - target: { tabId }, 26 - world: "MAIN", 27 - args: [urls], 28 - func: async (urls) => { 29 - try { 30 - await window._moonlightBrowserInit(); 31 - } catch (e) { 32 - console.log(e); 33 - } 25 + setTimeout(async () => { 26 + console.log("Starting moonlight"); 27 + await chrome.scripting.executeScript({ 28 + target: { tabId: details.tabId }, 29 + world: "MAIN", 30 + args: [blockedScriptsCopy], 31 + func: async (blockedScripts) => { 32 + console.log("Initializing moonlight"); 33 + try { 34 + await window._moonlightBrowserInit(); 35 + } catch (e) { 36 + console.error(e); 37 + } 34 38 35 - const scripts = [...document.querySelectorAll("script")].filter( 36 - (script) => script.src && urls.some((url) => url.includes(script.src)) 37 - ); 39 + console.log("Readding scripts"); 40 + try { 41 + const scripts = [...document.querySelectorAll("script")].filter( 42 + (script) => script.src && blockedScripts.some((url) => url.includes(script.src)) 43 + ); 38 44 39 - // backwards 40 - urls.reverse(); 41 - for (const url of urls) { 42 - const script = scripts.find((script) => url.includes(script.src)); 43 - console.log("adding new script", script); 45 + blockedScripts.reverse(); 46 + for (const url of blockedScripts) { 47 + if (url.includes("/sentry.")) continue; 44 48 45 - const newScript = document.createElement("script"); 46 - for (const { name, value } of script.attributes) { 47 - newScript.setAttribute(name, value); 49 + const script = scripts.find((script) => url.includes(script.src)); 50 + const newScript = document.createElement("script"); 51 + for (const attr of script.attributes) { 52 + if (attr.name === "src") attr.value += "?inj"; 53 + newScript.setAttribute(attr.name, attr.value); 54 + } 55 + script.remove(); 56 + document.documentElement.appendChild(newScript); 57 + } 58 + } catch (e) { 59 + console.error(e); 60 + } 48 61 } 49 - 50 - script.remove(); 51 - document.documentElement.appendChild(newScript); 52 - } 53 - } 54 - }); 55 - } catch (e) { 56 - console.log(e); 57 - } 58 - 59 - doing = false; 60 - collectedUrls.clear(); 61 - } 62 - 63 - chrome.webRequest.onBeforeRequest.addListener( 64 - async (details) => { 65 - if (starterUrls.some((url) => details.url.includes(url))) { 66 - console.log("Adding", details.url); 67 - collectedUrls.add(details.url); 62 + }); 63 + }, 0); 68 64 } 69 65 70 - if (collectedUrls.size === starterUrls.length) { 71 - if (doing) return; 72 - if (!blockLoading) return; 73 - doing = true; 74 - const urls = [...collectedUrls]; 75 - const tabId = details.tabId; 76 - 77 - // yes this is a load-bearing sleep 78 - setTimeout(() => doTheThing(urls, tabId), 0); 79 - } 80 - 81 - if (blockLoading) return { cancel: true }; 66 + if (hasUrl) return { cancel: true }; 82 67 }, 83 68 { 84 - urls: ["https://*.discord.com/assets/*.js"] 69 + urls: ["https://*.discord.com/assets/*.js", "https://*.discordapp.com/assets/*.js"] 85 70 }, 86 71 ["blocking"] 87 72 ); ··· 94 79 ) 95 80 }; 96 81 }, 97 - { urls: ["https://*.discord.com/*"] }, 82 + { urls: ["https://*.discord.com/*", "https://*.discordapp.com/*"] }, 98 83 ["blocking", "responseHeaders"] 99 84 );
+37 -39
packages/browser/src/background.js
··· 1 1 /* eslint-disable no-console */ 2 2 /* eslint-disable no-undef */ 3 3 4 - const starterUrls = ["web.", "sentry."]; 5 - let blockLoading = true; 6 - let doing = false; 7 - let collectedUrls = new Set(); 4 + const scriptUrls = ["web.", "sentry."]; 5 + let blockedScripts = new Set(); 8 6 9 7 chrome.webNavigation.onBeforeNavigate.addListener(async (details) => { 10 8 const url = new URL(details.url); 11 - if (!blockLoading && url.hostname.endsWith("discord.com")) { 9 + if ( 10 + !url.searchParams.has("inj") && 11 + (url.hostname.endsWith("discord.com") || url.hostname.endsWith("discordapp.com")) 12 + ) { 13 + console.log("Enabling block ruleset"); 12 14 await chrome.declarativeNetRequest.updateEnabledRulesets({ 13 15 enableRulesetIds: ["modifyResponseHeaders", "blockLoading"] 14 16 }); 15 - blockLoading = true; 16 - collectedUrls.clear(); 17 17 } 18 18 }); 19 19 20 20 chrome.webRequest.onBeforeRequest.addListener( 21 21 async (details) => { 22 22 if (details.tabId === -1) return; 23 - if (starterUrls.some((url) => details.url.includes(url))) { 24 - console.log("Adding", details.url); 25 - collectedUrls.add(details.url); 26 - } 27 23 28 - if (collectedUrls.size === starterUrls.length) { 29 - if (doing) return; 30 - if (!blockLoading) return; 31 - doing = true; 32 - const urls = [...collectedUrls]; 33 - console.log("Doing", urls); 24 + const url = new URL(details.url); 25 + const hasUrl = scriptUrls.some((scriptUrl) => { 26 + return ( 27 + details.url.includes(scriptUrl) && 28 + !url.searchParams.has("inj") && 29 + (url.hostname.endsWith("discord.com") || url.hostname.endsWith("discordapp.com")) 30 + ); 31 + }); 32 + 33 + if (hasUrl) blockedScripts.add(details.url); 34 + 35 + if (blockedScripts.size === scriptUrls.length) { 36 + const blockedScriptsCopy = Array.from(blockedScripts); 37 + blockedScripts.clear(); 34 38 35 39 console.log("Running moonlight script"); 36 40 try { ··· 40 44 files: ["index.js"] 41 45 }); 42 46 } catch (e) { 43 - console.log(e); 47 + console.error(e); 44 48 } 45 49 46 50 console.log("Initializing moonlight"); ··· 52 56 try { 53 57 await window._moonlightBrowserInit(); 54 58 } catch (e) { 55 - console.log(e); 59 + console.error(e); 56 60 } 57 61 } 58 62 }); ··· 60 64 console.log(e); 61 65 } 62 66 63 - console.log("Updating rulesets"); 67 + console.log("Disabling block ruleset"); 64 68 try { 65 - blockLoading = false; 66 69 await chrome.declarativeNetRequest.updateEnabledRulesets({ 67 70 disableRulesetIds: ["blockLoading"], 68 71 enableRulesetIds: ["modifyResponseHeaders"] 69 72 }); 70 73 } catch (e) { 71 - console.log(e); 74 + console.error(e); 72 75 } 73 76 74 77 console.log("Readding scripts"); ··· 76 79 await chrome.scripting.executeScript({ 77 80 target: { tabId: details.tabId }, 78 81 world: "MAIN", 79 - args: [urls], 80 - func: async (urls) => { 82 + args: [blockedScriptsCopy], 83 + func: async (blockedScripts) => { 81 84 const scripts = [...document.querySelectorAll("script")].filter( 82 - (script) => script.src && urls.some((url) => url.includes(script.src)) 85 + (script) => script.src && blockedScripts.some((url) => url.includes(script.src)) 83 86 ); 84 87 85 - // backwards 86 - urls.reverse(); 87 - for (const url of urls) { 88 - const script = scripts.find((script) => url.includes(script.src)); 89 - console.log("adding new script", script); 88 + blockedScripts.reverse(); 89 + for (const url of blockedScripts) { 90 + if (url.includes("/sentry.")) continue; 90 91 92 + const script = scripts.find((script) => url.includes(script.src)); 91 93 const newScript = document.createElement("script"); 92 - for (const { name, value } of script.attributes) { 93 - newScript.setAttribute(name, value); 94 + for (const attr of script.attributes) { 95 + if (attr.name === "src") attr.value += "?inj"; 96 + newScript.setAttribute(attr.name, attr.value); 94 97 } 95 - 96 98 script.remove(); 97 99 document.documentElement.appendChild(newScript); 98 100 } 99 101 } 100 102 }); 101 103 } catch (e) { 102 - console.log(e); 104 + console.error(e); 103 105 } 104 - 105 - console.log("Done"); 106 - doing = false; 107 - collectedUrls.clear(); 108 106 } 109 107 }, 110 108 { 111 - urls: ["*://*.discord.com/assets/*.js"] 109 + urls: ["*://*.discord.com/assets/*.js", "*://*.discordapp.com/assets/*.js"] 112 110 } 113 111 );
+10 -12
packages/browser/src/index.ts
··· 6 6 import { MoonlightBranch, MoonlightNode } from "@moonlight-mod/types"; 7 7 import { getConfig, getConfigOption, getManifest, setConfigOption } from "@moonlight-mod/core/util/config"; 8 8 import { IndexedDB } from "@zenfs/dom"; 9 - import { configure } from "@zenfs/core"; 9 + import { configureSingle } from "@zenfs/core"; 10 10 import * as fs from "@zenfs/core/promises"; 11 + import { NodeEventPayloads, NodeEventType } from "@moonlight-mod/types/core/event"; 12 + import { createEventEmitter } from "@moonlight-mod/core/util/event"; 11 13 12 14 function getParts(path: string) { 13 15 if (path.startsWith("/")) path = path.substring(1); ··· 18 20 delete window._moonlightBrowserInit; 19 21 20 22 // Set up a virtual filesystem with IndexedDB 21 - await configure({ 22 - mounts: { 23 - "/": { 24 - backend: IndexedDB, 25 - // eslint-disable-next-line @typescript-eslint/ban-ts-comment 26 - // @ts-ignore tsc tweaking 27 - storeName: "moonlight-fs" 28 - } 29 - } 23 + await configureSingle({ 24 + backend: IndexedDB, 25 + storeName: "moonlight-fs" 30 26 }); 31 27 32 28 window.moonlightNodeSandboxed = { ··· 116 112 processedExtensions, 117 113 nativesCache: {}, 118 114 isBrowser: true, 115 + events: createEventEmitter<NodeEventType, NodeEventPayloads>(), 119 116 120 117 version: MOONLIGHT_VERSION, 121 118 branch: MOONLIGHT_BRANCH as MoonlightBranch, ··· 127 124 const manifest = getManifest(extensions, ext); 128 125 return getConfigOption(ext, name, config, manifest?.settings); 129 126 }, 130 - setConfigOption(ext, name, value) { 127 + async setConfigOption(ext, name, value) { 131 128 setConfigOption(config, ext, name, value); 132 - this.writeConfig(config); 129 + await this.writeConfig(config); 133 130 }, 134 131 135 132 getNatives: () => {}, ··· 147 144 async writeConfig(newConfig) { 148 145 await writeConfig(newConfig); 149 146 config = newConfig; 147 + this.events.dispatchEvent(NodeEventType.ConfigSaved, newConfig); 150 148 } 151 149 }; 152 150
+1
packages/browser/tsconfig.json
··· 1 1 { 2 2 "extends": "../../tsconfig.json", 3 3 "compilerOptions": { 4 + "lib": ["DOM", "ESNext", "ESNext.AsyncIterable"], 4 5 "module": "ES2022" 5 6 } 6 7 }
+7
packages/core/package.json
··· 4 4 "exports": { 5 5 "./*": "./src/*.ts" 6 6 }, 7 + "engineStrict": true, 8 + "engines": { 9 + "node": ">=22", 10 + "pnpm": ">=10", 11 + "npm": "pnpm", 12 + "yarn": "pnpm" 13 + }, 7 14 "dependencies": { 8 15 "@moonlight-mod/types": "workspace:*" 9 16 }
+5 -5
packages/core/src/extension/loader.ts
··· 13 13 import calculateDependencies from "../util/dependency"; 14 14 import { createEventEmitter } from "../util/event"; 15 15 import { registerStyles } from "../styles"; 16 - import { EventPayloads, EventType } from "@moonlight-mod/types/core/event"; 16 + import { WebEventPayloads, WebEventType } from "@moonlight-mod/types/core/event"; 17 17 18 18 const logger = new Logger("core/extension/loader"); 19 19 ··· 202 202 } 203 203 204 204 export async function loadProcessedExtensions({ extensions, dependencyGraph }: ProcessedExtensions) { 205 - const eventEmitter = createEventEmitter<EventType, EventPayloads>(); 205 + const eventEmitter = createEventEmitter<WebEventType, WebEventPayloads>(); 206 206 const finished: Set<string> = new Set(); 207 207 208 208 logger.trace( ··· 224 224 } 225 225 226 226 function done() { 227 - eventEmitter.removeEventListener(EventType.ExtensionLoad, cb); 227 + eventEmitter.removeEventListener(WebEventType.ExtensionLoad, cb); 228 228 r(); 229 229 } 230 230 231 - eventEmitter.addEventListener(EventType.ExtensionLoad, cb); 231 + eventEmitter.addEventListener(WebEventType.ExtensionLoad, cb); 232 232 if (finished.has(dep)) done(); 233 233 }) 234 234 ); ··· 242 242 await loadExt(ext); 243 243 244 244 finished.add(ext.id); 245 - eventEmitter.dispatchEvent(EventType.ExtensionLoad, ext.id); 245 + eventEmitter.dispatchEvent(WebEventType.ExtensionLoad, ext.id); 246 246 logger.debug(`Loaded "${ext.id}"`); 247 247 } 248 248
+1 -4
packages/core/src/extension.ts
··· 129 129 const ret: DetectedExtension[] = []; 130 130 const seen = new Set<string>(); 131 131 132 - const coreExtensionsFs: Record<string, string> = JSON.parse( 133 - // @ts-expect-error shut up 134 - _moonlight_coreExtensionsStr 135 - ); 132 + const coreExtensionsFs: Record<string, string> = JSON.parse(_moonlight_coreExtensionsStr); 136 133 const coreExtensions = Array.from(new Set(Object.keys(coreExtensionsFs).map((x) => x.split("/")[0]))); 137 134 138 135 for (const ext of coreExtensions) {
+49 -33
packages/core/src/patch.ts
··· 11 11 } from "@moonlight-mod/types"; 12 12 import Logger from "./util/logger"; 13 13 import calculateDependencies, { Dependency } from "./util/dependency"; 14 - import { EventType } from "@moonlight-mod/types/core/event"; 14 + import { WebEventType } from "@moonlight-mod/types/core/event"; 15 15 import { processFind, processReplace, testFind } from "./util/patch"; 16 16 17 17 const logger = new Logger("core/patch"); ··· 66 66 const moduleCache: Record<string, string> = {}; 67 67 const patched: Record<string, Array<string>> = {}; 68 68 69 - function patchModules(entry: WebpackJsonpEntry[1]) { 70 - function patchModule(id: string, patchId: string, replaced: string) { 71 - // Store what extensions patched what modules for easier debugging 72 - patched[id] = patched[id] || []; 73 - patched[id].push(patchId); 69 + function createSourceURL(id: string) { 70 + const remapped = Object.entries(moonlight.moonmap.modules).find((m) => m[1] === id)?.[0]; 74 71 75 - // Webpack module arguments are minified, so we replace them with consistent names 76 - // We have to wrap it so things don't break, though 77 - const patchedStr = patched[id].sort().join(", "); 72 + if (remapped) { 73 + return `// Webpack Module: ${id}\n//# sourceURL=${remapped}`; 74 + } 75 + 76 + return `//# sourceURL=Webpack-Module/${id.slice(0, 3)}/${id}`; 77 + } 78 + 79 + function patchModule(id: string, patchId: string, replaced: string, entry: WebpackJsonpEntry[1]) { 80 + // Store what extensions patched what modules for easier debugging 81 + patched[id] = patched[id] ?? []; 82 + patched[id].push(patchId); 78 83 79 - const wrapped = 80 - `(${replaced}).apply(this, arguments)\n` + 81 - `// Patched by moonlight: ${patchedStr}\n` + 82 - `//# sourceURL=Webpack-Module-${id}`; 84 + // Webpack module arguments are minified, so we replace them with consistent names 85 + // We have to wrap it so things don't break, though 86 + const patchedStr = patched[id].sort().join(", "); 83 87 84 - try { 85 - const func = new Function("module", "exports", "require", wrapped) as WebpackModuleFunc; 86 - entry[id] = func; 87 - entry[id].__moonlight = true; 88 - return true; 89 - } catch (e) { 90 - logger.warn("Error constructing function for patch", patchId, e); 91 - patched[id].pop(); 92 - return false; 93 - } 88 + const wrapped = 89 + `(${replaced}).apply(this, arguments)\n` + `// Patched by moonlight: ${patchedStr}\n` + createSourceURL(id); 90 + 91 + try { 92 + const func = new Function("module", "exports", "require", wrapped) as WebpackModuleFunc; 93 + entry[id] = func; 94 + entry[id].__moonlight = true; 95 + return true; 96 + } catch (e) { 97 + logger.warn("Error constructing function for patch", patchId, e); 98 + patched[id].pop(); 99 + return false; 94 100 } 101 + } 95 102 103 + function patchModules(entry: WebpackJsonpEntry[1]) { 96 104 // Populate the module cache 97 105 for (const [id, func] of Object.entries(entry)) { 98 106 if (!Object.hasOwn(moduleCache, id) && func.__moonlight !== true) { ··· 108 116 const origModuleString = moduleCache[id]; 109 117 let moduleString = origModuleString; 110 118 const patchedStr = []; 111 - const mappedName = moonlight.moonmap.modules[id]; 119 + const mappedName = Object.entries(moonlight.moonmap.modules).find((m) => m[1] === id)?.[0]; 112 120 let modified = false; 121 + let swappedModule = false; 113 122 114 123 const exts = new Set<string>(); 115 124 116 125 for (let i = 0; i < patches.length; i++) { 117 126 const patch = patches[i]; 118 127 if (patch.prerequisite != null && !patch.prerequisite()) { 128 + moonlight.unpatched.delete(patch); 119 129 continue; 120 130 } 121 131 ··· 135 145 // We ensured normal PatchReplace objects get turned into arrays on register 136 146 const replaces = patch.replace as PatchReplace[]; 137 147 148 + let isPatched = true; 138 149 for (let i = 0; i < replaces.length; i++) { 139 150 const replace = replaces[i]; 140 151 let patchId = `${patch.ext}#${patch.id}`; ··· 151 162 } 152 163 153 164 if (replaced === moduleString) { 154 - logger.warn("Patch replacement failed", id, patch); 165 + logger.warn("Patch replacement failed", id, patchId, patch); 166 + isPatched = false; 155 167 if (patch.hardFail) { 156 168 hardFailed = true; 157 169 break; ··· 164 176 const newModule = replace.replacement(replaced); 165 177 entry[id] = newModule; 166 178 entry[id].__moonlight = true; 167 - replaced = replaced.toString().replace(/\n/g, "") + `//# sourceURL=Webpack-Module-${id}`; 179 + replaced = newModule.toString().replace(/\n/g, ""); 180 + swappedModule = true; 168 181 } 169 182 } 170 183 ··· 174 187 exts.add(patch.ext); 175 188 } 176 189 177 - moonlight.unpatched.delete(patch); 190 + if (isPatched) moonlight.unpatched.delete(patch); 178 191 if (shouldRemove) patches.splice(i--, 1); 179 192 } 180 193 } 181 194 182 195 if (modified) { 183 - patchModule(id, patchedStr.join(", "), moduleString); 184 - moduleCache[id] = moduleString; 196 + let shouldCache = true; 197 + if (!swappedModule) shouldCache = patchModule(id, patchedStr.join(", "), moduleString, entry); 198 + if (shouldCache) moduleCache[id] = moduleString; 185 199 moonlight.patched.set(id, exts); 186 200 } 187 201 ··· 189 203 const parsed = moonlight.lunast.parseScript(id, moduleString); 190 204 if (parsed != null) { 191 205 for (const [parsedId, parsedScript] of Object.entries(parsed)) { 192 - if (patchModule(parsedId, "lunast", parsedScript)) { 206 + if (patchModule(parsedId, "lunast", parsedScript, entry)) { 193 207 moduleCache[parsedId] = parsedScript; 194 208 } 195 209 } ··· 200 214 201 215 if (moonlightNode.config.patchAll === true) { 202 216 if ((typeof id !== "string" || !id.includes("_")) && !entry[id].__moonlight) { 203 - const wrapped = `(${moduleCache[id]}).apply(this, arguments)\n` + `//# sourceURL=Webpack-Module-${id}`; 217 + const wrapped = `(${moduleCache[id]}).apply(this, arguments)\n` + createSourceURL(id); 204 218 entry[id] = new Function("module", "exports", "require", wrapped) as WebpackModuleFunc; 205 219 entry[id].__moonlight = true; 206 220 } ··· 323 337 } 324 338 325 339 for (const [name, func] of Object.entries(moonlight.moonmap.getWebpackModules("window.moonlight.moonmap"))) { 340 + // @ts-expect-error probably should fix the type on this idk 341 + func.__moonlight = true; 326 342 injectedWpModules.push({ id: name, run: func }); 327 343 modules[name] = func; 328 344 inject = true; ··· 400 416 const realPush = jsonp.push; 401 417 if (jsonp.push.__moonlight !== true) { 402 418 jsonp.push = (items) => { 403 - moonlight.events.dispatchEvent(EventType.ChunkLoad, { 419 + moonlight.events.dispatchEvent(WebEventType.ChunkLoad, { 404 420 chunkId: items[0], 405 421 modules: items[1], 406 422 require: items[2] ··· 448 464 set(modules: any) { 449 465 const { stack } = new Error(); 450 466 if (stack!.includes("/assets/") && !Array.isArray(modules)) { 451 - moonlight.events.dispatchEvent(EventType.ChunkLoad, { 467 + moonlight.events.dispatchEvent(WebEventType.ChunkLoad, { 452 468 modules: modules 453 469 }); 454 470 patchModules(modules);
+4 -1
packages/core/tsconfig.json
··· 1 1 { 2 - "extends": "../../tsconfig.json" 2 + "extends": "../../tsconfig.json", 3 + "compilerOptions": { 4 + "lib": ["ESNext", "DOM"] 5 + } 3 6 }
+9 -2
packages/core-extensions/package.json
··· 1 1 { 2 2 "name": "@moonlight-mod/core-extensions", 3 3 "private": true, 4 + "engineStrict": true, 5 + "engines": { 6 + "node": ">=22", 7 + "pnpm": ">=10", 8 + "npm": "pnpm", 9 + "yarn": "pnpm" 10 + }, 4 11 "dependencies": { 5 12 "@moonlight-mod/core": "workspace:*", 6 13 "@moonlight-mod/types": "workspace:*", 7 - "microdiff": "^1.5.0", 8 - "nanotar": "^0.1.1" 14 + "microdiff": "catalog:prod", 15 + "nanotar": "catalog:prod" 9 16 } 10 17 }
+14 -5
packages/core-extensions/src/commands/index.ts
··· 7 7 replace: [ 8 8 // inject commands 9 9 { 10 - match: /return (\i)=\i/, 10 + match: /return (\i)\.filter/, 11 11 replacement: (orig, commands) => 12 - `${commands}=[...${commands},...require("commands_commands").default._getCommands()];${orig}` 12 + `return [...${commands},...require("commands_commands").default._getCommands()].filter` 13 13 }, 14 14 15 15 // section ··· 53 53 } 54 54 }, 55 55 { 56 - find: ".icon,bot:null===", 56 + find: ".icon,bot:null==", 57 57 replace: { 58 - match: /(\.useMemo\(\(\)=>{)(if\((\i)\.type)/, 59 - replacement: (_, before, after, section) => `${before} 58 + match: /(\.useMemo\(\(\)=>{(var \i;)?)((return |if\()(\i)\.type)/, 59 + replacement: (_, before, beforeVar, after, afterIf, section) => `${before} 60 60 if (${section}.id==="${APPLICATION_ID}") return "https://moonlight-mod.github.io/favicon.png"; 61 61 ${after}` 62 62 } ··· 67 67 replace: { 68 68 match: /(\i)\.type===\i\.\i\.BUILT_IN/, 69 69 replacement: (orig, section) => `${section}.id!=="${APPLICATION_ID}"&&${orig}` 70 + } 71 + }, 72 + 73 + // tell it this app id is authorized 74 + { 75 + find: /let{customInstallUrl:\i,installParams:\i,integrationTypesConfig:\i}/, 76 + replace: { 77 + match: /\|\|(\i)===\i\.\i\.BUILT_IN/, 78 + replacement: (orig, id) => `${orig}||${id}==="${APPLICATION_ID}"` 70 79 } 71 80 } 72 81 ];
+17 -1
packages/core-extensions/src/commands/webpackModules/commands.ts
··· 30 30 applicationId: APPLICATION_ID, 31 31 untranslatedDescription: command.description, 32 32 displayDescription: command.description, 33 - options: command.options.map((o) => ({ 33 + options: command.options?.map((o) => ({ 34 34 ...o, 35 35 displayName: o.name, 36 36 displayDescription: o.description ··· 40 40 }, 41 41 42 42 registerLegacyCommand(id, command) { 43 + if (command.match) { 44 + if (command.match instanceof RegExp) { 45 + command.match = this.anyScopeRegex(command.match); 46 + } else if (command.match.regex && typeof command.match !== "function") { 47 + command.match = this.anyScopeRegex(command.match.regex); 48 + } 49 + } 50 + 43 51 if (!legacyCommands) { 44 52 queuedLegacyCommands![id] = command; 45 53 } else { 46 54 legacyCommands[id] = command; 47 55 } 56 + }, 57 + 58 + anyScopeRegex(regex) { 59 + const out = function (str: string) { 60 + return regex.exec(str); 61 + }; 62 + out.regex = regex; 63 + return out; 48 64 }, 49 65 50 66 _getCommands() {
+7 -5
packages/core-extensions/src/common/index.ts
··· 2 2 3 3 export const webpackModules: ExtensionWebExports["webpackModules"] = { 4 4 stores: { 5 - dependencies: [ 6 - { 7 - id: "discord/packages/flux" 8 - } 9 - ] 5 + dependencies: [{ id: "discord/packages/flux" }] 6 + }, 7 + ErrorBoundary: { 8 + dependencies: [{ id: "react" }] 9 + }, 10 + icons: { 11 + dependencies: [{ id: "react" }, { id: "discord/components/common/index" }] 10 12 } 11 13 };
+1 -1
packages/core-extensions/src/common/manifest.json
··· 4 4 "apiLevel": 2, 5 5 "meta": { 6 6 "name": "Common", 7 - "tagline": "A *lot* of common clientmodding utilities from the Discord client", 7 + "tagline": "Common client modding utilities for the Discord client", 8 8 "authors": ["Cynosphere", "NotNite"], 9 9 "tags": ["library"] 10 10 },
+27
packages/core-extensions/src/common/style.css
··· 1 + .moonlight-error-boundary { 2 + margin: 0 0 15px; 3 + padding: 10px; 4 + border-radius: 5px; 5 + font-size: 1rem; 6 + font-weight: 300; 7 + line-height: 22px; 8 + color: var(--text-normal, white); 9 + background: hsl(var(--red-400-hsl) / 0.1); 10 + border: 2px solid hsl(var(--red-400-hsl) / 0.5); 11 + 12 + .theme-light & { 13 + color: var(--text-normal, black) !important; 14 + } 15 + 16 + & > h3 { 17 + margin-bottom: 0.25rem; 18 + } 19 + 20 + & > .hljs { 21 + background: var(--background-secondary); 22 + border: 1px solid var(--background-tertiary); 23 + white-space: pre-wrap; 24 + font-family: var(--font-code); 25 + user-select: text; 26 + } 27 + }
+47
packages/core-extensions/src/common/webpackModules/ErrorBoundary.tsx
··· 1 + import React from "@moonlight-mod/wp/react"; 2 + import { ErrorBoundaryProps, ErrorBoundaryState } from "@moonlight-mod/types/coreExtensions/common"; 3 + 4 + const logger = moonlight.getLogger("ErrorBoundary"); 5 + 6 + class ErrorBoundary extends React.Component<ErrorBoundaryProps, ErrorBoundaryState> { 7 + constructor(props: ErrorBoundaryProps) { 8 + super(props); 9 + this.state = { 10 + errored: false, 11 + error: undefined, 12 + componentStack: undefined 13 + }; 14 + } 15 + 16 + static getDerivedStateFromError(error: Error) { 17 + return { 18 + errored: true, 19 + error 20 + }; 21 + } 22 + 23 + componentDidCatch(error: Error, { componentStack }: { componentStack: string }) { 24 + logger.error(`${error}\n\nComponent stack:\n${componentStack}`); 25 + this.setState({ error, componentStack }); 26 + } 27 + 28 + render() { 29 + const { noop, fallback: FallbackComponent, children, message } = this.props; 30 + const { errored, error, componentStack } = this.state; 31 + 32 + if (FallbackComponent) return <FallbackComponent children={children} {...this.state} />; 33 + 34 + if (errored) { 35 + return noop ? null : ( 36 + <div className={`moonlight-error-boundary`}> 37 + <h3>{message ?? "An error occurred rendering this component:"}</h3> 38 + <code className="hljs">{`${error}\n\nComponent stack:\n${componentStack}`}</code> 39 + </div> 40 + ); 41 + } 42 + 43 + return children; 44 + } 45 + } 46 + 47 + export default ErrorBoundary;
+31
packages/core-extensions/src/common/webpackModules/icons.ts
··· 1 + import { Icons, IconSize } from "@moonlight-mod/types/coreExtensions/common"; 2 + import { tokens } from "@moonlight-mod/wp/discord/components/common/index"; 3 + 4 + // This is defined in a Webpack module but we copy it here to be less breakage-prone 5 + const sizes: Partial<Record<IconSize, number>> = { 6 + xxs: 12, 7 + xs: 16, 8 + sm: 18, 9 + md: 24, 10 + lg: 32, 11 + refresh_sm: 20 12 + }; 13 + 14 + export const icons: Icons = { 15 + parseProps(props) { 16 + // NOTE: var() fallback is non-standard behavior, just for safety reasons 17 + const color = props?.color ?? tokens?.colors?.["INTERACTIVE_NORMAL"] ?? "var(--interactive-normal)"; 18 + 19 + const size = sizes[props?.size ?? "md"]; 20 + 21 + return { 22 + // note: this default size is also non-standard behavior, just for safety 23 + width: size ?? props?.width ?? sizes.md!, 24 + height: size ?? props?.width ?? sizes.md!, 25 + 26 + fill: typeof color === "string" ? color : color.css, 27 + className: props?.colorClass ?? "" 28 + }; 29 + } 30 + }; 31 + export default icons;
+14 -6
packages/core-extensions/src/componentEditor/index.ts
··· 15 15 replacement: 'children:require("componentEditor_dmList").default._patchItems([' 16 16 }, 17 17 { 18 - match: /(?<=onMouseDown:\i}\))]/, 18 + match: /(?<=(onMouseDown|nameplate):\i}\))]/, 19 19 replacement: "],arguments[0])" 20 20 } 21 21 ], ··· 44 44 find: '},"new-member")),', 45 45 replace: [ 46 46 { 47 - match: /(?<=\.BADGES]=)(\i);/, 48 - replacement: (_, badges) => 49 - `require("componentEditor_messages").default._patchUsernameBadges(${badges},arguments[0]);` 47 + match: /(?<=\.BADGES](=|:))(\i)(;|})/, 48 + replacement: (_, leading, badges, trailing) => 49 + `require("componentEditor_messages").default._patchUsernameBadges(${badges},arguments[0])${trailing}` 50 50 }, 51 51 { 52 52 match: /(?<=className:\i,)badges:(\i)/, ··· 54 54 `badges:require("componentEditor_messages").default._patchBadges(${badges},arguments[0])` 55 55 }, 56 56 { 57 - match: /(?<=username:\(0,\i\.jsxs\)\(\i\.Fragment,{)children:(\[.+?,\i])/, 57 + match: /(?<=username:\(0,\i\.jsxs\)\(\i\.Fragment,{)children:(\[.+?])}\),usernameSpanId:/, 58 58 replacement: (_, elements) => 59 - `children:require("componentEditor_messages").default._patchUsername(${elements},arguments[0])` 59 + `children:require("componentEditor_messages").default._patchUsername(${elements},arguments[0])}),usernameSpanId:` 60 60 } 61 61 ] 62 + }, 63 + { 64 + find: '.provider&&"Discord"===', 65 + replace: { 66 + match: /(?<=\.container\),)children:(\[.+?this\.renderSuppressConfirmModal\(\),.+?\])}\)/, 67 + replacement: (_, elements) => 68 + `children:require("componentEditor_messages").default._patchAccessories(${elements},this.props)})` 69 + } 62 70 } 63 71 ]; 64 72
+15
packages/core-extensions/src/componentEditor/webpackModules/messages.tsx
··· 12 12 const username: Record<string, MessageUsername> = {}; 13 13 const usernameBadges: Record<string, MessageUsernameBadge> = {}; 14 14 const badges: Record<string, MessageBadge> = {}; 15 + const accessories: Record<string, React.FC<any>> = {}; 15 16 16 17 function addEntries( 17 18 elements: React.ReactNode[], ··· 40 41 const index = elements.indexOf(originalElements[indicies[entry.anchor]!]); 41 42 elements.splice(index! + (entry.before ? 0 : 1), 0, component); 42 43 } 44 + } 45 + } 46 + 47 + function addComponents(elements: React.ReactNode[], components: Record<string, React.FC<any>>, props: any) { 48 + for (const [id, Component] of Object.entries(components)) { 49 + const component = <Component {...props} key={id} />; 50 + elements.push(component); 43 51 } 44 52 } 45 53 ··· 65 73 before 66 74 }; 67 75 }, 76 + addAccessory(id, component) { 77 + accessories[id] = component; 78 + }, 68 79 _patchUsername(elements, props) { 69 80 addEntries(elements, username, MessageUsernameIndicies, props); 70 81 return elements; ··· 75 86 }, 76 87 _patchBadges(elements, props) { 77 88 addEntries(elements, badges, MessageBadgeIndicies, props); 89 + return elements; 90 + }, 91 + _patchAccessories(elements, props) { 92 + addComponents(elements, accessories, props); 78 93 return elements; 79 94 } 80 95 };
+1
packages/core-extensions/src/contextMenu/webpackModules/contextMenu.ts
··· 58 58 }; 59 59 60 60 // Unmangle Menu elements 61 + // spacepack.require.m[moonlight.moonmap.modules["discord/modules/menus/web/Menu"]].toString(); 61 62 const code = 62 63 spacepack.require.m[ 63 64 spacepack.findByCode("Menu API only allows Items and groups of Items as children.")[0].id
+2 -1
packages/core-extensions/src/contextMenu/webpackModules/evilMenu.ts
··· 1 1 import spacepack from "@moonlight-mod/wp/spacepack_spacepack"; 2 2 3 + // spacepack.require.m[moonlight.moonmap.modules["discord/modules/menus/web/Menu"]].toString(); 3 4 let code = 4 5 spacepack.require.m[ 5 6 spacepack.findByCode("Menu API only allows Items and groups of Items as children.")[0].id ··· 7 8 8 9 const parserSym = code.match(/(?<=_patchMenu\(.,).+?(?=\()/)![0]; 9 10 10 - code = code.replace(/(?<=function\(\){return ).(?=})/, parserSym); 11 + code = code.replace(/{(.):\(\)=>./, (orig, e) => `{${e}:()=>${parserSym}`); 11 12 const mod = new Function("module", "exports", "require", `(${code}).apply(this, arguments)`); 12 13 13 14 const exp: any = {};
+2 -2
packages/core-extensions/src/disableSentry/index.ts
··· 6 6 find: "profiledRootComponent:", 7 7 replace: { 8 8 type: PatchReplaceType.Normal, 9 - match: /(?<=\.Z=){.+?}}/, 10 - replacement: 'require("disableSentry_stub").proxy()' 9 + match: /Z:\(\)=>\i/, 10 + replacement: 'Z:()=>require("disableSentry_stub").proxy()' 11 11 } 12 12 }, 13 13 {
+4 -1
packages/core-extensions/src/disableSentry/manifest.json
··· 12 12 "https://*.sentry.io/*", 13 13 "https://*.discord.com/error-reporting-proxy/*", 14 14 "https://discord.com/assets/sentry.*.js", 15 - "https://*.discord.com/assets/sentry.*.js" 15 + "https://*.discord.com/assets/sentry.*.js", 16 + "https://*.discordapp.com/error-reporting-proxy/*", 17 + "https://discordapp.com/assets/sentry.*.js", 18 + "https://*.discordapp.com/assets/sentry.*.js" 16 19 ] 17 20 }
+19 -2
packages/core-extensions/src/experiments/index.ts
··· 11 11 { 12 12 find: '"scientist:triggered"', // Scientist? Triggered. 13 13 replace: { 14 - match: /(?<=personal_connection_id\|\|)!1/, 15 - replacement: "!0" 14 + match: ".personal_connection_id", 15 + replacement: ".personal_connection_id || true" 16 16 } 17 17 }, 18 18 ··· 23 23 match: /&&\((.)\?\(0,/, 24 24 replacement: (_, isStaff) => 25 25 `&&(((moonlight.getConfigOption("experiments","devtools")??false)?true:${isStaff})?(0,` 26 + } 27 + }, 28 + // staff help menu - visual refresh 29 + { 30 + find: '("AppTitleBar")', 31 + replace: { 32 + match: /{hasBugReporterAccess:(\i)}=\i\.\i\.useExperiment\({location:"HeaderBar"},{autoTrackExposure:!1}\);/, 33 + replacement: (orig, isStaff) => 34 + `${orig}if(moonlight.getConfigOption("experiments","devtools")??false)${isStaff}=true;` 35 + } 36 + }, 37 + { 38 + find: 'navId:"staff-help-popout",', 39 + replace: { 40 + match: /isDiscordDeveloper:(\i)}\),/, 41 + replacement: (_, isStaff) => 42 + `isDiscordDeveloper:(moonlight.getConfigOption("experiments","devtools")??false)||${isStaff}}),` 26 43 } 27 44 }, 28 45
+13 -4
packages/core-extensions/src/moonbase/index.tsx
··· 8 8 { 9 9 // CvQlAA mapped to ERRORS_ACTION_TO_TAKE 10 10 // FIXME: Better patch find? 11 - match: /,(\(0,(.)\.jsx\))\("p",{children:.\.intl\.string\(.\..\.CvQlAA\)}\)/, 11 + match: /,(\(0,(\i)\.jsx\))\("p",{children:\i\.\i\.string\(\i\.\i\.CvQlAA\)}\)/, 12 12 replacement: (_, createElement, ReactJSX) => 13 13 `,${createElement}(require("moonbase_crashScreen")?.UpdateText??${ReactJSX}.Fragment,{state:this.state,setState:this.setState.bind(this)})` 14 14 }, 15 15 16 16 // wrap actions field to display error details 17 17 { 18 - match: /(?<=return(\(0,(.)\.jsx\))\(.+?,)action:(.),className:/, 18 + match: /(?<=return(\(0,(\i)\.jsx\))\(.+?,)action:(\i),className:/, 19 19 replacement: (_, createElement, ReactJSX, action) => 20 20 `action:require("moonbase_crashScreen")?.wrapAction?${createElement}(require("moonbase_crashScreen").wrapAction,{action:${action},state:this.state}):${action},className:` 21 21 }, ··· 23 23 // add update button 24 24 // +hivLS -> ERRORS_RELOAD 25 25 { 26 - match: /(?<=\["\+hivLS"\]\)}\),(\(0,(.)\.jsx\))\(.,{}\))/, 26 + match: /(?<=\["\+hivLS"\]\)}\),(\(0,(\i)\.jsx\))\(\i,{}\))/, 27 27 replacement: (_, createElement, ReactJSX) => 28 28 `,${createElement}(require("moonbase_crashScreen")?.UpdateButton??${ReactJSX}.Fragment,{state:this.state,setState:this.setState.bind(this)})` 29 29 } ··· 42 42 { id: "react" }, 43 43 { id: "discord/components/common/index" }, 44 44 { ext: "moonbase", id: "stores" }, 45 - { id: "discord/modules/guild_settings/IntegrationCard.css" }, 45 + { ext: "moonbase", id: "ThemeDarkIcon" }, 46 + { id: "discord/modules/guild_settings/web/AppCard.css" }, 47 + { ext: "contextMenu", id: "contextMenu" }, 48 + { id: "discord/modules/modals/Modals" }, 46 49 "Masks.PANEL_BUTTON", 47 50 '"Missing channel in Channel.openChannelContextMenu"', 48 51 ".forumOrHome]:" 49 52 ] 50 53 }, 51 54 55 + ThemeDarkIcon: { 56 + dependencies: [{ ext: "common", id: "icons" }, { id: "react" }] 57 + }, 58 + 52 59 settings: { 53 60 dependencies: [ 54 61 { ext: "spacepack", id: "spacepack" }, 55 62 { ext: "settings", id: "settings" }, 56 63 { id: "react" }, 57 64 { ext: "moonbase", id: "ui" }, 65 + { ext: "contextMenu", id: "contextMenu" }, 58 66 ':"USER_SETTINGS_MODAL_SET_SECTION"' 59 67 ], 60 68 entrypoint: true ··· 64 72 dependencies: [ 65 73 { id: "react" }, 66 74 { ext: "moonbase", id: "stores" }, 75 + { ext: "moonbase", id: "ThemeDarkIcon" }, 67 76 { ext: "notices", id: "notices" }, 68 77 { 69 78 ext: "spacepack",
+1 -1
packages/core-extensions/src/moonbase/manifest.json
··· 7 7 "tagline": "The official settings UI for moonlight", 8 8 "authors": ["Cynosphere", "NotNite", "redstonekasi"] 9 9 }, 10 - "dependencies": ["spacepack", "settings", "common", "notices"], 10 + "dependencies": ["spacepack", "settings", "common", "notices", "contextMenu"], 11 11 "settings": { 12 12 "sections": { 13 13 "advice": "reload",
+12 -21
packages/core-extensions/src/moonbase/native.ts
··· 15 15 16 16 export const userAgent = `moonlight/${moonlightGlobal.version} (https://github.com/moonlight-mod/moonlight)`; 17 17 18 + // User-Agent header causes trouble on Firefox 19 + const isBrowser = globalThis.moonlightNode != null && globalThis.moonlightNode.isBrowser; 20 + const sharedHeaders: Record<string, string> = {}; 21 + if (!isBrowser) sharedHeaders["User-Agent"] = userAgent; 22 + 18 23 async function getStableRelease(): Promise<{ 19 24 name: string; 20 25 assets: { ··· 24 29 }> { 25 30 const req = await fetch(githubApiUrl, { 26 31 cache: "no-store", 27 - headers: { 28 - "User-Agent": userAgent 29 - } 32 + headers: sharedHeaders 30 33 }); 31 34 return await req.json(); 32 35 } ··· 43 46 } else if (moonlightGlobal.branch === MoonlightBranch.NIGHTLY) { 44 47 const req = await fetch(nightlyRefUrl, { 45 48 cache: "no-store", 46 - headers: { 47 - "User-Agent": userAgent 48 - } 49 + headers: sharedHeaders 49 50 }); 50 51 const ref = (await req.text()).split("\n")[0]; 51 52 return ref !== moonlightGlobal.version ? ref : null; ··· 71 72 logger.debug(`Downloading ${asset.browser_download_url}`); 72 73 const req = await fetch(asset.browser_download_url, { 73 74 cache: "no-store", 74 - headers: { 75 - "User-Agent": userAgent 76 - } 75 + headers: sharedHeaders 77 76 }); 78 77 79 78 return [await req.arrayBuffer(), json.name]; ··· 83 82 logger.debug(`Downloading ${nightlyZipUrl}`); 84 83 const zipReq = await fetch(nightlyZipUrl, { 85 84 cache: "no-store", 86 - headers: { 87 - "User-Agent": userAgent 88 - } 85 + headers: sharedHeaders 89 86 }); 90 87 91 88 const refReq = await fetch(nightlyRefUrl, { 92 89 cache: "no-store", 93 - headers: { 94 - "User-Agent": userAgent 95 - } 90 + headers: sharedHeaders 96 91 }); 97 92 const ref = (await refReq.text()).split("\n")[0]; 98 93 ··· 139 134 try { 140 135 const req = await fetch(repo, { 141 136 cache: "no-store", 142 - headers: { 143 - "User-Agent": userAgent 144 - } 137 + headers: sharedHeaders 145 138 }); 146 139 const json = await req.json(); 147 140 ret[repo] = json; ··· 156 149 async installExtension(manifest, url, repo) { 157 150 const req = await fetch(url, { 158 151 cache: "no-store", 159 - headers: { 160 - "User-Agent": userAgent 161 - } 152 + headers: sharedHeaders 162 153 }); 163 154 164 155 const dir = moonlightGlobal.getExtensionDir(manifest.id);
+26 -2
packages/core-extensions/src/moonbase/style.css
··· 16 16 resize: vertical; 17 17 } 18 18 19 + .moonbase-link-buttons { 20 + border-bottom: 2px solid var(--background-modifier-accent); 21 + margin-bottom: -2px; 22 + margin-left: 0 !important; 23 + padding-right: 20px; 24 + gap: 1rem; 25 + } 26 + 19 27 .moonbase-speen { 20 28 animation: moonbase-speen-animation 0.25s linear infinite; 21 29 } ··· 86 94 display: flex; 87 95 flex-direction: row; 88 96 gap: 8px; 97 + align-items: center; 89 98 } 90 99 91 100 .moonbase-update-divider { 92 101 margin: 32px 0; 102 + } 103 + 104 + .moonlight-card-info-header { 105 + margin-bottom: 0.25rem; 106 + } 107 + 108 + .moonlight-card-badge { 109 + border-radius: 0.1875rem; 110 + padding: 0 0.275rem; 111 + margin-right: 0.4em; 112 + background-color: var(--badge-color, var(--bg-mod-strong)); 93 113 } 94 114 95 115 /* Crash screen */ ··· 231 251 padding-top: 0.5rem; 232 252 } 233 253 254 + .moonbase-dev { 255 + height: 4rem; 256 + } 257 + 234 258 .moonbase-dev-avatar { 235 259 width: 2rem; 236 260 border-radius: 50%; ··· 240 264 gap: 0.5rem; 241 265 } 242 266 243 - .moonbase-about-text { 244 - padding-top: 0.5rem; 267 + .moonbase-about-page { 268 + gap: 1rem; 245 269 }
+36
packages/core-extensions/src/moonbase/webpackModules/ThemeDarkIcon.tsx
··· 1 + // RIP to ThemeDarkIcon ????-2025 2 + // <Cynthia> Failed to remap "ThemeDarkIcon" in "discord/components/common/index" 3 + // <NotNite> bro are you fucking kidding me 4 + // <NotNite> that's literally the icon we use for the update banner 5 + 6 + import React from "@moonlight-mod/wp/react"; 7 + import icons from "@moonlight-mod/wp/common_icons"; 8 + import type { IconProps } from "@moonlight-mod/types/coreExtensions/common"; 9 + 10 + export default function ThemeDarkIcon(props?: IconProps) { 11 + const parsed = icons.parseProps(props); 12 + 13 + return ( 14 + <svg 15 + aria-hidden="true" 16 + role="img" 17 + xmlns="http://www.w3.org/2000/svg" 18 + width={parsed.width} 19 + height={parsed.height} 20 + fill="none" 21 + viewBox="0 0 24 24" 22 + > 23 + <path 24 + fill={parsed.fill} 25 + className={parsed.className} 26 + d="M20.52 18.96c.32-.4-.01-.96-.52-.96A11 11 0 0 1 9.77 2.94c.31-.78-.3-1.68-1.1-1.43a11 11 0 1 0 11.85 17.45Z" 27 + /> 28 + 29 + <path 30 + fill={parsed.fill} 31 + className={parsed.className} 32 + d="m17.73 9.27-.76-2.02a.5.5 0 0 0-.94 0l-.76 2.02-2.02.76a.5.5 0 0 0 0 .94l2.02.76.76 2.02a.5.5 0 0 0 .94 0l.76-2.02 2.02-.76a.5.5 0 0 0 0-.94l-2.02-.76ZM19.73 2.62l.45 1.2 1.2.45c.21.08.21.38 0 .46l-1.2.45-.45 1.2a.25.25 0 0 1-.46 0l-.45-1.2-1.2-.45a.25.25 0 0 1 0-.46l1.2-.45.45-1.2a.25.25 0 0 1 .46 0Z" 33 + /> 34 + </svg> 35 + ); 36 + }
+25 -12
packages/core-extensions/src/moonbase/webpackModules/crashScreen.tsx
··· 1 1 import React from "@moonlight-mod/wp/react"; 2 - import * as Components from "@moonlight-mod/wp/discord/components/common/index"; 2 + import { Button, TabBar } from "@moonlight-mod/wp/discord/components/common/index"; 3 3 import { useStateFromStores, useStateFromStoresObject } from "@moonlight-mod/wp/discord/packages/flux"; 4 - import spacepack from "@moonlight-mod/wp/spacepack_spacepack"; 5 4 import { MoonbaseSettingsStore } from "@moonlight-mod/wp/moonbase_stores"; 6 5 import { RepositoryManifest, UpdateState } from "../types"; 7 6 import { ConfigExtension, DetectedExtension } from "@moonlight-mod/types"; 7 + import DiscoveryClasses from "@moonlight-mod/wp/discord/modules/discovery/web/Discovery.css"; 8 8 9 - const { Button, TabBar } = Components; 10 - const TabBarClasses = spacepack.findByCode(/tabBar:"tabBar_[a-z0-9]+",tabBarItem:"tabBarItem_[a-z0-9]+"/)[0].exports; 11 - 12 - const MODULE_REGEX = /Webpack-Module-(\d+)/g; 9 + const MODULE_REGEX = /Webpack-Module\/(\d+)\/(\d+)/g; 13 10 14 11 const logger = moonlight.getLogger("moonbase/crashScreen"); 15 12 ··· 142 139 const causes = React.useMemo(() => { 143 140 const causes = new Set<string>(); 144 141 if (state.error.stack) { 145 - for (const [, id] of state.error.stack.matchAll(MODULE_REGEX)) 142 + for (const [, , id] of state.error.stack.matchAll(MODULE_REGEX)) 146 143 for (const ext of moonlight.patched.get(id) ?? []) causes.add(ext); 147 144 } 148 - for (const [, id] of state.info.componentStack.matchAll(MODULE_REGEX)) 145 + for (const [, , id] of state.info.componentStack.matchAll(MODULE_REGEX)) 149 146 for (const ext of moonlight.patched.get(id) ?? []) causes.add(ext); 147 + 148 + for (const [path, id] of Object.entries(moonlight.moonmap.modules)) { 149 + const MAPPING_REGEX = new RegExp( 150 + // @ts-expect-error Only Firefox has RegExp.escape 151 + `(${RegExp.escape ? RegExp.escape(path) : path.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")})`, 152 + "g" 153 + ); 154 + 155 + if (state.error.stack) { 156 + for (const match of state.error.stack.matchAll(MAPPING_REGEX)) 157 + if (match) for (const ext of moonlight.patched.get(id) ?? []) causes.add(ext); 158 + } 159 + for (const match of state.info.componentStack.matchAll(MAPPING_REGEX)) 160 + if (match) for (const ext of moonlight.patched.get(id) ?? []) causes.add(ext); 161 + } 162 + 150 163 return [...causes]; 151 164 }, []); 152 165 ··· 154 167 <div className="moonbase-crash-wrapper"> 155 168 {action} 156 169 <TabBar 157 - className={`${TabBarClasses.tabBar} moonbase-crash-tabs`} 170 + className={`${DiscoveryClasses.tabBar} moonbase-crash-tabs`} 158 171 type="top" 159 172 selectedItem={tab} 160 173 onItemSelect={(v) => setTab(v)} 161 174 > 162 - <TabBar.Item className={TabBarClasses.tabBarItem} id="crash"> 175 + <TabBar.Item className={DiscoveryClasses.tabBarItem} id="crash"> 163 176 Crash details 164 177 </TabBar.Item> 165 - <TabBar.Item className={TabBarClasses.tabBarItem} id="extensions" disabled={updateCount === 0}> 178 + <TabBar.Item className={DiscoveryClasses.tabBarItem} id="extensions" disabled={updateCount === 0}> 166 179 {`Extension updates (${updateCount})`} 167 180 </TabBar.Item> 168 - <TabBar.Item className={TabBarClasses.tabBarItem} id="causes" disabled={causes.length === 0}> 181 + <TabBar.Item className={DiscoveryClasses.tabBarItem} id="causes" disabled={causes.length === 0}> 169 182 {`Possible causes (${causes.length})`} 170 183 </TabBar.Item> 171 184 </TabBar>
+11 -11
packages/core-extensions/src/moonbase/webpackModules/settings.tsx
··· 2 2 import React from "@moonlight-mod/wp/react"; 3 3 import spacepack from "@moonlight-mod/wp/spacepack_spacepack"; 4 4 import { Moonbase, pages, RestartAdviceMessage, Update } from "@moonlight-mod/wp/moonbase_ui"; 5 - 5 + import UserSettingsModalActionCreators from "@moonlight-mod/wp/discord/actions/UserSettingsModalActionCreators"; 6 + import Margins from "@moonlight-mod/wp/discord/styles/shared/Margins.css"; 6 7 import { MoonbaseSettingsStore } from "@moonlight-mod/wp/moonbase_stores"; 7 - import * as Components from "@moonlight-mod/wp/discord/components/common/index"; 8 - 9 - const { MenuItem, Text, Breadcrumbs } = Components; 8 + import { Text, Breadcrumbs } from "@moonlight-mod/wp/discord/components/common/index"; 9 + import { MenuItem } from "@moonlight-mod/wp/contextMenu_contextMenu"; 10 10 11 - const Margins = spacepack.require("discord/styles/shared/Margins.css"); 12 - 13 - const { open } = spacepack.findByCode(':"USER_SETTINGS_MODAL_SET_SECTION"')[0].exports.Z; 14 - 15 - let SettingsNotice; 16 11 const notice = { 17 12 stores: [MoonbaseSettingsStore], 18 13 element: () => { 19 14 // Require it here because lazy loading SUX 20 - SettingsNotice ??= spacepack.findByCode("onSaveButtonColor", "FocusRingScope")[0].exports.Z; 15 + const SettingsNotice = spacepack.require("discord/components/common/SettingsNotice").default; 21 16 return ( 22 17 <SettingsNotice 23 18 submitting={MoonbaseSettingsStore.submitting} ··· 94 89 settings.addSectionMenuItems( 95 90 "moonbase", 96 91 ...pages.map((page, i) => ( 97 - <MenuItem key={page.id} id={`moonbase-${page.id}`} label={page.name} action={() => open("moonbase", i)} /> 92 + <MenuItem 93 + key={page.id} 94 + id={`moonbase-${page.id}`} 95 + label={page.name} 96 + action={() => UserSettingsModalActionCreators.open("moonbase", i.toString())} 97 + /> 98 98 )) 99 99 ); 100 100 }
+56 -15
packages/core-extensions/src/moonbase/webpackModules/stores.ts
··· 1 1 import { Config, ExtensionEnvironment, ExtensionLoadSource, ExtensionSettingsAdvice } from "@moonlight-mod/types"; 2 - import { ExtensionState, MoonbaseExtension, MoonbaseNatives, RepositoryManifest, RestartAdvice } from "../types"; 2 + import { 3 + ExtensionState, 4 + MoonbaseExtension, 5 + MoonbaseNatives, 6 + RepositoryManifest, 7 + RestartAdvice, 8 + UpdateState 9 + } from "../types"; 3 10 import { Store } from "@moonlight-mod/wp/discord/packages/flux"; 4 11 import Dispatcher from "@moonlight-mod/wp/discord/Dispatcher"; 5 12 import getNatives from "../native"; ··· 25 32 submitting: boolean; 26 33 installing: boolean; 27 34 35 + #updateState = UpdateState.Ready; 36 + get updateState() { 37 + return this.#updateState; 38 + } 28 39 newVersion: string | null; 29 40 shouldShowNotice: boolean; 30 - 31 - #showOnlyUpdateable = false; 32 - set showOnlyUpdateable(v: boolean) { 33 - this.#showOnlyUpdateable = v; 34 - this.emitChange(); 35 - } 36 - get showOnlyUpdateable() { 37 - return this.#showOnlyUpdateable; 38 - } 39 41 40 42 restartAdvice = RestartAdvice.NotNeeded; 41 43 ··· 254 256 this.emitChange(); 255 257 } 256 258 259 + dismissAllExtensionUpdates() { 260 + for (const id in this.extensions) { 261 + this.extensions[id].hasUpdate = false; 262 + } 263 + this.emitChange(); 264 + } 265 + 266 + async updateAllExtensions() { 267 + for (const id of Object.keys(this.updates)) { 268 + try { 269 + await this.installExtension(parseInt(id)); 270 + } catch (e) { 271 + logger.error("Error bulk updating extension", id, e); 272 + } 273 + } 274 + } 275 + 257 276 async installExtension(uniqueId: number) { 258 277 const ext = this.getExtension(uniqueId); 259 278 if (!("download" in ext.manifest)) { ··· 274 293 existing.settingsOverride = update.updateManifest.settings; 275 294 existing.compat = checkExtensionCompat(update.updateManifest); 276 295 existing.manifest = update.updateManifest; 277 - existing.hasUpdate = false; 278 296 existing.changelog = update.updateManifest.meta?.changelog; 279 297 } 280 298 ··· 346 364 } 347 365 348 366 async updateMoonlight() { 349 - await natives.updateMoonlight(); 367 + this.#updateState = UpdateState.Working; 368 + this.emitChange(); 369 + 370 + await natives 371 + .updateMoonlight() 372 + .then(() => (this.#updateState = UpdateState.Installed)) 373 + .catch((e) => { 374 + logger.error(e); 375 + this.#updateState = UpdateState.Failed; 376 + }); 377 + 378 + this.emitChange(); 350 379 } 351 380 352 381 getConfigOption<K extends keyof Config>(key: K): Config[K] { ··· 374 403 } 375 404 376 405 #computeRestartAdvice() { 406 + // If moonlight update needs a restart, always hide advice. 407 + if (this.#updateState === UpdateState.Installed) return RestartAdvice.NotNeeded; 408 + 377 409 const i = this.initialConfig; // Initial config, from startup 378 410 const n = this.config; // New config about to be saved 379 411 ··· 403 435 // If it's enabled but not detected yet, restart. 404 436 if (newEnabled && !detected) { 405 437 return updateAdvice(RestartAdvice.RestartNeeded); 406 - continue; 407 438 } 408 439 409 440 // Toggling extensions specifically wants to rely on the initial state, ··· 431 462 } 432 463 } 433 464 434 - const initConfig = typeof initState === "boolean" ? {} : initState.config ?? {}; 435 - const newConfig = typeof newState === "boolean" ? {} : newState.config ?? {}; 465 + const initConfig = typeof initState === "boolean" ? {} : { ...initState?.config }; 466 + const newConfig = typeof newState === "boolean" ? {} : { ...newState?.config }; 436 467 437 468 const def = ext.manifest.settings; 438 469 if (!def) continue; 439 470 471 + for (const key in def) { 472 + const defaultValue = def[key].default; 473 + 474 + initConfig[key] ??= defaultValue; 475 + newConfig[key] ??= defaultValue; 476 + } 477 + 440 478 const changedKeys = diff(initConfig, newConfig, { cyclesFix: false }).map((c) => c.path[0]); 441 479 for (const key in def) { 442 480 if (!changedKeys.includes(key)) continue; ··· 464 502 writeConfig() { 465 503 this.submitting = true; 466 504 this.restartAdvice = this.#computeRestartAdvice(); 505 + const modifiedRepos = diff(this.savedConfig.repositories, this.config.repositories); 467 506 468 507 moonlightNode.writeConfig(this.config); 469 508 this.savedConfig = this.clone(this.config); ··· 471 510 this.submitting = false; 472 511 this.modified = false; 473 512 this.emitChange(); 513 + 514 + if (modifiedRepos.length !== 0) this.checkUpdates(); 474 515 } 475 516 476 517 reset() {
+2 -4
packages/core-extensions/src/moonbase/webpackModules/ui/HelpMessage.tsx
··· 1 1 import React from "@moonlight-mod/wp/react"; 2 - import spacepack from "@moonlight-mod/wp/spacepack_spacepack"; 3 2 import Flex from "@moonlight-mod/wp/discord/uikit/Flex"; 4 3 import { Text } from "@moonlight-mod/wp/discord/components/common/index"; 5 - 6 - const Margins = spacepack.require("discord/styles/shared/Margins.css"); 7 - const HelpMessageClasses = spacepack.findByCode("positive:", "iconDiv:")[0].exports; 4 + import HelpMessageClasses from "@moonlight-mod/wp/discord/components/common/HelpMessage.css"; 5 + import Margins from "@moonlight-mod/wp/discord/styles/shared/Margins.css"; 8 6 9 7 // reimpl of HelpMessage but with a custom icon 10 8 export default function HelpMessage({
+1 -5
packages/core-extensions/src/moonbase/webpackModules/ui/RestartAdvice.tsx
··· 1 1 import { useStateFromStores } from "@moonlight-mod/wp/discord/packages/flux"; 2 2 import { MoonbaseSettingsStore } from "@moonlight-mod/wp/moonbase_stores"; 3 - import * as Components from "@moonlight-mod/wp/discord/components/common/index"; 3 + import { Button, CircleWarningIcon } from "@moonlight-mod/wp/discord/components/common/index"; 4 4 import React from "@moonlight-mod/wp/react"; 5 5 import { RestartAdvice } from "../../types"; 6 6 import HelpMessage from "./HelpMessage"; 7 - 8 - const { Button } = Components; 9 7 10 8 const strings: Record<RestartAdvice, string> = { 11 9 [RestartAdvice.NotNeeded]: "how did you even", ··· 27 25 [RestartAdvice.ReloadNeeded]: () => window.location.reload(), 28 26 [RestartAdvice.RestartNeeded]: () => MoonbaseSettingsStore.restartDiscord() 29 27 }; 30 - 31 - const { CircleWarningIcon } = Components; 32 28 33 29 export default function RestartAdviceMessage() { 34 30 const restartAdvice = useStateFromStores([MoonbaseSettingsStore], () => MoonbaseSettingsStore.restartAdvice);
+33 -48
packages/core-extensions/src/moonbase/webpackModules/ui/about.tsx
··· 1 - import * as Components from "@moonlight-mod/wp/discord/components/common/index"; 1 + import { 2 + Text, 3 + useThemeContext, 4 + Button, 5 + AngleBracketsIcon, 6 + BookCheckIcon, 7 + ClydeIcon 8 + } from "@moonlight-mod/wp/discord/components/common/index"; 2 9 import Flex from "@moonlight-mod/wp/discord/uikit/Flex"; 3 10 import React from "@moonlight-mod/wp/react"; 4 11 import MarkupUtils from "@moonlight-mod/wp/discord/modules/markup/MarkupUtils"; 5 - import IntegrationCard from "@moonlight-mod/wp/discord/modules/guild_settings/IntegrationCard.css"; 6 12 import spacepack from "@moonlight-mod/wp/spacepack_spacepack"; 7 13 8 - const { Card, Text, useThemeContext, Button, AngleBracketsIcon, BookCheckIcon, ClydeIcon } = Components; 9 - 10 14 const wordmark = "https://raw.githubusercontent.com/moonlight-mod/moonlight/refs/heads/main/img/wordmark.png"; 11 15 const wordmarkLight = 12 16 "https://raw.githubusercontent.com/moonlight-mod/moonlight/refs/heads/main/img/wordmark-light.png"; ··· 21 25 22 26 function Dev({ name, picture, link }: { name: string; picture: string; link: string }) { 23 27 return ( 24 - <Card editable={true} className={IntegrationCard.card}> 25 - <div className={IntegrationCard.cardHeader + " moonbase-dev"}> 26 - <Flex direction={Flex.Direction.HORIZONTAL} align={Flex.Align.CENTER}> 27 - <img src={picture} alt={name} className="moonbase-dev-avatar" /> 28 + <Button onClick={() => window.open(link)} color={Button.Colors.PRIMARY} className="moonbase-dev"> 29 + <Flex direction={Flex.Direction.HORIZONTAL} align={Flex.Align.CENTER} className="moonbase-gap"> 30 + <img src={picture} alt={name} className="moonbase-dev-avatar" /> 28 31 29 - <Flex direction={Flex.Direction.VERTICAL} align={Flex.Align.CENTER}> 30 - <a href={link} rel="noreferrer noopener" target="_blank" tabIndex={-1}> 31 - <Text variant="text-md/semibold">{name}</Text> 32 - </a> 33 - </Flex> 34 - </Flex> 35 - </div> 36 - </Card> 32 + <Text variant="text-md/semibold">{name}</Text> 33 + </Flex> 34 + </Button> 37 35 ); 38 36 } 39 37 ··· 53 51 onClick={() => { 54 52 if (openInClient) { 55 53 try { 56 - const openLink = spacepack.findFunctionByStrings( 57 - spacepack.findByCode(".trackAnnouncementMessageLinkClicked({messageId:")[0].exports, 58 - ".trackAnnouncementMessageLinkClicked({messageId:" 59 - ) as ({ href }: { href: string }) => void; 60 - openLink({ href: link }); 54 + const { handleClick } = spacepack.require("discord/utils/MaskedLinkUtils"); 55 + handleClick({ href: link }); 61 56 } catch { 62 57 window.open(link); 63 58 } ··· 79 74 } 80 75 81 76 export default function AboutPage() { 82 - const darkTheme = useThemeContext()?.theme === "dark"; 77 + const darkTheme = useThemeContext()?.theme !== "light"; 83 78 84 79 return ( 85 - <div> 86 - <Flex direction={Flex.Direction.VERTICAL} align={Flex.Align.CENTER}> 87 - <img src={darkTheme ? wordmarkLight : wordmark} alt="moonlight wordmark" className="moonbase-wordmark" /> 88 - <Text variant="heading-lg/medium">created by:</Text> 89 - <div className="moonbase-devs"> 90 - <Dev name="Cynosphere" picture="https://github.com/Cynosphere.png" link="https://github.com/Cynosphere" /> 91 - <Dev name="NotNite" picture="https://github.com/NotNite.png" link="https://github.com/NotNite" /> 92 - <Dev name="adryd" picture="https://github.com/adryd325.png" link="https://github.com/adryd325" /> 93 - <Dev 94 - name="redstonekasi" 95 - picture="https://github.com/redstonekasi.png" 96 - link="https://github.com/redstonekasi" 97 - /> 98 - </div> 80 + <Flex direction={Flex.Direction.VERTICAL} align={Flex.Align.CENTER} className="moonbase-about-page"> 81 + <img src={darkTheme ? wordmarkLight : wordmark} alt="moonlight wordmark" className="moonbase-wordmark" /> 99 82 100 - <Flex direction={Flex.Direction.HORIZONTAL} align={Flex.Align.CENTER} className="moonbase-gap"> 101 - <IconButton text="View source" icon={AngleBracketsIcon} link="https://github.com/moonlight-mod/moonlight" /> 102 - <IconButton text="Open the docs" icon={BookCheckIcon} link="https://moonlight-mod.github.io/" /> 103 - <IconButton 104 - text="Join the server" 105 - icon={ClydeIcon} 106 - link="https://discord.gg/FdZBTFCP6F" 107 - openInClient={true} 108 - /> 109 - </Flex> 83 + <Text variant="heading-lg/medium">created by:</Text> 84 + <div className="moonbase-devs"> 85 + <Dev name="Cynosphere" picture="https://github.com/Cynosphere.png" link="https://github.com/Cynosphere" /> 86 + <Dev name="NotNite" picture="https://github.com/NotNite.png" link="https://github.com/NotNite" /> 87 + <Dev name="adryd" picture="https://github.com/adryd325.png" link="https://github.com/adryd325" /> 88 + <Dev name="redstonekasi" picture="https://github.com/redstonekasi.png" link="https://github.com/redstonekasi" /> 89 + </div> 90 + 91 + <Flex direction={Flex.Direction.HORIZONTAL} align={Flex.Align.CENTER} className="moonbase-gap"> 92 + <IconButton text="View source" icon={AngleBracketsIcon} link="https://github.com/moonlight-mod/moonlight" /> 93 + <IconButton text="Open the docs" icon={BookCheckIcon} link="https://moonlight-mod.github.io/" /> 94 + <IconButton text="Join the server" icon={ClydeIcon} link="https://discord.gg/FdZBTFCP6F" openInClient={true} /> 110 95 </Flex> 111 96 112 - <Flex direction={Flex.Direction.VERTICAL} align={Flex.Align.START} className="moonbase-about-text"> 97 + <Flex direction={Flex.Direction.VERTICAL} align={Flex.Align.START}> 113 98 <Text variant="text-sm/normal"> 114 99 {parse(`moonlight \`${window.moonlight.version}\` on \`${window.moonlight.branch}\``)} 115 100 </Text> ··· 120 105 )} 121 106 </Text> 122 107 </Flex> 123 - </div> 108 + </Flex> 124 109 ); 125 110 }
+14 -13
packages/core-extensions/src/moonbase/webpackModules/ui/config/index.tsx
··· 16 16 Clickable 17 17 } from "@moonlight-mod/wp/discord/components/common/index"; 18 18 import Flex from "@moonlight-mod/wp/discord/uikit/Flex"; 19 - import * as Components from "@moonlight-mod/wp/discord/components/common/index"; 19 + import { CircleXIcon } from "@moonlight-mod/wp/discord/components/common/index"; 20 + import Margins from "@moonlight-mod/wp/discord/styles/shared/Margins.css"; 21 + import FormSwitchClasses from "@moonlight-mod/wp/discord/components/common/FormSwitch.css"; 20 22 21 23 import { MoonbaseSettingsStore } from "@moonlight-mod/wp/moonbase_stores"; 22 24 23 - const FormClasses = spacepack.findByCode("dividerDefault:")[0].exports; 24 - const Margins = spacepack.findByCode("marginCenterHorz:")[0].exports; 25 - 26 - let RemoveButtonClasses: any; 25 + let GuildSettingsRoleEditClasses: any; 27 26 spacepack 28 27 .lazyLoad( 29 28 "renderArtisanalHack", 30 29 /\[(?:.\.e\("\d+?"\),?)+\][^}]+?webpackId:\d+,name:"GuildSettings"/, 31 30 /webpackId:(\d+),name:"GuildSettings"/ 32 31 ) 33 - .then(() => (RemoveButtonClasses = spacepack.findByCode("removeButtonContainer")[0].exports)); 34 - 35 - // FIXME: type component keys 36 - const { CircleXIcon } = Components; 32 + .then( 33 + () => 34 + (GuildSettingsRoleEditClasses = spacepack.require( 35 + "discord/modules/guild_settings/roles/web/GuildSettingsRoleEdit.css" 36 + )) 37 + ); 37 38 38 39 function RemoveEntryButton({ onClick }: { onClick: () => void }) { 39 40 return ( 40 - <div className={RemoveButtonClasses.removeButtonContainer}> 41 + <div className={GuildSettingsRoleEditClasses.removeButtonContainer}> 41 42 <Tooltip text="Remove entry" position="top"> 42 43 {(props: any) => ( 43 - <Clickable {...props} className={RemoveButtonClasses.removeButton} onClick={onClick}> 44 + <Clickable {...props} className={GuildSettingsRoleEditClasses.removeButton} onClick={onClick}> 44 45 <CircleXIcon width={24} height={24} /> 45 46 </Clickable> 46 47 )} ··· 121 122 <FormText className={Margins.marginBottom4}>A list of remote repositories to display extensions from</FormText> 122 123 <ArrayFormItem config="repositories" /> 123 124 </FormItem> 124 - <FormDivider className={FormClasses.dividerDefault} /> 125 + <FormDivider className={FormSwitchClasses.dividerDefault} /> 125 126 <FormItem title="Extension search paths" className={Margins.marginTop20}> 126 127 <FormText className={Margins.marginBottom4}> 127 128 A list of local directories to search for built extensions 128 129 </FormText> 129 130 <ArrayFormItem config="devSearchPaths" /> 130 131 </FormItem> 131 - <FormDivider className={FormClasses.dividerDefault} /> 132 + <FormDivider className={FormSwitchClasses.dividerDefault} /> 132 133 <FormSwitch 133 134 className={Margins.marginTop20} 134 135 value={MoonbaseSettingsStore.getConfigOption("patchAll") ?? false}
+125 -68
packages/core-extensions/src/moonbase/webpackModules/ui/extensions/card.tsx
··· 1 1 import { ExtensionState } from "../../../types"; 2 2 import { constants, ExtensionLoadSource, ExtensionTag } from "@moonlight-mod/types"; 3 + 3 4 import { ExtensionCompat } from "@moonlight-mod/core/extension/loader"; 4 - 5 - import spacepack from "@moonlight-mod/wp/spacepack_spacepack"; 6 - import * as Components from "@moonlight-mod/wp/discord/components/common/index"; 5 + import { 6 + ScienceIcon, 7 + DownloadIcon, 8 + TrashIcon, 9 + AngleBracketsIcon, 10 + Tooltip, 11 + Card, 12 + Text, 13 + FormSwitch, 14 + TabBar, 15 + Button, 16 + ChannelListIcon, 17 + HeartIcon, 18 + WindowTopOutlineIcon, 19 + WarningIcon 20 + } from "@moonlight-mod/wp/discord/components/common/index"; 7 21 import React from "@moonlight-mod/wp/react"; 8 22 import { useStateFromStores } from "@moonlight-mod/wp/discord/packages/flux"; 9 23 import Flex from "@moonlight-mod/wp/discord/uikit/Flex"; 10 24 import MarkupUtils from "@moonlight-mod/wp/discord/modules/markup/MarkupUtils"; 11 - import IntegrationCard from "@moonlight-mod/wp/discord/modules/guild_settings/IntegrationCard.css"; 12 - 25 + import AppCardClasses from "@moonlight-mod/wp/discord/modules/guild_settings/web/AppCard.css"; 26 + import PanelButton from "@moonlight-mod/wp/discord/components/common/PanelButton"; 27 + import DiscoveryClasses from "@moonlight-mod/wp/discord/modules/discovery/web/Discovery.css"; 28 + import MarkupClasses from "@moonlight-mod/wp/discord/modules/messages/web/Markup.css"; 29 + import BuildOverrideClasses from "@moonlight-mod/wp/discord/modules/build_overrides/web/BuildOverride.css"; 30 + import { MoonbaseSettingsStore } from "@moonlight-mod/wp/moonbase_stores"; 31 + import ErrorBoundary from "@moonlight-mod/wp/common_ErrorBoundary"; 13 32 import ExtensionInfo from "./info"; 14 33 import Settings from "./settings"; 15 34 import { doGenericExtensionPopup, doMissingExtensionPopup } from "./popup"; ··· 21 40 Settings 22 41 } 23 42 24 - import { MoonbaseSettingsStore } from "@moonlight-mod/wp/moonbase_stores"; 25 - 26 - const { BeakerIcon, DownloadIcon, TrashIcon, AngleBracketsIcon, Tooltip } = Components; 27 - 28 - const PanelButton = spacepack.findByCode("Masks.PANEL_BUTTON")[0].exports.Z; 29 - const TabBarClasses = spacepack.findByCode("tabBar:", "tabBarItem:", "headerContentWrapper:")[0].exports; 30 - const MarkupClasses = spacepack.findByCode("markup:", "inlineFormat:")[0].exports; 31 - 32 - const BuildOverrideClasses = spacepack.findByCode("disabledButtonOverride:")[0].exports; 33 - 34 43 const COMPAT_TEXT_MAP: Record<ExtensionCompat, string> = { 35 44 [ExtensionCompat.Compatible]: "huh?", 36 45 [ExtensionCompat.InvalidApiLevel]: "Incompatible API level", ··· 38 47 }; 39 48 const CONFLICTING_TEXT = "This extension is already installed from another source."; 40 49 41 - export default function ExtensionCard({ uniqueId }: { uniqueId: number }) { 42 - const [tab, setTab] = React.useState(ExtensionPage.Info); 50 + function PanelLinkButton({ icon, tooltip, link }: { icon: React.ReactNode; tooltip: string; link: string }) { 51 + return ( 52 + <PanelButton 53 + icon={icon} 54 + tooltipText={tooltip} 55 + onClick={() => { 56 + window.open(link); 57 + }} 58 + /> 59 + ); 60 + } 43 61 62 + export default function ExtensionCard({ uniqueId, selectTag }: { uniqueId: number; selectTag: (tag: string) => void }) { 44 63 const { ext, enabled, busy, update, conflicting } = useStateFromStores([MoonbaseSettingsStore], () => { 45 64 return { 46 65 ext: MoonbaseSettingsStore.getExtension(uniqueId), ··· 51 70 }; 52 71 }); 53 72 54 - // Why it work like that :sob: 55 - if (ext == null) return <></>; 56 - 57 - const { Card, Text, FormSwitch, TabBar, Button } = Components; 73 + const [tab, setTab] = React.useState( 74 + update != null && ext?.changelog != null ? ExtensionPage.Changelog : ExtensionPage.Info 75 + ); 58 76 59 77 const tagline = ext.manifest?.meta?.tagline; 60 78 const settings = ext.settingsOverride ?? ext.manifest?.settings; 61 79 const description = ext.manifest?.meta?.description; 62 80 const changelog = ext.changelog; 81 + const linkButtons = [ 82 + ext?.manifest?.meta?.source && ( 83 + <PanelLinkButton icon={<AngleBracketsIcon />} tooltip="View source" link={ext.manifest.meta.source} /> 84 + ), 85 + ext?.source?.url && <PanelLinkButton icon={<ChannelListIcon />} tooltip="View repository" link={ext.source.url} />, 86 + ext?.manifest?.meta?.donate && ( 87 + <PanelLinkButton icon={<HeartIcon />} tooltip="Donate" link={ext.manifest.meta.donate} /> 88 + ) 89 + ].filter((x) => x != null); 90 + 63 91 const enabledDependants = useStateFromStores([MoonbaseSettingsStore], () => 64 92 Object.keys(MoonbaseSettingsStore.extensions) 65 93 .filter((uniqueId) => { 66 94 const potentialDependant = MoonbaseSettingsStore.getExtension(parseInt(uniqueId)); 67 95 68 96 return ( 69 - potentialDependant.manifest.dependencies?.includes(ext.id) && 97 + potentialDependant.manifest.dependencies?.includes(ext?.id) && 70 98 MoonbaseSettingsStore.getExtensionEnabled(parseInt(uniqueId)) 71 99 ); 72 100 }) ··· 74 102 ); 75 103 const implicitlyEnabled = enabledDependants.length > 0; 76 104 77 - return ( 78 - <Card editable={true} className={IntegrationCard.card}> 79 - <div className={IntegrationCard.cardHeader}> 105 + const hasDuplicateEntry = useStateFromStores([MoonbaseSettingsStore], () => 106 + Object.entries(MoonbaseSettingsStore.extensions).some( 107 + ([otherUniqueId, otherExt]) => 108 + otherExt != null && otherExt?.id === ext?.id && parseInt(otherUniqueId) !== uniqueId 109 + ) 110 + ); 111 + 112 + return ext == null ? ( 113 + <></> 114 + ) : ( 115 + <Card editable={true} className={AppCardClasses.card}> 116 + <div className={AppCardClasses.cardHeader}> 80 117 <Flex direction={Flex.Direction.VERTICAL}> 81 118 <Flex direction={Flex.Direction.HORIZONTAL} align={Flex.Align.CENTER}> 82 119 <Text variant="text-md/semibold">{ext.manifest?.meta?.name ?? ext.id}</Text> 83 120 {ext.source.type === ExtensionLoadSource.Developer && ( 84 121 <Tooltip text="This is a local extension" position="top"> 85 - {(props: any) => <BeakerIcon {...props} class={BuildOverrideClasses.infoIcon} size="xs" />} 122 + {(props: any) => <ScienceIcon {...props} class={BuildOverrideClasses.infoIcon} size="xs" />} 123 + </Tooltip> 124 + )} 125 + 126 + {hasDuplicateEntry && ext?.source?.url && ( 127 + <Tooltip text={`This extension is from the following repository: ${ext.source.url}`} position="top"> 128 + {(props: any) => <WindowTopOutlineIcon {...props} class={BuildOverrideClasses.infoIcon} size="xs" />} 129 + </Tooltip> 130 + )} 131 + 132 + {ext.manifest?.meta?.deprecated && ( 133 + <Tooltip text="This extension is deprecated" position="top"> 134 + {(props: any) => <WarningIcon {...props} class={BuildOverrideClasses.infoIcon} size="xs" />} 86 135 </Tooltip> 87 136 )} 88 137 </Flex> ··· 99 148 gap: "1rem" 100 149 }} 101 150 > 102 - {ext.manifest.meta?.source != null && ( 103 - <PanelButton 104 - icon={AngleBracketsIcon} 105 - tooltipText="View source" 106 - onClick={() => { 107 - window.open(ext.manifest.meta!.source); 108 - }} 109 - /> 110 - )} 111 - 112 151 {ext.state === ExtensionState.NotDownloaded ? ( 113 152 <Tooltip 114 153 text={conflicting ? CONFLICTING_TEXT : COMPAT_TEXT_MAP[ext.compat]} ··· 210 249 </div> 211 250 212 251 <div> 213 - {(description != null || changelog != null || settings != null) && ( 214 - <TabBar 215 - selectedItem={tab} 216 - type="top" 217 - onItemSelect={setTab} 218 - className={TabBarClasses.tabBar} 219 - style={{ 220 - padding: "0 20px" 221 - }} 222 - > 223 - <TabBar.Item className={TabBarClasses.tabBarItem} id={ExtensionPage.Info}> 224 - Info 225 - </TabBar.Item> 226 - 227 - {description != null && ( 228 - <TabBar.Item className={TabBarClasses.tabBarItem} id={ExtensionPage.Description}> 229 - Description 252 + {(description != null || changelog != null || settings != null || linkButtons.length > 0) && ( 253 + <Flex> 254 + <TabBar 255 + selectedItem={tab} 256 + type="top" 257 + onItemSelect={setTab} 258 + className={DiscoveryClasses.tabBar} 259 + style={{ 260 + padding: "0 20px" 261 + }} 262 + > 263 + <TabBar.Item className={DiscoveryClasses.tabBarItem} id={ExtensionPage.Info}> 264 + Info 230 265 </TabBar.Item> 231 - )} 232 266 233 - {changelog != null && ( 234 - <TabBar.Item className={TabBarClasses.tabBarItem} id={ExtensionPage.Changelog}> 235 - Changelog 236 - </TabBar.Item> 237 - )} 267 + {description != null && ( 268 + <TabBar.Item className={DiscoveryClasses.tabBarItem} id={ExtensionPage.Description}> 269 + Description 270 + </TabBar.Item> 271 + )} 238 272 239 - {settings != null && ( 240 - <TabBar.Item className={TabBarClasses.tabBarItem} id={ExtensionPage.Settings}> 241 - Settings 242 - </TabBar.Item> 243 - )} 244 - </TabBar> 273 + {changelog != null && ( 274 + <TabBar.Item className={DiscoveryClasses.tabBarItem} id={ExtensionPage.Changelog}> 275 + Changelog 276 + </TabBar.Item> 277 + )} 278 + 279 + {settings != null && ( 280 + <TabBar.Item className={DiscoveryClasses.tabBarItem} id={ExtensionPage.Settings}> 281 + Settings 282 + </TabBar.Item> 283 + )} 284 + </TabBar> 285 + 286 + <Flex 287 + align={Flex.Align.CENTER} 288 + justify={Flex.Justify.END} 289 + direction={Flex.Direction.HORIZONTAL} 290 + grow={1} 291 + className="moonbase-link-buttons" 292 + > 293 + {linkButtons.length > 0 && linkButtons} 294 + </Flex> 295 + </Flex> 245 296 )} 246 297 247 298 <Flex 248 299 justify={Flex.Justify.START} 249 300 wrap={Flex.Wrap.WRAP} 250 301 style={{ 251 - padding: "16px 16px" 302 + padding: "16px 16px", 303 + // This looks wonky in the settings tab 304 + rowGap: tab === ExtensionPage.Info ? "16px" : undefined 252 305 }} 253 306 > 254 - {tab === ExtensionPage.Info && <ExtensionInfo ext={ext} />} 307 + {tab === ExtensionPage.Info && <ExtensionInfo ext={ext} selectTag={selectTag} />} 255 308 {tab === ExtensionPage.Description && ( 256 309 <Text variant="text-md/normal" className={MarkupClasses.markup} style={{ width: "100%" }}> 257 310 {MarkupUtils.parse(description ?? "*No description*", true, { ··· 270 323 })} 271 324 </Text> 272 325 )} 273 - {tab === ExtensionPage.Settings && <Settings ext={ext} />} 326 + {tab === ExtensionPage.Settings && ( 327 + <ErrorBoundary> 328 + <Settings ext={ext} /> 329 + </ErrorBoundary> 330 + )} 274 331 </Flex> 275 332 </div> 276 333 </Card>
+53 -53
packages/core-extensions/src/moonbase/webpackModules/ui/extensions/filterBar.tsx
··· 1 1 import { tagNames } from "./info"; 2 - 3 2 import spacepack from "@moonlight-mod/wp/spacepack_spacepack"; 4 3 import * as React from "@moonlight-mod/wp/react"; 5 4 import { useStateFromStores } from "@moonlight-mod/wp/discord/packages/flux"; ··· 11 10 Popout, 12 11 Dialog, 13 12 Menu, 14 - MenuGroup, 15 - MenuCheckboxItem, 16 - MenuItem 13 + ChevronSmallDownIcon, 14 + ChevronSmallUpIcon, 15 + ArrowsUpDownIcon, 16 + RetryIcon, 17 + Tooltip 17 18 } from "@moonlight-mod/wp/discord/components/common/index"; 18 - import * as Components from "@moonlight-mod/wp/discord/components/common/index"; 19 + import { MenuGroup, MenuCheckboxItem, MenuItem } from "@moonlight-mod/wp/contextMenu_contextMenu"; 19 20 import { MoonbaseSettingsStore } from "@moonlight-mod/wp/moonbase_stores"; 21 + import Margins from "@moonlight-mod/wp/discord/styles/shared/Margins.css"; 22 + import TagItem from "@moonlight-mod/wp/discord/modules/forums/web/Tag"; 20 23 21 24 export enum Filter { 22 25 Core = 1 << 0, ··· 26 29 Disabled = 1 << 4, 27 30 Installed = 1 << 5, 28 31 Repository = 1 << 6, 29 - Incompatible = 1 << 7 32 + Incompatible = 1 << 7, 33 + Deprecated = 1 << 8 30 34 } 31 35 export const defaultFilter = 127 as Filter; 32 36 33 - const Margins = spacepack.findByCode("marginCenterHorz:")[0].exports; 34 - const SortMenuClasses = spacepack.findByCode("container:", "clearText:")[0].exports; 35 - 36 - let FilterDialogClasses: any; 37 - let FilterBarClasses: any; 37 + let HeaderClasses: any; 38 + let ForumsClasses: any; 39 + let SortMenuClasses: any; 38 40 spacepack 39 41 .lazyLoad('"Missing channel in Channel.openChannelContextMenu"', /e\("(\d+)"\)/g, /webpackId:(\d+?),/) 40 42 .then(() => { 41 - FilterBarClasses = spacepack.findByCode("tagsButtonWithCount:")[0].exports; 42 - FilterDialogClasses = spacepack.findByCode("countContainer:", "tagContainer:")[0].exports; 43 + ForumsClasses = spacepack.require("discord/modules/forums/web/Forums.css"); 44 + HeaderClasses = spacepack.require("discord/modules/forums/web/Header.css"); 45 + SortMenuClasses = spacepack.require("discord/modules/forums/web/SortMenu.css"); 43 46 }); 44 - 45 - const TagItem = spacepack.findByCode('"forum-tag-"')[0].exports.Z; 46 - 47 - // FIXME: type component keys 48 - const { ChevronSmallDownIcon, ChevronSmallUpIcon, ArrowsUpDownIcon, RetryIcon, Tooltip } = Components; 49 47 50 48 function toggleTag(selectedTags: Set<string>, setSelectedTags: (tags: Set<string>) => void, tag: string) { 51 49 const newState = new Set(selectedTags); ··· 123 121 checked={(filter & Filter.Incompatible) === Filter.Incompatible} 124 122 action={() => toggleFilter(Filter.Incompatible)} 125 123 /> 124 + <MenuCheckboxItem 125 + id="l-deprecated" 126 + label="Show deprecated" 127 + checked={(filter & Filter.Deprecated) === Filter.Deprecated} 128 + action={() => toggleFilter(Filter.Deprecated)} 129 + /> 126 130 <MenuItem 127 131 id="reset-all" 128 132 className={SortMenuClasses.clearText} ··· 140 144 141 145 function TagButtonPopout({ selectedTags, setSelectedTags, setPopoutRef, closePopout }: any) { 142 146 return ( 143 - <Dialog ref={setPopoutRef} className={FilterDialogClasses.container}> 144 - <div className={FilterDialogClasses.header}> 145 - <div className={FilterDialogClasses.headerLeft}> 146 - <Heading color="interactive-normal" variant="text-xs/bold" className={FilterDialogClasses.headerText}> 147 + <Dialog ref={setPopoutRef} className={HeaderClasses.container}> 148 + <div className={HeaderClasses.header}> 149 + <div className={HeaderClasses.headerLeft}> 150 + <Heading color="interactive-normal" variant="text-xs/bold" className={HeaderClasses.headerText}> 147 151 Select tags 148 152 </Heading> 149 - <div className={FilterDialogClasses.countContainer}> 150 - <Text className={FilterDialogClasses.countText} color="none" variant="text-xs/medium"> 153 + <div className={HeaderClasses.countContainer}> 154 + <Text className={HeaderClasses.countText} color="none" variant="text-xs/medium"> 151 155 {selectedTags.size} 152 156 </Text> 153 157 </div> 154 158 </div> 155 159 </div> 156 - <div className={FilterDialogClasses.tagContainer}> 160 + <div className={HeaderClasses.tagContainer}> 157 161 {Object.keys(tagNames).map((tag) => ( 158 162 <TagItem 159 163 key={tag} 160 - className={FilterDialogClasses.tag} 161 - tag={{ name: tagNames[tag as keyof typeof tagNames] }} 164 + className={HeaderClasses.tag} 165 + tag={{ name: tagNames[tag as keyof typeof tagNames], id: tagNames[tag as keyof typeof tagNames] }} 162 166 onClick={() => toggleTag(selectedTags, setSelectedTags, tag)} 163 167 selected={selectedTags.has(tag)} 164 168 /> 165 169 ))} 166 170 </div> 167 - <div className={FilterDialogClasses.separator} /> 171 + <div className={HeaderClasses.separator} /> 168 172 <Button 169 173 look={Button.Looks.LINK} 170 174 size={Button.Sizes.MIN} 171 175 color={Button.Colors.CUSTOM} 172 - className={FilterDialogClasses.clear} 176 + className={HeaderClasses.clear} 173 177 onClick={() => { 174 178 setSelectedTags(new Set()); 175 179 closePopout(); ··· 222 226 style={{ 223 227 paddingTop: "12px" 224 228 }} 225 - className={`${FilterBarClasses.tagsContainer} ${Margins.marginBottom8}`} 229 + className={`${ForumsClasses.tagsContainer} ${Margins.marginBottom8}`} 226 230 > 227 231 <Tooltip text="Refresh updates" position="top"> 228 232 {(props: any) => ( ··· 230 234 {...props} 231 235 size={Button.Sizes.MIN} 232 236 color={Button.Colors.CUSTOM} 233 - className={`${FilterBarClasses.sortDropdown} moonbase-retry-button ${ 234 - checkingUpdates ? "moonbase-speen" : "" 235 - }`} 236 - innerClassName={FilterBarClasses.sortDropdownInner} 237 + className={`${ForumsClasses.sortDropdown} moonbase-retry-button`} 238 + innerClassName={ForumsClasses.sortDropdownInner} 237 239 onClick={() => { 238 240 (async () => { 239 241 try { ··· 247 249 })(); 248 250 }} 249 251 > 250 - <RetryIcon size={"custom"} width={16} /> 252 + <RetryIcon size={"custom"} width={16} className={checkingUpdates ? "moonbase-speen" : ""} /> 251 253 </Button> 252 254 )} 253 255 </Tooltip> ··· 263 265 {...props} 264 266 size={Button.Sizes.MIN} 265 267 color={Button.Colors.CUSTOM} 266 - className={FilterBarClasses.sortDropdown} 267 - innerClassName={FilterBarClasses.sortDropdownInner} 268 + className={ForumsClasses.sortDropdown} 269 + innerClassName={ForumsClasses.sortDropdownInner} 268 270 > 269 271 <ArrowsUpDownIcon size="xs" /> 270 - <Text className={FilterBarClasses.sortDropdownText} variant="text-sm/medium" color="interactive-normal"> 272 + <Text className={ForumsClasses.sortDropdownText} variant="text-sm/medium" color="interactive-normal"> 271 273 Sort & filter 272 274 </Text> 273 275 {isShown ? ( ··· 278 280 </Button> 279 281 )} 280 282 </Popout> 281 - <div className={FilterBarClasses.divider} /> 282 - <div className={FilterBarClasses.tagList}> 283 - <div ref={tagListInner} className={FilterBarClasses.tagListInner}> 283 + <div className={ForumsClasses.divider} /> 284 + <div className={ForumsClasses.tagList}> 285 + <div ref={tagListInner} className={ForumsClasses.tagListInner}> 284 286 {Object.keys(tagNames).map((tag) => ( 285 287 <TagItem 286 288 key={tag} 287 - className={FilterBarClasses.tag} 288 - tag={{ name: tagNames[tag as keyof typeof tagNames] }} 289 + className={ForumsClasses.tag} 290 + tag={{ name: tagNames[tag as keyof typeof tagNames], id: tag }} 289 291 onClick={() => toggleTag(selectedTags, setSelectedTags, tag)} 290 292 selected={selectedTags.has(tag)} 291 293 /> ··· 313 315 left: tagsButtonOffset 314 316 }} 315 317 // TODO: Use Discord's class name utility 316 - className={`${FilterBarClasses.tagsButton} ${ 317 - selectedTags.size > 0 ? FilterBarClasses.tagsButtonWithCount : "" 318 - }`} 319 - innerClassName={FilterBarClasses.tagsButtonInner} 318 + className={`${ForumsClasses.tagsButton} ${selectedTags.size > 0 ? ForumsClasses.tagsButtonWithCount : ""}`} 319 + innerClassName={ForumsClasses.tagsButtonInner} 320 320 > 321 321 {selectedTags.size > 0 ? ( 322 - <div style={{ boxSizing: "content-box" }} className={FilterBarClasses.countContainer}> 323 - <Text className={FilterBarClasses.countText} color="none" variant="text-xs/medium"> 322 + <div style={{ boxSizing: "content-box" }} className={ForumsClasses.countContainer}> 323 + <Text className={ForumsClasses.countText} color="none" variant="text-xs/medium"> 324 324 {selectedTags.size} 325 325 </Text> 326 326 </div> ··· 338 338 <Button 339 339 size={Button.Sizes.MIN} 340 340 color={Button.Colors.CUSTOM} 341 - className={`${FilterBarClasses.tagsButton} ${FilterBarClasses.tagsButtonPlaceholder}`} 342 - innerClassName={FilterBarClasses.tagsButtonInner} 341 + className={`${ForumsClasses.tagsButton} ${ForumsClasses.tagsButtonPlaceholder}`} 342 + innerClassName={ForumsClasses.tagsButtonInner} 343 343 > 344 344 {selectedTags.size > 0 ? ( 345 - <div style={{ boxSizing: "content-box" }} className={FilterBarClasses.countContainer}> 346 - <Text className={FilterBarClasses.countText} color="none" variant="text-xs/medium"> 345 + <div style={{ boxSizing: "content-box" }} className={ForumsClasses.countContainer}> 346 + <Text className={ForumsClasses.countText} color="none" variant="text-xs/medium"> 347 347 {selectedTags.size} 348 348 </Text> 349 349 </div>
+49 -15
packages/core-extensions/src/moonbase/webpackModules/ui/extensions/index.tsx
··· 6 6 import React from "@moonlight-mod/wp/react"; 7 7 import spacepack from "@moonlight-mod/wp/spacepack_spacepack"; 8 8 import { useStateFromStoresObject } from "@moonlight-mod/wp/discord/packages/flux"; 9 - import * as Components from "@moonlight-mod/wp/discord/components/common/index"; 9 + import { 10 + FormDivider, 11 + CircleInformationIcon, 12 + XSmallIcon, 13 + Button 14 + } from "@moonlight-mod/wp/discord/components/common/index"; 15 + import PanelButton from "@moonlight-mod/wp/discord/components/common/PanelButton"; 10 16 11 17 import { MoonbaseSettingsStore } from "@moonlight-mod/wp/moonbase_stores"; 18 + import ErrorBoundary from "@moonlight-mod/wp/common_ErrorBoundary"; 12 19 import { ExtensionCompat } from "@moonlight-mod/core/extension/loader"; 13 20 import HelpMessage from "../HelpMessage"; 14 21 15 - const SearchBar: any = Object.values(spacepack.findByCode("hideSearchIcon")[0].exports)[0]; 16 - const { FormDivider, CircleInformationIcon, XSmallIcon } = Components; 17 - const PanelButton = spacepack.findByCode("Masks.PANEL_BUTTON")[0].exports.Z; 22 + const SearchBar = spacepack.require("discord/uikit/search/SearchBar").default; 23 + 24 + const validTags: string[] = Object.values(ExtensionTag); 18 25 19 26 export default function ExtensionsPage() { 20 - const { extensions, savedFilter, showOnlyUpdateable } = useStateFromStoresObject([MoonbaseSettingsStore], () => { 27 + const { extensions, savedFilter } = useStateFromStoresObject([MoonbaseSettingsStore], () => { 21 28 return { 22 29 extensions: MoonbaseSettingsStore.extensions, 23 - savedFilter: MoonbaseSettingsStore.getExtensionConfigRaw<number>("moonbase", "filter", defaultFilter), 24 - showOnlyUpdateable: MoonbaseSettingsStore.showOnlyUpdateable 30 + savedFilter: MoonbaseSettingsStore.getExtensionConfigRaw<number>("moonbase", "filter", defaultFilter) 25 31 }; 26 32 }); 27 33 28 34 const [query, setQuery] = React.useState(""); 35 + const [hitUpdateAll, setHitUpdateAll] = React.useState(false); 29 36 30 37 const filterState = React.useState(defaultFilter); 31 38 ··· 37 44 filter = filterState[0]; 38 45 setFilter = filterState[1]; 39 46 } 47 + 40 48 const [selectedTags, setSelectedTags] = React.useState(new Set<string>()); 49 + const selectTag = React.useCallback( 50 + (tag: string) => { 51 + const newState = new Set(selectedTags); 52 + if (validTags.includes(tag)) newState.add(tag); 53 + setSelectedTags(newState); 54 + }, 55 + [selectedTags] 56 + ); 57 + 41 58 const sorted = Object.values(extensions).sort((a, b) => { 42 59 const aName = a.manifest.meta?.name ?? a.id; 43 60 const bName = b.manifest.meta?.name ?? b.id; ··· 72 89 ) && 73 90 (filter & Filter.Incompatible || 74 91 ext.compat === ExtensionCompat.Compatible || 75 - (ext.compat === ExtensionCompat.InvalidApiLevel && ext.hasUpdate)) 92 + (ext.compat === ExtensionCompat.InvalidApiLevel && ext.hasUpdate)) && 93 + (filter & Filter.Deprecated || 94 + ext.manifest?.meta?.deprecated !== true || 95 + ext.state !== ExtensionState.NotDownloaded) 76 96 ); 77 97 78 98 // Prioritize extensions with updates 79 99 const filteredWithUpdates = filtered.filter((ext) => ext!.hasUpdate); 80 - const filterUpdates = showOnlyUpdateable && filteredWithUpdates.length > 0; 81 - const filteredWithoutUpdates = filterUpdates ? [] : filtered.filter((ext) => !ext!.hasUpdate); 100 + const filteredWithoutUpdates = filtered.filter((ext) => !ext!.hasUpdate); 82 101 83 102 return ( 84 103 <> ··· 97 116 /> 98 117 <FilterBar filter={filter} setFilter={setFilter} selectedTags={selectedTags} setSelectedTags={setSelectedTags} /> 99 118 100 - {filterUpdates && ( 119 + {filteredWithUpdates.length > 0 && ( 101 120 <HelpMessage 102 121 icon={CircleInformationIcon} 103 - text="Only displaying updates" 122 + text="Extension updates are available" 104 123 className="moonbase-extension-update-section" 105 124 > 106 125 <div className="moonbase-help-message-buttons"> 126 + <Button 127 + color={Button.Colors.BRAND} 128 + size={Button.Sizes.TINY} 129 + disabled={hitUpdateAll} 130 + onClick={() => { 131 + setHitUpdateAll(true); 132 + MoonbaseSettingsStore.updateAllExtensions(); 133 + }} 134 + > 135 + Update all 136 + </Button> 107 137 <PanelButton 108 138 icon={XSmallIcon} 109 139 onClick={() => { 110 - MoonbaseSettingsStore.showOnlyUpdateable = false; 140 + MoonbaseSettingsStore.dismissAllExtensionUpdates(); 111 141 }} 112 142 /> 113 143 </div> ··· 115 145 )} 116 146 117 147 {filteredWithUpdates.map((ext) => ( 118 - <ExtensionCard uniqueId={ext.uniqueId} key={ext.uniqueId} /> 148 + <ErrorBoundary> 149 + <ExtensionCard uniqueId={ext.uniqueId} key={ext.uniqueId} selectTag={selectTag} /> 150 + </ErrorBoundary> 119 151 ))} 120 152 {filteredWithUpdates.length > 0 && filteredWithoutUpdates.length > 0 && ( 121 153 <FormDivider className="moonbase-update-divider" /> 122 154 )} 123 155 {filteredWithoutUpdates.map((ext) => ( 124 - <ExtensionCard uniqueId={ext.uniqueId} key={ext.uniqueId} /> 156 + <ErrorBoundary> 157 + <ExtensionCard uniqueId={ext.uniqueId} key={ext.uniqueId} selectTag={selectTag} /> 158 + </ErrorBoundary> 125 159 ))} 126 160 </> 127 161 );
+55 -26
packages/core-extensions/src/moonbase/webpackModules/ui/extensions/info.tsx
··· 2 2 import { MoonbaseExtension } from "../../../types"; 3 3 4 4 import React from "@moonlight-mod/wp/react"; 5 - import * as Components from "@moonlight-mod/wp/discord/components/common/index"; 6 - import spacepack from "@moonlight-mod/wp/spacepack_spacepack"; 5 + import { Text } from "@moonlight-mod/wp/discord/components/common/index"; 7 6 8 7 type Dependency = { 9 8 id: string; ··· 34 33 [ExtensionTag.Library]: "Library" 35 34 }; 36 35 37 - const UserInfoClasses = spacepack.findByCode("infoScroller", "userInfoSection", "userInfoSectionHeader")[0].exports; 38 - 39 36 import { MoonbaseSettingsStore } from "@moonlight-mod/wp/moonbase_stores"; 40 - 41 - // FIXME: type component keys 42 - const { Text } = Components; 43 37 44 38 function InfoSection({ title, children }: { title: string; children: React.ReactNode }) { 45 39 return ( ··· 48 42 marginRight: "1em" 49 43 }} 50 44 > 51 - <Text variant="eyebrow" className={UserInfoClasses.userInfoSectionHeader}> 45 + <Text variant="eyebrow" className="moonlight-card-info-header"> 52 46 {title} 53 47 </Text> 54 48 ··· 57 51 ); 58 52 } 59 53 60 - function Badge({ color, children }: { color: string; children: React.ReactNode }) { 54 + function Badge({ 55 + color, 56 + children, 57 + style = {}, 58 + onClick 59 + }: { 60 + color: string; 61 + children: React.ReactNode; 62 + style?: React.CSSProperties; 63 + onClick?: () => void; 64 + }) { 65 + if (onClick) style.cursor ??= "pointer"; 61 66 return ( 62 67 <span 63 - style={{ 64 - borderRadius: ".1875rem", 65 - padding: "0 0.275rem", 66 - marginRight: "0.4em", 67 - backgroundColor: color, 68 - color: "#fff" 69 - }} 68 + className="moonlight-card-badge" 69 + style={ 70 + { 71 + "--badge-color": color, 72 + ...style 73 + } as React.CSSProperties 74 + } 75 + onClick={onClick} 70 76 > 71 77 {children} 72 78 </span> 73 79 ); 74 80 } 75 81 76 - export default function ExtensionInfo({ ext }: { ext: MoonbaseExtension }) { 82 + export default function ExtensionInfo({ 83 + ext, 84 + selectTag 85 + }: { 86 + ext: MoonbaseExtension; 87 + selectTag: (tag: string) => void; 88 + }) { 77 89 const authors = ext.manifest?.meta?.authors; 78 90 const tags = ext.manifest?.meta?.tags; 79 91 const version = ext.manifest?.version; 80 92 81 93 const dependencies: Dependency[] = []; 94 + const incompatible: Dependency[] = []; 95 + 82 96 if (ext.manifest.dependencies != null) { 83 97 dependencies.push( 84 98 ...ext.manifest.dependencies.map((dep) => ({ ··· 98 112 } 99 113 100 114 if (ext.manifest.incompatible != null) { 101 - dependencies.push( 115 + incompatible.push( 102 116 ...ext.manifest.incompatible.map((dep) => ({ 103 117 id: dep, 104 118 type: DependencyType.Incompatible ··· 136 150 <InfoSection title="Tags"> 137 151 {tags.map((tag, i) => { 138 152 const name = tagNames[tag]; 153 + let color = "var(--bg-mod-strong)"; 154 + let style; 155 + if (tag === ExtensionTag.DangerZone) { 156 + color = "var(--red-460)"; 157 + style = { color: "var(--primary-230)" }; 158 + } 139 159 140 160 return ( 141 - <Badge key={i} color={tag === ExtensionTag.DangerZone ? "var(--red-400)" : "var(--brand-500)"}> 161 + <Badge key={i} color={color} style={style} onClick={() => selectTag(tag)}> 142 162 {name} 143 163 </Badge> 144 164 ); ··· 149 169 {dependencies.length > 0 && ( 150 170 <InfoSection title="Dependencies"> 151 171 {dependencies.map((dep) => { 152 - const colors = { 153 - [DependencyType.Dependency]: "var(--brand-500)", 154 - [DependencyType.Optional]: "var(--orange-400)", 155 - [DependencyType.Incompatible]: "var(--red-400)" 156 - }; 157 - const color = colors[dep.type]; 158 172 const name = MoonbaseSettingsStore.tryGetExtensionName(dep.id); 159 173 174 + // TODO: figure out a decent way to distinguish suggested 160 175 return ( 161 - <Badge color={color} key={dep.id}> 176 + <Badge color="var(--bg-mod-strong)" key={dep.id}> 177 + {name} 178 + </Badge> 179 + ); 180 + })} 181 + </InfoSection> 182 + )} 183 + 184 + {incompatible.length > 0 && ( 185 + <InfoSection title="Incompatible"> 186 + {incompatible.map((dep) => { 187 + const name = MoonbaseSettingsStore.tryGetExtensionName(dep.id); 188 + 189 + return ( 190 + <Badge color="var(--bg-mod-strong)" key={dep.id}> 162 191 {name} 163 192 </Badge> 164 193 );
+15 -11
packages/core-extensions/src/moonbase/webpackModules/ui/extensions/popup.tsx
··· 1 1 // TODO: clean up the styling here 2 - import spacepack from "@moonlight-mod/wp/spacepack_spacepack"; 3 2 import React from "@moonlight-mod/wp/react"; 4 3 import { MoonbaseExtension } from "core-extensions/src/moonbase/types"; 5 - import * as Components from "@moonlight-mod/wp/discord/components/common/index"; 4 + import { openModalLazy, useModalsStore, closeModal } from "@moonlight-mod/wp/discord/modules/modals/Modals"; 5 + import { SingleSelect, Text } from "@moonlight-mod/wp/discord/components/common/index"; 6 6 import { MoonbaseSettingsStore } from "@moonlight-mod/wp/moonbase_stores"; 7 7 import { ExtensionLoadSource } from "@moonlight-mod/types"; 8 8 import Flex from "@moonlight-mod/wp/discord/uikit/Flex"; 9 + import spacepack from "@moonlight-mod/wp/spacepack_spacepack"; 9 10 10 - const { openModalLazy, useModalsStore, closeModal } = Components; 11 - const Popup = spacepack.findByCode(".minorContainer", "secondaryAction")[0].exports.default; 11 + let ConfirmModal: typeof import("@moonlight-mod/wp/discord/components/modals/ConfirmModal").default; 12 12 13 13 function close() { 14 14 const ModalStore = useModalsStore.getState(); 15 15 closeModal(ModalStore.default[0].key); 16 16 } 17 17 18 + // do this to avoid a hard dependency 19 + function lazyLoad() { 20 + if (!ConfirmModal) { 21 + ConfirmModal = spacepack.require("discord/components/modals/ConfirmModal").default; 22 + } 23 + } 24 + 18 25 const presentableLoadSources: Record<ExtensionLoadSource, string> = { 19 26 [ExtensionLoadSource.Developer]: "Local extension", // should never show up 20 27 [ExtensionLoadSource.Core]: "Core extension", ··· 32 39 option: string | undefined; 33 40 setOption: (pick: string | undefined) => void; 34 41 }) { 35 - const { SingleSelect } = Components; 36 - 37 42 return ( 38 43 <SingleSelect 39 44 key={id} ··· 61 66 deps: Record<string, MoonbaseExtension[]>; 62 67 transitionState: number | null; 63 68 }) { 64 - const { Text } = Components; 65 - 69 + lazyLoad(); 66 70 const amountNotAvailable = Object.values(deps).filter((candidates) => candidates.length === 0).length; 67 71 68 72 const [options, setOptions] = React.useState<Record<string, string | undefined>>( ··· 75 79 ); 76 80 77 81 return ( 78 - <Popup 82 + <ConfirmModal 79 83 body={ 80 84 <Flex 81 85 style={{ ··· 168 172 uniqueId: number; 169 173 cb: () => void; 170 174 }) { 171 - const { Text } = Components; 175 + lazyLoad(); 172 176 173 177 return ( 174 - <Popup 178 + <ConfirmModal 175 179 title={title} 176 180 body={ 177 181 <Flex>
+69 -43
packages/core-extensions/src/moonbase/webpackModules/ui/extensions/settings.tsx
··· 11 11 12 12 import spacepack from "@moonlight-mod/wp/spacepack_spacepack"; 13 13 import React from "@moonlight-mod/wp/react"; 14 - import * as Components from "@moonlight-mod/wp/discord/components/common/index"; 14 + import { 15 + FormSwitch, 16 + FormItem, 17 + FormText, 18 + TextInput, 19 + Slider, 20 + TextArea, 21 + Tooltip, 22 + Clickable, 23 + CircleXIcon, 24 + Text, 25 + SingleSelect, 26 + Button, 27 + useVariableSelect, 28 + multiSelect, 29 + Select as DiscordSelect, 30 + NumberInputStepper 31 + } from "@moonlight-mod/wp/discord/components/common/index"; 15 32 import { useStateFromStores } from "@moonlight-mod/wp/discord/packages/flux"; 16 33 import Flex from "@moonlight-mod/wp/discord/uikit/Flex"; 17 34 import MarkupUtils from "@moonlight-mod/wp/discord/modules/markup/MarkupUtils"; 18 35 import { MoonbaseSettingsStore } from "@moonlight-mod/wp/moonbase_stores"; 36 + import ErrorBoundary from "@moonlight-mod/wp/common_ErrorBoundary"; 37 + 38 + let GuildSettingsRoleEditClasses: any; 39 + spacepack 40 + .lazyLoad( 41 + "renderArtisanalHack", 42 + /\[(?:.\.e\("\d+?"\),?)+\][^}]+?webpackId:\d+,name:"GuildSettings"/, 43 + /webpackId:(\d+),name:"GuildSettings"/ 44 + ) 45 + .then( 46 + () => 47 + (GuildSettingsRoleEditClasses = spacepack.require( 48 + "discord/modules/guild_settings/roles/web/GuildSettingsRoleEdit.css" 49 + )) 50 + ); 19 51 20 52 type SettingsProps = { 21 53 ext: MoonbaseExtension; ··· 49 81 } 50 82 51 83 function Boolean({ ext, name, setting, disabled }: SettingsProps) { 52 - const { FormSwitch } = Components; 53 84 const { value, displayName, description } = useConfigEntry<boolean>(ext.uniqueId, name); 54 85 55 86 return ( ··· 60 91 onChange={(value: boolean) => { 61 92 MoonbaseSettingsStore.setExtensionConfig(ext.id, name, value); 62 93 }} 63 - // @ts-expect-error TODO: mappings 64 - note={markdownify(description)} 94 + note={description != null ? markdownify(description) : undefined} 65 95 className={`${Margins.marginReset} ${Margins.marginTop20}`} 66 96 > 67 97 {displayName} ··· 70 100 } 71 101 72 102 function Number({ ext, name, setting, disabled }: SettingsProps) { 73 - const { FormItem, FormText, Slider } = Components; 74 103 const { value, displayName, description } = useConfigEntry<number>(ext.uniqueId, name); 75 104 76 105 const castedSetting = setting as NumberSettingType; 77 - const min = castedSetting.min ?? 0; 78 - const max = castedSetting.max ?? 100; 106 + const min = castedSetting.min; 107 + const max = castedSetting.max; 108 + 109 + const onChange = (value: number) => { 110 + const rounded = min == null || max == null ? Math.round(value) : Math.max(min, Math.min(max, Math.round(value))); 111 + MoonbaseSettingsStore.setExtensionConfig(ext.id, name, rounded); 112 + }; 79 113 80 114 return ( 81 115 <FormItem className={Margins.marginTop20} title={displayName}> 82 - {description && <FormText>{markdownify(description)}</FormText>} 83 - <Slider 84 - initialValue={value ?? 0} 85 - disabled={disabled} 86 - minValue={castedSetting.min ?? 0} 87 - maxValue={castedSetting.max ?? 100} 88 - onValueChange={(value: number) => { 89 - const rounded = Math.max(min, Math.min(max, Math.round(value))); 90 - MoonbaseSettingsStore.setExtensionConfig(ext.id, name, rounded); 91 - }} 92 - /> 116 + {min == null || max == null ? ( 117 + <Flex justify={Flex.Justify.BETWEEN} direction={Flex.Direction.HORIZONTAL}> 118 + {description && <FormText>{markdownify(description)}</FormText>} 119 + <NumberInputStepper value={value ?? 0} onChange={onChange} /> 120 + </Flex> 121 + ) : ( 122 + <> 123 + {description && <FormText>{markdownify(description)}</FormText>} 124 + <Slider 125 + initialValue={value ?? 0} 126 + disabled={disabled} 127 + minValue={min} 128 + maxValue={max} 129 + onValueChange={onChange} 130 + onValueRender={(value: number) => `${Math.round(value)}`} 131 + /> 132 + </> 133 + )} 93 134 </FormItem> 94 135 ); 95 136 } 96 137 97 138 function String({ ext, name, setting, disabled }: SettingsProps) { 98 - const { FormItem, FormText, TextInput } = Components; 99 139 const { value, displayName, description } = useConfigEntry<string>(ext.uniqueId, name); 100 140 101 141 return ( ··· 103 143 {description && <FormText className={Margins.marginBottom8}>{markdownify(description)}</FormText>} 104 144 <TextInput 105 145 value={value ?? ""} 106 - onChange={(value: string) => { 107 - if (disabled) return; 108 - MoonbaseSettingsStore.setExtensionConfig(ext.id, name, value); 109 - }} 146 + disabled={disabled} 147 + onChange={(value: string) => MoonbaseSettingsStore.setExtensionConfig(ext.id, name, value)} 110 148 /> 111 149 </FormItem> 112 150 ); 113 151 } 114 152 115 153 function MultilineString({ ext, name, setting, disabled }: SettingsProps) { 116 - const { FormItem, FormText, TextArea } = Components; 117 154 const { value, displayName, description } = useConfigEntry<string>(ext.uniqueId, name); 118 155 119 156 return ( ··· 122 159 <TextArea 123 160 rows={5} 124 161 value={value ?? ""} 162 + disabled={disabled} 125 163 className={"moonbase-resizeable"} 126 - onChange={(value: string) => { 127 - if (disabled) return; 128 - MoonbaseSettingsStore.setExtensionConfig(ext.id, name, value); 129 - }} 164 + onChange={(value: string) => MoonbaseSettingsStore.setExtensionConfig(ext.id, name, value)} 130 165 /> 131 166 </FormItem> 132 167 ); 133 168 } 134 169 135 170 function Select({ ext, name, setting, disabled }: SettingsProps) { 136 - const { FormItem, FormText, SingleSelect } = Components; 137 171 const { value, displayName, description } = useConfigEntry<string>(ext.uniqueId, name); 138 172 139 173 const castedSetting = setting as SelectSettingType; ··· 157 191 } 158 192 159 193 function MultiSelect({ ext, name, setting, disabled }: SettingsProps) { 160 - const { FormItem, FormText, Select, useVariableSelect, multiSelect } = Components; 161 194 const { value, displayName, description } = useConfigEntry<string | string[]>(ext.uniqueId, name); 162 195 163 196 const castedSetting = setting as MultiSelectSettingType; ··· 166 199 return ( 167 200 <FormItem className={Margins.marginTop20} title={displayName}> 168 201 {description && <FormText className={Margins.marginBottom8}>{markdownify(description)}</FormText>} 169 - <Select 202 + <DiscordSelect 170 203 autofocus={false} 171 204 clearable={false} 172 205 closeOnSelect={false} ··· 184 217 ); 185 218 } 186 219 187 - const RemoveButtonClasses = spacepack.findByCode("removeButtonContainer")[0].exports; 188 - 189 - // FIXME: type component keys 190 - const { CircleXIcon } = Components; 191 - 192 220 function RemoveEntryButton({ onClick, disabled }: { onClick: () => void; disabled: boolean }) { 193 - const { Tooltip, Clickable } = Components; 194 221 return ( 195 - <div className={RemoveButtonClasses.removeButtonContainer}> 222 + <div className={GuildSettingsRoleEditClasses.removeButtonContainer}> 196 223 <Tooltip text="Remove entry" position="top"> 197 224 {(props: any) => ( 198 - <Clickable {...props} className={RemoveButtonClasses.removeButton} onClick={onClick}> 225 + <Clickable {...props} className={GuildSettingsRoleEditClasses.removeButton} onClick={onClick}> 199 226 <CircleXIcon width={16} height={16} /> 200 227 </Clickable> 201 228 )} ··· 205 232 } 206 233 207 234 function List({ ext, name, setting, disabled }: SettingsProps) { 208 - const { FormItem, FormText, TextInput, Button } = Components; 209 235 const { value, displayName, description } = useConfigEntry<string[]>(ext.uniqueId, name); 210 236 211 237 const entries = value ?? []; ··· 265 291 } 266 292 267 293 function Dictionary({ ext, name, setting, disabled }: SettingsProps) { 268 - const { FormItem, FormText, TextInput, Button } = Components; 269 294 const { value, displayName, description } = useConfigEntry<Record<string, string>>(ext.uniqueId, name); 270 295 271 296 const entries = Object.entries(value ?? {}); ··· 347 372 ); 348 373 349 374 if (Component == null) { 350 - const { Text } = Components; 351 375 return ( 352 376 <Text variant="text-md/normal">{`Custom setting "${displayName}" is missing a component. Perhaps the extension is not installed?`}</Text> 353 377 ); 354 378 } 355 379 356 380 return ( 357 - <Component value={value} setValue={(value) => MoonbaseSettingsStore.setExtensionConfig(ext.id, name, value)} /> 381 + <ErrorBoundary> 382 + <Component value={value} setValue={(value) => MoonbaseSettingsStore.setExtensionConfig(ext.id, name, value)} /> 383 + </ErrorBoundary> 358 384 ); 359 385 } 360 386
+16 -15
packages/core-extensions/src/moonbase/webpackModules/ui/index.tsx
··· 1 1 import React from "@moonlight-mod/wp/react"; 2 - import spacepack from "@moonlight-mod/wp/spacepack_spacepack"; 3 2 import { Text, TabBar } from "@moonlight-mod/wp/discord/components/common/index"; 4 3 import { useStateFromStores } from "@moonlight-mod/wp/discord/packages/flux"; 5 4 import { UserSettingsModalStore } from "@moonlight-mod/wp/common_stores"; ··· 8 7 import ConfigPage from "./config"; 9 8 import AboutPage from "./about"; 10 9 import Update from "./update"; 11 - import { MoonbaseSettingsStore } from "@moonlight-mod/wp/moonbase_stores"; 12 10 import RestartAdviceMessage from "./RestartAdvice"; 13 - 14 - const { Divider } = spacepack.findByCode(".forumOrHome]:")[0].exports.Z; 15 - const TitleBarClasses = spacepack.findByCode("iconWrapper:", "children:")[0].exports; 16 - const TabBarClasses = spacepack.findByCode("nowPlayingColumn:")[0].exports; 17 - const { setSection, clearSubsection } = spacepack.findByCode(':"USER_SETTINGS_MODAL_SET_SECTION"')[0].exports.Z; 18 - const Margins = spacepack.require("discord/styles/shared/Margins.css"); 11 + import { Divider } from "@moonlight-mod/wp/discord/components/common/BaseHeaderBar"; 12 + import HeaderBarClasses from "@moonlight-mod/wp/discord/components/common/HeaderBar.css"; 13 + import PeoplePageClasses from "@moonlight-mod/wp/discord/modules/people/web/PeoplePage.css"; 14 + import UserSettingsModalActionCreators from "@moonlight-mod/wp/discord/actions/UserSettingsModalActionCreators"; 15 + import Margins from "@moonlight-mod/wp/discord/styles/shared/Margins.css"; 19 16 20 17 export const pages: { 21 18 id: string; ··· 43 40 const subsection = useStateFromStores([UserSettingsModalStore], () => UserSettingsModalStore.getSubsection() ?? 0); 44 41 const setSubsection = React.useCallback( 45 42 (to: string) => { 46 - if (subsection !== to) setSection("moonbase", to); 43 + if (subsection !== to) UserSettingsModalActionCreators.setSection("moonbase", to); 47 44 }, 48 45 [subsection] 49 46 ); ··· 51 48 React.useEffect( 52 49 () => () => { 53 50 // Normally there's an onSettingsClose prop you can set but we don't expose it and I don't care enough to add support for it right now 54 - clearSubsection("moonbase"); 55 - MoonbaseSettingsStore.showOnlyUpdateable = false; 51 + UserSettingsModalActionCreators.clearSubsection("moonbase"); 56 52 }, 57 53 [] 58 54 ); 59 55 60 56 return ( 61 57 <> 62 - <div className={`${TitleBarClasses.children} ${Margins.marginBottom20}`}> 63 - <Text className={TitleBarClasses.titleWrapper} variant="heading-lg/semibold" tag="h2"> 58 + <div className={`${HeaderBarClasses.children} ${Margins.marginBottom20}`}> 59 + <Text className={HeaderBarClasses.titleWrapper} variant="heading-lg/semibold" tag="h2"> 64 60 Moonbase 65 61 </Text> 66 62 <Divider /> 67 - <TabBar selectedItem={subsection} onItemSelect={setSubsection} type="top-pill" className={TabBarClasses.tabBar}> 63 + <TabBar 64 + selectedItem={subsection} 65 + onItemSelect={setSubsection} 66 + type="top-pill" 67 + className={PeoplePageClasses.tabBar} 68 + > 68 69 {pages.map((page, i) => ( 69 - <TabBar.Item key={page.id} id={i} className={TabBarClasses.item}> 70 + <TabBar.Item key={page.id} id={i} className={PeoplePageClasses.item}> 70 71 {page.name} 71 72 </TabBar.Item> 72 73 ))}
+77 -15
packages/core-extensions/src/moonbase/webpackModules/ui/update.tsx
··· 1 1 import { useStateFromStores } from "@moonlight-mod/wp/discord/packages/flux"; 2 2 import { MoonbaseSettingsStore } from "@moonlight-mod/wp/moonbase_stores"; 3 - import * as Components from "@moonlight-mod/wp/discord/components/common/index"; 4 3 import React from "@moonlight-mod/wp/react"; 5 4 import { UpdateState } from "../../types"; 6 5 import HelpMessage from "./HelpMessage"; 7 - 8 - const { ThemeDarkIcon, Button } = Components; 9 - 10 - const logger = moonlight.getLogger("moonbase/ui/update"); 6 + import { MoonlightBranch } from "@moonlight-mod/types"; 7 + import MarkupUtils from "@moonlight-mod/wp/discord/modules/markup/MarkupUtils"; 8 + import Flex from "@moonlight-mod/wp/discord/uikit/Flex"; 9 + import { 10 + Button, 11 + Text, 12 + ModalRoot, 13 + ModalSize, 14 + ModalContent, 15 + ModalHeader, 16 + Heading, 17 + ModalCloseButton, 18 + openModal 19 + } from "@moonlight-mod/wp/discord/components/common/index"; 20 + import MarkupClasses from "@moonlight-mod/wp/discord/modules/messages/web/Markup.css"; 21 + import ThemeDarkIcon from "@moonlight-mod/wp/moonbase_ThemeDarkIcon"; 11 22 12 23 const strings: Record<UpdateState, string> = { 13 24 [UpdateState.Ready]: "A new version of moonlight is available.", ··· 16 27 [UpdateState.Failed]: "Failed to update moonlight. Please use the installer instead." 17 28 }; 18 29 30 + function MoonlightChangelog({ 31 + changelog, 32 + version, 33 + transitionState, 34 + onClose 35 + }: { 36 + changelog: string; 37 + version: string; 38 + transitionState: number | null; 39 + onClose: () => void; 40 + }) { 41 + return ( 42 + <ModalRoot transitionState={transitionState} size={ModalSize.DYNAMIC}> 43 + <ModalHeader> 44 + <Flex.Child grow={1} shrink={1}> 45 + <Heading variant="heading-lg/semibold">moonlight</Heading> 46 + <Text variant="text-xs/normal">{version}</Text> 47 + </Flex.Child> 48 + 49 + <Flex.Child grow={0}> 50 + <ModalCloseButton onClick={onClose} /> 51 + </Flex.Child> 52 + </ModalHeader> 53 + 54 + <ModalContent> 55 + <Text variant="text-md/normal" className={MarkupClasses.markup} style={{ padding: "1rem" }}> 56 + {MarkupUtils.parse(changelog, true, { 57 + allowHeading: true, 58 + allowList: true, 59 + allowLinks: true 60 + })} 61 + </Text> 62 + </ModalContent> 63 + </ModalRoot> 64 + ); 65 + } 66 + 19 67 export default function Update() { 20 - const [state, setState] = React.useState(UpdateState.Ready); 21 - const newVersion = useStateFromStores([MoonbaseSettingsStore], () => MoonbaseSettingsStore.newVersion); 68 + const [newVersion, state] = useStateFromStores([MoonbaseSettingsStore], () => [ 69 + MoonbaseSettingsStore.newVersion, 70 + MoonbaseSettingsStore.updateState 71 + ]); 22 72 23 73 if (newVersion == null) return null; 24 74 25 75 return ( 26 76 <HelpMessage text={strings[state]} className="moonbase-update-section" icon={ThemeDarkIcon}> 27 77 <div className="moonbase-help-message-buttons"> 78 + {moonlight.branch === MoonlightBranch.STABLE && ( 79 + <Button 80 + look={Button.Looks.OUTLINED} 81 + color={Button.Colors.CUSTOM} 82 + size={Button.Sizes.TINY} 83 + onClick={() => { 84 + fetch(`https://raw.githubusercontent.com/moonlight-mod/moonlight/refs/tags/${newVersion}/CHANGELOG.md`) 85 + .then((r) => r.text()) 86 + .then((changelog) => 87 + openModal((modalProps) => { 88 + return <MoonlightChangelog {...modalProps} changelog={changelog} version={newVersion} />; 89 + }) 90 + ); 91 + }} 92 + > 93 + View changelog 94 + </Button> 95 + )} 96 + 28 97 {state === UpdateState.Installed && ( 29 98 <Button 30 99 look={Button.Looks.OUTLINED} ··· 44 113 size={Button.Sizes.TINY} 45 114 disabled={state !== UpdateState.Ready} 46 115 onClick={() => { 47 - setState(UpdateState.Working); 48 - 49 - MoonbaseSettingsStore.updateMoonlight() 50 - .then(() => setState(UpdateState.Installed)) 51 - .catch((e) => { 52 - logger.error(e); 53 - setState(UpdateState.Failed); 54 - }); 116 + MoonbaseSettingsStore.updateMoonlight(); 55 117 }} 56 118 > 57 119 Update
+3 -6
packages/core-extensions/src/moonbase/webpackModules/updates.tsx
··· 3 3 import Notices from "@moonlight-mod/wp/notices_notices"; 4 4 import { MoonlightBranch } from "@moonlight-mod/types"; 5 5 import React from "@moonlight-mod/wp/react"; 6 - import * as Components from "@moonlight-mod/wp/discord/components/common/index"; 7 - 8 - const { ThemeDarkIcon } = Components; 6 + import ThemeDarkIcon from "@moonlight-mod/wp/moonbase_ThemeDarkIcon"; 9 7 10 8 function plural(str: string, num: number) { 11 9 return `${str}${num > 1 ? "s" : ""}`; ··· 59 57 { 60 58 name: "Open Moonbase", 61 59 onClick: () => { 62 - const { open } = spacepack.findByCode(':"USER_SETTINGS_MODAL_SET_SECTION"')[0].exports.Z; 60 + const { open } = spacepack.require("discord/actions/UserSettingsModalActionCreators").default; 63 61 if (MoonbaseSettingsStore.getExtensionConfigRaw<boolean>("moonbase", "sections", false)) { 64 62 open("moonbase-extensions"); 65 63 } else { 66 - MoonbaseSettingsStore.showOnlyUpdateable = true; 67 - open("moonbase", 0); 64 + open("moonbase", "0"); 68 65 } 69 66 return true; 70 67 }
+5
packages/core-extensions/src/moonbase/wp.d.ts
··· 5 5 declare module "@moonlight-mod/wp/moonbase_stores" { 6 6 export * from "core-extensions/src/moonbase/webpackModules/stores"; 7 7 } 8 + 9 + declare module "@moonlight-mod/wp/moonbase_ThemeDarkIcon" { 10 + import ThemeDarkIcon from "core-extensions/src/moonbase/webpackModules/ThemeDarkIcon"; 11 + export = ThemeDarkIcon; 12 + }
+141 -1
packages/core-extensions/src/nativeFixes/host.ts
··· 1 1 import { app, nativeTheme } from "electron"; 2 + import * as path from "node:path"; 3 + import * as fs from "node:fs/promises"; 4 + import * as fsSync from "node:fs"; 5 + import { parseTarGzip } from "nanotar"; 2 6 7 + const logger = moonlightHost.getLogger("nativeFixes/host"); 3 8 const enabledFeatures = app.commandLine.getSwitchValue("enable-features").split(","); 4 9 5 10 moonlightHost.events.on("window-created", function (browserWindow) { ··· 22 27 23 28 // already added on Windows, but not on other operating systems 24 29 app.commandLine.appendSwitch("disable-background-timer-throttling"); 30 + } 31 + 32 + if (moonlightHost.getConfigOption<boolean>("nativeFixes", "vulkan") ?? false) { 33 + enabledFeatures.push("Vulkan", "DefaultANGLEVulkan", "VulkanFromANGLE"); 25 34 } 26 35 27 36 if (process.platform === "linux") { ··· 32 41 if (moonlightHost.getConfigOption<boolean>("nativeFixes", "linuxSpeechDispatcher") ?? true) { 33 42 app.commandLine.appendSwitch("enable-speech-dispatcher"); 34 43 } 44 + 45 + if (moonlightHost.getConfigOption<boolean>("nativeFixes", "linuxHevcSupport") ?? true) { 46 + enabledFeatures.push("PlatformHEVCDecoderSupport"); 47 + } 35 48 } 36 49 37 50 // NOTE: Only tested if this appears on Windows, it should appear on all when 38 51 // hardware acceleration is disabled 39 52 const noAccel = app.commandLine.hasSwitch("disable-gpu-compositing"); 40 53 if ((moonlightHost.getConfigOption<boolean>("nativeFixes", "vaapi") ?? true) && !noAccel) { 41 - if (process.platform === "linux") 54 + if (process.platform === "linux") { 42 55 // These will eventually be renamed https://source.chromium.org/chromium/chromium/src/+/5482210941a94d70406b8da962426e4faca7fce4 43 56 enabledFeatures.push("VaapiVideoEncoder", "VaapiVideoDecoder", "VaapiVideoDecodeLinuxGL"); 57 + 58 + if (moonlightHost.getConfigOption<boolean>("nativeFixes", "vaapiIgnoreDriverChecks") ?? false) 59 + enabledFeatures.push("VaapiIgnoreDriverChecks"); 60 + } 44 61 } 45 62 46 63 app.commandLine.appendSwitch("enable-features", [...new Set(enabledFeatures)].join(",")); 64 + 65 + if (process.platform === "linux" && moonlightHost.getConfigOption<boolean>("nativeFixes", "linuxUpdater")) { 66 + const exePath = app.getPath("exe"); 67 + const appName = path.basename(exePath); 68 + const targetDir = path.dirname(exePath); 69 + const { releaseChannel }: { releaseChannel: string } = JSON.parse( 70 + fsSync.readFileSync(path.join(targetDir, "resources", "build_info.json"), "utf8") 71 + ); 72 + 73 + const updaterModule = require(path.join(moonlightHost.asarPath, "app_bootstrap", "hostUpdater.js")); 74 + const updater = updaterModule.constructor; 75 + 76 + async function doUpdate(cb: (percent: number) => void) { 77 + logger.debug("Extracting to", targetDir); 78 + 79 + const exists = (path: string) => 80 + fs 81 + .stat(path) 82 + .then(() => true) 83 + .catch(() => false); 84 + 85 + const url = `https://discord.com/api/download/${releaseChannel}?platform=linux&format=tar.gz`; 86 + const resp = await fetch(url, { 87 + cache: "no-store" 88 + }); 89 + 90 + const reader = resp.body!.getReader(); 91 + const contentLength = parseInt(resp.headers.get("Content-Length") ?? "0"); 92 + logger.info(`Expecting ${contentLength} bytes for the update`); 93 + const bytes = new Uint8Array(contentLength); 94 + let pos = 0; 95 + let lastPercent = 0; 96 + 97 + while (true) { 98 + const { done, value } = await reader.read(); 99 + if (done) { 100 + break; 101 + } else { 102 + bytes.set(value, pos); 103 + pos += value.length; 104 + 105 + const newPercent = Math.floor((pos / contentLength) * 100); 106 + if (lastPercent !== newPercent) { 107 + lastPercent = newPercent; 108 + cb(newPercent); 109 + } 110 + } 111 + } 112 + 113 + const files = await parseTarGzip(bytes); 114 + 115 + for (const file of files) { 116 + if (!file.data) continue; 117 + // @ts-expect-error What do you mean their own types are wrong 118 + if (file.type !== "file") continue; 119 + 120 + // Discord update files are inside of a main "Discord(PTB|Canary)" folder 121 + const filePath = file.name.replace(`${appName}/`, ""); 122 + logger.info("Extracting", filePath); 123 + 124 + let targetFilePath = path.join(targetDir, filePath); 125 + if (filePath === "resources/app.asar") { 126 + // You tried 127 + targetFilePath = path.join(targetDir, "resources", "_app.asar"); 128 + } else if (filePath === appName || filePath === "chrome_crashpad_handler") { 129 + // Can't write over the executable? Just move it! 4head 130 + if (await exists(targetFilePath)) { 131 + await fs.rename(targetFilePath, targetFilePath + ".bak"); 132 + await fs.unlink(targetFilePath + ".bak"); 133 + } 134 + } 135 + const targetFileDir = path.dirname(targetFilePath); 136 + 137 + if (!(await exists(targetFileDir))) await fs.mkdir(targetFileDir, { recursive: true }); 138 + await fs.writeFile(targetFilePath, file.data); 139 + 140 + const mode = file.attrs?.mode; 141 + if (mode != null) { 142 + // Not sure why this slice is needed 143 + await fs.chmod(targetFilePath, mode.slice(-3)); 144 + } 145 + } 146 + 147 + logger.debug("Done updating"); 148 + } 149 + 150 + const realEmit = updater.prototype.emit; 151 + updater.prototype.emit = function (event: string, ...args: any[]) { 152 + // Arrow functions don't bind `this` :D 153 + const call = (event: string, ...args: any[]) => realEmit.call(this, event, ...args); 154 + 155 + if (event === "update-manually") { 156 + const latestVerStr: string = args[0]; 157 + logger.debug("update-manually called, intercepting", latestVerStr); 158 + call("update-available"); 159 + 160 + (async () => { 161 + try { 162 + await doUpdate((progress) => { 163 + call("update-progress", progress); 164 + }); 165 + // Copied from the win32 updater 166 + this.updateVersion = latestVerStr; 167 + call( 168 + "update-downloaded", 169 + {}, 170 + releaseChannel, 171 + latestVerStr, 172 + new Date(), 173 + this.updateUrl, 174 + this.quitAndInstall.bind(this) 175 + ); 176 + } catch (e) { 177 + logger.error("Error updating", e); 178 + } 179 + })(); 180 + 181 + return this; 182 + } else { 183 + return realEmit.call(this, event, ...args); 184 + } 185 + }; 186 + }
+29 -1
packages/core-extensions/src/nativeFixes/manifest.json
··· 4 4 "meta": { 5 5 "name": "Native Fixes", 6 6 "tagline": "Various configurable fixes for Discord and Electron", 7 - "authors": ["Cynosphere", "adryd"], 7 + "authors": ["Cynosphere", "adryd", "NotNite"], 8 8 "tags": ["fixes"] 9 9 }, 10 10 "environment": "desktop", ··· 23 23 "type": "boolean", 24 24 "default": true 25 25 }, 26 + "vulkan": { 27 + "advice": "restart", 28 + "displayName": "Enable Vulkan renderer", 29 + "description": "Uses the Vulkan backend for rendering", 30 + "type": "boolean", 31 + "default": false 32 + }, 26 33 "linuxAutoscroll": { 27 34 "advice": "restart", 28 35 "displayName": "Enable middle click autoscroll on Linux", ··· 41 48 "advice": "restart", 42 49 "displayName": "Enable VAAPI features on Linux", 43 50 "description": "Provides hardware accelerated video encode and decode. Has no effect on other operating systems", 51 + "type": "boolean", 52 + "default": true 53 + }, 54 + "vaapiIgnoreDriverChecks": { 55 + "advice": "restart", 56 + "displayName": "Ignore VAAPI driver checks on Linux", 57 + "description": "Forces hardware video acceleration on some graphics drivers at the cost of stability. Has no effect on other operating systems", 58 + "type": "boolean", 59 + "default": false 60 + }, 61 + "linuxUpdater": { 62 + "advice": "restart", 63 + "displayName": "Linux Updater", 64 + "description": "Actually implements updating Discord on Linux. Has no effect on other operating systems", 65 + "type": "boolean", 66 + "default": false 67 + }, 68 + "linuxHevcSupport": { 69 + "advice": "restart", 70 + "displayName": "HEVC support on Linux", 71 + "description": "You might also need to enable Vulkan renderer. Has no effect on other operating systems", 44 72 "type": "boolean", 45 73 "default": true 46 74 }
+3 -3
packages/core-extensions/src/noHideToken/index.ts
··· 2 2 3 3 export const patches: Patch[] = [ 4 4 { 5 - find: "hideToken:function", 5 + find: "hideToken:()=>", 6 6 replace: { 7 - match: /(?<=hideToken:function\(\){)/, 8 - replacement: `return()=>{};` 7 + match: /hideToken:\(\)=>.+?,/, 8 + replacement: `hideToken:()=>{},` 9 9 } 10 10 } 11 11 ];
+3 -3
packages/core-extensions/src/noTrack/index.ts
··· 2 2 3 3 export const patches: Patch[] = [ 4 4 { 5 - find: "analyticsTrackingStoreMaker:function", 5 + find: "analyticsTrackingStoreMaker:()=>", 6 6 replace: { 7 - match: /analyticsTrackingStoreMaker:function\(\){return .+?}/, 8 - replacement: "analyticsTrackingStoreMaker:function(){return ()=>{}}" 7 + match: /analyticsTrackingStoreMaker:\(\)=>.+?,/, 8 + replacement: "analyticsTrackingStoreMaker:()=>()=>{}," 9 9 } 10 10 }, 11 11 {
+3 -1
packages/core-extensions/src/noTrack/manifest.json
··· 10 10 }, 11 11 "blocked": [ 12 12 "https://*.discord.com/api/v*/science", 13 - "https://*.discord.com/api/v*/metrics" 13 + "https://*.discord.com/api/v*/metrics", 14 + "https://*.discordapp.com/api/v*/science", 15 + "https://*.discordapp.com/api/v*/metrics" 14 16 ] 15 17 }
+3 -6
packages/core-extensions/src/notices/webpackModules/component.tsx
··· 1 1 import React from "@moonlight-mod/wp/react"; 2 2 import Dispatcher from "@moonlight-mod/wp/discord/Dispatcher"; 3 - import * as Components from "@moonlight-mod/wp/discord/components/common/index"; 3 + import { Notice, NoticeCloseButton, PrimaryCTANoticeButton } from "@moonlight-mod/wp/discord/components/common/index"; 4 4 import { useStateFromStoresObject } from "@moonlight-mod/wp/discord/packages/flux"; 5 5 import NoticesStore from "@moonlight-mod/wp/notices_notices"; 6 - import type { Notice } from "@moonlight-mod/types/coreExtensions/notices"; 6 + import type { Notice as NoticeType } from "@moonlight-mod/types/coreExtensions/notices"; 7 7 8 - // FIXME: types 9 - const { Notice, NoticeCloseButton, PrimaryCTANoticeButton } = Components; 10 - 11 - function popAndDismiss(notice: Notice) { 8 + function popAndDismiss(notice: NoticeType) { 12 9 NoticesStore.popNotice(); 13 10 if (notice?.onDismiss) { 14 11 notice.onDismiss();
+22 -2
packages/core-extensions/src/quietLoggers/index.ts
··· 3 3 const notXssDefensesOnly = () => 4 4 (moonlight.getConfigOption<boolean>("quietLoggers", "xssDefensesOnly") ?? false) === false; 5 5 6 + const silenceDiscordLogger = moonlight.getConfigOption<boolean>("quietLoggers", "silenceDiscordLogger") ?? false; 7 + 6 8 // These patches MUST run before the simple patches, these are to remove loggers 7 9 // that end up causing syntax errors by the normal patch 8 10 const loggerFixes: Patch[] = [ ··· 28 30 // Patches to simply remove a logger call 29 31 const stubPatches = [ 30 32 // "sh" is not a valid locale. 31 - ["is not a valid locale", /(.)\.error\(""\.concat\((.)," is not a valid locale\."\)\)/g], 33 + ["is not a valid locale", /void (.)\.error\(""\.concat\((.)," is not a valid locale\."\)\)/g], 32 34 ['"[BUILD INFO] Release Channel: "', /new .{1,2}\.Z\(\)\.log\("\[BUILD INFO\] Release Channel: ".+?\)\),/], 33 35 ['.APP_NATIVE_CRASH,"Storage"', /console\.log\("AppCrashedFatalReport lastCrash:",.,.\);/], 34 - ['.APP_NATIVE_CRASH,"Storage"', 'console.log("AppCrashedFatalReport: getLastCrash not supported.");'], 36 + ['.APP_NATIVE_CRASH,"Storage"', 'void console.log("AppCrashedFatalReport: getLastCrash not supported.")'], 35 37 ['"[NATIVE INFO] ', /new .{1,2}\.Z\(\)\.log\("\[NATIVE INFO] .+?\)\);/], 36 38 ['"Spellchecker"', /.\.info\("Switching to ".+?"\(unavailable\)"\);?/g], 37 39 ['throw Error("Messages are still loading.");', /console\.warn\("Unsupported Locale",.\),/], ··· 57 59 match: /\(null!=.{1,2}&&"0\.0\.0"===.{1,2}\.remoteApp\.getVersion\(\)\)/, 58 60 replacement: "(true)" 59 61 } 62 + }, 63 + // Highlight.js deprecation warnings 64 + { 65 + find: "Deprecated as of", 66 + replace: { 67 + match: /console\./g, 68 + replacement: "false&&console." 69 + }, 70 + prerequisite: notXssDefensesOnly 71 + }, 72 + // Discord's logger 73 + { 74 + find: "ฮฃ:", 75 + replace: { 76 + match: "for", 77 + replacement: "return;for" 78 + }, 79 + prerequisite: () => silenceDiscordLogger && notXssDefensesOnly() 60 80 }, 61 81 ...loggerFixes, 62 82 ...stubPatches.map((patch) => ({
+7
packages/core-extensions/src/quietLoggers/manifest.json
··· 15 15 "description": "Only disable self XSS prevention log", 16 16 "type": "boolean", 17 17 "default": false 18 + }, 19 + "silenceDiscordLogger": { 20 + "advice": "reload", 21 + "displayName": "Silence Discord logger", 22 + "description": "Hides all messages from Discord's logger (the logs that start with purple text in brackets)", 23 + "type": "boolean", 24 + "default": false 18 25 } 19 26 } 20 27 }
+2 -1
packages/core-extensions/src/rocketship/manifest.json
··· 7 7 "name": "Rocketship", 8 8 "tagline": "Adds new features when using rocketship", 9 9 "description": "**This extension only works on Linux when using rocketship:**\nhttps://github.com/moonlight-mod/rocketship\n\nAdds new features to the Discord Linux client with rocketship, such as a better screensharing experience.", 10 - "authors": ["NotNite", "Cynosphere", "adryd"] 10 + "authors": ["NotNite", "Cynosphere", "adryd"], 11 + "deprecated": true 11 12 } 12 13 }
+1 -1
packages/core-extensions/src/settings/index.ts
··· 12 12 { 13 13 find: 'navId:"user-settings-cog",', 14 14 replace: { 15 - match: /children:\[(.)\.map\(.+?\),children:.\((.)\)/, 15 + match: /children:\[(\i)\.map\(.+?\),.*?children:\i\((\i)\)/, 16 16 replacement: (orig, sections, section) => 17 17 `${orig.replace( 18 18 /Object\.values\(.\..+?\)/,
+8 -2
packages/core-extensions/src/settings/webpackModules/settings.ts
··· 1 1 import { SettingsSection, Settings as SettingsType } from "@moonlight-mod/types/coreExtensions/settings"; 2 + import UserSettingsModalActionCreators from "@moonlight-mod/wp/discord/actions/UserSettingsModalActionCreators"; 2 3 3 4 export const Settings: SettingsType = { 4 5 ourSections: [], 5 6 sectionNames: [], 6 7 sectionMenuItems: {}, 7 8 8 - addSection: (section, label, element, color = null, pos, notice) => { 9 + addSection: (section, label, element, color = null, pos, notice, onClick) => { 9 10 const data: SettingsSection = { 10 11 section, 11 12 label, 12 13 color, 13 14 element, 14 15 pos: pos ?? -4, 15 - notice: notice 16 + notice: notice, 17 + onClick: onClick ?? (() => UserSettingsModalActionCreators.open(section)) 16 18 }; 17 19 18 20 Settings.ourSections.push(data); ··· 43 45 44 46 _mutateSections: (sections) => { 45 47 for (const section of Settings.ourSections) { 48 + // Discord's `pos` only supports numbers, so lets call the function to get the position. 49 + if (typeof section.pos === "function") { 50 + section.pos = section.pos(sections); 51 + } 46 52 sections.splice(section.pos < 0 ? sections.length + section.pos : section.pos, 0, section); 47 53 } 48 54
+29 -10
packages/core-extensions/src/spacepack/webpackModules/spacepack.ts
··· 37 37 "module", 38 38 "exports", 39 39 "require", 40 - `(${funcStr}).apply(this, arguments)\n` + `//# sourceURL=Webpack-Module-${module}` 40 + `(${funcStr}).apply(this, arguments)\n` + `//# sourceURL=Webpack-Module/${module.slice(0, 3)}/${module}` 41 41 ) as WebpackModuleFunc; 42 42 }, 43 43 ··· 52 52 try { 53 53 exports = require(id); 54 54 } catch (e) { 55 - logger.error(`Error requiring module "${id}": `, e); 55 + logger.error(`findByCode: Error requiring module "${id}": `, args, e); 56 56 } 57 57 58 58 return { ··· 63 63 .filter((item) => item !== null); 64 64 65 65 if (ret.length === 0) { 66 - logger.warn("Got zero results for", args, new Error().stack!.substring(5)); 66 + logger.warn("findByCode: Got zero results for", args, new Error().stack!.substring(5)); 67 67 } 68 68 69 69 return ret; ··· 113 113 } 114 114 115 115 if (ret == null) { 116 - logger.warn("Failed to get object by key", key, "in", exports, new Error().stack!.substring(5)); 116 + logger.warn("Failed to find object by key", key, "in", exports, new Error().stack!.substring(5)); 117 117 } 118 118 119 119 return ret; ··· 138 138 } 139 139 140 140 if (ret == null) { 141 - logger.warn("Failed to get object by value", value, "in", exports, new Error().stack!.substring(5)); 141 + logger.warn("Failed to find object by value", value, "in", exports, new Error().stack!.substring(5)); 142 142 } 143 143 144 144 return ret; ··· 156 156 } 157 157 158 158 if (ret == null) { 159 - logger.warn("Failed to get object by key value pair", key, value, "in", exports, new Error().stack!.substring(5)); 159 + logger.warn( 160 + "Failed to find object by key value pair", 161 + key, 162 + value, 163 + "in", 164 + exports, 165 + new Error().stack!.substring(5) 166 + ); 160 167 } 161 168 162 169 return null; ··· 170 177 )?.[0]?.[1] ?? null; 171 178 172 179 if (ret == null) { 173 - logger.warn("Failed to get function by strings", strings, "in", exports, new Error().stack!.substring(5)); 180 + logger.warn("Failed to find function by strings", strings, "in", exports, new Error().stack!.substring(5)); 174 181 } 175 182 176 183 return ret; 177 184 }, 178 185 179 186 lazyLoad: (find: string | RegExp | (string | RegExp)[], chunk: RegExp, module: RegExp) => { 187 + chunk = processFind(chunk); 188 + module = processFind(module); 189 + 180 190 const mod = Array.isArray(find) ? spacepack.findByCode(...find) : spacepack.findByCode(find); 181 - if (mod.length < 1) return Promise.reject("Module find failed"); 191 + if (mod.length < 1) { 192 + logger.warn("lazyLoad: Module find failed", find, chunk, module, new Error().stack!.substring(5)); 193 + return Promise.reject("Module find failed"); 194 + } 182 195 183 196 const findId = mod[0].id; 184 197 const findCode = webpackRequire.m[findId].toString().replace(/\n/g, ""); ··· 191 204 if (match) chunkIds = [...match[0].matchAll(/"(\d+)"/g)].map(([, id]) => id); 192 205 } 193 206 194 - if (!chunkIds || chunkIds.length === 0) return Promise.reject("Chunk ID match failed"); 207 + if (!chunkIds || chunkIds.length === 0) { 208 + logger.warn("lazyLoad: Chunk ID match failed", find, chunk, module, new Error().stack!.substring(5)); 209 + return Promise.reject("Chunk ID match failed"); 210 + } 195 211 196 212 const moduleId = findCode.match(module)?.[1]; 197 - if (!moduleId) return Promise.reject("Module ID match failed"); 213 + if (!moduleId) { 214 + logger.warn("lazyLoad: Module ID match failed", find, chunk, module, new Error().stack!.substring(5)); 215 + return Promise.reject("Module ID match failed"); 216 + } 198 217 199 218 return Promise.all(chunkIds.map((c) => webpackRequire.e(c))).then(() => webpackRequire(moduleId)); 200 219 },
+4 -1
packages/core-extensions/tsconfig.json
··· 1 1 { 2 - "extends": "../../tsconfig.json" 2 + "extends": "../../tsconfig.json", 3 + "compilerOptions": { 4 + "lib": ["ESNext", "DOM", "DOM.Iterable"] 5 + } 3 6 }
+10 -3
packages/injector/package.json
··· 1 1 { 2 2 "name": "@moonlight-mod/injector", 3 3 "private": true, 4 + "engines": { 5 + "node": ">=22", 6 + "pnpm": ">=10", 7 + "npm": "pnpm", 8 + "yarn": "pnpm" 9 + }, 4 10 "dependencies": { 5 - "@moonlight-mod/types": "workspace:*", 6 - "@moonlight-mod/core": "workspace:*" 7 - } 11 + "@moonlight-mod/core": "workspace:*", 12 + "@moonlight-mod/types": "workspace:*" 13 + }, 14 + "engineStrict": true 8 15 }
+34 -14
packages/injector/src/index.ts
··· 76 76 blockedUrls = compiled; 77 77 }); 78 78 79 - function patchCsp(headers: Record<string, string[]>) { 80 - const directives = [ 81 - "script-src", 82 - "style-src", 83 - "connect-src", 84 - "img-src", 85 - "font-src", 86 - "media-src", 87 - "worker-src", 88 - "prefetch-src" 89 - ]; 79 + function patchCsp(headers: Record<string, string[]>, extensionCspOverrides: Record<string, string[]>) { 80 + const directives = ["script-src", "style-src", "connect-src", "img-src", "font-src", "media-src", "worker-src"]; 90 81 const values = ["*", "blob:", "data:", "'unsafe-inline'", "'unsafe-eval'", "disclip:"]; 91 82 92 83 const csp = "content-security-policy"; ··· 104 95 105 96 for (const directive of directives) { 106 97 parts[directive] = values; 98 + } 99 + 100 + for (const [directive, urls] of Object.entries(extensionCspOverrides)) { 101 + parts[directive] ??= []; 102 + parts[directive].push(...urls); 107 103 } 108 104 109 105 const stringified = Object.entries<string[]>(parts) ··· 131 127 // Event for when a window is created 132 128 moonlightHost.events.emit("window-created", this, isMainWindow); 133 129 130 + const extensionCspOverrides: Record<string, string[]> = {}; 131 + 132 + { 133 + const extCsps = moonlightHost.processedExtensions.extensions.map((x) => x.manifest.csp ?? {}); 134 + for (const csp of extCsps) { 135 + for (const [directive, urls] of Object.entries(csp)) { 136 + extensionCspOverrides[directive] ??= []; 137 + extensionCspOverrides[directive].push(...urls); 138 + } 139 + } 140 + } 141 + 134 142 this.webContents.session.webRequest.onHeadersReceived((details, cb) => { 135 143 if (details.responseHeaders != null) { 136 144 // Patch CSP so things can use externally hosted assets 137 145 if (details.resourceType === "mainFrame") { 138 - patchCsp(details.responseHeaders); 146 + patchCsp(details.responseHeaders, extensionCspOverrides); 139 147 } 140 148 141 149 // Allow plugins to bypass CORS for specific URLs 142 150 if (corsAllow.some((x) => details.url.startsWith(x))) { 143 - details.responseHeaders["access-control-allow-origin"] = ["*"]; 151 + if (!details.responseHeaders) details.responseHeaders = {}; 152 + 153 + // Work around HTTP header case sensitivity by reusing the header name if it exists 154 + // https://github.com/moonlight-mod/moonlight/issues/201 155 + const fallback = "access-control-allow-origin"; 156 + const key = Object.keys(details.responseHeaders).find((h) => h.toLowerCase() === fallback) ?? fallback; 157 + details.responseHeaders[key] = ["*"]; 144 158 } 159 + 160 + moonlightHost.events.emit("headers-received", details, isMainWindow); 145 161 146 162 cb({ cancel: false, responseHeaders: details.responseHeaders }); 147 163 } ··· 162 178 if (details.resourceType === "script" && isMainWindow) { 163 179 const url = new URL(details.url); 164 180 const hasUrl = scriptUrls.some((scriptUrl) => { 165 - return details.url.includes(scriptUrl) && !url.searchParams.has("inj") && url.host.endsWith("discord.com"); 181 + return ( 182 + details.url.includes(scriptUrl) && 183 + !url.searchParams.has("inj") && 184 + (url.host.endsWith("discord.com") || url.host.endsWith("discordapp.com")) 185 + ); 166 186 }); 167 187 if (hasUrl) blockedScripts.add(details.url); 168 188
+8 -1
packages/node-preload/package.json
··· 1 1 { 2 2 "name": "@moonlight-mod/node-preload", 3 3 "private": true, 4 + "engines": { 5 + "node": ">=22", 6 + "pnpm": ">=10", 7 + "npm": "pnpm", 8 + "yarn": "pnpm" 9 + }, 4 10 "dependencies": { 5 11 "@moonlight-mod/core": "workspace:*", 6 12 "@moonlight-mod/types": "workspace:*" 7 - } 13 + }, 14 + "engineStrict": true 8 15 }
+6 -2
packages/node-preload/src/index.ts
··· 11 11 import createFS from "@moonlight-mod/core/fs"; 12 12 import { registerCors, registerBlocked, getDynamicCors } from "@moonlight-mod/core/cors"; 13 13 import { getConfig, getConfigOption, getManifest, setConfigOption } from "@moonlight-mod/core/util/config"; 14 + import { NodeEventPayloads, NodeEventType } from "@moonlight-mod/types/core/event"; 15 + import { createEventEmitter } from "@moonlight-mod/core/util/event"; 14 16 15 17 let initialized = false; 16 18 let logger: Logger; ··· 51 53 processedExtensions, 52 54 nativesCache: {}, 53 55 isBrowser: false, 56 + events: createEventEmitter<NodeEventType, NodeEventPayloads>(), 54 57 55 58 version: MOONLIGHT_VERSION, 56 59 branch: MOONLIGHT_BRANCH as MoonlightBranch, ··· 62 65 const manifest = getManifest(extensions, ext); 63 66 return getConfigOption(ext, name, config, manifest?.settings); 64 67 }, 65 - setConfigOption(ext, name, value) { 68 + async setConfigOption(ext, name, value) { 66 69 setConfigOption(config, ext, name, value); 67 - this.writeConfig(config); 70 + await this.writeConfig(config); 68 71 }, 69 72 async writeConfig(newConfig) { 70 73 await writeConfig(newConfig); 71 74 config = newConfig; 75 + this.events.dispatchEvent(NodeEventType.ConfigSaved, newConfig); 72 76 }, 73 77 74 78 getNatives: (ext: string) => global.moonlightNode.nativesCache[ext],
+4 -1
packages/node-preload/tsconfig.json
··· 1 1 { 2 - "extends": "../../tsconfig.json" 2 + "extends": "../../tsconfig.json", 3 + "compilerOptions": { 4 + "lib": ["DOM", "ESNext", "DOM.Iterable"] 5 + } 3 6 }
+14 -7
packages/types/package.json
··· 1 1 { 2 2 "name": "@moonlight-mod/types", 3 - "version": "1.3.6", 4 - "main": "./src/index.ts", 5 - "types": "./src/index.ts", 3 + "version": "1.3.17", 6 4 "exports": { 7 5 ".": "./src/index.ts", 8 6 "./import": "./src/import.d.ts", 9 7 "./*": "./src/*.ts" 10 8 }, 9 + "main": "./src/index.ts", 10 + "types": "./src/index.ts", 11 + "engineStrict": false, 12 + "engines": { 13 + "node": ">=22", 14 + "pnpm": ">=10", 15 + "npm": "pnpm", 16 + "yarn": "pnpm" 17 + }, 11 18 "dependencies": { 12 - "@moonlight-mod/lunast": "^1.0.0", 13 - "@moonlight-mod/mappings": "^1.0.10", 14 - "@moonlight-mod/moonmap": "^1.0.3", 19 + "@moonlight-mod/lunast": "^1.0.1", 20 + "@moonlight-mod/mappings": "^1.1.25", 21 + "@moonlight-mod/moonmap": "^1.0.5", 15 22 "@types/react": "^18.3.10", 16 - "csstype": "^3.1.2", 23 + "csstype": "^3.1.3", 17 24 "standalone-electron-types": "^1.0.0" 18 25 } 19 26 }
+13 -4
packages/types/src/core/event.ts
··· 1 + import { Config } from "../config"; 1 2 import { WebpackModuleFunc, WebpackRequireType } from "../discord"; 2 3 3 4 export interface MoonlightEventEmitter<EventId extends string = string, EventData = Record<EventId, any>> { ··· 6 7 removeEventListener: <Id extends keyof EventData>(id: Id, cb: (data: EventData[Id]) => void) => void; 7 8 } 8 9 9 - export enum EventType { 10 + export enum WebEventType { 10 11 ChunkLoad = "chunkLoad", 11 12 ExtensionLoad = "extensionLoad" 12 13 } 13 14 14 - export type EventPayloads = { 15 - [EventType.ChunkLoad]: { 15 + export type WebEventPayloads = { 16 + [WebEventType.ChunkLoad]: { 16 17 chunkId?: number[]; 17 18 modules: { [id: string]: WebpackModuleFunc }; 18 19 require?: (require: WebpackRequireType) => any; 19 20 }; 20 - [EventType.ExtensionLoad]: string; 21 + [WebEventType.ExtensionLoad]: string; 22 + }; 23 + 24 + export enum NodeEventType { 25 + ConfigSaved = "configSaved" 26 + } 27 + 28 + export type NodeEventPayloads = { 29 + [NodeEventType.ConfigSaved]: Config; 21 30 };
+94 -16
packages/types/src/coreExtensions/commands.ts
··· 16 16 } 17 17 18 18 export enum OptionType { 19 - ATTACHMENT = 11, 19 + SUB_COMMAND = 1, 20 + SUB_COMMAND_GROUP = 2, 21 + STRING = 3, 22 + INTEGER = 4, 20 23 BOOLEAN = 5, 24 + USER = 6, 21 25 CHANNEL = 7, 22 - INTEGER = 4, 26 + ROLE = 8, 23 27 MENTIONABLE = 9, 24 28 NUMBER = 10, 25 - ROLE = 8, 26 - STRING = 3, 27 - SUB_COMMAND = 1, 28 - SUB_COMMAND_GROUP = 2, 29 - USER = 6 29 + ATTACHMENT = 11 30 + } 31 + 32 + export enum ChannelType { 33 + GUILD_TEXT = 0, 34 + DM = 1, 35 + GUILD_VOICE = 2, 36 + GROUP_DM = 3, 37 + GUILD_CATEGORY = 4, 38 + GUILD_ANNOUNCEMENT = 5, 39 + GUILD_STORE = 6, 40 + ANNOUNCEMENT_THREAD = 10, 41 + PUBLIC_THREAD = 11, 42 + PRIVATE_THREAD = 12, 43 + GUILD_STAGE_VOICE = 13, 44 + GUILD_DIRECTORY = 14, 45 + GUILD_FORUM = 15, 46 + GUILD_MEDIA = 16, 47 + LOBBY = 17, 48 + DM_SDK = 18 30 49 } 31 50 32 - export type RegisteredCommandOption = { 33 - name: string; 51 + export type RegisteredCommandOption = MoonlightCommandOption & { 34 52 displayName: string; 35 - type: OptionType; 36 - description: string; 37 53 displayDescription: string; 38 54 }; 39 55 40 - export type MoonlightCommandOption = { 56 + export type CommandOptionChoice<T> = { 57 + name: string; 58 + value: T; 59 + }; 60 + 61 + type CommandOptionBase<T> = { 62 + type: T; 41 63 name: string; 42 - type: OptionType; 43 64 description: string; 65 + required?: T extends OptionType.SUB_COMMAND 66 + ? never 67 + : T extends OptionType.SUB_COMMAND_GROUP 68 + ? never 69 + : boolean | undefined; 70 + choices?: T extends OptionType.STRING 71 + ? CommandOptionChoice<string>[] 72 + : T extends OptionType.INTEGER 73 + ? CommandOptionChoice<number>[] 74 + : T extends OptionType.NUMBER 75 + ? CommandOptionChoice<number>[] 76 + : never; 77 + options?: T extends OptionType.SUB_COMMAND 78 + ? MoonlightCommandOption[] 79 + : T extends OptionType.SUB_COMMAND_GROUP 80 + ? MoonlightCommandOption[] 81 + : never; 82 + channelTypes?: T extends OptionType.CHANNEL ? ChannelType[] : never; 83 + minValue?: T extends OptionType.INTEGER ? number : T extends OptionType.NUMBER ? number : never; 84 + maxValue?: T extends OptionType.INTEGER ? number : T extends OptionType.NUMBER ? number : never; 85 + minLength?: T extends OptionType.STRING ? number : never; 86 + maxLength?: T extends OptionType.STRING ? number : never; 44 87 }; 88 + 89 + // This is bad lol 90 + export type MoonlightCommandOption = 91 + | CommandOptionBase<OptionType.SUB_COMMAND> 92 + | CommandOptionBase<OptionType.SUB_COMMAND_GROUP> 93 + | CommandOptionBase<OptionType.STRING> 94 + | CommandOptionBase<OptionType.INTEGER> 95 + | CommandOptionBase<OptionType.BOOLEAN> 96 + | CommandOptionBase<OptionType.USER> 97 + | CommandOptionBase<OptionType.CHANNEL> 98 + | CommandOptionBase<OptionType.ROLE> 99 + | CommandOptionBase<OptionType.MENTIONABLE> 100 + | CommandOptionBase<OptionType.NUMBER> 101 + | CommandOptionBase<OptionType.ATTACHMENT>; 45 102 46 103 // TODO: types 47 104 export type CommandPredicateState = { ··· 58 115 applicationId: string; // set to -3! 59 116 untranslatedDescription: string; 60 117 displayDescription: string; 61 - options: RegisteredCommandOption[]; 118 + options?: RegisteredCommandOption[]; 62 119 predicate?: (state: CommandPredicateState) => boolean; 63 120 execute: (options: CommandOption[]) => void; 64 121 }; ··· 76 133 * You likely want BUILT_IN (or BUILT_IN_TEXT if usable with replies) 77 134 */ 78 135 inputType: InputType; 79 - options: MoonlightCommandOption[]; 136 + options?: MoonlightCommandOption[]; 80 137 predicate?: (state: CommandPredicateState) => boolean; 81 138 execute: (options: CommandOption[]) => void; 82 139 }; ··· 92 149 type: OptionType.STRING; 93 150 value: string; 94 151 } 152 + | { 153 + type: OptionType.NUMBER | OptionType.INTEGER; 154 + value: number; 155 + } 156 + | { 157 + type: OptionType.BOOLEAN; 158 + value: boolean; 159 + } 160 + | { 161 + type: OptionType.SUB_COMMAND | OptionType.SUB_COMMAND_GROUP; 162 + options: CommandOption[]; 163 + } 95 164 ); 165 + 166 + export type AnyScopeRegex = RegExp["exec"] & { 167 + regex: RegExp; 168 + }; 96 169 97 170 export type Commands = { 98 171 /** ··· 106 179 registerLegacyCommand: (id: string, command: LegacyCommand) => void; 107 180 108 181 /** 182 + * Creates a regular expression that legacy commands can understand 183 + */ 184 + anyScopeRegex: (regex: RegExp) => AnyScopeRegex; 185 + 186 + /** 109 187 * @private 110 188 */ 111 189 _getCommands: () => RegisteredCommand[]; ··· 121 199 }; 122 200 123 201 export type LegacyCommand = { 124 - match?: RegExp; 202 + match?: RegExp | { regex: RegExp } | AnyScopeRegex; 125 203 action: (content: string, context: LegacyContext) => LegacyReturn; 126 204 };
+33
packages/types/src/coreExtensions/common.ts
··· 1 + import type { IconProps, IconSize } from "@moonlight-mod/mappings/discord/components/common/index"; 2 + 3 + export type ErrorBoundaryProps = React.PropsWithChildren<{ 4 + noop?: boolean; 5 + fallback?: React.FC<any>; 6 + message?: string; 7 + }>; 8 + 9 + export type ErrorBoundaryState = { 10 + errored: boolean; 11 + error?: Error; 12 + componentStack?: string; 13 + }; 14 + 15 + export type ErrorBoundary = React.ComponentClass<ErrorBoundaryProps, ErrorBoundaryState>; 16 + 17 + export type ParsedIconProps = { 18 + width: number; 19 + height: number; 20 + fill: string; 21 + className: string; 22 + }; 23 + 24 + export interface Icons { 25 + /** 26 + * Parse icon props into their actual width/height. 27 + * @param props The icon props 28 + */ 29 + parseProps(props?: IconProps): ParsedIconProps; 30 + } 31 + 32 + // Re-export so extension developers don't need to depend on mappings 33 + export type { IconProps, IconSize };
+17
packages/types/src/coreExtensions/componentEditor.ts
··· 121 121 } 122 122 123 123 export type Messages = { 124 + /** 125 + * Adds a component to the username of a message 126 + */ 124 127 addToUsername: (id: string, component: React.FC<any>, anchor?: MessageUsernameAnchors, before?: boolean) => void; 128 + /** 129 + * Adds a component to the username badge area of a message (e.g. where role icons/new member badge is) 130 + */ 125 131 addUsernameBadge: ( 126 132 id: string, 127 133 component: React.FC<any>, 128 134 anchor?: MessageUsernameBadgeAnchors, 129 135 before?: boolean 130 136 ) => void; 137 + /** 138 + * Adds a component to the end of a message header (e.g. silent indicator) 139 + */ 131 140 addBadge: (id: string, component: React.FC<any>, anchor?: MessageBadgeAnchors, before?: boolean) => void; 132 141 /** 142 + * Adds a component to message accessories (e.g. embeds) 143 + */ 144 + addAccessory: (id: string, component: React.FC<any>) => void; 145 + /** 133 146 * @private 134 147 */ 135 148 _patchUsername: Patcher<any>; ··· 141 154 * @private 142 155 */ 143 156 _patchBadges: Patcher<any>; 157 + /** 158 + * @private 159 + */ 160 + _patchAccessories: Patcher<any>; 144 161 }; 145 162 //#endregion
+1 -1
packages/types/src/coreExtensions/notices.ts
··· 1 - import type { Store } from "@moonlight-mod/mappings/discord/packages/flux"; 1 + import type { Store } from "@moonlight-mod/mappings/discord/packages/flux/Store"; 2 2 3 3 export type NoticeButton = { 4 4 name: string;
+11 -8
packages/types/src/coreExtensions/settings.ts
··· 1 1 import React, { ReactElement } from "react"; 2 - import type { Store } from "@moonlight-mod/mappings/discord/packages/flux"; 2 + import type { Store } from "@moonlight-mod/mappings/discord/packages/flux/Store"; 3 3 4 4 export type NoticeProps = { 5 5 stores: Store<any>[]; ··· 7 7 }; 8 8 9 9 export type SettingsSection = 10 - | { section: "DIVIDER"; pos: number } 11 - | { section: "HEADER"; label: string; pos: number } 10 + | { section: "DIVIDER"; pos: number | ((sections: SettingsSection[]) => number) } 11 + | { section: "HEADER"; label: string; pos: number | ((sections: SettingsSection[]) => number) } 12 12 | { 13 13 section: string; 14 14 label: string; 15 15 color: string | null; 16 16 element: React.FunctionComponent; 17 - pos: number; 17 + pos: number | ((sections: SettingsSection[]) => number); 18 18 notice?: NoticeProps; 19 + onClick?: () => void; 19 20 _moonlight_submenu?: () => ReactElement | ReactElement[]; 20 21 }; 21 22 ··· 32 33 * @param color A color to use for the section 33 34 * @param pos The position in the settings menu to place the section 34 35 * @param notice A notice to display when in the section 36 + * @param onClick A custom action to execute when clicked from the context menu 35 37 */ 36 38 addSection: ( 37 39 section: string, 38 40 label: string, 39 41 element: React.FunctionComponent, 40 42 color?: string | null, 41 - pos?: number, 42 - notice?: NoticeProps 43 + pos?: number | ((sections: SettingsSection[]) => number), 44 + notice?: NoticeProps, 45 + onClick?: () => void 43 46 ) => void; 44 47 45 48 /** ··· 53 56 * Places a divider in the settings menu. 54 57 * @param pos The position in the settings menu to place the divider 55 58 */ 56 - addDivider: (pos: number | null) => void; 59 + addDivider: (pos: number | ((sections: SettingsSection[]) => number) | null) => void; 57 60 58 61 /** 59 62 * Places a header in the settings menu. 60 63 * @param pos The position in the settings menu to place the header 61 64 */ 62 - addHeader: (label: string, pos: number | null) => void; 65 + addHeader: (label: string, pos: number | ((sections: SettingsSection[]) => number) | null) => void; 63 66 64 67 /** 65 68 * @private
+1
packages/types/src/coreExtensions.ts
··· 7 7 export * as AppPanels from "./coreExtensions/appPanels"; 8 8 export * as Commands from "./coreExtensions/commands"; 9 9 export * as ComponentEditor from "./coreExtensions/componentEditor"; 10 + export * as Common from "./coreExtensions/common";
+4
packages/types/src/discord/require.ts
··· 1 1 import { AppPanels } from "../coreExtensions/appPanels"; 2 2 import { Commands } from "../coreExtensions/commands"; 3 + import { ErrorBoundary, Icons } from "../coreExtensions/common"; 3 4 import { DMList, MemberList, Messages } from "../coreExtensions/componentEditor"; 4 5 import { ContextMenu, EvilItemParser } from "../coreExtensions/contextMenu"; 5 6 import { Markdown } from "../coreExtensions/markdown"; ··· 13 14 declare function WebpackRequire(id: "appPanels_appPanels"): AppPanels; 14 15 15 16 declare function WebpackRequire(id: "commands_commands"): Commands; 17 + 18 + declare function WebpackRequire(id: "common_ErrorBoundary"): ErrorBoundary; 19 + declare function WebpackRequire(id: "common_icons"): Icons; 16 20 17 21 declare function WebpackRequire(id: "componentEditor_dmList"): DMList; 18 22 declare function WebpackRequire(id: "componentEditor_memberList"): MemberList;
+11
packages/types/src/extension.ts
··· 85 85 source?: string; 86 86 87 87 /** 88 + * A donation link (or other method of support). If you don't want financial contributions, consider putting your favorite charity here! 89 + */ 90 + donate?: string; 91 + 92 + /** 88 93 * A changelog to show in Moonbase. 89 94 * Moonbase will show the changelog for the latest version, even if it is not installed. 90 95 */ ··· 130 135 * @example https://moonlight-mod.github.io/ 131 136 */ 132 137 blocked?: string[]; 138 + 139 + /** 140 + * A mapping from CSP directives to URLs to allow. 141 + * @example { "script-src": ["https://example.com"] } 142 + */ 143 + csp?: Record<string, string[]>; 133 144 }; 134 145 135 146 export enum ExtensionEnvironment {
+11 -4
packages/types/src/globals.ts
··· 4 4 import type EventEmitter from "events"; 5 5 import type LunAST from "@moonlight-mod/lunast"; 6 6 import type Moonmap from "@moonlight-mod/moonmap"; 7 - import type { EventPayloads, EventType, MoonlightEventEmitter } from "./core/event"; 8 - import { MoonlightFS } from "./fs"; 7 + import type { 8 + WebEventPayloads, 9 + WebEventType, 10 + MoonlightEventEmitter, 11 + NodeEventType, 12 + NodeEventPayloads 13 + } from "./core/event"; 14 + import type { MoonlightFS } from "./fs"; 9 15 10 16 export type MoonlightHost = { 11 17 config: Config; ··· 34 40 processedExtensions: ProcessedExtensions; 35 41 nativesCache: Record<string, any>; 36 42 isBrowser: boolean; 43 + events: MoonlightEventEmitter<NodeEventType, NodeEventPayloads>; 37 44 38 45 version: string; 39 46 branch: MoonlightBranch; 40 47 41 48 getConfig: (ext: string) => ConfigExtension["config"]; 42 49 getConfigOption: <T>(ext: string, name: string) => T | undefined; 43 - setConfigOption: <T>(ext: string, name: string, value: T) => void; 50 + setConfigOption: <T>(ext: string, name: string, value: T) => Promise<void>; 44 51 writeConfig: (config: Config) => Promise<void>; 45 52 46 53 getNatives: (ext: string) => any | undefined; ··· 60 67 unpatched: Set<IdentifiedPatch>; 61 68 pendingModules: Set<IdentifiedWebpackModule>; 62 69 enabledExtensions: Set<string>; 63 - events: MoonlightEventEmitter<EventType, EventPayloads>; 70 + events: MoonlightEventEmitter<WebEventType, WebEventPayloads>; 64 71 patchingInternals: { 65 72 onModuleLoad: (moduleId: string | string[], callback: (moduleId: string) => void) => void; 66 73 registerPatch: (patch: IdentifiedPatch) => void;
+10
packages/types/src/import.d.ts
··· 10 10 export default commands; 11 11 } 12 12 13 + declare module "@moonlight-mod/wp/common_ErrorBoundary" { 14 + import { CoreExtensions } from "@moonlight-mod/types"; 15 + const ErrorBoundary: CoreExtensions.Common.ErrorBoundary; 16 + export = ErrorBoundary; 17 + } 18 + declare module "@moonlight-mod/wp/common_icons" { 19 + import { CoreExtensions } from "@moonlight-mod/types"; 20 + export const icons: CoreExtensions.Common.Icons; 21 + export default icons; 22 + } 13 23 declare module "@moonlight-mod/wp/common_stores"; 14 24 15 25 declare module "@moonlight-mod/wp/componentEditor_dmList" {
+1
packages/types/src/index.ts
··· 32 32 var moonlightNode: MoonlightNode; 33 33 var moonlightNodeSandboxed: MoonlightNodeSandboxed; 34 34 var moonlight: MoonlightWeb; 35 + var _moonlight_coreExtensionsStr: string; 35 36 36 37 var _moonlightBrowserInit: undefined | (() => Promise<void>); 37 38 var _moonlightWebLoad: undefined | (() => Promise<void>);
+841 -25
packages/types/src/mappings.d.ts
··· 1 1 // auto-generated 2 + declare module "@moonlight-mod/wp/chroma-js" {} 3 + 4 + declare module "@moonlight-mod/wp/classnames" { 5 + import { MappedModules } from "@moonlight-mod/mappings"; 6 + const _default: MappedModules["classnames"]["default"]; 7 + export default _default; 8 + } 9 + 10 + declare module "@moonlight-mod/wp/dependency-graph" { 11 + import { MappedModules } from "@moonlight-mod/mappings"; 12 + export const DepGraph: MappedModules["dependency-graph"]["DepGraph"]; 13 + } 14 + 15 + declare module "@moonlight-mod/wp/discord/Constants" { 16 + import { MappedModules } from "@moonlight-mod/mappings"; 17 + export const ActivityFlags: MappedModules["discord/Constants"]["ActivityFlags"]; 18 + export const ActivityTypes: MappedModules["discord/Constants"]["ActivityTypes"]; 19 + export const AnalyticsLocations: MappedModules["discord/Constants"]["AnalyticsLocations"]; 20 + export const ChannelLayouts: MappedModules["discord/Constants"]["ChannelLayouts"]; 21 + export const ChannelModes: MappedModules["discord/Constants"]["ChannelModes"]; 22 + export const ChannelTypes: MappedModules["discord/Constants"]["ChannelTypes"]; 23 + export const ChannelStreamTypes: MappedModules["discord/Constants"]["ChannelStreamTypes"]; 24 + export const ComponentActions: MappedModules["discord/Constants"]["ComponentActions"]; 25 + export const DEFAULT_ROLE_COLOR: MappedModules["discord/Constants"]["DEFAULT_ROLE_COLOR"]; 26 + export const Endpoints: MappedModules["discord/Constants"]["Endpoints"]; 27 + export const MessageFlags: MappedModules["discord/Constants"]["MessageFlags"]; 28 + export const MessageTypes: MappedModules["discord/Constants"]["MessageTypes"]; 29 + export const Permissions: MappedModules["discord/Constants"]["Permissions"]; 30 + export const PlatformTypes: MappedModules["discord/Constants"]["PlatformTypes"]; 31 + export const RelationshipTypes: MappedModules["discord/Constants"]["RelationshipTypes"]; 32 + export const Routes: MappedModules["discord/Constants"]["Routes"]; 33 + export const StatusTypes: MappedModules["discord/Constants"]["StatusTypes"]; 34 + export const Themes: MappedModules["discord/Constants"]["Themes"]; 35 + export const UserSettingsSections: MappedModules["discord/Constants"]["UserSettingsSections"]; 36 + export const UserFlags: MappedModules["discord/Constants"]["UserFlags"]; 37 + } 38 + 2 39 declare module "@moonlight-mod/wp/discord/Dispatcher" { 3 40 import { MappedModules } from "@moonlight-mod/mappings"; 4 - const _: MappedModules["discord/Dispatcher"]; 5 - export = _; 41 + const _default: MappedModules["discord/Dispatcher"]["default"]; 42 + export default _default; 6 43 } 7 44 8 45 declare module "@moonlight-mod/wp/discord/actions/ContextMenuActionCreators" { 9 46 import { MappedModules } from "@moonlight-mod/mappings"; 10 - const _: MappedModules["discord/actions/ContextMenuActionCreators"]; 11 - export = _; 47 + export const closeContextMenu: MappedModules["discord/actions/ContextMenuActionCreators"]["closeContextMenu"]; 48 + export const openContextMenu: MappedModules["discord/actions/ContextMenuActionCreators"]["openContextMenu"]; 49 + export const openContextMenuLazy: MappedModules["discord/actions/ContextMenuActionCreators"]["openContextMenuLazy"]; 50 + } 51 + 52 + declare module "@moonlight-mod/wp/discord/actions/UserSettingsModalActionCreators" { 53 + import { MappedModules } from "@moonlight-mod/mappings"; 54 + const _default: MappedModules["discord/actions/UserSettingsModalActionCreators"]["default"]; 55 + export default _default; 56 + } 57 + 58 + declare module "@moonlight-mod/wp/discord/common/AppStartPerformance" { 59 + import { MappedModules } from "@moonlight-mod/mappings"; 60 + const _default: MappedModules["discord/common/AppStartPerformance"]["default"]; 61 + export default _default; 62 + } 63 + 64 + declare module "@moonlight-mod/wp/discord/components/common/Alerts" { 65 + import { MappedModules } from "@moonlight-mod/mappings"; 66 + const _default: MappedModules["discord/components/common/Alerts"]["default"]; 67 + export default _default; 68 + } 69 + 70 + declare module "@moonlight-mod/wp/discord/components/common/BaseHeaderBar" { 71 + import { MappedModules } from "@moonlight-mod/mappings"; 72 + export const Icon: MappedModules["discord/components/common/BaseHeaderBar"]["Icon"]; 73 + export const Divider: MappedModules["discord/components/common/BaseHeaderBar"]["Divider"]; 74 + const _default: MappedModules["discord/components/common/BaseHeaderBar"]["default"]; 75 + export default _default; 76 + } 77 + 78 + declare module "@moonlight-mod/wp/discord/components/common/Card" { 79 + import { MappedModules } from "@moonlight-mod/mappings"; 80 + const _default: MappedModules["discord/components/common/Card"]["default"]; 81 + export default _default; 82 + export const Types: MappedModules["discord/components/common/Card"]["Types"]; 83 + } 84 + 85 + declare module "@moonlight-mod/wp/discord/components/common/FileUpload" { 86 + import { MappedModules } from "@moonlight-mod/mappings"; 87 + const _default: MappedModules["discord/components/common/FileUpload"]["default"]; 88 + export default _default; 89 + } 90 + 91 + declare module "@moonlight-mod/wp/discord/components/common/FormSwitch.css" { 92 + import { MappedModules } from "@moonlight-mod/mappings"; 93 + export const container: MappedModules["discord/components/common/FormSwitch.css"]["container"]; 94 + export const labelRow: MappedModules["discord/components/common/FormSwitch.css"]["labelRow"]; 95 + export const control: MappedModules["discord/components/common/FormSwitch.css"]["control"]; 96 + export const disabled: MappedModules["discord/components/common/FormSwitch.css"]["disabled"]; 97 + export const title: MappedModules["discord/components/common/FormSwitch.css"]["title"]; 98 + export const note: MappedModules["discord/components/common/FormSwitch.css"]["note"]; 99 + export const disabledText: MappedModules["discord/components/common/FormSwitch.css"]["disabledText"]; 100 + export const dividerDefault: MappedModules["discord/components/common/FormSwitch.css"]["dividerDefault"]; 101 + } 102 + 103 + declare module "@moonlight-mod/wp/discord/components/common/HeaderBar.css" { 104 + import { MappedModules } from "@moonlight-mod/mappings"; 105 + export const caret: MappedModules["discord/components/common/HeaderBar.css"]["caret"]; 106 + export const children: MappedModules["discord/components/common/HeaderBar.css"]["children"]; 107 + export const clickable: MappedModules["discord/components/common/HeaderBar.css"]["clickable"]; 108 + export const container: MappedModules["discord/components/common/HeaderBar.css"]["container"]; 109 + export const divider: MappedModules["discord/components/common/HeaderBar.css"]["divider"]; 110 + export const dot: MappedModules["discord/components/common/HeaderBar.css"]["dot"]; 111 + export const hamburger: MappedModules["discord/components/common/HeaderBar.css"]["hamburger"]; 112 + export const icon: MappedModules["discord/components/common/HeaderBar.css"]["icon"]; 113 + export const iconBadge: MappedModules["discord/components/common/HeaderBar.css"]["iconBadge"]; 114 + export const iconBadgeBottom: MappedModules["discord/components/common/HeaderBar.css"]["iconBadgeBottom"]; 115 + export const iconBadgeTop: MappedModules["discord/components/common/HeaderBar.css"]["iconBadgeTop"]; 116 + export const iconWrapper: MappedModules["discord/components/common/HeaderBar.css"]["iconWrapper"]; 117 + export const scrollable: MappedModules["discord/components/common/HeaderBar.css"]["scrollable"]; 118 + export const selected: MappedModules["discord/components/common/HeaderBar.css"]["selected"]; 119 + export const themed: MappedModules["discord/components/common/HeaderBar.css"]["themed"]; 120 + export const themedMobile: MappedModules["discord/components/common/HeaderBar.css"]["themedMobile"]; 121 + export const title: MappedModules["discord/components/common/HeaderBar.css"]["title"]; 122 + export const titleWrapper: MappedModules["discord/components/common/HeaderBar.css"]["titleWrapper"]; 123 + export const toolbar: MappedModules["discord/components/common/HeaderBar.css"]["toolbar"]; 124 + export const transparent: MappedModules["discord/components/common/HeaderBar.css"]["transparent"]; 125 + export const upperContainer: MappedModules["discord/components/common/HeaderBar.css"]["upperContainer"]; 126 + } 127 + 128 + declare module "@moonlight-mod/wp/discord/components/common/HelpMessage.css" { 129 + import { MappedModules } from "@moonlight-mod/mappings"; 130 + export const container: MappedModules["discord/components/common/HelpMessage.css"]["container"]; 131 + export const icon: MappedModules["discord/components/common/HelpMessage.css"]["icon"]; 132 + export const iconDiv: MappedModules["discord/components/common/HelpMessage.css"]["iconDiv"]; 133 + export const text: MappedModules["discord/components/common/HelpMessage.css"]["text"]; 134 + export const positive: MappedModules["discord/components/common/HelpMessage.css"]["positive"]; 135 + export const warning: MappedModules["discord/components/common/HelpMessage.css"]["warning"]; 136 + export const info: MappedModules["discord/components/common/HelpMessage.css"]["info"]; 137 + export const error: MappedModules["discord/components/common/HelpMessage.css"]["error"]; 138 + } 139 + 140 + declare module "@moonlight-mod/wp/discord/components/common/Image" {} 141 + 142 + declare module "@moonlight-mod/wp/discord/components/common/PanelButton" { 143 + import { MappedModules } from "@moonlight-mod/mappings"; 144 + const _default: MappedModules["discord/components/common/PanelButton"]["default"]; 145 + export default _default; 146 + } 147 + 148 + declare module "@moonlight-mod/wp/discord/components/common/Scroller.css" { 149 + import { MappedModules } from "@moonlight-mod/mappings"; 150 + export const auto: MappedModules["discord/components/common/Scroller.css"]["auto"]; 151 + export const content: MappedModules["discord/components/common/Scroller.css"]["content"]; 152 + export const customTheme: MappedModules["discord/components/common/Scroller.css"]["customTheme"]; 153 + export const disableScrollAnchor: MappedModules["discord/components/common/Scroller.css"]["disableScrollAnchor"]; 154 + export const fade: MappedModules["discord/components/common/Scroller.css"]["fade"]; 155 + export const managedReactiveScroller: MappedModules["discord/components/common/Scroller.css"]["managedReactiveScroller"]; 156 + export const none: MappedModules["discord/components/common/Scroller.css"]["none"]; 157 + export const pointerCover: MappedModules["discord/components/common/Scroller.css"]["pointerCover"]; 158 + export const scrolling: MappedModules["discord/components/common/Scroller.css"]["scrolling"]; 159 + export const thin: MappedModules["discord/components/common/Scroller.css"]["thin"]; 12 160 } 13 161 14 162 declare module "@moonlight-mod/wp/discord/components/common/index" { 15 163 import { MappedModules } from "@moonlight-mod/mappings"; 16 - const _: MappedModules["discord/components/common/index"]; 17 - export = _; 164 + export const Clickable: MappedModules["discord/components/common/index"]["Clickable"]; 165 + export const TextInput: MappedModules["discord/components/common/index"]["TextInput"]; 166 + export const TextArea: MappedModules["discord/components/common/index"]["TextArea"]; 167 + export const FormDivider: MappedModules["discord/components/common/index"]["FormDivider"]; 168 + export const FormSection: MappedModules["discord/components/common/index"]["FormSection"]; 169 + export const FormText: MappedModules["discord/components/common/index"]["FormText"]; 170 + export const FormTitle: MappedModules["discord/components/common/index"]["FormTitle"]; 171 + export const FormSwitch: MappedModules["discord/components/common/index"]["FormSwitch"]; 172 + export const FormItem: MappedModules["discord/components/common/index"]["FormItem"]; 173 + export const Slider: MappedModules["discord/components/common/index"]["Slider"]; 174 + export const Switch: MappedModules["discord/components/common/index"]["Switch"]; 175 + export const Button: MappedModules["discord/components/common/index"]["Button"]; 176 + export const Tooltip: MappedModules["discord/components/common/index"]["Tooltip"]; 177 + export const Avatar: MappedModules["discord/components/common/index"]["Avatar"]; 178 + export const AvatarSizes: MappedModules["discord/components/common/index"]["AvatarSizes"]; 179 + export const AvatarSizeSpecs: MappedModules["discord/components/common/index"]["AvatarSizeSpecs"]; 180 + export const Scroller: MappedModules["discord/components/common/index"]["Scroller"]; 181 + export const Text: MappedModules["discord/components/common/index"]["Text"]; 182 + export const Heading: MappedModules["discord/components/common/index"]["Heading"]; 183 + export const Card: MappedModules["discord/components/common/index"]["Card"]; 184 + export const Popout: MappedModules["discord/components/common/index"]["Popout"]; 185 + export const Dialog: MappedModules["discord/components/common/index"]["Dialog"]; 186 + export const Menu: MappedModules["discord/components/common/index"]["Menu"]; 187 + export const TabBar: MappedModules["discord/components/common/index"]["TabBar"]; 188 + export const SingleSelect: MappedModules["discord/components/common/index"]["SingleSelect"]; 189 + export const Select: MappedModules["discord/components/common/index"]["Select"]; 190 + export const NoticeColors: MappedModules["discord/components/common/index"]["NoticeColors"]; 191 + export const Notice: MappedModules["discord/components/common/index"]["Notice"]; 192 + export const NoticeCloseButton: MappedModules["discord/components/common/index"]["NoticeCloseButton"]; 193 + export const PrimaryCTANoticeButton: MappedModules["discord/components/common/index"]["PrimaryCTANoticeButton"]; 194 + export const Breadcrumbs: MappedModules["discord/components/common/index"]["Breadcrumbs"]; 195 + export const Image: MappedModules["discord/components/common/index"]["Image"]; 196 + export const tokens: MappedModules["discord/components/common/index"]["tokens"]; 197 + export const useVariableSelect: MappedModules["discord/components/common/index"]["useVariableSelect"]; 198 + export const useMultiSelect: MappedModules["discord/components/common/index"]["useMultiSelect"]; 199 + export const multiSelect: MappedModules["discord/components/common/index"]["multiSelect"]; 200 + export const openModal: MappedModules["discord/components/common/index"]["openModal"]; 201 + export const openModalLazy: MappedModules["discord/components/common/index"]["openModalLazy"]; 202 + export const closeModal: MappedModules["discord/components/common/index"]["closeModal"]; 203 + export const AngleBracketsIcon: MappedModules["discord/components/common/index"]["AngleBracketsIcon"]; 204 + export const ArrowAngleLeftUpIcon: MappedModules["discord/components/common/index"]["ArrowAngleLeftUpIcon"]; 205 + export const ArrowAngleRightUpIcon: MappedModules["discord/components/common/index"]["ArrowAngleRightUpIcon"]; 206 + export const ArrowsUpDownIcon: MappedModules["discord/components/common/index"]["ArrowsUpDownIcon"]; 207 + export const BookCheckIcon: MappedModules["discord/components/common/index"]["BookCheckIcon"]; 208 + export const ChannelListIcon: MappedModules["discord/components/common/index"]["ChannelListIcon"]; 209 + export const ChevronSmallDownIcon: MappedModules["discord/components/common/index"]["ChevronSmallDownIcon"]; 210 + export const ChevronSmallUpIcon: MappedModules["discord/components/common/index"]["ChevronSmallUpIcon"]; 211 + export const CircleInformationIcon: MappedModules["discord/components/common/index"]["CircleInformationIcon"]; 212 + export const CircleWarningIcon: MappedModules["discord/components/common/index"]["CircleWarningIcon"]; 213 + export const CircleXIcon: MappedModules["discord/components/common/index"]["CircleXIcon"]; 214 + export const ClydeIcon: MappedModules["discord/components/common/index"]["ClydeIcon"]; 215 + export const CopyIcon: MappedModules["discord/components/common/index"]["CopyIcon"]; 216 + export const DownloadIcon: MappedModules["discord/components/common/index"]["DownloadIcon"]; 217 + export const FullscreenEnterIcon: MappedModules["discord/components/common/index"]["FullscreenEnterIcon"]; 218 + export const GameControllerIcon: MappedModules["discord/components/common/index"]["GameControllerIcon"]; 219 + export const GlobeEarthIcon: MappedModules["discord/components/common/index"]["GlobeEarthIcon"]; 220 + export const HeartIcon: MappedModules["discord/components/common/index"]["HeartIcon"]; 221 + export const LinkIcon: MappedModules["discord/components/common/index"]["LinkIcon"]; 222 + export const MaximizeIcon: MappedModules["discord/components/common/index"]["MaximizeIcon"]; 223 + export const MinusIcon: MappedModules["discord/components/common/index"]["MinusIcon"]; 224 + export const MobilePhoneIcon: MappedModules["discord/components/common/index"]["MobilePhoneIcon"]; 225 + export const PauseIcon: MappedModules["discord/components/common/index"]["PauseIcon"]; 226 + export const PlayIcon: MappedModules["discord/components/common/index"]["PlayIcon"]; 227 + export const PlusLargeIcon: MappedModules["discord/components/common/index"]["PlusLargeIcon"]; 228 + export const RetryIcon: MappedModules["discord/components/common/index"]["RetryIcon"]; 229 + export const ScienceIcon: MappedModules["discord/components/common/index"]["ScienceIcon"]; 230 + export const ScreenIcon: MappedModules["discord/components/common/index"]["ScreenIcon"]; 231 + export const StarIcon: MappedModules["discord/components/common/index"]["StarIcon"]; 232 + export const TrashIcon: MappedModules["discord/components/common/index"]["TrashIcon"]; 233 + export const WarningIcon: MappedModules["discord/components/common/index"]["WarningIcon"]; 234 + export const WindowLaunchIcon: MappedModules["discord/components/common/index"]["WindowLaunchIcon"]; 235 + export const WindowTopOutlineIcon: MappedModules["discord/components/common/index"]["WindowTopOutlineIcon"]; 236 + export const XLargeIcon: MappedModules["discord/components/common/index"]["XLargeIcon"]; 237 + export const XSmallIcon: MappedModules["discord/components/common/index"]["XSmallIcon"]; 238 + export const ConfirmModal: MappedModules["discord/components/common/index"]["ConfirmModal"]; 239 + export const H: MappedModules["discord/components/common/index"]["H"]; 240 + export const HelpMessage: MappedModules["discord/components/common/index"]["HelpMessage"]; 241 + export const ModalCloseButton: MappedModules["discord/components/common/index"]["ModalCloseButton"]; 242 + export const ModalContent: MappedModules["discord/components/common/index"]["ModalContent"]; 243 + export const ModalFooter: MappedModules["discord/components/common/index"]["ModalFooter"]; 244 + export const ModalHeader: MappedModules["discord/components/common/index"]["ModalHeader"]; 245 + export const ModalRoot: MappedModules["discord/components/common/index"]["ModalRoot"]; 246 + export const NumberInputStepper: MappedModules["discord/components/common/index"]["NumberInputStepper"]; 247 + export const SearchableSelect: MappedModules["discord/components/common/index"]["SearchableSelect"]; 248 + export const createToast: MappedModules["discord/components/common/index"]["createToast"]; 249 + export const popToast: MappedModules["discord/components/common/index"]["popToast"]; 250 + export const showToast: MappedModules["discord/components/common/index"]["showToast"]; 251 + export const useThemeContext: MappedModules["discord/components/common/index"]["useThemeContext"]; 252 + export const AccessibilityAnnouncer: MappedModules["discord/components/common/index"]["AccessibilityAnnouncer"]; 253 + export const BackdropStyles: MappedModules["discord/components/common/index"]["BackdropStyles"]; 254 + export const BadgeShapes: MappedModules["discord/components/common/index"]["BadgeShapes"]; 255 + export const CardTypes: MappedModules["discord/components/common/index"]["CardTypes"]; 256 + export const CircleIconButtonColors: MappedModules["discord/components/common/index"]["CircleIconButtonColors"]; 257 + export const CircleIconButtonSizes: MappedModules["discord/components/common/index"]["CircleIconButtonSizes"]; 258 + export const FormErrorBlockColors: MappedModules["discord/components/common/index"]["FormErrorBlockColors"]; 259 + export const FormNoticeImagePositions: MappedModules["discord/components/common/index"]["FormNoticeImagePositions"]; 260 + export const FormTitleTags: MappedModules["discord/components/common/index"]["FormTitleTags"]; 261 + export const HelpMessageTypes: MappedModules["discord/components/common/index"]["HelpMessageTypes"]; 262 + export const ModalSize: MappedModules["discord/components/common/index"]["ModalSize"]; 263 + export const ModalTransitionState: MappedModules["discord/components/common/index"]["ModalTransitionState"]; 264 + export const PRETTY_KEYS: MappedModules["discord/components/common/index"]["PRETTY_KEYS"]; 265 + export const SelectLooks: MappedModules["discord/components/common/index"]["SelectLooks"]; 266 + export const SpinnerTypes: MappedModules["discord/components/common/index"]["SpinnerTypes"]; 267 + export const StatusTypes: MappedModules["discord/components/common/index"]["StatusTypes"]; 268 + export const ToastPosition: MappedModules["discord/components/common/index"]["ToastPosition"]; 269 + export const ToastType: MappedModules["discord/components/common/index"]["ToastType"]; 270 + export const TransitionStates: MappedModules["discord/components/common/index"]["TransitionStates"]; 271 + export const DEFAULT_MODAL_CONTEXT: MappedModules["discord/components/common/index"]["DEFAULT_MODAL_CONTEXT"]; 272 + export const LOW_SATURATION_THRESHOLD: MappedModules["discord/components/common/index"]["LOW_SATURATION_THRESHOLD"]; 273 + export const LayerClassName: MappedModules["discord/components/common/index"]["LayerClassName"]; 274 + export const POPOUT_MODAL_CONTEXT: MappedModules["discord/components/common/index"]["POPOUT_MODAL_CONTEXT"]; 18 275 } 19 276 20 - declare module "@moonlight-mod/wp/discord/modules/guild_settings/IntegrationCard.css" { 277 + declare module "@moonlight-mod/wp/discord/components/modals/ConfirmModal" { 21 278 import { MappedModules } from "@moonlight-mod/mappings"; 22 - const _: MappedModules["discord/modules/guild_settings/IntegrationCard.css"]; 23 - export = _; 279 + const _default: MappedModules["discord/components/modals/ConfirmModal"]["default"]; 280 + export default _default; 281 + } 282 + 283 + declare module "@moonlight-mod/wp/discord/lib/BaseRecord" { 284 + import { MappedModules } from "@moonlight-mod/mappings"; 285 + const _default: MappedModules["discord/lib/BaseRecord"]["default"]; 286 + export default _default; 287 + } 288 + 289 + declare module "@moonlight-mod/wp/discord/lib/web/Storage" { 290 + import { MappedModules } from "@moonlight-mod/mappings"; 291 + export const ObjectStorage: MappedModules["discord/lib/web/Storage"]["ObjectStorage"]; 292 + export const impl: MappedModules["discord/lib/web/Storage"]["impl"]; 293 + } 294 + 295 + declare module "@moonlight-mod/wp/discord/modules/build_overrides/web/BuildOverride.css" { 296 + import { MappedModules } from "@moonlight-mod/mappings"; 297 + export const wrapper: MappedModules["discord/modules/build_overrides/web/BuildOverride.css"]["wrapper"]; 298 + export const titleRegion: MappedModules["discord/modules/build_overrides/web/BuildOverride.css"]["titleRegion"]; 299 + export const title: MappedModules["discord/modules/build_overrides/web/BuildOverride.css"]["title"]; 300 + export const infoIcon: MappedModules["discord/modules/build_overrides/web/BuildOverride.css"]["infoIcon"]; 301 + export const copyLink: MappedModules["discord/modules/build_overrides/web/BuildOverride.css"]["copyLink"]; 302 + export const copied: MappedModules["discord/modules/build_overrides/web/BuildOverride.css"]["copied"]; 303 + export const copyLinkIcon: MappedModules["discord/modules/build_overrides/web/BuildOverride.css"]["copyLinkIcon"]; 304 + export const content: MappedModules["discord/modules/build_overrides/web/BuildOverride.css"]["content"]; 305 + export const infoLink: MappedModules["discord/modules/build_overrides/web/BuildOverride.css"]["infoLink"]; 306 + export const buildInfo: MappedModules["discord/modules/build_overrides/web/BuildOverride.css"]["buildInfo"]; 307 + export const button: MappedModules["discord/modules/build_overrides/web/BuildOverride.css"]["button"]; 308 + export const buttonSize: MappedModules["discord/modules/build_overrides/web/BuildOverride.css"]["buttonSize"]; 309 + export const subHead: MappedModules["discord/modules/build_overrides/web/BuildOverride.css"]["subHead"]; 310 + export const icon: MappedModules["discord/modules/build_overrides/web/BuildOverride.css"]["icon"]; 311 + export const buildDetails: MappedModules["discord/modules/build_overrides/web/BuildOverride.css"]["buildDetails"]; 312 + export const barLoader: MappedModules["discord/modules/build_overrides/web/BuildOverride.css"]["barLoader"]; 313 + export const barTitle: MappedModules["discord/modules/build_overrides/web/BuildOverride.css"]["barTitle"]; 314 + export const buttonLoader: MappedModules["discord/modules/build_overrides/web/BuildOverride.css"]["buttonLoader"]; 315 + export const disabledButtonOverride: MappedModules["discord/modules/build_overrides/web/BuildOverride.css"]["disabledButtonOverride"]; 316 + } 317 + 318 + declare module "@moonlight-mod/wp/discord/modules/discovery/web/Discovery.css" { 319 + import { MappedModules } from "@moonlight-mod/mappings"; 320 + export const header: MappedModules["discord/modules/discovery/web/Discovery.css"]["header"]; 321 + export const headerImage: MappedModules["discord/modules/discovery/web/Discovery.css"]["headerImage"]; 322 + export const headerImageSimple: MappedModules["discord/modules/discovery/web/Discovery.css"]["headerImageSimple"]; 323 + export const headerImageBG: MappedModules["discord/modules/discovery/web/Discovery.css"]["headerImageBG"]; 324 + export const searchTitle: MappedModules["discord/modules/discovery/web/Discovery.css"]["searchTitle"]; 325 + export const searchSubtitle: MappedModules["discord/modules/discovery/web/Discovery.css"]["searchSubtitle"]; 326 + export const headerContentWrapper: MappedModules["discord/modules/discovery/web/Discovery.css"]["headerContentWrapper"]; 327 + export const headerContent: MappedModules["discord/modules/discovery/web/Discovery.css"]["headerContent"]; 328 + export const headerContentSmall: MappedModules["discord/modules/discovery/web/Discovery.css"]["headerContentSmall"]; 329 + export const searchBox: MappedModules["discord/modules/discovery/web/Discovery.css"]["searchBox"]; 330 + export const searchBoxInput: MappedModules["discord/modules/discovery/web/Discovery.css"]["searchBoxInput"]; 331 + export const closeIcon: MappedModules["discord/modules/discovery/web/Discovery.css"]["closeIcon"]; 332 + export const searchIcon: MappedModules["discord/modules/discovery/web/Discovery.css"]["searchIcon"]; 333 + export const tabBar: MappedModules["discord/modules/discovery/web/Discovery.css"]["tabBar"]; 334 + export const tabBarItem: MappedModules["discord/modules/discovery/web/Discovery.css"]["tabBarItem"]; 335 + export const sectionHeader: MappedModules["discord/modules/discovery/web/Discovery.css"]["sectionHeader"]; 336 + } 337 + 338 + declare module "@moonlight-mod/wp/discord/modules/forums/web/Forums.css" { 339 + import { MappedModules } from "@moonlight-mod/mappings"; 340 + export const container: MappedModules["discord/modules/forums/web/Forums.css"]["container"]; 341 + export const uploadArea: MappedModules["discord/modules/forums/web/Forums.css"]["uploadArea"]; 342 + export const label: MappedModules["discord/modules/forums/web/Forums.css"]["label"]; 343 + export const content: MappedModules["discord/modules/forums/web/Forums.css"]["content"]; 344 + export const noListContainer: MappedModules["discord/modules/forums/web/Forums.css"]["noListContainer"]; 345 + export const list: MappedModules["discord/modules/forums/web/Forums.css"]["list"]; 346 + export const grid: MappedModules["discord/modules/forums/web/Forums.css"]["grid"]; 347 + export const headerRow: MappedModules["discord/modules/forums/web/Forums.css"]["headerRow"]; 348 + export const card: MappedModules["discord/modules/forums/web/Forums.css"]["card"]; 349 + export const columnsSpan: MappedModules["discord/modules/forums/web/Forums.css"]["columnsSpan"]; 350 + export const emptyStateRow: MappedModules["discord/modules/forums/web/Forums.css"]["emptyStateRow"]; 351 + export const newMemberBanner: MappedModules["discord/modules/forums/web/Forums.css"]["newMemberBanner"]; 352 + export const gridViewBanner: MappedModules["discord/modules/forums/web/Forums.css"]["gridViewBanner"]; 353 + export const placeholder: MappedModules["discord/modules/forums/web/Forums.css"]["placeholder"]; 354 + export const mainCard: MappedModules["discord/modules/forums/web/Forums.css"]["mainCard"]; 355 + export const emptyMainCard: MappedModules["discord/modules/forums/web/Forums.css"]["emptyMainCard"]; 356 + export const outOfDate: MappedModules["discord/modules/forums/web/Forums.css"]["outOfDate"]; 357 + export const header: MappedModules["discord/modules/forums/web/Forums.css"]["header"]; 358 + export const matchingPostsRow: MappedModules["discord/modules/forums/web/Forums.css"]["matchingPostsRow"]; 359 + export const headerWithMatchingPosts: MappedModules["discord/modules/forums/web/Forums.css"]["headerWithMatchingPosts"]; 360 + export const noForm: MappedModules["discord/modules/forums/web/Forums.css"]["noForm"]; 361 + export const sortContainer: MappedModules["discord/modules/forums/web/Forums.css"]["sortContainer"]; 362 + export const sort: MappedModules["discord/modules/forums/web/Forums.css"]["sort"]; 363 + export const sortPopout: MappedModules["discord/modules/forums/web/Forums.css"]["sortPopout"]; 364 + export const archivedDividerRow: MappedModules["discord/modules/forums/web/Forums.css"]["archivedDividerRow"]; 365 + export const archivedDivider: MappedModules["discord/modules/forums/web/Forums.css"]["archivedDivider"]; 366 + export const newPostsButton: MappedModules["discord/modules/forums/web/Forums.css"]["newPostsButton"]; 367 + export const loadingCard: MappedModules["discord/modules/forums/web/Forums.css"]["loadingCard"]; 368 + export const enterIcon: MappedModules["discord/modules/forums/web/Forums.css"]["enterIcon"]; 369 + export const warnIcon: MappedModules["discord/modules/forums/web/Forums.css"]["warnIcon"]; 370 + export const searchIcon: MappedModules["discord/modules/forums/web/Forums.css"]["searchIcon"]; 371 + export const missingReadHistoryPermission: MappedModules["discord/modules/forums/web/Forums.css"]["missingReadHistoryPermission"]; 372 + export const divider: MappedModules["discord/modules/forums/web/Forums.css"]["divider"]; 373 + export const tagsContainer: MappedModules["discord/modules/forums/web/Forums.css"]["tagsContainer"]; 374 + export const filterIcon: MappedModules["discord/modules/forums/web/Forums.css"]["filterIcon"]; 375 + export const tagList: MappedModules["discord/modules/forums/web/Forums.css"]["tagList"]; 376 + export const tagListInner: MappedModules["discord/modules/forums/web/Forums.css"]["tagListInner"]; 377 + export const tag: MappedModules["discord/modules/forums/web/Forums.css"]["tag"]; 378 + export const tagsButton: MappedModules["discord/modules/forums/web/Forums.css"]["tagsButton"]; 379 + export const tagsButtonInner: MappedModules["discord/modules/forums/web/Forums.css"]["tagsButtonInner"]; 380 + export const tagsButtonPlaceholder: MappedModules["discord/modules/forums/web/Forums.css"]["tagsButtonPlaceholder"]; 381 + export const tagsButtonWithCount: MappedModules["discord/modules/forums/web/Forums.css"]["tagsButtonWithCount"]; 382 + export const sortDropdown: MappedModules["discord/modules/forums/web/Forums.css"]["sortDropdown"]; 383 + export const sortDropdownInner: MappedModules["discord/modules/forums/web/Forums.css"]["sortDropdownInner"]; 384 + export const sortDropdownText: MappedModules["discord/modules/forums/web/Forums.css"]["sortDropdownText"]; 385 + export const clear: MappedModules["discord/modules/forums/web/Forums.css"]["clear"]; 386 + export const matchingPosts: MappedModules["discord/modules/forums/web/Forums.css"]["matchingPosts"]; 387 + export const startPostHelp: MappedModules["discord/modules/forums/web/Forums.css"]["startPostHelp"]; 388 + export const tagsSpacer: MappedModules["discord/modules/forums/web/Forums.css"]["tagsSpacer"]; 389 + export const keyboardShortcut: MappedModules["discord/modules/forums/web/Forums.css"]["keyboardShortcut"]; 390 + export const key: MappedModules["discord/modules/forums/web/Forums.css"]["key"]; 391 + export const countContainer: MappedModules["discord/modules/forums/web/Forums.css"]["countContainer"]; 392 + export const countText: MappedModules["discord/modules/forums/web/Forums.css"]["countText"]; 393 + export const optInNotice: MappedModules["discord/modules/forums/web/Forums.css"]["optInNotice"]; 394 + } 395 + 396 + declare module "@moonlight-mod/wp/discord/modules/forums/web/Header.css" { 397 + import { MappedModules } from "@moonlight-mod/mappings"; 398 + export const container: MappedModules["discord/modules/forums/web/Header.css"]["container"]; 399 + export const header: MappedModules["discord/modules/forums/web/Header.css"]["header"]; 400 + export const headerLeft: MappedModules["discord/modules/forums/web/Header.css"]["headerLeft"]; 401 + export const headerText: MappedModules["discord/modules/forums/web/Header.css"]["headerText"]; 402 + export const countContainer: MappedModules["discord/modules/forums/web/Header.css"]["countContainer"]; 403 + export const countText: MappedModules["discord/modules/forums/web/Header.css"]["countText"]; 404 + export const tagContainer: MappedModules["discord/modules/forums/web/Header.css"]["tagContainer"]; 405 + export const tag: MappedModules["discord/modules/forums/web/Header.css"]["tag"]; 406 + export const clear: MappedModules["discord/modules/forums/web/Header.css"]["clear"]; 407 + export const row: MappedModules["discord/modules/forums/web/Header.css"]["row"]; 408 + export const separator: MappedModules["discord/modules/forums/web/Header.css"]["separator"]; 409 + } 410 + 411 + declare module "@moonlight-mod/wp/discord/modules/forums/web/SortMenu.css" { 412 + import { MappedModules } from "@moonlight-mod/mappings"; 413 + export const container: MappedModules["discord/modules/forums/web/SortMenu.css"]["container"]; 414 + export const clearText: MappedModules["discord/modules/forums/web/SortMenu.css"]["clearText"]; 415 + } 416 + 417 + declare module "@moonlight-mod/wp/discord/modules/forums/web/Tag" { 418 + import { MappedModules } from "@moonlight-mod/mappings"; 419 + const _default: MappedModules["discord/modules/forums/web/Tag"]["default"]; 420 + export default _default; 421 + export const TagBar: MappedModules["discord/modules/forums/web/Tag"]["TagBar"]; 422 + } 423 + 424 + declare module "@moonlight-mod/wp/discord/modules/guild_settings/roles/web/GuildSettingsRoleEdit.css" { 425 + import { MappedModules } from "@moonlight-mod/mappings"; 426 + export const addButton: MappedModules["discord/modules/guild_settings/roles/web/GuildSettingsRoleEdit.css"]["addButton"]; 427 + export const container: MappedModules["discord/modules/guild_settings/roles/web/GuildSettingsRoleEdit.css"]["container"]; 428 + export const emptyRowContainer: MappedModules["discord/modules/guild_settings/roles/web/GuildSettingsRoleEdit.css"]["emptyRowContainer"]; 429 + export const emptyRowText: MappedModules["discord/modules/guild_settings/roles/web/GuildSettingsRoleEdit.css"]["emptyRowText"]; 430 + export const headerContainer: MappedModules["discord/modules/guild_settings/roles/web/GuildSettingsRoleEdit.css"]["headerContainer"]; 431 + export const list: MappedModules["discord/modules/guild_settings/roles/web/GuildSettingsRoleEdit.css"]["list"]; 432 + export const memberDetails: MappedModules["discord/modules/guild_settings/roles/web/GuildSettingsRoleEdit.css"]["memberDetails"]; 433 + export const memberRow: MappedModules["discord/modules/guild_settings/roles/web/GuildSettingsRoleEdit.css"]["memberRow"]; 434 + export const removeButton: MappedModules["discord/modules/guild_settings/roles/web/GuildSettingsRoleEdit.css"]["removeButton"]; 435 + export const removeButtonContainer: MappedModules["discord/modules/guild_settings/roles/web/GuildSettingsRoleEdit.css"]["removeButtonContainer"]; 436 + export const removeButtonDisabled: MappedModules["discord/modules/guild_settings/roles/web/GuildSettingsRoleEdit.css"]["removeButtonDisabled"]; 437 + export const removeTip: MappedModules["discord/modules/guild_settings/roles/web/GuildSettingsRoleEdit.css"]["removeTip"]; 438 + export const searchContainer: MappedModules["discord/modules/guild_settings/roles/web/GuildSettingsRoleEdit.css"]["searchContainer"]; 439 + export const searchWarning: MappedModules["discord/modules/guild_settings/roles/web/GuildSettingsRoleEdit.css"]["searchWarning"]; 440 + } 441 + 442 + declare module "@moonlight-mod/wp/discord/modules/guild_settings/web/AppCard.css" { 443 + import { MappedModules } from "@moonlight-mod/mappings"; 444 + export const card: MappedModules["discord/modules/guild_settings/web/AppCard.css"]["card"]; 445 + export const inModal: MappedModules["discord/modules/guild_settings/web/AppCard.css"]["inModal"]; 446 + export const cardHeader: MappedModules["discord/modules/guild_settings/web/AppCard.css"]["cardHeader"]; 447 + export const title: MappedModules["discord/modules/guild_settings/web/AppCard.css"]["title"]; 448 + } 449 + 450 + declare module "@moonlight-mod/wp/discord/modules/guild_settings/web/AppCardItem.css" { 451 + import { MappedModules } from "@moonlight-mod/mappings"; 452 + export const icon: MappedModules["discord/modules/guild_settings/web/AppCardItem.css"]["icon"]; 453 + export const identifier: MappedModules["discord/modules/guild_settings/web/AppCardItem.css"]["identifier"]; 454 + export const item: MappedModules["discord/modules/guild_settings/web/AppCardItem.css"]["item"]; 455 + export const statusContainer: MappedModules["discord/modules/guild_settings/web/AppCardItem.css"]["statusContainer"]; 456 + export const statusLine: MappedModules["discord/modules/guild_settings/web/AppCardItem.css"]["statusLine"]; 457 + export const statusIcon: MappedModules["discord/modules/guild_settings/web/AppCardItem.css"]["statusIcon"]; 458 + } 459 + 460 + declare module "@moonlight-mod/wp/discord/modules/guild_settings/web/SearchSection.css" { 461 + import { MappedModules } from "@moonlight-mod/mappings"; 462 + export const container: MappedModules["discord/modules/guild_settings/web/SearchSection.css"]["container"]; 463 + export const headerContainer: MappedModules["discord/modules/guild_settings/web/SearchSection.css"]["headerContainer"]; 464 + export const searchContainer: MappedModules["discord/modules/guild_settings/web/SearchSection.css"]["searchContainer"]; 465 + export const searchWarning: MappedModules["discord/modules/guild_settings/web/SearchSection.css"]["searchWarning"]; 466 + export const addButton: MappedModules["discord/modules/guild_settings/web/SearchSection.css"]["addButton"]; 467 + export const memberRow: MappedModules["discord/modules/guild_settings/web/SearchSection.css"]["memberRow"]; 468 + export const emptyRowContainer: MappedModules["discord/modules/guild_settings/web/SearchSection.css"]["emptyRowContainer"]; 469 + export const emptyRowText: MappedModules["discord/modules/guild_settings/web/SearchSection.css"]["emptyRowText"]; 470 + export const memberDetails: MappedModules["discord/modules/guild_settings/web/SearchSection.css"]["memberDetails"]; 471 + export const list: MappedModules["discord/modules/guild_settings/web/SearchSection.css"]["list"]; 472 + export const removeButtonContainer: MappedModules["discord/modules/guild_settings/web/SearchSection.css"]["removeButtonContainer"]; 473 + export const removeButton: MappedModules["discord/modules/guild_settings/web/SearchSection.css"]["removeButton"]; 474 + export const removeButtonDisabled: MappedModules["discord/modules/guild_settings/web/SearchSection.css"]["removeButtonDisabled"]; 475 + export const removeTip: MappedModules["discord/modules/guild_settings/web/SearchSection.css"]["removeTip"]; 476 + } 477 + 478 + declare module "@moonlight-mod/wp/discord/modules/guild_sidebar/web/CategoryChannel.css" { 479 + import { MappedModules } from "@moonlight-mod/mappings"; 480 + export const containerDefault: MappedModules["discord/modules/guild_sidebar/web/CategoryChannel.css"]["containerDefault"]; 481 + export const containerDragBefore: MappedModules["discord/modules/guild_sidebar/web/CategoryChannel.css"]["containerDragBefore"]; 482 + export const containerDragAfter: MappedModules["discord/modules/guild_sidebar/web/CategoryChannel.css"]["containerDragAfter"]; 483 + export const addButton: MappedModules["discord/modules/guild_sidebar/web/CategoryChannel.css"]["addButton"]; 484 + export const forceVisible: MappedModules["discord/modules/guild_sidebar/web/CategoryChannel.css"]["forceVisible"]; 485 + export const iconVisibility: MappedModules["discord/modules/guild_sidebar/web/CategoryChannel.css"]["iconVisibility"]; 486 + export const addButtonIcon: MappedModules["discord/modules/guild_sidebar/web/CategoryChannel.css"]["addButtonIcon"]; 487 + export const wrapper: MappedModules["discord/modules/guild_sidebar/web/CategoryChannel.css"]["wrapper"]; 488 + export const wrapperStatic: MappedModules["discord/modules/guild_sidebar/web/CategoryChannel.css"]["wrapperStatic"]; 489 + export const clickable: MappedModules["discord/modules/guild_sidebar/web/CategoryChannel.css"]["clickable"]; 490 + export const children: MappedModules["discord/modules/guild_sidebar/web/CategoryChannel.css"]["children"]; 491 + export const mainContent: MappedModules["discord/modules/guild_sidebar/web/CategoryChannel.css"]["mainContent"]; 492 + export const icon: MappedModules["discord/modules/guild_sidebar/web/CategoryChannel.css"]["icon"]; 493 + export const collapsed: MappedModules["discord/modules/guild_sidebar/web/CategoryChannel.css"]["collapsed"]; 494 + export const muted: MappedModules["discord/modules/guild_sidebar/web/CategoryChannel.css"]["muted"]; 495 + export const name: MappedModules["discord/modules/guild_sidebar/web/CategoryChannel.css"]["name"]; 496 + export const dismissWrapper: MappedModules["discord/modules/guild_sidebar/web/CategoryChannel.css"]["dismissWrapper"]; 497 + export const dismissButton: MappedModules["discord/modules/guild_sidebar/web/CategoryChannel.css"]["dismissButton"]; 498 + export const dismiss: MappedModules["discord/modules/guild_sidebar/web/CategoryChannel.css"]["dismiss"]; 499 + export const voiceChannelsButton: MappedModules["discord/modules/guild_sidebar/web/CategoryChannel.css"]["voiceChannelsButton"]; 500 + export const voiceChannelsToggleIcon: MappedModules["discord/modules/guild_sidebar/web/CategoryChannel.css"]["voiceChannelsToggleIcon"]; 501 + export const refreshVoiceChannelsButton: MappedModules["discord/modules/guild_sidebar/web/CategoryChannel.css"]["refreshVoiceChannelsButton"]; 502 + export const refreshVoiceChannelsButtonInner: MappedModules["discord/modules/guild_sidebar/web/CategoryChannel.css"]["refreshVoiceChannelsButtonInner"]; 24 503 } 25 504 26 505 declare module "@moonlight-mod/wp/discord/modules/markup/MarkupUtils" { 27 506 import { MappedModules } from "@moonlight-mod/mappings"; 28 - const _: MappedModules["discord/modules/markup/MarkupUtils"]; 29 - export = _; 507 + const _default: MappedModules["discord/modules/markup/MarkupUtils"]["default"]; 508 + export default _default; 509 + } 510 + 511 + declare module "@moonlight-mod/wp/discord/modules/menus/web/Menu" { 512 + import { MappedModules } from "@moonlight-mod/mappings"; 513 + export const MenuSpinner: MappedModules["discord/modules/menus/web/Menu"]["MenuSpinner"]; 514 + export const Menu: MappedModules["discord/modules/menus/web/Menu"]["Menu"]; 515 + } 516 + 517 + declare module "@moonlight-mod/wp/discord/modules/messages/web/Markup.css" { 518 + import { MappedModules } from "@moonlight-mod/mappings"; 519 + export const markup: MappedModules["discord/modules/messages/web/Markup.css"]["markup"]; 520 + export const inlineFormat: MappedModules["discord/modules/messages/web/Markup.css"]["inlineFormat"]; 521 + export const codeContainer: MappedModules["discord/modules/messages/web/Markup.css"]["codeContainer"]; 522 + export const codeActions: MappedModules["discord/modules/messages/web/Markup.css"]["codeActions"]; 523 + export const blockquoteContainer: MappedModules["discord/modules/messages/web/Markup.css"]["blockquoteContainer"]; 524 + export const blockquoteDivider: MappedModules["discord/modules/messages/web/Markup.css"]["blockquoteDivider"]; 525 + export const slateBlockquoteContainer: MappedModules["discord/modules/messages/web/Markup.css"]["slateBlockquoteContainer"]; 526 + export const roleMention: MappedModules["discord/modules/messages/web/Markup.css"]["roleMention"]; 527 + export const rolePopout: MappedModules["discord/modules/messages/web/Markup.css"]["rolePopout"]; 528 + export const roleHeader: MappedModules["discord/modules/messages/web/Markup.css"]["roleHeader"]; 529 + export const roleScroller: MappedModules["discord/modules/messages/web/Markup.css"]["roleScroller"]; 530 + export const timestamp: MappedModules["discord/modules/messages/web/Markup.css"]["timestamp"]; 531 + export const timestampTooltip: MappedModules["discord/modules/messages/web/Markup.css"]["timestampTooltip"]; 532 + } 533 + 534 + declare module "@moonlight-mod/wp/discord/modules/messages/web/Message.css" { 535 + import { MappedModules } from "@moonlight-mod/mappings"; 536 + export const wrapper: MappedModules["discord/modules/messages/web/Message.css"]["wrapper"]; 537 + export const compact: MappedModules["discord/modules/messages/web/Message.css"]["compact"]; 538 + export const cozy: MappedModules["discord/modules/messages/web/Message.css"]["cozy"]; 539 + export const contentOnly: MappedModules["discord/modules/messages/web/Message.css"]["contentOnly"]; 540 + export const repliedMessage: MappedModules["discord/modules/messages/web/Message.css"]["repliedMessage"]; 541 + export const threadMessageAccessory: MappedModules["discord/modules/messages/web/Message.css"]["threadMessageAccessory"]; 542 + export const executedCommand: MappedModules["discord/modules/messages/web/Message.css"]["executedCommand"]; 543 + export const latin12CompactTimeStamp: MappedModules["discord/modules/messages/web/Message.css"]["latin12CompactTimeStamp"]; 544 + export const latin24CompactTimeStamp: MappedModules["discord/modules/messages/web/Message.css"]["latin24CompactTimeStamp"]; 545 + export const asianCompactTimeStamp: MappedModules["discord/modules/messages/web/Message.css"]["asianCompactTimeStamp"]; 546 + export const contextCommandMessage: MappedModules["discord/modules/messages/web/Message.css"]["contextCommandMessage"]; 547 + export const messageSpine: MappedModules["discord/modules/messages/web/Message.css"]["messageSpine"]; 548 + export const repliedMessageClickableSpine: MappedModules["discord/modules/messages/web/Message.css"]["repliedMessageClickableSpine"]; 549 + export const repliedMessageContentHovered: MappedModules["discord/modules/messages/web/Message.css"]["repliedMessageContentHovered"]; 550 + export const threadMessageAccessoryAvatar: MappedModules["discord/modules/messages/web/Message.css"]["threadMessageAccessoryAvatar"]; 551 + export const replyAvatar: MappedModules["discord/modules/messages/web/Message.css"]["replyAvatar"]; 552 + export const replyBadge: MappedModules["discord/modules/messages/web/Message.css"]["replyBadge"]; 553 + export const executedCommandAvatar: MappedModules["discord/modules/messages/web/Message.css"]["executedCommandAvatar"]; 554 + export const replyChatIconContainer: MappedModules["discord/modules/messages/web/Message.css"]["replyChatIconContainer"]; 555 + export const replyIcon: MappedModules["discord/modules/messages/web/Message.css"]["replyIcon"]; 556 + export const clanTagChiplet: MappedModules["discord/modules/messages/web/Message.css"]["clanTagChiplet"]; 557 + export const userJoinSystemMessageIcon: MappedModules["discord/modules/messages/web/Message.css"]["userJoinSystemMessageIcon"]; 558 + export const ticketIcon: MappedModules["discord/modules/messages/web/Message.css"]["ticketIcon"]; 559 + export const commandIcon: MappedModules["discord/modules/messages/web/Message.css"]["commandIcon"]; 560 + export const username: MappedModules["discord/modules/messages/web/Message.css"]["username"]; 561 + export const roleDot: MappedModules["discord/modules/messages/web/Message.css"]["roleDot"]; 562 + export const commandName: MappedModules["discord/modules/messages/web/Message.css"]["commandName"]; 563 + export const appsIcon: MappedModules["discord/modules/messages/web/Message.css"]["appsIcon"]; 564 + export const appLauncherOnboardingCommandName: MappedModules["discord/modules/messages/web/Message.css"]["appLauncherOnboardingCommandName"]; 565 + export const targetUsername: MappedModules["discord/modules/messages/web/Message.css"]["targetUsername"]; 566 + export const executedCommandSeparator: MappedModules["discord/modules/messages/web/Message.css"]["executedCommandSeparator"]; 567 + export const repliedTextPreview: MappedModules["discord/modules/messages/web/Message.css"]["repliedTextPreview"]; 568 + export const threadMessageAccessoryPreview: MappedModules["discord/modules/messages/web/Message.css"]["threadMessageAccessoryPreview"]; 569 + export const repliedTextContent: MappedModules["discord/modules/messages/web/Message.css"]["repliedTextContent"]; 570 + export const clickable: MappedModules["discord/modules/messages/web/Message.css"]["clickable"]; 571 + export const repliedMessageClickableSpineHovered: MappedModules["discord/modules/messages/web/Message.css"]["repliedMessageClickableSpineHovered"]; 572 + export const threadMessageAccessoryContent: MappedModules["discord/modules/messages/web/Message.css"]["threadMessageAccessoryContent"]; 573 + export const repliedTextPlaceholder: MappedModules["discord/modules/messages/web/Message.css"]["repliedTextPlaceholder"]; 574 + export const threadMessageAccessoryPlaceholder: MappedModules["discord/modules/messages/web/Message.css"]["threadMessageAccessoryPlaceholder"]; 575 + export const repliedTextContentTrailingIcon: MappedModules["discord/modules/messages/web/Message.css"]["repliedTextContentTrailingIcon"]; 576 + export const threadMessageAccessoryContentTrailingIcon: MappedModules["discord/modules/messages/web/Message.css"]["threadMessageAccessoryContentTrailingIcon"]; 577 + export const repliedTextContentLeadingIcon: MappedModules["discord/modules/messages/web/Message.css"]["repliedTextContentLeadingIcon"]; 578 + export const threadMessageAccessoryContentLeadingIcon: MappedModules["discord/modules/messages/web/Message.css"]["threadMessageAccessoryContentLeadingIcon"]; 579 + export const contents: MappedModules["discord/modules/messages/web/Message.css"]["contents"]; 580 + export const zalgo: MappedModules["discord/modules/messages/web/Message.css"]["zalgo"]; 581 + export const messageContent: MappedModules["discord/modules/messages/web/Message.css"]["messageContent"]; 582 + export const header: MappedModules["discord/modules/messages/web/Message.css"]["header"]; 583 + export const buttonContainer: MappedModules["discord/modules/messages/web/Message.css"]["buttonContainer"]; 584 + export const avatar: MappedModules["discord/modules/messages/web/Message.css"]["avatar"]; 585 + export const avatarDecoration: MappedModules["discord/modules/messages/web/Message.css"]["avatarDecoration"]; 586 + export const roleIcon: MappedModules["discord/modules/messages/web/Message.css"]["roleIcon"]; 587 + export const timestamp: MappedModules["discord/modules/messages/web/Message.css"]["timestamp"]; 588 + export const timestampInline: MappedModules["discord/modules/messages/web/Message.css"]["timestampInline"]; 589 + export const alt: MappedModules["discord/modules/messages/web/Message.css"]["alt"]; 590 + export const timestampTooltip: MappedModules["discord/modules/messages/web/Message.css"]["timestampTooltip"]; 591 + export const timestampVisibleOnHover: MappedModules["discord/modules/messages/web/Message.css"]["timestampVisibleOnHover"]; 592 + export const nitroAuthorBadgeTootip: MappedModules["discord/modules/messages/web/Message.css"]["nitroAuthorBadgeTootip"]; 593 + export const headerText: MappedModules["discord/modules/messages/web/Message.css"]["headerText"]; 594 + export const hasRoleIcon: MappedModules["discord/modules/messages/web/Message.css"]["hasRoleIcon"]; 595 + export const hasBadges: MappedModules["discord/modules/messages/web/Message.css"]["hasBadges"]; 596 + export const botTagCompact: MappedModules["discord/modules/messages/web/Message.css"]["botTagCompact"]; 597 + export const botTagCozy: MappedModules["discord/modules/messages/web/Message.css"]["botTagCozy"]; 598 + export const nitroBadgeSvg: MappedModules["discord/modules/messages/web/Message.css"]["nitroBadgeSvg"]; 599 + export const nitroAuthorBadgeContainer: MappedModules["discord/modules/messages/web/Message.css"]["nitroAuthorBadgeContainer"]; 600 + export const separator: MappedModules["discord/modules/messages/web/Message.css"]["separator"]; 601 + export const hasThread: MappedModules["discord/modules/messages/web/Message.css"]["hasThread"]; 602 + export const isSystemMessage: MappedModules["discord/modules/messages/web/Message.css"]["isSystemMessage"]; 603 + export const hasReply: MappedModules["discord/modules/messages/web/Message.css"]["hasReply"]; 604 + export const markupRtl: MappedModules["discord/modules/messages/web/Message.css"]["markupRtl"]; 605 + export const isSending: MappedModules["discord/modules/messages/web/Message.css"]["isSending"]; 606 + export const isFailed: MappedModules["discord/modules/messages/web/Message.css"]["isFailed"]; 607 + export const isUnsupported: MappedModules["discord/modules/messages/web/Message.css"]["isUnsupported"]; 608 + export const edited: MappedModules["discord/modules/messages/web/Message.css"]["edited"]; 609 + export const communicationDisabled: MappedModules["discord/modules/messages/web/Message.css"]["communicationDisabled"]; 610 + export const compactCommunicationDisabled: MappedModules["discord/modules/messages/web/Message.css"]["compactCommunicationDisabled"]; 611 + export const communicationDisabledOpacity: MappedModules["discord/modules/messages/web/Message.css"]["communicationDisabledOpacity"]; 612 + export const badgesContainer: MappedModules["discord/modules/messages/web/Message.css"]["badgesContainer"]; 30 613 } 31 614 32 - declare module "@moonlight-mod/wp/discord/modules/user_settings/web/openUserSettings" { 615 + declare module "@moonlight-mod/wp/discord/modules/modals/Modals" { 33 616 import { MappedModules } from "@moonlight-mod/mappings"; 34 - const _: MappedModules["discord/modules/user_settings/web/openUserSettings"]; 35 - export = _; 617 + export const closeAllModals: MappedModules["discord/modules/modals/Modals"]["closeAllModals"]; 618 + export const closeAllModalsForContext: MappedModules["discord/modules/modals/Modals"]["closeAllModalsForContext"]; 619 + export const closeModal: MappedModules["discord/modules/modals/Modals"]["closeModal"]; 620 + export const getInteractingModalContext: MappedModules["discord/modules/modals/Modals"]["getInteractingModalContext"]; 621 + export const hasAnyModalOpen: MappedModules["discord/modules/modals/Modals"]["hasAnyModalOpen"]; 622 + export const hasAnyModalOpenSelector: MappedModules["discord/modules/modals/Modals"]["hasAnyModalOpenSelector"]; 623 + export const hasModalOpen: MappedModules["discord/modules/modals/Modals"]["hasModalOpen"]; 624 + export const hasModalOpenSelector: MappedModules["discord/modules/modals/Modals"]["hasModalOpenSelector"]; 625 + export const openModal: MappedModules["discord/modules/modals/Modals"]["openModal"]; 626 + export const openModalLazy: MappedModules["discord/modules/modals/Modals"]["openModalLazy"]; 627 + export const updateModal: MappedModules["discord/modules/modals/Modals"]["updateModal"]; 628 + export const useHasAnyModalOpen: MappedModules["discord/modules/modals/Modals"]["useHasAnyModalOpen"]; 629 + export const useIsModalAtTop: MappedModules["discord/modules/modals/Modals"]["useIsModalAtTop"]; 630 + export const useModalsStore: MappedModules["discord/modules/modals/Modals"]["useModalsStore"]; 631 + } 632 + 633 + declare module "@moonlight-mod/wp/discord/modules/oauth2/index" { 634 + import { MappedModules } from "@moonlight-mod/mappings"; 635 + export const OAuth2AuthorizeModal: MappedModules["discord/modules/oauth2/index"]["OAuth2AuthorizeModal"]; 636 + export const OAuth2AuthorizePage: MappedModules["discord/modules/oauth2/index"]["OAuth2AuthorizePage"]; 637 + export const getOAuth2AuthorizeProps: MappedModules["discord/modules/oauth2/index"]["getOAuth2AuthorizeProps"]; 638 + export const openOAuth2Modal: MappedModules["discord/modules/oauth2/index"]["openOAuth2Modal"]; 639 + export const openOAuth2ModalWithCreateGuildModal: MappedModules["discord/modules/oauth2/index"]["openOAuth2ModalWithCreateGuildModal"]; 640 + export const useOAuth2AuthorizeForm: MappedModules["discord/modules/oauth2/index"]["useOAuth2AuthorizeForm"]; 641 + } 642 + 643 + declare module "@moonlight-mod/wp/discord/modules/people/web/PeoplePage.css" { 644 + import { MappedModules } from "@moonlight-mod/mappings"; 645 + export const addFriend: MappedModules["discord/modules/people/web/PeoplePage.css"]["addFriend"]; 646 + export const badge: MappedModules["discord/modules/people/web/PeoplePage.css"]["badge"]; 647 + export const container: MappedModules["discord/modules/people/web/PeoplePage.css"]["container"]; 648 + export const inviteToolbar: MappedModules["discord/modules/people/web/PeoplePage.css"]["inviteToolbar"]; 649 + export const item: MappedModules["discord/modules/people/web/PeoplePage.css"]["item"]; 650 + export const nowPlayingColumn: MappedModules["discord/modules/people/web/PeoplePage.css"]["nowPlayingColumn"]; 651 + export const peopleColumn: MappedModules["discord/modules/people/web/PeoplePage.css"]["peopleColumn"]; 652 + export const tabBar: MappedModules["discord/modules/people/web/PeoplePage.css"]["tabBar"]; 653 + export const tabBody: MappedModules["discord/modules/people/web/PeoplePage.css"]["tabBody"]; 654 + } 655 + 656 + declare module "@moonlight-mod/wp/discord/modules/user_profile/web/BiteSizeActivity.css" { 657 + import { MappedModules } from "@moonlight-mod/mappings"; 658 + export const header: MappedModules["discord/modules/user_profile/web/BiteSizeActivity.css"]["header"]; 659 + export const headerTag: MappedModules["discord/modules/user_profile/web/BiteSizeActivity.css"]["headerTag"]; 660 + export const body: MappedModules["discord/modules/user_profile/web/BiteSizeActivity.css"]["body"]; 661 + export const footer: MappedModules["discord/modules/user_profile/web/BiteSizeActivity.css"]["footer"]; 662 + export const backdrop: MappedModules["discord/modules/user_profile/web/BiteSizeActivity.css"]["backdrop"]; 663 + export const toast: MappedModules["discord/modules/user_profile/web/BiteSizeActivity.css"]["toast"]; 664 + export const activity: MappedModules["discord/modules/user_profile/web/BiteSizeActivity.css"]["activity"]; 665 + export const upsell: MappedModules["discord/modules/user_profile/web/BiteSizeActivity.css"]["upsell"]; 36 666 } 37 667 38 668 declare module "@moonlight-mod/wp/discord/packages/flux" { 39 669 import { MappedModules } from "@moonlight-mod/mappings"; 40 - const _: MappedModules["discord/packages/flux"]; 41 - export = _; 670 + export const BatchedStoreListener: MappedModules["discord/packages/flux"]["BatchedStoreListener"]; 671 + export const Dispatcher: MappedModules["discord/packages/flux"]["Dispatcher"]; 672 + export const Store: MappedModules["discord/packages/flux"]["Store"]; 673 + const _default: MappedModules["discord/packages/flux"]["default"]; 674 + export default _default; 675 + export const statesWillNeverBeEqual: MappedModules["discord/packages/flux"]["statesWillNeverBeEqual"]; 676 + export const useStateFromStores: MappedModules["discord/packages/flux"]["useStateFromStores"]; 677 + export const useStateFromStoresArray: MappedModules["discord/packages/flux"]["useStateFromStoresArray"]; 678 + export const useStateFromStoresObject: MappedModules["discord/packages/flux"]["useStateFromStoresObject"]; 679 + } 680 + 681 + declare module "@moonlight-mod/wp/discord/packages/flux/BatchedStoreListener" { 682 + import { MappedModules } from "@moonlight-mod/mappings"; 683 + const _default: MappedModules["discord/packages/flux/BatchedStoreListener"]["default"]; 684 + export default _default; 685 + } 686 + 687 + declare module "@moonlight-mod/wp/discord/packages/flux/ChangeListeners" { 688 + import { MappedModules } from "@moonlight-mod/mappings"; 689 + const _default: MappedModules["discord/packages/flux/ChangeListeners"]["default"]; 690 + export default _default; 691 + } 692 + 693 + declare module "@moonlight-mod/wp/discord/packages/flux/Dispatcher" { 694 + import { MappedModules } from "@moonlight-mod/mappings"; 695 + export const Dispatcher: MappedModules["discord/packages/flux/Dispatcher"]["Dispatcher"]; 696 + } 697 + 698 + declare module "@moonlight-mod/wp/discord/packages/flux/Emitter" { 699 + import { MappedModules } from "@moonlight-mod/mappings"; 700 + const _default: MappedModules["discord/packages/flux/Emitter"]["default"]; 701 + export default _default; 702 + } 703 + 704 + declare module "@moonlight-mod/wp/discord/packages/flux/LoggingUtils" { 705 + import { MappedModules } from "@moonlight-mod/mappings"; 706 + const _default: MappedModules["discord/packages/flux/LoggingUtils"]["default"]; 707 + export default _default; 708 + } 709 + 710 + declare module "@moonlight-mod/wp/discord/packages/flux/PersistedStore" { 711 + import { MappedModules } from "@moonlight-mod/mappings"; 712 + export const PersistedStore: MappedModules["discord/packages/flux/PersistedStore"]["PersistedStore"]; 713 + } 714 + 715 + declare module "@moonlight-mod/wp/discord/packages/flux/Store" { 716 + import { MappedModules } from "@moonlight-mod/mappings"; 717 + export const Store: MappedModules["discord/packages/flux/Store"]["Store"]; 718 + } 719 + 720 + declare module "@moonlight-mod/wp/discord/packages/flux/connectStores" { 721 + import { MappedModules } from "@moonlight-mod/mappings"; 722 + const _default: MappedModules["discord/packages/flux/connectStores"]["default"]; 723 + export default _default; 724 + } 725 + 726 + declare module "@moonlight-mod/wp/discord/records/UserRecord" { 727 + import { MappedModules } from "@moonlight-mod/mappings"; 728 + const _default: MappedModules["discord/records/UserRecord"]["default"]; 729 + export default _default; 730 + } 731 + 732 + declare module "@moonlight-mod/wp/discord/styles/shared/Margins.css" { 733 + import { MappedModules } from "@moonlight-mod/mappings"; 734 + export const marginReset: MappedModules["discord/styles/shared/Margins.css"]["marginReset"]; 735 + export const marginTop4: MappedModules["discord/styles/shared/Margins.css"]["marginTop4"]; 736 + export const marginBottom4: MappedModules["discord/styles/shared/Margins.css"]["marginBottom4"]; 737 + export const marginTop8: MappedModules["discord/styles/shared/Margins.css"]["marginTop8"]; 738 + export const marginBottom8: MappedModules["discord/styles/shared/Margins.css"]["marginBottom8"]; 739 + export const marginTop20: MappedModules["discord/styles/shared/Margins.css"]["marginTop20"]; 740 + export const marginBottom20: MappedModules["discord/styles/shared/Margins.css"]["marginBottom20"]; 741 + export const marginTop40: MappedModules["discord/styles/shared/Margins.css"]["marginTop40"]; 742 + export const marginBottom40: MappedModules["discord/styles/shared/Margins.css"]["marginBottom40"]; 743 + export const marginTop60: MappedModules["discord/styles/shared/Margins.css"]["marginTop60"]; 744 + export const marginBottom60: MappedModules["discord/styles/shared/Margins.css"]["marginBottom60"]; 745 + export const marginCenterHorz: MappedModules["discord/styles/shared/Margins.css"]["marginCenterHorz"]; 746 + export const marginLeft8: MappedModules["discord/styles/shared/Margins.css"]["marginLeft8"]; 42 747 } 43 748 44 749 declare module "@moonlight-mod/wp/discord/uikit/Flex" { 45 750 import { MappedModules } from "@moonlight-mod/mappings"; 46 - const _: MappedModules["discord/uikit/Flex"]; 47 - export = _; 751 + const _default: MappedModules["discord/uikit/Flex"]["default"]; 752 + export default _default; 48 753 } 49 754 50 755 declare module "@moonlight-mod/wp/discord/utils/ClipboardUtils" { 51 756 import { MappedModules } from "@moonlight-mod/mappings"; 52 - const _: MappedModules["discord/utils/ClipboardUtils"]; 53 - export = _; 757 + export const SUPPORTS_COPY: MappedModules["discord/utils/ClipboardUtils"]["SUPPORTS_COPY"]; 758 + export const copy: MappedModules["discord/utils/ClipboardUtils"]["copy"]; 759 + } 760 + 761 + declare module "@moonlight-mod/wp/discord/utils/ComponentDispatchUtils" { 762 + import { MappedModules } from "@moonlight-mod/mappings"; 763 + export const ComponentDispatcher: MappedModules["discord/utils/ComponentDispatchUtils"]["ComponentDispatcher"]; 764 + export const ComponentDispatch: MappedModules["discord/utils/ComponentDispatchUtils"]["ComponentDispatch"]; 54 765 } 55 766 56 767 declare module "@moonlight-mod/wp/discord/utils/HTTPUtils" { 57 768 import { MappedModules } from "@moonlight-mod/mappings"; 58 - const _: MappedModules["discord/utils/HTTPUtils"]; 59 - export = _; 769 + export const HTTP: MappedModules["discord/utils/HTTPUtils"]["HTTP"]; 770 + } 771 + 772 + declare module "@moonlight-mod/wp/discord/utils/MaskedLinkUtils" { 773 + import { MappedModules } from "@moonlight-mod/mappings"; 774 + export const isLinkTrusted: MappedModules["discord/utils/MaskedLinkUtils"]["isLinkTrusted"]; 775 + export const handleClick: MappedModules["discord/utils/MaskedLinkUtils"]["handleClick"]; 60 776 } 61 777 62 778 declare module "@moonlight-mod/wp/discord/utils/NativeUtils" { 63 779 import { MappedModules } from "@moonlight-mod/mappings"; 64 - const _: MappedModules["discord/utils/NativeUtils"]; 65 - export = _; 780 + const _default: MappedModules["discord/utils/NativeUtils"]["default"]; 781 + export default _default; 782 + } 783 + 784 + declare module "@moonlight-mod/wp/highlight.js" { 785 + import { MappedModules } from "@moonlight-mod/mappings"; 786 + export const highlight: MappedModules["highlight.js"]["highlight"]; 787 + export const highlightAuto: MappedModules["highlight.js"]["highlightAuto"]; 788 + export const fixMarkup: MappedModules["highlight.js"]["fixMarkup"]; 789 + export const highlightBlock: MappedModules["highlight.js"]["highlightBlock"]; 790 + export const configure: MappedModules["highlight.js"]["configure"]; 791 + export const initHighlighting: MappedModules["highlight.js"]["initHighlighting"]; 792 + export const initHighlightingOnLoad: MappedModules["highlight.js"]["initHighlightingOnLoad"]; 793 + export const registerLanguage: MappedModules["highlight.js"]["registerLanguage"]; 794 + export const listLanguages: MappedModules["highlight.js"]["listLanguages"]; 795 + export const getLanguage: MappedModules["highlight.js"]["getLanguage"]; 796 + export const inherit: MappedModules["highlight.js"]["inherit"]; 797 + export const COMMENT: MappedModules["highlight.js"]["COMMENT"]; 798 + export const IDENT_RE: MappedModules["highlight.js"]["IDENT_RE"]; 799 + export const UNDERSCORE_IDENT_RE: MappedModules["highlight.js"]["UNDERSCORE_IDENT_RE"]; 800 + export const NUMBER_RE: MappedModules["highlight.js"]["NUMBER_RE"]; 801 + export const C_NUMBER_RE: MappedModules["highlight.js"]["C_NUMBER_RE"]; 802 + export const BINARY_NUMBER_RE: MappedModules["highlight.js"]["BINARY_NUMBER_RE"]; 803 + export const RE_STARTERS_RE: MappedModules["highlight.js"]["RE_STARTERS_RE"]; 804 + export const BACKSLASH_ESCAPE: MappedModules["highlight.js"]["BACKSLASH_ESCAPE"]; 805 + export const APOS_STRING_MODE: MappedModules["highlight.js"]["APOS_STRING_MODE"]; 806 + export const QUOTE_STRING_MODE: MappedModules["highlight.js"]["QUOTE_STRING_MODE"]; 807 + export const PHRASAL_WORDS_MODE: MappedModules["highlight.js"]["PHRASAL_WORDS_MODE"]; 808 + export const C_LINE_COMMENT_MODE: MappedModules["highlight.js"]["C_LINE_COMMENT_MODE"]; 809 + export const C_BLOCK_COMMENT_MODE: MappedModules["highlight.js"]["C_BLOCK_COMMENT_MODE"]; 810 + export const HASH_COMMENT_MODE: MappedModules["highlight.js"]["HASH_COMMENT_MODE"]; 811 + export const NUMBER_MODE: MappedModules["highlight.js"]["NUMBER_MODE"]; 812 + export const C_NUMBER_MODE: MappedModules["highlight.js"]["C_NUMBER_MODE"]; 813 + export const BINARY_NUMBER_MODE: MappedModules["highlight.js"]["BINARY_NUMBER_MODE"]; 814 + export const CSS_NUMBER_MODE: MappedModules["highlight.js"]["CSS_NUMBER_MODE"]; 815 + export const REGEX_MODE: MappedModules["highlight.js"]["REGEX_MODE"]; 816 + export const TITLE_MODE: MappedModules["highlight.js"]["TITLE_MODE"]; 817 + export const UNDERSCORE_TITLE_MODE: MappedModules["highlight.js"]["UNDERSCORE_TITLE_MODE"]; 818 + const _default: MappedModules["highlight.js"]["default"]; 819 + export default _default; 820 + export const HighlightJS: MappedModules["highlight.js"]["HighlightJS"]; 821 + } 822 + 823 + declare module "@moonlight-mod/wp/highlight.js/lib/core" { 824 + import { MappedModules } from "@moonlight-mod/mappings"; 825 + export const highlight: MappedModules["highlight.js/lib/core"]["highlight"]; 826 + export const highlightAuto: MappedModules["highlight.js/lib/core"]["highlightAuto"]; 827 + export const fixMarkup: MappedModules["highlight.js/lib/core"]["fixMarkup"]; 828 + export const highlightBlock: MappedModules["highlight.js/lib/core"]["highlightBlock"]; 829 + export const configure: MappedModules["highlight.js/lib/core"]["configure"]; 830 + export const initHighlighting: MappedModules["highlight.js/lib/core"]["initHighlighting"]; 831 + export const initHighlightingOnLoad: MappedModules["highlight.js/lib/core"]["initHighlightingOnLoad"]; 832 + export const registerLanguage: MappedModules["highlight.js/lib/core"]["registerLanguage"]; 833 + export const listLanguages: MappedModules["highlight.js/lib/core"]["listLanguages"]; 834 + export const getLanguage: MappedModules["highlight.js/lib/core"]["getLanguage"]; 835 + export const inherit: MappedModules["highlight.js/lib/core"]["inherit"]; 836 + export const COMMENT: MappedModules["highlight.js/lib/core"]["COMMENT"]; 837 + export const IDENT_RE: MappedModules["highlight.js/lib/core"]["IDENT_RE"]; 838 + export const UNDERSCORE_IDENT_RE: MappedModules["highlight.js/lib/core"]["UNDERSCORE_IDENT_RE"]; 839 + export const NUMBER_RE: MappedModules["highlight.js/lib/core"]["NUMBER_RE"]; 840 + export const C_NUMBER_RE: MappedModules["highlight.js/lib/core"]["C_NUMBER_RE"]; 841 + export const BINARY_NUMBER_RE: MappedModules["highlight.js/lib/core"]["BINARY_NUMBER_RE"]; 842 + export const RE_STARTERS_RE: MappedModules["highlight.js/lib/core"]["RE_STARTERS_RE"]; 843 + export const BACKSLASH_ESCAPE: MappedModules["highlight.js/lib/core"]["BACKSLASH_ESCAPE"]; 844 + export const APOS_STRING_MODE: MappedModules["highlight.js/lib/core"]["APOS_STRING_MODE"]; 845 + export const QUOTE_STRING_MODE: MappedModules["highlight.js/lib/core"]["QUOTE_STRING_MODE"]; 846 + export const PHRASAL_WORDS_MODE: MappedModules["highlight.js/lib/core"]["PHRASAL_WORDS_MODE"]; 847 + export const C_LINE_COMMENT_MODE: MappedModules["highlight.js/lib/core"]["C_LINE_COMMENT_MODE"]; 848 + export const C_BLOCK_COMMENT_MODE: MappedModules["highlight.js/lib/core"]["C_BLOCK_COMMENT_MODE"]; 849 + export const HASH_COMMENT_MODE: MappedModules["highlight.js/lib/core"]["HASH_COMMENT_MODE"]; 850 + export const NUMBER_MODE: MappedModules["highlight.js/lib/core"]["NUMBER_MODE"]; 851 + export const C_NUMBER_MODE: MappedModules["highlight.js/lib/core"]["C_NUMBER_MODE"]; 852 + export const BINARY_NUMBER_MODE: MappedModules["highlight.js/lib/core"]["BINARY_NUMBER_MODE"]; 853 + export const CSS_NUMBER_MODE: MappedModules["highlight.js/lib/core"]["CSS_NUMBER_MODE"]; 854 + export const REGEX_MODE: MappedModules["highlight.js/lib/core"]["REGEX_MODE"]; 855 + export const TITLE_MODE: MappedModules["highlight.js/lib/core"]["TITLE_MODE"]; 856 + export const UNDERSCORE_TITLE_MODE: MappedModules["highlight.js/lib/core"]["UNDERSCORE_TITLE_MODE"]; 857 + } 858 + 859 + declare module "@moonlight-mod/wp/lodash" {} 860 + 861 + declare module "@moonlight-mod/wp/murmurhash" { 862 + import { MappedModules } from "@moonlight-mod/mappings"; 863 + export const v2: MappedModules["murmurhash"]["v2"]; 864 + export const v3: MappedModules["murmurhash"]["v3"]; 865 + } 866 + 867 + declare module "@moonlight-mod/wp/platform.js" { 868 + import { MappedModules } from "@moonlight-mod/mappings"; 869 + export const description: MappedModules["platform.js"]["description"]; 870 + export const layout: MappedModules["platform.js"]["layout"]; 871 + export const manufacturer: MappedModules["platform.js"]["manufacturer"]; 872 + export const name: MappedModules["platform.js"]["name"]; 873 + export const prerelease: MappedModules["platform.js"]["prerelease"]; 874 + export const product: MappedModules["platform.js"]["product"]; 875 + export const ua: MappedModules["platform.js"]["ua"]; 876 + export const version: MappedModules["platform.js"]["version"]; 877 + export const os: MappedModules["platform.js"]["os"]; 878 + export const parse: MappedModules["platform.js"]["parse"]; 879 + export const toString: MappedModules["platform.js"]["toString"]; 66 880 } 67 881 68 882 declare module "@moonlight-mod/wp/react" { 69 883 import { MappedModules } from "@moonlight-mod/mappings"; 70 - const _: MappedModules["react"]; 884 + const _: Omit<MappedModules["react"], "__mappings_exportEquals">; 71 885 export = _; 72 886 } 887 + 888 + declare module "@moonlight-mod/wp/uuid/v4" {}
+7 -7
packages/types/tsconfig.json
··· 1 1 { 2 2 "compilerOptions": { 3 - "target": "es2016", 4 - "module": "es6", 5 - "esModuleInterop": true, 6 - "forceConsistentCasingInFileNames": true, 7 - "strict": true, 8 - "moduleResolution": "bundler", 3 + "target": "ES2016", 9 4 "jsx": "react", 10 - "declaration": true 5 + "module": "ES6", 6 + "moduleResolution": "bundler", 7 + "strict": true, 8 + "declaration": true, 9 + "esModuleInterop": true, 10 + "forceConsistentCasingInFileNames": true 11 11 }, 12 12 "include": ["./src/**/*", "src/index.ts", "./src/import.d.ts"] 13 13 }
+10 -3
packages/web-preload/package.json
··· 2 2 "name": "@moonlight-mod/web-preload", 3 3 "private": true, 4 4 "main": "src/index.ts", 5 + "engineStrict": true, 6 + "engines": { 7 + "node": ">=22", 8 + "pnpm": ">=10", 9 + "npm": "pnpm", 10 + "yarn": "pnpm" 11 + }, 5 12 "dependencies": { 6 13 "@moonlight-mod/core": "workspace:*", 7 - "@moonlight-mod/lunast": "^1.0.0", 8 - "@moonlight-mod/mappings": "^1.0.10", 9 - "@moonlight-mod/moonmap": "^1.0.3", 14 + "@moonlight-mod/lunast": "catalog:prod", 15 + "@moonlight-mod/mappings": "catalog:prod", 16 + "@moonlight-mod/moonmap": "catalog:prod", 10 17 "@moonlight-mod/types": "workspace:*" 11 18 } 12 19 }
+2 -2
packages/web-preload/src/index.ts
··· 7 7 import Moonmap from "@moonlight-mod/moonmap"; 8 8 import loadMappings from "@moonlight-mod/mappings"; 9 9 import { createEventEmitter } from "@moonlight-mod/core/util/event"; 10 - import { EventPayloads, EventType } from "@moonlight-mod/types/core/event"; 10 + import { WebEventPayloads, WebEventType } from "@moonlight-mod/types/core/event"; 11 11 12 12 async function load() { 13 13 delete window._moonlightWebLoad; ··· 20 20 pendingModules: new Set(), 21 21 enabledExtensions: new Set(), 22 22 23 - events: createEventEmitter<EventType, EventPayloads>(), 23 + events: createEventEmitter<WebEventType, WebEventPayloads>(), 24 24 patchingInternals: { 25 25 onModuleLoad, 26 26 registerPatch,
+4 -1
packages/web-preload/tsconfig.json
··· 1 1 { 2 - "extends": "../../tsconfig.json" 2 + "extends": "../../tsconfig.json", 3 + "compilerOptions": { 4 + "lib": ["ESNext", "DOM"] 5 + } 3 6 }
+1243 -729
pnpm-lock.yaml
··· 4 4 autoInstallPeers: true 5 5 excludeLinksFromLockfile: false 6 6 7 + catalogs: 8 + dev: 9 + '@moonlight-mod/eslint-config': 10 + specifier: github:moonlight-mod/eslint-config 11 + version: 1.0.1 12 + '@types/chrome': 13 + specifier: ^0.0.313 14 + version: 0.0.313 15 + '@types/node': 16 + specifier: ^22.14.0 17 + version: 22.14.0 18 + esbuild: 19 + specifier: ^0.19.3 20 + version: 0.19.3 21 + esbuild-copy-static-files: 22 + specifier: ^0.1.0 23 + version: 0.1.0 24 + eslint: 25 + specifier: ^9.12.0 26 + version: 9.23.0 27 + husky: 28 + specifier: ^8.0.3 29 + version: 8.0.3 30 + prettier: 31 + specifier: ^3.1.0 32 + version: 3.1.0 33 + taze: 34 + specifier: ^19.0.4 35 + version: 19.0.4 36 + typescript: 37 + specifier: ^5.3.3 38 + version: 5.8.2 39 + prod: 40 + '@moonlight-mod/lunast': 41 + specifier: ^1.0.1 42 + version: 1.0.1 43 + '@moonlight-mod/mappings': 44 + specifier: ^1.1.25 45 + version: 1.1.25 46 + '@moonlight-mod/moonmap': 47 + specifier: ^1.0.5 48 + version: 1.0.5 49 + '@zenfs/core': 50 + specifier: ^2.0.0 51 + version: 2.0.0 52 + '@zenfs/dom': 53 + specifier: ^1.1.3 54 + version: 1.1.6 55 + microdiff: 56 + specifier: ^1.5.0 57 + version: 1.5.0 58 + nanotar: 59 + specifier: ^0.1.1 60 + version: 0.1.1 61 + 7 62 importers: 8 63 9 64 .: 10 65 devDependencies: 11 66 '@moonlight-mod/eslint-config': 12 - specifier: github:moonlight-mod/eslint-config 13 - version: https://codeload.github.com/moonlight-mod/eslint-config/tar.gz/e262ac24e1a0955a9b3e0d66da247a0a8c0446c9(eslint@9.12.0)(prettier@3.1.0)(typescript@5.3.2) 67 + specifier: catalog:dev 68 + version: https://codeload.github.com/moonlight-mod/eslint-config/tar.gz/e262ac24e1a0955a9b3e0d66da247a0a8c0446c9(@types/eslint@9.6.1)(eslint@9.23.0(jiti@2.4.2))(prettier@3.1.0)(typescript@5.8.2) 69 + '@types/node': 70 + specifier: catalog:dev 71 + version: 22.14.0 14 72 esbuild: 15 - specifier: ^0.19.3 73 + specifier: catalog:dev 16 74 version: 0.19.3 17 75 esbuild-copy-static-files: 18 - specifier: ^0.1.0 76 + specifier: catalog:dev 19 77 version: 0.1.0 20 78 eslint: 21 - specifier: ^9.12.0 22 - version: 9.12.0 79 + specifier: catalog:dev 80 + version: 9.23.0(jiti@2.4.2) 23 81 husky: 24 - specifier: ^8.0.3 82 + specifier: catalog:dev 25 83 version: 8.0.3 26 84 prettier: 27 - specifier: ^3.1.0 85 + specifier: catalog:dev 28 86 version: 3.1.0 87 + taze: 88 + specifier: catalog:dev 89 + version: 19.0.4 29 90 typescript: 30 - specifier: ^5.3.2 31 - version: 5.3.2 91 + specifier: catalog:dev 92 + version: 5.8.2 32 93 33 94 packages/browser: 34 95 dependencies: ··· 42 103 specifier: workspace:* 43 104 version: link:../web-preload 44 105 '@zenfs/core': 45 - specifier: ^1.0.2 46 - version: 1.0.2 106 + specifier: catalog:prod 107 + version: 2.0.0 47 108 '@zenfs/dom': 48 - specifier: ^0.2.16 49 - version: 0.2.16(@zenfs/core@1.0.2) 109 + specifier: catalog:prod 110 + version: 1.1.6(@zenfs/core@2.0.0)(utilium@1.10.1) 111 + devDependencies: 112 + '@types/chrome': 113 + specifier: catalog:dev 114 + version: 0.0.313 50 115 51 116 packages/core: 52 117 dependencies: ··· 63 128 specifier: workspace:* 64 129 version: link:../types 65 130 microdiff: 66 - specifier: ^1.5.0 131 + specifier: catalog:prod 67 132 version: 1.5.0 68 133 nanotar: 69 - specifier: ^0.1.1 134 + specifier: catalog:prod 70 135 version: 0.1.1 71 136 72 137 packages/injector: ··· 90 155 packages/types: 91 156 dependencies: 92 157 '@moonlight-mod/lunast': 93 - specifier: ^1.0.0 94 - version: 1.0.0 158 + specifier: ^1.0.1 159 + version: 1.0.1 95 160 '@moonlight-mod/mappings': 96 - specifier: ^1.0.10 97 - version: 1.0.10(@moonlight-mod/lunast@1.0.0)(@moonlight-mod/moonmap@1.0.3) 161 + specifier: ^1.1.25 162 + version: 1.1.25(@moonlight-mod/lunast@1.0.1)(@moonlight-mod/moonmap@1.0.5) 98 163 '@moonlight-mod/moonmap': 99 - specifier: ^1.0.3 100 - version: 1.0.3 164 + specifier: ^1.0.5 165 + version: 1.0.5 101 166 '@types/react': 102 167 specifier: ^18.3.10 103 - version: 18.3.10 168 + version: 18.3.20 104 169 csstype: 105 - specifier: ^3.1.2 106 - version: 3.1.2 170 + specifier: ^3.1.3 171 + version: 3.1.3 107 172 standalone-electron-types: 108 173 specifier: ^1.0.0 109 174 version: 1.0.0 ··· 114 179 specifier: workspace:* 115 180 version: link:../core 116 181 '@moonlight-mod/lunast': 117 - specifier: ^1.0.0 118 - version: 1.0.0 182 + specifier: catalog:prod 183 + version: 1.0.1 119 184 '@moonlight-mod/mappings': 120 - specifier: ^1.0.10 121 - version: 1.0.10(@moonlight-mod/lunast@1.0.0)(@moonlight-mod/moonmap@1.0.3) 185 + specifier: catalog:prod 186 + version: 1.1.25(@moonlight-mod/lunast@1.0.1)(@moonlight-mod/moonmap@1.0.5) 122 187 '@moonlight-mod/moonmap': 123 - specifier: ^1.0.3 124 - version: 1.0.3 188 + specifier: catalog:prod 189 + version: 1.0.5 125 190 '@moonlight-mod/types': 126 191 specifier: workspace:* 127 192 version: link:../types ··· 131 196 '@aashutoshrathi/word-wrap@1.2.6': 132 197 resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} 133 198 engines: {node: '>=0.10.0'} 199 + 200 + '@antfu/ni@24.3.0': 201 + resolution: {integrity: sha512-wBSav4mBxvHEW9RbdSo1SWLQ6MAlT0Dc423weC58yOWqW4OcMvtnNDdDrxOZeJ88fEIyPK93gDUWIelBxzSf8g==} 202 + hasBin: true 134 203 135 204 '@esbuild/android-arm64@0.19.3': 136 205 resolution: {integrity: sha512-w+Akc0vv5leog550kjJV9Ru+MXMR2VuMrui3C61mnysim0gkFCPOUTAfzTP0qX+HpN9Syu3YA3p1hf3EPqObRw==} ··· 264 333 cpu: [x64] 265 334 os: [win32] 266 335 267 - '@eslint-community/eslint-utils@4.4.0': 268 - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} 336 + '@eslint-community/eslint-utils@4.5.1': 337 + resolution: {integrity: sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==} 269 338 engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 270 339 peerDependencies: 271 340 eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 272 341 273 - '@eslint-community/regexpp@4.11.1': 274 - resolution: {integrity: sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==} 342 + '@eslint-community/regexpp@4.12.1': 343 + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} 275 344 engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 276 345 277 - '@eslint/config-array@0.18.0': 278 - resolution: {integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==} 346 + '@eslint/config-array@0.19.2': 347 + resolution: {integrity: sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==} 279 348 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 280 349 281 - '@eslint/core@0.6.0': 282 - resolution: {integrity: sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg==} 350 + '@eslint/config-helpers@0.2.1': 351 + resolution: {integrity: sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw==} 283 352 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 284 353 285 - '@eslint/eslintrc@3.1.0': 286 - resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} 354 + '@eslint/core@0.12.0': 355 + resolution: {integrity: sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==} 356 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 357 + 358 + '@eslint/core@0.13.0': 359 + resolution: {integrity: sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==} 360 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 361 + 362 + '@eslint/eslintrc@3.3.1': 363 + resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} 287 364 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 288 365 289 - '@eslint/js@9.12.0': 290 - resolution: {integrity: sha512-eohesHH8WFRUprDNyEREgqP6beG6htMeUYeCpkEgBCieCMme5r9zFWjzAJp//9S+Kub4rqE+jXe9Cp1a7IYIIA==} 366 + '@eslint/js@9.23.0': 367 + resolution: {integrity: sha512-35MJ8vCPU0ZMxo7zfev2pypqTwWTofFZO6m4KAtdoFhRpLJUpHTZZ+KB3C7Hb1d7bULYwO4lJXGCi5Se+8OMbw==} 291 368 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 292 369 293 - '@eslint/object-schema@2.1.4': 294 - resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} 370 + '@eslint/object-schema@2.1.6': 371 + resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} 295 372 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 296 373 297 - '@eslint/plugin-kit@0.2.0': 298 - resolution: {integrity: sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig==} 374 + '@eslint/plugin-kit@0.2.8': 375 + resolution: {integrity: sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==} 299 376 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 300 377 301 - '@humanfs/core@0.19.0': 302 - resolution: {integrity: sha512-2cbWIHbZVEweE853g8jymffCA+NCMiuqeECeBBLm8dg2oFdjuGJhgN4UAbI+6v0CKbbhvtXA4qV8YR5Ji86nmw==} 378 + '@humanfs/core@0.19.1': 379 + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} 303 380 engines: {node: '>=18.18.0'} 304 381 305 - '@humanfs/node@0.16.5': 306 - resolution: {integrity: sha512-KSPA4umqSG4LHYRodq31VDwKAvaTF4xmVlzM8Aeh4PlU1JQ3IG0wiA8C25d3RQ9nJyM3mBHyI53K06VVL/oFFg==} 382 + '@humanfs/node@0.16.6': 383 + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} 307 384 engines: {node: '>=18.18.0'} 308 385 309 386 '@humanwhocodes/module-importer@1.0.1': ··· 314 391 resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} 315 392 engines: {node: '>=18.18'} 316 393 394 + '@humanwhocodes/retry@0.4.2': 395 + resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} 396 + engines: {node: '>=18.18'} 397 + 317 398 '@moonlight-mod/eslint-config@https://codeload.github.com/moonlight-mod/eslint-config/tar.gz/e262ac24e1a0955a9b3e0d66da247a0a8c0446c9': 318 399 resolution: {tarball: https://codeload.github.com/moonlight-mod/eslint-config/tar.gz/e262ac24e1a0955a9b3e0d66da247a0a8c0446c9} 319 400 version: 1.0.1 ··· 321 402 eslint: '>= 9' 322 403 typescript: '>= 5.3' 323 404 324 - '@moonlight-mod/lunast@1.0.0': 325 - resolution: {integrity: sha512-kJgf41K12i6/2LbXK97CNO+pNO7ADGh9N4bCQcOPwosocKMcwKHDEZUgPqeihNshY3c3AEW1LiyXjlsl24PdDw==} 405 + '@moonlight-mod/lunast@1.0.1': 406 + resolution: {integrity: sha512-K3vxzDlfFuYKjciIW2FMlcZ1qrrkAGDGpSBlNqYGtJ0sMt9bRCd2lpSpg6AX/giSljDtmAUXa/5mOfUoDQxjBA==} 326 407 327 - '@moonlight-mod/mappings@1.0.10': 328 - resolution: {integrity: sha512-L04To4MhlxOWxvvfVIRwj7d8H5qHthjUfikSx9WMk60qt67+6dFzN9CoAG9uG5l1B27IIEG3voVXBr0oSkooYw==} 408 + '@moonlight-mod/mappings@1.1.25': 409 + resolution: {integrity: sha512-bgnSN9H/IBdMGxGev6RQKXuzhQxwo1090NhIDHnflguZnjiu2pg/usPfh76bqyhxRuX4SS7tiZSNTwBoSflCLg==} 410 + engines: {node: '>=22', npm: pnpm, pnpm: '>=10', yarn: pnpm} 329 411 peerDependencies: 330 - '@moonlight-mod/lunast': ^1.0.0 331 - '@moonlight-mod/moonmap': ^1.0.0 412 + '@moonlight-mod/lunast': ^1.0.1 413 + '@moonlight-mod/moonmap': ^1.0.5 332 414 333 - '@moonlight-mod/moonmap@1.0.3': 334 - resolution: {integrity: sha512-G7pwvrcVDimc388IX6VZFzBXpbuyvqbJ+w9/v+MUIc8P7dADJXQ9YkBWvobtRc6eaBBl1FWUwTeU8oobbxLVag==} 415 + '@moonlight-mod/moonmap@1.0.5': 416 + resolution: {integrity: sha512-Fdpxj8ghdulKB6TlTnchlCPey2YUKgEf1chuO1ofOIcvlqnVPBcQwSf2S80naOUQpXCDo4dQ+LWSE2fmhdDiiw==} 335 417 336 418 '@nodelib/fs.scandir@2.1.5': 337 419 resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} ··· 345 427 resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 346 428 engines: {node: '>= 8'} 347 429 348 - '@pkgr/core@0.1.1': 349 - resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} 430 + '@pkgr/core@0.2.0': 431 + resolution: {integrity: sha512-vsJDAkYR6qCPu+ioGScGiMYR7LvZYIXh/dlQeviqoTWNCVfKTLYD/LkNWH4Mxsv2a5vpIRc77FN5DnmK1eBggQ==} 350 432 engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} 433 + 434 + '@quansync/fs@0.1.2': 435 + resolution: {integrity: sha512-ezIadUb1aFhwJLd++WVqVpi9rnlX8vnd4ju7saPhwLHJN1mJgOv0puePTGV+FbtSnWtwoHDT8lAm4kagDZmpCg==} 436 + engines: {node: '>=20.0.0'} 437 + 438 + '@types/chroma-js@3.1.0': 439 + resolution: {integrity: sha512-Uwl3SOtUkbQ6Ye6ZYu4q4xdLGBzmY839sEHYtOT7i691neeyd+7fXWT5VIkcUSfNwIFrIjQutNYQn9h4q5HFvg==} 440 + 441 + '@types/chrome@0.0.313': 442 + resolution: {integrity: sha512-9R5T7gTaYZhkxlu+Ho4wk9FL+y/werWQY2yjGWSqCuiTsqS7nL/BE5UMTP6rU7J+oIG2FRKqrEycHhJATeltVA==} 443 + 444 + '@types/eslint@9.6.1': 445 + resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} 351 446 352 447 '@types/estree-jsx@1.0.5': 353 448 resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} ··· 355 450 '@types/estree@1.0.6': 356 451 resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} 357 452 453 + '@types/estree@1.0.7': 454 + resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} 455 + 358 456 '@types/fbemitter@2.0.35': 359 457 resolution: {integrity: sha512-Xem6d7qUfmouCHntCrRYgDBwbf+WWRd6G+7WEFlEZFZ67LZXiYRvT2LV8wcZa6mIaAil95+ABQdKgB6hPIsnng==} 360 458 459 + '@types/filesystem@0.0.36': 460 + resolution: {integrity: sha512-vPDXOZuannb9FZdxgHnqSwAG/jvdGM8Wq+6N4D/d80z+D4HWH+bItqsZaVRQykAn6WEVeEkLm2oQigyHtgb0RA==} 461 + 462 + '@types/filewriter@0.0.33': 463 + resolution: {integrity: sha512-xFU8ZXTw4gd358lb2jw25nxY9QAgqn2+bKKjKOYfNCzN4DKCFetK7sPtrlpg66Ywe3vWY9FNxprZawAh9wfJ3g==} 464 + 361 465 '@types/flux@3.1.14': 362 466 resolution: {integrity: sha512-WRXN0kQPCnqxN0/PgNgc7WBF6c8rbSHsEep3/qBLpsQ824RONdOmTs0TV7XhIW2GDNRAHO2CqCgAFLR5PChosw==} 467 + 468 + '@types/har-format@1.2.16': 469 + resolution: {integrity: sha512-fluxdy7ryD3MV6h8pTfTYpy/xQzCFC7m89nOH9y94cNqJ1mDIDPut7MnRHI3F6qRmh/cT2fUjG1MLdCNb4hE9A==} 470 + 471 + '@types/highlightjs@9.12.6': 472 + resolution: {integrity: sha512-Qfd1DUrwE851Hc3tExADJY4qY8yeZMt06Xw9AJm/UtpneepJS3MZY29c33BY0wP899veaaHD4gZzYiSuQm84Fg==} 363 473 364 474 '@types/json-schema@7.0.15': 365 475 resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 366 476 477 + '@types/lodash@4.17.14': 478 + resolution: {integrity: sha512-jsxagdikDiDBeIRaPYtArcT8my4tN1og7MtMRquFT3XNA6axxyHDRUemqDz/taRDdOUn0GnGHRCuff4q48sW9A==} 479 + 367 480 '@types/node@18.17.17': 368 481 resolution: {integrity: sha512-cOxcXsQ2sxiwkykdJqvyFS+MLQPLvIdwh5l6gNg8qF6s+C7XSkEWOZjK+XhUZd+mYvHV/180g2cnCcIl4l06Pw==} 369 482 370 - '@types/node@20.16.10': 371 - resolution: {integrity: sha512-vQUKgWTjEIRFCvK6CyriPH3MZYiYlNy0fKiEYHWbcoWLEgs4opurGGKlebrTLqdSMIbXImH6XExNiIyNUv3WpA==} 483 + '@types/node@22.13.6': 484 + resolution: {integrity: sha512-GYmF65GI7417CpZXsEXMjT8goQQDnpRnJnDw6jIYa+le3V/lMazPZ4vZmK1B/9R17fh2VLr2zuy9d/h5xgrLAg==} 485 + 486 + '@types/node@22.14.0': 487 + resolution: {integrity: sha512-Kmpl+z84ILoG+3T/zQFyAJsU6EPTmOCj8/2+83fSN6djd6I4o7uOuGIH6vq3PrjY5BGitSbFuMN18j3iknubbA==} 488 + 489 + '@types/platform@1.3.6': 490 + resolution: {integrity: sha512-ZmSaqHuvzv+jC232cFoz2QqPUkaj6EvMmCrWcx3WRr7xTPVFCMUOTcOq8m2d+Zw1iKRc1kDiaA+jtNrV0hkVew==} 372 491 373 492 '@types/prop-types@15.7.13': 374 493 resolution: {integrity: sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==} 375 494 376 - '@types/react@18.3.10': 377 - resolution: {integrity: sha512-02sAAlBnP39JgXwkAq3PeU9DVaaGpZyF3MGcC0MKgQVkZor5IiiDAipVaxQHtDJAmO4GIy/rVBy/LzVj76Cyqg==} 495 + '@types/react@18.3.20': 496 + resolution: {integrity: sha512-IPaCZN7PShZK/3t6Q87pfTkRm6oLTd4vztyoj+cbHUF1g3FfVb2tFIL79uCRKEfv16AhqDMBywP2VW3KIZUvcg==} 378 497 379 - '@types/readable-stream@4.0.15': 380 - resolution: {integrity: sha512-oAZ3kw+kJFkEqyh7xORZOku1YAKvsFTogRY8kVl4vHpEKiDkfnSA/My8haRE7fvmix5Zyy+1pwzOi7yycGLBJw==} 381 - 382 - '@typescript-eslint/eslint-plugin@8.8.1': 383 - resolution: {integrity: sha512-xfvdgA8AP/vxHgtgU310+WBnLB4uJQ9XdyP17RebG26rLtDrQJV3ZYrcopX91GrHmMoH8bdSwMRh2a//TiJ1jQ==} 498 + '@typescript-eslint/eslint-plugin@8.29.0': 499 + resolution: {integrity: sha512-PAIpk/U7NIS6H7TEtN45SPGLQaHNgB7wSjsQV/8+KYokAb2T/gloOA/Bee2yd4/yKVhPKe5LlaUGhAZk5zmSaQ==} 384 500 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 385 501 peerDependencies: 386 502 '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 387 503 eslint: ^8.57.0 || ^9.0.0 388 - typescript: '*' 389 - peerDependenciesMeta: 390 - typescript: 391 - optional: true 504 + typescript: '>=4.8.4 <5.9.0' 392 505 393 - '@typescript-eslint/parser@8.8.1': 394 - resolution: {integrity: sha512-hQUVn2Lij2NAxVFEdvIGxT9gP1tq2yM83m+by3whWFsWC+1y8pxxxHUFE1UqDu2VsGi2i6RLcv4QvouM84U+ow==} 506 + '@typescript-eslint/parser@8.29.0': 507 + resolution: {integrity: sha512-8C0+jlNJOwQso2GapCVWWfW/rzaq7Lbme+vGUFKE31djwNncIpgXD7Cd4weEsDdkoZDjH0lwwr3QDQFuyrMg9g==} 395 508 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 396 509 peerDependencies: 397 510 eslint: ^8.57.0 || ^9.0.0 398 - typescript: '*' 399 - peerDependenciesMeta: 400 - typescript: 401 - optional: true 511 + typescript: '>=4.8.4 <5.9.0' 402 512 403 - '@typescript-eslint/scope-manager@8.8.1': 404 - resolution: {integrity: sha512-X4JdU+66Mazev/J0gfXlcC/dV6JI37h+93W9BRYXrSn0hrE64IoWgVkO9MSJgEzoWkxONgaQpICWg8vAN74wlA==} 513 + '@typescript-eslint/scope-manager@8.29.0': 514 + resolution: {integrity: sha512-aO1PVsq7Gm+tcghabUpzEnVSFMCU4/nYIgC2GOatJcllvWfnhrgW0ZEbnTxm36QsikmCN1K/6ZgM7fok2I7xNw==} 405 515 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 406 516 407 - '@typescript-eslint/type-utils@8.8.1': 408 - resolution: {integrity: sha512-qSVnpcbLP8CALORf0za+vjLYj1Wp8HSoiI8zYU5tHxRVj30702Z1Yw4cLwfNKhTPWp5+P+k1pjmD5Zd1nhxiZA==} 517 + '@typescript-eslint/type-utils@8.29.0': 518 + resolution: {integrity: sha512-ahaWQ42JAOx+NKEf5++WC/ua17q5l+j1GFrbbpVKzFL/tKVc0aYY8rVSYUpUvt2hUP1YBr7mwXzx+E/DfUWI9Q==} 409 519 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 410 520 peerDependencies: 411 - typescript: '*' 412 - peerDependenciesMeta: 413 - typescript: 414 - optional: true 521 + eslint: ^8.57.0 || ^9.0.0 522 + typescript: '>=4.8.4 <5.9.0' 415 523 416 - '@typescript-eslint/types@8.8.1': 417 - resolution: {integrity: sha512-WCcTP4SDXzMd23N27u66zTKMuEevH4uzU8C9jf0RO4E04yVHgQgW+r+TeVTNnO1KIfrL8ebgVVYYMMO3+jC55Q==} 524 + '@typescript-eslint/types@8.29.0': 525 + resolution: {integrity: sha512-wcJL/+cOXV+RE3gjCyl/V2G877+2faqvlgtso/ZRbTCnZazh0gXhe+7gbAnfubzN2bNsBtZjDvlh7ero8uIbzg==} 418 526 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 419 527 420 - '@typescript-eslint/typescript-estree@8.8.1': 421 - resolution: {integrity: sha512-A5d1R9p+X+1js4JogdNilDuuq+EHZdsH9MjTVxXOdVFfTJXunKJR/v+fNNyO4TnoOn5HqobzfRlc70NC6HTcdg==} 528 + '@typescript-eslint/typescript-estree@8.29.0': 529 + resolution: {integrity: sha512-yOfen3jE9ISZR/hHpU/bmNvTtBW1NjRbkSFdZOksL1N+ybPEE7UVGMwqvS6CP022Rp00Sb0tdiIkhSCe6NI8ow==} 422 530 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 423 531 peerDependencies: 424 - typescript: '*' 425 - peerDependenciesMeta: 426 - typescript: 427 - optional: true 532 + typescript: '>=4.8.4 <5.9.0' 428 533 429 - '@typescript-eslint/utils@8.8.1': 430 - resolution: {integrity: sha512-/QkNJDbV0bdL7H7d0/y0qBbV2HTtf0TIyjSDTvvmQEzeVx8jEImEbLuOA4EsvE8gIgqMitns0ifb5uQhMj8d9w==} 534 + '@typescript-eslint/utils@8.29.0': 535 + resolution: {integrity: sha512-gX/A0Mz9Bskm8avSWFcK0gP7cZpbY4AIo6B0hWYFCaIsz750oaiWR4Jr2CI+PQhfW1CpcQr9OlfPS+kMFegjXA==} 431 536 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 432 537 peerDependencies: 433 538 eslint: ^8.57.0 || ^9.0.0 539 + typescript: '>=4.8.4 <5.9.0' 434 540 435 - '@typescript-eslint/visitor-keys@8.8.1': 436 - resolution: {integrity: sha512-0/TdC3aeRAsW7MDvYRwEc1Uwm0TIBfzjPFgg60UU2Haj5qsCs9cc3zNgY71edqE3LbWfF/WoZQd3lJoDXFQpag==} 541 + '@typescript-eslint/visitor-keys@8.29.0': 542 + resolution: {integrity: sha512-Sne/pVz8ryR03NFK21VpN88dZ2FdQXOlq3VIklbrTYEt8yXtRFr9tvUhqvCeKjqYk5FSim37sHbooT6vzBTZcg==} 437 543 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 438 544 439 - '@zenfs/core@1.0.2': 440 - resolution: {integrity: sha512-LMTD4ntn6Ag1y+IeOSVykDDvYC12dsGFtsX8M/54OQrLs7v+YnX4bpo0o2osbm8XFmU2MTNMX/G3PLsvzgWzrg==} 441 - engines: {node: '>= 16'} 545 + '@xterm/xterm@5.5.0': 546 + resolution: {integrity: sha512-hqJHYaQb5OptNunnyAnkHyM8aCjZ1MEIDTQu1iIbbTD/xops91NB5yq1ZK/dC2JDbVWtF23zUtl9JE2NqwT87A==} 547 + 548 + '@zenfs/core@2.0.0': 549 + resolution: {integrity: sha512-wOKNFTY1DJ1vdLqKdU7M8cRh0nVYZcDVu7WHuk/3u49hrSwTZVm4PzGxJUjFd8O9Wi3U5nYTbZoN7RX5mS2ldA==} 550 + engines: {node: '>= 18'} 442 551 hasBin: true 443 552 444 - '@zenfs/dom@0.2.16': 445 - resolution: {integrity: sha512-6Ev+ol9hZIgQECNZR+xxjQ/a99EhhrWeiQttm/+U7YJK3HdTjiKfU39DsfGeH64vSqhpa5Vj+LWRx75SHkjw0Q==} 553 + '@zenfs/dom@1.1.6': 554 + resolution: {integrity: sha512-7SBTWgA0esuEv/TE+N/xk6W/XJf8uBF+LhlPNHQdXds0H7aOy/UYsWv/8glvARe+meDMMidoeWFLzUWoMXfjlA==} 446 555 engines: {node: '>= 18'} 447 556 peerDependencies: 448 - '@zenfs/core': ^1.0.0 557 + '@zenfs/core': ^2.0.0 558 + utilium: ^1.9.0 449 559 450 560 abort-controller@3.0.0: 451 561 resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} ··· 456 566 peerDependencies: 457 567 acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 458 568 459 - acorn@8.12.1: 460 - resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} 569 + acorn@8.14.1: 570 + resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} 461 571 engines: {node: '>=0.4.0'} 462 572 hasBin: true 463 573 ··· 468 578 resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 469 579 engines: {node: '>=8'} 470 580 581 + ansis@3.17.0: 582 + resolution: {integrity: sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==} 583 + engines: {node: '>=14'} 584 + 471 585 argparse@2.0.1: 472 586 resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 473 587 474 - array-buffer-byte-length@1.0.1: 475 - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} 588 + array-buffer-byte-length@1.0.2: 589 + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} 476 590 engines: {node: '>= 0.4'} 477 591 478 592 array-includes@3.1.8: ··· 483 597 resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} 484 598 engines: {node: '>= 0.4'} 485 599 486 - array.prototype.flat@1.3.2: 487 - resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} 600 + array.prototype.flat@1.3.3: 601 + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} 488 602 engines: {node: '>= 0.4'} 489 603 490 - array.prototype.flatmap@1.3.2: 491 - resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} 604 + array.prototype.flatmap@1.3.3: 605 + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} 492 606 engines: {node: '>= 0.4'} 493 607 494 608 array.prototype.tosorted@1.1.4: 495 609 resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} 496 610 engines: {node: '>= 0.4'} 497 611 498 - arraybuffer.prototype.slice@1.0.3: 499 - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} 612 + arraybuffer.prototype.slice@1.0.4: 613 + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} 500 614 engines: {node: '>= 0.4'} 501 615 502 616 astring@1.9.0: 503 617 resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} 504 618 hasBin: true 619 + 620 + async-function@1.0.0: 621 + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} 622 + engines: {node: '>= 0.4'} 505 623 506 624 available-typed-arrays@1.0.7: 507 625 resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} ··· 526 644 buffer@6.0.3: 527 645 resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} 528 646 529 - call-bind@1.0.7: 530 - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} 647 + cac@6.7.14: 648 + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 649 + engines: {node: '>=8'} 650 + 651 + call-bind-apply-helpers@1.0.2: 652 + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} 653 + engines: {node: '>= 0.4'} 654 + 655 + call-bind@1.0.8: 656 + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} 657 + engines: {node: '>= 0.4'} 658 + 659 + call-bound@1.0.4: 660 + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} 531 661 engines: {node: '>= 0.4'} 532 662 533 663 callsites@3.1.0: ··· 548 678 concat-map@0.0.1: 549 679 resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 550 680 551 - cross-spawn@7.0.3: 552 - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 681 + cross-spawn@7.0.6: 682 + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 553 683 engines: {node: '>= 8'} 554 684 555 - csstype@3.1.2: 556 - resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} 557 - 558 685 csstype@3.1.3: 559 686 resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 560 687 561 - data-view-buffer@1.0.1: 562 - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} 688 + data-view-buffer@1.0.2: 689 + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} 563 690 engines: {node: '>= 0.4'} 564 691 565 - data-view-byte-length@1.0.1: 566 - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} 692 + data-view-byte-length@1.0.2: 693 + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} 567 694 engines: {node: '>= 0.4'} 568 695 569 - data-view-byte-offset@1.0.0: 570 - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} 696 + data-view-byte-offset@1.0.1: 697 + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} 571 698 engines: {node: '>= 0.4'} 572 699 573 - debug@4.3.4: 574 - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 700 + debug@4.4.0: 701 + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} 575 702 engines: {node: '>=6.0'} 576 703 peerDependencies: 577 704 supports-color: '*' ··· 590 717 resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} 591 718 engines: {node: '>= 0.4'} 592 719 720 + defu@6.1.4: 721 + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} 722 + 723 + destr@2.0.4: 724 + resolution: {integrity: sha512-FCAorltMy7QwX0QU38jOkhrv20LBpsHA8ogzvMhhPHCCKVCaN6GxrB0GGaWEWBUYI4eEjjfJ95RdP6dk9IdMQA==} 725 + 593 726 doctrine@2.1.0: 594 727 resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} 595 728 engines: {node: '>=0.10.0'} 596 729 597 - es-abstract@1.23.3: 598 - resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} 730 + dunder-proto@1.0.1: 731 + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} 599 732 engines: {node: '>= 0.4'} 600 733 601 - es-define-property@1.0.0: 602 - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} 734 + es-abstract@1.23.9: 735 + resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} 736 + engines: {node: '>= 0.4'} 737 + 738 + es-define-property@1.0.1: 739 + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} 603 740 engines: {node: '>= 0.4'} 604 741 605 742 es-errors@1.3.0: 606 743 resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} 607 744 engines: {node: '>= 0.4'} 608 745 609 - es-iterator-helpers@1.1.0: 610 - resolution: {integrity: sha512-/SurEfycdyssORP/E+bj4sEu1CWw4EmLDsHynHwSXQ7utgbrMRWW195pTrCjFgFCddf/UkYm3oqKPRq5i8bJbw==} 746 + es-iterator-helpers@1.2.1: 747 + resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} 611 748 engines: {node: '>= 0.4'} 612 749 613 - es-object-atoms@1.0.0: 614 - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} 750 + es-object-atoms@1.1.1: 751 + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} 615 752 engines: {node: '>= 0.4'} 616 753 617 - es-set-tostringtag@2.0.3: 618 - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} 754 + es-set-tostringtag@2.1.0: 755 + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} 619 756 engines: {node: '>= 0.4'} 620 757 621 - es-shim-unscopables@1.0.2: 622 - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} 758 + es-shim-unscopables@1.1.0: 759 + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} 760 + engines: {node: '>= 0.4'} 623 761 624 - es-to-primitive@1.2.1: 625 - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} 762 + es-to-primitive@1.3.0: 763 + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} 626 764 engines: {node: '>= 0.4'} 627 765 628 766 esbuild-copy-static-files@0.1.0: ··· 643 781 peerDependencies: 644 782 eslint: '>=7.0.0' 645 783 646 - eslint-plugin-prettier@5.2.1: 647 - resolution: {integrity: sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==} 784 + eslint-plugin-prettier@5.2.6: 785 + resolution: {integrity: sha512-mUcf7QG2Tjk7H055Jk0lGBjbgDnfrvqjhXh9t2xLMSCjZVcw9Rb1V6sVNXO0th3jgeO7zllWPTNRil3JW94TnQ==} 648 786 engines: {node: ^14.18.0 || >=16.0.0} 649 787 peerDependencies: 650 788 '@types/eslint': '>=8.0.0' 651 789 eslint: '>=8.0.0' 652 - eslint-config-prettier: '*' 790 + eslint-config-prettier: '>= 7.0.0 <10.0.0 || >=10.1.0' 653 791 prettier: '>=3.0.0' 654 792 peerDependenciesMeta: 655 793 '@types/eslint': ··· 657 795 eslint-config-prettier: 658 796 optional: true 659 797 660 - eslint-plugin-react@7.37.1: 661 - resolution: {integrity: sha512-xwTnwDqzbDRA8uJ7BMxPs/EXRB3i8ZfnOIp8BsxEQkT0nHPp+WWceqGgo6rKb9ctNi8GJLDT4Go5HAWELa/WMg==} 798 + eslint-plugin-react@7.37.5: 799 + resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} 662 800 engines: {node: '>=4'} 663 801 peerDependencies: 664 802 eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 665 803 666 - eslint-scope@8.1.0: 667 - resolution: {integrity: sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw==} 804 + eslint-scope@8.3.0: 805 + resolution: {integrity: sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==} 668 806 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 669 807 670 808 eslint-visitor-keys@3.4.3: 671 809 resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 672 810 engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 673 811 674 - eslint-visitor-keys@4.1.0: 675 - resolution: {integrity: sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==} 812 + eslint-visitor-keys@4.2.0: 813 + resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} 676 814 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 677 815 678 - eslint@9.12.0: 679 - resolution: {integrity: sha512-UVIOlTEWxwIopRL1wgSQYdnVDcEvs2wyaO6DGo5mXqe3r16IoCNWkR29iHhyaP4cICWjbgbmFUGAhh0GJRuGZw==} 816 + eslint@9.23.0: 817 + resolution: {integrity: sha512-jV7AbNoFPAY1EkFYpLq5bslU9NLNO8xnEeQXwErNibVryjk67wHVmddTBilc5srIttJDBrB0eMHKZBFbSIABCw==} 680 818 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 681 819 hasBin: true 682 820 peerDependencies: ··· 685 823 jiti: 686 824 optional: true 687 825 688 - espree@10.2.0: 689 - resolution: {integrity: sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==} 826 + espree@10.3.0: 827 + resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} 690 828 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 691 829 692 - esquery@1.5.0: 693 - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} 830 + esquery@1.6.0: 831 + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} 694 832 engines: {node: '>=0.10'} 695 833 696 834 esrecurse@4.3.0: ··· 738 876 fastq@1.17.1: 739 877 resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} 740 878 879 + fdir@6.4.3: 880 + resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} 881 + peerDependencies: 882 + picomatch: ^3 || ^4 883 + peerDependenciesMeta: 884 + picomatch: 885 + optional: true 886 + 741 887 file-entry-cache@8.0.0: 742 888 resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} 743 889 engines: {node: '>=16.0.0'} ··· 746 892 resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 747 893 engines: {node: '>=8'} 748 894 895 + find-up-simple@1.0.1: 896 + resolution: {integrity: sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==} 897 + engines: {node: '>=18'} 898 + 749 899 find-up@5.0.0: 750 900 resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 751 901 engines: {node: '>=10'} ··· 757 907 flatted@3.2.9: 758 908 resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} 759 909 760 - for-each@0.3.3: 761 - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} 910 + for-each@0.3.5: 911 + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} 912 + engines: {node: '>= 0.4'} 762 913 763 914 function-bind@1.1.2: 764 915 resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 765 916 766 - function.prototype.name@1.1.6: 767 - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} 917 + function.prototype.name@1.1.8: 918 + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} 768 919 engines: {node: '>= 0.4'} 769 920 770 921 functions-have-names@1.2.3: 771 922 resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} 772 923 773 - get-intrinsic@1.2.4: 774 - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} 924 + fzf@0.5.2: 925 + resolution: {integrity: sha512-Tt4kuxLXFKHy8KT40zwsUPUkg1CrsgY25FxA2U/j/0WgEDCk3ddc/zLTCCcbSHX9FcKtLuVaDGtGE/STWC+j3Q==} 926 + 927 + get-intrinsic@1.3.0: 928 + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} 775 929 engines: {node: '>= 0.4'} 776 930 777 - get-symbol-description@1.0.2: 778 - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} 931 + get-proto@1.0.1: 932 + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} 933 + engines: {node: '>= 0.4'} 934 + 935 + get-symbol-description@1.1.0: 936 + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} 779 937 engines: {node: '>= 0.4'} 780 938 781 939 glob-parent@5.1.2: ··· 794 952 resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} 795 953 engines: {node: '>= 0.4'} 796 954 797 - gopd@1.0.1: 798 - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} 955 + gopd@1.2.0: 956 + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} 957 + engines: {node: '>= 0.4'} 799 958 800 959 graphemer@1.4.0: 801 960 resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 802 961 803 - has-bigints@1.0.2: 804 - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} 962 + has-bigints@1.1.0: 963 + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} 964 + engines: {node: '>= 0.4'} 805 965 806 966 has-flag@4.0.0: 807 967 resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} ··· 810 970 has-property-descriptors@1.0.2: 811 971 resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} 812 972 813 - has-proto@1.0.3: 814 - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} 973 + has-proto@1.2.0: 974 + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} 815 975 engines: {node: '>= 0.4'} 816 976 817 - has-symbols@1.0.3: 818 - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} 977 + has-symbols@1.1.0: 978 + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} 819 979 engines: {node: '>= 0.4'} 820 980 821 981 has-tostringtag@1.0.2: ··· 834 994 ieee754@1.2.1: 835 995 resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} 836 996 837 - ignore@5.3.0: 838 - resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} 839 - engines: {node: '>= 4'} 840 - 841 997 ignore@5.3.2: 842 998 resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 843 999 engines: {node: '>= 4'} ··· 850 1006 resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 851 1007 engines: {node: '>=0.8.19'} 852 1008 853 - internal-slot@1.0.7: 854 - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} 1009 + internal-slot@1.1.0: 1010 + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} 855 1011 engines: {node: '>= 0.4'} 856 1012 857 - is-array-buffer@3.0.4: 858 - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} 1013 + is-array-buffer@3.0.5: 1014 + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} 859 1015 engines: {node: '>= 0.4'} 860 1016 861 - is-async-function@2.0.0: 862 - resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} 1017 + is-async-function@2.1.1: 1018 + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} 863 1019 engines: {node: '>= 0.4'} 864 1020 865 - is-bigint@1.0.4: 866 - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} 1021 + is-bigint@1.1.0: 1022 + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} 1023 + engines: {node: '>= 0.4'} 867 1024 868 - is-boolean-object@1.1.2: 869 - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} 1025 + is-boolean-object@1.2.2: 1026 + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} 870 1027 engines: {node: '>= 0.4'} 871 1028 872 1029 is-callable@1.2.7: 873 1030 resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} 874 1031 engines: {node: '>= 0.4'} 875 1032 876 - is-core-module@2.15.1: 877 - resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} 1033 + is-core-module@2.16.1: 1034 + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} 878 1035 engines: {node: '>= 0.4'} 879 1036 880 - is-data-view@1.0.1: 881 - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} 1037 + is-data-view@1.0.2: 1038 + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} 882 1039 engines: {node: '>= 0.4'} 883 1040 884 - is-date-object@1.0.5: 885 - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} 1041 + is-date-object@1.1.0: 1042 + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} 886 1043 engines: {node: '>= 0.4'} 887 1044 888 1045 is-extglob@2.1.1: 889 1046 resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 890 1047 engines: {node: '>=0.10.0'} 891 1048 892 - is-finalizationregistry@1.0.2: 893 - resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} 1049 + is-finalizationregistry@1.1.1: 1050 + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} 1051 + engines: {node: '>= 0.4'} 894 1052 895 - is-generator-function@1.0.10: 896 - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} 1053 + is-generator-function@1.1.0: 1054 + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} 897 1055 engines: {node: '>= 0.4'} 898 1056 899 1057 is-glob@4.0.3: ··· 904 1062 resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} 905 1063 engines: {node: '>= 0.4'} 906 1064 907 - is-negative-zero@2.0.3: 908 - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} 909 - engines: {node: '>= 0.4'} 910 - 911 - is-number-object@1.0.7: 912 - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} 1065 + is-number-object@1.1.1: 1066 + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} 913 1067 engines: {node: '>= 0.4'} 914 1068 915 1069 is-number@7.0.0: 916 1070 resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 917 1071 engines: {node: '>=0.12.0'} 918 1072 919 - is-regex@1.1.4: 920 - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} 1073 + is-regex@1.2.1: 1074 + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} 921 1075 engines: {node: '>= 0.4'} 922 1076 923 1077 is-set@2.0.3: 924 1078 resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} 925 1079 engines: {node: '>= 0.4'} 926 1080 927 - is-shared-array-buffer@1.0.3: 928 - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} 1081 + is-shared-array-buffer@1.0.4: 1082 + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} 929 1083 engines: {node: '>= 0.4'} 930 1084 931 - is-string@1.0.7: 932 - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} 1085 + is-string@1.1.1: 1086 + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} 933 1087 engines: {node: '>= 0.4'} 934 1088 935 - is-symbol@1.0.4: 936 - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} 1089 + is-symbol@1.1.1: 1090 + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} 937 1091 engines: {node: '>= 0.4'} 938 1092 939 - is-typed-array@1.1.13: 940 - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} 1093 + is-typed-array@1.1.15: 1094 + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} 941 1095 engines: {node: '>= 0.4'} 942 1096 943 1097 is-weakmap@2.0.2: 944 1098 resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} 945 1099 engines: {node: '>= 0.4'} 946 1100 947 - is-weakref@1.0.2: 948 - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} 1101 + is-weakref@1.1.1: 1102 + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} 1103 + engines: {node: '>= 0.4'} 949 1104 950 - is-weakset@2.0.3: 951 - resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} 1105 + is-weakset@2.0.4: 1106 + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} 952 1107 engines: {node: '>= 0.4'} 953 1108 954 1109 isarray@2.0.5: ··· 957 1112 isexe@2.0.0: 958 1113 resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 959 1114 960 - iterator.prototype@1.1.3: 961 - resolution: {integrity: sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==} 1115 + iterator.prototype@1.1.5: 1116 + resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} 962 1117 engines: {node: '>= 0.4'} 963 1118 1119 + jiti@2.4.2: 1120 + resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} 1121 + hasBin: true 1122 + 964 1123 js-tokens@4.0.0: 965 1124 resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 966 1125 ··· 999 1158 resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} 1000 1159 hasBin: true 1001 1160 1161 + math-intrinsics@1.1.0: 1162 + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} 1163 + engines: {node: '>= 0.4'} 1164 + 1002 1165 merge2@1.4.1: 1003 1166 resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 1004 1167 engines: {node: '>= 8'} ··· 1014 1177 resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 1015 1178 engines: {node: '>=8.6'} 1016 1179 1180 + mimic-function@5.0.1: 1181 + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} 1182 + engines: {node: '>=18'} 1183 + 1017 1184 minimatch@3.1.2: 1018 1185 resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1019 1186 ··· 1021 1188 resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 1022 1189 engines: {node: '>=16 || 14 >=14.17'} 1023 1190 1024 - ms@2.1.2: 1025 - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 1191 + ms@2.1.3: 1192 + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1026 1193 1027 1194 nanotar@0.1.1: 1028 1195 resolution: {integrity: sha512-AiJsGsSF3O0havL1BydvI4+wR76sKT+okKRwWIaK96cZUnXqH0uNBOsHlbwZq3+m2BR1VKqHDVudl3gO4mYjpQ==} ··· 1030 1197 natural-compare@1.4.0: 1031 1198 resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 1032 1199 1200 + node-fetch-native@1.6.6: 1201 + resolution: {integrity: sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==} 1202 + 1033 1203 object-assign@4.1.1: 1034 1204 resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 1035 1205 engines: {node: '>=0.10.0'} 1036 1206 1037 - object-inspect@1.13.2: 1038 - resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} 1207 + object-inspect@1.13.4: 1208 + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} 1039 1209 engines: {node: '>= 0.4'} 1040 1210 1041 1211 object-keys@1.1.1: 1042 1212 resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} 1043 1213 engines: {node: '>= 0.4'} 1044 1214 1045 - object.assign@4.1.5: 1046 - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} 1215 + object.assign@4.1.7: 1216 + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} 1047 1217 engines: {node: '>= 0.4'} 1048 1218 1049 - object.entries@1.1.8: 1050 - resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} 1219 + object.entries@1.1.9: 1220 + resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} 1051 1221 engines: {node: '>= 0.4'} 1052 1222 1053 1223 object.fromentries@2.0.8: 1054 1224 resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} 1055 1225 engines: {node: '>= 0.4'} 1056 1226 1057 - object.values@1.2.0: 1058 - resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} 1227 + object.values@1.2.1: 1228 + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} 1059 1229 engines: {node: '>= 0.4'} 1230 + 1231 + ofetch@1.4.1: 1232 + resolution: {integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==} 1233 + 1234 + onetime@7.0.0: 1235 + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} 1236 + engines: {node: '>=18'} 1060 1237 1061 1238 optionator@0.9.3: 1062 1239 resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} 1063 1240 engines: {node: '>= 0.8.0'} 1064 1241 1242 + own-keys@1.0.1: 1243 + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} 1244 + engines: {node: '>= 0.4'} 1245 + 1065 1246 p-limit@3.1.0: 1066 1247 resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 1067 1248 engines: {node: '>=10'} ··· 1069 1250 p-locate@5.0.0: 1070 1251 resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 1071 1252 engines: {node: '>=10'} 1253 + 1254 + package-manager-detector@1.1.0: 1255 + resolution: {integrity: sha512-Y8f9qUlBzW8qauJjd/eu6jlpJZsuPJm2ZAV0cDVd420o4EdpH5RPdoCv+60/TdJflGatr4sDfpAL6ArWZbM5tA==} 1072 1256 1073 1257 parent-module@1.0.1: 1074 1258 resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} ··· 1085 1269 path-parse@1.0.7: 1086 1270 resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1087 1271 1272 + pathe@2.0.3: 1273 + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} 1274 + 1088 1275 picomatch@2.3.1: 1089 1276 resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1090 1277 engines: {node: '>=8.6'} 1091 1278 1092 - possible-typed-array-names@1.0.0: 1093 - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} 1279 + picomatch@4.0.2: 1280 + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} 1281 + engines: {node: '>=12'} 1282 + 1283 + pnpm-workspace-yaml@0.3.1: 1284 + resolution: {integrity: sha512-3nW5RLmREmZ8Pm8MbPsO2RM+99RRjYd25ynj3NV0cFsN7CcEl4sDFzgoFmSyduFwxFQ2Qbu3y2UdCh6HlyUOeA==} 1285 + 1286 + possible-typed-array-names@1.1.0: 1287 + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} 1094 1288 engines: {node: '>= 0.4'} 1095 1289 1096 1290 prelude-ls@1.2.1: ··· 1117 1311 resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 1118 1312 engines: {node: '>=6'} 1119 1313 1314 + quansync@0.2.10: 1315 + resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==} 1316 + 1120 1317 queue-microtask@1.2.3: 1121 1318 resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1122 1319 ··· 1127 1324 resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} 1128 1325 engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1129 1326 1130 - reflect.getprototypeof@1.0.6: 1131 - resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} 1327 + reflect.getprototypeof@1.0.10: 1328 + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} 1132 1329 engines: {node: '>= 0.4'} 1133 1330 1134 - regexp.prototype.flags@1.5.3: 1135 - resolution: {integrity: sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==} 1331 + regexp.prototype.flags@1.5.4: 1332 + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} 1136 1333 engines: {node: '>= 0.4'} 1137 1334 1138 1335 resolve-from@4.0.0: ··· 1143 1340 resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} 1144 1341 hasBin: true 1145 1342 1343 + restore-cursor@5.1.0: 1344 + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} 1345 + engines: {node: '>=18'} 1346 + 1146 1347 reusify@1.0.4: 1147 1348 resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 1148 1349 engines: {iojs: '>=1.0.0', node: '>=0.10.0'} ··· 1150 1351 run-parallel@1.2.0: 1151 1352 resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1152 1353 1153 - safe-array-concat@1.1.2: 1154 - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} 1354 + safe-array-concat@1.1.3: 1355 + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} 1155 1356 engines: {node: '>=0.4'} 1156 1357 1157 - safe-buffer@5.1.2: 1158 - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} 1159 - 1160 1358 safe-buffer@5.2.1: 1161 1359 resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 1162 1360 1163 - safe-regex-test@1.0.3: 1164 - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} 1361 + safe-push-apply@1.0.0: 1362 + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} 1363 + engines: {node: '>= 0.4'} 1364 + 1365 + safe-regex-test@1.1.0: 1366 + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} 1165 1367 engines: {node: '>= 0.4'} 1166 1368 1167 1369 semver@6.3.1: 1168 1370 resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 1169 1371 hasBin: true 1170 1372 1171 - semver@7.6.3: 1172 - resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} 1373 + semver@7.7.1: 1374 + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} 1173 1375 engines: {node: '>=10'} 1174 1376 hasBin: true 1175 1377 ··· 1181 1383 resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} 1182 1384 engines: {node: '>= 0.4'} 1183 1385 1386 + set-proto@1.0.0: 1387 + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} 1388 + engines: {node: '>= 0.4'} 1389 + 1184 1390 shebang-command@2.0.0: 1185 1391 resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1186 1392 engines: {node: '>=8'} ··· 1189 1395 resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1190 1396 engines: {node: '>=8'} 1191 1397 1192 - side-channel@1.0.6: 1193 - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} 1398 + side-channel-list@1.0.0: 1399 + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} 1400 + engines: {node: '>= 0.4'} 1401 + 1402 + side-channel-map@1.0.1: 1403 + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} 1404 + engines: {node: '>= 0.4'} 1405 + 1406 + side-channel-weakmap@1.0.2: 1407 + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} 1194 1408 engines: {node: '>= 0.4'} 1195 1409 1410 + side-channel@1.1.0: 1411 + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} 1412 + engines: {node: '>= 0.4'} 1413 + 1414 + signal-exit@4.1.0: 1415 + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 1416 + engines: {node: '>=14'} 1417 + 1196 1418 standalone-electron-types@1.0.0: 1197 1419 resolution: {integrity: sha512-0HOi/tlTz3mjWhsAz4uRbpQcHMZ+ifj1JzWW9nugykOHClBBG77ps8QinrzX1eow4Iw2pnC+RFaSYRgufF4BOg==} 1198 1420 1199 - string.prototype.matchall@4.0.11: 1200 - resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} 1421 + string.prototype.matchall@4.0.12: 1422 + resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} 1201 1423 engines: {node: '>= 0.4'} 1202 1424 1203 1425 string.prototype.repeat@1.0.0: 1204 1426 resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} 1205 1427 1206 - string.prototype.trim@1.2.9: 1207 - resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} 1428 + string.prototype.trim@1.2.10: 1429 + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} 1208 1430 engines: {node: '>= 0.4'} 1209 1431 1210 - string.prototype.trimend@1.0.8: 1211 - resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} 1432 + string.prototype.trimend@1.0.9: 1433 + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} 1434 + engines: {node: '>= 0.4'} 1212 1435 1213 1436 string.prototype.trimstart@1.0.8: 1214 1437 resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} ··· 1229 1452 resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1230 1453 engines: {node: '>= 0.4'} 1231 1454 1232 - synckit@0.9.2: 1233 - resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==} 1455 + synckit@0.11.1: 1456 + resolution: {integrity: sha512-fWZqNBZNNFp/7mTUy1fSsydhKsAKJ+u90Nk7kOK5Gcq9vObaqLBLjWFDBkyVU9Vvc6Y71VbOevMuGhqv02bT+Q==} 1234 1457 engines: {node: ^14.18.0 || >=16.0.0} 1235 1458 1236 - text-table@0.2.0: 1237 - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} 1459 + taze@19.0.4: 1460 + resolution: {integrity: sha512-bviyNotzqcIWpVBCC4QYVb2yupzKyUDGQi2m/8GERdiPaudVMtgAqaE98+x0cDDaByYRMJCyhQWM04ikUL6+kQ==} 1461 + hasBin: true 1462 + 1463 + tinyexec@1.0.1: 1464 + resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==} 1465 + 1466 + tinyglobby@0.2.12: 1467 + resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} 1468 + engines: {node: '>=12.0.0'} 1238 1469 1239 1470 to-regex-range@5.0.1: 1240 1471 resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1241 1472 engines: {node: '>=8.0'} 1242 1473 1243 - ts-api-utils@1.3.0: 1244 - resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} 1245 - engines: {node: '>=16'} 1474 + ts-api-utils@2.1.0: 1475 + resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} 1476 + engines: {node: '>=18.12'} 1246 1477 peerDependencies: 1247 - typescript: '>=4.2.0' 1478 + typescript: '>=4.8.4' 1248 1479 1249 - tslib@2.7.0: 1250 - resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} 1480 + tslib@2.8.1: 1481 + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} 1251 1482 1252 1483 type-check@0.4.0: 1253 1484 resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 1254 1485 engines: {node: '>= 0.8.0'} 1255 1486 1256 - typed-array-buffer@1.0.2: 1257 - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} 1487 + typed-array-buffer@1.0.3: 1488 + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} 1258 1489 engines: {node: '>= 0.4'} 1259 1490 1260 - typed-array-byte-length@1.0.1: 1261 - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} 1491 + typed-array-byte-length@1.0.3: 1492 + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} 1262 1493 engines: {node: '>= 0.4'} 1263 1494 1264 - typed-array-byte-offset@1.0.2: 1265 - resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} 1495 + typed-array-byte-offset@1.0.4: 1496 + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} 1266 1497 engines: {node: '>= 0.4'} 1267 1498 1268 - typed-array-length@1.0.6: 1269 - resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} 1499 + typed-array-length@1.0.7: 1500 + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} 1270 1501 engines: {node: '>= 0.4'} 1271 1502 1272 - typescript-eslint@8.8.1: 1273 - resolution: {integrity: sha512-R0dsXFt6t4SAFjUSKFjMh4pXDtq04SsFKCVGDP3ZOzNP7itF0jBcZYU4fMsZr4y7O7V7Nc751dDeESbe4PbQMQ==} 1503 + typescript-eslint@8.29.0: 1504 + resolution: {integrity: sha512-ep9rVd9B4kQsZ7ZnWCVxUE/xDLUUUsRzE0poAeNu+4CkFErLfuvPt/qtm2EpnSyfvsR0S6QzDFSrPCFBwf64fg==} 1274 1505 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1275 1506 peerDependencies: 1276 - typescript: '*' 1277 - peerDependenciesMeta: 1278 - typescript: 1279 - optional: true 1507 + eslint: ^8.57.0 || ^9.0.0 1508 + typescript: '>=4.8.4 <5.9.0' 1280 1509 1281 - typescript@5.3.2: 1282 - resolution: {integrity: sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==} 1510 + typescript@5.8.2: 1511 + resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} 1283 1512 engines: {node: '>=14.17'} 1284 1513 hasBin: true 1285 1514 1286 - unbox-primitive@1.0.2: 1287 - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} 1515 + ufo@1.5.4: 1516 + resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} 1517 + 1518 + unbox-primitive@1.1.0: 1519 + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} 1520 + engines: {node: '>= 0.4'} 1521 + 1522 + unconfig@7.3.1: 1523 + resolution: {integrity: sha512-LH5WL+un92tGAzWS87k7LkAfwpMdm7V0IXG2FxEjZz/QxiIW5J5LkcrKQThj0aRz6+h/lFmKI9EUXmK/T0bcrw==} 1524 + 1525 + undici-types@6.20.0: 1526 + resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} 1288 1527 1289 - undici-types@6.19.8: 1290 - resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} 1528 + undici-types@6.21.0: 1529 + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} 1291 1530 1292 1531 uri-js@4.4.1: 1293 1532 resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1294 1533 1295 - utilium@0.7.1: 1296 - resolution: {integrity: sha512-2ocvTkI7U8LERmwxL0LhFUvEfN66UqcjF6tMiURvUwSyU7U1QC9gST+3iSUSiGccFfnP3f2EXwHNXOnOzx+lAg==} 1534 + utilium@1.10.1: 1535 + resolution: {integrity: sha512-GQINDTb/ocyz4acQj3GXAe0wipYxws6L+9ouqaq10KlInTk9DGvW9TJd0pYa/Xu3cppNnZuB4T/sBuSXpcN2ng==} 1297 1536 1298 - which-boxed-primitive@1.0.2: 1299 - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} 1537 + which-boxed-primitive@1.1.1: 1538 + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} 1539 + engines: {node: '>= 0.4'} 1300 1540 1301 - which-builtin-type@1.1.4: 1302 - resolution: {integrity: sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==} 1541 + which-builtin-type@1.2.1: 1542 + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} 1303 1543 engines: {node: '>= 0.4'} 1304 1544 1305 1545 which-collection@1.0.2: 1306 1546 resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} 1307 1547 engines: {node: '>= 0.4'} 1308 1548 1309 - which-typed-array@1.1.15: 1310 - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} 1549 + which-typed-array@1.1.19: 1550 + resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} 1311 1551 engines: {node: '>= 0.4'} 1312 1552 1313 1553 which@2.0.2: ··· 1315 1555 engines: {node: '>= 8'} 1316 1556 hasBin: true 1317 1557 1558 + yaml@2.7.1: 1559 + resolution: {integrity: sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==} 1560 + engines: {node: '>= 14'} 1561 + hasBin: true 1562 + 1318 1563 yocto-queue@0.1.0: 1319 1564 resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1320 1565 engines: {node: '>=10'} 1321 1566 1567 + zustand@5.0.3: 1568 + resolution: {integrity: sha512-14fwWQtU3pH4dE0dOpdMiWjddcH+QzKIgk1cl8epwSE7yag43k/AD/m4L6+K7DytAOr9gGBe3/EXj9g7cdostg==} 1569 + engines: {node: '>=12.20.0'} 1570 + peerDependencies: 1571 + '@types/react': '>=18.0.0' 1572 + immer: '>=9.0.6' 1573 + react: '>=18.0.0' 1574 + use-sync-external-store: '>=1.2.0' 1575 + peerDependenciesMeta: 1576 + '@types/react': 1577 + optional: true 1578 + immer: 1579 + optional: true 1580 + react: 1581 + optional: true 1582 + use-sync-external-store: 1583 + optional: true 1584 + 1322 1585 snapshots: 1323 1586 1324 1587 '@aashutoshrathi/word-wrap@1.2.6': {} 1588 + 1589 + '@antfu/ni@24.3.0': 1590 + dependencies: 1591 + ansis: 3.17.0 1592 + fzf: 0.5.2 1593 + package-manager-detector: 1.1.0 1594 + tinyexec: 1.0.1 1325 1595 1326 1596 '@esbuild/android-arm64@0.19.3': 1327 1597 optional: true ··· 1389 1659 '@esbuild/win32-x64@0.19.3': 1390 1660 optional: true 1391 1661 1392 - '@eslint-community/eslint-utils@4.4.0(eslint@9.12.0)': 1662 + '@eslint-community/eslint-utils@4.5.1(eslint@9.23.0(jiti@2.4.2))': 1393 1663 dependencies: 1394 - eslint: 9.12.0 1664 + eslint: 9.23.0(jiti@2.4.2) 1395 1665 eslint-visitor-keys: 3.4.3 1396 1666 1397 - '@eslint-community/regexpp@4.11.1': {} 1667 + '@eslint-community/regexpp@4.12.1': {} 1398 1668 1399 - '@eslint/config-array@0.18.0': 1669 + '@eslint/config-array@0.19.2': 1400 1670 dependencies: 1401 - '@eslint/object-schema': 2.1.4 1402 - debug: 4.3.4 1671 + '@eslint/object-schema': 2.1.6 1672 + debug: 4.4.0 1403 1673 minimatch: 3.1.2 1404 1674 transitivePeerDependencies: 1405 1675 - supports-color 1406 1676 1407 - '@eslint/core@0.6.0': {} 1677 + '@eslint/config-helpers@0.2.1': {} 1408 1678 1409 - '@eslint/eslintrc@3.1.0': 1679 + '@eslint/core@0.12.0': 1680 + dependencies: 1681 + '@types/json-schema': 7.0.15 1682 + 1683 + '@eslint/core@0.13.0': 1684 + dependencies: 1685 + '@types/json-schema': 7.0.15 1686 + 1687 + '@eslint/eslintrc@3.3.1': 1410 1688 dependencies: 1411 1689 ajv: 6.12.6 1412 - debug: 4.3.4 1413 - espree: 10.2.0 1690 + debug: 4.4.0 1691 + espree: 10.3.0 1414 1692 globals: 14.0.0 1415 - ignore: 5.3.0 1693 + ignore: 5.3.2 1416 1694 import-fresh: 3.3.0 1417 1695 js-yaml: 4.1.0 1418 1696 minimatch: 3.1.2 ··· 1420 1698 transitivePeerDependencies: 1421 1699 - supports-color 1422 1700 1423 - '@eslint/js@9.12.0': {} 1701 + '@eslint/js@9.23.0': {} 1424 1702 1425 - '@eslint/object-schema@2.1.4': {} 1703 + '@eslint/object-schema@2.1.6': {} 1426 1704 1427 - '@eslint/plugin-kit@0.2.0': 1705 + '@eslint/plugin-kit@0.2.8': 1428 1706 dependencies: 1707 + '@eslint/core': 0.13.0 1429 1708 levn: 0.4.1 1430 1709 1431 - '@humanfs/core@0.19.0': {} 1710 + '@humanfs/core@0.19.1': {} 1432 1711 1433 - '@humanfs/node@0.16.5': 1712 + '@humanfs/node@0.16.6': 1434 1713 dependencies: 1435 - '@humanfs/core': 0.19.0 1714 + '@humanfs/core': 0.19.1 1436 1715 '@humanwhocodes/retry': 0.3.1 1437 1716 1438 1717 '@humanwhocodes/module-importer@1.0.1': {} 1439 1718 1440 1719 '@humanwhocodes/retry@0.3.1': {} 1441 1720 1442 - '@moonlight-mod/eslint-config@https://codeload.github.com/moonlight-mod/eslint-config/tar.gz/e262ac24e1a0955a9b3e0d66da247a0a8c0446c9(eslint@9.12.0)(prettier@3.1.0)(typescript@5.3.2)': 1721 + '@humanwhocodes/retry@0.4.2': {} 1722 + 1723 + '@moonlight-mod/eslint-config@https://codeload.github.com/moonlight-mod/eslint-config/tar.gz/e262ac24e1a0955a9b3e0d66da247a0a8c0446c9(@types/eslint@9.6.1)(eslint@9.23.0(jiti@2.4.2))(prettier@3.1.0)(typescript@5.8.2)': 1443 1724 dependencies: 1444 - '@eslint/js': 9.12.0 1445 - eslint: 9.12.0 1446 - eslint-config-prettier: 9.1.0(eslint@9.12.0) 1447 - eslint-plugin-prettier: 5.2.1(eslint-config-prettier@9.1.0(eslint@9.12.0))(eslint@9.12.0)(prettier@3.1.0) 1448 - eslint-plugin-react: 7.37.1(eslint@9.12.0) 1449 - typescript: 5.3.2 1450 - typescript-eslint: 8.8.1(eslint@9.12.0)(typescript@5.3.2) 1725 + '@eslint/js': 9.23.0 1726 + eslint: 9.23.0(jiti@2.4.2) 1727 + eslint-config-prettier: 9.1.0(eslint@9.23.0(jiti@2.4.2)) 1728 + eslint-plugin-prettier: 5.2.6(@types/eslint@9.6.1)(eslint-config-prettier@9.1.0(eslint@9.23.0(jiti@2.4.2)))(eslint@9.23.0(jiti@2.4.2))(prettier@3.1.0) 1729 + eslint-plugin-react: 7.37.5(eslint@9.23.0(jiti@2.4.2)) 1730 + typescript: 5.8.2 1731 + typescript-eslint: 8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2) 1451 1732 transitivePeerDependencies: 1452 1733 - '@types/eslint' 1453 1734 - prettier 1454 1735 - supports-color 1455 1736 1456 - '@moonlight-mod/lunast@1.0.0': 1737 + '@moonlight-mod/lunast@1.0.1': 1457 1738 dependencies: 1458 1739 astring: 1.9.0 1459 1740 estree-toolkit: 1.7.8 1460 1741 meriyah: 6.0.1 1461 1742 1462 - '@moonlight-mod/mappings@1.0.10(@moonlight-mod/lunast@1.0.0)(@moonlight-mod/moonmap@1.0.3)': 1743 + '@moonlight-mod/mappings@1.1.25(@moonlight-mod/lunast@1.0.1)(@moonlight-mod/moonmap@1.0.5)': 1463 1744 dependencies: 1464 - '@moonlight-mod/lunast': 1.0.0 1465 - '@moonlight-mod/moonmap': 1.0.3 1745 + '@moonlight-mod/lunast': 1.0.1 1746 + '@moonlight-mod/moonmap': 1.0.5 1747 + '@types/chroma-js': 3.1.0 1466 1748 '@types/flux': 3.1.14 1467 - '@types/react': 18.3.10 1749 + '@types/highlightjs': 9.12.6 1750 + '@types/lodash': 4.17.14 1751 + '@types/platform': 1.3.6 1752 + '@types/react': 18.3.20 1468 1753 csstype: 3.1.3 1754 + zustand: 5.0.3(@types/react@18.3.20) 1755 + transitivePeerDependencies: 1756 + - immer 1757 + - react 1758 + - use-sync-external-store 1469 1759 1470 - '@moonlight-mod/moonmap@1.0.3': {} 1760 + '@moonlight-mod/moonmap@1.0.5': {} 1471 1761 1472 1762 '@nodelib/fs.scandir@2.1.5': 1473 1763 dependencies: ··· 1481 1771 '@nodelib/fs.scandir': 2.1.5 1482 1772 fastq: 1.17.1 1483 1773 1484 - '@pkgr/core@0.1.1': {} 1774 + '@pkgr/core@0.2.0': {} 1775 + 1776 + '@quansync/fs@0.1.2': 1777 + dependencies: 1778 + quansync: 0.2.10 1779 + 1780 + '@types/chroma-js@3.1.0': {} 1781 + 1782 + '@types/chrome@0.0.313': 1783 + dependencies: 1784 + '@types/filesystem': 0.0.36 1785 + '@types/har-format': 1.2.16 1786 + 1787 + '@types/eslint@9.6.1': 1788 + dependencies: 1789 + '@types/estree': 1.0.7 1790 + '@types/json-schema': 7.0.15 1791 + optional: true 1485 1792 1486 1793 '@types/estree-jsx@1.0.5': 1487 1794 dependencies: 1488 1795 '@types/estree': 1.0.6 1489 1796 1490 1797 '@types/estree@1.0.6': {} 1798 + 1799 + '@types/estree@1.0.7': 1800 + optional: true 1491 1801 1492 1802 '@types/fbemitter@2.0.35': {} 1493 1803 1804 + '@types/filesystem@0.0.36': 1805 + dependencies: 1806 + '@types/filewriter': 0.0.33 1807 + 1808 + '@types/filewriter@0.0.33': {} 1809 + 1494 1810 '@types/flux@3.1.14': 1495 1811 dependencies: 1496 1812 '@types/fbemitter': 2.0.35 1497 - '@types/react': 18.3.10 1813 + '@types/react': 18.3.20 1814 + 1815 + '@types/har-format@1.2.16': {} 1816 + 1817 + '@types/highlightjs@9.12.6': {} 1498 1818 1499 1819 '@types/json-schema@7.0.15': {} 1500 1820 1821 + '@types/lodash@4.17.14': {} 1822 + 1501 1823 '@types/node@18.17.17': {} 1502 1824 1503 - '@types/node@20.16.10': 1825 + '@types/node@22.13.6': 1826 + dependencies: 1827 + undici-types: 6.20.0 1828 + 1829 + '@types/node@22.14.0': 1504 1830 dependencies: 1505 - undici-types: 6.19.8 1831 + undici-types: 6.21.0 1832 + 1833 + '@types/platform@1.3.6': {} 1506 1834 1507 1835 '@types/prop-types@15.7.13': {} 1508 1836 1509 - '@types/react@18.3.10': 1837 + '@types/react@18.3.20': 1510 1838 dependencies: 1511 1839 '@types/prop-types': 15.7.13 1512 1840 csstype: 3.1.3 1513 1841 1514 - '@types/readable-stream@4.0.15': 1515 - dependencies: 1516 - '@types/node': 20.16.10 1517 - safe-buffer: 5.1.2 1518 - 1519 - '@typescript-eslint/eslint-plugin@8.8.1(@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.3.2))(eslint@9.12.0)(typescript@5.3.2)': 1842 + '@typescript-eslint/eslint-plugin@8.29.0(@typescript-eslint/parser@8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2))(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2)': 1520 1843 dependencies: 1521 - '@eslint-community/regexpp': 4.11.1 1522 - '@typescript-eslint/parser': 8.8.1(eslint@9.12.0)(typescript@5.3.2) 1523 - '@typescript-eslint/scope-manager': 8.8.1 1524 - '@typescript-eslint/type-utils': 8.8.1(eslint@9.12.0)(typescript@5.3.2) 1525 - '@typescript-eslint/utils': 8.8.1(eslint@9.12.0)(typescript@5.3.2) 1526 - '@typescript-eslint/visitor-keys': 8.8.1 1527 - eslint: 9.12.0 1844 + '@eslint-community/regexpp': 4.12.1 1845 + '@typescript-eslint/parser': 8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2) 1846 + '@typescript-eslint/scope-manager': 8.29.0 1847 + '@typescript-eslint/type-utils': 8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2) 1848 + '@typescript-eslint/utils': 8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2) 1849 + '@typescript-eslint/visitor-keys': 8.29.0 1850 + eslint: 9.23.0(jiti@2.4.2) 1528 1851 graphemer: 1.4.0 1529 1852 ignore: 5.3.2 1530 1853 natural-compare: 1.4.0 1531 - ts-api-utils: 1.3.0(typescript@5.3.2) 1532 - optionalDependencies: 1533 - typescript: 5.3.2 1854 + ts-api-utils: 2.1.0(typescript@5.8.2) 1855 + typescript: 5.8.2 1534 1856 transitivePeerDependencies: 1535 1857 - supports-color 1536 1858 1537 - '@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.3.2)': 1859 + '@typescript-eslint/parser@8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2)': 1538 1860 dependencies: 1539 - '@typescript-eslint/scope-manager': 8.8.1 1540 - '@typescript-eslint/types': 8.8.1 1541 - '@typescript-eslint/typescript-estree': 8.8.1(typescript@5.3.2) 1542 - '@typescript-eslint/visitor-keys': 8.8.1 1543 - debug: 4.3.4 1544 - eslint: 9.12.0 1545 - optionalDependencies: 1546 - typescript: 5.3.2 1861 + '@typescript-eslint/scope-manager': 8.29.0 1862 + '@typescript-eslint/types': 8.29.0 1863 + '@typescript-eslint/typescript-estree': 8.29.0(typescript@5.8.2) 1864 + '@typescript-eslint/visitor-keys': 8.29.0 1865 + debug: 4.4.0 1866 + eslint: 9.23.0(jiti@2.4.2) 1867 + typescript: 5.8.2 1547 1868 transitivePeerDependencies: 1548 1869 - supports-color 1549 1870 1550 - '@typescript-eslint/scope-manager@8.8.1': 1871 + '@typescript-eslint/scope-manager@8.29.0': 1551 1872 dependencies: 1552 - '@typescript-eslint/types': 8.8.1 1553 - '@typescript-eslint/visitor-keys': 8.8.1 1873 + '@typescript-eslint/types': 8.29.0 1874 + '@typescript-eslint/visitor-keys': 8.29.0 1554 1875 1555 - '@typescript-eslint/type-utils@8.8.1(eslint@9.12.0)(typescript@5.3.2)': 1876 + '@typescript-eslint/type-utils@8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2)': 1556 1877 dependencies: 1557 - '@typescript-eslint/typescript-estree': 8.8.1(typescript@5.3.2) 1558 - '@typescript-eslint/utils': 8.8.1(eslint@9.12.0)(typescript@5.3.2) 1559 - debug: 4.3.4 1560 - ts-api-utils: 1.3.0(typescript@5.3.2) 1561 - optionalDependencies: 1562 - typescript: 5.3.2 1878 + '@typescript-eslint/typescript-estree': 8.29.0(typescript@5.8.2) 1879 + '@typescript-eslint/utils': 8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2) 1880 + debug: 4.4.0 1881 + eslint: 9.23.0(jiti@2.4.2) 1882 + ts-api-utils: 2.1.0(typescript@5.8.2) 1883 + typescript: 5.8.2 1563 1884 transitivePeerDependencies: 1564 - - eslint 1565 1885 - supports-color 1566 1886 1567 - '@typescript-eslint/types@8.8.1': {} 1887 + '@typescript-eslint/types@8.29.0': {} 1568 1888 1569 - '@typescript-eslint/typescript-estree@8.8.1(typescript@5.3.2)': 1889 + '@typescript-eslint/typescript-estree@8.29.0(typescript@5.8.2)': 1570 1890 dependencies: 1571 - '@typescript-eslint/types': 8.8.1 1572 - '@typescript-eslint/visitor-keys': 8.8.1 1573 - debug: 4.3.4 1891 + '@typescript-eslint/types': 8.29.0 1892 + '@typescript-eslint/visitor-keys': 8.29.0 1893 + debug: 4.4.0 1574 1894 fast-glob: 3.3.2 1575 1895 is-glob: 4.0.3 1576 1896 minimatch: 9.0.5 1577 - semver: 7.6.3 1578 - ts-api-utils: 1.3.0(typescript@5.3.2) 1579 - optionalDependencies: 1580 - typescript: 5.3.2 1897 + semver: 7.7.1 1898 + ts-api-utils: 2.1.0(typescript@5.8.2) 1899 + typescript: 5.8.2 1581 1900 transitivePeerDependencies: 1582 1901 - supports-color 1583 1902 1584 - '@typescript-eslint/utils@8.8.1(eslint@9.12.0)(typescript@5.3.2)': 1903 + '@typescript-eslint/utils@8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2)': 1585 1904 dependencies: 1586 - '@eslint-community/eslint-utils': 4.4.0(eslint@9.12.0) 1587 - '@typescript-eslint/scope-manager': 8.8.1 1588 - '@typescript-eslint/types': 8.8.1 1589 - '@typescript-eslint/typescript-estree': 8.8.1(typescript@5.3.2) 1590 - eslint: 9.12.0 1905 + '@eslint-community/eslint-utils': 4.5.1(eslint@9.23.0(jiti@2.4.2)) 1906 + '@typescript-eslint/scope-manager': 8.29.0 1907 + '@typescript-eslint/types': 8.29.0 1908 + '@typescript-eslint/typescript-estree': 8.29.0(typescript@5.8.2) 1909 + eslint: 9.23.0(jiti@2.4.2) 1910 + typescript: 5.8.2 1591 1911 transitivePeerDependencies: 1592 1912 - supports-color 1593 - - typescript 1594 1913 1595 - '@typescript-eslint/visitor-keys@8.8.1': 1914 + '@typescript-eslint/visitor-keys@8.29.0': 1596 1915 dependencies: 1597 - '@typescript-eslint/types': 8.8.1 1598 - eslint-visitor-keys: 3.4.3 1916 + '@typescript-eslint/types': 8.29.0 1917 + eslint-visitor-keys: 4.2.0 1599 1918 1600 - '@zenfs/core@1.0.2': 1919 + '@xterm/xterm@5.5.0': 1920 + optional: true 1921 + 1922 + '@zenfs/core@2.0.0': 1601 1923 dependencies: 1602 - '@types/node': 20.16.10 1603 - '@types/readable-stream': 4.0.15 1924 + '@types/node': 22.13.6 1604 1925 buffer: 6.0.3 1605 1926 eventemitter3: 5.0.1 1606 - minimatch: 9.0.5 1607 1927 readable-stream: 4.5.2 1608 - utilium: 0.7.1 1928 + utilium: 1.10.1 1609 1929 1610 - '@zenfs/dom@0.2.16(@zenfs/core@1.0.2)': 1930 + '@zenfs/dom@1.1.6(@zenfs/core@2.0.0)(utilium@1.10.1)': 1611 1931 dependencies: 1612 - '@zenfs/core': 1.0.2 1932 + '@zenfs/core': 2.0.0 1933 + utilium: 1.10.1 1613 1934 1614 1935 abort-controller@3.0.0: 1615 1936 dependencies: 1616 1937 event-target-shim: 5.0.1 1617 1938 1618 - acorn-jsx@5.3.2(acorn@8.12.1): 1939 + acorn-jsx@5.3.2(acorn@8.14.1): 1619 1940 dependencies: 1620 - acorn: 8.12.1 1941 + acorn: 8.14.1 1621 1942 1622 - acorn@8.12.1: {} 1943 + acorn@8.14.1: {} 1623 1944 1624 1945 ajv@6.12.6: 1625 1946 dependencies: ··· 1632 1953 dependencies: 1633 1954 color-convert: 2.0.1 1634 1955 1956 + ansis@3.17.0: {} 1957 + 1635 1958 argparse@2.0.1: {} 1636 1959 1637 - array-buffer-byte-length@1.0.1: 1960 + array-buffer-byte-length@1.0.2: 1638 1961 dependencies: 1639 - call-bind: 1.0.7 1640 - is-array-buffer: 3.0.4 1962 + call-bound: 1.0.4 1963 + is-array-buffer: 3.0.5 1641 1964 1642 1965 array-includes@3.1.8: 1643 1966 dependencies: 1644 - call-bind: 1.0.7 1967 + call-bind: 1.0.8 1645 1968 define-properties: 1.2.1 1646 - es-abstract: 1.23.3 1647 - es-object-atoms: 1.0.0 1648 - get-intrinsic: 1.2.4 1649 - is-string: 1.0.7 1969 + es-abstract: 1.23.9 1970 + es-object-atoms: 1.1.1 1971 + get-intrinsic: 1.3.0 1972 + is-string: 1.1.1 1650 1973 1651 1974 array.prototype.findlast@1.2.5: 1652 1975 dependencies: 1653 - call-bind: 1.0.7 1976 + call-bind: 1.0.8 1654 1977 define-properties: 1.2.1 1655 - es-abstract: 1.23.3 1978 + es-abstract: 1.23.9 1656 1979 es-errors: 1.3.0 1657 - es-object-atoms: 1.0.0 1658 - es-shim-unscopables: 1.0.2 1980 + es-object-atoms: 1.1.1 1981 + es-shim-unscopables: 1.1.0 1659 1982 1660 - array.prototype.flat@1.3.2: 1983 + array.prototype.flat@1.3.3: 1661 1984 dependencies: 1662 - call-bind: 1.0.7 1985 + call-bind: 1.0.8 1663 1986 define-properties: 1.2.1 1664 - es-abstract: 1.23.3 1665 - es-shim-unscopables: 1.0.2 1987 + es-abstract: 1.23.9 1988 + es-shim-unscopables: 1.1.0 1666 1989 1667 - array.prototype.flatmap@1.3.2: 1990 + array.prototype.flatmap@1.3.3: 1668 1991 dependencies: 1669 - call-bind: 1.0.7 1992 + call-bind: 1.0.8 1670 1993 define-properties: 1.2.1 1671 - es-abstract: 1.23.3 1672 - es-shim-unscopables: 1.0.2 1994 + es-abstract: 1.23.9 1995 + es-shim-unscopables: 1.1.0 1673 1996 1674 1997 array.prototype.tosorted@1.1.4: 1675 1998 dependencies: 1676 - call-bind: 1.0.7 1999 + call-bind: 1.0.8 1677 2000 define-properties: 1.2.1 1678 - es-abstract: 1.23.3 2001 + es-abstract: 1.23.9 1679 2002 es-errors: 1.3.0 1680 - es-shim-unscopables: 1.0.2 2003 + es-shim-unscopables: 1.1.0 1681 2004 1682 - arraybuffer.prototype.slice@1.0.3: 2005 + arraybuffer.prototype.slice@1.0.4: 1683 2006 dependencies: 1684 - array-buffer-byte-length: 1.0.1 1685 - call-bind: 1.0.7 2007 + array-buffer-byte-length: 1.0.2 2008 + call-bind: 1.0.8 1686 2009 define-properties: 1.2.1 1687 - es-abstract: 1.23.3 2010 + es-abstract: 1.23.9 1688 2011 es-errors: 1.3.0 1689 - get-intrinsic: 1.2.4 1690 - is-array-buffer: 3.0.4 1691 - is-shared-array-buffer: 1.0.3 2012 + get-intrinsic: 1.3.0 2013 + is-array-buffer: 3.0.5 1692 2014 1693 2015 astring@1.9.0: {} 2016 + 2017 + async-function@1.0.0: {} 1694 2018 1695 2019 available-typed-arrays@1.0.7: 1696 2020 dependencies: 1697 - possible-typed-array-names: 1.0.0 2021 + possible-typed-array-names: 1.1.0 1698 2022 1699 2023 balanced-match@1.0.2: {} 1700 2024 ··· 1718 2042 base64-js: 1.5.1 1719 2043 ieee754: 1.2.1 1720 2044 1721 - call-bind@1.0.7: 2045 + cac@6.7.14: {} 2046 + 2047 + call-bind-apply-helpers@1.0.2: 1722 2048 dependencies: 1723 - es-define-property: 1.0.0 1724 2049 es-errors: 1.3.0 1725 2050 function-bind: 1.1.2 1726 - get-intrinsic: 1.2.4 2051 + 2052 + call-bind@1.0.8: 2053 + dependencies: 2054 + call-bind-apply-helpers: 1.0.2 2055 + es-define-property: 1.0.1 2056 + get-intrinsic: 1.3.0 1727 2057 set-function-length: 1.2.2 1728 2058 2059 + call-bound@1.0.4: 2060 + dependencies: 2061 + call-bind-apply-helpers: 1.0.2 2062 + get-intrinsic: 1.3.0 2063 + 1729 2064 callsites@3.1.0: {} 1730 2065 1731 2066 chalk@4.1.2: ··· 1741 2076 1742 2077 concat-map@0.0.1: {} 1743 2078 1744 - cross-spawn@7.0.3: 2079 + cross-spawn@7.0.6: 1745 2080 dependencies: 1746 2081 path-key: 3.1.1 1747 2082 shebang-command: 2.0.0 1748 2083 which: 2.0.2 1749 2084 1750 - csstype@3.1.2: {} 1751 - 1752 2085 csstype@3.1.3: {} 1753 2086 1754 - data-view-buffer@1.0.1: 2087 + data-view-buffer@1.0.2: 1755 2088 dependencies: 1756 - call-bind: 1.0.7 2089 + call-bound: 1.0.4 1757 2090 es-errors: 1.3.0 1758 - is-data-view: 1.0.1 2091 + is-data-view: 1.0.2 1759 2092 1760 - data-view-byte-length@1.0.1: 2093 + data-view-byte-length@1.0.2: 1761 2094 dependencies: 1762 - call-bind: 1.0.7 2095 + call-bound: 1.0.4 1763 2096 es-errors: 1.3.0 1764 - is-data-view: 1.0.1 2097 + is-data-view: 1.0.2 1765 2098 1766 - data-view-byte-offset@1.0.0: 2099 + data-view-byte-offset@1.0.1: 1767 2100 dependencies: 1768 - call-bind: 1.0.7 2101 + call-bound: 1.0.4 1769 2102 es-errors: 1.3.0 1770 - is-data-view: 1.0.1 2103 + is-data-view: 1.0.2 1771 2104 1772 - debug@4.3.4: 2105 + debug@4.4.0: 1773 2106 dependencies: 1774 - ms: 2.1.2 2107 + ms: 2.1.3 1775 2108 1776 2109 deep-is@0.1.4: {} 1777 2110 1778 2111 define-data-property@1.1.4: 1779 2112 dependencies: 1780 - es-define-property: 1.0.0 2113 + es-define-property: 1.0.1 1781 2114 es-errors: 1.3.0 1782 - gopd: 1.0.1 2115 + gopd: 1.2.0 1783 2116 1784 2117 define-properties@1.2.1: 1785 2118 dependencies: ··· 1787 2120 has-property-descriptors: 1.0.2 1788 2121 object-keys: 1.1.1 1789 2122 2123 + defu@6.1.4: {} 2124 + 2125 + destr@2.0.4: {} 2126 + 1790 2127 doctrine@2.1.0: 1791 2128 dependencies: 1792 2129 esutils: 2.0.3 1793 2130 1794 - es-abstract@1.23.3: 2131 + dunder-proto@1.0.1: 2132 + dependencies: 2133 + call-bind-apply-helpers: 1.0.2 2134 + es-errors: 1.3.0 2135 + gopd: 1.2.0 2136 + 2137 + es-abstract@1.23.9: 1795 2138 dependencies: 1796 - array-buffer-byte-length: 1.0.1 1797 - arraybuffer.prototype.slice: 1.0.3 2139 + array-buffer-byte-length: 1.0.2 2140 + arraybuffer.prototype.slice: 1.0.4 1798 2141 available-typed-arrays: 1.0.7 1799 - call-bind: 1.0.7 1800 - data-view-buffer: 1.0.1 1801 - data-view-byte-length: 1.0.1 1802 - data-view-byte-offset: 1.0.0 1803 - es-define-property: 1.0.0 2142 + call-bind: 1.0.8 2143 + call-bound: 1.0.4 2144 + data-view-buffer: 1.0.2 2145 + data-view-byte-length: 1.0.2 2146 + data-view-byte-offset: 1.0.1 2147 + es-define-property: 1.0.1 1804 2148 es-errors: 1.3.0 1805 - es-object-atoms: 1.0.0 1806 - es-set-tostringtag: 2.0.3 1807 - es-to-primitive: 1.2.1 1808 - function.prototype.name: 1.1.6 1809 - get-intrinsic: 1.2.4 1810 - get-symbol-description: 1.0.2 2149 + es-object-atoms: 1.1.1 2150 + es-set-tostringtag: 2.1.0 2151 + es-to-primitive: 1.3.0 2152 + function.prototype.name: 1.1.8 2153 + get-intrinsic: 1.3.0 2154 + get-proto: 1.0.1 2155 + get-symbol-description: 1.1.0 1811 2156 globalthis: 1.0.4 1812 - gopd: 1.0.1 2157 + gopd: 1.2.0 1813 2158 has-property-descriptors: 1.0.2 1814 - has-proto: 1.0.3 1815 - has-symbols: 1.0.3 2159 + has-proto: 1.2.0 2160 + has-symbols: 1.1.0 1816 2161 hasown: 2.0.2 1817 - internal-slot: 1.0.7 1818 - is-array-buffer: 3.0.4 2162 + internal-slot: 1.1.0 2163 + is-array-buffer: 3.0.5 1819 2164 is-callable: 1.2.7 1820 - is-data-view: 1.0.1 1821 - is-negative-zero: 2.0.3 1822 - is-regex: 1.1.4 1823 - is-shared-array-buffer: 1.0.3 1824 - is-string: 1.0.7 1825 - is-typed-array: 1.1.13 1826 - is-weakref: 1.0.2 1827 - object-inspect: 1.13.2 2165 + is-data-view: 1.0.2 2166 + is-regex: 1.2.1 2167 + is-shared-array-buffer: 1.0.4 2168 + is-string: 1.1.1 2169 + is-typed-array: 1.1.15 2170 + is-weakref: 1.1.1 2171 + math-intrinsics: 1.1.0 2172 + object-inspect: 1.13.4 1828 2173 object-keys: 1.1.1 1829 - object.assign: 4.1.5 1830 - regexp.prototype.flags: 1.5.3 1831 - safe-array-concat: 1.1.2 1832 - safe-regex-test: 1.0.3 1833 - string.prototype.trim: 1.2.9 1834 - string.prototype.trimend: 1.0.8 2174 + object.assign: 4.1.7 2175 + own-keys: 1.0.1 2176 + regexp.prototype.flags: 1.5.4 2177 + safe-array-concat: 1.1.3 2178 + safe-push-apply: 1.0.0 2179 + safe-regex-test: 1.1.0 2180 + set-proto: 1.0.0 2181 + string.prototype.trim: 1.2.10 2182 + string.prototype.trimend: 1.0.9 1835 2183 string.prototype.trimstart: 1.0.8 1836 - typed-array-buffer: 1.0.2 1837 - typed-array-byte-length: 1.0.1 1838 - typed-array-byte-offset: 1.0.2 1839 - typed-array-length: 1.0.6 1840 - unbox-primitive: 1.0.2 1841 - which-typed-array: 1.1.15 2184 + typed-array-buffer: 1.0.3 2185 + typed-array-byte-length: 1.0.3 2186 + typed-array-byte-offset: 1.0.4 2187 + typed-array-length: 1.0.7 2188 + unbox-primitive: 1.1.0 2189 + which-typed-array: 1.1.19 1842 2190 1843 - es-define-property@1.0.0: 1844 - dependencies: 1845 - get-intrinsic: 1.2.4 2191 + es-define-property@1.0.1: {} 1846 2192 1847 2193 es-errors@1.3.0: {} 1848 2194 1849 - es-iterator-helpers@1.1.0: 2195 + es-iterator-helpers@1.2.1: 1850 2196 dependencies: 1851 - call-bind: 1.0.7 2197 + call-bind: 1.0.8 2198 + call-bound: 1.0.4 1852 2199 define-properties: 1.2.1 1853 - es-abstract: 1.23.3 2200 + es-abstract: 1.23.9 1854 2201 es-errors: 1.3.0 1855 - es-set-tostringtag: 2.0.3 2202 + es-set-tostringtag: 2.1.0 1856 2203 function-bind: 1.1.2 1857 - get-intrinsic: 1.2.4 2204 + get-intrinsic: 1.3.0 1858 2205 globalthis: 1.0.4 2206 + gopd: 1.2.0 1859 2207 has-property-descriptors: 1.0.2 1860 - has-proto: 1.0.3 1861 - has-symbols: 1.0.3 1862 - internal-slot: 1.0.7 1863 - iterator.prototype: 1.1.3 1864 - safe-array-concat: 1.1.2 2208 + has-proto: 1.2.0 2209 + has-symbols: 1.1.0 2210 + internal-slot: 1.1.0 2211 + iterator.prototype: 1.1.5 2212 + safe-array-concat: 1.1.3 1865 2213 1866 - es-object-atoms@1.0.0: 2214 + es-object-atoms@1.1.1: 1867 2215 dependencies: 1868 2216 es-errors: 1.3.0 1869 2217 1870 - es-set-tostringtag@2.0.3: 2218 + es-set-tostringtag@2.1.0: 1871 2219 dependencies: 1872 - get-intrinsic: 1.2.4 2220 + es-errors: 1.3.0 2221 + get-intrinsic: 1.3.0 1873 2222 has-tostringtag: 1.0.2 1874 2223 hasown: 2.0.2 1875 2224 1876 - es-shim-unscopables@1.0.2: 2225 + es-shim-unscopables@1.1.0: 1877 2226 dependencies: 1878 2227 hasown: 2.0.2 1879 2228 1880 - es-to-primitive@1.2.1: 2229 + es-to-primitive@1.3.0: 1881 2230 dependencies: 1882 2231 is-callable: 1.2.7 1883 - is-date-object: 1.0.5 1884 - is-symbol: 1.0.4 2232 + is-date-object: 1.1.0 2233 + is-symbol: 1.1.1 1885 2234 1886 2235 esbuild-copy-static-files@0.1.0: {} 1887 2236 ··· 1912 2261 1913 2262 escape-string-regexp@4.0.0: {} 1914 2263 1915 - eslint-config-prettier@9.1.0(eslint@9.12.0): 2264 + eslint-config-prettier@9.1.0(eslint@9.23.0(jiti@2.4.2)): 1916 2265 dependencies: 1917 - eslint: 9.12.0 2266 + eslint: 9.23.0(jiti@2.4.2) 1918 2267 1919 - eslint-plugin-prettier@5.2.1(eslint-config-prettier@9.1.0(eslint@9.12.0))(eslint@9.12.0)(prettier@3.1.0): 2268 + eslint-plugin-prettier@5.2.6(@types/eslint@9.6.1)(eslint-config-prettier@9.1.0(eslint@9.23.0(jiti@2.4.2)))(eslint@9.23.0(jiti@2.4.2))(prettier@3.1.0): 1920 2269 dependencies: 1921 - eslint: 9.12.0 2270 + eslint: 9.23.0(jiti@2.4.2) 1922 2271 prettier: 3.1.0 1923 2272 prettier-linter-helpers: 1.0.0 1924 - synckit: 0.9.2 2273 + synckit: 0.11.1 1925 2274 optionalDependencies: 1926 - eslint-config-prettier: 9.1.0(eslint@9.12.0) 2275 + '@types/eslint': 9.6.1 2276 + eslint-config-prettier: 9.1.0(eslint@9.23.0(jiti@2.4.2)) 1927 2277 1928 - eslint-plugin-react@7.37.1(eslint@9.12.0): 2278 + eslint-plugin-react@7.37.5(eslint@9.23.0(jiti@2.4.2)): 1929 2279 dependencies: 1930 2280 array-includes: 3.1.8 1931 2281 array.prototype.findlast: 1.2.5 1932 - array.prototype.flatmap: 1.3.2 2282 + array.prototype.flatmap: 1.3.3 1933 2283 array.prototype.tosorted: 1.1.4 1934 2284 doctrine: 2.1.0 1935 - es-iterator-helpers: 1.1.0 1936 - eslint: 9.12.0 2285 + es-iterator-helpers: 1.2.1 2286 + eslint: 9.23.0(jiti@2.4.2) 1937 2287 estraverse: 5.3.0 1938 2288 hasown: 2.0.2 1939 2289 jsx-ast-utils: 3.3.5 1940 2290 minimatch: 3.1.2 1941 - object.entries: 1.1.8 2291 + object.entries: 1.1.9 1942 2292 object.fromentries: 2.0.8 1943 - object.values: 1.2.0 2293 + object.values: 1.2.1 1944 2294 prop-types: 15.8.1 1945 2295 resolve: 2.0.0-next.5 1946 2296 semver: 6.3.1 1947 - string.prototype.matchall: 4.0.11 2297 + string.prototype.matchall: 4.0.12 1948 2298 string.prototype.repeat: 1.0.0 1949 2299 1950 - eslint-scope@8.1.0: 2300 + eslint-scope@8.3.0: 1951 2301 dependencies: 1952 2302 esrecurse: 4.3.0 1953 2303 estraverse: 5.3.0 1954 2304 1955 2305 eslint-visitor-keys@3.4.3: {} 1956 2306 1957 - eslint-visitor-keys@4.1.0: {} 2307 + eslint-visitor-keys@4.2.0: {} 1958 2308 1959 - eslint@9.12.0: 2309 + eslint@9.23.0(jiti@2.4.2): 1960 2310 dependencies: 1961 - '@eslint-community/eslint-utils': 4.4.0(eslint@9.12.0) 1962 - '@eslint-community/regexpp': 4.11.1 1963 - '@eslint/config-array': 0.18.0 1964 - '@eslint/core': 0.6.0 1965 - '@eslint/eslintrc': 3.1.0 1966 - '@eslint/js': 9.12.0 1967 - '@eslint/plugin-kit': 0.2.0 1968 - '@humanfs/node': 0.16.5 2311 + '@eslint-community/eslint-utils': 4.5.1(eslint@9.23.0(jiti@2.4.2)) 2312 + '@eslint-community/regexpp': 4.12.1 2313 + '@eslint/config-array': 0.19.2 2314 + '@eslint/config-helpers': 0.2.1 2315 + '@eslint/core': 0.12.0 2316 + '@eslint/eslintrc': 3.3.1 2317 + '@eslint/js': 9.23.0 2318 + '@eslint/plugin-kit': 0.2.8 2319 + '@humanfs/node': 0.16.6 1969 2320 '@humanwhocodes/module-importer': 1.0.1 1970 - '@humanwhocodes/retry': 0.3.1 2321 + '@humanwhocodes/retry': 0.4.2 1971 2322 '@types/estree': 1.0.6 1972 2323 '@types/json-schema': 7.0.15 1973 2324 ajv: 6.12.6 1974 2325 chalk: 4.1.2 1975 - cross-spawn: 7.0.3 1976 - debug: 4.3.4 2326 + cross-spawn: 7.0.6 2327 + debug: 4.4.0 1977 2328 escape-string-regexp: 4.0.0 1978 - eslint-scope: 8.1.0 1979 - eslint-visitor-keys: 4.1.0 1980 - espree: 10.2.0 1981 - esquery: 1.5.0 2329 + eslint-scope: 8.3.0 2330 + eslint-visitor-keys: 4.2.0 2331 + espree: 10.3.0 2332 + esquery: 1.6.0 1982 2333 esutils: 2.0.3 1983 2334 fast-deep-equal: 3.1.3 1984 2335 file-entry-cache: 8.0.0 1985 2336 find-up: 5.0.0 1986 2337 glob-parent: 6.0.2 1987 - ignore: 5.3.0 2338 + ignore: 5.3.2 1988 2339 imurmurhash: 0.1.4 1989 2340 is-glob: 4.0.3 1990 2341 json-stable-stringify-without-jsonify: 1.0.1 ··· 1992 2343 minimatch: 3.1.2 1993 2344 natural-compare: 1.4.0 1994 2345 optionator: 0.9.3 1995 - text-table: 0.2.0 2346 + optionalDependencies: 2347 + jiti: 2.4.2 1996 2348 transitivePeerDependencies: 1997 2349 - supports-color 1998 2350 1999 - espree@10.2.0: 2351 + espree@10.3.0: 2000 2352 dependencies: 2001 - acorn: 8.12.1 2002 - acorn-jsx: 5.3.2(acorn@8.12.1) 2003 - eslint-visitor-keys: 4.1.0 2353 + acorn: 8.14.1 2354 + acorn-jsx: 5.3.2(acorn@8.14.1) 2355 + eslint-visitor-keys: 4.2.0 2004 2356 2005 - esquery@1.5.0: 2357 + esquery@1.6.0: 2006 2358 dependencies: 2007 2359 estraverse: 5.3.0 2008 2360 ··· 2045 2397 dependencies: 2046 2398 reusify: 1.0.4 2047 2399 2400 + fdir@6.4.3(picomatch@4.0.2): 2401 + optionalDependencies: 2402 + picomatch: 4.0.2 2403 + 2048 2404 file-entry-cache@8.0.0: 2049 2405 dependencies: 2050 2406 flat-cache: 4.0.1 ··· 2053 2409 dependencies: 2054 2410 to-regex-range: 5.0.1 2055 2411 2412 + find-up-simple@1.0.1: {} 2413 + 2056 2414 find-up@5.0.0: 2057 2415 dependencies: 2058 2416 locate-path: 6.0.0 ··· 2065 2423 2066 2424 flatted@3.2.9: {} 2067 2425 2068 - for-each@0.3.3: 2426 + for-each@0.3.5: 2069 2427 dependencies: 2070 2428 is-callable: 1.2.7 2071 2429 2072 2430 function-bind@1.1.2: {} 2073 2431 2074 - function.prototype.name@1.1.6: 2432 + function.prototype.name@1.1.8: 2075 2433 dependencies: 2076 - call-bind: 1.0.7 2434 + call-bind: 1.0.8 2435 + call-bound: 1.0.4 2077 2436 define-properties: 1.2.1 2078 - es-abstract: 1.23.3 2079 2437 functions-have-names: 1.2.3 2438 + hasown: 2.0.2 2439 + is-callable: 1.2.7 2080 2440 2081 2441 functions-have-names@1.2.3: {} 2082 2442 2083 - get-intrinsic@1.2.4: 2443 + fzf@0.5.2: {} 2444 + 2445 + get-intrinsic@1.3.0: 2084 2446 dependencies: 2447 + call-bind-apply-helpers: 1.0.2 2448 + es-define-property: 1.0.1 2085 2449 es-errors: 1.3.0 2450 + es-object-atoms: 1.1.1 2086 2451 function-bind: 1.1.2 2087 - has-proto: 1.0.3 2088 - has-symbols: 1.0.3 2452 + get-proto: 1.0.1 2453 + gopd: 1.2.0 2454 + has-symbols: 1.1.0 2089 2455 hasown: 2.0.2 2456 + math-intrinsics: 1.1.0 2090 2457 2091 - get-symbol-description@1.0.2: 2458 + get-proto@1.0.1: 2092 2459 dependencies: 2093 - call-bind: 1.0.7 2460 + dunder-proto: 1.0.1 2461 + es-object-atoms: 1.1.1 2462 + 2463 + get-symbol-description@1.1.0: 2464 + dependencies: 2465 + call-bound: 1.0.4 2094 2466 es-errors: 1.3.0 2095 - get-intrinsic: 1.2.4 2467 + get-intrinsic: 1.3.0 2096 2468 2097 2469 glob-parent@5.1.2: 2098 2470 dependencies: ··· 2107 2479 globalthis@1.0.4: 2108 2480 dependencies: 2109 2481 define-properties: 1.2.1 2110 - gopd: 1.0.1 2482 + gopd: 1.2.0 2111 2483 2112 - gopd@1.0.1: 2113 - dependencies: 2114 - get-intrinsic: 1.2.4 2484 + gopd@1.2.0: {} 2115 2485 2116 2486 graphemer@1.4.0: {} 2117 2487 2118 - has-bigints@1.0.2: {} 2488 + has-bigints@1.1.0: {} 2119 2489 2120 2490 has-flag@4.0.0: {} 2121 2491 2122 2492 has-property-descriptors@1.0.2: 2123 2493 dependencies: 2124 - es-define-property: 1.0.0 2494 + es-define-property: 1.0.1 2125 2495 2126 - has-proto@1.0.3: {} 2496 + has-proto@1.2.0: 2497 + dependencies: 2498 + dunder-proto: 1.0.1 2127 2499 2128 - has-symbols@1.0.3: {} 2500 + has-symbols@1.1.0: {} 2129 2501 2130 2502 has-tostringtag@1.0.2: 2131 2503 dependencies: 2132 - has-symbols: 1.0.3 2504 + has-symbols: 1.1.0 2133 2505 2134 2506 hasown@2.0.2: 2135 2507 dependencies: ··· 2138 2510 husky@8.0.3: {} 2139 2511 2140 2512 ieee754@1.2.1: {} 2141 - 2142 - ignore@5.3.0: {} 2143 2513 2144 2514 ignore@5.3.2: {} 2145 2515 ··· 2150 2520 2151 2521 imurmurhash@0.1.4: {} 2152 2522 2153 - internal-slot@1.0.7: 2523 + internal-slot@1.1.0: 2154 2524 dependencies: 2155 2525 es-errors: 1.3.0 2156 2526 hasown: 2.0.2 2157 - side-channel: 1.0.6 2527 + side-channel: 1.1.0 2158 2528 2159 - is-array-buffer@3.0.4: 2529 + is-array-buffer@3.0.5: 2160 2530 dependencies: 2161 - call-bind: 1.0.7 2162 - get-intrinsic: 1.2.4 2531 + call-bind: 1.0.8 2532 + call-bound: 1.0.4 2533 + get-intrinsic: 1.3.0 2163 2534 2164 - is-async-function@2.0.0: 2535 + is-async-function@2.1.1: 2165 2536 dependencies: 2537 + async-function: 1.0.0 2538 + call-bound: 1.0.4 2539 + get-proto: 1.0.1 2166 2540 has-tostringtag: 1.0.2 2541 + safe-regex-test: 1.1.0 2167 2542 2168 - is-bigint@1.0.4: 2543 + is-bigint@1.1.0: 2169 2544 dependencies: 2170 - has-bigints: 1.0.2 2545 + has-bigints: 1.1.0 2171 2546 2172 - is-boolean-object@1.1.2: 2547 + is-boolean-object@1.2.2: 2173 2548 dependencies: 2174 - call-bind: 1.0.7 2549 + call-bound: 1.0.4 2175 2550 has-tostringtag: 1.0.2 2176 2551 2177 2552 is-callable@1.2.7: {} 2178 2553 2179 - is-core-module@2.15.1: 2554 + is-core-module@2.16.1: 2180 2555 dependencies: 2181 2556 hasown: 2.0.2 2182 2557 2183 - is-data-view@1.0.1: 2558 + is-data-view@1.0.2: 2184 2559 dependencies: 2185 - is-typed-array: 1.1.13 2560 + call-bound: 1.0.4 2561 + get-intrinsic: 1.3.0 2562 + is-typed-array: 1.1.15 2186 2563 2187 - is-date-object@1.0.5: 2564 + is-date-object@1.1.0: 2188 2565 dependencies: 2566 + call-bound: 1.0.4 2189 2567 has-tostringtag: 1.0.2 2190 2568 2191 2569 is-extglob@2.1.1: {} 2192 2570 2193 - is-finalizationregistry@1.0.2: 2571 + is-finalizationregistry@1.1.1: 2194 2572 dependencies: 2195 - call-bind: 1.0.7 2573 + call-bound: 1.0.4 2196 2574 2197 - is-generator-function@1.0.10: 2575 + is-generator-function@1.1.0: 2198 2576 dependencies: 2577 + call-bound: 1.0.4 2578 + get-proto: 1.0.1 2199 2579 has-tostringtag: 1.0.2 2580 + safe-regex-test: 1.1.0 2200 2581 2201 2582 is-glob@4.0.3: 2202 2583 dependencies: ··· 2204 2585 2205 2586 is-map@2.0.3: {} 2206 2587 2207 - is-negative-zero@2.0.3: {} 2208 - 2209 - is-number-object@1.0.7: 2588 + is-number-object@1.1.1: 2210 2589 dependencies: 2590 + call-bound: 1.0.4 2211 2591 has-tostringtag: 1.0.2 2212 2592 2213 2593 is-number@7.0.0: {} 2214 2594 2215 - is-regex@1.1.4: 2595 + is-regex@1.2.1: 2216 2596 dependencies: 2217 - call-bind: 1.0.7 2597 + call-bound: 1.0.4 2598 + gopd: 1.2.0 2218 2599 has-tostringtag: 1.0.2 2600 + hasown: 2.0.2 2219 2601 2220 2602 is-set@2.0.3: {} 2221 2603 2222 - is-shared-array-buffer@1.0.3: 2604 + is-shared-array-buffer@1.0.4: 2223 2605 dependencies: 2224 - call-bind: 1.0.7 2606 + call-bound: 1.0.4 2225 2607 2226 - is-string@1.0.7: 2608 + is-string@1.1.1: 2227 2609 dependencies: 2610 + call-bound: 1.0.4 2228 2611 has-tostringtag: 1.0.2 2229 2612 2230 - is-symbol@1.0.4: 2613 + is-symbol@1.1.1: 2231 2614 dependencies: 2232 - has-symbols: 1.0.3 2615 + call-bound: 1.0.4 2616 + has-symbols: 1.1.0 2617 + safe-regex-test: 1.1.0 2233 2618 2234 - is-typed-array@1.1.13: 2619 + is-typed-array@1.1.15: 2235 2620 dependencies: 2236 - which-typed-array: 1.1.15 2621 + which-typed-array: 1.1.19 2237 2622 2238 2623 is-weakmap@2.0.2: {} 2239 2624 2240 - is-weakref@1.0.2: 2625 + is-weakref@1.1.1: 2241 2626 dependencies: 2242 - call-bind: 1.0.7 2627 + call-bound: 1.0.4 2243 2628 2244 - is-weakset@2.0.3: 2629 + is-weakset@2.0.4: 2245 2630 dependencies: 2246 - call-bind: 1.0.7 2247 - get-intrinsic: 1.2.4 2631 + call-bound: 1.0.4 2632 + get-intrinsic: 1.3.0 2248 2633 2249 2634 isarray@2.0.5: {} 2250 2635 2251 2636 isexe@2.0.0: {} 2252 2637 2253 - iterator.prototype@1.1.3: 2638 + iterator.prototype@1.1.5: 2254 2639 dependencies: 2255 - define-properties: 1.2.1 2256 - get-intrinsic: 1.2.4 2257 - has-symbols: 1.0.3 2258 - reflect.getprototypeof: 1.0.6 2640 + define-data-property: 1.1.4 2641 + es-object-atoms: 1.1.1 2642 + get-intrinsic: 1.3.0 2643 + get-proto: 1.0.1 2644 + has-symbols: 1.1.0 2259 2645 set-function-name: 2.0.2 2260 2646 2647 + jiti@2.4.2: {} 2648 + 2261 2649 js-tokens@4.0.0: {} 2262 2650 2263 2651 js-yaml@4.1.0: ··· 2273 2661 jsx-ast-utils@3.3.5: 2274 2662 dependencies: 2275 2663 array-includes: 3.1.8 2276 - array.prototype.flat: 1.3.2 2277 - object.assign: 4.1.5 2278 - object.values: 1.2.0 2664 + array.prototype.flat: 1.3.3 2665 + object.assign: 4.1.7 2666 + object.values: 1.2.1 2279 2667 2280 2668 keyv@4.5.4: 2281 2669 dependencies: ··· 2296 2684 dependencies: 2297 2685 js-tokens: 4.0.0 2298 2686 2687 + math-intrinsics@1.1.0: {} 2688 + 2299 2689 merge2@1.4.1: {} 2300 2690 2301 2691 meriyah@6.0.1: {} ··· 2306 2696 dependencies: 2307 2697 braces: 3.0.3 2308 2698 picomatch: 2.3.1 2699 + 2700 + mimic-function@5.0.1: {} 2309 2701 2310 2702 minimatch@3.1.2: 2311 2703 dependencies: ··· 2315 2707 dependencies: 2316 2708 brace-expansion: 2.0.1 2317 2709 2318 - ms@2.1.2: {} 2710 + ms@2.1.3: {} 2319 2711 2320 2712 nanotar@0.1.1: {} 2321 2713 2322 2714 natural-compare@1.4.0: {} 2323 2715 2716 + node-fetch-native@1.6.6: {} 2717 + 2324 2718 object-assign@4.1.1: {} 2325 2719 2326 - object-inspect@1.13.2: {} 2720 + object-inspect@1.13.4: {} 2327 2721 2328 2722 object-keys@1.1.1: {} 2329 2723 2330 - object.assign@4.1.5: 2724 + object.assign@4.1.7: 2331 2725 dependencies: 2332 - call-bind: 1.0.7 2726 + call-bind: 1.0.8 2727 + call-bound: 1.0.4 2333 2728 define-properties: 1.2.1 2334 - has-symbols: 1.0.3 2729 + es-object-atoms: 1.1.1 2730 + has-symbols: 1.1.0 2335 2731 object-keys: 1.1.1 2336 2732 2337 - object.entries@1.1.8: 2733 + object.entries@1.1.9: 2338 2734 dependencies: 2339 - call-bind: 1.0.7 2735 + call-bind: 1.0.8 2736 + call-bound: 1.0.4 2340 2737 define-properties: 1.2.1 2341 - es-object-atoms: 1.0.0 2738 + es-object-atoms: 1.1.1 2342 2739 2343 2740 object.fromentries@2.0.8: 2344 2741 dependencies: 2345 - call-bind: 1.0.7 2742 + call-bind: 1.0.8 2346 2743 define-properties: 1.2.1 2347 - es-abstract: 1.23.3 2348 - es-object-atoms: 1.0.0 2744 + es-abstract: 1.23.9 2745 + es-object-atoms: 1.1.1 2349 2746 2350 - object.values@1.2.0: 2747 + object.values@1.2.1: 2351 2748 dependencies: 2352 - call-bind: 1.0.7 2749 + call-bind: 1.0.8 2750 + call-bound: 1.0.4 2353 2751 define-properties: 1.2.1 2354 - es-object-atoms: 1.0.0 2752 + es-object-atoms: 1.1.1 2753 + 2754 + ofetch@1.4.1: 2755 + dependencies: 2756 + destr: 2.0.4 2757 + node-fetch-native: 1.6.6 2758 + ufo: 1.5.4 2759 + 2760 + onetime@7.0.0: 2761 + dependencies: 2762 + mimic-function: 5.0.1 2355 2763 2356 2764 optionator@0.9.3: 2357 2765 dependencies: ··· 2361 2769 levn: 0.4.1 2362 2770 prelude-ls: 1.2.1 2363 2771 type-check: 0.4.0 2772 + 2773 + own-keys@1.0.1: 2774 + dependencies: 2775 + get-intrinsic: 1.3.0 2776 + object-keys: 1.1.1 2777 + safe-push-apply: 1.0.0 2364 2778 2365 2779 p-limit@3.1.0: 2366 2780 dependencies: ··· 2370 2784 dependencies: 2371 2785 p-limit: 3.1.0 2372 2786 2787 + package-manager-detector@1.1.0: {} 2788 + 2373 2789 parent-module@1.0.1: 2374 2790 dependencies: 2375 2791 callsites: 3.1.0 ··· 2380 2796 2381 2797 path-parse@1.0.7: {} 2382 2798 2799 + pathe@2.0.3: {} 2800 + 2383 2801 picomatch@2.3.1: {} 2384 2802 2385 - possible-typed-array-names@1.0.0: {} 2803 + picomatch@4.0.2: {} 2804 + 2805 + pnpm-workspace-yaml@0.3.1: 2806 + dependencies: 2807 + yaml: 2.7.1 2808 + 2809 + possible-typed-array-names@1.1.0: {} 2386 2810 2387 2811 prelude-ls@1.2.1: {} 2388 2812 ··· 2402 2826 2403 2827 punycode@2.3.1: {} 2404 2828 2829 + quansync@0.2.10: {} 2830 + 2405 2831 queue-microtask@1.2.3: {} 2406 2832 2407 2833 react-is@16.13.1: {} ··· 2414 2840 process: 0.11.10 2415 2841 string_decoder: 1.3.0 2416 2842 2417 - reflect.getprototypeof@1.0.6: 2843 + reflect.getprototypeof@1.0.10: 2418 2844 dependencies: 2419 - call-bind: 1.0.7 2845 + call-bind: 1.0.8 2420 2846 define-properties: 1.2.1 2421 - es-abstract: 1.23.3 2847 + es-abstract: 1.23.9 2422 2848 es-errors: 1.3.0 2423 - get-intrinsic: 1.2.4 2424 - globalthis: 1.0.4 2425 - which-builtin-type: 1.1.4 2849 + es-object-atoms: 1.1.1 2850 + get-intrinsic: 1.3.0 2851 + get-proto: 1.0.1 2852 + which-builtin-type: 1.2.1 2426 2853 2427 - regexp.prototype.flags@1.5.3: 2854 + regexp.prototype.flags@1.5.4: 2428 2855 dependencies: 2429 - call-bind: 1.0.7 2856 + call-bind: 1.0.8 2430 2857 define-properties: 1.2.1 2431 2858 es-errors: 1.3.0 2859 + get-proto: 1.0.1 2860 + gopd: 1.2.0 2432 2861 set-function-name: 2.0.2 2433 2862 2434 2863 resolve-from@4.0.0: {} 2435 2864 2436 2865 resolve@2.0.0-next.5: 2437 2866 dependencies: 2438 - is-core-module: 2.15.1 2867 + is-core-module: 2.16.1 2439 2868 path-parse: 1.0.7 2440 2869 supports-preserve-symlinks-flag: 1.0.0 2441 2870 2871 + restore-cursor@5.1.0: 2872 + dependencies: 2873 + onetime: 7.0.0 2874 + signal-exit: 4.1.0 2875 + 2442 2876 reusify@1.0.4: {} 2443 2877 2444 2878 run-parallel@1.2.0: 2445 2879 dependencies: 2446 2880 queue-microtask: 1.2.3 2447 2881 2448 - safe-array-concat@1.1.2: 2882 + safe-array-concat@1.1.3: 2449 2883 dependencies: 2450 - call-bind: 1.0.7 2451 - get-intrinsic: 1.2.4 2452 - has-symbols: 1.0.3 2884 + call-bind: 1.0.8 2885 + call-bound: 1.0.4 2886 + get-intrinsic: 1.3.0 2887 + has-symbols: 1.1.0 2453 2888 isarray: 2.0.5 2454 2889 2455 - safe-buffer@5.1.2: {} 2456 - 2457 2890 safe-buffer@5.2.1: {} 2458 2891 2459 - safe-regex-test@1.0.3: 2892 + safe-push-apply@1.0.0: 2460 2893 dependencies: 2461 - call-bind: 1.0.7 2462 2894 es-errors: 1.3.0 2463 - is-regex: 1.1.4 2895 + isarray: 2.0.5 2896 + 2897 + safe-regex-test@1.1.0: 2898 + dependencies: 2899 + call-bound: 1.0.4 2900 + es-errors: 1.3.0 2901 + is-regex: 1.2.1 2464 2902 2465 2903 semver@6.3.1: {} 2466 2904 2467 - semver@7.6.3: {} 2905 + semver@7.7.1: {} 2468 2906 2469 2907 set-function-length@1.2.2: 2470 2908 dependencies: 2471 2909 define-data-property: 1.1.4 2472 2910 es-errors: 1.3.0 2473 2911 function-bind: 1.1.2 2474 - get-intrinsic: 1.2.4 2475 - gopd: 1.0.1 2912 + get-intrinsic: 1.3.0 2913 + gopd: 1.2.0 2476 2914 has-property-descriptors: 1.0.2 2477 2915 2478 2916 set-function-name@2.0.2: ··· 2482 2920 functions-have-names: 1.2.3 2483 2921 has-property-descriptors: 1.0.2 2484 2922 2923 + set-proto@1.0.0: 2924 + dependencies: 2925 + dunder-proto: 1.0.1 2926 + es-errors: 1.3.0 2927 + es-object-atoms: 1.1.1 2928 + 2485 2929 shebang-command@2.0.0: 2486 2930 dependencies: 2487 2931 shebang-regex: 3.0.0 2488 2932 2489 2933 shebang-regex@3.0.0: {} 2490 2934 2491 - side-channel@1.0.6: 2935 + side-channel-list@1.0.0: 2936 + dependencies: 2937 + es-errors: 1.3.0 2938 + object-inspect: 1.13.4 2939 + 2940 + side-channel-map@1.0.1: 2941 + dependencies: 2942 + call-bound: 1.0.4 2943 + es-errors: 1.3.0 2944 + get-intrinsic: 1.3.0 2945 + object-inspect: 1.13.4 2946 + 2947 + side-channel-weakmap@1.0.2: 2948 + dependencies: 2949 + call-bound: 1.0.4 2950 + es-errors: 1.3.0 2951 + get-intrinsic: 1.3.0 2952 + object-inspect: 1.13.4 2953 + side-channel-map: 1.0.1 2954 + 2955 + side-channel@1.1.0: 2492 2956 dependencies: 2493 - call-bind: 1.0.7 2494 2957 es-errors: 1.3.0 2495 - get-intrinsic: 1.2.4 2496 - object-inspect: 1.13.2 2958 + object-inspect: 1.13.4 2959 + side-channel-list: 1.0.0 2960 + side-channel-map: 1.0.1 2961 + side-channel-weakmap: 1.0.2 2962 + 2963 + signal-exit@4.1.0: {} 2497 2964 2498 2965 standalone-electron-types@1.0.0: 2499 2966 dependencies: 2500 2967 '@types/node': 18.17.17 2501 2968 2502 - string.prototype.matchall@4.0.11: 2969 + string.prototype.matchall@4.0.12: 2503 2970 dependencies: 2504 - call-bind: 1.0.7 2971 + call-bind: 1.0.8 2972 + call-bound: 1.0.4 2505 2973 define-properties: 1.2.1 2506 - es-abstract: 1.23.3 2974 + es-abstract: 1.23.9 2507 2975 es-errors: 1.3.0 2508 - es-object-atoms: 1.0.0 2509 - get-intrinsic: 1.2.4 2510 - gopd: 1.0.1 2511 - has-symbols: 1.0.3 2512 - internal-slot: 1.0.7 2513 - regexp.prototype.flags: 1.5.3 2976 + es-object-atoms: 1.1.1 2977 + get-intrinsic: 1.3.0 2978 + gopd: 1.2.0 2979 + has-symbols: 1.1.0 2980 + internal-slot: 1.1.0 2981 + regexp.prototype.flags: 1.5.4 2514 2982 set-function-name: 2.0.2 2515 - side-channel: 1.0.6 2983 + side-channel: 1.1.0 2516 2984 2517 2985 string.prototype.repeat@1.0.0: 2518 2986 dependencies: 2519 2987 define-properties: 1.2.1 2520 - es-abstract: 1.23.3 2988 + es-abstract: 1.23.9 2521 2989 2522 - string.prototype.trim@1.2.9: 2990 + string.prototype.trim@1.2.10: 2523 2991 dependencies: 2524 - call-bind: 1.0.7 2992 + call-bind: 1.0.8 2993 + call-bound: 1.0.4 2994 + define-data-property: 1.1.4 2525 2995 define-properties: 1.2.1 2526 - es-abstract: 1.23.3 2527 - es-object-atoms: 1.0.0 2996 + es-abstract: 1.23.9 2997 + es-object-atoms: 1.1.1 2998 + has-property-descriptors: 1.0.2 2528 2999 2529 - string.prototype.trimend@1.0.8: 3000 + string.prototype.trimend@1.0.9: 2530 3001 dependencies: 2531 - call-bind: 1.0.7 3002 + call-bind: 1.0.8 3003 + call-bound: 1.0.4 2532 3004 define-properties: 1.2.1 2533 - es-object-atoms: 1.0.0 3005 + es-object-atoms: 1.1.1 2534 3006 2535 3007 string.prototype.trimstart@1.0.8: 2536 3008 dependencies: 2537 - call-bind: 1.0.7 3009 + call-bind: 1.0.8 2538 3010 define-properties: 1.2.1 2539 - es-object-atoms: 1.0.0 3011 + es-object-atoms: 1.1.1 2540 3012 2541 3013 string_decoder@1.3.0: 2542 3014 dependencies: ··· 2550 3022 2551 3023 supports-preserve-symlinks-flag@1.0.0: {} 2552 3024 2553 - synckit@0.9.2: 3025 + synckit@0.11.1: 3026 + dependencies: 3027 + '@pkgr/core': 0.2.0 3028 + tslib: 2.8.1 3029 + 3030 + taze@19.0.4: 2554 3031 dependencies: 2555 - '@pkgr/core': 0.1.1 2556 - tslib: 2.7.0 3032 + '@antfu/ni': 24.3.0 3033 + cac: 6.7.14 3034 + find-up-simple: 1.0.1 3035 + ofetch: 1.4.1 3036 + package-manager-detector: 1.1.0 3037 + pathe: 2.0.3 3038 + pnpm-workspace-yaml: 0.3.1 3039 + restore-cursor: 5.1.0 3040 + tinyexec: 1.0.1 3041 + tinyglobby: 0.2.12 3042 + unconfig: 7.3.1 3043 + yaml: 2.7.1 3044 + 3045 + tinyexec@1.0.1: {} 2557 3046 2558 - text-table@0.2.0: {} 3047 + tinyglobby@0.2.12: 3048 + dependencies: 3049 + fdir: 6.4.3(picomatch@4.0.2) 3050 + picomatch: 4.0.2 2559 3051 2560 3052 to-regex-range@5.0.1: 2561 3053 dependencies: 2562 3054 is-number: 7.0.0 2563 3055 2564 - ts-api-utils@1.3.0(typescript@5.3.2): 3056 + ts-api-utils@2.1.0(typescript@5.8.2): 2565 3057 dependencies: 2566 - typescript: 5.3.2 3058 + typescript: 5.8.2 2567 3059 2568 - tslib@2.7.0: {} 3060 + tslib@2.8.1: {} 2569 3061 2570 3062 type-check@0.4.0: 2571 3063 dependencies: 2572 3064 prelude-ls: 1.2.1 2573 3065 2574 - typed-array-buffer@1.0.2: 3066 + typed-array-buffer@1.0.3: 2575 3067 dependencies: 2576 - call-bind: 1.0.7 3068 + call-bound: 1.0.4 2577 3069 es-errors: 1.3.0 2578 - is-typed-array: 1.1.13 3070 + is-typed-array: 1.1.15 2579 3071 2580 - typed-array-byte-length@1.0.1: 3072 + typed-array-byte-length@1.0.3: 2581 3073 dependencies: 2582 - call-bind: 1.0.7 2583 - for-each: 0.3.3 2584 - gopd: 1.0.1 2585 - has-proto: 1.0.3 2586 - is-typed-array: 1.1.13 3074 + call-bind: 1.0.8 3075 + for-each: 0.3.5 3076 + gopd: 1.2.0 3077 + has-proto: 1.2.0 3078 + is-typed-array: 1.1.15 2587 3079 2588 - typed-array-byte-offset@1.0.2: 3080 + typed-array-byte-offset@1.0.4: 2589 3081 dependencies: 2590 3082 available-typed-arrays: 1.0.7 2591 - call-bind: 1.0.7 2592 - for-each: 0.3.3 2593 - gopd: 1.0.1 2594 - has-proto: 1.0.3 2595 - is-typed-array: 1.1.13 3083 + call-bind: 1.0.8 3084 + for-each: 0.3.5 3085 + gopd: 1.2.0 3086 + has-proto: 1.2.0 3087 + is-typed-array: 1.1.15 3088 + reflect.getprototypeof: 1.0.10 2596 3089 2597 - typed-array-length@1.0.6: 3090 + typed-array-length@1.0.7: 2598 3091 dependencies: 2599 - call-bind: 1.0.7 2600 - for-each: 0.3.3 2601 - gopd: 1.0.1 2602 - has-proto: 1.0.3 2603 - is-typed-array: 1.1.13 2604 - possible-typed-array-names: 1.0.0 3092 + call-bind: 1.0.8 3093 + for-each: 0.3.5 3094 + gopd: 1.2.0 3095 + is-typed-array: 1.1.15 3096 + possible-typed-array-names: 1.1.0 3097 + reflect.getprototypeof: 1.0.10 2605 3098 2606 - typescript-eslint@8.8.1(eslint@9.12.0)(typescript@5.3.2): 3099 + typescript-eslint@8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2): 2607 3100 dependencies: 2608 - '@typescript-eslint/eslint-plugin': 8.8.1(@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.3.2))(eslint@9.12.0)(typescript@5.3.2) 2609 - '@typescript-eslint/parser': 8.8.1(eslint@9.12.0)(typescript@5.3.2) 2610 - '@typescript-eslint/utils': 8.8.1(eslint@9.12.0)(typescript@5.3.2) 2611 - optionalDependencies: 2612 - typescript: 5.3.2 3101 + '@typescript-eslint/eslint-plugin': 8.29.0(@typescript-eslint/parser@8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2))(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2) 3102 + '@typescript-eslint/parser': 8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2) 3103 + '@typescript-eslint/utils': 8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2) 3104 + eslint: 9.23.0(jiti@2.4.2) 3105 + typescript: 5.8.2 2613 3106 transitivePeerDependencies: 2614 - - eslint 2615 3107 - supports-color 2616 3108 2617 - typescript@5.3.2: {} 3109 + typescript@5.8.2: {} 3110 + 3111 + ufo@1.5.4: {} 3112 + 3113 + unbox-primitive@1.1.0: 3114 + dependencies: 3115 + call-bound: 1.0.4 3116 + has-bigints: 1.1.0 3117 + has-symbols: 1.1.0 3118 + which-boxed-primitive: 1.1.1 2618 3119 2619 - unbox-primitive@1.0.2: 3120 + unconfig@7.3.1: 2620 3121 dependencies: 2621 - call-bind: 1.0.7 2622 - has-bigints: 1.0.2 2623 - has-symbols: 1.0.3 2624 - which-boxed-primitive: 1.0.2 3122 + '@quansync/fs': 0.1.2 3123 + defu: 6.1.4 3124 + jiti: 2.4.2 3125 + quansync: 0.2.10 3126 + 3127 + undici-types@6.20.0: {} 2625 3128 2626 - undici-types@6.19.8: {} 3129 + undici-types@6.21.0: {} 2627 3130 2628 3131 uri-js@4.4.1: 2629 3132 dependencies: 2630 3133 punycode: 2.3.1 2631 3134 2632 - utilium@0.7.1: 3135 + utilium@1.10.1: 2633 3136 dependencies: 2634 3137 eventemitter3: 5.0.1 3138 + optionalDependencies: 3139 + '@xterm/xterm': 5.5.0 2635 3140 2636 - which-boxed-primitive@1.0.2: 3141 + which-boxed-primitive@1.1.1: 2637 3142 dependencies: 2638 - is-bigint: 1.0.4 2639 - is-boolean-object: 1.1.2 2640 - is-number-object: 1.0.7 2641 - is-string: 1.0.7 2642 - is-symbol: 1.0.4 3143 + is-bigint: 1.1.0 3144 + is-boolean-object: 1.2.2 3145 + is-number-object: 1.1.1 3146 + is-string: 1.1.1 3147 + is-symbol: 1.1.1 2643 3148 2644 - which-builtin-type@1.1.4: 3149 + which-builtin-type@1.2.1: 2645 3150 dependencies: 2646 - function.prototype.name: 1.1.6 3151 + call-bound: 1.0.4 3152 + function.prototype.name: 1.1.8 2647 3153 has-tostringtag: 1.0.2 2648 - is-async-function: 2.0.0 2649 - is-date-object: 1.0.5 2650 - is-finalizationregistry: 1.0.2 2651 - is-generator-function: 1.0.10 2652 - is-regex: 1.1.4 2653 - is-weakref: 1.0.2 3154 + is-async-function: 2.1.1 3155 + is-date-object: 1.1.0 3156 + is-finalizationregistry: 1.1.1 3157 + is-generator-function: 1.1.0 3158 + is-regex: 1.2.1 3159 + is-weakref: 1.1.1 2654 3160 isarray: 2.0.5 2655 - which-boxed-primitive: 1.0.2 3161 + which-boxed-primitive: 1.1.1 2656 3162 which-collection: 1.0.2 2657 - which-typed-array: 1.1.15 3163 + which-typed-array: 1.1.19 2658 3164 2659 3165 which-collection@1.0.2: 2660 3166 dependencies: 2661 3167 is-map: 2.0.3 2662 3168 is-set: 2.0.3 2663 3169 is-weakmap: 2.0.2 2664 - is-weakset: 2.0.3 3170 + is-weakset: 2.0.4 2665 3171 2666 - which-typed-array@1.1.15: 3172 + which-typed-array@1.1.19: 2667 3173 dependencies: 2668 3174 available-typed-arrays: 1.0.7 2669 - call-bind: 1.0.7 2670 - for-each: 0.3.3 2671 - gopd: 1.0.1 3175 + call-bind: 1.0.8 3176 + call-bound: 1.0.4 3177 + for-each: 0.3.5 3178 + get-proto: 1.0.1 3179 + gopd: 1.2.0 2672 3180 has-tostringtag: 1.0.2 2673 3181 2674 3182 which@2.0.2: 2675 3183 dependencies: 2676 3184 isexe: 2.0.0 2677 3185 3186 + yaml@2.7.1: {} 3187 + 2678 3188 yocto-queue@0.1.0: {} 3189 + 3190 + zustand@5.0.3(@types/react@18.3.20): 3191 + optionalDependencies: 3192 + '@types/react': 18.3.20
+31 -1
pnpm-workspace.yaml
··· 1 1 packages: 2 - - "packages/*" 2 + - packages/* 3 + 4 + catalogs: 5 + dev: 6 + esbuild: ^0.19.3 7 + esbuild-copy-static-files: ^0.1.0 8 + "@types/node": ^22.14.0 9 + "@moonlight-mod/eslint-config": "github:moonlight-mod/eslint-config" 10 + eslint: ^9.12.0 11 + "@types/chrome": ^0.0.313 12 + husky: ^8.0.3 13 + prettier: ^3.1.0 14 + typescript: ^5.3.3 15 + taze: ^19.0.4 16 + prod: 17 + "@moonlight-mod/lunast": ^1.0.1 18 + "@moonlight-mod/mappings": ^1.1.25 19 + "@moonlight-mod/moonmap": ^1.0.5 20 + microdiff: ^1.5.0 21 + nanotar: ^0.1.1 22 + "@zenfs/core": ^2.0.0 23 + "@zenfs/dom": ^1.1.3 24 + 25 + onlyBuiltDependencies: 26 + - esbuild 27 + 28 + engineStrict: true 29 + strictSsl: true 30 + strictDepBuilds: true 31 + packageManagerStrict: true 32 + registry: https://registry.npmjs.org/
-78
scripts/link.js
··· 1 - // Janky script to get around pnpm link issues 2 - // Probably don't use this. Probably 3 - /* eslint-disable no-console */ 4 - const fs = require("fs"); 5 - const path = require("path"); 6 - const child_process = require("child_process"); 7 - 8 - const cwd = process.cwd(); 9 - const onDisk = { 10 - "@moonlight-mod/lunast": "../lunast", 11 - "@moonlight-mod/moonmap": "../moonmap", 12 - "@moonlight-mod/mappings": "../mappings" 13 - }; 14 - 15 - function exec(cmd, dir) { 16 - child_process.execSync(cmd, { cwd: dir, stdio: "inherit" }); 17 - } 18 - 19 - function getDeps(packageJSON) { 20 - const ret = {}; 21 - Object.assign(ret, packageJSON.dependencies || {}); 22 - Object.assign(ret, packageJSON.devDependencies || {}); 23 - Object.assign(ret, packageJSON.peerDependencies || {}); 24 - return ret; 25 - } 26 - 27 - function link(dir) { 28 - const packageJSONPath = path.join(dir, "package.json"); 29 - if (!fs.existsSync(packageJSONPath)) return; 30 - const packageJSON = JSON.parse(fs.readFileSync(packageJSONPath, "utf8")); 31 - const deps = getDeps(packageJSON); 32 - 33 - for (const [dep, relativePath] of Object.entries(onDisk)) { 34 - const fullPath = path.join(cwd, relativePath); 35 - if (deps[dep]) { 36 - exec(`pnpm link ${fullPath}`, dir); 37 - } 38 - } 39 - } 40 - 41 - function undo(dir) { 42 - exec("pnpm unlink", dir); 43 - try { 44 - if (fs.existsSync(path.join(dir, "pnpm-lock.yaml"))) { 45 - exec("git restore pnpm-lock.yaml", dir); 46 - } 47 - } catch { 48 - // ignored 49 - } 50 - } 51 - 52 - const shouldUndo = process.argv.includes("--undo"); 53 - const packages = fs.readdirSync("./packages"); 54 - 55 - for (const path of Object.values(onDisk)) { 56 - console.log(path); 57 - if (shouldUndo) { 58 - undo(path); 59 - } else { 60 - link(path); 61 - } 62 - } 63 - 64 - if (shouldUndo) { 65 - console.log(cwd); 66 - undo(cwd); 67 - for (const pkg of packages) { 68 - const dir = path.join(cwd, "packages", pkg); 69 - console.log(dir); 70 - undo(dir); 71 - } 72 - } else { 73 - for (const pkg of packages) { 74 - const dir = path.join(cwd, "packages", pkg); 75 - console.log(dir); 76 - link(dir); 77 - } 78 - }
+78
scripts/link.mjs
··· 1 + // Janky script to get around pnpm link issues 2 + // Probably don't use this. Probably 3 + /* eslint-disable no-console */ 4 + const fs = require("fs"); 5 + const path = require("path"); 6 + const child_process = require("child_process"); 7 + 8 + const cwd = process.cwd(); 9 + const onDisk = { 10 + //"@moonlight-mod/lunast": "../lunast", 11 + //"@moonlight-mod/moonmap": "../moonmap", 12 + "@moonlight-mod/mappings": "../mappings" 13 + }; 14 + 15 + function exec(cmd, dir) { 16 + child_process.execSync(cmd, { cwd: dir, stdio: "inherit" }); 17 + } 18 + 19 + function getDeps(packageJSON) { 20 + const ret = {}; 21 + Object.assign(ret, packageJSON.dependencies || {}); 22 + Object.assign(ret, packageJSON.devDependencies || {}); 23 + Object.assign(ret, packageJSON.peerDependencies || {}); 24 + return ret; 25 + } 26 + 27 + function link(dir) { 28 + const packageJSONPath = path.join(dir, "package.json"); 29 + if (!fs.existsSync(packageJSONPath)) return; 30 + const packageJSON = JSON.parse(fs.readFileSync(packageJSONPath, "utf8")); 31 + const deps = getDeps(packageJSON); 32 + 33 + for (const [dep, relativePath] of Object.entries(onDisk)) { 34 + const fullPath = path.join(cwd, relativePath); 35 + if (deps[dep]) { 36 + exec(`pnpm link ${fullPath}`, dir); 37 + } 38 + } 39 + } 40 + 41 + function undo(dir) { 42 + exec("pnpm unlink", dir); 43 + try { 44 + if (fs.existsSync(path.join(dir, "pnpm-lock.yaml"))) { 45 + exec("git restore pnpm-lock.yaml", dir); 46 + } 47 + } catch { 48 + // ignored 49 + } 50 + } 51 + 52 + const shouldUndo = process.argv.includes("--undo"); 53 + const packages = fs.readdirSync("./packages"); 54 + 55 + for (const path of Object.values(onDisk)) { 56 + console.log(path); 57 + if (shouldUndo) { 58 + undo(path); 59 + } else { 60 + link(path); 61 + } 62 + } 63 + 64 + if (shouldUndo) { 65 + console.log(cwd); 66 + undo(cwd); 67 + for (const pkg of packages) { 68 + const dir = path.join(cwd, "packages", pkg); 69 + console.log(dir); 70 + undo(dir); 71 + } 72 + } else { 73 + for (const pkg of packages) { 74 + const dir = path.join(cwd, "packages", pkg); 75 + console.log(dir); 76 + link(dir); 77 + } 78 + }
-29
scripts/update.js
··· 1 - // Update dependencies in all packages 2 - /* eslint-disable no-console */ 3 - const fs = require("fs"); 4 - const path = require("path"); 5 - const child_process = require("child_process"); 6 - 7 - const packageToUpdate = process.argv[2]; 8 - 9 - function getDeps(packageJSON) { 10 - const ret = {}; 11 - Object.assign(ret, packageJSON.dependencies || {}); 12 - Object.assign(ret, packageJSON.devDependencies || {}); 13 - Object.assign(ret, packageJSON.peerDependencies || {}); 14 - return ret; 15 - } 16 - 17 - function exec(cmd, dir) { 18 - child_process.execSync(cmd, { cwd: dir, stdio: "inherit" }); 19 - } 20 - 21 - for (const package of fs.readdirSync("./packages")) { 22 - const packageJSON = JSON.parse(fs.readFileSync(path.join("./packages", package, "package.json"), "utf8")); 23 - 24 - const deps = getDeps(packageJSON); 25 - if (Object.keys(deps).includes(packageToUpdate)) { 26 - console.log(`Updating ${packageToUpdate} in ${package}`); 27 - exec(`pnpm update ${packageToUpdate}`, path.join("./packages", package)); 28 - } 29 - }
+35
tsconfig.base.json
··· 1 + { 2 + "$schema": "https://json.schemastore.org/tsconfig.json", 3 + "display": "Base", 4 + "_version": "1.0.0", 5 + "compilerOptions": { 6 + "incremental": true, 7 + "target": "ES2022", 8 + "jsx": "react", 9 + "lib": ["ESNext", "ESNext.Disposable", "DOM", "DOM.Iterable"], 10 + "module": "ES2020", 11 + "moduleResolution": "Bundler", 12 + "resolveJsonModule": true, 13 + "allowArbitraryExtensions": false, 14 + "allowImportingTsExtensions": true, 15 + "allowJs": true, 16 + "strict": true, 17 + "strictNullChecks": true, 18 + 19 + // disable unreachable code detection because it breaks with esbuild labels 20 + "allowUnreachableCode": true, 21 + "noFallthroughCasesInSwitch": true, 22 + "noImplicitReturns": true, 23 + "declaration": true, 24 + "declarationMap": true, 25 + "outDir": "dist", 26 + "sourceMap": true, 27 + "stripInternal": true, 28 + "esModuleInterop": true, 29 + "forceConsistentCasingInFileNames": true, 30 + "noErrorTruncation": true, 31 + "verbatimModuleSyntax": false, 32 + // meriyah has a broken import lol 33 + "skipLibCheck": true 34 + } 35 + }
+7 -16
tsconfig.json
··· 1 1 { 2 + "extends": ["./tsconfig.base.json"], 2 3 "compilerOptions": { 3 - "target": "es2022", 4 - "module": "es2020", 5 - "esModuleInterop": true, 6 - "forceConsistentCasingInFileNames": true, 7 - "strict": true, 8 - "moduleResolution": "bundler", 9 4 "baseUrl": "./packages/", 10 - "jsx": "react", 11 - "noEmit": true, 12 - 13 - // meriyah has a broken import lol 14 - "skipLibCheck": true, 15 - 16 - // disable unreachable code detection because it breaks with esbuild labels 17 - "allowUnreachableCode": true 5 + "noEmit": true 18 6 }, 19 - "include": ["./packages/**/*", "./env.d.ts"], 20 - "exclude": ["node_modules"] 7 + "exclude": [ 8 + "**/node_modules/**", 9 + "**/dist/**", 10 + "**/build/**" 11 + ] 21 12 }