Style up quite a few pages and format files
ci/woodpecker/push/build Pipeline was successful Details

This commit is contained in:
Melon 2022-10-31 00:55:25 +00:00
parent 99c2ae6e33
commit 60a5be894b
Signed by: melon
GPG Key ID: 6C9D970C50D26A25
16 changed files with 426 additions and 221 deletions

36
.editorconfig Normal file
View File

@ -0,0 +1,36 @@
# EditorConfig is awesome: https://EditorConfig.org
# top-most EditorConfig file
root = true
# Defaults
[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
# CSS
[*.css]
indent_size = 2
indent_style = space
trim_trailing_whitespace = true
# HTML
[*.{htm,html}]
indent_size = 2
indent_style = space
trim_trailing_whitespace = true
# GNU make
[Makefile]
indent_style = tab
# Svelte
[*.svelte]
indent_size = 2
indent_style = space
# YAML
[*.{yaml,yml}]
indent_size = 2
indent_style = space

View File

@ -6,7 +6,7 @@
"singleQuote": false,
"trailingComma": "all",
"bracketSpacing": false,
"jsxBracketSameLine": false,
"bracketSameLine": false,
"arrowParens": "avoid",
"requirePragma": false,
"insertPragma": false

View File

@ -1,6 +1,12 @@
platform: linux/amd64
pipeline:
format:
image: node
commands:
- yarn
- yarn run prettier:check:ci
build:
image: node
commands:

View File

@ -10,6 +10,8 @@
"author": "MrMelon54",
"license": "MIT",
"scripts": {
"prettier:check:ci": "./node_modules/.bin/prettier --check .",
"format": "./node_modules/.bin/prettier --write .",
"dev": "vite",
"build": "vite build",
"preview": "vite preview",
@ -18,6 +20,8 @@
"devDependencies": {
"@sveltejs/vite-plugin-svelte": "^1.0.2",
"@tsconfig/svelte": "^3.0.0",
"prettier": "^2.7.1",
"prettier-plugin-svelte": "^2.8.0",
"sass": "^1.55.0",
"svelte": "^3.49.0",
"svelte-check": "^2.8.1",

View File

@ -1,7 +1,7 @@
<script lang="ts">
import { Router, Route, Link, navigate, link } from "svelte-navigator";
import {Router, Route, Link, navigate, link} from "svelte-navigator";
import LazyComponent from "./lib/LazyComponent.svelte";
import { loginStore, type LoginStore } from "./stores/login";
import {loginStore, type LoginStore} from "./stores/login";
function logoutAction() {
loginStore.set(null);
@ -57,7 +57,8 @@
</main>
</Router>
<footer>
Powered by <a href="https://code.mrmelon54.com/melon/summer" target="_blank">Summer</a> and <a href="https://code.mrmelon54.com/melon/summer-ui" target="_blank">Summer UI</a>
Powered by <a href="https://code.mrmelon54.com/melon/summer" target="_blank" rel="noreferrer noopener nofollow">Summer</a> and
<a href="https://code.mrmelon54.com/melon/summer-ui" target="_blank" rel="noreferrer noopener nofollow">Summer UI</a>
</footer>
</div>

View File

@ -1,13 +1,26 @@
import {sendApiRequest, sendSessionRequest} from "./api";
export async function postAuthorize(response_type: string, client_id: number, scopes: string[], state: string, redirect_url: string) {
let d = {
response_type: response_type,
client_id: client_id,
scope: scopes,
state: state,
redirect_url: redirect_url,
};
let z = await sendSessionRequest("/v1/marigold/oauth/authorize", {method: "POST", body: JSON.stringify(d)});
if (z.status !== 202) throw new Error("Request failed");
return await z.json();
}
export async function getOAuthApp(id: string) {
let z = await sendSessionRequest("/v1/marigold/app/" + id, {method: "GET"});
if (z.status != 200) throw new Error("Request failed");
return await z.json();
}
export async function getOAuthScopes() {
let z = await sendApiRequest("/v1/marigold/scopes", {method: "GET"});
export async function getOAuthScopes(scope: string) {
let z = await sendApiRequest("/v1/marigold/scopes?" + new URLSearchParams({scope: scope}), {method: "GET"});
if (z.status != 200) throw new Error("Request failed");
return await z.json();
}

View File

@ -1,12 +1,12 @@
<script lang="ts">
import { createEventDispatcher } from "svelte";
import {createEventDispatcher} from "svelte";
let inputCode: string = "";
const dispatch = createEventDispatcher();
function submitLogin() {
dispatch("submit", { code: inputCode });
dispatch("submit", {code: inputCode});
}
</script>

View File

@ -1,5 +1,5 @@
<script lang="ts">
import { createEventDispatcher } from "svelte";
import {createEventDispatcher} from "svelte";
let inputEmail: string = "";
let inputPassword: string = "";
@ -7,51 +7,79 @@
const dispatch = createEventDispatcher();
function submitLogin() {
dispatch("submit", { email: inputEmail, password: inputPassword });
}
function conDone(v: boolean): string {
return v ? "follows-constraint" : "missing-constraint";
dispatch("submit", {email: inputEmail, password: inputPassword});
}
</script>
<div class="login-form-wrapper">
<form class="login-form" method="post" on:submit|preventDefault={submitLogin}>
<h1>Sign In</h1>
<div class="login-content">
<h1>Sign In</h1>
<section>
<label for="email">Email</label>
<input id="email" type="email" name="email" placeholder=" " autocomplete="username" required bind:value={inputEmail} />
</section>
<section>
<label for="email">Email</label>
<input id="email" type="email" name="email" placeholder=" " autocomplete="username" required bind:value={inputEmail} />
</section>
<section>
<label for="current-password">Password</label>
<input id="current-password" name="current-password" type="password" autocomplete="current-password" aria-describedby="password-constraints" required bind:value={inputPassword} />
<div id="password-constraints">
<ul>
<li class={conDone(inputPassword.length >= 8)}>Eight or more characters</li>
<li class={conDone(inputPassword.toLocaleLowerCase() != inputPassword)}>Uppercase characters</li>
<li class={conDone(inputPassword.toLocaleUpperCase() != inputPassword)}>Lowercase characters</li>
<li class={conDone(/\d/.test(inputPassword))}>Numeric digit</li>
<li class={conDone(/\W/.test(inputPassword))}>Special symbol</li>
</ul>
</div>
</section>
<section>
<label for="current-password">Password</label>
<input id="current-password" name="current-password" type="password" autocomplete="current-password" required bind:value={inputPassword} />
</section>
</div>
<section>
<button type="submit">Login</button>
</section>
<div class="login-action">
<section>
<button type="submit">Login</button>
</section>
</div>
</form>
</div>
<style lang="scss">
#password-constraints > ul {
> li.follows-constraint {
color: #bdd358;
}
.login-form-wrapper {
display: flex;
> li.missing-constraint {
color: #e5625e;
> .login-form {
margin: 32px auto 8px;
width: 400px;
border-radius: 32px;
-webkit-box-shadow: 0px 0px 10px 2px rgba(0, 0, 0, 0.5);
-moz-box-shadow: 0px 0px 10px 2px rgba(0, 0, 0, 0.5);
box-shadow: 0px 0px 10px 2px rgba(0, 0, 0, 0.5);
> .login-content {
background: var(--bg-panel);
border-radius: 32px 32px 0 0;
padding: 0 16px;
> h1 {
margin: 0;
padding: 32px;
line-height: normal;
text-align: center;
}
> section {
padding-bottom: 16px;
> label {
width: 80px;
display: inline-block;
}
> input {
line-height: 32px;
width: calc(400px - 130px);
height: 32px;
}
}
}
> .login-action {
background: var(--bg-panel-action);
padding: 24px;
border-radius: 0 0 32px 32px;
}
}
}
</style>

View File

@ -0,0 +1,94 @@
<script lang="ts">
import {createEventDispatcher} from "svelte";
let inputEmail: string = "";
let inputUsername: string = "";
let inputDisplayName: string = "";
let inputPassword: string = "";
let repeatPassword: string = "";
const dispatch = createEventDispatcher();
function submitLogin() {
dispatch("submit", {email: inputEmail, password: inputPassword});
}
function conDone(v: boolean): string {
return v ? "follows-constraint" : "missing-constraint";
}
</script>
<div class="register-form-wrapper">
<form class="register-form" method="post" on:submit|preventDefault={submitLogin}>
<h1>Sign In</h1>
<section>
<label for="email">Email</label>
<input id="email" type="email" name="email" placeholder=" " autocomplete="username" required bind:value={inputEmail} />
</section>
<section>
<label for="username">Username</label>
<input id="username" type="text" name="username" placeholder=" " autocomplete="off" required bind:value={inputUsername} />
</section>
<section>
<label for="display_name">Display Name</label>
<input id="display_name" type="text" name="display_name" placeholder=" " autocomplete="off" required bind:value={inputDisplayName} />
</section>
<section>
<label for="new-password">Password</label>
<input
id="new-password"
name="new-password"
type="password"
autocomplete="new-password"
aria-describedby="password-constraints"
required
bind:value={inputPassword}
/>
</section>
<section>
<label for="repeat-password">Repeat Password</label>
<input
id="repeat-password"
name="repeat-password"
type="password"
autocomplete="new-password"
aria-describedby="password-constraints"
required
bind:value={repeatPassword}
/>
</section>
<section>
<div id="password-constraints">
<ul>
<li class={conDone(inputPassword.length >= 8)}>Eight or more characters</li>
<li class={conDone(inputPassword.toLocaleLowerCase() != inputPassword)}>Uppercase characters</li>
<li class={conDone(inputPassword.toLocaleUpperCase() != inputPassword)}>Lowercase characters</li>
<li class={conDone(/\d/.test(inputPassword))}>Numeric digit</li>
<li class={conDone(/\W/.test(inputPassword))}>Special symbol</li>
</ul>
</div>
</section>
<section>
<button type="submit">Register</button>
</section>
</form>
</div>
<style lang="scss">
#password-constraints > ul {
> li.follows-constraint {
color: #bdd358;
}
> li.missing-constraint {
color: #e5625e;
}
}
</style>

View File

@ -1,5 +1,5 @@
<script lang="ts">
import { onMount } from "svelte";
import {onMount} from "svelte";
import LazyDelay from "./LazyDelay.svelte";
export let component: () => Promise<any>;
@ -7,14 +7,14 @@
let loadedComponent = null;
let props: { [index: string]: any; };
let props: {[index: string]: any};
$: {
const { component, delayMs, ...restProps } = $$props;
const {component, delayMs, ...restProps} = $$props;
props = restProps;
}
onMount(() => {
component().then((module) => {
component().then(module => {
loadedComponent = module.default;
});
});

View File

@ -1,5 +1,5 @@
<script lang="ts">
import { onMount } from "svelte";
import {onMount} from "svelte";
export let delayMs = null;

View File

@ -1,12 +1,12 @@
<script lang="ts">
import { onMount } from "svelte";
import {onMount} from "svelte";
import LoginForm from "../../components/login/LoginForm.svelte";
import { postLogin } from "../../api/login";
import {postLogin} from "../../api/login";
import EmailCodeForm from "../../components/login/EmailCodeForm.svelte";
import { loginStore } from "../../stores/login";
import { navigate, useLocation } from "svelte-navigator";
import {loginStore} from "../../stores/login";
import {navigate, useLocation} from "svelte-navigator";
type LoginFormResp = { next?: string; token?: string; access_token?: string; refresh_token?: string };
type LoginFormResp = {next?: string; token?: string; access_token?: string; refresh_token?: string};
const location = useLocation();
@ -14,7 +14,7 @@
loading = true;
let z = await a;
if (z.access_token !== undefined && z.refresh_token !== undefined) {
loginStore.set({ access: z.access_token, refresh: z.refresh_token });
loginStore.set({access: z.access_token, refresh: z.refresh_token});
step = "done";
} else {
step = z.next;
@ -29,7 +29,7 @@
loading = false;
}
async function submitLogin(e: { detail: object }) {
async function submitLogin(e: {detail: object}) {
updatePage(postLogin(e.detail, lastToken));
}

View File

@ -1,8 +1,8 @@
<script lang="ts">
import { onMount } from "svelte";
import { navigate, useLocation } from "svelte-navigator";
import { getUser } from "~/api/login";
import { getOAuthApp, getOAuthScopes } from "~/api/oauth";
import {onMount} from "svelte";
import {navigate, useLocation} from "svelte-navigator";
import {getUser} from "~/api/login";
import {getOAuthApp, getOAuthScopes, postAuthorize} from "~/api/oauth";
import LazyDelay from "~/lib/LazyDelay.svelte";
const fakeScope = [
@ -37,23 +37,43 @@
})();
onMount(async () => {
let params = new URLSearchParams($location.search);
try {
await getUser("@me");
try {
app = await getOAuthApp(params.get("client_id"));
try {
scopes = await getOAuthScopes(params.get("scope"));
} catch (err) {
navigate("/oauth/invalid-scope");
}
} catch (_) {
navigate("/oauth/invalid-app");
}
} catch (_) {
let params = new URLSearchParams();
params.set("back", window.location.pathname + window.location.search);
navigate("/login" + params.toString());
let backParams = new URLSearchParams();
backParams.set("back", window.location.pathname + window.location.search);
navigate("/login?" + backParams.toString());
}
try {
let params = new URLSearchParams($location.search);
app = await getOAuthApp(params.get("client_id"));
} catch (_) {
navigate("/oauth/invalid-app");
}
scopes = await getOAuthScopes();
});
function runAuthorize() {}
async function runAuthorize() {
try {
let z = await postAuthorize(
location_params.get("response_type"),
parseInt(location_params.get("client_id")),
location_params.get("scope").split(" "),
location_params.get("state"),
location_params.get("redirect_uri"),
);
let nextParams = new URLSearchParams();
nextParams.set("state", location_params.get("state"));
nextParams.set("code", z.code);
navigate(location_params.get("redirect_uri") + "?" + nextParams);
} catch (_) {
navigate("/oauth/failed");
}
}
function runCancel() {
let url = new URL(app_redirect);
@ -71,7 +91,11 @@
<div class="oauth-desc">{app.app_desc}</div>
<div class="oauth-scopes">
<ul>
<li>Scopes</li>
{#if scopes}
{#each scopes as scope}
<li>{scope.desc}</li>
{/each}
{/if}
<li data-fake>{fakeScope[Math.floor(Math.random() * fakeScope.length)]}</li>
</ul>
</div>

View File

@ -1,5 +1,5 @@
<script lang="ts">
import { Route, Router } from "svelte-navigator";
import {Route, Router} from "svelte-navigator";
import Authorize from "./Authorize.svelte";
</script>
@ -10,4 +10,7 @@
<Route path="invalid-app">
<p>Invalid app</p>
</Route>
<Route path="invalid-scope">
<p>Invalid scope</p>
</Route>
</Router>

View File

@ -1,9 +1,9 @@
<script lang="ts">
import { getUser } from "~/api/login";
import { onMount } from "svelte";
import { Link, navigate } from "svelte-navigator";
import {getUser} from "~/api/login";
import {onMount} from "svelte";
import {Link, navigate} from "svelte-navigator";
type ProfileData = { icon: string; display_name: string; username: string };
type ProfileData = {icon: string; display_name: string; username: string};
onMount(async () => {
try {
@ -14,7 +14,7 @@
});
let profile: ProfileData;
profile = { icon: "", display_name: "", username: "" };
profile = {icon: "", display_name: "", username: ""};
</script>
<div class="profile-layout">

288
yarn.lock
View File

@ -2,15 +2,15 @@
# yarn lockfile v1
"@esbuild/android-arm@0.15.11":
version "0.15.11"
resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.15.11.tgz#bdd9c3e098183bdca97075aa4c3e0152ed3e10ee"
integrity sha512-PzMcQLazLBkwDEkrNPi9AbjFt6+3I7HKbiYF2XtWQ7wItrHvEOeO3T8Am434zAozWtVP7lrTue1bEfc2nYWeCA==
"@esbuild/android-arm@0.15.12":
version "0.15.12"
resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.15.12.tgz#e548b10a5e55b9e10537a049ebf0bc72c453b769"
integrity sha512-IC7TqIqiyE0MmvAhWkl/8AEzpOtbhRNDo7aph47We1NbE5w2bt/Q+giAhe0YYeVpYnIhGMcuZY92qDK6dQauvA==
"@esbuild/linux-loong64@0.15.11":
version "0.15.11"
resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.15.11.tgz#2f4f9a1083dcb4fc65233b6f59003c406abf32e5"
integrity sha512-geWp637tUhNmhL3Xgy4Bj703yXB9dqiLJe05lCUfjSFDrQf9C/8pArusyPUbUbPwlC/EAUjBw32sxuIl/11dZw==
"@esbuild/linux-loong64@0.15.12":
version "0.15.12"
resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.15.12.tgz#475b33a2631a3d8ca8aa95ee127f9a61d95bf9c1"
integrity sha512-tZEowDjvU7O7I04GYvWQOS4yyP9E/7YlsB0jjw1Ycukgr2ycEzKyIk5tms5WnLBymaewc6VmRKnn5IJWgK4eFw==
"@jridgewell/resolve-uri@3.1.0":
version "3.1.0"
@ -51,24 +51,15 @@
"@nodelib/fs.scandir" "2.1.5"
fastq "^1.6.0"
"@rollup/pluginutils@^4.2.1":
version "4.2.1"
resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-4.2.1.tgz#e6c6c3aba0744edce3fb2074922d3776c0af2a6d"
integrity sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==
dependencies:
estree-walker "^2.0.1"
picomatch "^2.2.2"
"@sveltejs/vite-plugin-svelte@^1.0.2":
version "1.0.9"
resolved "https://registry.yarnpkg.com/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-1.0.9.tgz#b19bde0ba1929a06205888e94475595e3ac0c258"
integrity sha512-+SDrAnT7TDi8sdj4OfD2SC4s9DNrpNVBrue8fT2PmKks9Ddu0JIfSeX91wXZb/1xHz4EkGb+rli8GTRI0yGOjg==
version "1.1.0"
resolved "https://registry.yarnpkg.com/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-1.1.0.tgz#691ec35c7a96f5dd724f52e2eafff50a0debae05"
integrity sha512-cFRfEdztubtj1c/rYh7ArK7XCfFJn6wG6+J8/e9amFsKtEJILovoBrK0/mxt1AjPQg0vaX+fHPKvhx+q8mTPaQ==
dependencies:
"@rollup/pluginutils" "^4.2.1"
debug "^4.3.4"
deepmerge "^4.2.2"
kleur "^4.1.5"
magic-string "^0.26.5"
magic-string "^0.26.7"
svelte-hmr "^0.15.0"
"@tsconfig/svelte@^3.0.0":
@ -77,9 +68,9 @@
integrity sha512-pYrtLtOwku/7r1i9AMONsJMVYAtk3hzOfiGNekhtq5tYBGA7unMve8RvUclKLMT3PrihvJqUmzsRGh0RP84hKg==
"@types/node@*":
version "18.11.2"
resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.2.tgz#c59b7641832531264fda3f1ba610362dc9a7dfc8"
integrity sha512-BWN3M23gLO2jVG8g/XHIRFWiiV4/GckeFIqbU/C4V3xpoBBWSMk4OZomouN0wCkfQFPqgZikyLr7DOYDysIkkw==
version "18.11.7"
resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.7.tgz#8ccef136f240770c1379d50100796a6952f01f94"
integrity sha512-LhFTglglr63mNXUSRYD8A+ZAIu5sFqNJ4Y2fPuY7UlrySJH87rRRlhtVmMHplmfk5WkoJGmDjE9oiTfyX94CpQ==
"@types/pug@^2.0.4":
version "2.0.6"
@ -183,138 +174,133 @@ es6-promise@^3.1.2:
resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613"
integrity sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==
esbuild-android-64@0.15.11:
version "0.15.11"
resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.15.11.tgz#50402129c3e85bb06434e212374c5f693e4c5f01"
integrity sha512-rrwoXEiuI1kaw4k475NJpexs8GfJqQUKcD08VR8sKHmuW9RUuTR2VxcupVvHdiGh9ihxL9m3lpqB1kju92Ialw==
esbuild-android-64@0.15.12:
version "0.15.12"
resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.15.12.tgz#5e8151d5f0a748c71a7fbea8cee844ccf008e6fc"
integrity sha512-MJKXwvPY9g0rGps0+U65HlTsM1wUs9lbjt5CU19RESqycGFDRijMDQsh68MtbzkqWSRdEtiKS1mtPzKneaAI0Q==
esbuild-android-arm64@0.15.11:
version "0.15.11"
resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.15.11.tgz#49bee35218ea2ccf1a0c5f187af77c1c0a5dee71"
integrity sha512-/hDubOg7BHOhUUsT8KUIU7GfZm5bihqssvqK5PfO4apag7YuObZRZSzViyEKcFn2tPeHx7RKbSBXvAopSHDZJQ==
esbuild-android-arm64@0.15.12:
version "0.15.12"
resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.15.12.tgz#5ee72a6baa444bc96ffcb472a3ba4aba2cc80666"
integrity sha512-Hc9SEcZbIMhhLcvhr1DH+lrrec9SFTiRzfJ7EGSBZiiw994gfkVV6vG0sLWqQQ6DD7V4+OggB+Hn0IRUdDUqvA==
esbuild-darwin-64@0.15.11:
version "0.15.11"
resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.15.11.tgz#89a90c8cf6f0029ac4169bfedd012a0412c1575f"
integrity sha512-1DqHD0ms3AhiwkKnjRUzmiW7JnaJJr5FKrPiR7xuyMwnjDqvNWDdMq4rKSD9OC0piFNK6n0LghsglNMe2MwJtA==
esbuild-darwin-64@0.15.12:
version "0.15.12"
resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.15.12.tgz#70047007e093fa1b3ba7ef86f9b3fa63db51fe25"
integrity sha512-qkmqrTVYPFiePt5qFjP8w/S+GIUMbt6k8qmiPraECUWfPptaPJUGkCKrWEfYFRWB7bY23FV95rhvPyh/KARP8Q==
esbuild-darwin-arm64@0.15.11:
version "0.15.11"
resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.11.tgz#556f4385c6de806cc81132dd7b8af00fe9d292df"
integrity sha512-OMzhxSbS0lwwrW40HHjRCeVIJTURdXFA8c3GU30MlHKuPCcvWNUIKVucVBtNpJySXmbkQMDJdJNrXzNDyvoqvQ==
esbuild-darwin-arm64@0.15.12:
version "0.15.12"
resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.12.tgz#41c951f23d9a70539bcca552bae6e5196696ae04"
integrity sha512-z4zPX02tQ41kcXMyN3c/GfZpIjKoI/BzHrdKUwhC/Ki5BAhWv59A9M8H+iqaRbwpzYrYidTybBwiZAIWCLJAkw==
esbuild-freebsd-64@0.15.11:
version "0.15.11"
resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.11.tgz#fd86fd1b3b65366048f35b996d9cdf3547384eee"
integrity sha512-8dKP26r0/Qyez8nTCwpq60QbuYKOeBygdgOAWGCRalunyeqWRoSZj9TQjPDnTTI9joxd3QYw3UhVZTKxO9QdRg==
esbuild-freebsd-64@0.15.12:
version "0.15.12"
resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.12.tgz#a761b5afd12bbedb7d56c612e9cfa4d2711f33f0"
integrity sha512-XFL7gKMCKXLDiAiBjhLG0XECliXaRLTZh6hsyzqUqPUf/PY4C6EJDTKIeqqPKXaVJ8+fzNek88285krSz1QECw==
esbuild-freebsd-arm64@0.15.11:
version "0.15.11"
resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.11.tgz#d346bcacfe9779ebc1a11edac1bdedeff6dda3b1"
integrity sha512-aSGiODiukLGGnSg/O9+cGO2QxEacrdCtCawehkWYTt5VX1ni2b9KoxpHCT9h9Y6wGqNHmXFnB47RRJ8BIqZgmQ==
esbuild-freebsd-arm64@0.15.12:
version "0.15.12"
resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.12.tgz#6b0839d4d58deabc6cbd96276eb8cbf94f7f335e"
integrity sha512-jwEIu5UCUk6TjiG1X+KQnCGISI+ILnXzIzt9yDVrhjug2fkYzlLbl0K43q96Q3KB66v6N1UFF0r5Ks4Xo7i72g==
esbuild-linux-32@0.15.11:
version "0.15.11"
resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.15.11.tgz#64b50e774bf75af7dcc6a73ad509f2eb0ac4487b"
integrity sha512-lsrAfdyJBGx+6aHIQmgqUonEzKYeBnyfJPkT6N2dOf1RoXYYV1BkWB6G02tjsrz1d5wZzaTc3cF+TKmuTo/ZwA==
esbuild-linux-32@0.15.12:
version "0.15.12"
resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.15.12.tgz#bd50bfe22514d434d97d5150977496e2631345b4"
integrity sha512-uSQuSEyF1kVzGzuIr4XM+v7TPKxHjBnLcwv2yPyCz8riV8VUCnO/C4BF3w5dHiVpCd5Z1cebBtZJNlC4anWpwA==
esbuild-linux-64@0.15.11:
version "0.15.11"
resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.15.11.tgz#fba3a78b95769772863f8f6dc316abca55cf8416"
integrity sha512-Y2Rh+PcyVhQqXKBTacPCltINN3uIw2xC+dsvLANJ1SpK5NJUtxv8+rqWpjmBgaNWKQT1/uGpMmA9olALy9PLVA==
esbuild-linux-64@0.15.12:
version "0.15.12"
resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.15.12.tgz#074bb2b194bf658245f8490f29c01ffcdfa8c931"
integrity sha512-QcgCKb7zfJxqT9o5z9ZUeGH1k8N6iX1Y7VNsEi5F9+HzN1OIx7ESxtQXDN9jbeUSPiRH1n9cw6gFT3H4qbdvcA==
esbuild-linux-arm64@0.15.11:
version "0.15.11"
resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.11.tgz#c0cb31980eee066bfd39a4593660a0ecebe926cb"
integrity sha512-uhcXiTwTmD4OpxJu3xC5TzAAw6Wzf9O1XGWL448EE9bqGjgV1j+oK3lIHAfsHnuIn8K4nDW8yjX0Sv5S++oRuw==
esbuild-linux-arm64@0.15.12:
version "0.15.12"
resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.12.tgz#3bf789c4396dc032875a122988efd6f3733f28f5"
integrity sha512-HtNq5xm8fUpZKwWKS2/YGwSfTF+339L4aIA8yphNKYJckd5hVdhfdl6GM2P3HwLSCORS++++7++//ApEwXEuAQ==
esbuild-linux-arm@0.15.11:
version "0.15.11"
resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.15.11.tgz#7824d20099977aa671016c7de7a5038c9870010f"
integrity sha512-TJllTVk5aSyqPFvvcHTvf6Wu1ZKhWpJ/qNmZO8LL/XeB+LXCclm7HQHNEIz6MT7IX8PmlC1BZYrOiw2sXSB95A==
esbuild-linux-arm@0.15.12:
version "0.15.12"
resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.15.12.tgz#b91b5a8d470053f6c2c9c8a5e67ec10a71fe4a67"
integrity sha512-Wf7T0aNylGcLu7hBnzMvsTfEXdEdJY/hY3u36Vla21aY66xR0MS5I1Hw8nVquXjTN0A6fk/vnr32tkC/C2lb0A==
esbuild-linux-mips64le@0.15.11:
version "0.15.11"
resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.11.tgz#10627331c90164e553429ed25e025184bba485b6"
integrity sha512-WD61y/R1M4BLe4gxXRypoQ0Ci+Vjf714QYzcPNkiYv5I8K8WDz2ZR8Bm6cqKxd6rD+e/rZgPDbhQ9PCf7TMHmA==
esbuild-linux-mips64le@0.15.12:
version "0.15.12"
resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.12.tgz#2fb54099ada3c950a7536dfcba46172c61e580e2"
integrity sha512-Qol3+AvivngUZkTVFgLpb0H6DT+N5/zM3V1YgTkryPYFeUvuT5JFNDR3ZiS6LxhyF8EE+fiNtzwlPqMDqVcc6A==
esbuild-linux-ppc64le@0.15.11:
version "0.15.11"
resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.11.tgz#be42679a36a5246b893fc8b898135ebacb5a0a14"
integrity sha512-JVleZS9oPVLTlBhPTWgOwxFWU/wMUdlBwTbGA4GF8c38sLbS13cupj+C8bLq929jU7EMWry4SaL+tKGIaTlqKg==
esbuild-linux-ppc64le@0.15.12:
version "0.15.12"
resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.12.tgz#9e3b8c09825fb27886249dfb3142a750df29a1b7"
integrity sha512-4D8qUCo+CFKaR0cGXtGyVsOI7w7k93Qxb3KFXWr75An0DHamYzq8lt7TNZKoOq/Gh8c40/aKaxvcZnTgQ0TJNg==
esbuild-linux-riscv64@0.15.11:
version "0.15.11"
resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.11.tgz#3ac2f328e3db73cbff833ada94314d8e79503e54"
integrity sha512-9aLIalZ2HFHIOZpmVU11sEAS9F8TnHw49daEjcgMpBXHFF57VuT9f9/9LKJhw781Gda0P9jDkuCWJ0tFbErvJw==
esbuild-linux-riscv64@0.15.12:
version "0.15.12"
resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.12.tgz#923d0f5b6e12ee0d1fe116b08e4ae4478fe40693"
integrity sha512-G9w6NcuuCI6TUUxe6ka0enjZHDnSVK8bO+1qDhMOCtl7Tr78CcZilJj8SGLN00zO5iIlwNRZKHjdMpfFgNn1VA==
esbuild-linux-s390x@0.15.11:
version "0.15.11"
resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.11.tgz#e774e0df061b6847d86783bf3c8c4300a72e03ad"
integrity sha512-sZHtiXXOKsLI3XGBGoYO4qKBzJlb8xNsWmvFiwFMHFzA4AXgDP1KDp7Dawe9C2pavTRBDvl+Ok4n/DHQ59oaTg==
esbuild-linux-s390x@0.15.12:
version "0.15.12"
resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.12.tgz#3b1620220482b96266a0c6d9d471d451a1eab86f"
integrity sha512-Lt6BDnuXbXeqSlVuuUM5z18GkJAZf3ERskGZbAWjrQoi9xbEIsj/hEzVnSAFLtkfLuy2DE4RwTcX02tZFunXww==
esbuild-netbsd-64@0.15.11:
version "0.15.11"
resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.11.tgz#55e265fa4489e3f396b16c81f6f5a11d6ca2a9a4"
integrity sha512-hUC9yN06K9sg7ju4Vgu9ChAPdsEgtcrcLfyNT5IKwKyfpLvKUwCMZSdF+gRD3WpyZelgTQfJ+pDx5XFbXTlB0A==
esbuild-netbsd-64@0.15.12:
version "0.15.12"
resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.12.tgz#276730f80da646859b1af5a740e7802d8cd73e42"
integrity sha512-jlUxCiHO1dsqoURZDQts+HK100o0hXfi4t54MNRMCAqKGAV33JCVvMplLAa2FwviSojT/5ZG5HUfG3gstwAG8w==
esbuild-openbsd-64@0.15.11:
version "0.15.11"
resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.11.tgz#bc04103ccfd8c2f2241e1add0b51a095955b73c4"
integrity sha512-0bBo9SQR4t66Wd91LGMAqmWorzO0TTzVjYiifwoFtel8luFeXuPThQnEm5ztN4g0fnvcp7AnUPPzS/Depf17wQ==
esbuild-openbsd-64@0.15.12:
version "0.15.12"
resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.12.tgz#bd0eea1dd2ca0722ed489d88c26714034429f8ae"
integrity sha512-1o1uAfRTMIWNOmpf8v7iudND0L6zRBYSH45sofCZywrcf7NcZA+c7aFsS1YryU+yN7aRppTqdUK1PgbZVaB1Dw==
esbuild-sunos-64@0.15.11:
version "0.15.11"
resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.15.11.tgz#ccd580305d31fde07b5c386da79c942aaf069013"
integrity sha512-EuBdTGlsMTjEl1sQnBX2jfygy7iR6CKfvOzi+gEOfhDqbHXsmY1dcpbVtcwHAg9/2yUZSfMJHMAgf1z8M4yyyw==
esbuild-sunos-64@0.15.12:
version "0.15.12"
resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.15.12.tgz#5e56bf9eef3b2d92360d6d29dcde7722acbecc9e"
integrity sha512-nkl251DpoWoBO9Eq9aFdoIt2yYmp4I3kvQjba3jFKlMXuqQ9A4q+JaqdkCouG3DHgAGnzshzaGu6xofGcXyPXg==
esbuild-windows-32@0.15.11:
version "0.15.11"
resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.15.11.tgz#40fe1d48f9b20a76f6db5109aaaf1511aed58c71"
integrity sha512-O0/Wo1Wk6dc0rZSxkvGpmTNIycEznHmkObTFz2VHBhjPsO4ZpCgfGxNkCpz4AdAIeMczpTXt/8d5vdJNKEGC+Q==
esbuild-windows-32@0.15.12:
version "0.15.12"
resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.15.12.tgz#a4f1a301c1a2fa7701fcd4b91ef9d2620cf293d0"
integrity sha512-WlGeBZHgPC00O08luIp5B2SP4cNCp/PcS+3Pcg31kdcJPopHxLkdCXtadLU9J82LCfw4TVls21A6lilQ9mzHrw==
esbuild-windows-64@0.15.11:
version "0.15.11"
resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.15.11.tgz#80c58b1ef2ff030c78e3a06e7a922776cc4cb687"
integrity sha512-x977Q4HhNjnHx00b4XLAnTtj5vfbdEvkxaQwC1Zh5AN8g5EX+izgZ6e5QgqJgpzyRNJqh4hkgIJF1pyy1be0mQ==
esbuild-windows-64@0.15.12:
version "0.15.12"
resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.15.12.tgz#bc2b467541744d653be4fe64eaa9b0dbbf8e07f6"
integrity sha512-VActO3WnWZSN//xjSfbiGOSyC+wkZtI8I4KlgrTo5oHJM6z3MZZBCuFaZHd8hzf/W9KPhF0lY8OqlmWC9HO5AA==
esbuild-windows-arm64@0.15.11:
version "0.15.11"
resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.11.tgz#018624023b5c3f0cca334cc99f5ef7134d396333"
integrity sha512-VwUHFACuBahrvntdcMKZteUZ9HaYrBRODoKe4tIWxguQRvvYoYb7iu5LrcRS/FQx8KPZNaa72zuqwVtHeXsITw==
esbuild-windows-arm64@0.15.12:
version "0.15.12"
resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.12.tgz#9a7266404334a86be800957eaee9aef94c3df328"
integrity sha512-Of3MIacva1OK/m4zCNIvBfz8VVROBmQT+gRX6pFTLPngFYcj6TFH/12VveAqq1k9VB2l28EoVMNMUCcmsfwyuA==
esbuild@^0.15.9:
version "0.15.11"
resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.15.11.tgz#524d48612a9aa7edc1753c83459cb6fcae0cb66e"
integrity sha512-OgHGuhlfZ//mToxjte1D5iiiQgWfJ2GByVMwEC/IuoXsBGkuyK1+KrjYu0laSpnN/L1UmLUCv0s25vObdc1bVg==
version "0.15.12"
resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.15.12.tgz#6c8e22d6d3b7430d165c33848298d3fc9a1f251c"
integrity sha512-PcT+/wyDqJQsRVhaE9uX/Oq4XLrFh0ce/bs2TJh4CSaw9xuvI+xFrH2nAYOADbhQjUgAhNWC5LKoUsakm4dxng==
optionalDependencies:
"@esbuild/android-arm" "0.15.11"
"@esbuild/linux-loong64" "0.15.11"
esbuild-android-64 "0.15.11"
esbuild-android-arm64 "0.15.11"
esbuild-darwin-64 "0.15.11"
esbuild-darwin-arm64 "0.15.11"
esbuild-freebsd-64 "0.15.11"
esbuild-freebsd-arm64 "0.15.11"
esbuild-linux-32 "0.15.11"
esbuild-linux-64 "0.15.11"
esbuild-linux-arm "0.15.11"
esbuild-linux-arm64 "0.15.11"
esbuild-linux-mips64le "0.15.11"
esbuild-linux-ppc64le "0.15.11"
esbuild-linux-riscv64 "0.15.11"
esbuild-linux-s390x "0.15.11"
esbuild-netbsd-64 "0.15.11"
esbuild-openbsd-64 "0.15.11"
esbuild-sunos-64 "0.15.11"
esbuild-windows-32 "0.15.11"
esbuild-windows-64 "0.15.11"
esbuild-windows-arm64 "0.15.11"
estree-walker@^2.0.1:
version "2.0.2"
resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac"
integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==
"@esbuild/android-arm" "0.15.12"
"@esbuild/linux-loong64" "0.15.12"
esbuild-android-64 "0.15.12"
esbuild-android-arm64 "0.15.12"
esbuild-darwin-64 "0.15.12"
esbuild-darwin-arm64 "0.15.12"
esbuild-freebsd-64 "0.15.12"
esbuild-freebsd-arm64 "0.15.12"
esbuild-linux-32 "0.15.12"
esbuild-linux-64 "0.15.12"
esbuild-linux-arm "0.15.12"
esbuild-linux-arm64 "0.15.12"
esbuild-linux-mips64le "0.15.12"
esbuild-linux-ppc64le "0.15.12"
esbuild-linux-riscv64 "0.15.12"
esbuild-linux-s390x "0.15.12"
esbuild-netbsd-64 "0.15.12"
esbuild-openbsd-64 "0.15.12"
esbuild-sunos-64 "0.15.12"
esbuild-windows-32 "0.15.12"
esbuild-windows-64 "0.15.12"
esbuild-windows-arm64 "0.15.12"
fast-glob@^3.2.7:
version "3.2.12"
@ -463,7 +449,7 @@ magic-string@^0.25.7:
dependencies:
sourcemap-codec "^1.4.8"
magic-string@^0.26.5:
magic-string@^0.26.7:
version "0.26.7"
resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.26.7.tgz#caf7daf61b34e9982f8228c4527474dac8981d6f"
integrity sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==
@ -572,12 +558,12 @@ picocolors@^1.0.0:
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.3.1:
picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1:
version "2.3.1"
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
postcss@^8.4.16:
postcss@^8.4.18:
version "8.4.18"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.18.tgz#6d50046ea7d3d66a85e0e782074e7203bc7fbca2"
integrity sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==
@ -586,6 +572,16 @@ postcss@^8.4.16:
picocolors "^1.0.0"
source-map-js "^1.0.2"
prettier-plugin-svelte@^2.8.0:
version "2.8.0"
resolved "https://registry.yarnpkg.com/prettier-plugin-svelte/-/prettier-plugin-svelte-2.8.0.tgz#e5681d9867c4ab584c0ccbe43c3684d132b389f2"
integrity sha512-QlXv/U3bUszks3XYDPsk1fsaQC+fo2lshwKbcbO+lrSVdJ+40mB1BfL8OCAk1W9y4pJxpqO/4gqm6NtF3zNGCw==
prettier@^2.7.1:
version "2.7.1"
resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64"
integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==
queue-microtask@^1.2.2:
version "1.2.3"
resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
@ -624,10 +620,10 @@ rimraf@^2.5.2:
dependencies:
glob "^7.1.3"
rollup@~2.78.0:
version "2.78.1"
resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.78.1.tgz#52fe3934d9c83cb4f7c4cb5fb75d88591be8648f"
integrity sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg==
rollup@^2.79.1:
version "2.79.1"
resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.79.1.tgz#bedee8faef7c9f93a2647ac0108748f497f081c7"
integrity sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==
optionalDependencies:
fsevents "~2.3.2"
@ -765,14 +761,14 @@ typescript@*, typescript@^4.6.4:
integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==
vite@^3.1.0:
version "3.1.8"
resolved "https://registry.yarnpkg.com/vite/-/vite-3.1.8.tgz#fa29144167d19b773baffd65b3972ea4c12359c9"
integrity sha512-m7jJe3nufUbuOfotkntGFupinL/fmuTNuQmiVE7cH2IZMuf4UbfbGYMUT3jVWgGYuRVLY9j8NnrRqgw5rr5QTg==
version "3.2.1"
resolved "https://registry.yarnpkg.com/vite/-/vite-3.2.1.tgz#dc1f54568300a7acdd89c8611e2719c21f1334f4"
integrity sha512-ADtMkfHuWq4tskJsri2n2FZkORO8ZyhI+zIz7zTrDAgDEtct1jdxOg3YsZBfHhKjmMoWLOSCr+64qrEDGo/DbQ==
dependencies:
esbuild "^0.15.9"
postcss "^8.4.16"
postcss "^8.4.18"
resolve "^1.22.1"
rollup "~2.78.0"
rollup "^2.79.1"
optionalDependencies:
fsevents "~2.3.2"