From e862e35eed573145dfe7192e523cd087e10c295d Mon Sep 17 00:00:00 2001 From: Nikhil Saraf Date: Tue, 1 Aug 2023 10:12:15 +0530 Subject: [PATCH] cloudflare example --- .../react/ssr/basic-cloudflare/.gitignore | 1 + .../ssr/basic-cloudflare/.mf/kv/KV/counter | 1 + .../react/ssr/basic-cloudflare/.mf/kv/KV/test | 1 + examples/react/ssr/basic-cloudflare/app.js | 63 +++ .../react/ssr/basic-cloudflare/app/app.tsx | 24 + .../react/ssr/basic-cloudflare/app/client.tsx | 53 ++ .../react/ssr/basic-cloudflare/app/server.tsx | 228 +++++++++ .../react/ssr/basic-cloudflare/app/style.css | 7 + .../react/ssr/basic-cloudflare/dev-server.js | 166 +++++++ .../react/ssr/basic-cloudflare/package.json | 29 ++ .../ssr/basic-cloudflare/postcss.config.cjs | 6 + .../ssr/basic-cloudflare/public/favicon.ico | Bin 0 -> 370070 bytes .../ssr/basic-cloudflare/tailwind.config.cjs | 8 + .../react/ssr/basic-cloudflare/wrangler.toml | 11 + pnpm-lock.yaml | 451 +++++++++++++++++- 15 files changed, 1047 insertions(+), 2 deletions(-) create mode 100644 examples/react/ssr/basic-cloudflare/.gitignore create mode 100644 examples/react/ssr/basic-cloudflare/.mf/kv/KV/counter create mode 100644 examples/react/ssr/basic-cloudflare/.mf/kv/KV/test create mode 100644 examples/react/ssr/basic-cloudflare/app.js create mode 100644 examples/react/ssr/basic-cloudflare/app/app.tsx create mode 100644 examples/react/ssr/basic-cloudflare/app/client.tsx create mode 100644 examples/react/ssr/basic-cloudflare/app/server.tsx create mode 100644 examples/react/ssr/basic-cloudflare/app/style.css create mode 100644 examples/react/ssr/basic-cloudflare/dev-server.js create mode 100644 examples/react/ssr/basic-cloudflare/package.json create mode 100644 examples/react/ssr/basic-cloudflare/postcss.config.cjs create mode 100644 examples/react/ssr/basic-cloudflare/public/favicon.ico create mode 100644 examples/react/ssr/basic-cloudflare/tailwind.config.cjs create mode 100644 examples/react/ssr/basic-cloudflare/wrangler.toml diff --git a/examples/react/ssr/basic-cloudflare/.gitignore b/examples/react/ssr/basic-cloudflare/.gitignore new file mode 100644 index 00000000..e985853e --- /dev/null +++ b/examples/react/ssr/basic-cloudflare/.gitignore @@ -0,0 +1 @@ +.vercel diff --git a/examples/react/ssr/basic-cloudflare/.mf/kv/KV/counter b/examples/react/ssr/basic-cloudflare/.mf/kv/KV/counter new file mode 100644 index 00000000..7003e7fe --- /dev/null +++ b/examples/react/ssr/basic-cloudflare/.mf/kv/KV/counter @@ -0,0 +1 @@ +51 \ No newline at end of file diff --git a/examples/react/ssr/basic-cloudflare/.mf/kv/KV/test b/examples/react/ssr/basic-cloudflare/.mf/kv/KV/test new file mode 100644 index 00000000..30d74d25 --- /dev/null +++ b/examples/react/ssr/basic-cloudflare/.mf/kv/KV/test @@ -0,0 +1 @@ +test \ No newline at end of file diff --git a/examples/react/ssr/basic-cloudflare/app.js b/examples/react/ssr/basic-cloudflare/app.js new file mode 100644 index 00000000..93c447b0 --- /dev/null +++ b/examples/react/ssr/basic-cloudflare/app.js @@ -0,0 +1,63 @@ +import reactRefresh from "@vitejs/plugin-react"; +import { createApp } from "vinxi"; +import { config } from "vinxi/lib/plugins/config"; +import { virtual } from "vinxi/lib/plugins/virtual"; + +function viteServer() { + let router; + return [ + { + configResolved(config) { + router = config.router; + }, + name: "vite-dev-server", + configureServer(server) { + globalThis.viteServers ??= {}; + globalThis.viteServers[router.name] = server; + }, + }, + virtual({ + "#vite-dev-server": ({ env }) => + env.command === "build" + ? `export default undefined` + : `export default viteServers['${router.name}']`, + }), + ]; +} + +export default createApp({ + routers: [ + { + name: "public", + mode: "static", + dir: "./public", + base: "/", + }, + { + name: "client", + mode: "build", + handler: "./app/client.tsx", + build: { + target: "browser", + plugins: () => [reactRefresh()], + }, + base: "/_build", + }, + { + name: "ssr", + mode: "handler", + handler: "./app/server.tsx", + build: { + target: "node", + plugins: () => [ + viteServer(), + config("kv", { + define: { + "import.meta.env.cloudflare": "globalThis.cloudflare", + }, + }), + ], + }, + }, + ], +}); diff --git a/examples/react/ssr/basic-cloudflare/app/app.tsx b/examples/react/ssr/basic-cloudflare/app/app.tsx new file mode 100644 index 00000000..13c6a459 --- /dev/null +++ b/examples/react/ssr/basic-cloudflare/app/app.tsx @@ -0,0 +1,24 @@ +import React from "react"; + +import "./style.css"; + +export default function App({ assets, children }) { + const [count, setCount] = React.useState(0); + return ( + + + + {assets} + + +
+

Hello AgentConf with ya asdo!!!

+ + {children} +
+ + + ); +} diff --git a/examples/react/ssr/basic-cloudflare/app/client.tsx b/examples/react/ssr/basic-cloudflare/app/client.tsx new file mode 100644 index 00000000..f6a73078 --- /dev/null +++ b/examples/react/ssr/basic-cloudflare/app/client.tsx @@ -0,0 +1,53 @@ +/// +import { createAssets } from "@vinxi/react"; +import React, { Suspense } from "react"; +import { Root, hydrateRoot } from "react-dom/client"; +import "vinxi/runtime/client"; + +import App from "./app"; + +const Assets = createAssets( + import.meta.env.MANIFEST["client"].handler, + import.meta.env.MANIFEST["client"], +); + +window.$root = + window.$root || + hydrateRoot( + document, + + + + } + >, + ); + +if (import.meta.hot) { + import.meta.hot.accept((mod) => { + if (mod) { + const Assets = createAssets( + import.meta.env.MANIFEST["client"].handler, + import.meta.env.MANIFEST["client"], + ); + window.$root?.render( + + + + } + />, + ); + } + }); +} + +export { App }; + +declare global { + interface Window { + $root?: Root; + } +} diff --git a/examples/react/ssr/basic-cloudflare/app/server.tsx b/examples/react/ssr/basic-cloudflare/app/server.tsx new file mode 100644 index 00000000..b4a5fc23 --- /dev/null +++ b/examples/react/ssr/basic-cloudflare/app/server.tsx @@ -0,0 +1,228 @@ +/// +/// +import { renderAsset } from "@vinxi/react"; +import React, { Suspense } from "react"; +import { renderToReadableStream } from "react-dom/server.edge"; +import { createCall, createFetch } from "unenv/runtime/fetch/index"; +import { + H3Event, + eventHandler, + lazyEventHandler, + sendStream, + toNodeListener, +} from "vinxi/runtime/server"; +import { createApp } from "vinxi/runtime/server"; + +import App from "./app"; + +declare global { + interface ImportMetaEnv { + KV: KVNamespace; + } +} + +export default lazyEventHandler(async () => { + const handler = eventHandler(async (event) => { + const { env } = import.meta.env.DEV + ? globalThis.cloudflare + : event.context.cloudflare; + const clientManifest = import.meta.env.MANIFEST["client"]; + const assets = await clientManifest.inputs[clientManifest.handler].assets(); + console.log( + await env.KV.put( + "counter", + JSON.stringify(Number((await env.KV.get("counter")) ?? 0) + 1), + ), + ); + + const counter = JSON.parse((await env.KV.get("counter")) ?? "0"); + const stream = await renderToReadableStream( + {assets.map((m) => renderAsset(m))}}> + {counter} + , + { + bootstrapModules: [ + clientManifest.inputs[clientManifest.handler].output.path, + ], + bootstrapScriptContent: `window.manifest = ${JSON.stringify( + await clientManifest.json(), + )}`, + }, + ); + + event.node.res.setHeader("Content-Type", "text/html"); + return stream; + }); + + if (import.meta.env.DEV) { + const { Miniflare } = await import("miniflare"); + const { default: viteServer } = await import("#vite-dev-server"); + const { createServer } = await import("../dev-server"); + + const mf = new Miniflare({ + script: ` + export default { + fetch: async (request, env) => { + return await serve(request, env, globalThis); + } + } + + export const WebSocketDurableObject = WebSocketDurableObject1; + `, + globals: { + WebSocketDurableObject1: class DO { + state; + env; + promise; + constructor(state, env) { + this.state = state; + this.env = env; + this.promise = this.createProxy(state, env); + } + + async createProxy(state, env) { + const { WebSocketDurableObject } = await vite.ssrLoadModule( + "~start/entry-server", + ); + return new WebSocketDurableObject(state, env); + } + + async fetch(request) { + console.log("DURABLE_OBJECT", request.url); + + try { + let dObject = await this.promise; + return await dObject.fetch(request); + } catch (e) { + console.log("error", e); + } + } + }, + serve: async (req, e, g) => { + const { + Request, + Response, + fetch, + crypto, + Headers, + ReadableStream, + WritableStream, + WebSocketPair, + TransformStream, + } = g; + Object.assign(globalThis, { + Request, + Response, + fetch, + crypto, + Headers, + ReadableStream, + WritableStream, + TransformStream, + WebSocketPair, + }); + + console.log( + "🔥", + req.headers.get("Upgrade") === "websocket" + ? "WEBSOCKET" + : req.method, + req.url, + ); + + if (req.headers.get("Upgrade") === "websocket") { + const url = new URL(req.url); + console.log(url.search); + const durableObjectId = e.DO_WEBSOCKET.idFromName( + url.pathname + url.search, + ); + const durableObjectStub = e.DO_WEBSOCKET.get(durableObjectId); + const response = await durableObjectStub.fetch(req); + return response; + } + + const request = req; + + try { + const url = new URL(request.url); + + // https://deno.land/api?s=Body + let body; + if (request.body) { + body = await request.arrayBuffer(); + } + + const app = createApp(); + app.use(handler); + + console.log(e); + globalThis.cloudflare = { env: e }; + + const f = createFetch(createCall(toNodeListener(app))); + + const d = await f(url.pathname + url.search, { + host: url.hostname, + protocol: url.protocol, + headers: request.headers, + method: request.method, + redirect: request.redirect, + body, + }); + + console.log(d); + + // const req = new IncomingMessage(); + return d; + } catch (e) { + console.log("error", e); + return new Response(e.toString(), { status: 500 }); + } + }, + }, + modules: true, + kvPersist: true, + compatibilityFlags: ["streams_enable_constructors"], + kvNamespaces: ["KV"], + // ...miniflareOptions, + }); + + console.log("🔥", "starting miniflare"); + + const listener = await createServer(viteServer, mf, {}); + return eventHandler(async (event) => { + // const clientManifest = import.meta.env.MANIFEST["client"]; + // const assets = await clientManifest.inputs[clientManifest.handler].assets(); + // const events = {}; + // const stream = await new Promise(async (resolve) => { + // const stream = renderToPipeableStream( + // {assets.map((m) => renderAsset(m))}} + // />, + // { + // onShellReady() { + // resolve(stream); + // }, + // bootstrapModules: [ + // clientManifest.inputs[clientManifest.handler].output.path, + // ], + // bootstrapScriptContent: `window.manifest = ${JSON.stringify( + // await clientManifest.json(), + // )}`, + // }, + // ); + // }); + + // // @ts-ignore + // stream.on = (event, listener) => { + // events[event] = listener; + // }; + + const response = await listener(event.node.req, event.node.res); + + // event.node.res.setHeader("Content-Type", "text/html"); + return response; + }); + } else { + return handler; + } +}); diff --git a/examples/react/ssr/basic-cloudflare/app/style.css b/examples/react/ssr/basic-cloudflare/app/style.css new file mode 100644 index 00000000..b1284a35 --- /dev/null +++ b/examples/react/ssr/basic-cloudflare/app/style.css @@ -0,0 +1,7 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +* { + color: red; +} \ No newline at end of file diff --git a/examples/react/ssr/basic-cloudflare/dev-server.js b/examples/react/ssr/basic-cloudflare/dev-server.js new file mode 100644 index 00000000..6b9cebd8 --- /dev/null +++ b/examples/react/ssr/basic-cloudflare/dev-server.js @@ -0,0 +1,166 @@ +/*! + * Original code by MrBBot + * MIT Licensedm Copyright (c) 2021 MrBBot, see LICENSE.miniflare.md for details + */ +import { createRequestListener } from "@miniflare/http-server"; +import { coupleWebSocket } from "@miniflare/web-sockets"; +import assert from "assert"; +import http from "http"; +import net from "net"; +import { URL } from "url"; + +async function writeResponse(response, res) { + var e_1, _a; + const headers = {}; + // eslint-disable-next-line prefer-const + for (let [key, value] of response.headers) { + key = key.toLowerCase(); + if (key === "set-cookie") { + // Multiple Set-Cookie headers should be treated as separate headers + // @ts-expect-error getAll is added to the Headers prototype by + // importing @miniflare/core + headers["set-cookie"] = response.headers.getAll("set-cookie"); + } else { + headers[key] = value; + } + } + // Use body's actual length instead of the Content-Length header if set, + // see https://github.com/cloudflare/miniflare/issues/148. We also might + // need to adjust this later for live reloading so hold onto it. + const contentLengthHeader = response.headers.get("Content-Length"); + const contentLength = + contentLengthHeader === null ? null : parseInt(contentLengthHeader); + if (contentLength !== null) headers["content-length"] = contentLength; + res.writeHead(response.status, headers); + // `initialStream` is the stream we'll write the response to. It + // should end up as the first encoder, piping to the next encoder, + // and finally piping to the response: + // + // encoders[0] (initialStream) -> encoders[1] -> res + // + // Not using `pipeline(passThrough, ...encoders, res)` here as that + // gives a premature close error with server sent events. This also + // avoids creating an extra stream even when we're not encoding. + let initialStream = res; + // Response body may be null if empty + if (response.body) { + try { + for ( + var _b = __asyncValues(response.body), _c; + (_c = await _b.next()), !_c.done; + + ) { + const chunk = _c.value; + if (chunk) initialStream.write(chunk); + } + } catch (e_1_1) { + e_1 = { error: e_1_1 }; + } finally { + try { + if (_c && !_c.done && (_a = _b.return)) await _a.call(_b); + } finally { + if (e_1) throw e_1.error; + } + } + } + initialStream.end(); +} + +export const DEFAULT_PORT = 8787; +const restrictedWebSocketUpgradeHeaders = [ + "upgrade", + "connection", + "sec-websocket-accept", +]; + +export async function createServer(vite, mf, options) { + var _a, _b; + const listener = createRequestListener(mf); + // Setup HTTP server + const { WebSocketServer } = await import("ws"); + // Setup WebSocket servers + const webSocketServer = new WebSocketServer({ noServer: true }); + // Add custom headers included in response to WebSocket upgrade requests + const extraHeaders = new WeakMap(); + webSocketServer.on("headers", (headers, req) => { + const extra = extraHeaders.get(req); + extraHeaders.delete(req); + if (extra) { + for (const [key, value] of extra) { + if (!restrictedWebSocketUpgradeHeaders.includes(key.toLowerCase())) { + headers.push(`${key}: ${value}`); + } + } + } + }); + (_a = vite.httpServer) === null || _a === void 0 + ? void 0 + : _a.on("upgrade", async (request, socket, head) => { + var _a; + // Only interested in pathname so base URL doesn't matter + const { pathname } = new URL( + (_a = request.url) !== null && _a !== void 0 ? _a : "", + "http://localhost", + ); + if ( + pathname === "/cdn-cgi/mf/reload" || + request.headers["sec-websocket-protocol"] === "vite-hmr" + ) { + // If this is the for live-reload, handle the request ourselves + return; + } else { + // Otherwise, handle the request in the worker + const response = await listener(request); + // Check web socket response was returned + const webSocket = + response === null || response === void 0 + ? void 0 + : response.webSocket; + if ( + (response === null || response === void 0 + ? void 0 + : response.status) === 101 && + webSocket + ) { + // Accept and couple the Web Socket + extraHeaders.set(request, response.headers); + webSocketServer.handleUpgrade(request, socket, head, (ws) => { + void coupleWebSocket(ws, webSocket); + webSocketServer.emit("connection", ws, request); + }); + return; + } + // Otherwise, we'll be returning a regular HTTP response + const res = new http.ServerResponse(request); + // `socket` is guaranteed to be an instance of `net.Socket`: + // https://nodejs.org/api/http.html#event-upgrade_1 + assert(socket instanceof net.Socket); + res.assignSocket(socket); + // If no response was provided, or it was an "ok" response, log an error + if (!response || (200 <= response.status && response.status < 300)) { + res.writeHead(500); + res.end(); + mf.log.error( + new TypeError( + "Web Socket request did not return status 101 Switching Protocols response with Web Socket", + ), + ); + return; + } + // Otherwise, send the response as is (e.g. unauthorised), + // always disabling live-reload as this is a WebSocket upgrade + await writeResponse(response, res); + } + }); + const reloadListener = () => { + // Close all existing web sockets on reload + for (const ws of webSocketServer.clients) { + ws.close(1012, "Service Restart"); + } + }; + mf.addEventListener("reload", reloadListener); + (_b = vite.httpServer) === null || _b === void 0 + ? void 0 + : _b.on("close", () => mf.removeEventListener("reload", reloadListener)); + return listener; +} diff --git a/examples/react/ssr/basic-cloudflare/package.json b/examples/react/ssr/basic-cloudflare/package.json new file mode 100644 index 00000000..3faae41b --- /dev/null +++ b/examples/react/ssr/basic-cloudflare/package.json @@ -0,0 +1,29 @@ +{ + "type": "module", + "scripts": { + "dev": "vinxi dev", + "build": "vinxi build", + "start": "vinxi start" + }, + "dependencies": { + "@cloudflare/workers-types": "^4.20230724.0", + "@miniflare/http-server": "^2.14.0", + "@miniflare/kv": "^2.14.0", + "@miniflare/web-sockets": "^2.14.0", + "@picocss/pico": "^1.5.7", + "@vinxi/react": "workspace:^", + "@vitejs/plugin-react": "^4.0.1", + "autoprefixer": "^10.4.14", + "miniflare": "^2.14.0", + "react": "0.0.0-experimental-035a41c4e-20230704", + "react-dom": "0.0.0-experimental-035a41c4e-20230704", + "tailwindcss": "^3.3.2", + "unenv": "^1.5.1", + "vinxi": "workspace:^", + "ws": "^8.13.0" + }, + "devDependencies": { + "@types/react": "^18.2.14", + "@types/react-dom": "^18.2.6" + } +} diff --git a/examples/react/ssr/basic-cloudflare/postcss.config.cjs b/examples/react/ssr/basic-cloudflare/postcss.config.cjs new file mode 100644 index 00000000..33ad091d --- /dev/null +++ b/examples/react/ssr/basic-cloudflare/postcss.config.cjs @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/examples/react/ssr/basic-cloudflare/public/favicon.ico b/examples/react/ssr/basic-cloudflare/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..129ee136870848270517aeee93fed8b4d148e065 GIT binary patch literal 370070 zcmeF42iP4&)%XL1g!GU`3MDs6QxuS*0xF<1=}mg?y`xftO6VPebVBc;ccgb|N>Qyz|aGyL)!;?tSmQ**wpiy?5{Klrv|}oPGujm~X(K0i#C`kbhGL z>^pG4fW7%NHU55++<#T>t+2wJ?@JCCaP;^A1J+zK{=UrG0|qR<`hWq`r_cGm(0l{d zJ)Y0}n>t{bsRIWbeDZt)mXU9CF;)KNGyh8)(ysq++O%m=S$`j2c4~C_j8V~5r;Uuh z{KYAA+x_y|Q=+R+9~oVG@~CK;rKirl@AvzyBgRBKY(6Ra^h%3ISDrdDI^$~#N2eS$ z#=N_#+}nMdMWW*m8k_k34d;xA7=vy1fh&eak6b-;?)T-FTOzvV%#m}y+vn`{l5dTQ zR$FCp^ZS9jOo%QzX>@eKiK8Pv^UP=EH=eQ2yVuWucCqN*ONT|z-Mmor^o>KJ@83Hp zy6&tI(e-DKh~BzyQ1s;WL!xJHTqwHp;^EO}R*w7N{f|s*m_DwRaeZauNzqN`jfif$ zV0g6prx%MhUUy2g;g_aFUs!Fi=%#Z=L^sOc&Rb55ZkA`x`1-;!jz)CY9^<30?mKSo znC`e}cy#^=qod8%pB(+)+XJHil|S0J_#305+bO~#ZVeefZEUvQN<9cj5HW zX5RbmxQKavO@Slp>AvHBX04X{n8lxl!JUV$?7^RvS6Cvt;*@0k`R3tcqMf#wC~LR4 zS@&-oHa0r>$T88ZGe#Pm-fO!>qGR^&fwkK=pFbwJdztK!%VZC&^Z7;Rj&uFBrkFhi z?k%%)WA1(b{UYB742Ys;{-85c-vvg*

1-*`B!9Y^U^z?`1sUl*R3Z;I|}}M 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'} @@ -2018,6 +2077,10 @@ packages: '@hapi/hoek': 9.3.0 dev: false + /@iarna/toml@2.2.5: + resolution: {integrity: sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==} + dev: false + /@ioredis/commands@1.2.0: resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} dev: false @@ -2159,6 +2222,178 @@ packages: - supports-color dev: false + /@miniflare/cache@2.14.0: + resolution: {integrity: sha512-0mz0OCzTegiX75uMURLJpDo3DaOCSx9M0gv7NMFWDbK/XrvjoENiBZiKu98UBM5fts0qtK19a+MfB4aT0uBCFg==} + engines: {node: '>=16.13'} + dependencies: + '@miniflare/core': 2.14.0 + '@miniflare/shared': 2.14.0 + http-cache-semantics: 4.1.1 + undici: 5.20.0 + dev: false + + /@miniflare/cli-parser@2.14.0: + resolution: {integrity: sha512-6Wb0jTMqwI7GRGAhz9WOF8AONUsXXPmwu+Qhg+tnRWtQpJ3DYd5dku1N04L9L1R7np/mD8RrycLyCdg3hLZ3aA==} + engines: {node: '>=16.13'} + dependencies: + '@miniflare/shared': 2.14.0 + kleur: 4.1.5 + dev: false + + /@miniflare/core@2.14.0: + resolution: {integrity: sha512-BjmV/ZDwsKvXnJntYHt3AQgzVKp/5ZzWPpYWoOnUSNxq6nnRCQyvFvjvBZKnhubcmJCLSqegvz0yHejMA90CTA==} + engines: {node: '>=16.13'} + dependencies: + '@iarna/toml': 2.2.5 + '@miniflare/queues': 2.14.0 + '@miniflare/shared': 2.14.0 + '@miniflare/watcher': 2.14.0 + busboy: 1.6.0 + dotenv: 10.0.0 + kleur: 4.1.5 + set-cookie-parser: 2.6.0 + undici: 5.20.0 + urlpattern-polyfill: 4.0.3 + dev: false + + /@miniflare/d1@2.14.0: + resolution: {integrity: sha512-9YoeLAkZuWGAu9BMsoctHoMue0xHzJYZigAJWGvWrqSFT1gBaT+RlUefQCHXggi8P7sOJ1+BKlsWAhkB5wfMWQ==} + engines: {node: '>=16.7'} + dependencies: + '@miniflare/core': 2.14.0 + '@miniflare/shared': 2.14.0 + dev: false + + /@miniflare/durable-objects@2.14.0: + resolution: {integrity: sha512-P8eh1P62BPGpj+MCb1i1lj7Tlt/G3BMmnxHp9duyb0Wro/ILVGPQskZl+iq7DHq1w3C+n0+6/E1B44ff+qn0Mw==} + engines: {node: '>=16.13'} + dependencies: + '@miniflare/core': 2.14.0 + '@miniflare/shared': 2.14.0 + '@miniflare/storage-memory': 2.14.0 + undici: 5.20.0 + dev: false + + /@miniflare/html-rewriter@2.14.0: + resolution: {integrity: sha512-7CJZk3xZkxK8tGNofnhgWcChZ8YLx6MhAdN2nn6ONSXrK/TevzEKdL8bnVv1OJ6J8Y23OxvfinOhufr33tMS8g==} + engines: {node: '>=16.13'} + dependencies: + '@miniflare/core': 2.14.0 + '@miniflare/shared': 2.14.0 + html-rewriter-wasm: 0.4.1 + undici: 5.20.0 + dev: false + + /@miniflare/http-server@2.14.0: + resolution: {integrity: sha512-APaBlvGRAW+W18ph5ruPXX26/iKdByPz1tZH1OjPAKBDAiKFZSGek4QzUmQALBWLx5VMTMrt7QIe7KE4nM4sdw==} + engines: {node: '>=16.13'} + dependencies: + '@miniflare/core': 2.14.0 + '@miniflare/shared': 2.14.0 + '@miniflare/web-sockets': 2.14.0 + kleur: 4.1.5 + selfsigned: 2.1.1 + undici: 5.20.0 + ws: 8.13.0 + youch: 2.2.2 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /@miniflare/kv@2.14.0: + resolution: {integrity: sha512-FHAnVjmhV/VHxgjNf2whraz+k7kfMKlfM+5gO8WT6HrOsWxSdx8OueWVScnOuuDkSeUg5Ctrf5SuztTV8Uy1cg==} + engines: {node: '>=16.13'} + dependencies: + '@miniflare/shared': 2.14.0 + dev: false + + /@miniflare/queues@2.14.0: + resolution: {integrity: sha512-flS4MqlgBKyv6QBqKD0IofjmMDW9wP1prUNQy2wWPih9lA6bFKmml3VdFeDsPnWtE2J67K0vCTf5kj1Q0qdW1w==} + engines: {node: '>=16.7'} + dependencies: + '@miniflare/shared': 2.14.0 + dev: false + + /@miniflare/r2@2.14.0: + resolution: {integrity: sha512-+WJJP4J0QzY69HPrG6g5OyW23lJ02WHpHZirCxwPSz8CajooqZCJVx+qvUcNmU8MyKASbUZMWnH79LysuBh+jA==} + engines: {node: '>=16.13'} + dependencies: + '@miniflare/core': 2.14.0 + '@miniflare/shared': 2.14.0 + undici: 5.20.0 + dev: false + + /@miniflare/runner-vm@2.14.0: + resolution: {integrity: sha512-01CmNzv74u0RZgT/vjV/ggDzECXTG88ZJAKhXyhAx0s2DOLIXzsGHn6pUJIsfPCrtj8nfqtTCp1Vf0UMVWSpmw==} + engines: {node: '>=16.13'} + dependencies: + '@miniflare/shared': 2.14.0 + dev: false + + /@miniflare/scheduler@2.14.0: + resolution: {integrity: sha512-/D28OeY/HxcOyY0rkPc2qU/wzxCcUv3/F7NRpgDix37sMkYjAAS51ehVIAkPwAdFEMdantcyVuHNQ2kO1xbT+Q==} + engines: {node: '>=16.13'} + dependencies: + '@miniflare/core': 2.14.0 + '@miniflare/shared': 2.14.0 + cron-schedule: 3.0.6 + dev: false + + /@miniflare/shared@2.14.0: + resolution: {integrity: sha512-O0jAEdMkp8BzrdFCfMWZu76h4Cq+tt3/oDtcTFgzum3fRW5vUhIi/5f6bfndu6rkGbSlzxwor8CJWpzityXGug==} + engines: {node: '>=16.13'} + dependencies: + '@types/better-sqlite3': 7.6.4 + kleur: 4.1.5 + npx-import: 1.1.4 + picomatch: 2.3.1 + dev: false + + /@miniflare/sites@2.14.0: + resolution: {integrity: sha512-qI8MFZpD1NV+g+HQ/qheDVwscKzwG58J+kAVTU/1fgub2lMLsxhE3Mmbi5AIpyIiJ7Q5Sezqga234CEkHkS7dA==} + engines: {node: '>=16.13'} + dependencies: + '@miniflare/kv': 2.14.0 + '@miniflare/shared': 2.14.0 + '@miniflare/storage-file': 2.14.0 + dev: false + + /@miniflare/storage-file@2.14.0: + resolution: {integrity: sha512-Ps0wHhTO+ie33a58efI0p/ppFXSjlbYmykQXfYtMeVLD60CKl+4Lxor0+gD6uYDFbhMWL5/GMDvyr4AM87FA+Q==} + engines: {node: '>=16.13'} + dependencies: + '@miniflare/shared': 2.14.0 + '@miniflare/storage-memory': 2.14.0 + dev: false + + /@miniflare/storage-memory@2.14.0: + resolution: {integrity: sha512-5aFjEiTSNrHJ+iAiGMCA/TVPnNMrnokG5r0vKrwj4knbf8pisgfP04x18zCgOlG7kaIWNmqdO/vtVT5BIioiSQ==} + engines: {node: '>=16.13'} + dependencies: + '@miniflare/shared': 2.14.0 + dev: false + + /@miniflare/watcher@2.14.0: + resolution: {integrity: sha512-O8Abg2eHpGmcZb8WyUaA6Av1Mqt5bSrorzz4CrWwsvJHBdekZPIX0GihC9vn327d/1pKRs81YTiSAfBoSZpVIw==} + engines: {node: '>=16.13'} + dependencies: + '@miniflare/shared': 2.14.0 + dev: false + + /@miniflare/web-sockets@2.14.0: + resolution: {integrity: sha512-lB1CB4rBq0mbCuh55WgIEH4L3c4/i4MNDBfrQL+6r+wGcr/BJUqF8BHpsfAt5yHWUJVtK5mlMeesS/xpg4Ao1w==} + engines: {node: '>=16.13'} + dependencies: + '@miniflare/core': 2.14.0 + '@miniflare/shared': 2.14.0 + undici: 5.20.0 + ws: 8.13.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + /@netlify/functions@1.6.0: resolution: {integrity: sha512-6G92AlcpFrQG72XU8YH8pg94eDnq7+Q0YJhb8x4qNpdGsvuzvrfHWBmqFGp/Yshmv4wex9lpsTRZOocdrA2erQ==} engines: {node: '>=14.0.0'} @@ -2549,6 +2784,12 @@ packages: '@babel/types': 7.22.5 dev: false + /@types/better-sqlite3@7.6.4: + resolution: {integrity: sha512-dzrRZCYPXIXfSR1/surNbJ/grU3scTaygS0OMzjlGf71i9sc2fGyHPXXiXmEvNIoE0cGwsanEFMVJxPXmco9Eg==} + dependencies: + '@types/node': 18.14.0 + dev: false + /@types/chai-subset@1.3.3: resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} dependencies: @@ -2668,6 +2909,10 @@ packages: /@types/scheduler@0.16.3: resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==} + /@types/stack-trace@0.0.29: + resolution: {integrity: sha512-TgfOX+mGY/NyNxJLIbDWrO9DjGoVSW9+aB8H2yy1fy32jsvxijhmyJI9fDFgvz3YP4lvJaq9DzdR/M1bOgVc9g==} + dev: false + /@types/stack-utils@2.0.1: resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} dev: false @@ -3092,6 +3337,12 @@ packages: engines: {node: '>=6'} dev: false + /builtins@5.0.1: + resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} + dependencies: + semver: 7.5.4 + dev: false + /busboy@1.6.0: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} engines: {node: '>=10.16.0'} @@ -3393,6 +3644,11 @@ packages: resolution: {integrity: sha512-mWYvfOLrfEc996hlKcdABeIiPHUPC6DM2QYZdGGOvhOTbA3tjm2eBwqlJpoFdjC89NI4Qt6h0Pu06Mp+1Pj5OQ==} dev: false + /cookie@0.4.2: + resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} + engines: {node: '>= 0.6'} + dev: false + /core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} dev: false @@ -3411,6 +3667,10 @@ packages: readable-stream: 3.6.2 dev: false + /cron-schedule@3.0.6: + resolution: {integrity: sha512-izfGgKyzzIyLaeb1EtZ3KbglkS6AKp9cv7LxmiyoOu+fXfol1tQDC0Cof0enVZGNtudTHW+3lfuW9ZkLQss4Wg==} + dev: false + /cross-env@7.0.3: resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} @@ -3605,6 +3865,11 @@ packages: type-fest: 2.19.0 dev: false + /dotenv@10.0.0: + resolution: {integrity: sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==} + engines: {node: '>=10'} + dev: false + /dotenv@16.3.1: resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} engines: {node: '>=12'} @@ -3852,6 +4117,21 @@ packages: strip-final-newline: 2.0.0 dev: false + /execa@6.1.0: + resolution: {integrity: sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 3.0.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 + dev: false + /expect@29.6.1: resolution: {integrity: sha512-XEdDLonERCU1n9uR56/Stx9OqojaLAQtZf9PrCHH9Hl8YXiEIka3H4NXJ3NOIBmQJTg7+j7buh34PMHfJujc8g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -4195,6 +4475,10 @@ packages: resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==} dev: false + /html-rewriter-wasm@0.4.1: + resolution: {integrity: sha512-lNovG8CMCCmcVB1Q7xggMSf7tqPCijZXaH4gL6iE8BFghdQCbaY5Met9i1x2Ex8m/cZHDUtXK9H6/znKamRP8Q==} + dev: false + /htmlparser2@8.0.2: resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} dependencies: @@ -4204,6 +4488,10 @@ packages: entities: 4.5.0 dev: false + /http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + dev: false + /http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} @@ -4255,6 +4543,11 @@ packages: engines: {node: '>=10.17.0'} dev: false + /human-signals@3.0.1: + resolution: {integrity: sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==} + engines: {node: '>=12.20.0'} + dev: false + /ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} dev: false @@ -4415,6 +4708,11 @@ packages: engines: {node: '>=8'} dev: false + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: false + /is-what@4.1.15: resolution: {integrity: sha512-uKua1wfy3Yt+YqsD6mTUEa2zSi3G1oPlqTflgaPJ7z63vUGN5pxFpnQfeSLMFnJDEsdvOtkp1rUWkYjB4YfhgA==} engines: {node: '>=12.13'} @@ -5101,11 +5399,58 @@ packages: engines: {node: '>=6'} dev: false + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: false + /min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} dev: false + /miniflare@2.14.0: + resolution: {integrity: sha512-xBOUccq1dm5riOfaqoMWCC1uCqT71EW0x4akQQuGYgm+Q44N1ETEmzXSbFVroJgOHe8Hwpqxo2D7OOFwqFevew==} + engines: {node: '>=16.13'} + hasBin: true + peerDependencies: + '@miniflare/storage-redis': 2.14.0 + cron-schedule: ^3.0.4 + ioredis: ^4.27.9 + peerDependenciesMeta: + '@miniflare/storage-redis': + optional: true + cron-schedule: + optional: true + ioredis: + optional: true + dependencies: + '@miniflare/cache': 2.14.0 + '@miniflare/cli-parser': 2.14.0 + '@miniflare/core': 2.14.0 + '@miniflare/d1': 2.14.0 + '@miniflare/durable-objects': 2.14.0 + '@miniflare/html-rewriter': 2.14.0 + '@miniflare/http-server': 2.14.0 + '@miniflare/kv': 2.14.0 + '@miniflare/queues': 2.14.0 + '@miniflare/r2': 2.14.0 + '@miniflare/runner-vm': 2.14.0 + '@miniflare/scheduler': 2.14.0 + '@miniflare/shared': 2.14.0 + '@miniflare/sites': 2.14.0 + '@miniflare/storage-file': 2.14.0 + '@miniflare/storage-memory': 2.14.0 + '@miniflare/web-sockets': 2.14.0 + kleur: 4.1.5 + semiver: 1.1.0 + source-map-support: 0.5.21 + undici: 5.20.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: @@ -5164,7 +5509,7 @@ packages: acorn: 8.10.0 pathe: 1.1.1 pkg-types: 1.0.3 - ufo: 1.1.2 + ufo: 1.2.0 dev: false /mri@1.2.0: @@ -5182,6 +5527,11 @@ packages: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} dev: false + /mustache@4.2.0: + resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} + hasBin: true + dev: false + /mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} dependencies: @@ -5335,6 +5685,13 @@ packages: path-key: 3.1.1 dev: false + /npm-run-path@5.1.0: + resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + path-key: 4.0.0 + dev: false + /npmlog@5.0.1: resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} dependencies: @@ -5344,6 +5701,15 @@ packages: set-blocking: 2.0.0 dev: false + /npx-import@1.1.4: + resolution: {integrity: sha512-3ShymTWOgqGyNlh5lMJAejLuIv3W1K3fbI5Ewc6YErZU3Sp0PqsNs8UIU1O8z5+KVl/Du5ag56Gza9vdorGEoA==} + dependencies: + execa: 6.1.0 + parse-package-name: 1.0.0 + semver: 7.5.4 + validate-npm-package-name: 4.0.0 + dev: false + /nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} dependencies: @@ -5363,7 +5729,7 @@ packages: dependencies: destr: 2.0.0 node-fetch-native: 1.2.0 - ufo: 1.1.2 + ufo: 1.2.0 dev: false /ohash@1.1.2: @@ -5394,6 +5760,13 @@ packages: mimic-fn: 2.1.0 dev: false + /onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + dependencies: + mimic-fn: 4.0.0 + dev: false + /open@8.4.2: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} @@ -5434,6 +5807,10 @@ packages: is-decimal: 2.0.1 is-hexadecimal: 2.0.1 + /parse-package-name@1.0.0: + resolution: {integrity: sha512-kBeTUtcj+SkyfaW4+KBe0HtsloBJ/mKTPoxpVdA57GZiPerREsUWJOhVj9anXweFiJkm5y8FG1sxFZkZ0SN6wg==} + dev: false + /parse5-htmlparser2-tree-adapter@7.0.0: resolution: {integrity: sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==} dependencies: @@ -5460,6 +5837,11 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} + /path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + dev: false + /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} @@ -5899,6 +6281,18 @@ packages: resolution: {integrity: sha512-4AsO/FrViE/iDNEPaAQlb77tf0csuq27EsVpy6ett584EcRTp6pTDLoGWVxCD77y5iU5FauOvhsI4o1APwPoSQ==} dev: false + /selfsigned@2.1.1: + resolution: {integrity: sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==} + engines: {node: '>=10'} + dependencies: + node-forge: 1.3.1 + dev: false + + /semiver@1.1.0: + resolution: {integrity: sha512-QNI2ChmuioGC1/xjyYwyZYADILWyW6AmS1UH6gDj/SFUUUS4MBAWs/7mxnkRPc/F4iHezDP+O8t0dO8WHiEOdg==} + engines: {node: '>=6'} + dev: false + /semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -5964,6 +6358,10 @@ packages: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} dev: false + /set-cookie-parser@2.6.0: + resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} + dev: false + /setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} dev: false @@ -6057,6 +6455,10 @@ packages: /space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + /stack-trace@0.0.10: + resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} + dev: false + /stack-utils@2.0.6: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} @@ -6137,6 +6539,11 @@ packages: engines: {node: '>=6'} dev: false + /strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + dev: false + /strip-indent@3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} @@ -6366,6 +6773,13 @@ packages: busboy: 1.6.0 dev: false + /undici@5.20.0: + resolution: {integrity: sha512-J3j60dYzuo6Eevbawwp1sdg16k5Tf768bxYK4TUJRH7cBM4kFCbf3mOnM/0E3vQYXvpxITbbWmBafaDbxLDz3g==} + engines: {node: '>=12.18'} + dependencies: + busboy: 1.6.0 + dev: false + /undici@5.22.1: resolution: {integrity: sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==} engines: {node: '>=14.0'} @@ -6618,6 +7032,10 @@ packages: escalade: 3.1.1 picocolors: 1.0.0 + /urlpattern-polyfill@4.0.3: + resolution: {integrity: sha512-DOE84vZT2fEcl9gqCUTcnAw5ZY5Id55ikUcziSUntuEFL3pRvavg5kwDmTEUJkeCHInTlV/HexFomgYnzO5kdQ==} + dev: false + /use-sync-external-store@1.2.0(react@0.0.0-experimental-035a41c4e-20230704): resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} peerDependencies: @@ -6643,6 +7061,13 @@ packages: resolution: {integrity: sha512-hGdgQozCsQJMyfK5urgFcWEqsSSrK63Awe0t/IMR0bZ0QMtnuaiHzThW81guu3qx9abLi99NEuiaN6P9gVYsNg==} dev: false + /validate-npm-package-name@4.0.0: + resolution: {integrity: sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + builtins: 5.0.1 + dev: false + /vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} @@ -6937,6 +7362,19 @@ packages: /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + /ws@8.13.0: + resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: false + /y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -6976,6 +7414,15 @@ packages: engines: {node: '>=12.20'} dev: false + /youch@2.2.2: + resolution: {integrity: sha512-/FaCeG3GkuJwaMR34GHVg0l8jCbafZLHiFowSjqLlqhC6OMyf2tPJBu8UirF7/NI9X/R5ai4QfEKUCOxMAGxZQ==} + dependencies: + '@types/stack-trace': 0.0.29 + cookie: 0.4.2 + mustache: 4.2.0 + stack-trace: 0.0.10 + dev: false + /zip-stream@4.1.0: resolution: {integrity: sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==} engines: {node: '>= 10'}