Dev launchpad

This commit is contained in:
Konstantin Wohlwend 2024-12-18 11:37:12 -08:00
parent fcf92e04e3
commit ae2c8f561d
6 changed files with 554 additions and 40 deletions

View File

@ -137,7 +137,7 @@ pnpm run dev
pnpm run test
```
You can now open the dashboard at [http://localhost:8101](http://localhost:8101), API on port 8102, demo on port 8103, docs on port 8104, Inbucket (e-mails) on port 8105, and Prisma Studio on port 8106. See the section below on more information on the ports of the running services.
You can now open the dev launchpad at [http://localhost:8100](http://localhost:8100). From there, you can navigate to the dashboard at [http://localhost:8101](http://localhost:8101), API on port 8102, demo on port 8103, docs on port 8104, Inbucket (e-mails) on port 8105, and Prisma Studio on port 8106. See the dev launchpad for a list of all running services.
Your IDE may show an error on all `@stackframe/XYZ` imports. To fix this, simply restart the TypeScript language server; for example, in VSCode you can open the command palette (Ctrl+Shift+P) and run `Developer: Reload Window` or `TypeScript: Restart TS server`.
@ -147,25 +147,6 @@ You can also open Prisma Studio to see the database interface and edit data dire
pnpm run prisma studio
```
### Development environment port mapping
`8101`: Dashboard `apps/dashboard` (equivalent to https://app.stack-auth.com)
`8102`: Backend `apps/backend` (equivalent to https://api.stack-auth.com)
`8103`: Demo app `examples/demo` (equivalent to https://demo.stack-auth.com)
`8104`: Docs `docs` (equivalent to https://docs.stack-auth.com)
`8105`: Inbucket (e-mails)
`8106`: Prisma Studio
`8107`: Jaeger UI/OpenTelemetry (for performance tracing)
`8108`: `examples/docs-examples`
`8109`: `examples/partial-prerendering`
`8110`: `examples/cjs-test`
`8111`: `examples/e-commerce`
`8112`: `examples/middleware`
`8113`: Svix server (for webhooks)
`8114`: OAuth mock server
`8115`: `examples/supabase`
`8116`: PgHero (for database monitoring)
### Database migrations

View File

@ -1,9 +1,8 @@
"use client";
import { runAsynchronously } from "@stackframe/stack-shared/dist/utils/promises";
import { useEffect, useState, version } from "react";
import { runAsynchronously, wait } from "@stackframe/stack-shared/dist/utils/promises";
import { useEffect, useState } from "react";
import packageJson from "../../package.json";
import { wait } from "@stackframe/stack-shared/dist/utils/promises";
/**
* A version checking component for self-hosters which displays a banner if the server is out of date.
@ -46,7 +45,7 @@ export function VersionAlerter({ severeOnly }: { severeOnly: boolean }) {
setVersionCheckResult(data.upToDate ? null : data);
} catch (e) {
// wait a little bit because the error may have been caused by a page reload
await wait(2000);
await wait(5000);
if (cancelled) return;
console.error("Error checking version", e);
setVersionCheckResult({ severe: true, error: `Error checking version, please make sure you're connected to the internet. See the console for more details. \n${e}` });

View File

@ -0,0 +1,12 @@
{
"name": "@stackframe/oauth-mock-server",
"version": "2.6.37",
"private": true,
"main": "index.js",
"scripts": {
"dev": "serve -p 8100 -s public"
},
"dependencies": {
"serve": "^14.2.4"
}
}

View File

@ -0,0 +1,276 @@
<!DOCTYPE html>
<html>
<head>
<title>Stackframe Dev Launchpad</title>
<style>
body {
font-family: Arial, sans-serif;
background-color: #e0f0e0;
padding-left: 16px;
padding-right: 16px;
}
.apps-container {
display: flex;
flex-direction: row;
flex-wrap: wrap;
gap: 16px;
}
.apps-container > a {
border: 1px solid #8888;
background-color: #fff;
padding: 0px 4px 8px 4px;
width: 120px;
text-decoration: none;
display: flex;
flex-direction: column;
align-items: center;
gap: 12px;
position: relative;
}
.apps-container > a.important {
background-color: #fee;
}
.apps-container > a.unimportant {
opacity: 0.2;
}
.apps-container > a.unimportant:hover {
opacity: 0.5;
}
.apps-container > a:hover {
border-color: #888;
transition: opacity 0.1s ease-in-out;
}
.apps-container > a > div > img {
height: 68px;
}
.apps-container > a > .description {
text-align: center;
font-size: 12px;
color: #888;
}
.apps-container > a > .port {
padding-right: 0.5px;
padding-top: 1px;
align-self: flex-end;
font-size: 12px;
color: #888;
}
.apps-container > a > .hover-description {
display: none;
position: absolute;
top: 100%;
left: -1px;
pointer-events: none;
z-index: 1000;
white-space: pre;
background-color: #ffc;
border: 1px solid #888;
padding: 2px;
color: #0008;
font-size: 12px;
}
.apps-container > a:hover > .hover-description {
display: block;
}
</style>
</head>
<body>
<h1>Stackframe Dev Launchpad</h1>
<div class="apps-container"></div>
<hr />
<div class="apps-container"></div>
<hr />
<div class="apps-container"></div>
<h2 style="margin-top: 64px;">Background services</h2>
<ul>
<li>
5432: PostgreSQL
</li>
<li>
2500: Inbucket SMTP
</li>
<li>
1100: Inbucket HTTP
</li>
<li>
4318: OTel collector
</li>
</ul>
<noscript>
This page requires JavaScript.
</noscript>
<script>
const apps = [
{
name: "Dashboard",
port: 8101,
description: [
"Src: ./apps/dashboard",
"Prod: https://app.stack-auth.com",
],
img: "https://www.svgrepo.com/show/507260/dashboard.svg",
importance: 2,
},
{
name: "Backend",
port: 8102,
description: [
"Src: ./apps/backend",
"Prod: https://api.stack-auth.com",
],
img: "https://www.svgrepo.com/show/340122/datastore.svg",
importance: 2,
},
{
name: "Demo app",
port: 8103,
description: [
"Src: ./examples/demo",
"Prod: https://demo.stack-auth.com",
],
importance: 2,
},
{
name: "Docs",
port: 8104,
description: [
"Src: ./docs",
"Prod: https://docs.stack-auth.com",
],
img: "https://www.svgrepo.com/show/448400/docs.svg",
importance: 2,
},
{
name: "Inbucket",
port: 8105,
img: "https://www.svgrepo.com/show/533176/at-sign.svg",
importance: 1,
description: [
"Email mock",
],
},
{
name: "Prisma Studio",
port: 8106,
importance: 1,
img: "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS95TdAw63YPAPcUpvRl4imIf-VJ1sGHnEvbw&s",
description: [
"Database interface",
],
},
{
name: "Jaeger UI (OTel)",
port: 8107,
description: [
"Performance & tracing",
],
importance: 1,
img: "https://www.jaegertracing.io/img/jaeger-icon-reverse-color.svg",
},
{
name: "examples/docs-examples",
port: 8108,
description: [
"Src: ./examples/docs-examples",
],
},
{
name: "examples/partial-prerendering",
port: 8109,
description: [
"Src: ./examples/partial-prerendering",
],
},
{
name: "examples/cjs-test",
port: 8110,
description: [
"Src: ./examples/cjs-test",
],
},
{
name: "examples/e-commerce",
port: 8111,
description: [
"Src: ./examples/e-commerce",
],
},
{
name: "examples/middleware",
port: 8112,
description: [
"Src: ./examples/middleware",
],
},
{
name: "Svix server",
port: 8113,
importance: 1,
img: "https://yt3.googleusercontent.com/H3gTWq_CsJiRsDcscTFlqDBzZSL5_LcO7HkILLT7G701SL-XUZPYEDIjPu5cExrdP4YO0Lkt=s900-c-k-c0x00ffffff-no-rj",
description: [
"Webhooks",
],
},
{
name: "OAuth mock server",
port: 8114,
description: [
"Src: ./apps/oauth-mock-server",
],
},
{
name: "examples/supabase",
port: 8115,
description: [
"Src: ./examples/supabase",
],
},
{
name: "PgHero",
port: 8116,
description: [
"For database monitoring",
],
importance: 1,
img: "https://pghero.dokkuapp.com/assets/pghero-88a0d052.png",
},
];
const appsContainers = document.querySelectorAll(".apps-container");
for (let i = 0; i < appsContainers.length; i++) {
const appContainer = appsContainers[i];
const importance = appsContainers.length - i - 1;
for (const app of apps) {
if ((app.importance ?? 0) === importance) {
// TODO escape HTML
appContainer.innerHTML += `
<a href="http://localhost:${app.port}" target="_blank" rel="noopener noreferrer" class="${app.importance === 2 ? "important" : app.importance === 1 ? "" : "unimportant"}">
<div class="port">:${app.port}</div>
<div>
<img src=${app.img || `//localhost:${app.port}/favicon.ico`} />
</div>
<span class="description">${app.name}</span>
${app.description ? `<div class="hover-description">${app.description.join("\n")}</div>` : ""}
</a>
`;
}
}
}
</script>
</body>
</html>

View File

@ -1,17 +1,15 @@
{
"name": "@stackframe/oauth-mock-server",
"name": "@stackframe/dev-launchpad",
"version": "2.6.37",
"private": true,
"main": "index.js",
"scripts": {
"start": "tsx src/index.ts",
"start": "serve",
"dev": "tsx watch --clear-screen=false src/index.ts",
"typecheck": "tsc --noEmit"
"typecheck": "tsc --noEmit",
"lint": "eslint ."
},
"dependencies": {
"@types/oidc-provider": "^8.5.1",
"@stackframe/stack-shared": "workspace:*",
"oidc-provider": "^8.5.1"
"serve": "^14.2.4"
},
"devDependencies": {
"tsx": "^4.16.2"

View File

@ -420,6 +420,12 @@ importers:
specifier: ^4.7.2
version: 4.15.5
apps/dev-launchpad:
dependencies:
serve:
specifier: ^14.2.4
version: 14.2.4
apps/e2e:
dependencies:
'@stackframe/stack-shared':
@ -437,15 +443,9 @@ importers:
apps/oauth-mock-server:
dependencies:
'@stackframe/stack-shared':
specifier: workspace:*
version: link:../../packages/stack-shared
'@types/oidc-provider':
specifier: ^8.5.1
version: 8.5.1
oidc-provider:
specifier: ^8.5.1
version: 8.5.1
serve:
specifier: ^14.2.4
version: 14.2.4
devDependencies:
tsx:
specifier: ^4.16.2
@ -5662,6 +5662,9 @@ packages:
'@xtuc/long@4.2.2':
resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==}
'@zeit/schemas@2.36.0':
resolution: {integrity: sha512-7kjMwcChYEzMKjeex9ZFXkt1AyNov9R5HZtjBKVsmVpw7pa7ZtlCGvCBC2vnnXctaYN+aRI61HjIqeetZW5ROg==}
abbrev@1.1.1:
resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==}
@ -5713,6 +5716,12 @@ packages:
ajv@6.12.6:
resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
ajv@8.12.0:
resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==}
ansi-align@3.0.1:
resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==}
ansi-colors@4.1.3:
resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==}
engines: {node: '>=6'}
@ -5767,6 +5776,9 @@ packages:
aproba@2.0.0:
resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==}
arch@2.2.0:
resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==}
are-we-there-yet@2.0.0:
resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==}
engines: {node: '>=10'}
@ -5979,6 +5991,10 @@ packages:
boolbase@1.0.0:
resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
boxen@7.0.0:
resolution: {integrity: sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg==}
engines: {node: '>=14.16'}
brace-expansion@1.1.11:
resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
@ -6061,6 +6077,10 @@ packages:
resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==}
engines: {node: '>=10.16.0'}
bytes@3.0.0:
resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==}
engines: {node: '>= 0.8'}
bytes@3.1.2:
resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==}
engines: {node: '>= 0.8'}
@ -6101,6 +6121,10 @@ packages:
resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==}
engines: {node: '>=6'}
camelcase@7.0.1:
resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==}
engines: {node: '>=14.16'}
caniuse-lite@1.0.30001634:
resolution: {integrity: sha512-fbBYXQ9q3+yp1q1gBk86tOFs4pyn/yxFm5ZNP18OXJDfA3txImOY9PhfxVggZ4vRHDqoU8NrKU81eN0OtzOgRA==}
@ -6120,6 +6144,10 @@ packages:
resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==}
engines: {node: '>=4'}
chalk-template@0.4.0:
resolution: {integrity: sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==}
engines: {node: '>=12'}
chalk@1.1.3:
resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==}
engines: {node: '>=0.10.0'}
@ -6136,6 +6164,10 @@ packages:
resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
engines: {node: '>=10'}
chalk@5.0.1:
resolution: {integrity: sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==}
engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
chalk@5.3.0:
resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==}
engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
@ -6203,6 +6235,10 @@ packages:
class-variance-authority@0.7.0:
resolution: {integrity: sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==}
cli-boxes@3.0.0:
resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==}
engines: {node: '>=10'}
cli-cursor@3.1.0:
resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==}
engines: {node: '>=8'}
@ -6222,6 +6258,10 @@ packages:
client-only@0.0.1:
resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==}
clipboardy@3.0.0:
resolution: {integrity: sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
cliui@5.0.0:
resolution: {integrity: sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==}
@ -6340,6 +6380,14 @@ packages:
component-emitter@1.3.1:
resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==}
compressible@2.0.18:
resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==}
engines: {node: '>= 0.6'}
compression@1.7.4:
resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==}
engines: {node: '>= 0.8.0'}
concat-map@0.0.1:
resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
@ -6361,6 +6409,10 @@ packages:
console-control-strings@1.1.0:
resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==}
content-disposition@0.5.2:
resolution: {integrity: sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==}
engines: {node: '>= 0.6'}
content-disposition@0.5.4:
resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==}
engines: {node: '>= 0.6'}
@ -7779,6 +7831,11 @@ packages:
is-decimal@2.0.1:
resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==}
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}
@ -7855,6 +7912,10 @@ packages:
resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==}
engines: {node: '>=0.10.0'}
is-port-reachable@4.0.0:
resolution: {integrity: sha512-9UoipoxYmSk6Xy7QFgRv2HDyaysmgSG75TFQs6S+3pDM7ZhKTF/bskZV+0UlABHzKjNVhPjYCLfeZUEg1wXxig==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
is-potential-custom-element-name@1.0.1:
resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==}
@ -7923,6 +7984,10 @@ packages:
resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==}
engines: {node: '>=0.10.0'}
is-wsl@2.2.0:
resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==}
engines: {node: '>=8'}
is-wsl@3.1.0:
resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==}
engines: {node: '>=16'}
@ -8029,6 +8094,9 @@ packages:
json-schema-traverse@0.4.1:
resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
json-schema-traverse@1.0.0:
resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
json-stable-stringify-without-jsonify@1.0.1:
resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
@ -8429,10 +8497,18 @@ packages:
resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
engines: {node: '>=8.6'}
mime-db@1.33.0:
resolution: {integrity: sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==}
engines: {node: '>= 0.6'}
mime-db@1.52.0:
resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
engines: {node: '>= 0.6'}
mime-types@2.1.18:
resolution: {integrity: sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==}
engines: {node: '>= 0.6'}
mime-types@2.1.35:
resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
engines: {node: '>= 0.6'}
@ -8843,6 +8919,10 @@ packages:
resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==}
engines: {node: '>= 0.8'}
on-headers@1.0.2:
resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==}
engines: {node: '>= 0.8'}
once@1.4.0:
resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
@ -8978,6 +9058,9 @@ packages:
resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
engines: {node: '>=0.10.0'}
path-is-inside@1.0.2:
resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==}
path-key@3.1.1:
resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
engines: {node: '>=8'}
@ -8996,6 +9079,9 @@ packages:
resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==}
engines: {node: '>=16 || 14 >=14.18'}
path-to-regexp@3.3.0:
resolution: {integrity: sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==}
path-to-regexp@6.2.2:
resolution: {integrity: sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==}
@ -9322,6 +9408,10 @@ packages:
randombytes@2.1.0:
resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==}
range-parser@1.2.0:
resolution: {integrity: sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==}
engines: {node: '>= 0.6'}
raw-body@2.5.2:
resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==}
engines: {node: '>= 0.8'}
@ -9523,6 +9613,13 @@ packages:
resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==}
engines: {node: '>=8'}
registry-auth-token@3.3.2:
resolution: {integrity: sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==}
registry-url@3.1.0:
resolution: {integrity: sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==}
engines: {node: '>=0.10.0'}
rehype-katex@7.0.0:
resolution: {integrity: sha512-h8FPkGE00r2XKU+/acgqwWUlyzve1IiOKwsEkg4pDL3k48PiE0Pt+/uLtVHDVkN1yA4iurZN6UES8ivHVEQV6Q==}
@ -9559,6 +9656,10 @@ packages:
resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
engines: {node: '>=0.10.0'}
require-from-string@2.0.2:
resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
engines: {node: '>=0.10.0'}
require-in-the-middle@7.4.0:
resolution: {integrity: sha512-X34iHADNbNDfr6OTStIAHWSAvvKQRYgLO6duASaVf7J2VA3lvmNYboAHOuLC2huav1IwgZJtyEcJCKVzFxOSMQ==}
engines: {node: '>=8.6.0'}
@ -9721,6 +9822,14 @@ packages:
serialize-javascript@6.0.2:
resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==}
serve-handler@6.1.6:
resolution: {integrity: sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ==}
serve@14.2.4:
resolution: {integrity: sha512-qy1S34PJ/fcY8gjVGszDB3EXiPSk5FKhUa7tQe0UPRddxRidc2V6cNHPNewbE1D7MAkgLuWEt3Vw56vYy73tzQ==}
engines: {node: '>= 14'}
hasBin: true
server-only@0.0.1:
resolution: {integrity: sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==}
@ -10545,6 +10654,9 @@ packages:
peerDependencies:
browserslist: '>= 4.21.0'
update-check@1.5.4:
resolution: {integrity: sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==}
uri-js@4.4.1:
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
@ -10817,6 +10929,10 @@ packages:
wide-align@1.1.5:
resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==}
widest-line@4.0.1:
resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==}
engines: {node: '>=12'}
word-wrap@1.2.5:
resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
engines: {node: '>=0.10.0'}
@ -15635,6 +15751,8 @@ snapshots:
'@xtuc/long@4.2.2': {}
'@zeit/schemas@2.36.0': {}
abbrev@1.1.1: {}
abbrev@2.0.0: {}
@ -15687,6 +15805,17 @@ snapshots:
json-schema-traverse: 0.4.1
uri-js: 4.4.1
ajv@8.12.0:
dependencies:
fast-deep-equal: 3.1.3
json-schema-traverse: 1.0.0
require-from-string: 2.0.2
uri-js: 4.4.1
ansi-align@3.0.1:
dependencies:
string-width: 4.2.3
ansi-colors@4.1.3: {}
ansi-escapes@4.3.2:
@ -15724,6 +15853,8 @@ snapshots:
aproba@2.0.0: {}
arch@2.2.0: {}
are-we-there-yet@2.0.0:
dependencies:
delegates: 1.0.0
@ -15991,6 +16122,17 @@ snapshots:
boolbase@1.0.0: {}
boxen@7.0.0:
dependencies:
ansi-align: 3.0.1
camelcase: 7.0.1
chalk: 5.3.0
cli-boxes: 3.0.0
string-width: 5.1.2
type-fest: 2.19.0
widest-line: 4.0.1
wrap-ansi: 8.1.0
brace-expansion@1.1.11:
dependencies:
balanced-match: 1.0.2
@ -16091,6 +16233,8 @@ snapshots:
dependencies:
streamsearch: 1.1.0
bytes@3.0.0: {}
bytes@3.1.2: {}
cac@6.7.14: {}
@ -16132,6 +16276,8 @@ snapshots:
camelcase@5.3.1: {}
camelcase@7.0.1: {}
caniuse-lite@1.0.30001634: {}
caniuse-lite@1.0.30001653: {}
@ -16152,6 +16298,10 @@ snapshots:
pathval: 1.1.1
type-detect: 4.1.0
chalk-template@0.4.0:
dependencies:
chalk: 4.1.2
chalk@1.1.3:
dependencies:
ansi-styles: 2.2.1
@ -16176,6 +16326,8 @@ snapshots:
ansi-styles: 4.3.0
supports-color: 7.2.0
chalk@5.0.1: {}
chalk@5.3.0: {}
character-entities-html4@2.1.0: {}
@ -16264,6 +16416,8 @@ snapshots:
dependencies:
clsx: 2.0.0
cli-boxes@3.0.0: {}
cli-cursor@3.1.0:
dependencies:
restore-cursor: 3.1.0
@ -16276,6 +16430,12 @@ snapshots:
client-only@0.0.1: {}
clipboardy@3.0.0:
dependencies:
arch: 2.2.0
execa: 5.1.1
is-wsl: 2.2.0
cliui@5.0.0:
dependencies:
string-width: 3.1.0
@ -16374,6 +16534,22 @@ snapshots:
component-emitter@1.3.1: {}
compressible@2.0.18:
dependencies:
mime-db: 1.52.0
compression@1.7.4:
dependencies:
accepts: 1.3.8
bytes: 3.0.0
compressible: 2.0.18
debug: 2.6.9
on-headers: 1.0.2
safe-buffer: 5.1.2
vary: 1.1.2
transitivePeerDependencies:
- supports-color
concat-map@0.0.1: {}
concurrently@8.2.2:
@ -16399,6 +16575,8 @@ snapshots:
console-control-strings@1.1.0: {}
content-disposition@0.5.2: {}
content-disposition@0.5.4:
dependencies:
safe-buffer: 5.2.1
@ -18310,6 +18488,8 @@ snapshots:
is-decimal@2.0.1: {}
is-docker@2.2.1: {}
is-docker@3.0.0: {}
is-extglob@2.1.1: {}
@ -18358,6 +18538,8 @@ snapshots:
is-plain-object@5.0.0: {}
is-port-reachable@4.0.0: {}
is-potential-custom-element-name@1.0.1: {}
is-reference@1.2.1:
@ -18416,6 +18598,10 @@ snapshots:
is-windows@1.0.2: {}
is-wsl@2.2.0:
dependencies:
is-docker: 2.2.1
is-wsl@3.1.0:
dependencies:
is-inside-container: 1.0.0
@ -18539,6 +18725,8 @@ snapshots:
json-schema-traverse@0.4.1: {}
json-schema-traverse@1.0.0: {}
json-stable-stringify-without-jsonify@1.0.1: {}
json5@1.0.2:
@ -19238,8 +19426,14 @@ snapshots:
braces: 3.0.3
picomatch: 2.3.1
mime-db@1.33.0: {}
mime-db@1.52.0: {}
mime-types@2.1.18:
dependencies:
mime-db: 1.33.0
mime-types@2.1.35:
dependencies:
mime-db: 1.52.0
@ -19720,6 +19914,8 @@ snapshots:
dependencies:
ee-first: 1.1.1
on-headers@1.0.2: {}
once@1.4.0:
dependencies:
wrappy: 1.0.2
@ -19874,6 +20070,8 @@ snapshots:
path-is-absolute@1.0.1: {}
path-is-inside@1.0.2: {}
path-key@3.1.1: {}
path-key@4.0.0: {}
@ -19887,6 +20085,8 @@ snapshots:
lru-cache: 10.2.2
minipass: 7.1.2
path-to-regexp@3.3.0: {}
path-to-regexp@6.2.2: {}
path-type@4.0.0: {}
@ -20225,6 +20425,8 @@ snapshots:
dependencies:
safe-buffer: 5.2.1
range-parser@1.2.0: {}
raw-body@2.5.2:
dependencies:
bytes: 3.1.2
@ -20517,6 +20719,15 @@ snapshots:
regexpp@3.2.0: {}
registry-auth-token@3.3.2:
dependencies:
rc: 1.2.8
safe-buffer: 5.2.1
registry-url@3.1.0:
dependencies:
rc: 1.2.8
rehype-katex@7.0.0:
dependencies:
'@types/hast': 3.0.4
@ -20588,6 +20799,8 @@ snapshots:
require-directory@2.1.1: {}
require-from-string@2.0.2: {}
require-in-the-middle@7.4.0:
dependencies:
debug: 4.3.7
@ -20772,6 +20985,32 @@ snapshots:
dependencies:
randombytes: 2.1.0
serve-handler@6.1.6:
dependencies:
bytes: 3.0.0
content-disposition: 0.5.2
mime-types: 2.1.18
minimatch: 3.1.2
path-is-inside: 1.0.2
path-to-regexp: 3.3.0
range-parser: 1.2.0
serve@14.2.4:
dependencies:
'@zeit/schemas': 2.36.0
ajv: 8.12.0
arg: 5.0.2
boxen: 7.0.0
chalk: 5.0.1
chalk-template: 0.4.0
clipboardy: 3.0.0
compression: 1.7.4
is-port-reachable: 4.0.0
serve-handler: 6.1.6
update-check: 1.5.4
transitivePeerDependencies:
- supports-color
server-only@0.0.1: {}
set-blocking@2.0.0: {}
@ -21856,6 +22095,11 @@ snapshots:
escalade: 3.2.0
picocolors: 1.1.1
update-check@1.5.4:
dependencies:
registry-auth-token: 3.3.2
registry-url: 3.1.0
uri-js@4.4.1:
dependencies:
punycode: 2.3.1
@ -22258,6 +22502,10 @@ snapshots:
dependencies:
string-width: 4.2.3
widest-line@4.0.1:
dependencies:
string-width: 5.1.2
word-wrap@1.2.5: {}
wordwrap@1.0.0: {}