this repo has no description

Merge pull request #104 from moonlight-mod/notnite/eslint-config-package

Move ESLint config to a separate repo

Changed files
+1174 -2366
packages
browser
core
core-extensions
src
contextMenu
devToolsExtensions
disableSentry
webpackModules
markdown
webpackModules
moonbase
nativeFixes
notices
quietLoggers
rocketship
settings
webpackModules
spacepack
webpackModules
injector
src
node-preload
src
types
web-preload
src
-75
.eslintrc.json
···
-
{
-
"root": true,
-
"extends": [
-
"eslint:recommended",
-
"plugin:@typescript-eslint/recommended",
-
"plugin:prettier/recommended",
-
"plugin:react/recommended"
-
],
-
"plugins": ["@typescript-eslint", "prettier", "react"],
-
"parser": "@typescript-eslint/parser",
-
"env": {
-
"browser": true,
-
"node": true
-
},
-
"parserOptions": {
-
"ecmaFeatures": {
-
"jsx": true
-
},
-
"ecmaVersion": "latest",
-
"sourceType": "module"
-
},
-
"rules": {
-
"indent": "off",
-
"eqeqeq": [
-
"error",
-
"always",
-
{
-
"null": "ignore"
-
}
-
],
-
"quotes": [
-
"error",
-
"double",
-
{ "avoidEscape": true, "allowTemplateLiterals": true }
-
],
-
"@typescript-eslint/no-unused-vars": [
-
"error",
-
{ "args": "none", "varsIgnorePattern": "^_" }
-
],
-
// Mostly so we don't forget to leave these in when committing
-
"no-console": "error",
-
"no-debugger": "error",
-
-
// Quite honestly we're interacting with so much unknown within Discord that
-
// this being enabled is a hinderance
-
"@typescript-eslint/no-explicit-any": "off",
-
-
"@typescript-eslint/no-var-requires": "off",
-
-
// https://canary.discord.com/channels/1154257010532032512/1154275441788583996/1181760413231230976
-
"no-unused-labels": "off",
-
-
// baseUrl being set to ./packages/ makes language server suggest "types/src" instead of "@moonlight-mod/types"
-
"no-restricted-imports": [
-
"error",
-
{
-
"patterns": [
-
{
-
"group": ["types/*"],
-
"message": "Use @moonlight-mod/types instead"
-
},
-
{
-
"group": ["core/*"],
-
"message": "Use @moonlight-mod/core instead"
-
}
-
]
-
}
-
]
-
},
-
"settings": {
-
"react": {
-
"version": "18.2"
-
}
-
}
-
}
+1 -1
.prettierrc
···
{
-
"printWidth": 80,
+
"printWidth": 120,
"trailingComma": "none",
"tabWidth": 2,
"singleQuote": false
+25
eslint.config.mjs
···
+
import config from "@moonlight-mod/eslint-config";
+
+
export default [
+
...config,
+
{
+
rules: {
+
// baseUrl being set to ./packages/ makes language server suggest "types/src" instead of "@moonlight-mod/types"
+
"no-restricted-imports": [
+
"error",
+
{
+
patterns: [
+
{
+
group: ["types/*"],
+
message: "Use @moonlight-mod/types instead"
+
},
+
{
+
group: ["core/*"],
+
message: "Use @moonlight-mod/core instead"
+
}
+
]
+
}
+
]
+
}
+
}
+
];
+3 -7
package.json
···
"browser": "node build.mjs --browser",
"browser-mv2": "node build.mjs --browser --mv2",
"lint": "eslint packages",
-
"lint:fix": "eslint packages",
+
"lint:fix": "eslint packages --fix",
"lint:report": "eslint --output-file eslint_report.json --format json packages",
"typecheck": "tsc --noEmit",
"check": "pnpm run lint && pnpm run typecheck",
"prepare": "husky install"
},
"devDependencies": {
-
"@typescript-eslint/eslint-plugin": "^6.13.2",
-
"@typescript-eslint/parser": "^6.13.2",
"esbuild": "^0.19.3",
"esbuild-copy-static-files": "^0.1.0",
-
"eslint": "^8.55.0",
-
"eslint-config-prettier": "^9.1.0",
-
"eslint-plugin-prettier": "^5.0.1",
-
"eslint-plugin-react": "^7.33.2",
+
"eslint": "^9.12.0",
+
"@moonlight-mod/eslint-config": "github:moonlight-mod/eslint-config",
"husky": "^8.0.3",
"prettier": "^3.1.0",
"typescript": "^5.3.2"
+1 -2
packages/browser/src/background.js
···
args: [urls],
func: async (urls) => {
const scripts = [...document.querySelectorAll("script")].filter(
-
(script) =>
-
script.src && urls.some((url) => url.includes(script.src))
+
(script) => script.src && urls.some((url) => url.includes(script.src))
);
// backwards
+4 -12
packages/core-extensions/src/contextMenu/index.tsx
···
find: "Menu API only allows Items and groups of Items as children.",
replace: [
{
-
match:
-
/(?<=let{navId[^}]+?}=(.),(.)=function .\(.\){.+(?=,.=function))/,
+
match: /(?<=let{navId[^}]+?}=(.),(.)=function .\(.\){.+(?=,.=function))/,
replacement: (_, props, items) =>
`,__contextMenu=!${props}.__contextMenu_evilMenu&&require("contextMenu_contextMenu")._patchMenu(${props}, ${items})`
}
···
replace: [
{
match: /(?<=let\{[^}]+?\}=.;return ).\({[^}]+?}\)/,
-
replacement: (render) =>
-
`require("contextMenu_contextMenu")._saveProps(this,${render})`
+
replacement: (render) => `require("contextMenu_contextMenu")._saveProps(this,${render})`
}
]
}
···
export const webpackModules: Record<string, ExtensionWebpackModule> = {
contextMenu: {
-
dependencies: [
-
{ ext: "spacepack", id: "spacepack" },
-
"Menu API only allows Items and groups of Items as children."
-
]
+
dependencies: [{ ext: "spacepack", id: "spacepack" }, "Menu API only allows Items and groups of Items as children."]
},
evilMenu: {
-
dependencies: [
-
{ ext: "spacepack", id: "spacepack" },
-
"Menu API only allows Items and groups of Items as children."
-
]
+
dependencies: [{ ext: "spacepack", id: "spacepack" }, "Menu API only allows Items and groups of Items as children."]
}
};
+4 -18
packages/core-extensions/src/contextMenu/webpackModules/contextMenu.ts
···
-
import {
-
InternalItem,
-
MenuElement,
-
MenuProps
-
} from "@moonlight-mod/types/coreExtensions/contextMenu";
+
import { InternalItem, MenuElement, MenuProps } from "@moonlight-mod/types/coreExtensions/contextMenu";
import spacepack from "@moonlight-mod/wp/spacepack_spacepack";
import parser from "@moonlight-mod/wp/contextMenu_evilMenu";
type Patch = {
navId: string;
-
item: (
-
props: any
-
) =>
-
| React.ReactComponentElement<MenuElement>
-
| React.ReactComponentElement<MenuElement>[];
+
item: (props: any) => React.ReactComponentElement<MenuElement> | React.ReactComponentElement<MenuElement>[];
anchorId: string;
before: boolean;
};
function addItem<T>(
navId: string,
-
item: (
-
props: T
-
) =>
-
| React.ReactComponentElement<MenuElement>
-
| React.ReactComponentElement<MenuElement>[],
+
item: (props: T) => React.ReactComponentElement<MenuElement> | React.ReactComponentElement<MenuElement>[],
anchorId: string,
before = false
) {
···
// Unmangle Menu elements
const code =
spacepack.require.m[
-
spacepack.findByCode(
-
"Menu API only allows Items and groups of Items as children."
-
)[0].id
+
spacepack.findByCode("Menu API only allows Items and groups of Items as children.")[0].id
].toString();
let MangledMenu;
+3 -13
packages/core-extensions/src/contextMenu/webpackModules/evilMenu.ts
···
let code =
spacepack.require.m[
-
spacepack.findByCode(
-
"Menu API only allows Items and groups of Items as children."
-
)[0].id
+
spacepack.findByCode("Menu API only allows Items and groups of Items as children.")[0].id
].toString();
code = code.replace(/,.=(?=function .\(.\){.+?,.=function)/, ";return ");
code = code.replace(/,(?=__contextMenu)/, ";let ");
-
const mod = new Function(
-
"module",
-
"exports",
-
"require",
-
`(${code}).apply(this, arguments)`
-
);
+
const mod = new Function("module", "exports", "require", `(${code}).apply(this, arguments)`);
const exp: any = {};
mod({}, exp, require);
-
const Menu = spacepack.findFunctionByStrings(
-
exp,
-
"Menu API only allows Items and groups of Items as children."
-
)!;
+
const Menu = spacepack.findFunctionByStrings(exp, "Menu API only allows Items and groups of Items as children.")!;
module.exports = (el: any) => {
return Menu({
children: el,
+1 -3
packages/core-extensions/src/devToolsExtensions/host.ts
···
const logger = new Logger("DevTools Extensions");
app.whenReady().then(async () => {
-
const paths =
-
moonlightHost.getConfigOption<string[]>("devToolsExtensions", "paths") ??
-
[];
+
const paths = moonlightHost.getConfigOption<string[]>("devToolsExtensions", "paths") ?? [];
for (const path of paths) {
const resolved = resolve(path);
+2 -7
packages/core-extensions/src/disableSentry/host.ts
···
if (moonlightHost.asarPath !== "moonlightDesktop") {
try {
-
const hostSentryPath = require.resolve(
-
join(moonlightHost.asarPath, "node_modules", "@sentry", "electron")
-
);
-
require.cache[hostSentryPath] = new Module(
-
hostSentryPath,
-
require.cache[require.resolve(moonlightHost.asarPath)]
-
);
+
const hostSentryPath = require.resolve(join(moonlightHost.asarPath, "node_modules", "@sentry", "electron"));
+
require.cache[hostSentryPath] = new Module(hostSentryPath, require.cache[require.resolve(moonlightHost.asarPath)]);
require.cache[hostSentryPath]!.exports = {
init: () => {},
captureException: () => {},
+2 -7
packages/core-extensions/src/disableSentry/node.ts
···
if (!ipcRenderer.sendSync(constants.ipcGetIsMoonlightDesktop)) {
const preloadPath = ipcRenderer.sendSync(constants.ipcGetOldPreloadPath);
try {
-
const sentryPath = require.resolve(
-
resolve(preloadPath, "..", "node_modules", "@sentry", "electron")
-
);
-
require.cache[sentryPath] = new Module(
-
sentryPath,
-
require.cache[require.resolve(preloadPath)]
-
);
+
const sentryPath = require.resolve(resolve(preloadPath, "..", "node_modules", "@sentry", "electron"));
+
require.cache[sentryPath] = new Module(sentryPath, require.cache[require.resolve(preloadPath)]);
require.cache[sentryPath]!.exports = {
init: () => {},
setTag: () => {},
+1 -2
packages/core-extensions/src/disableSentry/webpackModules/stub.ts
···
throw Error("crash");
};
} else if (keys.includes(prop.toString())) {
-
return (...args: any[]) =>
-
logger.debug(`Sentry calling "${prop.toString()}":`, ...args);
+
return (...args: any[]) => logger.debug(`Sentry calling "${prop.toString()}":`, ...args);
} else {
return undefined;
}
+5 -17
packages/core-extensions/src/markdown/index.ts
···
replace: [
{
match: /={newline:(.+?)},(.{1,2})=\(0,/,
-
replacement: (_, rules, RULES) =>
-
`=require("markdown_markdown")._addRules({newline:${rules}}),${RULES}=(0,`
+
replacement: (_, rules, RULES) => `=require("markdown_markdown")._addRules({newline:${rules}}),${RULES}=(0,`
},
{
match: /(?<=;(.{1,2}\.Z)={RULES:.+?})/,
-
replacement: (_, rulesets) =>
-
`;require("markdown_markdown")._applyRulesetBlacklist(${rulesets});`
+
replacement: (_, rulesets) => `;require("markdown_markdown")._applyRulesetBlacklist(${rulesets});`
}
]
},
···
`__slateRules,${rulesDef}=__slateRules=require("markdown_markdown")._addSlateRules({link:{${rules}}),${syntaxBefore}=new Set`
},
{
-
match:
-
/(originalMatch:.}=(.);)(.+?)case"emoticon":(return .+?;)(.+?)case"subtext":{(.+?)}default:/,
-
replacement: (
-
_,
-
start,
-
rule,
-
body,
-
plaintextReturn,
-
otherRules,
-
inlineStyleBody
-
) =>
+
match: /(originalMatch:.}=(.);)(.+?)case"emoticon":(return .+?;)(.+?)case"subtext":{(.+?)}default:/,
+
replacement: (_, start, rule, body, plaintextReturn, otherRules, inlineStyleBody) =>
`${start}if(${rule}.type.startsWith("__moonlight_")){if(__slateRules[${rule}.type].type=="inlineStyle"){${inlineStyleBody}}else{${plaintextReturn}}}${body}case"emoticon":${plaintextReturn}${otherRules}case"link":{${inlineStyleBody}}default:`
}
]
···
find: '"Slate: Unknown decoration attribute: "',
replace: {
match: /=({strong:.+?});/,
-
replacement: (_, rules) =>
-
`=require("markdown_markdown")._addSlateDecorators(${rules});`
+
replacement: (_, rules) => `=require("markdown_markdown")._addSlateDecorators(${rules});`
}
}
];
+4 -17
packages/core-extensions/src/markdown/webpackModules/markdown.ts
···
-
/* eslint-disable no-console */
-
import {
-
MarkdownRule,
-
Ruleset,
-
SlateRule
-
} from "@moonlight-mod/types/coreExtensions/markdown";
+
import { MarkdownRule, Ruleset, SlateRule } from "@moonlight-mod/types/coreExtensions/markdown";
-
export const rules: Record<
-
string,
-
(rules: Record<string, MarkdownRule>) => MarkdownRule
-
> = {};
-
export const slateRules: Record<
-
string,
-
(rules: Record<string, SlateRule>) => SlateRule
-
> = {};
+
export const rules: Record<string, (rules: Record<string, MarkdownRule>) => MarkdownRule> = {};
+
export const slateRules: Record<string, (rules: Record<string, SlateRule>) => SlateRule> = {};
export const slateDecorators: Record<string, string> = {};
export const ruleBlacklists: Record<Ruleset, Record<string, boolean>> = {
RULES: {},
···
return originalRules;
}
-
export function _applyRulesetBlacklist(
-
rulesets: Record<Ruleset, Record<string, MarkdownRule>>
-
) {
+
export function _applyRulesetBlacklist(rulesets: Record<Ruleset, Record<string, MarkdownRule>>) {
for (const ruleset of Object.keys(rulesets) as Ruleset[]) {
if (ruleset === "RULES") continue;
+1 -4
packages/core-extensions/src/moonbase/index.tsx
···
export const webpackModules: Record<string, ExtensionWebpackModule> = {
stores: {
-
dependencies: [
-
{ id: "discord/packages/flux" },
-
{ id: "discord/Dispatcher" }
-
]
+
dependencies: [{ id: "discord/packages/flux" }, { id: "discord/Dispatcher" }]
},
ui: {
+5 -17
packages/core-extensions/src/moonbase/native.ts
···
import { MoonlightBranch } from "@moonlight-mod/types";
import type { MoonbaseNatives, RepositoryManifest } from "./types";
import extractAsar from "@moonlight-mod/core/asar";
-
import {
-
distDir,
-
repoUrlFile,
-
installedVersionFile
-
} from "@moonlight-mod/types/constants";
+
import { distDir, repoUrlFile, installedVersionFile } from "@moonlight-mod/types/constants";
import { parseTarGzip } from "nanotar";
const githubRepo = "moonlight-mod/moonlight";
···
const fullFile = moonlightFS.join(dist, file.name);
const fullDir = moonlightFS.dirname(fullFile);
-
if (!(await moonlightFS.exists(fullDir)))
-
await moonlightFS.mkdir(fullDir);
+
if (!(await moonlightFS.exists(fullDir))) await moonlightFS.mkdir(fullDir);
await moonlightFS.writeFile(fullFile, file.data);
}
logger.debug("Writing version file:", ref);
-
const versionFile = moonlightFS.join(
-
moonlightNode.getMoonlightDir(),
-
installedVersionFile
-
);
+
const versionFile = moonlightFS.join(moonlightNode.getMoonlightDir(), installedVersionFile);
await moonlightFS.writeFileString(versionFile, ref.trim());
logger.debug("Update extracted");
···
const fullFile = moonlightFS.join(dir, file);
const fullDir = moonlightFS.dirname(fullFile);
-
if (!(await moonlightFS.exists(fullDir)))
-
await moonlightFS.mkdir(fullDir);
+
if (!(await moonlightFS.exists(fullDir))) await moonlightFS.mkdir(fullDir);
await moonlightFS.writeFile(moonlightFS.join(dir, file), buf);
}
-
await moonlightFS.writeFileString(
-
moonlightFS.join(dir, repoUrlFile),
-
repo
-
);
+
await moonlightFS.writeFileString(moonlightFS.join(dir, repoUrlFile), repo);
},
async deleteExtension(id) {
+2 -8
packages/core-extensions/src/moonbase/types.ts
···
checkForMoonlightUpdate(): Promise<string | null>;
updateMoonlight(): Promise<void>;
-
fetchRepositories(
-
repos: string[]
-
): Promise<Record<string, RepositoryManifest[]>>;
-
installExtension(
-
manifest: RepositoryManifest,
-
url: string,
-
repo: string
-
): Promise<void>;
+
fetchRepositories(repos: string[]): Promise<Record<string, RepositoryManifest[]>>;
+
installExtension(manifest: RepositoryManifest, url: string, repo: string): Promise<void>;
deleteExtension(id: string): Promise<void>;
getExtensionConfig(id: string, key: string): any;
};
+6 -29
packages/core-extensions/src/moonbase/webpackModules/settings.tsx
···
const Margins = spacepack.require("discord/styles/shared/Margins.css");
-
const { open } = spacepack.findByExports("setSection", "clearSubsection")[0]
-
.exports.Z;
+
const { open } = spacepack.findByExports("setSection", "clearSubsection")[0].exports.Z;
const notice = {
stores: [MoonbaseSettingsStore],
element: () => {
// Require it here because lazy loading SUX
-
const SettingsNotice = spacepack.findByCode(
-
"onSaveButtonColor",
-
"FocusRingScope"
-
)[0].exports.Z;
+
const SettingsNotice = spacepack.findByCode("onSaveButtonColor", "FocusRingScope")[0].exports.Z;
return (
<SettingsNotice
submitting={MoonbaseSettingsStore.submitting}
···
}
};
-
function addSection(
-
id: string,
-
name: string,
-
element: React.FunctionComponent
-
) {
+
function addSection(id: string, name: string, element: React.FunctionComponent) {
settings.addSection(`moonbase-${id}`, name, element, null, -2, notice);
}
···
function renderBreadcrumb(crumb: Breadcrumb, last: boolean) {
return (
-
<Text
-
variant="heading-lg/semibold"
-
tag="h2"
-
color={last ? "header-primary" : "header-secondary"}
-
>
+
<Text variant="heading-lg/semibold" tag="h2" color={last ? "header-primary" : "header-secondary"}>
{crumb.label}
</Text>
);
}
-
if (
-
MoonbaseSettingsStore.getExtensionConfigRaw<boolean>(
-
"moonbase",
-
"sections",
-
false
-
)
-
) {
+
if (MoonbaseSettingsStore.getExtensionConfigRaw<boolean>("moonbase", "sections", false)) {
settings.addHeader("Moonbase", -2);
for (const page of pages) {
···
settings.addSectionMenuItems(
"moonbase",
...pages.map((page, i) => (
-
<MenuItem
-
key={page.id}
-
id={`moonbase-${page.id}`}
-
label={page.name}
-
action={() => open("moonbase", i)}
-
/>
+
<MenuItem key={page.id} id={`moonbase-${page.id}`} label={page.name} action={() => open("moonbase", i)} />
))
);
}
+16 -55
packages/core-extensions/src/moonbase/webpackModules/stores.ts
···
import { Config, ExtensionLoadSource } from "@moonlight-mod/types";
-
import {
-
ExtensionState,
-
MoonbaseExtension,
-
MoonbaseNatives,
-
RepositoryManifest
-
} from "../types";
+
import { ExtensionState, MoonbaseExtension, MoonbaseNatives, RepositoryManifest } from "../types";
import { Store } from "@moonlight-mod/wp/discord/packages/flux";
import Dispatcher from "@moonlight-mod/wp/discord/Dispatcher";
import getNatives from "../native";
import { mainRepo } from "@moonlight-mod/types/constants";
-
import {
-
checkExtensionCompat,
-
ExtensionCompat
-
} from "@moonlight-mod/core/extension/loader";
+
import { checkExtensionCompat, ExtensionCompat } from "@moonlight-mod/core/extension/loader";
import { CustomComponent } from "@moonlight-mod/types/coreExtensions/moonbase";
const logger = moonlight.getLogger("moonbase");
···
private origConfig: Config;
private config: Config;
private extensionIndex: number;
-
private configComponents: Record<string, Record<string, CustomComponent>> =
-
{};
+
private configComponents: Record<string, Record<string, CustomComponent>> = {};
modified: boolean;
submitting: boolean;
···
this.extensions[uniqueId] = {
...ext,
uniqueId,
-
state: moonlight.enabledExtensions.has(ext.id)
-
? ExtensionState.Enabled
-
: ExtensionState.Disabled,
+
state: moonlight.enabledExtensions.has(ext.id) ? ExtensionState.Enabled : ExtensionState.Disabled,
compat: checkExtensionCompat(ext.manifest),
hasUpdate: false
};
···
};
// Don't present incompatible updates
-
if (checkExtensionCompat(ext) !== ExtensionCompat.Compatible)
-
continue;
+
if (checkExtensionCompat(ext) !== ExtensionCompat.Compatible) continue;
const existing = this.getExisting(extensionData);
if (existing != null) {
···
this.emitChange();
})
.then(() => {
-
this.shouldShowNotice =
-
this.newVersion != null || Object.keys(this.updates).length > 0;
+
this.shouldShowNotice = this.newVersion != null || Object.keys(this.updates).length > 0;
this.emitChange();
});
}
private getExisting(ext: MoonbaseExtension) {
-
return Object.values(this.extensions).find(
-
(e) => e.id === ext.id && e.source.url === ext.source.url
-
);
+
return Object.values(this.extensions).find((e) => e.id === ext.id && e.source.url === ext.source.url);
}
private hasUpdate(ext: MoonbaseExtension) {
-
const existing = Object.values(this.extensions).find(
-
(e) => e.id === ext.id && e.source.url === ext.source.url
-
);
+
const existing = Object.values(this.extensions).find((e) => e.id === ext.id && e.source.url === ext.source.url);
if (existing == null) return false;
-
return (
-
existing.manifest.version !== ext.manifest.version &&
-
existing.state !== ExtensionState.NotDownloaded
-
);
+
return existing.manifest.version !== ext.manifest.version && existing.state !== ExtensionState.NotDownloaded;
}
// Jank
···
}
getExtensionUniqueId(id: string) {
-
return Object.values(this.extensions).find((ext) => ext.id === id)
-
?.uniqueId;
+
return Object.values(this.extensions).find((ext) => ext.id === id)?.uniqueId;
}
getExtensionConflicting(uniqueId: number) {
const ext = this.getExtension(uniqueId);
if (ext.state !== ExtensionState.NotDownloaded) return false;
return Object.values(this.extensions).some(
-
(e) =>
-
e.id === ext.id &&
-
e.uniqueId !== uniqueId &&
-
e.state !== ExtensionState.NotDownloaded
+
(e) => e.id === ext.id && e.uniqueId !== uniqueId && e.state !== ExtensionState.NotDownloaded
);
}
···
return cfg.config?.[key] ?? clonedDefaultValue;
}
-
getExtensionConfigRaw<T>(
-
id: string,
-
key: string,
-
defaultValue: T | undefined
-
): T | undefined {
+
getExtensionConfigRaw<T>(id: string, key: string, defaultValue: T | undefined): T | undefined {
const cfg = this.config.extensions[id];
if (cfg == null || typeof cfg === "boolean") return defaultValue;
···
this.extensions[uniqueId].state = ExtensionState.Disabled;
}
-
if (update != null)
-
this.extensions[uniqueId].compat = checkExtensionCompat(
-
update.updateManifest
-
);
+
if (update != null) this.extensions[uniqueId].compat = checkExtensionCompat(update.updateManifest);
delete this.updates[uniqueId];
} catch (e) {
···
const deps: Record<string, MoonbaseExtension[]> = {};
for (const dep of missingDeps) {
-
const candidates = Object.values(this.extensions).filter(
-
(e) => e.id === dep
-
);
+
const candidates = Object.values(this.extensions).filter((e) => e.id === dep);
deps[dep] = candidates.sort((a, b) => {
const aRank = this.getRank(a);
const bRank = this.getRank(b);
if (aRank === bRank) {
const repoIndex = this.config.repositories.indexOf(a.source.url!);
-
const otherRepoIndex = this.config.repositories.indexOf(
-
b.source.url!
-
);
+
const otherRepoIndex = this.config.repositories.indexOf(b.source.url!);
return repoIndex - otherRepoIndex;
} else {
return bRank - aRank;
···
return (uniqueId != null ? this.getExtensionName(uniqueId) : null) ?? id;
}
-
registerConfigComponent(
-
ext: string,
-
name: string,
-
component: CustomComponent
-
) {
+
registerConfigComponent(ext: string, name: string, component: CustomComponent) {
if (!(ext in this.configComponents)) this.configComponents[ext] = {};
this.configComponents[ext][name] = component;
}
+8 -34
packages/core-extensions/src/moonbase/webpackModules/ui/config/index.tsx
···
import { LogLevel } from "@moonlight-mod/types";
-
const logLevels = Object.values(LogLevel).filter(
-
(v) => typeof v === "string"
-
) as string[];
+
const logLevels = Object.values(LogLevel).filter((v) => typeof v === "string") as string[];
import React from "@moonlight-mod/wp/react";
import spacepack from "@moonlight-mod/wp/spacepack_spacepack";
···
/\[(?:.\.e\("\d+?"\),?)+\][^}]+?webpackId:\d+,name:"GuildSettings"/,
/webpackId:(\d+),name:"GuildSettings"/
)
-
.then(
-
() =>
-
(RemoveButtonClasses = spacepack.findByCode("removeButtonContainer")[0]
-
.exports)
-
);
+
.then(() => (RemoveButtonClasses = spacepack.findByCode("removeButtonContainer")[0].exports));
// FIXME: type component keys
const { CircleXIcon } = Components;
···
<div className={RemoveButtonClasses.removeButtonContainer}>
<Tooltip text="Remove entry" position="top">
{(props: any) => (
-
<Clickable
-
{...props}
-
className={RemoveButtonClasses.removeButton}
-
onClick={onClick}
-
>
+
<Clickable {...props} className={RemoveButtonClasses.removeButton} onClick={onClick}>
<CircleXIcon width={24} height={24} />
</Clickable>
)}
···
);
}
-
function ArrayFormItem({
-
config
-
}: {
-
config: "repositories" | "devSearchPaths";
-
}) {
+
function ArrayFormItem({ config }: { config: "repositories" | "devSearchPaths" }) {
const items = MoonbaseSettingsStore.getConfigOption(config) ?? [];
return (
<Flex
···
<>
<FormSwitch
className={Margins.marginTop20}
-
value={MoonbaseSettingsStore.getExtensionConfigRaw<boolean>(
-
"moonbase",
-
"updateChecking",
-
true
-
)}
+
value={MoonbaseSettingsStore.getExtensionConfigRaw<boolean>("moonbase", "updateChecking", true)}
onChange={(value: boolean) => {
-
MoonbaseSettingsStore.setExtensionConfig(
-
"moonbase",
-
"updateChecking",
-
value
-
);
+
MoonbaseSettingsStore.setExtensionConfig("moonbase", "updateChecking", value);
}}
note="Checks for updates to moonlight"
>
Automatic update checking
</FormSwitch>
<FormItem title="Repositories">
-
<FormText className={Margins.marginBottom4}>
-
A list of remote repositories to display extensions from
-
</FormText>
+
<FormText className={Margins.marginBottom4}>A list of remote repositories to display extensions from</FormText>
<ArrayFormItem config="repositories" />
</FormItem>
<FormDivider className={FormClasses.dividerDefault} />
···
value: o.toLowerCase(),
label: o[0] + o.slice(1).toLowerCase()
}))}
-
onChange={(v) =>
-
MoonbaseSettingsStore.setConfigOption("loggerLevel", v)
-
}
+
onChange={(v) => MoonbaseSettingsStore.setConfigOption("loggerLevel", v)}
/>
</FormItem>
</>
+28 -84
packages/core-extensions/src/moonbase/webpackModules/ui/extensions/card.tsx
···
import { MoonbaseSettingsStore } from "@moonlight-mod/wp/moonbase_stores";
-
const { BeakerIcon, DownloadIcon, TrashIcon, CircleWarningIcon, Tooltip } =
-
Components;
+
const { BeakerIcon, DownloadIcon, TrashIcon, CircleWarningIcon, Tooltip } = Components;
const PanelButton = spacepack.findByCode("Masks.PANEL_BUTTON")[0].exports.Z;
-
const TabBarClasses = spacepack.findByExports(
-
"tabBar",
-
"tabBarItem",
-
"headerContentWrapper"
-
)[0].exports;
-
const MarkupClasses = spacepack.findByExports("markup", "inlineFormat")[0]
-
.exports;
+
const TabBarClasses = spacepack.findByExports("tabBar", "tabBarItem", "headerContentWrapper")[0].exports;
+
const MarkupClasses = spacepack.findByExports("markup", "inlineFormat")[0].exports;
-
const BuildOverrideClasses = spacepack.findByExports(
-
"disabledButtonOverride"
-
)[0].exports;
+
const BuildOverrideClasses = spacepack.findByExports("disabledButtonOverride")[0].exports;
const COMPAT_TEXT_MAP: Record<ExtensionCompat, string> = {
[ExtensionCompat.Compatible]: "huh?",
···
const [tab, setTab] = React.useState(ExtensionPage.Info);
const [restartNeeded, setRestartNeeded] = React.useState(false);
-
const { ext, enabled, busy, update, conflicting } = useStateFromStores(
-
[MoonbaseSettingsStore],
-
() => {
-
return {
-
ext: MoonbaseSettingsStore.getExtension(uniqueId),
-
enabled: MoonbaseSettingsStore.getExtensionEnabled(uniqueId),
-
busy: MoonbaseSettingsStore.busy,
-
update: MoonbaseSettingsStore.getExtensionUpdate(uniqueId),
-
conflicting: MoonbaseSettingsStore.getExtensionConflicting(uniqueId)
-
};
-
}
-
);
+
const { ext, enabled, busy, update, conflicting } = useStateFromStores([MoonbaseSettingsStore], () => {
+
return {
+
ext: MoonbaseSettingsStore.getExtension(uniqueId),
+
enabled: MoonbaseSettingsStore.getExtensionEnabled(uniqueId),
+
busy: MoonbaseSettingsStore.busy,
+
update: MoonbaseSettingsStore.getExtensionUpdate(uniqueId),
+
conflicting: MoonbaseSettingsStore.getExtensionConflicting(uniqueId)
+
};
+
});
// Why it work like that :sob:
if (ext == null) return <></>;
···
const enabledDependants = useStateFromStores([MoonbaseSettingsStore], () =>
Object.keys(MoonbaseSettingsStore.extensions)
.filter((uniqueId) => {
-
const potentialDependant = MoonbaseSettingsStore.getExtension(
-
parseInt(uniqueId)
-
);
+
const potentialDependant = MoonbaseSettingsStore.getExtension(parseInt(uniqueId));
return (
potentialDependant.manifest.dependencies?.includes(ext.id) &&
···
<div className={IntegrationCard.cardHeader}>
<Flex direction={Flex.Direction.VERTICAL}>
<Flex direction={Flex.Direction.HORIZONTAL} align={Flex.Align.CENTER}>
-
<Text variant="text-md/semibold">
-
{ext.manifest?.meta?.name ?? ext.id}
-
</Text>
+
<Text variant="text-md/semibold">{ext.manifest?.meta?.name ?? ext.id}</Text>
{ext.source.type === ExtensionLoadSource.Developer && (
<Tooltip text="This is a local extension" position="top">
-
{(props: any) => (
-
<BeakerIcon
-
{...props}
-
class={BuildOverrideClasses.infoIcon}
-
size="xs"
-
/>
-
)}
+
{(props: any) => <BeakerIcon {...props} class={BuildOverrideClasses.infoIcon} size="xs" />}
</Tooltip>
)}
</Flex>
-
{tagline != null && (
-
<Text variant="text-sm/normal">{MarkupUtils.parse(tagline)}</Text>
-
)}
+
{tagline != null && <Text variant="text-sm/normal">{MarkupUtils.parse(tagline)}</Text>}
</Flex>
-
<Flex
-
direction={Flex.Direction.HORIZONTAL}
-
align={Flex.Align.END}
-
justify={Flex.Justify.END}
-
>
+
<Flex direction={Flex.Direction.HORIZONTAL} align={Flex.Align.END} justify={Flex.Justify.END}>
{ext.state === ExtensionState.NotDownloaded ? (
-
<Tooltip
-
text={COMPAT_TEXT_MAP[ext.compat]}
-
shouldShow={ext.compat !== ExtensionCompat.Compatible}
-
>
+
<Tooltip text={COMPAT_TEXT_MAP[ext.compat]} shouldShow={ext.compat !== ExtensionCompat.Compatible}>
{(props: any) => (
<Button
{...props}
color={Button.Colors.BRAND}
submitting={busy}
-
disabled={
-
ext.compat !== ExtensionCompat.Compatible || conflicting
-
}
+
disabled={ext.compat !== ExtensionCompat.Compatible || conflicting}
onClick={async () => {
await installWithDependencyPopup(uniqueId);
}}
···
{restartNeeded && (
<PanelButton
-
icon={() => (
-
<CircleWarningIcon
-
color={Components.tokens.colors.STATUS_DANGER}
-
/>
-
)}
+
icon={() => <CircleWarningIcon color={Components.tokens.colors.STATUS_DANGER} />}
onClick={() => window.location.reload()}
tooltipText="You will need to reload/restart your client for this extension to work properly."
/>
)}
<FormSwitch
-
value={
-
ext.compat === ExtensionCompat.Compatible &&
-
(enabled || implicitlyEnabled)
-
}
-
disabled={
-
implicitlyEnabled || ext.compat !== ExtensionCompat.Compatible
-
}
+
value={ext.compat === ExtensionCompat.Compatible && (enabled || implicitlyEnabled)}
+
disabled={implicitlyEnabled || ext.compat !== ExtensionCompat.Compatible}
hideBorder={true}
style={{ marginBottom: "0px" }}
tooltipNote={
···
: implicitlyEnabled
? `This extension is a dependency of the following enabled extension${
enabledDependants.length > 1 ? "s" : ""
-
}: ${enabledDependants
-
.map((a) => a.manifest.meta?.name ?? a.id)
-
.join(", ")}`
+
}: ${enabledDependants.map((a) => a.manifest.meta?.name ?? a.id).join(", ")}`
: undefined
}
onChange={() => {
···
padding: "0 20px"
}}
>
-
<TabBar.Item
-
className={TabBarClasses.tabBarItem}
-
id={ExtensionPage.Info}
-
>
+
<TabBar.Item className={TabBarClasses.tabBarItem} id={ExtensionPage.Info}>
Info
</TabBar.Item>
{description != null && (
-
<TabBar.Item
-
className={TabBarClasses.tabBarItem}
-
id={ExtensionPage.Description}
-
>
+
<TabBar.Item className={TabBarClasses.tabBarItem} id={ExtensionPage.Description}>
Description
</TabBar.Item>
)}
{settings != null && (
-
<TabBar.Item
-
className={TabBarClasses.tabBarItem}
-
id={ExtensionPage.Settings}
-
>
+
<TabBar.Item className={TabBarClasses.tabBarItem} id={ExtensionPage.Settings}>
Settings
</TabBar.Item>
)}
···
>
{tab === ExtensionPage.Info && <ExtensionInfo ext={ext} />}
{tab === ExtensionPage.Description && (
-
<Text
-
variant="text-md/normal"
-
class={MarkupClasses.markup}
-
style={{ width: "100%" }}
-
>
+
<Text variant="text-md/normal" class={MarkupClasses.markup} style={{ width: "100%" }}>
{MarkupUtils.parse(description ?? "*No description*", true, {
allowHeading: true,
allowLinks: true,
+17 -67
packages/core-extensions/src/moonbase/webpackModules/ui/extensions/filterBar.tsx
···
export const defaultFilter = 127 as Filter;
const Margins = spacepack.findByCode("marginCenterHorz:")[0].exports;
-
const SortMenuClasses = spacepack.findByCode("container:", "clearText:")[0]
-
.exports;
+
const SortMenuClasses = spacepack.findByCode("container:", "clearText:")[0].exports;
let FilterDialogClasses: any;
let FilterBarClasses: any;
spacepack
-
.lazyLoad(
-
'"Missing channel in Channel.openChannelContextMenu"',
-
/e\("(\d+)"\)/g,
-
/webpackId:(\d+?),/
-
)
+
.lazyLoad('"Missing channel in Channel.openChannelContextMenu"', /e\("(\d+)"\)/g, /webpackId:(\d+?),/)
.then(() => {
FilterBarClasses = spacepack.findByCode("tagsButtonWithCount:")[0].exports;
-
FilterDialogClasses = spacepack.findByCode(
-
"countContainer:",
-
"tagContainer:"
-
)[0].exports;
+
FilterDialogClasses = spacepack.findByCode("countContainer:", "tagContainer:")[0].exports;
});
-
const TagItem = spacepack.findByCode(".FORUM_TAG_A11Y_FILTER_BY_TAG")[0].exports
-
.Z;
+
const TagItem = spacepack.findByCode(".FORUM_TAG_A11Y_FILTER_BY_TAG")[0].exports.Z;
// FIXME: type component keys
-
const { ChevronSmallDownIcon, ChevronSmallUpIcon, ArrowsUpDownIcon } =
-
Components;
+
const { ChevronSmallDownIcon, ChevronSmallUpIcon, ArrowsUpDownIcon } = Components;
-
function toggleTag(
-
selectedTags: Set<string>,
-
setSelectedTags: (tags: Set<string>) => void,
-
tag: string
-
) {
+
function toggleTag(selectedTags: Set<string>, setSelectedTags: (tags: Set<string>) => void, tag: string) {
const newState = new Set(selectedTags);
if (newState.has(tag)) newState.delete(tag);
else newState.add(tag);
···
setFilter: (filter: Filter) => void;
closePopout: () => void;
}) {
-
const toggleFilter = (set: Filter) =>
-
setFilter(filter & set ? filter & ~set : filter | set);
+
const toggleFilter = (set: Filter) => setFilter(filter & set ? filter & ~set : filter | set);
return (
<div className={SortMenuClasses.container}>
···
);
}
-
function TagButtonPopout({
-
selectedTags,
-
setSelectedTags,
-
setPopoutRef,
-
closePopout
-
}: any) {
+
function TagButtonPopout({ selectedTags, setSelectedTags, setPopoutRef, closePopout }: any) {
return (
<Dialog ref={setPopoutRef} className={FilterDialogClasses.container}>
<div className={FilterDialogClasses.header}>
<div className={FilterDialogClasses.headerLeft}>
-
<Heading
-
color="interactive-normal"
-
variant="text-xs/bold"
-
className={FilterDialogClasses.headerText}
-
>
+
<Heading color="interactive-normal" variant="text-xs/bold" className={FilterDialogClasses.headerText}>
Select tags
</Heading>
<div className={FilterDialogClasses.countContainer}>
-
<Text
-
className={FilterDialogClasses.countText}
-
color="none"
-
variant="text-xs/medium"
-
>
+
<Text className={FilterDialogClasses.countText} color="none" variant="text-xs/medium">
{selectedTags.size}
</Text>
</div>
···
selectedTags: Set<string>;
setSelectedTags: (tags: Set<string>) => void;
}) {
-
const windowSize = useStateFromStores([WindowStore], () =>
-
WindowStore.windowSize()
-
);
+
const windowSize = useStateFromStores([WindowStore], () => WindowStore.windowSize());
const tagsContainer = React.useRef<HTMLDivElement>(null);
const tagListInner = React.useRef<HTMLDivElement>(null);
const [tagsButtonOffset, setTagsButtonOffset] = React.useState(0);
React.useLayoutEffect(() => {
if (tagsContainer.current === null || tagListInner.current === null) return;
-
const { left: containerX, top: containerY } =
-
tagsContainer.current.getBoundingClientRect();
+
const { left: containerX, top: containerY } = tagsContainer.current.getBoundingClientRect();
let offset = 0;
for (const child of tagListInner.current.children) {
-
const {
-
right: childX,
-
top: childY,
-
height
-
} = child.getBoundingClientRect();
+
const { right: childX, top: childY, height } = child.getBoundingClientRect();
if (childY - containerY > height) break;
const newOffset = childX - containerX;
if (newOffset > offset) {
···
>
<Popout
renderPopout={({ closePopout }: any) => (
-
<FilterButtonPopout
-
filter={filter}
-
setFilter={setFilter}
-
closePopout={closePopout}
-
/>
+
<FilterButtonPopout filter={filter} setFilter={setFilter} closePopout={closePopout} />
)}
position="bottom"
align="left"
···
innerClassName={FilterBarClasses.sortDropdownInner}
>
<ArrowsUpDownIcon size="xs" />
-
<Text
-
className={FilterBarClasses.sortDropdownText}
-
variant="text-sm/medium"
-
color="interactive-normal"
-
>
+
<Text className={FilterBarClasses.sortDropdownText} variant="text-sm/medium" color="interactive-normal">
Sort & filter
</Text>
{isShown ? (
···
innerClassName={FilterBarClasses.tagsButtonInner}
>
{selectedTags.size > 0 ? (
-
<div
-
style={{ boxSizing: "content-box" }}
-
className={FilterBarClasses.countContainer}
-
>
-
<Text
-
className={FilterBarClasses.countText}
-
color="none"
-
variant="text-xs/medium"
-
>
+
<div style={{ boxSizing: "content-box" }} className={FilterBarClasses.countContainer}>
+
<Text className={FilterBarClasses.countText} color="none" variant="text-xs/medium">
{selectedTags.size}
</Text>
</div>
+18 -48
packages/core-extensions/src/moonbase/webpackModules/ui/extensions/index.tsx
···
import { MoonbaseSettingsStore } from "@moonlight-mod/wp/moonbase_stores";
import { ExtensionCompat } from "@moonlight-mod/core/extension/loader";
-
const SearchBar: any = Object.values(
-
spacepack.findByCode("Messages.SEARCH", "hideSearchIcon")[0].exports
-
)[0];
+
const SearchBar: any = Object.values(spacepack.findByCode("Messages.SEARCH", "hideSearchIcon")[0].exports)[0];
export default function ExtensionsPage() {
-
const { extensions, savedFilter } = useStateFromStoresObject(
-
[MoonbaseSettingsStore],
-
() => {
-
return {
-
extensions: MoonbaseSettingsStore.extensions,
-
savedFilter: MoonbaseSettingsStore.getExtensionConfigRaw<number>(
-
"moonbase",
-
"filter",
-
defaultFilter
-
)
-
};
-
}
-
);
+
const { extensions, savedFilter } = useStateFromStoresObject([MoonbaseSettingsStore], () => {
+
return {
+
extensions: MoonbaseSettingsStore.extensions,
+
savedFilter: MoonbaseSettingsStore.getExtensionConfigRaw<number>("moonbase", "filter", defaultFilter)
+
};
+
});
const [query, setQuery] = React.useState("");
const filterState = React.useState(defaultFilter);
let filter: Filter, setFilter: (filter: Filter) => void;
-
if (
-
MoonbaseSettingsStore.getExtensionConfigRaw<boolean>(
-
"moonbase",
-
"saveFilter",
-
false
-
)
-
) {
+
if (MoonbaseSettingsStore.getExtensionConfigRaw<boolean>("moonbase", "saveFilter", false)) {
filter = savedFilter ?? defaultFilter;
-
setFilter = (filter) =>
-
MoonbaseSettingsStore.setExtensionConfig("moonbase", "filter", filter);
+
setFilter = (filter) => MoonbaseSettingsStore.setExtensionConfig("moonbase", "filter", filter);
} else {
filter = filterState[0];
setFilter = filterState[1];
···
ext.manifest.meta?.name?.toLowerCase().includes(query) ||
ext.manifest.meta?.tagline?.toLowerCase().includes(query) ||
ext.manifest.meta?.description?.toLowerCase().includes(query)) &&
-
[...selectedTags.values()].every(
-
(tag) => ext.manifest.meta?.tags?.includes(tag as ExtensionTag)
-
) &&
+
[...selectedTags.values()].every((tag) => ext.manifest.meta?.tags?.includes(tag as ExtensionTag)) &&
// This seems very bad, sorry
!(
-
(!(filter & Filter.Core) &&
-
ext.source.type === ExtensionLoadSource.Core) ||
-
(!(filter & Filter.Normal) &&
-
ext.source.type === ExtensionLoadSource.Normal) ||
-
(!(filter & Filter.Developer) &&
-
ext.source.type === ExtensionLoadSource.Developer) ||
-
(!(filter & Filter.Enabled) &&
-
MoonbaseSettingsStore.getExtensionEnabled(ext.uniqueId)) ||
-
(!(filter & Filter.Disabled) &&
-
!MoonbaseSettingsStore.getExtensionEnabled(ext.uniqueId)) ||
-
(!(filter & Filter.Installed) &&
-
ext.state !== ExtensionState.NotDownloaded) ||
-
(!(filter & Filter.Repository) &&
-
ext.state === ExtensionState.NotDownloaded)
+
(!(filter & Filter.Core) && ext.source.type === ExtensionLoadSource.Core) ||
+
(!(filter & Filter.Normal) && ext.source.type === ExtensionLoadSource.Normal) ||
+
(!(filter & Filter.Developer) && ext.source.type === ExtensionLoadSource.Developer) ||
+
(!(filter & Filter.Enabled) && MoonbaseSettingsStore.getExtensionEnabled(ext.uniqueId)) ||
+
(!(filter & Filter.Disabled) && !MoonbaseSettingsStore.getExtensionEnabled(ext.uniqueId)) ||
+
(!(filter & Filter.Installed) && ext.state !== ExtensionState.NotDownloaded) ||
+
(!(filter & Filter.Repository) && ext.state === ExtensionState.NotDownloaded)
) &&
(filter & Filter.Incompatible ||
ext.compat === ExtensionCompat.Compatible ||
···
spellCheck: "false"
}}
/>
-
<FilterBar
-
filter={filter}
-
setFilter={setFilter}
-
selectedTags={selectedTags}
-
setSelectedTags={setSelectedTags}
-
/>
+
<FilterBar filter={filter} setFilter={setFilter} selectedTags={selectedTags} setSelectedTags={setSelectedTags} />
{filtered.map((ext) => (
<ExtensionCard uniqueId={ext.uniqueId} key={ext.uniqueId} />
))}
+4 -27
packages/core-extensions/src/moonbase/webpackModules/ui/extensions/info.tsx
···
[ExtensionTag.Library]: "Library"
};
-
const UserInfoClasses = spacepack.findByCode(
-
"infoScroller",
-
"userInfoSection",
-
"userInfoSectionHeader"
-
)[0].exports;
+
const UserInfoClasses = spacepack.findByCode("infoScroller", "userInfoSection", "userInfoSectionHeader")[0].exports;
import { MoonbaseSettingsStore } from "@moonlight-mod/wp/moonbase_stores";
// FIXME: type component keys
const { Text } = Components;
-
function InfoSection({
-
title,
-
children
-
}: {
-
title: string;
-
children: React.ReactNode;
-
}) {
+
function InfoSection({ title, children }: { title: string; children: React.ReactNode }) {
return (
<div
style={{
···
);
}
-
function Badge({
-
color,
-
children
-
}: {
-
color: string;
-
children: React.ReactNode;
-
}) {
+
function Badge({ color, children }: { color: string; children: React.ReactNode }) {
return (
<span
style={{
···
const name = tagNames[tag];
return (
-
<Badge
-
key={i}
-
color={
-
tag === ExtensionTag.DangerZone
-
? "var(--red-400)"
-
: "var(--brand-500)"
-
}
-
>
+
<Badge key={i} color={tag === ExtensionTag.DangerZone ? "var(--red-400)" : "var(--brand-500)"}>
{name}
</Badge>
);
+7 -21
packages/core-extensions/src/moonbase/webpackModules/ui/extensions/popup.tsx
···
import { ExtensionLoadSource } from "@moonlight-mod/types";
import Flex from "@moonlight-mod/wp/discord/uikit/Flex";
-
const {
-
openModalLazy,
-
closeModal
-
} = require("@moonlight-mod/wp/discord/components/common/index");
-
const Popup = spacepack.findByCode(".minorContainer", "secondaryAction")[0]
-
.exports.default;
+
const { openModalLazy, closeModal } = spacepack.require("@moonlight-mod/wp/discord/components/common/index");
+
const Popup = spacepack.findByCode(".minorContainer", "secondaryAction")[0].exports.default;
const presentableLoadSources: Record<ExtensionLoadSource, string> = {
[ExtensionLoadSource.Developer]: "Local extension", // should never show up
···
return {
value: candidate.uniqueId.toString(),
label:
-
candidate.source.url ??
-
presentableLoadSources[candidate.source.type] ??
-
candidate.manifest.version ??
-
""
+
candidate.source.url ?? presentableLoadSources[candidate.source.type] ?? candidate.manifest.version ?? ""
};
})}
onChange={(value: string) => {
···
}) {
const { Text } = Components;
-
const amountNotAvailable = Object.values(deps).filter(
-
(candidates) => candidates.length === 0
-
).length;
+
const amountNotAvailable = Object.values(deps).filter((candidates) => candidates.length === 0).length;
-
const [options, setOptions] = React.useState<
-
Record<string, string | undefined>
-
>(
+
const [options, setOptions] = React.useState<Record<string, string | undefined>>(
Object.fromEntries(
Object.entries(deps).map(([id, candidates]) => [
id,
···
direction={Flex.Direction.VERTICAL}
>
<Text variant="text-md/normal">
-
This extension depends on other extensions which are not downloaded.
-
Choose which extensions to download.
+
This extension depends on other extensions which are not downloaded. Choose which extensions to download.
</Text>
{amountNotAvailable > 0 && (
<Text variant="text-md/normal">
{amountNotAvailable} extension
-
{amountNotAvailable > 1 ? "s" : ""} could not be found, and must
-
be installed manually.
+
{amountNotAvailable > 1 ? "s" : ""} could not be found, and must be installed manually.
</Text>
)}
···
export async function doPopup(deps: Record<string, MoonbaseExtension[]>) {
const id: string = await openModalLazy(async () => {
-
// eslint-disable-next-line react/display-name
return ({ transitionState }: { transitionState: number | null }) => {
return <OurPopup transitionState={transitionState} deps={deps} id={id} />;
};
+27 -102
packages/core-extensions/src/moonbase/webpackModules/ui/extensions/settings.tsx
···
() => {
return {
value: MoonbaseSettingsStore.getExtensionConfig<T>(uniqueId, name),
-
displayName: MoonbaseSettingsStore.getExtensionConfigName(
-
uniqueId,
-
name
-
),
-
description: MoonbaseSettingsStore.getExtensionConfigDescription(
-
uniqueId,
-
name
-
)
+
displayName: MoonbaseSettingsStore.getExtensionConfigName(uniqueId, name),
+
description: MoonbaseSettingsStore.getExtensionConfigDescription(uniqueId, name)
};
},
[uniqueId, name]
···
function Boolean({ ext, name, setting, disabled }: SettingsProps) {
const { FormSwitch } = Components;
-
const { value, displayName, description } = useConfigEntry<boolean>(
-
ext.uniqueId,
-
name
-
);
+
const { value, displayName, description } = useConfigEntry<boolean>(ext.uniqueId, name);
return (
<FormSwitch
···
function Number({ ext, name, setting, disabled }: SettingsProps) {
const { FormItem, FormText, Slider } = Components;
-
const { value, displayName, description } = useConfigEntry<number>(
-
ext.uniqueId,
-
name
-
);
+
const { value, displayName, description } = useConfigEntry<number>(ext.uniqueId, name);
const castedSetting = setting as NumberSettingType;
const min = castedSetting.min ?? 0;
···
function String({ ext, name, setting, disabled }: SettingsProps) {
const { FormItem, FormText, TextInput } = Components;
-
const { value, displayName, description } = useConfigEntry<string>(
-
ext.uniqueId,
-
name
-
);
+
const { value, displayName, description } = useConfigEntry<string>(ext.uniqueId, name);
return (
<FormItem className={Margins.marginTop20} title={displayName}>
-
{description && (
-
<FormText className={Margins.marginBottom8}>{description}</FormText>
-
)}
+
{description && <FormText className={Margins.marginBottom8}>{description}</FormText>}
<TextInput
value={value ?? ""}
onChange={(value: string) => {
···
function MultilineString({ ext, name, setting, disabled }: SettingsProps) {
const { FormItem, FormText, TextArea } = Components;
-
const { value, displayName, description } = useConfigEntry<string>(
-
ext.uniqueId,
-
name
-
);
+
const { value, displayName, description } = useConfigEntry<string>(ext.uniqueId, name);
return (
<FormItem className={Margins.marginTop20} title={displayName}>
-
{description && (
-
<FormText className={Margins.marginBottom8}>{description}</FormText>
-
)}
+
{description && <FormText className={Margins.marginBottom8}>{description}</FormText>}
<TextArea
rows={5}
value={value ?? ""}
···
function Select({ ext, name, setting, disabled }: SettingsProps) {
const { FormItem, FormText, SingleSelect } = Components;
-
const { value, displayName, description } = useConfigEntry<string>(
-
ext.uniqueId,
-
name
-
);
+
const { value, displayName, description } = useConfigEntry<string>(ext.uniqueId, name);
const castedSetting = setting as SelectSettingType;
const options = castedSetting.options;
return (
<FormItem className={Margins.marginTop20} title={displayName}>
-
{description && (
-
<FormText className={Margins.marginBottom8}>{description}</FormText>
-
)}
+
{description && <FormText className={Margins.marginBottom8}>{description}</FormText>}
<SingleSelect
autofocus={false}
clearable={false}
value={value ?? ""}
-
options={options.map((o: SelectOption) =>
-
typeof o === "string" ? { value: o, label: o } : o
-
)}
+
options={options.map((o: SelectOption) => (typeof o === "string" ? { value: o, label: o } : o))}
onChange={(value: string) => {
if (disabled) return;
MoonbaseSettingsStore.setExtensionConfig(ext.id, name, value);
···
}
function MultiSelect({ ext, name, setting, disabled }: SettingsProps) {
-
const { FormItem, FormText, Select, useVariableSelect, multiSelect } =
-
Components;
-
const { value, displayName, description } = useConfigEntry<string | string[]>(
-
ext.uniqueId,
-
name
-
);
+
const { FormItem, FormText, Select, useVariableSelect, multiSelect } = Components;
+
const { value, displayName, description } = useConfigEntry<string | string[]>(ext.uniqueId, name);
const castedSetting = setting as MultiSelectSettingType;
const options = castedSetting.options;
return (
<FormItem className={Margins.marginTop20} title={displayName}>
-
{description && (
-
<FormText className={Margins.marginBottom8}>{description}</FormText>
-
)}
+
{description && <FormText className={Margins.marginBottom8}>{description}</FormText>}
<Select
autofocus={false}
clearable={false}
closeOnSelect={false}
-
options={options.map((o: SelectOption) =>
-
typeof o === "string" ? { value: o, label: o } : o
-
)}
+
options={options.map((o: SelectOption) => (typeof o === "string" ? { value: o, label: o } : o))}
{...useVariableSelect({
onSelectInteraction: multiSelect,
value: new Set(Array.isArray(value) ? value : [value]),
onChange: (value: string) => {
if (disabled) return;
-
MoonbaseSettingsStore.setExtensionConfig(
-
ext.id,
-
name,
-
Array.from(value)
-
);
+
MoonbaseSettingsStore.setExtensionConfig(ext.id, name, Array.from(value));
}
})}
/>
···
);
}
-
const RemoveButtonClasses = spacepack.findByCode("removeButtonContainer")[0]
-
.exports;
+
const RemoveButtonClasses = spacepack.findByCode("removeButtonContainer")[0].exports;
// FIXME: type component keys
const { CircleXIcon } = Components;
-
function RemoveEntryButton({
-
onClick,
-
disabled
-
}: {
-
onClick: () => void;
-
disabled: boolean;
-
}) {
+
function RemoveEntryButton({ onClick, disabled }: { onClick: () => void; disabled: boolean }) {
const { Tooltip, Clickable } = Components;
return (
<div className={RemoveButtonClasses.removeButtonContainer}>
<Tooltip text="Remove entry" position="top">
{(props: any) => (
-
<Clickable
-
{...props}
-
className={RemoveButtonClasses.removeButton}
-
onClick={onClick}
-
>
+
<Clickable {...props} className={RemoveButtonClasses.removeButton} onClick={onClick}>
<CircleXIcon width={16} height={16} />
</Clickable>
)}
···
function List({ ext, name, setting, disabled }: SettingsProps) {
const { FormItem, FormText, TextInput, Button } = Components;
-
const { value, displayName, description } = useConfigEntry<string[]>(
-
ext.uniqueId,
-
name
-
);
+
const { value, displayName, description } = useConfigEntry<string[]>(ext.uniqueId, name);
const entries = value ?? [];
-
const updateConfig = () =>
-
MoonbaseSettingsStore.setExtensionConfig(ext.id, name, entries);
+
const updateConfig = () => MoonbaseSettingsStore.setExtensionConfig(ext.id, name, entries);
return (
<FormItem className={Margins.marginTop20} title={displayName}>
-
{description && (
-
<FormText className={Margins.marginBottom4}>{description}</FormText>
-
)}
+
{description && <FormText className={Margins.marginBottom4}>{description}</FormText>}
<Flex direction={Flex.Direction.VERTICAL}>
{entries.map((val, i) => (
// FIXME: stylesheets
···
function Dictionary({ ext, name, setting, disabled }: SettingsProps) {
const { FormItem, FormText, TextInput, Button } = Components;
-
const { value, displayName, description } = useConfigEntry<
-
Record<string, string>
-
>(ext.uniqueId, name);
+
const { value, displayName, description } = useConfigEntry<Record<string, string>>(ext.uniqueId, name);
const entries = Object.entries(value ?? {});
-
const updateConfig = () =>
-
MoonbaseSettingsStore.setExtensionConfig(
-
ext.id,
-
name,
-
Object.fromEntries(entries)
-
);
+
const updateConfig = () => MoonbaseSettingsStore.setExtensionConfig(ext.id, name, Object.fromEntries(entries));
return (
<FormItem className={Margins.marginTop20} title={displayName}>
-
{description && (
-
<FormText className={Margins.marginBottom4}>{description}</FormText>
-
)}
+
{description && <FormText className={Margins.marginBottom4}>{description}</FormText>}
<Flex direction={Flex.Direction.VERTICAL}>
{entries.map(([key, val], i) => (
// FIXME: stylesheets
···
[MoonbaseSettingsStore],
() => {
return {
-
component: MoonbaseSettingsStore.getExtensionConfigComponent(
-
ext.id,
-
name
-
)
+
component: MoonbaseSettingsStore.getExtensionConfigComponent(ext.id, name)
};
},
[ext.uniqueId, name]
···
}
return (
-
<Component
-
value={value}
-
setValue={(value) =>
-
MoonbaseSettingsStore.setExtensionConfig(ext.id, name, value)
-
}
-
/>
+
<Component value={value} setValue={(value) => MoonbaseSettingsStore.setExtensionConfig(ext.id, name, value)} />
);
}
+6 -25
packages/core-extensions/src/moonbase/webpackModules/ui/index.tsx
···
import React from "@moonlight-mod/wp/react";
import spacepack from "@moonlight-mod/wp/spacepack_spacepack";
-
import {
-
Text,
-
TabBar
-
} from "@moonlight-mod/wp/discord/components/common/index";
+
import { Text, TabBar } from "@moonlight-mod/wp/discord/components/common/index";
import { useStateFromStores } from "@moonlight-mod/wp/discord/packages/flux";
import { UserSettingsModalStore } from "@moonlight-mod/wp/common_stores";
···
import Update from "./update";
const { Divider } = spacepack.findByCode(".forumOrHome]:")[0].exports.Z;
-
const TitleBarClasses = spacepack.findByCode("iconWrapper:", "children:")[0]
-
.exports;
+
const TitleBarClasses = spacepack.findByCode("iconWrapper:", "children:")[0].exports;
const TabBarClasses = spacepack.findByCode("nowPlayingColumn:")[0].exports;
-
const { setSection, clearSubsection } = spacepack.findByExports(
-
"setSection",
-
"clearSubsection"
-
)[0].exports.Z;
+
const { setSection, clearSubsection } = spacepack.findByExports("setSection", "clearSubsection")[0].exports.Z;
const Margins = spacepack.require("discord/styles/shared/Margins.css");
export const pages: {
···
];
export function Moonbase(props: { initialTab?: number } = {}) {
-
const subsection = useStateFromStores(
-
[UserSettingsModalStore],
-
() => UserSettingsModalStore.getSubsection() ?? 0
-
);
+
const subsection = useStateFromStores([UserSettingsModalStore], () => UserSettingsModalStore.getSubsection() ?? 0);
const setSubsection = React.useCallback(
(to: string) => {
if (subsection !== to) setSection("moonbase", to);
···
return (
<>
<div className={`${TitleBarClasses.children} ${Margins.marginBottom20}`}>
-
<Text
-
className={TitleBarClasses.titleWrapper}
-
variant="heading-lg/semibold"
-
tag="h2"
-
>
+
<Text className={TitleBarClasses.titleWrapper} variant="heading-lg/semibold" tag="h2">
Moonbase
</Text>
<Divider />
-
<TabBar
-
selectedItem={subsection}
-
onItemSelect={setSubsection}
-
type="top-pill"
-
className={TabBarClasses.tabBar}
-
>
+
<TabBar selectedItem={subsection} onItemSelect={setSubsection} type="top-pill" className={TabBarClasses.tabBar}>
{pages.map((page, i) => (
<TabBar.Item key={page.id} id={i} className={TabBarClasses.item}>
{page.name}
+5 -18
packages/core-extensions/src/moonbase/webpackModules/ui/update.tsx
···
const { ThemeDarkIcon, Text, Button } = Components;
const Margins = spacepack.require("discord/styles/shared/Margins.css");
-
const HelpMessageClasses = spacepack.findByExports("positive", "iconDiv")[0]
-
.exports;
+
const HelpMessageClasses = spacepack.findByExports("positive", "iconDiv")[0].exports;
const logger = moonlight.getLogger("moonbase/ui/update");
···
[UpdateState.Ready]: "A new version of moonlight is available.",
[UpdateState.Working]: "Updating moonlight...",
[UpdateState.Installed]: "Updated. Restart Discord to apply changes.",
-
[UpdateState.Failed]:
-
"Failed to update moonlight. Please use the installer instead."
+
[UpdateState.Failed]: "Failed to update moonlight. Please use the installer instead."
};
export default function Update() {
const [state, setState] = React.useState(UpdateState.Ready);
-
const newVersion = useStateFromStores(
-
[MoonbaseSettingsStore],
-
() => MoonbaseSettingsStore.newVersion
-
);
+
const newVersion = useStateFromStores([MoonbaseSettingsStore], () => MoonbaseSettingsStore.newVersion);
if (newVersion == null) return null;
···
alignItems: "center"
}}
>
-
<ThemeDarkIcon
-
size="sm"
-
color="currentColor"
-
className={HelpMessageClasses.icon}
-
/>
+
<ThemeDarkIcon size="sm" color="currentColor" className={HelpMessageClasses.icon} />
</div>
-
<Text
-
variant="text-sm/medium"
-
color="currentColor"
-
className={HelpMessageClasses.text}
-
>
+
<Text variant="text-sm/medium" color="currentColor" className={HelpMessageClasses.text}>
{strings[state]}
</Text>
</Flex>
+5 -23
packages/core-extensions/src/moonbase/webpackModules/updates.tsx
···
// FIXME: not indexed as importable
const Constants = spacepack.require("discord/Constants");
-
const UserSettingsSections = spacepack.findObjectFromKey(
-
Constants,
-
"APPEARANCE_THEME_PICKER"
-
);
+
const UserSettingsSections = spacepack.findObjectFromKey(Constants, "APPEARANCE_THEME_PICKER");
const { ThemeDarkIcon } = Components;
···
function listener() {
if (
MoonbaseSettingsStore.shouldShowNotice &&
-
MoonbaseSettingsStore.getExtensionConfigRaw(
-
"moonbase",
-
"updateBanner",
-
true
-
)
+
MoonbaseSettingsStore.getExtensionConfigRaw("moonbase", "updateBanner", true)
) {
// @ts-expect-error epic type fail
MoonbaseSettingsStore.removeChangeListener(listener);
const version = MoonbaseSettingsStore.newVersion;
-
const extensionUpdateCount = Object.keys(
-
MoonbaseSettingsStore.updates
-
).length;
+
const extensionUpdateCount = Object.keys(MoonbaseSettingsStore.updates).length;
const hasExtensionUpdates = extensionUpdateCount > 0;
let message;
···
{
name: "Open Moonbase",
onClick: () => {
-
const { open } = spacepack.findByExports(
-
"setSection",
-
"clearSubsection"
-
)[0].exports.Z;
+
const { open } = spacepack.findByExports("setSection", "clearSubsection")[0].exports.Z;
// settings is lazy loaded thus lazily patched
// FIXME: figure out a way to detect if settings has been opened
// alreadyjust so the transition isnt as jarring
open(UserSettingsSections.ACCOUNT);
setTimeout(() => {
-
if (
-
MoonbaseSettingsStore.getExtensionConfigRaw<boolean>(
-
"moonbase",
-
"sections",
-
false
-
)
-
) {
+
if (MoonbaseSettingsStore.getExtensionConfigRaw<boolean>("moonbase", "sections", false)) {
open("moonbase-extensions");
} else {
open("moonbase", 0);
+9 -42
packages/core-extensions/src/nativeFixes/host.ts
···
import { app, nativeTheme } from "electron";
-
const enabledFeatures = app.commandLine
-
.getSwitchValue("enable-features")
-
.split(",");
+
const enabledFeatures = app.commandLine.getSwitchValue("enable-features").split(",");
moonlightHost.events.on("window-created", function (browserWindow) {
-
if (
-
moonlightHost.getConfigOption<boolean>("nativeFixes", "devtoolsThemeFix") ??
-
true
-
) {
+
if (moonlightHost.getConfigOption<boolean>("nativeFixes", "devtoolsThemeFix") ?? true) {
browserWindow.webContents.on("devtools-opened", () => {
if (!nativeTheme.shouldUseDarkColors) return;
nativeTheme.themeSource = "light";
···
}
});
-
if (
-
moonlightHost.getConfigOption<boolean>(
-
"nativeFixes",
-
"disableRendererBackgrounding"
-
) ??
-
true
-
) {
+
if (moonlightHost.getConfigOption<boolean>("nativeFixes", "disableRendererBackgrounding") ?? true) {
// Discord already disables UseEcoQoSForBackgroundProcess and some other
// related features
app.commandLine.appendSwitch("disable-renderer-backgrounding");
···
}
if (process.platform === "linux") {
-
if (
-
moonlightHost.getConfigOption<boolean>("nativeFixes", "linuxAutoscroll") ??
-
false
-
) {
-
app.commandLine.appendSwitch(
-
"enable-blink-features",
-
"MiddleClickAutoscroll"
-
);
+
if (moonlightHost.getConfigOption<boolean>("nativeFixes", "linuxAutoscroll") ?? false) {
+
app.commandLine.appendSwitch("enable-blink-features", "MiddleClickAutoscroll");
}
-
if (
-
moonlightHost.getConfigOption<boolean>(
-
"nativeFixes",
-
"linuxSpeechDispatcher"
-
) ??
-
true
-
) {
+
if (moonlightHost.getConfigOption<boolean>("nativeFixes", "linuxSpeechDispatcher") ?? true) {
app.commandLine.appendSwitch("enable-speech-dispatcher");
}
}
···
// NOTE: Only tested if this appears on Windows, it should appear on all when
// hardware acceleration is disabled
const noAccel = app.commandLine.hasSwitch("disable-gpu-compositing");
-
if (
-
(moonlightHost.getConfigOption<boolean>("nativeFixes", "vaapi") ?? true) &&
-
!noAccel
-
) {
+
if ((moonlightHost.getConfigOption<boolean>("nativeFixes", "vaapi") ?? true) && !noAccel) {
if (process.platform === "linux")
// These will eventually be renamed https://source.chromium.org/chromium/chromium/src/+/5482210941a94d70406b8da962426e4faca7fce4
-
enabledFeatures.push(
-
"VaapiVideoEncoder",
-
"VaapiVideoDecoder",
-
"VaapiVideoDecodeLinuxGL"
-
);
+
enabledFeatures.push("VaapiVideoEncoder", "VaapiVideoDecoder", "VaapiVideoDecodeLinuxGL");
}
-
app.commandLine.appendSwitch(
-
"enable-features",
-
[...new Set(enabledFeatures)].join(",")
-
);
+
app.commandLine.appendSwitch("enable-features", [...new Set(enabledFeatures)].join(","));
+2 -6
packages/core-extensions/src/notices/index.ts
···
{
find: ".GUILD_RAID_NOTIFICATION:",
replace: {
-
match:
-
/(?<=return(\(0,.\.jsx\))\(.+?\);)case .{1,2}\..{1,3}\.GUILD_RAID_NOTIFICATION:/,
+
match: /(?<=return(\(0,.\.jsx\))\(.+?\);)case .{1,2}\..{1,3}\.GUILD_RAID_NOTIFICATION:/,
replacement: (orig, createElement) =>
`case "__moonlight_notice":return${createElement}(require("notices_component").default,{});${orig}`
}
···
export const webpackModules: Record<string, ExtensionWebpackModule> = {
notices: {
-
dependencies: [
-
{ id: "discord/packages/flux" },
-
{ id: "discord/Dispatcher" }
-
]
+
dependencies: [{ id: "discord/packages/flux" }, { id: "discord/Dispatcher" }]
},
component: {
+1 -4
packages/core-extensions/src/notices/webpackModules/component.tsx
···
{notice.element}
{(notice.showClose ?? true) && (
-
<NoticeCloseButton
-
onClick={() => popAndDismiss(notice)}
-
noticeType="__moonlight_notice"
-
/>
+
<NoticeCloseButton onClick={() => popAndDismiss(notice)} noticeType="__moonlight_notice" />
)}
{(notice.buttons ?? []).map((button) => (
+1 -4
packages/core-extensions/src/notices/webpackModules/notices.ts
···
import { Store } from "@moonlight-mod/wp/discord/packages/flux";
import Dispatcher from "@moonlight-mod/wp/discord/Dispatcher";
-
import type {
-
Notice,
-
Notices
-
} from "@moonlight-mod/types/coreExtensions/notices";
+
import type { Notice, Notices } from "@moonlight-mod/types/coreExtensions/notices";
// very lazy way of doing this, FIXME
let open = false;
+9 -34
packages/core-extensions/src/quietLoggers/index.ts
···
import { Patch } from "@moonlight-mod/types";
const notXssDefensesOnly = () =>
-
(moonlight.getConfigOption<boolean>("quietLoggers", "xssDefensesOnly") ??
-
false) === false;
+
(moonlight.getConfigOption<boolean>("quietLoggers", "xssDefensesOnly") ?? false) === false;
// These patches MUST run before the simple patches, these are to remove loggers
// that end up causing syntax errors by the normal patch
···
// Patches to simply remove a logger call
const stubPatches = [
// "sh" is not a valid locale.
-
[
-
"is not a valid locale",
-
/(.)\.error\(""\.concat\((.)," is not a valid locale\."\)\)/g
-
],
+
["is not a valid locale", /(.)\.error\(""\.concat\((.)," is not a valid locale\."\)\)/g],
['="RunningGameStore"', /.\.info\("games",{.+?}\),/],
-
[
-
'"[BUILD INFO] Release Channel: "',
-
/new .{1,2}\.Z\(\)\.log\("\[BUILD INFO\] Release Channel: ".+?"\)\),/
-
],
-
[
-
'.APP_NATIVE_CRASH,"Storage"',
-
/console\.log\("AppCrashedFatalReport lastCrash:",.,.\);/
-
],
-
[
-
'.APP_NATIVE_CRASH,"Storage"',
-
'console.log("AppCrashedFatalReport: getLastCrash not supported.");'
-
],
+
['"[BUILD INFO] Release Channel: "', /new .{1,2}\.Z\(\)\.log\("\[BUILD INFO\] Release Channel: ".+?"\)\),/],
+
['.APP_NATIVE_CRASH,"Storage"', /console\.log\("AppCrashedFatalReport lastCrash:",.,.\);/],
+
['.APP_NATIVE_CRASH,"Storage"', 'console.log("AppCrashedFatalReport: getLastCrash not supported.");'],
['"[NATIVE INFO] ', /new .{1,2}\.Z\(\)\.log\("\[NATIVE INFO] .+?\)\);/],
['"Spellchecker"', /.\.info\("Switching to ".+?"\(unavailable\)"\);?/g],
-
[
-
'throw Error("Messages are still loading.");',
-
/console\.warn\("Unsupported Locale",.\),/
-
],
+
['throw Error("Messages are still loading.");', /console\.warn\("Unsupported Locale",.\),/],
["}_dispatchWithDevtools(", /.\.totalTime>100&&.\.verbose\(.+?\);/],
-
[
-
'"NativeDispatchUtils"',
-
/null==.&&.\.warn\("Tried getting Dispatch instance before instantiated"\),/
-
],
+
['"NativeDispatchUtils"', /null==.&&.\.warn\("Tried getting Dispatch instance before instantiated"\),/],
['("DatabaseManager")', /.\.log\("removing database \(user: ".+?\)\),/],
[
'"Dispatch.dispatch(...): Cannot dispatch in the middle of a dispatch. Action: "',
/.\.has\(.\.type\)&&.\.log\(.+?\.type\)\),/
],
-
[
-
'console.warn("Window state not initialized"',
-
/console\.warn\("Window state not initialized",.\),/
-
]
+
['console.warn("Window state not initialized"', /console\.warn\("Window state not initialized",.\),/]
];
const simplePatches = [
···
["suppressDeprecationWarnings=!1", "suppressDeprecationWarnings=!0"],
// Zustand related
-
[
-
/console\.warn\("\[DEPRECATED\] Please use `subscribeWithSelector` middleware"\)/g,
-
"/*$&*/"
-
],
+
[/console\.warn\("\[DEPRECATED\] Please use `subscribeWithSelector` middleware"\)/g, "/*$&*/"],
["this.getDebugLogging()", "false"]
] as { [0]: string | RegExp; [1]: string }[];
+46 -67
packages/core-extensions/src/rocketship/host/permissions.ts
···
details: Electron.PermissionCheckHandlerHandlerDetails
) => boolean;
-
moonlightHost.events.on(
-
"window-created",
-
(window: BrowserWindow, isMainWindow: boolean) => {
-
if (!isMainWindow) return;
-
const windowSession = window.webContents.session;
+
moonlightHost.events.on("window-created", (window: BrowserWindow, isMainWindow: boolean) => {
+
if (!isMainWindow) return;
+
const windowSession = window.webContents.session;
-
// setPermissionRequestHandler
-
windowSession.setPermissionRequestHandler(
-
(webcontents, permission, callback, details) => {
-
let cbResult = false;
-
function fakeCallback(result: boolean) {
-
cbResult = result;
-
}
+
// setPermissionRequestHandler
+
windowSession.setPermissionRequestHandler((webcontents, permission, callback, details) => {
+
let cbResult = false;
+
function fakeCallback(result: boolean) {
+
cbResult = result;
+
}
-
if (caughtPermissionRequestHandler) {
-
caughtPermissionRequestHandler(
-
webcontents,
-
permission,
-
fakeCallback,
-
details
-
);
-
}
+
if (caughtPermissionRequestHandler) {
+
caughtPermissionRequestHandler(webcontents, permission, fakeCallback, details);
+
}
-
if (permission === "media" || permission === "display-capture") {
-
cbResult = true;
-
}
+
if (permission === "media" || permission === "display-capture") {
+
cbResult = true;
+
}
-
callback(cbResult);
-
}
-
);
+
callback(cbResult);
+
});
-
let caughtPermissionRequestHandler: PermissionRequestHandler | undefined;
+
let caughtPermissionRequestHandler: PermissionRequestHandler | undefined;
-
windowSession.setPermissionRequestHandler =
-
function catchSetPermissionRequestHandler(
-
handler: (
-
webcontents: Electron.WebContents,
-
permission: string,
-
callback: (permissionGranted: boolean) => void
-
) => void
-
) {
-
caughtPermissionRequestHandler = handler;
-
};
+
windowSession.setPermissionRequestHandler = function catchSetPermissionRequestHandler(
+
handler: (
+
webcontents: Electron.WebContents,
+
permission: string,
+
callback: (permissionGranted: boolean) => void
+
) => void
+
) {
+
caughtPermissionRequestHandler = handler;
+
};
-
// setPermissionCheckHandler
-
windowSession.setPermissionCheckHandler(
-
(webcontents, permission, requestingOrigin, details) => {
-
return false;
-
}
-
);
+
// setPermissionCheckHandler
+
windowSession.setPermissionCheckHandler((webcontents, permission, requestingOrigin, details) => {
+
return false;
+
});
-
let caughtPermissionCheckHandler: PermissionCheckHandler | undefined;
+
let caughtPermissionCheckHandler: PermissionCheckHandler | undefined;
-
windowSession.setPermissionCheckHandler(
-
(webcontents, permission, requestingOrigin, details) => {
-
let result = false;
+
windowSession.setPermissionCheckHandler((webcontents, permission, requestingOrigin, details) => {
+
let result = false;
-
if (caughtPermissionCheckHandler) {
-
result = caughtPermissionCheckHandler(
-
webcontents,
-
permission,
-
requestingOrigin,
-
details
-
);
-
}
+
if (caughtPermissionCheckHandler) {
+
result = caughtPermissionCheckHandler(webcontents, permission, requestingOrigin, details);
+
}
-
if (permission === "media" || permission === "display-capture") {
-
result = true;
-
}
+
if (permission === "media" || permission === "display-capture") {
+
result = true;
+
}
-
return result;
-
}
-
);
+
return result;
+
});
-
windowSession.setPermissionCheckHandler =
-
function catchSetPermissionCheckHandler(handler: PermissionCheckHandler) {
-
caughtPermissionCheckHandler = handler;
-
};
-
}
-
);
+
windowSession.setPermissionCheckHandler = function catchSetPermissionCheckHandler(handler: PermissionCheckHandler) {
+
caughtPermissionCheckHandler = handler;
+
};
+
});
+4 -12
packages/core-extensions/src/rocketship/host/types.ts
···
// https://github.com/Vencord/venmic/blob/d737ef33eaae7a73d03ec02673e008cf0243434d/lib/module.d.ts
type DefaultProps = "node.name" | "application.name";
-
type LiteralUnion<LiteralType, BaseType extends string> =
-
| LiteralType
-
| (BaseType & Record<never, never>);
+
type LiteralUnion<LiteralType, BaseType extends string> = LiteralType | (BaseType & Record<never, never>);
-
type Optional<Type, Key extends keyof Type> = Partial<Pick<Type, Key>> &
-
Omit<Type, Key>;
+
type Optional<Type, Key extends keyof Type> = Partial<Pick<Type, Key>> & Omit<Type, Key>;
-
export type Node<T extends string = never> = Record<
-
LiteralUnion<T, string>,
-
string
-
>;
+
export type Node<T extends string = never> = Record<LiteralUnion<T, string>, string>;
export interface LinkData {
include: Node[];
···
unlink(): void;
list<T extends string = DefaultProps>(props?: T[]): Node<T>[];
-
link(
-
data: Optional<LinkData, "exclude"> | Optional<LinkData, "include">
-
): boolean;
+
link(data: Optional<LinkData, "exclude"> | Optional<LinkData, "include">): boolean;
}
+23 -31
packages/core-extensions/src/rocketship/host/venmic.ts
···
function getPatchbay() {
try {
-
const venmic = require(
-
path.join(path.dirname(moonlightHost.asarPath), "..", "venmic.node")
-
) as { PatchBay: new () => PatchBay };
+
const venmic = require(path.join(path.dirname(moonlightHost.asarPath), "..", "venmic.node")) as {
+
PatchBay: new () => PatchBay;
+
};
const patchbay = new venmic.PatchBay();
return patchbay;
} catch (error) {
···
patchbay.unlink();
return patchbay.link({
-
exclude: [
-
{ "application.process.id": pid },
-
{ "media.class": "Stream/Input/Audio" }
-
],
+
exclude: [{ "application.process.id": pid }, { "media.class": "Stream/Input/Audio" }],
ignore_devices: true,
only_speakers: true,
only_default_speakers: true
···
}
}
-
moonlightHost.events.on(
-
"window-created",
-
(window: BrowserWindow, isMainWindow: boolean) => {
-
if (!isMainWindow) return;
-
const windowSession = window.webContents.session;
+
moonlightHost.events.on("window-created", (window: BrowserWindow, isMainWindow: boolean) => {
+
if (!isMainWindow) return;
+
const windowSession = window.webContents.session;
-
// @ts-expect-error these types ancient
-
windowSession.setDisplayMediaRequestHandler(
-
(request: any, callback: any) => {
-
const linked = linkVenmic();
-
desktopCapturer
-
.getSources({ types: ["screen", "window"] })
-
.then((sources) => {
-
//logger.debug("desktopCapturer.getSources", sources);
-
logger.debug("Linked to venmic:", linked);
+
// @ts-expect-error these types ancient
+
windowSession.setDisplayMediaRequestHandler(
+
(request: any, callback: any) => {
+
const linked = linkVenmic();
+
desktopCapturer.getSources({ types: ["screen", "window"] }).then((sources) => {
+
//logger.debug("desktopCapturer.getSources", sources);
+
logger.debug("Linked to venmic:", linked);
-
callback({
-
video: sources[0],
-
audio: "loopback"
-
});
-
});
-
},
-
{ useSystemPicker: true }
-
);
-
}
-
);
+
callback({
+
video: sources[0],
+
audio: "loopback"
+
});
+
});
+
},
+
{ useSystemPicker: true }
+
);
+
});
+5 -11
packages/core-extensions/src/rocketship/index.ts
···
logger.debug("Devices:", devices);
// This isn't vencord :(
-
const id = devices.find((device) => device.label === "vencord-screen-share")
-
?.deviceId;
+
const id = devices.find((device) => device.label === "vencord-screen-share")?.deviceId;
if (!id) return null;
logger.debug("Got venmic device ID:", id);
···
}
}
-
navigator.mediaDevices.getDisplayMedia = async function getDisplayMediaRedirect(
-
options
-
) {
+
navigator.mediaDevices.getDisplayMedia = async function getDisplayMediaRedirect(options) {
const orig = await getDisplayMediaOrig.call(this, options);
const venmic = await getVenmicStream();
···
replace: [
// Prevent loading of krisp native module by stubbing out desktop checks
{
-
match:
-
/\(\(0,.\.isWindows\)\(\)\|\|\(0,.\.isLinux\)\(\)\|\|.+?&&!__OVERLAY__/,
+
match: /\(\(0,.\.isWindows\)\(\)\|\|\(0,.\.isLinux\)\(\)\|\|.+?&&!__OVERLAY__/,
replacement: (orig, macosPlatformCheck) => `false&&!__OVERLAY__`
},
// Enable loading of web krisp equivelant by replacing isWeb with true
{
-
match:
-
/\(0,.\.isWeb\)\(\)&&(.{1,2}\.supports\(.{1,2}\..{1,2}.NOISE_CANCELLATION)/,
-
replacement: (orig, supportsNoiseCancellation) =>
-
`true&&${supportsNoiseCancellation}`
+
match: /\(0,.\.isWeb\)\(\)&&(.{1,2}\.supports\(.{1,2}\..{1,2}.NOISE_CANCELLATION)/,
+
replacement: (orig, supportsNoiseCancellation) => `true&&${supportsNoiseCancellation}`
}
]
}
+2 -4
packages/core-extensions/src/settings/index.ts
···
find: '"useGenerateUserSettingsSections"',
replace: {
match: /(?<=\.push\(.+?\)}\)\)}\),)(.+?)}/,
-
replacement: (_, sections: string) =>
-
`require("settings_settings").Settings._mutateSections(${sections})}`
+
replacement: (_, sections: string) => `require("settings_settings").Settings._mutateSections(${sections})}`
}
},
{
···
replacement: (orig, sections, section) =>
`${orig.replace(
/Object\.values\(.\..+?\)/,
-
(orig) =>
-
`[...require("settings_settings").Settings.sectionNames,...${orig}]`
+
(orig) => `[...require("settings_settings").Settings.sectionNames,...${orig}]`
)}??${sections}.find(x=>x.section==${section})?._moonlight_submenu?.()`
}
}
+3 -11
packages/core-extensions/src/settings/webpackModules/settings.ts
···
-
import {
-
SettingsSection,
-
Settings as SettingsType
-
} from "@moonlight-mod/types/coreExtensions/settings";
+
import { SettingsSection, Settings as SettingsType } from "@moonlight-mod/types/coreExtensions/settings";
export const Settings: SettingsType = {
ourSections: [],
···
},
addSectionMenuItems(section, ...newItems) {
const data = Settings.ourSections.find((x) => x.section === section);
-
if (!data || !("element" in data))
-
throw new Error(`Could not find section "${section}"`);
+
if (!data || !("element" in data)) throw new Error(`Could not find section "${section}"`);
(Settings.sectionMenuItems[section] ??= []).push(...newItems);
data._moonlight_submenu ??= () => Settings.sectionMenuItems[section];
},
···
_mutateSections: (sections) => {
for (const section of Settings.ourSections) {
-
sections.splice(
-
section.pos < 0 ? sections.length + section.pos : section.pos,
-
0,
-
section
-
);
+
sections.splice(section.pos < 0 ? sections.length + section.pos : section.pos, 0, section);
}
return sections;
+13 -46
packages/core-extensions/src/spacepack/webpackModules/spacepack.ts
···
-
import {
-
WebpackModule,
-
WebpackModuleFunc,
-
WebpackRequireType
-
} from "@moonlight-mod/types";
+
import { WebpackModule, WebpackModuleFunc, WebpackRequireType } from "@moonlight-mod/types";
import { Spacepack } from "@moonlight-mod/types/coreExtensions/spacepack";
const webpackRequire = require as unknown as WebpackRequireType;
···
"module",
"exports",
"require",
-
`(${funcStr}).apply(this, arguments)\n` +
-
`//# sourceURL=Webpack-Module-${module}`
+
`(${funcStr}).apply(this, arguments)\n` + `//# sourceURL=Webpack-Module-${module}`
) as WebpackModuleFunc;
},
···
.filter(
([id, mod]) =>
!args.some(
-
(item) =>
-
!(item instanceof RegExp
-
? item.test(mod.toString())
-
: mod.toString().indexOf(item) !== -1)
+
(item) => !(item instanceof RegExp ? item.test(mod.toString()) : mod.toString().indexOf(item) !== -1)
)
)
.map(([id]) => {
···
!(
exports !== undefined &&
exports !== window &&
-
(exports?.[item] ||
-
exports?.default?.[item] ||
-
exports?.Z?.[item] ||
-
exports?.ZP?.[item])
+
(exports?.[item] || exports?.default?.[item] || exports?.Z?.[item] || exports?.ZP?.[item])
)
)
)
···
return null;
},
-
findObjectFromKeyValuePair: (
-
exports: Record<string, any>,
-
key: string,
-
value: any
-
) => {
+
findObjectFromKeyValuePair: (exports: Record<string, any>, key: string, value: any) => {
for (const exportKey in exports) {
const obj = exports[exportKey];
// eslint-disable-next-line eqeqeq
···
return null;
},
-
findFunctionByStrings: (
-
exports: Record<string, any>,
-
...strings: (string | RegExp)[]
-
) => {
+
findFunctionByStrings: (exports: Record<string, any>, ...strings: (string | RegExp)[]) => {
return (
Object.entries(exports).filter(
([index, func]) =>
typeof func === "function" &&
!strings.some(
-
(query) =>
-
!(query instanceof RegExp
-
? func.toString().match(query)
-
: func.toString().includes(query))
+
(query) => !(query instanceof RegExp ? func.toString().match(query) : func.toString().includes(query))
)
)?.[0]?.[1] ?? null
);
},
-
lazyLoad: (
-
find: string | RegExp | (string | RegExp)[],
-
chunk: RegExp,
-
module: RegExp
-
) => {
-
const mod = Array.isArray(find)
-
? spacepack.findByCode(...find)
-
: spacepack.findByCode(find);
+
lazyLoad: (find: string | RegExp | (string | RegExp)[], chunk: RegExp, module: RegExp) => {
+
const mod = Array.isArray(find) ? spacepack.findByCode(...find) : spacepack.findByCode(find);
if (mod.length < 1) return Promise.reject("Module find failed");
const findId = mod[0].id;
···
chunkIds = [...findCode.matchAll(chunk)].map(([, id]) => id);
} else {
const match = findCode.match(chunk);
-
if (match)
-
chunkIds = [...match[0].matchAll(/"(\d+)"/g)].map(([, id]) => id);
+
if (match) chunkIds = [...match[0].matchAll(/"(\d+)"/g)].map(([, id]) => id);
}
-
if (!chunkIds || chunkIds.length === 0)
-
return Promise.reject("Chunk ID match failed");
+
if (!chunkIds || chunkIds.length === 0) return Promise.reject("Chunk ID match failed");
const moduleId = findCode.match(module)?.[1];
if (!moduleId) return Promise.reject("Module ID match failed");
-
return Promise.all(chunkIds.map((c) => webpackRequire.e(c))).then(() =>
-
webpackRequire(moduleId)
-
);
+
return Promise.all(chunkIds.map((c) => webpackRequire.e(c))).then(() => webpackRequire(moduleId));
},
filterReal: (modules: WebpackModule[]) => {
···
}
};
-
if (
-
moonlight.getConfigOption<boolean>("spacepack", "addToGlobalScope") === true
-
) {
+
if (moonlight.getConfigOption<boolean>("spacepack", "addToGlobalScope") === true) {
window.spacepack = spacepack;
}
+2 -7
packages/core/src/config.ts
···
export async function writeConfig(config: Config) {
try {
const configPath = await getConfigPath();
-
await moonlightFS.writeFileString(
-
configPath,
-
JSON.stringify(config, null, 2)
-
);
+
await moonlightFS.writeFileString(configPath, JSON.stringify(config, null, 2));
} catch (e) {
logger.error("Failed to write config", e);
}
···
return defaultConfig;
} else {
try {
-
let config: Config = JSON.parse(
-
await moonlightFS.readFileString(configPath)
-
);
+
let config: Config = JSON.parse(await moonlightFS.readFileString(configPath));
// Assign the default values if they don't exist (newly added)
config = { ...defaultConfig, ...config };
await writeConfig(config);
+15 -59
packages/core/src/extension.ts
···
-
import {
-
ExtensionManifest,
-
DetectedExtension,
-
ExtensionLoadSource,
-
constants
-
} from "@moonlight-mod/types";
+
import { ExtensionManifest, DetectedExtension, ExtensionLoadSource, constants } from "@moonlight-mod/types";
import { readConfig } from "./config";
import { getCoreExtensionsPath, getExtensionsPath } from "./util/data";
import Logger from "./util/logger";
···
return ret;
}
-
async function loadDetectedExtensions(
-
dir: string,
-
type: ExtensionLoadSource
-
): Promise<DetectedExtension[]> {
+
async function loadDetectedExtensions(dir: string, type: ExtensionLoadSource): Promise<DetectedExtension[]> {
const ret: DetectedExtension[] = [];
const manifests = await findManifests(dir);
···
if (!(await moonlightFS.exists(manifestPath))) continue;
const dir = moonlightFS.dirname(manifestPath);
-
const manifest: ExtensionManifest = JSON.parse(
-
await moonlightFS.readFileString(manifestPath)
-
);
+
const manifest: ExtensionManifest = JSON.parse(await moonlightFS.readFileString(manifestPath));
const webPath = moonlightFS.join(dir, "index.js");
const nodePath = moonlightFS.join(dir, "node.js");
const hostPath = moonlightFS.join(dir, "host.js");
// if none exist (empty manifest) don't give a shit
-
if (
-
!moonlightFS.exists(webPath) &&
-
!moonlightFS.exists(nodePath) &&
-
!moonlightFS.exists(hostPath)
-
) {
+
if (!moonlightFS.exists(webPath) && !moonlightFS.exists(nodePath) && !moonlightFS.exists(hostPath)) {
continue;
}
-
const web = (await moonlightFS.exists(webPath))
-
? await moonlightFS.readFileString(webPath)
-
: undefined;
+
const web = (await moonlightFS.exists(webPath)) ? await moonlightFS.readFileString(webPath) : undefined;
let url: string | undefined = undefined;
const urlPath = moonlightFS.join(dir, constants.repoUrlFile);
-
if (
-
type === ExtensionLoadSource.Normal &&
-
(await moonlightFS.exists(urlPath))
-
) {
+
if (type === ExtensionLoadSource.Normal && (await moonlightFS.exists(urlPath))) {
url = await moonlightFS.readFileString(urlPath);
}
···
for (const wpModuleFile of wpModulesFile) {
if (wpModuleFile.endsWith(".js")) {
-
wpModules[wpModuleFile.replace(".js", "")] =
-
await moonlightFS.readFileString(
-
moonlightFS.join(wpModulesPath, wpModuleFile)
-
);
+
wpModules[wpModuleFile.replace(".js", "")] = await moonlightFS.readFileString(
+
moonlightFS.join(wpModulesPath, wpModuleFile)
+
);
}
}
}
···
const config = await readConfig();
const res = [];
-
res.push(
-
...(await loadDetectedExtensions(
-
getCoreExtensionsPath(),
-
ExtensionLoadSource.Core
-
))
-
);
+
res.push(...(await loadDetectedExtensions(getCoreExtensionsPath(), ExtensionLoadSource.Core)));
-
res.push(
-
...(await loadDetectedExtensions(
-
await getExtensionsPath(),
-
ExtensionLoadSource.Normal
-
))
-
);
+
res.push(...(await loadDetectedExtensions(await getExtensionsPath(), ExtensionLoadSource.Normal)));
for (const devSearchPath of config.devSearchPaths ?? []) {
-
res.push(
-
...(await loadDetectedExtensions(
-
devSearchPath,
-
ExtensionLoadSource.Developer
-
))
-
);
+
res.push(...(await loadDetectedExtensions(devSearchPath, ExtensionLoadSource.Developer)));
}
return res;
···
// @ts-expect-error shut up
_moonlight_coreExtensionsStr
);
-
const coreExtensions = Array.from(
-
new Set(Object.keys(coreExtensionsFs).map((x) => x.split("/")[0]))
-
);
+
const coreExtensions = Array.from(new Set(Object.keys(coreExtensionsFs).map((x) => x.split("/")[0])));
for (const ext of coreExtensions) {
if (!coreExtensionsFs[`${ext}/index.js`]) continue;
···
const wpModulesPath = `${ext}/webpackModules`;
for (const wpModuleFile of Object.keys(coreExtensionsFs)) {
if (wpModuleFile.startsWith(wpModulesPath)) {
-
wpModules[
-
wpModuleFile.replace(wpModulesPath + "/", "").replace(".js", "")
-
] = coreExtensionsFs[wpModuleFile];
+
wpModules[wpModuleFile.replace(wpModulesPath + "/", "").replace(".js", "")] = coreExtensionsFs[wpModuleFile];
}
}
···
}
if (await moonlightFS.exists("/extensions")) {
-
ret.push(
-
...(await loadDetectedExtensions(
-
"/extensions",
-
ExtensionLoadSource.Normal
-
))
-
);
+
ret.push(...(await loadDetectedExtensions("/extensions", ExtensionLoadSource.Normal)));
}
return ret;
+8 -25
packages/core/src/extension/loader.ts
···
}
if (exports.styles != null) {
-
registerStyles(
-
exports.styles.map((style, i) => `/* ${ext.id}#${i} */ ${style}`)
-
);
+
registerStyles(exports.styles.map((style, i) => `/* ${ext.id}#${i} */ ${style}`));
}
}
}
···
InvalidEnvironment
}
-
export function checkExtensionCompat(
-
manifest: ExtensionManifest
-
): ExtensionCompat {
+
export function checkExtensionCompat(manifest: ExtensionManifest): ExtensionCompat {
let environment;
webTarget: {
environment = ExtensionEnvironment.Web;
···
environment = ExtensionEnvironment.Desktop;
}
-
if (manifest.apiLevel !== constants.apiLevel)
-
return ExtensionCompat.InvalidApiLevel;
-
if (
-
(manifest.environment ?? "both") !== "both" &&
-
manifest.environment !== environment
-
)
+
if (manifest.apiLevel !== constants.apiLevel) return ExtensionCompat.InvalidApiLevel;
+
if ((manifest.environment ?? "both") !== "both" && manifest.environment !== environment)
return ExtensionCompat.InvalidEnvironment;
return ExtensionCompat.Compatible;
}
···
extensions fires an event on completion, which allows us to await the loading
of another extension, resolving dependencies & load order effectively.
*/
-
export async function loadExtensions(
-
exts: DetectedExtension[]
-
): Promise<ProcessedExtensions> {
-
exts = exts.filter(
-
(ext) => checkExtensionCompat(ext.manifest) === ExtensionCompat.Compatible
-
);
+
export async function loadExtensions(exts: DetectedExtension[]): Promise<ProcessedExtensions> {
+
exts = exts.filter((ext) => checkExtensionCompat(ext.manifest) === ExtensionCompat.Compatible);
const config = await readConfig();
const items = exts
···
};
}
-
export async function loadProcessedExtensions({
-
extensions,
-
dependencyGraph
-
}: ProcessedExtensions) {
+
export async function loadProcessedExtensions({ extensions, dependencyGraph }: ProcessedExtensions) {
const eventEmitter = createEventEmitter<EventType, EventPayloads>();
const finished: Set<string> = new Set();
···
);
if (waitPromises.length > 0) {
-
logger.debug(
-
`Waiting on ${waitPromises.length} dependencies for "${ext.id}"`
-
);
+
logger.debug(`Waiting on ${waitPromises.length} dependencies for "${ext.id}"`);
await Promise.all(waitPromises);
}
+21 -59
packages/core/src/patch.ts
···
let webpackModules: Set<IdentifiedWebpackModule> = new Set();
let webpackRequire: WebpackRequireType | null = null;
-
const moduleLoadSubscriptions: Map<string, ((moduleId: string) => void)[]> =
-
new Map();
+
const moduleLoadSubscriptions: Map<string, ((moduleId: string) => void)[]> = new Map();
export function registerPatch(patch: IdentifiedPatch) {
patches.push(patch);
···
}
}
-
export function onModuleLoad(
-
module: string | string[],
-
callback: (moduleId: string) => void
-
): void {
+
export function onModuleLoad(module: string | string[], callback: (moduleId: string) => void): void {
let moduleIds = module;
if (typeof module === "string") {
···
`//# sourceURL=Webpack-Module-${id}`;
try {
-
const func = new Function(
-
"module",
-
"exports",
-
"require",
-
wrapped
-
) as WebpackModuleFunc;
+
const func = new Function("module", "exports", "require", wrapped) as WebpackModuleFunc;
entry[id] = func;
entry[id].__moonlight = true;
return true;
···
// indexOf is faster than includes by 0.25% lmao
const match =
-
typeof patch.find === "string"
-
? moduleString.indexOf(patch.find) !== -1
-
: patch.find.test(moduleString);
+
typeof patch.find === "string" ? moduleString.indexOf(patch.find) !== -1 : patch.find.test(moduleString);
// Global regexes apply to all modules
-
const shouldRemove =
-
typeof patch.find === "string" ? true : !patch.find.global;
+
const shouldRemove = typeof patch.find === "string" ? true : !patch.find.global;
if (match) {
moonlight.unpatched.delete(patch);
···
// We ensured all arrays get turned into normal PatchReplace objects on register
const replace = patch.replace as PatchReplace;
-
if (
-
replace.type === undefined ||
-
replace.type === PatchReplaceType.Normal
-
) {
+
if (replace.type === undefined || replace.type === PatchReplaceType.Normal) {
// Add support for \i to match rspack's minified names
if (typeof replace.match !== "string") {
-
replace.match = new RegExp(
-
replace.match.source.replace(/\\i/g, "[A-Za-z_$][\\w$]*"),
-
replace.match.flags
-
);
+
replace.match = new RegExp(replace.match.source.replace(/\\i/g, "[A-Za-z_$][\\w$]*"), replace.match.flags);
}
// tsc fails to detect the overloads for this, so I'll just do this
// Verbose, but it works
···
const newModule = replace.replacement(moduleString);
entry[id] = newModule;
entry[id].__moonlight = true;
-
moduleString =
-
newModule.toString().replace(/\n/g, "") +
-
`//# sourceURL=Webpack-Module-${id}`;
+
moduleString = newModule.toString().replace(/\n/g, "") + `//# sourceURL=Webpack-Module-${id}`;
}
if (shouldRemove) {
···
}
if (moonlightNode.config.patchAll === true) {
-
if (
-
(typeof id !== "string" || !id.includes("_")) &&
-
!entry[id].__moonlight
-
) {
-
const wrapped =
-
`(${moduleCache[id]}).apply(this, arguments)\n` +
-
`//# sourceURL=Webpack-Module-${id}`;
-
entry[id] = new Function(
-
"module",
-
"exports",
-
"require",
-
wrapped
-
) as WebpackModuleFunc;
+
if ((typeof id !== "string" || !id.includes("_")) && !entry[id].__moonlight) {
+
const wrapped = `(${moduleCache[id]}).apply(this, arguments)\n` + `//# sourceURL=Webpack-Module-${id}`;
+
entry[id] = new Function("module", "exports", "require", wrapped) as WebpackModuleFunc;
entry[id].__moonlight = true;
}
}
···
function handleModuleDependencies() {
const modules = Array.from(webpackModules.values());
-
const dependencies: Dependency<string, IdentifiedWebpackModule>[] =
-
modules.map((wp) => {
-
return {
-
id: depToString(wp),
-
data: wp
-
};
-
});
+
const dependencies: Dependency<string, IdentifiedWebpackModule>[] = modules.map((wp) => {
+
return {
+
id: depToString(wp),
+
data: wp
+
};
+
});
const [sorted, _] = calculateDependencies(dependencies, {
fetchDep: (id) => {
···
const deps = item.data?.dependencies ?? [];
return (
deps.filter(
-
(dep) =>
-
!(dep instanceof RegExp || typeof dep === "string") &&
-
dep.ext != null
+
(dep) => !(dep instanceof RegExp || typeof dep === "string") && dep.ext != null
) as ExplicitExtensionDependency[]
).map(depToString);
}
···
if (dep.test(modStr)) deps.delete(dep);
} else if (
dep.ext != null
-
? injectedWpModules.find(
-
(x) => x.ext === dep.ext && x.id === dep.id
-
)
+
? injectedWpModules.find((x) => x.ext === dep.ext && x.id === dep.id)
: injectedWpModules.find((x) => x.id === dep.id)
) {
deps.delete(dep);
···
if (!webpackModules.size) break;
}
-
for (const [name, func] of Object.entries(
-
moonlight.moonmap.getWebpackModules("window.moonlight.moonmap")
-
)) {
+
for (const [name, func] of Object.entries(moonlight.moonmap.getWebpackModules("window.moonlight.moonmap"))) {
injectedWpModules.push({ id: name, run: func });
modules[name] = func;
inject = true;
···
});
patchModules(modules);
-
if (!window.webpackChunkdiscord_app)
-
window.webpackChunkdiscord_app = [];
+
if (!window.webpackChunkdiscord_app) window.webpackChunkdiscord_app = [];
injectModules(modules);
}
+2 -12
packages/core/src/persist.ts
···
import { join, dirname } from "node:path";
-
import {
-
mkdirSync,
-
renameSync,
-
existsSync,
-
copyFileSync,
-
readdirSync
-
} from "node:fs";
+
import { mkdirSync, renameSync, existsSync, copyFileSync, readdirSync } from "node:fs";
import Logger from "./util/logger";
const logger = new Logger("core/persist");
···
if (event === "host-updated") {
const versions = this.queryCurrentVersionsSync();
-
const newRootDir = join(
-
this.rootPath,
-
"app-" +
-
versions.current_host.map((v: number) => v.toString()).join(".")
-
);
+
const newRootDir = join(this.rootPath, "app-" + versions.current_host.map((v: number) => v.toString()).join("."));
logger.info(`Persisting moonlight - new root dir: ${newRootDir}`);
const newResources = join(newRootDir, "resources");
+1 -4
packages/core/src/util/binary.ts
···
return data;
}
-
private _read<T>(
-
func: (position: number, littleEndian?: boolean) => T,
-
length: number
-
): T {
+
private _read<T>(func: (position: number, littleEndian?: boolean) => T, length: number): T {
const result = func.call(this.view, this.position, true);
this.position += length;
return result;
+2 -7
packages/core/src/util/data.ts
···
let configPath = "";
-
const buildInfoPath = moonlightFS.join(
-
process.resourcesPath,
-
"build_info.json"
-
);
+
const buildInfoPath = moonlightFS.join(process.resourcesPath, "build_info.json");
if (!(await moonlightFS.exists(buildInfoPath))) {
configPath = moonlightFS.join(dir, "desktop.json");
} else {
-
const buildInfo: BuildInfo = JSON.parse(
-
await moonlightFS.readFileString(buildInfoPath)
-
);
+
const buildInfo: BuildInfo = JSON.parse(await moonlightFS.readFileString(buildInfoPath));
configPath = moonlightFS.join(dir, buildInfo.releaseChannel + ".json");
}
+4 -14
packages/core/src/util/dependency.ts
···
const fullDeps: Set<T> = new Set();
let failed = false;
-
// eslint-disable-next-line no-inner-declarations
function resolveDeps(id: T, root: boolean) {
if (id === item.id && !root) {
logger.warn(`Circular dependency detected: "${item.id}"`);
···
logger.trace("Enabled stage", itemsOrig);
const implicitlyEnabled: T[] = [];
-
// eslint-disable-next-line no-inner-declarations
function validateDeps(dep: Dependency<T, D>) {
if (getEnabled!(dep)) {
const deps = dependencyGraphOrig.get(dep.id)!;
···
validateDeps({ id, data });
}
} else {
-
const dependsOnMe = Array.from(dependencyGraphOrig.entries()).filter(
-
([, v]) => v?.has(dep.id)
-
);
+
const dependsOnMe = Array.from(dependencyGraphOrig.entries()).filter(([, v]) => v?.has(dep.id));
if (dependsOnMe.length > 0) {
logger.debug("Implicitly enabling dependency", dep.id);
···
}
for (const dep of itemsOrig) validateDeps(dep);
-
itemsOrig = itemsOrig.filter(
-
(x) => getEnabled(x) || implicitlyEnabled.includes(x.id)
-
);
+
itemsOrig = itemsOrig.filter((x) => getEnabled(x) || implicitlyEnabled.includes(x.id));
}
if (getIncompatible != null) {
···
dependencyGraph.set(item.id, new Set(dependencyGraph.get(item.id)));
}
-
while (
-
Array.from(dependencyGraph.values()).filter((x) => x != null).length > 0
-
) {
-
const noDependents = items.filter(
-
(e) => dependencyGraph.get(e.id)?.size === 0
-
);
+
while (Array.from(dependencyGraph.values()).filter((x) => x != null).length > 0) {
+
const noDependents = items.filter((e) => dependencyGraph.get(e.id)?.size === 0);
if (noDependents.length === 0) {
logger.warn("Stuck dependency graph detected", dependencyGraph);
+7 -27
packages/core/src/util/event.ts
···
const listeners = new Map<(data: EventData) => void, (e: Event) => void>();
return {
-
dispatchEvent: <Id extends keyof EventData>(
-
id: Id,
-
data: EventData[Id]
-
) => {
-
eventEmitter.dispatchEvent(
-
new CustomEvent(id as string, { detail: data })
-
);
+
dispatchEvent: <Id extends keyof EventData>(id: Id, data: EventData[Id]) => {
+
eventEmitter.dispatchEvent(new CustomEvent(id as string, { detail: data }));
},
-
addEventListener: <Id extends keyof EventData>(
-
id: Id,
-
cb: (data: EventData[Id]) => void
-
) => {
+
addEventListener: <Id extends keyof EventData>(id: Id, cb: (data: EventData[Id]) => void) => {
const untyped = cb as (data: EventData) => void;
if (listeners.has(untyped)) return;
···
eventEmitter.addEventListener(id as string, listener);
},
-
removeEventListener: <Id extends keyof EventData>(
-
id: Id,
-
cb: (data: EventData[Id]) => void
-
) => {
+
removeEventListener: <Id extends keyof EventData>(id: Id, cb: (data: EventData[Id]) => void) => {
const untyped = cb as (data: EventData) => void;
const listener = listeners.get(untyped);
if (listener == null) return;
···
const listeners = new Map<(data: EventData) => void, (e: Event) => void>();
return {
-
dispatchEvent: <Id extends keyof EventData>(
-
id: Id,
-
data: EventData[Id]
-
) => {
+
dispatchEvent: <Id extends keyof EventData>(id: Id, data: EventData[Id]) => {
eventEmitter.emit(id as string, data);
},
-
addEventListener: <Id extends keyof EventData>(
-
id: Id,
-
cb: (data: EventData[Id]) => void
-
) => {
+
addEventListener: <Id extends keyof EventData>(id: Id, cb: (data: EventData[Id]) => void) => {
const untyped = cb as (data: EventData) => void;
if (listeners.has(untyped)) return;
···
eventEmitter.on(id as string, listener);
},
-
removeEventListener: <Id extends keyof EventData>(
-
id: Id,
-
cb: (data: EventData[Id]) => void
-
) => {
+
removeEventListener: <Id extends keyof EventData>(id: Id, cb: (data: EventData[Id]) => void) => {
const untyped = cb as (data: EventData) => void;
const listener = listeners.get(untyped);
if (listener == null) return;
+3 -5
packages/core/src/util/import.ts
···
cemented if import is passed a string literal.
*/
-
const canRequire = ["path", "fs"] as const;
-
type CanRequire = (typeof canRequire)[number];
+
const _canRequire = ["path", "fs"] as const;
+
type CanRequire = (typeof _canRequire)[number];
type ImportTypes = {
path: typeof import("path");
fs: typeof import("fs");
};
-
export default function requireImport<T extends CanRequire>(
-
type: T
-
): Awaited<ImportTypes[T]> {
+
export default function requireImport<T extends CanRequire>(type: T): Awaited<ImportTypes[T]> {
return require(type);
}
+2 -8
packages/core/src/util/logger.ts
···
if (maxLevel > level) return;
if (MOONLIGHT_WEB_PRELOAD || MOONLIGHT_BROWSER) {
-
args = [
-
`%c[${logLevel}]`,
-
`background-color: ${colors[level]}; color: #FFFFFF;`,
-
`[${this.name}]`,
-
...obj
-
];
+
args = [`%c[${logLevel}]`, `background-color: ${colors[level]}; color: #FFFFFF;`, `[${this.name}]`, ...obj];
} else {
args = [`[${logLevel}]`, `[${this.name}]`, ...obj];
}
···
export function initLogger(config: Config) {
if (config.loggerLevel != null) {
-
const enumValue =
-
LogLevel[config.loggerLevel.toUpperCase() as keyof typeof LogLevel];
+
const enumValue = LogLevel[config.loggerLevel.toUpperCase() as keyof typeof LogLevel];
if (enumValue != null) {
maxLevel = enumValue;
}
+8 -32
packages/injector/src/index.ts
···
import { readConfig } from "@moonlight-mod/core/config";
import { getExtensions } from "@moonlight-mod/core/extension";
import Logger, { initLogger } from "@moonlight-mod/core/util/logger";
-
import {
-
loadExtensions,
-
loadProcessedExtensions
-
} from "@moonlight-mod/core/extension/loader";
+
import { loadExtensions, loadProcessedExtensions } from "@moonlight-mod/core/extension/loader";
import EventEmitter from "node:events";
import { join, resolve } from "node:path";
import persist from "@moonlight-mod/core/persist";
···
});
const reEscapeRegExp = /[\\^$.*+?()[\]{}|]/g;
-
const reMatchPattern =
-
/^(?<scheme>\*|[a-z][a-z0-9+.-]*):\/\/(?<host>.+?)\/(?<path>.+)?$/;
+
const reMatchPattern = /^(?<scheme>\*|[a-z][a-z0-9+.-]*):\/\/(?<host>.+?)\/(?<path>.+)?$/;
const escapeRegExp = (s: string) => s.replace(reEscapeRegExp, "\\$&");
ipcMain.handle(constants.ipcSetBlockedList, (_, list: string[]) => {
···
});
function patchCsp(headers: Record<string, string[]>) {
-
const directives = [
-
"style-src",
-
"connect-src",
-
"img-src",
-
"font-src",
-
"media-src",
-
"worker-src",
-
"prefetch-src"
-
];
+
const directives = ["style-src", "connect-src", "img-src", "font-src", "media-src", "worker-src", "prefetch-src"];
const values = ["*", "blob:", "data:", "'unsafe-inline'", "disclip:"];
const csp = "content-security-policy";
···
constructor(opts: BrowserWindowConstructorOptions) {
oldPreloadPath = opts.webPreferences!.preload;
-
const isMainWindow =
-
opts.webPreferences!.preload!.indexOf("discord_desktop_core") > -1;
+
const isMainWindow = opts.webPreferences!.preload!.indexOf("discord_desktop_core") > -1;
-
if (isMainWindow)
-
opts.webPreferences!.preload = require.resolve("./node-preload.js");
+
if (isMainWindow) opts.webPreferences!.preload = require.resolve("./node-preload.js");
// Event for modifying window options
moonlightHost.events.emit("window-options", opts, isMainWindow);
···
const extensions = await getExtensions();
// Duplicated in node-preload... oops
-
// eslint-disable-next-line no-inner-declarations
function getConfig(ext: string) {
const val = config.extensions[ext];
if (val == null || typeof val === "boolean") return undefined;
···
// Someone can always make a command line modifier plugin, thats the point
// of having host modules.
try {
-
const cmdSwitchesPath = require.resolve(
-
join(asarPath, "cmdSwitches.js")
-
);
-
require.cache[cmdSwitchesPath] = new Module(
-
cmdSwitchesPath,
-
require.cache[require.resolve(asarPath)]
-
);
+
const cmdSwitchesPath = require.resolve(join(asarPath, "cmdSwitches.js"));
+
require.cache[cmdSwitchesPath] = new Module(cmdSwitchesPath, require.cache[require.resolve(asarPath)]);
require.cache[cmdSwitchesPath]!.exports = () => {};
} catch (error) {
logger.error("Failed to disable OpenAsar's command line flags:", error);
···
configurable: false
});
} else {
-
Object.defineProperty(
-
electronClone,
-
property,
-
Object.getOwnPropertyDescriptor(electron, property)!
-
);
+
Object.defineProperty(electronClone, property, Object.getOwnPropertyDescriptor(electron, property)!);
}
}
+5 -17
packages/node-preload/src/index.ts
···
import { readConfig, writeConfig } from "@moonlight-mod/core/config";
import { constants, MoonlightBranch } from "@moonlight-mod/types";
import { getExtensions } from "@moonlight-mod/core/extension";
-
import {
-
getExtensionsPath,
-
getMoonlightDir
-
} from "@moonlight-mod/core/util/data";
+
import { getExtensionsPath, getMoonlightDir } from "@moonlight-mod/core/util/data";
import Logger, { initLogger } from "@moonlight-mod/core/util/logger";
-
import {
-
loadExtensions,
-
loadProcessedExtensions
-
} from "@moonlight-mod/core/extension/loader";
+
import { loadExtensions, loadProcessedExtensions } from "@moonlight-mod/core/extension/loader";
import createFS from "@moonlight-mod/core/fs";
async function injectGlobals() {
···
await loadProcessedExtensions(processedExtensions);
contextBridge.exposeInMainWorld("moonlightNode", moonlightNode);
-
const extCors = moonlightNode.processedExtensions.extensions.flatMap(
-
(x) => x.manifest.cors ?? []
-
);
+
const extCors = moonlightNode.processedExtensions.extensions.flatMap((x) => x.manifest.cors ?? []);
for (const repo of moonlightNode.config.repositories) {
const url = new URL(repo);
···
ipcRenderer.invoke(constants.ipcSetCorsList, extCors);
-
const extBlocked = moonlightNode.processedExtensions.extensions.flatMap(
-
(e) => e.manifest.blocked ?? []
-
);
+
const extBlocked = moonlightNode.processedExtensions.extensions.flatMap((e) => e.manifest.blocked ?? []);
ipcRenderer.invoke(constants.ipcSetBlockedList, extBlocked);
}
···
if (oldPreloadPath) require(oldPreloadPath);
}
-
const oldPreloadPath: string = ipcRenderer.sendSync(
-
constants.ipcGetOldPreloadPath
-
);
+
const oldPreloadPath: string = ipcRenderer.sendSync(constants.ipcGetOldPreloadPath);
init(oldPreloadPath);
+1 -3
packages/types/src/config.ts
···
patchAll?: boolean;
};
-
export type ConfigExtensions =
-
| { [key: string]: boolean }
-
| { [key: string]: ConfigExtension };
+
export type ConfigExtensions = { [key: string]: boolean } | { [key: string]: ConfigExtension };
export type ConfigExtension = {
enabled: boolean;
+1 -2
packages/types/src/constants.ts
···
export const apiLevel = 2;
-
export const mainRepo =
-
"https://moonlight-mod.github.io/extensions-dist/repo.json";
+
export const mainRepo = "https://moonlight-mod.github.io/extensions-dist/repo.json";
+4 -16
packages/types/src/core/event.ts
···
import { WebpackModuleFunc, WebpackRequireType } from "../discord";
-
export interface MoonlightEventEmitter<
-
EventId extends string = string,
-
EventData = Record<EventId, any>
-
> {
-
dispatchEvent: <Id extends keyof EventData>(
-
id: Id,
-
data: EventData[Id]
-
) => void;
-
addEventListener: <Id extends keyof EventData>(
-
id: Id,
-
cb: (data: EventData[Id]) => void
-
) => void;
-
removeEventListener: <Id extends keyof EventData>(
-
id: Id,
-
cb: (data: EventData[Id]) => void
-
) => void;
+
export interface MoonlightEventEmitter<EventId extends string = string, EventData = Record<EventId, any>> {
+
dispatchEvent: <Id extends keyof EventData>(id: Id, data: EventData[Id]) => void;
+
addEventListener: <Id extends keyof EventData>(id: Id, cb: (data: EventData[Id]) => void) => void;
+
removeEventListener: <Id extends keyof EventData>(id: Id, cb: (data: EventData[Id]) => void) => void;
}
export enum EventType {
+2 -12
packages/types/src/coreExtensions/contextMenu.ts
···
}>;
export type MenuProps = React.ComponentProps<Menu>;
-
export type MenuElement =
-
| MenuSeparator
-
| MenuGroup
-
| MenuItem
-
| MenuCheckboxItem
-
| MenuRadioItem
-
| MenuControlItem;
+
export type MenuElement = MenuSeparator | MenuGroup | MenuItem | MenuCheckboxItem | MenuRadioItem | MenuControlItem;
-
/* eslint-disable prettier/prettier */
export type MenuSeparator = React.FunctionComponent;
export type MenuGroup = React.FunctionComponent<{
label?: string;
···
}
)
>;
-
/* eslint-disable prettier/prettier */
export type ContextMenu = {
addItem: (
···
};
export type EvilItemParser = (
-
el:
-
| React.ReactComponentElement<MenuElement>
-
| React.ReactComponentElement<MenuElement>[]
+
el: React.ReactComponentElement<MenuElement> | React.ReactComponentElement<MenuElement>[]
) => InternalItem[];
+5 -23
packages/types/src/coreExtensions/markdown.ts
···
export type ASTNode = SingleASTNode | Array<SingleASTNode>;
-
export type Parser = (
-
source: string,
-
state?: State | null | undefined
-
) => Array<SingleASTNode>;
+
export type Parser = (source: string, state?: State | null | undefined) => Array<SingleASTNode>;
-
export type ParseFunction = (
-
capture: Capture,
-
nestedParse: Parser,
-
state: State
-
) => UntypedASTNode | ASTNode;
+
export type ParseFunction = (capture: Capture, nestedParse: Parser, state: State) => UntypedASTNode | ASTNode;
export type Capture =
| (Array<string> & {
···
export type MatchFunction = {
regex?: RegExp;
-
} & ((
-
source: string,
-
state: State,
-
prevCapture: string
-
) => Capture | null | undefined);
+
} & ((source: string, state: State, prevCapture: string) => Capture | null | undefined);
-
export type Output<Result> = (
-
node: ASTNode,
-
state?: State | null | undefined
-
) => Result;
+
export type Output<Result> = (node: ASTNode, state?: State | null | undefined) => Result;
-
export type SingleNodeOutput<Result> = (
-
node: SingleASTNode,
-
nestedOutput: Output<Result>,
-
state: State
-
) => Result;
+
export type SingleNodeOutput<Result> = (node: SingleASTNode, nestedOutput: Output<Result>, state: State) => Result;
// }}}
+1 -5
packages/types/src/coreExtensions/moonbase.ts
···
}>;
export type Moonbase = {
-
registerConfigComponent: (
-
ext: string,
-
option: string,
-
component: CustomComponent
-
) => void;
+
registerConfigComponent: (ext: string, option: string, component: CustomComponent) => void;
};
+4 -16
packages/types/src/coreExtensions/spacepack.ts
···
-
import {
-
WebpackModule,
-
WebpackModuleFunc,
-
WebpackRequireType
-
} from "../discord";
+
import { WebpackModule, WebpackModuleFunc, WebpackRequireType } from "../discord";
export type Spacepack = {
inspect: (module: number | string) => WebpackModuleFunc | null;
···
cache: Record<string, any>;
findObjectFromKey: (exports: Record<string, any>, key: string) => any | null;
findObjectFromValue: (exports: Record<string, any>, value: any) => any | null;
-
findObjectFromKeyValuePair: (
-
exports: Record<string, any>,
-
key: string,
-
value: any
-
) => any | null;
+
findObjectFromKeyValuePair: (exports: Record<string, any>, key: string, value: any) => any | null;
findFunctionByStrings: (
exports: Record<string, any>,
...strings: (string | RegExp)[]
-
// eslint-disable-next-line @typescript-eslint/ban-types
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type
) => Function | null;
-
lazyLoad: (
-
find: string | RegExp | (string | RegExp)[],
-
chunk: RegExp,
-
module: RegExp
-
) => Promise<any>;
+
lazyLoad: (find: string | RegExp | (string | RegExp)[], chunk: RegExp, module: RegExp) => Promise<any>;
filterReal: (modules: WebpackModule[]) => WebpackModule[];
};
+2 -10
packages/types/src/discord/webpack.ts
···
exports: any;
};
-
export type WebpackModuleFunc = ((
-
module: any,
-
exports: any,
-
require: WebpackRequireType
-
) => void) & {
+
export type WebpackModuleFunc = ((module: any, exports: any, require: WebpackRequireType) => void) & {
__moonlight?: boolean;
};
-
export type WebpackJsonpEntry = [
-
number[],
-
{ [id: string]: WebpackModuleFunc },
-
(require: WebpackRequireType) => any
-
];
+
export type WebpackJsonpEntry = [number[], { [id: string]: WebpackModuleFunc }, (require: WebpackRequireType) => any];
export type WebpackJsonp = WebpackJsonpEntry[] & {
push: {
+1 -2
packages/types/src/extension.ts
···
id: number;
};
-
export type IdentifiedWebpackModule = ExtensionWebpackModule &
-
ExplicitExtensionDependency;
+
export type IdentifiedWebpackModule = ExtensionWebpackModule & ExplicitExtensionDependency;
+3 -15
packages/types/src/globals.ts
···
import type { Logger } from "./logger";
import type { Config, ConfigExtension } from "./config";
-
import type {
-
DetectedExtension,
-
IdentifiedPatch,
-
IdentifiedWebpackModule,
-
ProcessedExtensions
-
} from "./extension";
+
import type { DetectedExtension, IdentifiedPatch, IdentifiedWebpackModule, ProcessedExtensions } from "./extension";
import type EventEmitter from "events";
import type LunAST from "@moonlight-mod/lunast";
import type Moonmap from "@moonlight-mod/moonmap";
-
import type {
-
EventPayloads,
-
EventType,
-
MoonlightEventEmitter
-
} from "./core/event";
+
import type { EventPayloads, EventType, MoonlightEventEmitter } from "./core/event";
export type MoonlightHost = {
asarPath: string;
···
apiLevel: number;
events: MoonlightEventEmitter<EventType, EventPayloads>;
patchingInternals: {
-
onModuleLoad: (
-
moduleId: string | string[],
-
callback: (moduleId: string) => void
-
) => void;
+
onModuleLoad: (moduleId: string | string[], callback: (moduleId: string) => void) => void;
registerPatch: (patch: IdentifiedPatch) => void;
registerWebpackModule: (module: IdentifiedWebpackModule) => void;
};
+1 -6
packages/types/src/index.ts
···
/* eslint-disable no-var */
import { MoonlightFS } from "./fs";
-
import {
-
MoonlightEnv,
-
MoonlightHost,
-
MoonlightNode,
-
MoonlightWeb
-
} from "./globals";
+
import { MoonlightEnv, MoonlightHost, MoonlightNode, MoonlightWeb } from "./globals";
export * from "./discord";
export * from "./config";
+1 -6
packages/web-preload/src/index.ts
···
import { loadProcessedExtensions } from "@moonlight-mod/core/extension/loader";
-
import {
-
installWebpackPatcher,
-
onModuleLoad,
-
registerPatch,
-
registerWebpackModule
-
} from "@moonlight-mod/core/patch";
+
import { installWebpackPatcher, onModuleLoad, registerPatch, registerWebpackModule } from "@moonlight-mod/core/patch";
import { constants, MoonlightBranch } from "@moonlight-mod/types";
import { installStyles } from "@moonlight-mod/core/styles";
import Logger, { initLogger } from "@moonlight-mod/core/util/logger";
+739 -959
pnpm-lock.yaml
···
.:
devDependencies:
-
'@typescript-eslint/eslint-plugin':
-
specifier: ^6.13.2
-
version: 6.13.2(@typescript-eslint/parser@6.13.2(eslint@8.55.0)(typescript@5.3.2))(eslint@8.55.0)(typescript@5.3.2)
-
'@typescript-eslint/parser':
-
specifier: ^6.13.2
-
version: 6.13.2(eslint@8.55.0)(typescript@5.3.2)
+
'@moonlight-mod/eslint-config':
+
specifier: github:moonlight-mod/eslint-config
+
version: https://codeload.github.com/moonlight-mod/eslint-config/tar.gz/7eb7bd7c51fe0e3ee9d2a0baf149212d2bb893af(eslint@9.12.0)(prettier@3.1.0)(typescript@5.3.2)
esbuild:
specifier: ^0.19.3
version: 0.19.3
···
specifier: ^0.1.0
version: 0.1.0
eslint:
-
specifier: ^8.55.0
-
version: 8.55.0
-
eslint-config-prettier:
-
specifier: ^9.1.0
-
version: 9.1.0(eslint@8.55.0)
-
eslint-plugin-prettier:
-
specifier: ^5.0.1
-
version: 5.0.1(eslint-config-prettier@9.1.0(eslint@8.55.0))(eslint@8.55.0)(prettier@3.1.0)
-
eslint-plugin-react:
-
specifier: ^7.33.2
-
version: 7.33.2(eslint@8.55.0)
+
specifier: ^9.12.0
+
version: 9.12.0
husky:
specifier: ^8.0.3
version: 8.0.3
···
peerDependencies:
eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
-
'@eslint-community/regexpp@4.10.0':
-
resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==}
+
'@eslint-community/regexpp@4.11.1':
+
resolution: {integrity: sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==}
engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
-
'@eslint/eslintrc@2.1.4':
-
resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==}
-
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
'@eslint/config-array@0.18.0':
+
resolution: {integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==}
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+
'@eslint/core@0.6.0':
+
resolution: {integrity: sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg==}
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+
'@eslint/eslintrc@3.1.0':
+
resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==}
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+
'@eslint/js@9.12.0':
+
resolution: {integrity: sha512-eohesHH8WFRUprDNyEREgqP6beG6htMeUYeCpkEgBCieCMme5r9zFWjzAJp//9S+Kub4rqE+jXe9Cp1a7IYIIA==}
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+
'@eslint/object-schema@2.1.4':
+
resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==}
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+
'@eslint/plugin-kit@0.2.0':
+
resolution: {integrity: sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig==}
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
-
'@eslint/js@8.55.0':
-
resolution: {integrity: sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==}
-
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
'@humanfs/core@0.19.0':
+
resolution: {integrity: sha512-2cbWIHbZVEweE853g8jymffCA+NCMiuqeECeBBLm8dg2oFdjuGJhgN4UAbI+6v0CKbbhvtXA4qV8YR5Ji86nmw==}
+
engines: {node: '>=18.18.0'}
-
'@humanwhocodes/config-array@0.11.13':
-
resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==}
-
engines: {node: '>=10.10.0'}
-
deprecated: Use @eslint/config-array instead
+
'@humanfs/node@0.16.5':
+
resolution: {integrity: sha512-KSPA4umqSG4LHYRodq31VDwKAvaTF4xmVlzM8Aeh4PlU1JQ3IG0wiA8C25d3RQ9nJyM3mBHyI53K06VVL/oFFg==}
+
engines: {node: '>=18.18.0'}
'@humanwhocodes/module-importer@1.0.1':
resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
engines: {node: '>=12.22'}
-
'@humanwhocodes/object-schema@2.0.1':
-
resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==}
-
deprecated: Use @eslint/object-schema instead
+
'@humanwhocodes/retry@0.3.1':
+
resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==}
+
engines: {node: '>=18.18'}
+
+
'@moonlight-mod/eslint-config@https://codeload.github.com/moonlight-mod/eslint-config/tar.gz/7eb7bd7c51fe0e3ee9d2a0baf149212d2bb893af':
+
resolution: {tarball: https://codeload.github.com/moonlight-mod/eslint-config/tar.gz/7eb7bd7c51fe0e3ee9d2a0baf149212d2bb893af}
+
version: 1.0.0
+
peerDependencies:
+
eslint: '>= 9'
+
typescript: '>= 5.3'
'@moonlight-mod/lunast@1.0.0':
resolution: {integrity: sha512-kJgf41K12i6/2LbXK97CNO+pNO7ADGh9N4bCQcOPwosocKMcwKHDEZUgPqeihNshY3c3AEW1LiyXjlsl24PdDw==}
···
resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
engines: {node: '>= 8'}
-
'@pkgr/utils@2.4.2':
-
resolution: {integrity: sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==}
+
'@pkgr/core@0.1.1':
+
resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==}
engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
'@types/estree-jsx@1.0.5':
···
'@types/readable-stream@4.0.15':
resolution: {integrity: sha512-oAZ3kw+kJFkEqyh7xORZOku1YAKvsFTogRY8kVl4vHpEKiDkfnSA/My8haRE7fvmix5Zyy+1pwzOi7yycGLBJw==}
-
'@types/semver@7.5.6':
-
resolution: {integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==}
-
-
'@typescript-eslint/eslint-plugin@6.13.2':
-
resolution: {integrity: sha512-3+9OGAWHhk4O1LlcwLBONbdXsAhLjyCFogJY/cWy2lxdVJ2JrcTF2pTGMaLl2AE7U1l31n8Py4a8bx5DLf/0dQ==}
-
engines: {node: ^16.0.0 || >=18.0.0}
+
'@typescript-eslint/eslint-plugin@8.8.1':
+
resolution: {integrity: sha512-xfvdgA8AP/vxHgtgU310+WBnLB4uJQ9XdyP17RebG26rLtDrQJV3ZYrcopX91GrHmMoH8bdSwMRh2a//TiJ1jQ==}
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
-
'@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha
-
eslint: ^7.0.0 || ^8.0.0
+
'@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0
+
eslint: ^8.57.0 || ^9.0.0
typescript: '*'
peerDependenciesMeta:
typescript:
optional: true
-
'@typescript-eslint/parser@6.13.2':
-
resolution: {integrity: sha512-MUkcC+7Wt/QOGeVlM8aGGJZy1XV5YKjTpq9jK6r6/iLsGXhBVaGP5N0UYvFsu9BFlSpwY9kMretzdBH01rkRXg==}
-
engines: {node: ^16.0.0 || >=18.0.0}
+
'@typescript-eslint/parser@8.8.1':
+
resolution: {integrity: sha512-hQUVn2Lij2NAxVFEdvIGxT9gP1tq2yM83m+by3whWFsWC+1y8pxxxHUFE1UqDu2VsGi2i6RLcv4QvouM84U+ow==}
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
-
eslint: ^7.0.0 || ^8.0.0
+
eslint: ^8.57.0 || ^9.0.0
typescript: '*'
peerDependenciesMeta:
typescript:
optional: true
-
'@typescript-eslint/scope-manager@6.13.2':
-
resolution: {integrity: sha512-CXQA0xo7z6x13FeDYCgBkjWzNqzBn8RXaE3QVQVIUm74fWJLkJkaHmHdKStrxQllGh6Q4eUGyNpMe0b1hMkXFA==}
-
engines: {node: ^16.0.0 || >=18.0.0}
+
'@typescript-eslint/scope-manager@8.8.1':
+
resolution: {integrity: sha512-X4JdU+66Mazev/J0gfXlcC/dV6JI37h+93W9BRYXrSn0hrE64IoWgVkO9MSJgEzoWkxONgaQpICWg8vAN74wlA==}
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
-
'@typescript-eslint/type-utils@6.13.2':
-
resolution: {integrity: sha512-Qr6ssS1GFongzH2qfnWKkAQmMUyZSyOr0W54nZNU1MDfo+U4Mv3XveeLZzadc/yq8iYhQZHYT+eoXJqnACM1tw==}
-
engines: {node: ^16.0.0 || >=18.0.0}
+
'@typescript-eslint/type-utils@8.8.1':
+
resolution: {integrity: sha512-qSVnpcbLP8CALORf0za+vjLYj1Wp8HSoiI8zYU5tHxRVj30702Z1Yw4cLwfNKhTPWp5+P+k1pjmD5Zd1nhxiZA==}
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
-
eslint: ^7.0.0 || ^8.0.0
typescript: '*'
peerDependenciesMeta:
typescript:
optional: true
-
'@typescript-eslint/types@6.13.2':
-
resolution: {integrity: sha512-7sxbQ+EMRubQc3wTfTsycgYpSujyVbI1xw+3UMRUcrhSy+pN09y/lWzeKDbvhoqcRbHdc+APLs/PWYi/cisLPg==}
-
engines: {node: ^16.0.0 || >=18.0.0}
+
'@typescript-eslint/types@8.8.1':
+
resolution: {integrity: sha512-WCcTP4SDXzMd23N27u66zTKMuEevH4uzU8C9jf0RO4E04yVHgQgW+r+TeVTNnO1KIfrL8ebgVVYYMMO3+jC55Q==}
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
-
'@typescript-eslint/typescript-estree@6.13.2':
-
resolution: {integrity: sha512-SuD8YLQv6WHnOEtKv8D6HZUzOub855cfPnPMKvdM/Bh1plv1f7Q/0iFUDLKKlxHcEstQnaUU4QZskgQq74t+3w==}
-
engines: {node: ^16.0.0 || >=18.0.0}
+
'@typescript-eslint/typescript-estree@8.8.1':
+
resolution: {integrity: sha512-A5d1R9p+X+1js4JogdNilDuuq+EHZdsH9MjTVxXOdVFfTJXunKJR/v+fNNyO4TnoOn5HqobzfRlc70NC6HTcdg==}
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '*'
peerDependenciesMeta:
typescript:
optional: true
-
'@typescript-eslint/utils@6.13.2':
-
resolution: {integrity: sha512-b9Ptq4eAZUym4idijCRzl61oPCwwREcfDI8xGk751Vhzig5fFZR9CyzDz4Sp/nxSLBYxUPyh4QdIDqWykFhNmQ==}
-
engines: {node: ^16.0.0 || >=18.0.0}
+
'@typescript-eslint/utils@8.8.1':
+
resolution: {integrity: sha512-/QkNJDbV0bdL7H7d0/y0qBbV2HTtf0TIyjSDTvvmQEzeVx8jEImEbLuOA4EsvE8gIgqMitns0ifb5uQhMj8d9w==}
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
-
eslint: ^7.0.0 || ^8.0.0
+
eslint: ^8.57.0 || ^9.0.0
-
'@typescript-eslint/visitor-keys@6.13.2':
-
resolution: {integrity: sha512-OGznFs0eAQXJsp+xSd6k/O1UbFi/K/L7WjqeRoFE7vadjAF9y0uppXhYNQNEqygjou782maGClOoZwPqF0Drlw==}
-
engines: {node: ^16.0.0 || >=18.0.0}
-
-
'@ungap/structured-clone@1.2.0':
-
resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==}
+
'@typescript-eslint/visitor-keys@8.8.1':
+
resolution: {integrity: sha512-0/TdC3aeRAsW7MDvYRwEc1Uwm0TIBfzjPFgg60UU2Haj5qsCs9cc3zNgY71edqE3LbWfF/WoZQd3lJoDXFQpag==}
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@zenfs/core@1.0.2':
resolution: {integrity: sha512-LMTD4ntn6Ag1y+IeOSVykDDvYC12dsGFtsX8M/54OQrLs7v+YnX4bpo0o2osbm8XFmU2MTNMX/G3PLsvzgWzrg==}
···
ajv@6.12.6:
resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
-
ansi-regex@5.0.1:
-
resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
-
engines: {node: '>=8'}
-
ansi-styles@4.3.0:
resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
engines: {node: '>=8'}
···
argparse@2.0.1:
resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
-
array-buffer-byte-length@1.0.0:
-
resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==}
+
array-buffer-byte-length@1.0.1:
+
resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==}
+
engines: {node: '>= 0.4'}
-
array-includes@3.1.7:
-
resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==}
+
array-includes@3.1.8:
+
resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==}
engines: {node: '>= 0.4'}
-
array-union@2.1.0:
-
resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
-
engines: {node: '>=8'}
+
array.prototype.findlast@1.2.5:
+
resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==}
+
engines: {node: '>= 0.4'}
array.prototype.flat@1.3.2:
resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==}
···
resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==}
engines: {node: '>= 0.4'}
-
array.prototype.tosorted@1.1.2:
-
resolution: {integrity: sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==}
+
array.prototype.tosorted@1.1.4:
+
resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==}
+
engines: {node: '>= 0.4'}
-
arraybuffer.prototype.slice@1.0.2:
-
resolution: {integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==}
+
arraybuffer.prototype.slice@1.0.3:
+
resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==}
engines: {node: '>= 0.4'}
astring@1.9.0:
resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==}
hasBin: true
-
asynciterator.prototype@1.0.0:
-
resolution: {integrity: sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==}
-
-
available-typed-arrays@1.0.5:
-
resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==}
+
available-typed-arrays@1.0.7:
+
resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
engines: {node: '>= 0.4'}
balanced-match@1.0.2:
···
base64-js@1.5.1:
resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
-
big-integer@1.6.52:
-
resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==}
-
engines: {node: '>=0.6'}
-
-
bplist-parser@0.2.0:
-
resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==}
-
engines: {node: '>= 5.10.0'}
-
brace-expansion@1.1.11:
resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
brace-expansion@2.0.1:
resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
-
braces@3.0.2:
-
resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
+
braces@3.0.3:
+
resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
engines: {node: '>=8'}
buffer@6.0.3:
resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==}
-
bundle-name@3.0.0:
-
resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==}
-
engines: {node: '>=12'}
-
-
call-bind@1.0.5:
-
resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==}
+
call-bind@1.0.7:
+
resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==}
+
engines: {node: '>= 0.4'}
callsites@3.1.0:
resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
···
csstype@3.1.3:
resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
+
+
data-view-buffer@1.0.1:
+
resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==}
+
engines: {node: '>= 0.4'}
+
+
data-view-byte-length@1.0.1:
+
resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==}
+
engines: {node: '>= 0.4'}
+
+
data-view-byte-offset@1.0.0:
+
resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==}
+
engines: {node: '>= 0.4'}
debug@4.3.4:
resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
···
deep-is@0.1.4:
resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
-
default-browser-id@3.0.0:
-
resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==}
-
engines: {node: '>=12'}
-
-
default-browser@4.0.0:
-
resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==}
-
engines: {node: '>=14.16'}
-
-
define-data-property@1.1.1:
-
resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==}
+
define-data-property@1.1.4:
+
resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
engines: {node: '>= 0.4'}
-
define-lazy-prop@3.0.0:
-
resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==}
-
engines: {node: '>=12'}
-
define-properties@1.2.1:
resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
engines: {node: '>= 0.4'}
-
dir-glob@3.0.1:
-
resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
-
engines: {node: '>=8'}
-
doctrine@2.1.0:
resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==}
engines: {node: '>=0.10.0'}
-
doctrine@3.0.0:
-
resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
-
engines: {node: '>=6.0.0'}
+
es-abstract@1.23.3:
+
resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==}
+
engines: {node: '>= 0.4'}
+
+
es-define-property@1.0.0:
+
resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==}
+
engines: {node: '>= 0.4'}
-
es-abstract@1.22.3:
-
resolution: {integrity: sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==}
+
es-errors@1.3.0:
+
resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
engines: {node: '>= 0.4'}
-
es-iterator-helpers@1.0.15:
-
resolution: {integrity: sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==}
+
es-iterator-helpers@1.1.0:
+
resolution: {integrity: sha512-/SurEfycdyssORP/E+bj4sEu1CWw4EmLDsHynHwSXQ7utgbrMRWW195pTrCjFgFCddf/UkYm3oqKPRq5i8bJbw==}
+
engines: {node: '>= 0.4'}
-
es-set-tostringtag@2.0.2:
-
resolution: {integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==}
+
es-object-atoms@1.0.0:
+
resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==}
+
engines: {node: '>= 0.4'}
+
+
es-set-tostringtag@2.0.3:
+
resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==}
engines: {node: '>= 0.4'}
es-shim-unscopables@1.0.2:
···
peerDependencies:
eslint: '>=7.0.0'
-
eslint-plugin-prettier@5.0.1:
-
resolution: {integrity: sha512-m3u5RnR56asrwV/lDC4GHorlW75DsFfmUcjfCYylTUs85dBRnB7VM6xG8eCMJdeDRnppzmxZVf1GEPJvl1JmNg==}
+
eslint-plugin-prettier@5.2.1:
+
resolution: {integrity: sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==}
engines: {node: ^14.18.0 || >=16.0.0}
peerDependencies:
'@types/eslint': '>=8.0.0'
···
eslint-config-prettier:
optional: true
-
eslint-plugin-react@7.33.2:
-
resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==}
+
eslint-plugin-react@7.37.1:
+
resolution: {integrity: sha512-xwTnwDqzbDRA8uJ7BMxPs/EXRB3i8ZfnOIp8BsxEQkT0nHPp+WWceqGgo6rKb9ctNi8GJLDT4Go5HAWELa/WMg==}
engines: {node: '>=4'}
peerDependencies:
-
eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8
+
eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7
-
eslint-scope@7.2.2:
-
resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==}
-
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
eslint-scope@8.1.0:
+
resolution: {integrity: sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw==}
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
eslint-visitor-keys@3.4.3:
resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
-
eslint@8.55.0:
-
resolution: {integrity: sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==}
-
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
-
deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options.
+
eslint-visitor-keys@4.1.0:
+
resolution: {integrity: sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==}
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+
eslint@9.12.0:
+
resolution: {integrity: sha512-UVIOlTEWxwIopRL1wgSQYdnVDcEvs2wyaO6DGo5mXqe3r16IoCNWkR29iHhyaP4cICWjbgbmFUGAhh0GJRuGZw==}
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
hasBin: true
+
peerDependencies:
+
jiti: '*'
+
peerDependenciesMeta:
+
jiti:
+
optional: true
-
espree@9.6.1:
-
resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==}
-
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
espree@10.2.0:
+
resolution: {integrity: sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==}
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
esquery@1.5.0:
resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==}
···
events@3.3.0:
resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
engines: {node: '>=0.8.x'}
-
-
execa@5.1.1:
-
resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
-
engines: {node: '>=10'}
-
-
execa@7.2.0:
-
resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==}
-
engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0}
fast-deep-equal@3.1.3:
resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
···
fast-levenshtein@2.0.6:
resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
-
fastq@1.15.0:
-
resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==}
+
fastq@1.17.1:
+
resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==}
-
file-entry-cache@6.0.1:
-
resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
-
engines: {node: ^10.12.0 || >=12.0.0}
+
file-entry-cache@8.0.0:
+
resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
+
engines: {node: '>=16.0.0'}
-
fill-range@7.0.1:
-
resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
+
fill-range@7.1.1:
+
resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
engines: {node: '>=8'}
find-up@5.0.0:
resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
engines: {node: '>=10'}
-
flat-cache@3.2.0:
-
resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==}
-
engines: {node: ^10.12.0 || >=12.0.0}
+
flat-cache@4.0.1:
+
resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==}
+
engines: {node: '>=16'}
flatted@3.2.9:
resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==}
···
for-each@0.3.3:
resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==}
-
fs.realpath@1.0.0:
-
resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
-
function-bind@1.1.2:
resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
···
functions-have-names@1.2.3:
resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
-
get-intrinsic@1.2.2:
-
resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==}
+
get-intrinsic@1.2.4:
+
resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==}
+
engines: {node: '>= 0.4'}
-
get-stream@6.0.1:
-
resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
-
engines: {node: '>=10'}
-
-
get-symbol-description@1.0.0:
-
resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==}
+
get-symbol-description@1.0.2:
+
resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==}
engines: {node: '>= 0.4'}
glob-parent@5.1.2:
···
resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
engines: {node: '>=10.13.0'}
-
glob@7.2.3:
-
resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
-
deprecated: Glob versions prior to v9 are no longer supported
+
globals@14.0.0:
+
resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==}
+
engines: {node: '>=18'}
-
globals@13.23.0:
-
resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==}
-
engines: {node: '>=8'}
-
-
globalthis@1.0.3:
-
resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==}
+
globalthis@1.0.4:
+
resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==}
engines: {node: '>= 0.4'}
-
globby@11.1.0:
-
resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
-
engines: {node: '>=10'}
-
gopd@1.0.1:
resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==}
···
resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
engines: {node: '>=8'}
-
has-property-descriptors@1.0.1:
-
resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==}
+
has-property-descriptors@1.0.2:
+
resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==}
-
has-proto@1.0.1:
-
resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==}
+
has-proto@1.0.3:
+
resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==}
engines: {node: '>= 0.4'}
has-symbols@1.0.3:
resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==}
engines: {node: '>= 0.4'}
-
has-tostringtag@1.0.0:
-
resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==}
+
has-tostringtag@1.0.2:
+
resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}
engines: {node: '>= 0.4'}
-
hasown@2.0.0:
-
resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==}
+
hasown@2.0.2:
+
resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
engines: {node: '>= 0.4'}
-
-
human-signals@2.1.0:
-
resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
-
engines: {node: '>=10.17.0'}
-
-
human-signals@4.3.1:
-
resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==}
-
engines: {node: '>=14.18.0'}
husky@8.0.3:
resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==}
···
resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==}
engines: {node: '>= 4'}
+
ignore@5.3.2:
+
resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
+
engines: {node: '>= 4'}
+
import-fresh@3.3.0:
resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
engines: {node: '>=6'}
···
resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
engines: {node: '>=0.8.19'}
-
inflight@1.0.6:
-
resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
-
deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
+
internal-slot@1.0.7:
+
resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==}
+
engines: {node: '>= 0.4'}
-
inherits@2.0.4:
-
resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
-
-
internal-slot@1.0.6:
-
resolution: {integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==}
+
is-array-buffer@3.0.4:
+
resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==}
engines: {node: '>= 0.4'}
-
-
is-array-buffer@3.0.2:
-
resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==}
is-async-function@2.0.0:
resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==}
···
resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
engines: {node: '>= 0.4'}
-
is-core-module@2.13.1:
-
resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==}
+
is-core-module@2.15.1:
+
resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==}
+
engines: {node: '>= 0.4'}
+
+
is-data-view@1.0.1:
+
resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==}
+
engines: {node: '>= 0.4'}
is-date-object@1.0.5:
resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==}
engines: {node: '>= 0.4'}
-
-
is-docker@2.2.1:
-
resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==}
-
engines: {node: '>=8'}
-
hasBin: true
-
-
is-docker@3.0.0:
-
resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==}
-
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
-
hasBin: true
is-extglob@2.1.1:
resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
···
resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
engines: {node: '>=0.10.0'}
-
is-inside-container@1.0.0:
-
resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==}
-
engines: {node: '>=14.16'}
-
hasBin: true
-
-
is-map@2.0.2:
-
resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==}
+
is-map@2.0.3:
+
resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==}
+
engines: {node: '>= 0.4'}
-
is-negative-zero@2.0.2:
-
resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==}
+
is-negative-zero@2.0.3:
+
resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==}
engines: {node: '>= 0.4'}
is-number-object@1.0.7:
···
resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
engines: {node: '>=0.12.0'}
-
is-path-inside@3.0.3:
-
resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==}
-
engines: {node: '>=8'}
-
is-regex@1.1.4:
resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==}
engines: {node: '>= 0.4'}
-
is-set@2.0.2:
-
resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==}
+
is-set@2.0.3:
+
resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==}
+
engines: {node: '>= 0.4'}
-
is-shared-array-buffer@1.0.2:
-
resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==}
-
-
is-stream@2.0.1:
-
resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
-
engines: {node: '>=8'}
-
-
is-stream@3.0.0:
-
resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==}
-
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
is-shared-array-buffer@1.0.3:
+
resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==}
+
engines: {node: '>= 0.4'}
is-string@1.0.7:
resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==}
···
resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==}
engines: {node: '>= 0.4'}
-
is-typed-array@1.1.12:
-
resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==}
+
is-typed-array@1.1.13:
+
resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==}
engines: {node: '>= 0.4'}
-
is-weakmap@2.0.1:
-
resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==}
+
is-weakmap@2.0.2:
+
resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==}
+
engines: {node: '>= 0.4'}
is-weakref@1.0.2:
resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==}
-
is-weakset@2.0.2:
-
resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==}
-
-
is-wsl@2.2.0:
-
resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==}
-
engines: {node: '>=8'}
+
is-weakset@2.0.3:
+
resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==}
+
engines: {node: '>= 0.4'}
isarray@2.0.5:
resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
···
isexe@2.0.0:
resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
-
iterator.prototype@1.1.2:
-
resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==}
+
iterator.prototype@1.1.3:
+
resolution: {integrity: sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==}
+
engines: {node: '>= 0.4'}
js-tokens@4.0.0:
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
···
resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
hasBin: true
-
lru-cache@6.0.0:
-
resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
-
engines: {node: '>=10'}
-
-
merge-stream@2.0.0:
-
resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
-
merge2@1.4.1:
resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
engines: {node: '>= 8'}
···
resolution: {integrity: sha512-OyvYIOgpzXREySYJ1cqEb2pOKdeQMTfF9M8dRU6nC4hi/GXMmNpe9ssZCrSoTHazu05BSAoRBN/uYeco+ymfOg==}
engines: {node: '>=18.0.0'}
-
micromatch@4.0.5:
-
resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==}
+
micromatch@4.0.8:
+
resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
engines: {node: '>=8.6'}
-
-
mimic-fn@2.1.0:
-
resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
-
engines: {node: '>=6'}
-
-
mimic-fn@4.0.0:
-
resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==}
-
engines: {node: '>=12'}
minimatch@3.1.2:
resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
···
natural-compare@1.4.0:
resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
-
npm-run-path@4.0.1:
-
resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
-
engines: {node: '>=8'}
-
-
npm-run-path@5.1.0:
-
resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==}
-
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
-
object-assign@4.1.1:
resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
engines: {node: '>=0.10.0'}
-
object-inspect@1.13.1:
-
resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==}
+
object-inspect@1.13.2:
+
resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==}
+
engines: {node: '>= 0.4'}
object-keys@1.1.1:
resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
···
resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==}
engines: {node: '>= 0.4'}
-
object.entries@1.1.7:
-
resolution: {integrity: sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==}
+
object.entries@1.1.8:
+
resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==}
engines: {node: '>= 0.4'}
-
object.fromentries@2.0.7:
-
resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==}
+
object.fromentries@2.0.8:
+
resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==}
engines: {node: '>= 0.4'}
-
object.hasown@1.1.3:
-
resolution: {integrity: sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==}
-
-
object.values@1.1.7:
-
resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==}
+
object.values@1.2.0:
+
resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==}
engines: {node: '>= 0.4'}
-
once@1.4.0:
-
resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
-
-
onetime@5.1.2:
-
resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
-
engines: {node: '>=6'}
-
-
onetime@6.0.0:
-
resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==}
-
engines: {node: '>=12'}
-
-
open@9.1.0:
-
resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==}
-
engines: {node: '>=14.16'}
-
optionator@0.9.3:
resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==}
engines: {node: '>= 0.8.0'}
···
resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
engines: {node: '>=8'}
-
path-is-absolute@1.0.1:
-
resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
-
engines: {node: '>=0.10.0'}
-
path-key@3.1.1:
resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
engines: {node: '>=8'}
-
-
path-key@4.0.0:
-
resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==}
-
engines: {node: '>=12'}
path-parse@1.0.7:
resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
-
path-type@4.0.0:
-
resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
-
engines: {node: '>=8'}
-
-
picocolors@1.0.0:
-
resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
-
picomatch@2.3.1:
resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
engines: {node: '>=8.6'}
+
+
possible-typed-array-names@1.0.0:
+
resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==}
+
engines: {node: '>= 0.4'}
prelude-ls@1.2.1:
resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
···
resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
-
reflect.getprototypeof@1.0.4:
-
resolution: {integrity: sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==}
+
reflect.getprototypeof@1.0.6:
+
resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==}
engines: {node: '>= 0.4'}
-
regexp.prototype.flags@1.5.1:
-
resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==}
+
regexp.prototype.flags@1.5.3:
+
resolution: {integrity: sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==}
engines: {node: '>= 0.4'}
resolve-from@4.0.0:
···
resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
-
rimraf@3.0.2:
-
resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
-
deprecated: Rimraf versions prior to v4 are no longer supported
-
hasBin: true
-
-
run-applescript@5.0.0:
-
resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==}
-
engines: {node: '>=12'}
-
run-parallel@1.2.0:
resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
-
safe-array-concat@1.0.1:
-
resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==}
+
safe-array-concat@1.1.2:
+
resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==}
engines: {node: '>=0.4'}
safe-buffer@5.1.2:
···
safe-buffer@5.2.1:
resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
-
safe-regex-test@1.0.0:
-
resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==}
+
safe-regex-test@1.0.3:
+
resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==}
+
engines: {node: '>= 0.4'}
semver@6.3.1:
resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
hasBin: true
-
semver@7.5.4:
-
resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==}
+
semver@7.6.3:
+
resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==}
engines: {node: '>=10'}
hasBin: true
-
set-function-length@1.1.1:
-
resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==}
+
set-function-length@1.2.2:
+
resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
engines: {node: '>= 0.4'}
-
set-function-name@2.0.1:
-
resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==}
+
set-function-name@2.0.2:
+
resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==}
engines: {node: '>= 0.4'}
shebang-command@2.0.0:
···
resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
engines: {node: '>=8'}
-
side-channel@1.0.4:
-
resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==}
-
-
signal-exit@3.0.7:
-
resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
-
-
slash@3.0.0:
-
resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
-
engines: {node: '>=8'}
+
side-channel@1.0.6:
+
resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==}
+
engines: {node: '>= 0.4'}
standalone-electron-types@1.0.0:
resolution: {integrity: sha512-0HOi/tlTz3mjWhsAz4uRbpQcHMZ+ifj1JzWW9nugykOHClBBG77ps8QinrzX1eow4Iw2pnC+RFaSYRgufF4BOg==}
-
string.prototype.matchall@4.0.10:
-
resolution: {integrity: sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==}
+
string.prototype.matchall@4.0.11:
+
resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==}
+
engines: {node: '>= 0.4'}
+
+
string.prototype.repeat@1.0.0:
+
resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==}
-
string.prototype.trim@1.2.8:
-
resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==}
+
string.prototype.trim@1.2.9:
+
resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==}
engines: {node: '>= 0.4'}
-
string.prototype.trimend@1.0.7:
-
resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==}
+
string.prototype.trimend@1.0.8:
+
resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==}
-
string.prototype.trimstart@1.0.7:
-
resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==}
+
string.prototype.trimstart@1.0.8:
+
resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==}
+
engines: {node: '>= 0.4'}
string_decoder@1.3.0:
resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
-
strip-ansi@6.0.1:
-
resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
-
engines: {node: '>=8'}
-
-
strip-final-newline@2.0.0:
-
resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
-
engines: {node: '>=6'}
-
-
strip-final-newline@3.0.0:
-
resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==}
-
engines: {node: '>=12'}
-
strip-json-comments@3.1.1:
resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
engines: {node: '>=8'}
···
resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
engines: {node: '>= 0.4'}
-
synckit@0.8.6:
-
resolution: {integrity: sha512-laHF2savN6sMeHCjLRkheIU4wo3Zg9Ln5YOjOo7sZ5dVQW8yF5pPE5SIw1dsPhq3TRp1jisKRCdPhfs/1WMqDA==}
+
synckit@0.9.2:
+
resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==}
engines: {node: ^14.18.0 || >=16.0.0}
text-table@0.2.0:
resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
-
titleize@3.0.0:
-
resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==}
-
engines: {node: '>=12'}
-
to-regex-range@5.0.1:
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
engines: {node: '>=8.0'}
-
ts-api-utils@1.0.3:
-
resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==}
-
engines: {node: '>=16.13.0'}
+
ts-api-utils@1.3.0:
+
resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==}
+
engines: {node: '>=16'}
peerDependencies:
typescript: '>=4.2.0'
-
tslib@2.6.2:
-
resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==}
+
tslib@2.7.0:
+
resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==}
type-check@0.4.0:
resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
engines: {node: '>= 0.8.0'}
-
type-fest@0.20.2:
-
resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
-
engines: {node: '>=10'}
+
typed-array-buffer@1.0.2:
+
resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==}
+
engines: {node: '>= 0.4'}
-
typed-array-buffer@1.0.0:
-
resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==}
+
typed-array-byte-length@1.0.1:
+
resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==}
engines: {node: '>= 0.4'}
-
typed-array-byte-length@1.0.0:
-
resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==}
+
typed-array-byte-offset@1.0.2:
+
resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==}
engines: {node: '>= 0.4'}
-
typed-array-byte-offset@1.0.0:
-
resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==}
+
typed-array-length@1.0.6:
+
resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==}
engines: {node: '>= 0.4'}
-
typed-array-length@1.0.4:
-
resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==}
+
typescript-eslint@8.8.1:
+
resolution: {integrity: sha512-R0dsXFt6t4SAFjUSKFjMh4pXDtq04SsFKCVGDP3ZOzNP7itF0jBcZYU4fMsZr4y7O7V7Nc751dDeESbe4PbQMQ==}
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
peerDependencies:
+
typescript: '*'
+
peerDependenciesMeta:
+
typescript:
+
optional: true
typescript@5.3.2:
resolution: {integrity: sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==}
···
undici-types@6.19.8:
resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==}
-
untildify@4.0.0:
-
resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==}
-
engines: {node: '>=8'}
-
uri-js@4.4.1:
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
···
which-boxed-primitive@1.0.2:
resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==}
-
which-builtin-type@1.1.3:
-
resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==}
+
which-builtin-type@1.1.4:
+
resolution: {integrity: sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==}
engines: {node: '>= 0.4'}
-
which-collection@1.0.1:
-
resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==}
+
which-collection@1.0.2:
+
resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==}
+
engines: {node: '>= 0.4'}
-
which-typed-array@1.1.13:
-
resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==}
+
which-typed-array@1.1.15:
+
resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==}
engines: {node: '>= 0.4'}
which@2.0.2:
resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
engines: {node: '>= 8'}
hasBin: true
-
-
wrappy@1.0.2:
-
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
-
-
yallist@4.0.0:
-
resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
yocto-queue@0.1.0:
resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
···
'@esbuild/win32-x64@0.19.3':
optional: true
-
'@eslint-community/eslint-utils@4.4.0(eslint@8.55.0)':
+
'@eslint-community/eslint-utils@4.4.0(eslint@9.12.0)':
dependencies:
-
eslint: 8.55.0
+
eslint: 9.12.0
eslint-visitor-keys: 3.4.3
-
'@eslint-community/regexpp@4.10.0': {}
+
'@eslint-community/regexpp@4.11.1': {}
-
'@eslint/eslintrc@2.1.4':
+
'@eslint/config-array@0.18.0':
+
dependencies:
+
'@eslint/object-schema': 2.1.4
+
debug: 4.3.4
+
minimatch: 3.1.2
+
transitivePeerDependencies:
+
- supports-color
+
+
'@eslint/core@0.6.0': {}
+
+
'@eslint/eslintrc@3.1.0':
dependencies:
ajv: 6.12.6
debug: 4.3.4
-
espree: 9.6.1
-
globals: 13.23.0
+
espree: 10.2.0
+
globals: 14.0.0
ignore: 5.3.0
import-fresh: 3.3.0
js-yaml: 4.1.0
···
transitivePeerDependencies:
- supports-color
-
'@eslint/js@8.55.0': {}
+
'@eslint/js@9.12.0': {}
-
'@humanwhocodes/config-array@0.11.13':
+
'@eslint/object-schema@2.1.4': {}
+
+
'@eslint/plugin-kit@0.2.0':
dependencies:
-
'@humanwhocodes/object-schema': 2.0.1
-
debug: 4.3.4
-
minimatch: 3.1.2
-
transitivePeerDependencies:
-
- supports-color
+
levn: 0.4.1
+
+
'@humanfs/core@0.19.0': {}
+
+
'@humanfs/node@0.16.5':
+
dependencies:
+
'@humanfs/core': 0.19.0
+
'@humanwhocodes/retry': 0.3.1
'@humanwhocodes/module-importer@1.0.1': {}
-
'@humanwhocodes/object-schema@2.0.1': {}
+
'@humanwhocodes/retry@0.3.1': {}
+
+
'@moonlight-mod/eslint-config@https://codeload.github.com/moonlight-mod/eslint-config/tar.gz/7eb7bd7c51fe0e3ee9d2a0baf149212d2bb893af(eslint@9.12.0)(prettier@3.1.0)(typescript@5.3.2)':
+
dependencies:
+
'@eslint/js': 9.12.0
+
eslint: 9.12.0
+
eslint-config-prettier: 9.1.0(eslint@9.12.0)
+
eslint-plugin-prettier: 5.2.1(eslint-config-prettier@9.1.0(eslint@9.12.0))(eslint@9.12.0)(prettier@3.1.0)
+
eslint-plugin-react: 7.37.1(eslint@9.12.0)
+
typescript: 5.3.2
+
typescript-eslint: 8.8.1(eslint@9.12.0)(typescript@5.3.2)
+
transitivePeerDependencies:
+
- '@types/eslint'
+
- prettier
+
- supports-color
'@moonlight-mod/lunast@1.0.0':
dependencies:
···
'@nodelib/fs.walk@1.2.8':
dependencies:
'@nodelib/fs.scandir': 2.1.5
-
fastq: 1.15.0
+
fastq: 1.17.1
-
'@pkgr/utils@2.4.2':
-
dependencies:
-
cross-spawn: 7.0.3
-
fast-glob: 3.3.2
-
is-glob: 4.0.3
-
open: 9.1.0
-
picocolors: 1.0.0
-
tslib: 2.6.2
+
'@pkgr/core@0.1.1': {}
'@types/estree-jsx@1.0.5':
dependencies:
···
'@types/node': 20.16.10
safe-buffer: 5.1.2
-
'@types/semver@7.5.6': {}
-
-
'@typescript-eslint/eslint-plugin@6.13.2(@typescript-eslint/parser@6.13.2(eslint@8.55.0)(typescript@5.3.2))(eslint@8.55.0)(typescript@5.3.2)':
+
'@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)':
dependencies:
-
'@eslint-community/regexpp': 4.10.0
-
'@typescript-eslint/parser': 6.13.2(eslint@8.55.0)(typescript@5.3.2)
-
'@typescript-eslint/scope-manager': 6.13.2
-
'@typescript-eslint/type-utils': 6.13.2(eslint@8.55.0)(typescript@5.3.2)
-
'@typescript-eslint/utils': 6.13.2(eslint@8.55.0)(typescript@5.3.2)
-
'@typescript-eslint/visitor-keys': 6.13.2
-
debug: 4.3.4
-
eslint: 8.55.0
+
'@eslint-community/regexpp': 4.11.1
+
'@typescript-eslint/parser': 8.8.1(eslint@9.12.0)(typescript@5.3.2)
+
'@typescript-eslint/scope-manager': 8.8.1
+
'@typescript-eslint/type-utils': 8.8.1(eslint@9.12.0)(typescript@5.3.2)
+
'@typescript-eslint/utils': 8.8.1(eslint@9.12.0)(typescript@5.3.2)
+
'@typescript-eslint/visitor-keys': 8.8.1
+
eslint: 9.12.0
graphemer: 1.4.0
-
ignore: 5.3.0
+
ignore: 5.3.2
natural-compare: 1.4.0
-
semver: 7.5.4
-
ts-api-utils: 1.0.3(typescript@5.3.2)
+
ts-api-utils: 1.3.0(typescript@5.3.2)
optionalDependencies:
typescript: 5.3.2
transitivePeerDependencies:
- supports-color
-
'@typescript-eslint/parser@6.13.2(eslint@8.55.0)(typescript@5.3.2)':
+
'@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.3.2)':
dependencies:
-
'@typescript-eslint/scope-manager': 6.13.2
-
'@typescript-eslint/types': 6.13.2
-
'@typescript-eslint/typescript-estree': 6.13.2(typescript@5.3.2)
-
'@typescript-eslint/visitor-keys': 6.13.2
+
'@typescript-eslint/scope-manager': 8.8.1
+
'@typescript-eslint/types': 8.8.1
+
'@typescript-eslint/typescript-estree': 8.8.1(typescript@5.3.2)
+
'@typescript-eslint/visitor-keys': 8.8.1
debug: 4.3.4
-
eslint: 8.55.0
+
eslint: 9.12.0
optionalDependencies:
typescript: 5.3.2
transitivePeerDependencies:
- supports-color
-
'@typescript-eslint/scope-manager@6.13.2':
+
'@typescript-eslint/scope-manager@8.8.1':
dependencies:
-
'@typescript-eslint/types': 6.13.2
-
'@typescript-eslint/visitor-keys': 6.13.2
+
'@typescript-eslint/types': 8.8.1
+
'@typescript-eslint/visitor-keys': 8.8.1
-
'@typescript-eslint/type-utils@6.13.2(eslint@8.55.0)(typescript@5.3.2)':
+
'@typescript-eslint/type-utils@8.8.1(eslint@9.12.0)(typescript@5.3.2)':
dependencies:
-
'@typescript-eslint/typescript-estree': 6.13.2(typescript@5.3.2)
-
'@typescript-eslint/utils': 6.13.2(eslint@8.55.0)(typescript@5.3.2)
+
'@typescript-eslint/typescript-estree': 8.8.1(typescript@5.3.2)
+
'@typescript-eslint/utils': 8.8.1(eslint@9.12.0)(typescript@5.3.2)
debug: 4.3.4
-
eslint: 8.55.0
-
ts-api-utils: 1.0.3(typescript@5.3.2)
+
ts-api-utils: 1.3.0(typescript@5.3.2)
optionalDependencies:
typescript: 5.3.2
transitivePeerDependencies:
+
- eslint
- supports-color
-
'@typescript-eslint/types@6.13.2': {}
+
'@typescript-eslint/types@8.8.1': {}
-
'@typescript-eslint/typescript-estree@6.13.2(typescript@5.3.2)':
+
'@typescript-eslint/typescript-estree@8.8.1(typescript@5.3.2)':
dependencies:
-
'@typescript-eslint/types': 6.13.2
-
'@typescript-eslint/visitor-keys': 6.13.2
+
'@typescript-eslint/types': 8.8.1
+
'@typescript-eslint/visitor-keys': 8.8.1
debug: 4.3.4
-
globby: 11.1.0
+
fast-glob: 3.3.2
is-glob: 4.0.3
-
semver: 7.5.4
-
ts-api-utils: 1.0.3(typescript@5.3.2)
+
minimatch: 9.0.5
+
semver: 7.6.3
+
ts-api-utils: 1.3.0(typescript@5.3.2)
optionalDependencies:
typescript: 5.3.2
transitivePeerDependencies:
- supports-color
-
'@typescript-eslint/utils@6.13.2(eslint@8.55.0)(typescript@5.3.2)':
+
'@typescript-eslint/utils@8.8.1(eslint@9.12.0)(typescript@5.3.2)':
dependencies:
-
'@eslint-community/eslint-utils': 4.4.0(eslint@8.55.0)
-
'@types/json-schema': 7.0.15
-
'@types/semver': 7.5.6
-
'@typescript-eslint/scope-manager': 6.13.2
-
'@typescript-eslint/types': 6.13.2
-
'@typescript-eslint/typescript-estree': 6.13.2(typescript@5.3.2)
-
eslint: 8.55.0
-
semver: 7.5.4
+
'@eslint-community/eslint-utils': 4.4.0(eslint@9.12.0)
+
'@typescript-eslint/scope-manager': 8.8.1
+
'@typescript-eslint/types': 8.8.1
+
'@typescript-eslint/typescript-estree': 8.8.1(typescript@5.3.2)
+
eslint: 9.12.0
transitivePeerDependencies:
- supports-color
- typescript
-
'@typescript-eslint/visitor-keys@6.13.2':
+
'@typescript-eslint/visitor-keys@8.8.1':
dependencies:
-
'@typescript-eslint/types': 6.13.2
+
'@typescript-eslint/types': 8.8.1
eslint-visitor-keys: 3.4.3
-
-
'@ungap/structured-clone@1.2.0': {}
'@zenfs/core@1.0.2':
dependencies:
···
json-schema-traverse: 0.4.1
uri-js: 4.4.1
-
ansi-regex@5.0.1: {}
-
ansi-styles@4.3.0:
dependencies:
color-convert: 2.0.1
argparse@2.0.1: {}
-
array-buffer-byte-length@1.0.0:
+
array-buffer-byte-length@1.0.1:
dependencies:
-
call-bind: 1.0.5
-
is-array-buffer: 3.0.2
+
call-bind: 1.0.7
+
is-array-buffer: 3.0.4
-
array-includes@3.1.7:
+
array-includes@3.1.8:
dependencies:
-
call-bind: 1.0.5
+
call-bind: 1.0.7
define-properties: 1.2.1
-
es-abstract: 1.22.3
-
get-intrinsic: 1.2.2
+
es-abstract: 1.23.3
+
es-object-atoms: 1.0.0
+
get-intrinsic: 1.2.4
is-string: 1.0.7
-
array-union@2.1.0: {}
+
array.prototype.findlast@1.2.5:
+
dependencies:
+
call-bind: 1.0.7
+
define-properties: 1.2.1
+
es-abstract: 1.23.3
+
es-errors: 1.3.0
+
es-object-atoms: 1.0.0
+
es-shim-unscopables: 1.0.2
array.prototype.flat@1.3.2:
dependencies:
-
call-bind: 1.0.5
+
call-bind: 1.0.7
define-properties: 1.2.1
-
es-abstract: 1.22.3
+
es-abstract: 1.23.3
es-shim-unscopables: 1.0.2
array.prototype.flatmap@1.3.2:
dependencies:
-
call-bind: 1.0.5
+
call-bind: 1.0.7
define-properties: 1.2.1
-
es-abstract: 1.22.3
+
es-abstract: 1.23.3
es-shim-unscopables: 1.0.2
-
array.prototype.tosorted@1.1.2:
+
array.prototype.tosorted@1.1.4:
dependencies:
-
call-bind: 1.0.5
+
call-bind: 1.0.7
define-properties: 1.2.1
-
es-abstract: 1.22.3
+
es-abstract: 1.23.3
+
es-errors: 1.3.0
es-shim-unscopables: 1.0.2
-
get-intrinsic: 1.2.2
-
arraybuffer.prototype.slice@1.0.2:
+
arraybuffer.prototype.slice@1.0.3:
dependencies:
-
array-buffer-byte-length: 1.0.0
-
call-bind: 1.0.5
+
array-buffer-byte-length: 1.0.1
+
call-bind: 1.0.7
define-properties: 1.2.1
-
es-abstract: 1.22.3
-
get-intrinsic: 1.2.2
-
is-array-buffer: 3.0.2
-
is-shared-array-buffer: 1.0.2
+
es-abstract: 1.23.3
+
es-errors: 1.3.0
+
get-intrinsic: 1.2.4
+
is-array-buffer: 3.0.4
+
is-shared-array-buffer: 1.0.3
astring@1.9.0: {}
-
asynciterator.prototype@1.0.0:
+
available-typed-arrays@1.0.7:
dependencies:
-
has-symbols: 1.0.3
-
-
available-typed-arrays@1.0.5: {}
+
possible-typed-array-names: 1.0.0
balanced-match@1.0.2: {}
base64-js@1.5.1: {}
-
big-integer@1.6.52: {}
-
-
bplist-parser@0.2.0:
-
dependencies:
-
big-integer: 1.6.52
-
brace-expansion@1.1.11:
dependencies:
balanced-match: 1.0.2
···
dependencies:
balanced-match: 1.0.2
-
braces@3.0.2:
+
braces@3.0.3:
dependencies:
-
fill-range: 7.0.1
+
fill-range: 7.1.1
buffer@6.0.3:
dependencies:
base64-js: 1.5.1
ieee754: 1.2.1
-
bundle-name@3.0.0:
+
call-bind@1.0.7:
dependencies:
-
run-applescript: 5.0.0
-
-
call-bind@1.0.5:
-
dependencies:
+
es-define-property: 1.0.0
+
es-errors: 1.3.0
function-bind: 1.1.2
-
get-intrinsic: 1.2.2
-
set-function-length: 1.1.1
+
get-intrinsic: 1.2.4
+
set-function-length: 1.2.2
callsites@3.1.0: {}
···
csstype@3.1.3: {}
-
debug@4.3.4:
+
data-view-buffer@1.0.1:
dependencies:
-
ms: 2.1.2
+
call-bind: 1.0.7
+
es-errors: 1.3.0
+
is-data-view: 1.0.1
-
deep-is@0.1.4: {}
+
data-view-byte-length@1.0.1:
+
dependencies:
+
call-bind: 1.0.7
+
es-errors: 1.3.0
+
is-data-view: 1.0.1
-
default-browser-id@3.0.0:
+
data-view-byte-offset@1.0.0:
dependencies:
-
bplist-parser: 0.2.0
-
untildify: 4.0.0
+
call-bind: 1.0.7
+
es-errors: 1.3.0
+
is-data-view: 1.0.1
-
default-browser@4.0.0:
+
debug@4.3.4:
dependencies:
-
bundle-name: 3.0.0
-
default-browser-id: 3.0.0
-
execa: 7.2.0
-
titleize: 3.0.0
+
ms: 2.1.2
+
+
deep-is@0.1.4: {}
-
define-data-property@1.1.1:
+
define-data-property@1.1.4:
dependencies:
-
get-intrinsic: 1.2.2
+
es-define-property: 1.0.0
+
es-errors: 1.3.0
gopd: 1.0.1
-
has-property-descriptors: 1.0.1
-
-
define-lazy-prop@3.0.0: {}
define-properties@1.2.1:
dependencies:
-
define-data-property: 1.1.1
-
has-property-descriptors: 1.0.1
+
define-data-property: 1.1.4
+
has-property-descriptors: 1.0.2
object-keys: 1.1.1
-
dir-glob@3.0.1:
-
dependencies:
-
path-type: 4.0.0
-
doctrine@2.1.0:
dependencies:
esutils: 2.0.3
-
doctrine@3.0.0:
+
es-abstract@1.23.3:
dependencies:
-
esutils: 2.0.3
-
-
es-abstract@1.22.3:
-
dependencies:
-
array-buffer-byte-length: 1.0.0
-
arraybuffer.prototype.slice: 1.0.2
-
available-typed-arrays: 1.0.5
-
call-bind: 1.0.5
-
es-set-tostringtag: 2.0.2
+
array-buffer-byte-length: 1.0.1
+
arraybuffer.prototype.slice: 1.0.3
+
available-typed-arrays: 1.0.7
+
call-bind: 1.0.7
+
data-view-buffer: 1.0.1
+
data-view-byte-length: 1.0.1
+
data-view-byte-offset: 1.0.0
+
es-define-property: 1.0.0
+
es-errors: 1.3.0
+
es-object-atoms: 1.0.0
+
es-set-tostringtag: 2.0.3
es-to-primitive: 1.2.1
function.prototype.name: 1.1.6
-
get-intrinsic: 1.2.2
-
get-symbol-description: 1.0.0
-
globalthis: 1.0.3
+
get-intrinsic: 1.2.4
+
get-symbol-description: 1.0.2
+
globalthis: 1.0.4
gopd: 1.0.1
-
has-property-descriptors: 1.0.1
-
has-proto: 1.0.1
+
has-property-descriptors: 1.0.2
+
has-proto: 1.0.3
has-symbols: 1.0.3
-
hasown: 2.0.0
-
internal-slot: 1.0.6
-
is-array-buffer: 3.0.2
+
hasown: 2.0.2
+
internal-slot: 1.0.7
+
is-array-buffer: 3.0.4
is-callable: 1.2.7
-
is-negative-zero: 2.0.2
+
is-data-view: 1.0.1
+
is-negative-zero: 2.0.3
is-regex: 1.1.4
-
is-shared-array-buffer: 1.0.2
+
is-shared-array-buffer: 1.0.3
is-string: 1.0.7
-
is-typed-array: 1.1.12
+
is-typed-array: 1.1.13
is-weakref: 1.0.2
-
object-inspect: 1.13.1
+
object-inspect: 1.13.2
object-keys: 1.1.1
object.assign: 4.1.5
-
regexp.prototype.flags: 1.5.1
-
safe-array-concat: 1.0.1
-
safe-regex-test: 1.0.0
-
string.prototype.trim: 1.2.8
-
string.prototype.trimend: 1.0.7
-
string.prototype.trimstart: 1.0.7
-
typed-array-buffer: 1.0.0
-
typed-array-byte-length: 1.0.0
-
typed-array-byte-offset: 1.0.0
-
typed-array-length: 1.0.4
+
regexp.prototype.flags: 1.5.3
+
safe-array-concat: 1.1.2
+
safe-regex-test: 1.0.3
+
string.prototype.trim: 1.2.9
+
string.prototype.trimend: 1.0.8
+
string.prototype.trimstart: 1.0.8
+
typed-array-buffer: 1.0.2
+
typed-array-byte-length: 1.0.1
+
typed-array-byte-offset: 1.0.2
+
typed-array-length: 1.0.6
unbox-primitive: 1.0.2
-
which-typed-array: 1.1.13
+
which-typed-array: 1.1.15
-
es-iterator-helpers@1.0.15:
+
es-define-property@1.0.0:
+
dependencies:
+
get-intrinsic: 1.2.4
+
+
es-errors@1.3.0: {}
+
+
es-iterator-helpers@1.1.0:
dependencies:
-
asynciterator.prototype: 1.0.0
-
call-bind: 1.0.5
+
call-bind: 1.0.7
define-properties: 1.2.1
-
es-abstract: 1.22.3
-
es-set-tostringtag: 2.0.2
+
es-abstract: 1.23.3
+
es-errors: 1.3.0
+
es-set-tostringtag: 2.0.3
function-bind: 1.1.2
-
get-intrinsic: 1.2.2
-
globalthis: 1.0.3
-
has-property-descriptors: 1.0.1
-
has-proto: 1.0.1
+
get-intrinsic: 1.2.4
+
globalthis: 1.0.4
+
has-property-descriptors: 1.0.2
+
has-proto: 1.0.3
has-symbols: 1.0.3
-
internal-slot: 1.0.6
-
iterator.prototype: 1.1.2
-
safe-array-concat: 1.0.1
+
internal-slot: 1.0.7
+
iterator.prototype: 1.1.3
+
safe-array-concat: 1.1.2
-
es-set-tostringtag@2.0.2:
+
es-object-atoms@1.0.0:
dependencies:
-
get-intrinsic: 1.2.2
-
has-tostringtag: 1.0.0
-
hasown: 2.0.0
+
es-errors: 1.3.0
+
+
es-set-tostringtag@2.0.3:
+
dependencies:
+
get-intrinsic: 1.2.4
+
has-tostringtag: 1.0.2
+
hasown: 2.0.2
es-shim-unscopables@1.0.2:
dependencies:
-
hasown: 2.0.0
+
hasown: 2.0.2
es-to-primitive@1.2.1:
dependencies:
···
escape-string-regexp@4.0.0: {}
-
eslint-config-prettier@9.1.0(eslint@8.55.0):
+
eslint-config-prettier@9.1.0(eslint@9.12.0):
dependencies:
-
eslint: 8.55.0
+
eslint: 9.12.0
-
eslint-plugin-prettier@5.0.1(eslint-config-prettier@9.1.0(eslint@8.55.0))(eslint@8.55.0)(prettier@3.1.0):
+
eslint-plugin-prettier@5.2.1(eslint-config-prettier@9.1.0(eslint@9.12.0))(eslint@9.12.0)(prettier@3.1.0):
dependencies:
-
eslint: 8.55.0
+
eslint: 9.12.0
prettier: 3.1.0
prettier-linter-helpers: 1.0.0
-
synckit: 0.8.6
+
synckit: 0.9.2
optionalDependencies:
-
eslint-config-prettier: 9.1.0(eslint@8.55.0)
+
eslint-config-prettier: 9.1.0(eslint@9.12.0)
-
eslint-plugin-react@7.33.2(eslint@8.55.0):
+
eslint-plugin-react@7.37.1(eslint@9.12.0):
dependencies:
-
array-includes: 3.1.7
+
array-includes: 3.1.8
+
array.prototype.findlast: 1.2.5
array.prototype.flatmap: 1.3.2
-
array.prototype.tosorted: 1.1.2
+
array.prototype.tosorted: 1.1.4
doctrine: 2.1.0
-
es-iterator-helpers: 1.0.15
-
eslint: 8.55.0
+
es-iterator-helpers: 1.1.0
+
eslint: 9.12.0
estraverse: 5.3.0
+
hasown: 2.0.2
jsx-ast-utils: 3.3.5
minimatch: 3.1.2
-
object.entries: 1.1.7
-
object.fromentries: 2.0.7
-
object.hasown: 1.1.3
-
object.values: 1.1.7
+
object.entries: 1.1.8
+
object.fromentries: 2.0.8
+
object.values: 1.2.0
prop-types: 15.8.1
resolve: 2.0.0-next.5
semver: 6.3.1
-
string.prototype.matchall: 4.0.10
+
string.prototype.matchall: 4.0.11
+
string.prototype.repeat: 1.0.0
-
eslint-scope@7.2.2:
+
eslint-scope@8.1.0:
dependencies:
esrecurse: 4.3.0
estraverse: 5.3.0
eslint-visitor-keys@3.4.3: {}
-
eslint@8.55.0:
+
eslint-visitor-keys@4.1.0: {}
+
+
eslint@9.12.0:
dependencies:
-
'@eslint-community/eslint-utils': 4.4.0(eslint@8.55.0)
-
'@eslint-community/regexpp': 4.10.0
-
'@eslint/eslintrc': 2.1.4
-
'@eslint/js': 8.55.0
-
'@humanwhocodes/config-array': 0.11.13
+
'@eslint-community/eslint-utils': 4.4.0(eslint@9.12.0)
+
'@eslint-community/regexpp': 4.11.1
+
'@eslint/config-array': 0.18.0
+
'@eslint/core': 0.6.0
+
'@eslint/eslintrc': 3.1.0
+
'@eslint/js': 9.12.0
+
'@eslint/plugin-kit': 0.2.0
+
'@humanfs/node': 0.16.5
'@humanwhocodes/module-importer': 1.0.1
-
'@nodelib/fs.walk': 1.2.8
-
'@ungap/structured-clone': 1.2.0
+
'@humanwhocodes/retry': 0.3.1
+
'@types/estree': 1.0.6
+
'@types/json-schema': 7.0.15
ajv: 6.12.6
chalk: 4.1.2
cross-spawn: 7.0.3
debug: 4.3.4
-
doctrine: 3.0.0
escape-string-regexp: 4.0.0
-
eslint-scope: 7.2.2
-
eslint-visitor-keys: 3.4.3
-
espree: 9.6.1
+
eslint-scope: 8.1.0
+
eslint-visitor-keys: 4.1.0
+
espree: 10.2.0
esquery: 1.5.0
esutils: 2.0.3
fast-deep-equal: 3.1.3
-
file-entry-cache: 6.0.1
+
file-entry-cache: 8.0.0
find-up: 5.0.0
glob-parent: 6.0.2
-
globals: 13.23.0
-
graphemer: 1.4.0
ignore: 5.3.0
imurmurhash: 0.1.4
is-glob: 4.0.3
-
is-path-inside: 3.0.3
-
js-yaml: 4.1.0
json-stable-stringify-without-jsonify: 1.0.1
-
levn: 0.4.1
lodash.merge: 4.6.2
minimatch: 3.1.2
natural-compare: 1.4.0
optionator: 0.9.3
-
strip-ansi: 6.0.1
text-table: 0.2.0
transitivePeerDependencies:
- supports-color
-
espree@9.6.1:
+
espree@10.2.0:
dependencies:
acorn: 8.12.1
acorn-jsx: 5.3.2(acorn@8.12.1)
-
eslint-visitor-keys: 3.4.3
+
eslint-visitor-keys: 4.1.0
esquery@1.5.0:
dependencies:
···
events@3.3.0: {}
-
execa@5.1.1:
-
dependencies:
-
cross-spawn: 7.0.3
-
get-stream: 6.0.1
-
human-signals: 2.1.0
-
is-stream: 2.0.1
-
merge-stream: 2.0.0
-
npm-run-path: 4.0.1
-
onetime: 5.1.2
-
signal-exit: 3.0.7
-
strip-final-newline: 2.0.0
-
-
execa@7.2.0:
-
dependencies:
-
cross-spawn: 7.0.3
-
get-stream: 6.0.1
-
human-signals: 4.3.1
-
is-stream: 3.0.0
-
merge-stream: 2.0.0
-
npm-run-path: 5.1.0
-
onetime: 6.0.0
-
signal-exit: 3.0.7
-
strip-final-newline: 3.0.0
-
fast-deep-equal@3.1.3: {}
fast-diff@1.3.0: {}
···
'@nodelib/fs.walk': 1.2.8
glob-parent: 5.1.2
merge2: 1.4.1
-
micromatch: 4.0.5
+
micromatch: 4.0.8
fast-json-stable-stringify@2.1.0: {}
fast-levenshtein@2.0.6: {}
-
fastq@1.15.0:
+
fastq@1.17.1:
dependencies:
reusify: 1.0.4
-
file-entry-cache@6.0.1:
+
file-entry-cache@8.0.0:
dependencies:
-
flat-cache: 3.2.0
+
flat-cache: 4.0.1
-
fill-range@7.0.1:
+
fill-range@7.1.1:
dependencies:
to-regex-range: 5.0.1
···
locate-path: 6.0.0
path-exists: 4.0.0
-
flat-cache@3.2.0:
+
flat-cache@4.0.1:
dependencies:
flatted: 3.2.9
keyv: 4.5.4
-
rimraf: 3.0.2
flatted@3.2.9: {}
···
dependencies:
is-callable: 1.2.7
-
fs.realpath@1.0.0: {}
-
function-bind@1.1.2: {}
function.prototype.name@1.1.6:
dependencies:
-
call-bind: 1.0.5
+
call-bind: 1.0.7
define-properties: 1.2.1
-
es-abstract: 1.22.3
+
es-abstract: 1.23.3
functions-have-names: 1.2.3
functions-have-names@1.2.3: {}
-
get-intrinsic@1.2.2:
+
get-intrinsic@1.2.4:
dependencies:
+
es-errors: 1.3.0
function-bind: 1.1.2
-
has-proto: 1.0.1
+
has-proto: 1.0.3
has-symbols: 1.0.3
-
hasown: 2.0.0
+
hasown: 2.0.2
-
get-stream@6.0.1: {}
-
-
get-symbol-description@1.0.0:
+
get-symbol-description@1.0.2:
dependencies:
-
call-bind: 1.0.5
-
get-intrinsic: 1.2.2
+
call-bind: 1.0.7
+
es-errors: 1.3.0
+
get-intrinsic: 1.2.4
glob-parent@5.1.2:
dependencies:
···
dependencies:
is-glob: 4.0.3
-
glob@7.2.3:
-
dependencies:
-
fs.realpath: 1.0.0
-
inflight: 1.0.6
-
inherits: 2.0.4
-
minimatch: 3.1.2
-
once: 1.4.0
-
path-is-absolute: 1.0.1
-
-
globals@13.23.0:
-
dependencies:
-
type-fest: 0.20.2
+
globals@14.0.0: {}
-
globalthis@1.0.3:
+
globalthis@1.0.4:
dependencies:
define-properties: 1.2.1
-
-
globby@11.1.0:
-
dependencies:
-
array-union: 2.1.0
-
dir-glob: 3.0.1
-
fast-glob: 3.3.2
-
ignore: 5.3.0
-
merge2: 1.4.1
-
slash: 3.0.0
+
gopd: 1.0.1
gopd@1.0.1:
dependencies:
-
get-intrinsic: 1.2.2
+
get-intrinsic: 1.2.4
graphemer@1.4.0: {}
···
has-flag@4.0.0: {}
-
has-property-descriptors@1.0.1:
+
has-property-descriptors@1.0.2:
dependencies:
-
get-intrinsic: 1.2.2
+
es-define-property: 1.0.0
-
has-proto@1.0.1: {}
+
has-proto@1.0.3: {}
has-symbols@1.0.3: {}
-
has-tostringtag@1.0.0:
+
has-tostringtag@1.0.2:
dependencies:
has-symbols: 1.0.3
-
hasown@2.0.0:
+
hasown@2.0.2:
dependencies:
function-bind: 1.1.2
-
human-signals@2.1.0: {}
-
-
human-signals@4.3.1: {}
-
husky@8.0.3: {}
ieee754@1.2.1: {}
ignore@5.3.0: {}
+
+
ignore@5.3.2: {}
import-fresh@3.3.0:
dependencies:
···
imurmurhash@0.1.4: {}
-
inflight@1.0.6:
+
internal-slot@1.0.7:
dependencies:
-
once: 1.4.0
-
wrappy: 1.0.2
+
es-errors: 1.3.0
+
hasown: 2.0.2
+
side-channel: 1.0.6
-
inherits@2.0.4: {}
-
-
internal-slot@1.0.6:
+
is-array-buffer@3.0.4:
dependencies:
-
get-intrinsic: 1.2.2
-
hasown: 2.0.0
-
side-channel: 1.0.4
-
-
is-array-buffer@3.0.2:
-
dependencies:
-
call-bind: 1.0.5
-
get-intrinsic: 1.2.2
-
is-typed-array: 1.1.12
+
call-bind: 1.0.7
+
get-intrinsic: 1.2.4
is-async-function@2.0.0:
dependencies:
-
has-tostringtag: 1.0.0
+
has-tostringtag: 1.0.2
is-bigint@1.0.4:
dependencies:
···
is-boolean-object@1.1.2:
dependencies:
-
call-bind: 1.0.5
-
has-tostringtag: 1.0.0
+
call-bind: 1.0.7
+
has-tostringtag: 1.0.2
is-callable@1.2.7: {}
-
is-core-module@2.13.1:
+
is-core-module@2.15.1:
dependencies:
-
hasown: 2.0.0
+
hasown: 2.0.2
-
is-date-object@1.0.5:
+
is-data-view@1.0.1:
dependencies:
-
has-tostringtag: 1.0.0
+
is-typed-array: 1.1.13
-
is-docker@2.2.1: {}
-
-
is-docker@3.0.0: {}
+
is-date-object@1.0.5:
+
dependencies:
+
has-tostringtag: 1.0.2
is-extglob@2.1.1: {}
is-finalizationregistry@1.0.2:
dependencies:
-
call-bind: 1.0.5
+
call-bind: 1.0.7
is-generator-function@1.0.10:
dependencies:
-
has-tostringtag: 1.0.0
+
has-tostringtag: 1.0.2
is-glob@4.0.3:
dependencies:
is-extglob: 2.1.1
-
is-inside-container@1.0.0:
-
dependencies:
-
is-docker: 3.0.0
+
is-map@2.0.3: {}
-
is-map@2.0.2: {}
-
-
is-negative-zero@2.0.2: {}
+
is-negative-zero@2.0.3: {}
is-number-object@1.0.7:
dependencies:
-
has-tostringtag: 1.0.0
+
has-tostringtag: 1.0.2
is-number@7.0.0: {}
-
is-path-inside@3.0.3: {}
-
is-regex@1.1.4:
dependencies:
-
call-bind: 1.0.5
-
has-tostringtag: 1.0.0
+
call-bind: 1.0.7
+
has-tostringtag: 1.0.2
-
is-set@2.0.2: {}
+
is-set@2.0.3: {}
-
is-shared-array-buffer@1.0.2:
+
is-shared-array-buffer@1.0.3:
dependencies:
-
call-bind: 1.0.5
-
-
is-stream@2.0.1: {}
-
-
is-stream@3.0.0: {}
+
call-bind: 1.0.7
is-string@1.0.7:
dependencies:
-
has-tostringtag: 1.0.0
+
has-tostringtag: 1.0.2
is-symbol@1.0.4:
dependencies:
has-symbols: 1.0.3
-
is-typed-array@1.1.12:
+
is-typed-array@1.1.13:
dependencies:
-
which-typed-array: 1.1.13
+
which-typed-array: 1.1.15
-
is-weakmap@2.0.1: {}
+
is-weakmap@2.0.2: {}
is-weakref@1.0.2:
dependencies:
-
call-bind: 1.0.5
+
call-bind: 1.0.7
-
is-weakset@2.0.2:
-
dependencies:
-
call-bind: 1.0.5
-
get-intrinsic: 1.2.2
-
-
is-wsl@2.2.0:
+
is-weakset@2.0.3:
dependencies:
-
is-docker: 2.2.1
+
call-bind: 1.0.7
+
get-intrinsic: 1.2.4
isarray@2.0.5: {}
isexe@2.0.0: {}
-
iterator.prototype@1.1.2:
+
iterator.prototype@1.1.3:
dependencies:
define-properties: 1.2.1
-
get-intrinsic: 1.2.2
+
get-intrinsic: 1.2.4
has-symbols: 1.0.3
-
reflect.getprototypeof: 1.0.4
-
set-function-name: 2.0.1
+
reflect.getprototypeof: 1.0.6
+
set-function-name: 2.0.2
js-tokens@4.0.0: {}
···
jsx-ast-utils@3.3.5:
dependencies:
-
array-includes: 3.1.7
+
array-includes: 3.1.8
array.prototype.flat: 1.3.2
object.assign: 4.1.5
-
object.values: 1.1.7
+
object.values: 1.2.0
keyv@4.5.4:
dependencies:
···
dependencies:
js-tokens: 4.0.0
-
lru-cache@6.0.0:
-
dependencies:
-
yallist: 4.0.0
-
-
merge-stream@2.0.0: {}
-
merge2@1.4.1: {}
meriyah@6.0.1: {}
-
micromatch@4.0.5:
+
micromatch@4.0.8:
dependencies:
-
braces: 3.0.2
+
braces: 3.0.3
picomatch: 2.3.1
-
mimic-fn@2.1.0: {}
-
-
mimic-fn@4.0.0: {}
-
minimatch@3.1.2:
dependencies:
brace-expansion: 1.1.11
···
natural-compare@1.4.0: {}
-
npm-run-path@4.0.1:
-
dependencies:
-
path-key: 3.1.1
-
-
npm-run-path@5.1.0:
-
dependencies:
-
path-key: 4.0.0
-
object-assign@4.1.1: {}
-
object-inspect@1.13.1: {}
+
object-inspect@1.13.2: {}
object-keys@1.1.1: {}
object.assign@4.1.5:
dependencies:
-
call-bind: 1.0.5
+
call-bind: 1.0.7
define-properties: 1.2.1
has-symbols: 1.0.3
object-keys: 1.1.1
-
object.entries@1.1.7:
+
object.entries@1.1.8:
dependencies:
-
call-bind: 1.0.5
+
call-bind: 1.0.7
define-properties: 1.2.1
-
es-abstract: 1.22.3
-
-
object.fromentries@2.0.7:
-
dependencies:
-
call-bind: 1.0.5
-
define-properties: 1.2.1
-
es-abstract: 1.22.3
+
es-object-atoms: 1.0.0
-
object.hasown@1.1.3:
+
object.fromentries@2.0.8:
dependencies:
+
call-bind: 1.0.7
define-properties: 1.2.1
-
es-abstract: 1.22.3
+
es-abstract: 1.23.3
+
es-object-atoms: 1.0.0
-
object.values@1.1.7:
+
object.values@1.2.0:
dependencies:
-
call-bind: 1.0.5
+
call-bind: 1.0.7
define-properties: 1.2.1
-
es-abstract: 1.22.3
-
-
once@1.4.0:
-
dependencies:
-
wrappy: 1.0.2
-
-
onetime@5.1.2:
-
dependencies:
-
mimic-fn: 2.1.0
-
-
onetime@6.0.0:
-
dependencies:
-
mimic-fn: 4.0.0
-
-
open@9.1.0:
-
dependencies:
-
default-browser: 4.0.0
-
define-lazy-prop: 3.0.0
-
is-inside-container: 1.0.0
-
is-wsl: 2.2.0
+
es-object-atoms: 1.0.0
optionator@0.9.3:
dependencies:
···
path-exists@4.0.0: {}
-
path-is-absolute@1.0.1: {}
-
path-key@3.1.1: {}
-
-
path-key@4.0.0: {}
path-parse@1.0.7: {}
-
-
path-type@4.0.0: {}
-
-
picocolors@1.0.0: {}
picomatch@2.3.1: {}
+
possible-typed-array-names@1.0.0: {}
+
prelude-ls@1.2.1: {}
prettier-linter-helpers@1.0.0:
···
process: 0.11.10
string_decoder: 1.3.0
-
reflect.getprototypeof@1.0.4:
+
reflect.getprototypeof@1.0.6:
dependencies:
-
call-bind: 1.0.5
+
call-bind: 1.0.7
define-properties: 1.2.1
-
es-abstract: 1.22.3
-
get-intrinsic: 1.2.2
-
globalthis: 1.0.3
-
which-builtin-type: 1.1.3
+
es-abstract: 1.23.3
+
es-errors: 1.3.0
+
get-intrinsic: 1.2.4
+
globalthis: 1.0.4
+
which-builtin-type: 1.1.4
-
regexp.prototype.flags@1.5.1:
+
regexp.prototype.flags@1.5.3:
dependencies:
-
call-bind: 1.0.5
+
call-bind: 1.0.7
define-properties: 1.2.1
-
set-function-name: 2.0.1
+
es-errors: 1.3.0
+
set-function-name: 2.0.2
resolve-from@4.0.0: {}
resolve@2.0.0-next.5:
dependencies:
-
is-core-module: 2.13.1
+
is-core-module: 2.15.1
path-parse: 1.0.7
supports-preserve-symlinks-flag: 1.0.0
reusify@1.0.4: {}
-
rimraf@3.0.2:
-
dependencies:
-
glob: 7.2.3
-
-
run-applescript@5.0.0:
-
dependencies:
-
execa: 5.1.1
-
run-parallel@1.2.0:
dependencies:
queue-microtask: 1.2.3
-
safe-array-concat@1.0.1:
+
safe-array-concat@1.1.2:
dependencies:
-
call-bind: 1.0.5
-
get-intrinsic: 1.2.2
+
call-bind: 1.0.7
+
get-intrinsic: 1.2.4
has-symbols: 1.0.3
isarray: 2.0.5
···
safe-buffer@5.2.1: {}
-
safe-regex-test@1.0.0:
+
safe-regex-test@1.0.3:
dependencies:
-
call-bind: 1.0.5
-
get-intrinsic: 1.2.2
+
call-bind: 1.0.7
+
es-errors: 1.3.0
is-regex: 1.1.4
semver@6.3.1: {}
-
semver@7.5.4:
-
dependencies:
-
lru-cache: 6.0.0
+
semver@7.6.3: {}
-
set-function-length@1.1.1:
+
set-function-length@1.2.2:
dependencies:
-
define-data-property: 1.1.1
-
get-intrinsic: 1.2.2
+
define-data-property: 1.1.4
+
es-errors: 1.3.0
+
function-bind: 1.1.2
+
get-intrinsic: 1.2.4
gopd: 1.0.1
-
has-property-descriptors: 1.0.1
+
has-property-descriptors: 1.0.2
-
set-function-name@2.0.1:
+
set-function-name@2.0.2:
dependencies:
-
define-data-property: 1.1.1
+
define-data-property: 1.1.4
+
es-errors: 1.3.0
functions-have-names: 1.2.3
-
has-property-descriptors: 1.0.1
+
has-property-descriptors: 1.0.2
shebang-command@2.0.0:
dependencies:
···
shebang-regex@3.0.0: {}
-
side-channel@1.0.4:
+
side-channel@1.0.6:
dependencies:
-
call-bind: 1.0.5
-
get-intrinsic: 1.2.2
-
object-inspect: 1.13.1
-
-
signal-exit@3.0.7: {}
-
-
slash@3.0.0: {}
+
call-bind: 1.0.7
+
es-errors: 1.3.0
+
get-intrinsic: 1.2.4
+
object-inspect: 1.13.2
standalone-electron-types@1.0.0:
dependencies:
'@types/node': 18.17.17
-
string.prototype.matchall@4.0.10:
+
string.prototype.matchall@4.0.11:
dependencies:
-
call-bind: 1.0.5
+
call-bind: 1.0.7
define-properties: 1.2.1
-
es-abstract: 1.22.3
-
get-intrinsic: 1.2.2
+
es-abstract: 1.23.3
+
es-errors: 1.3.0
+
es-object-atoms: 1.0.0
+
get-intrinsic: 1.2.4
+
gopd: 1.0.1
has-symbols: 1.0.3
-
internal-slot: 1.0.6
-
regexp.prototype.flags: 1.5.1
-
set-function-name: 2.0.1
-
side-channel: 1.0.4
+
internal-slot: 1.0.7
+
regexp.prototype.flags: 1.5.3
+
set-function-name: 2.0.2
+
side-channel: 1.0.6
-
string.prototype.trim@1.2.8:
+
string.prototype.repeat@1.0.0:
dependencies:
-
call-bind: 1.0.5
define-properties: 1.2.1
-
es-abstract: 1.22.3
+
es-abstract: 1.23.3
-
string.prototype.trimend@1.0.7:
+
string.prototype.trim@1.2.9:
dependencies:
-
call-bind: 1.0.5
+
call-bind: 1.0.7
define-properties: 1.2.1
-
es-abstract: 1.22.3
+
es-abstract: 1.23.3
+
es-object-atoms: 1.0.0
-
string.prototype.trimstart@1.0.7:
+
string.prototype.trimend@1.0.8:
dependencies:
-
call-bind: 1.0.5
+
call-bind: 1.0.7
define-properties: 1.2.1
-
es-abstract: 1.22.3
+
es-object-atoms: 1.0.0
-
string_decoder@1.3.0:
+
string.prototype.trimstart@1.0.8:
dependencies:
-
safe-buffer: 5.2.1
+
call-bind: 1.0.7
+
define-properties: 1.2.1
+
es-object-atoms: 1.0.0
-
strip-ansi@6.0.1:
+
string_decoder@1.3.0:
dependencies:
-
ansi-regex: 5.0.1
-
-
strip-final-newline@2.0.0: {}
-
-
strip-final-newline@3.0.0: {}
+
safe-buffer: 5.2.1
strip-json-comments@3.1.1: {}
···
supports-preserve-symlinks-flag@1.0.0: {}
-
synckit@0.8.6:
+
synckit@0.9.2:
dependencies:
-
'@pkgr/utils': 2.4.2
-
tslib: 2.6.2
+
'@pkgr/core': 0.1.1
+
tslib: 2.7.0
text-table@0.2.0: {}
-
-
titleize@3.0.0: {}
to-regex-range@5.0.1:
dependencies:
is-number: 7.0.0
-
ts-api-utils@1.0.3(typescript@5.3.2):
+
ts-api-utils@1.3.0(typescript@5.3.2):
dependencies:
typescript: 5.3.2
-
tslib@2.6.2: {}
+
tslib@2.7.0: {}
type-check@0.4.0:
dependencies:
prelude-ls: 1.2.1
-
type-fest@0.20.2: {}
-
-
typed-array-buffer@1.0.0:
+
typed-array-buffer@1.0.2:
dependencies:
-
call-bind: 1.0.5
-
get-intrinsic: 1.2.2
-
is-typed-array: 1.1.12
+
call-bind: 1.0.7
+
es-errors: 1.3.0
+
is-typed-array: 1.1.13
-
typed-array-byte-length@1.0.0:
+
typed-array-byte-length@1.0.1:
dependencies:
-
call-bind: 1.0.5
+
call-bind: 1.0.7
for-each: 0.3.3
-
has-proto: 1.0.1
-
is-typed-array: 1.1.12
+
gopd: 1.0.1
+
has-proto: 1.0.3
+
is-typed-array: 1.1.13
-
typed-array-byte-offset@1.0.0:
+
typed-array-byte-offset@1.0.2:
dependencies:
-
available-typed-arrays: 1.0.5
-
call-bind: 1.0.5
+
available-typed-arrays: 1.0.7
+
call-bind: 1.0.7
for-each: 0.3.3
-
has-proto: 1.0.1
-
is-typed-array: 1.1.12
+
gopd: 1.0.1
+
has-proto: 1.0.3
+
is-typed-array: 1.1.13
-
typed-array-length@1.0.4:
+
typed-array-length@1.0.6:
dependencies:
-
call-bind: 1.0.5
+
call-bind: 1.0.7
for-each: 0.3.3
-
is-typed-array: 1.1.12
+
gopd: 1.0.1
+
has-proto: 1.0.3
+
is-typed-array: 1.1.13
+
possible-typed-array-names: 1.0.0
+
+
typescript-eslint@8.8.1(eslint@9.12.0)(typescript@5.3.2):
+
dependencies:
+
'@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)
+
'@typescript-eslint/parser': 8.8.1(eslint@9.12.0)(typescript@5.3.2)
+
'@typescript-eslint/utils': 8.8.1(eslint@9.12.0)(typescript@5.3.2)
+
optionalDependencies:
+
typescript: 5.3.2
+
transitivePeerDependencies:
+
- eslint
+
- supports-color
typescript@5.3.2: {}
unbox-primitive@1.0.2:
dependencies:
-
call-bind: 1.0.5
+
call-bind: 1.0.7
has-bigints: 1.0.2
has-symbols: 1.0.3
which-boxed-primitive: 1.0.2
undici-types@6.19.8: {}
-
untildify@4.0.0: {}
-
uri-js@4.4.1:
dependencies:
punycode: 2.3.1
···
is-string: 1.0.7
is-symbol: 1.0.4
-
which-builtin-type@1.1.3:
+
which-builtin-type@1.1.4:
dependencies:
function.prototype.name: 1.1.6
-
has-tostringtag: 1.0.0
+
has-tostringtag: 1.0.2
is-async-function: 2.0.0
is-date-object: 1.0.5
is-finalizationregistry: 1.0.2
···
is-weakref: 1.0.2
isarray: 2.0.5
which-boxed-primitive: 1.0.2
-
which-collection: 1.0.1
-
which-typed-array: 1.1.13
+
which-collection: 1.0.2
+
which-typed-array: 1.1.15
-
which-collection@1.0.1:
+
which-collection@1.0.2:
dependencies:
-
is-map: 2.0.2
-
is-set: 2.0.2
-
is-weakmap: 2.0.1
-
is-weakset: 2.0.2
+
is-map: 2.0.3
+
is-set: 2.0.3
+
is-weakmap: 2.0.2
+
is-weakset: 2.0.3
-
which-typed-array@1.1.13:
+
which-typed-array@1.1.15:
dependencies:
-
available-typed-arrays: 1.0.5
-
call-bind: 1.0.5
+
available-typed-arrays: 1.0.7
+
call-bind: 1.0.7
for-each: 0.3.3
gopd: 1.0.1
-
has-tostringtag: 1.0.0
+
has-tostringtag: 1.0.2
which@2.0.2:
dependencies:
isexe: 2.0.0
-
-
wrappy@1.0.2: {}
-
-
yallist@4.0.0: {}
yocto-queue@0.1.0: {}