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 00000000..129ee136 Binary files /dev/null and b/examples/react/ssr/basic-cloudflare/public/favicon.ico differ diff --git a/examples/react/ssr/basic-cloudflare/tailwind.config.cjs b/examples/react/ssr/basic-cloudflare/tailwind.config.cjs new file mode 100644 index 00000000..e1e70f61 --- /dev/null +++ b/examples/react/ssr/basic-cloudflare/tailwind.config.cjs @@ -0,0 +1,8 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: ["./app/**/*.tsx", "./app/**/*.ts", "./app/**/*.js"], + theme: { + extend: {}, + }, + plugins: [], +}; diff --git a/examples/react/ssr/basic-cloudflare/wrangler.toml b/examples/react/ssr/basic-cloudflare/wrangler.toml new file mode 100644 index 00000000..4c438cae --- /dev/null +++ b/examples/react/ssr/basic-cloudflare/wrangler.toml @@ -0,0 +1,11 @@ +name = "test-vinxi" +main = "./.output/server/index.mjs" +workers_dev = true +compatibility_date = "2022-11-29" +kv_namespaces = [ + { binding = "KV", id = "1df7638ef05a4250ac741e45ca7fd195", preview_id = "a3ede4a964d14238affdf4fbcfd39ff3" } +] +compatibility_flags = [ "streams_enable_constructors" ] +[site] +bucket = ".output/public" + diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 69897ab0..befc40b7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -353,6 +353,61 @@ importers: specifier: ^18.2.6 version: 18.2.6 + examples/react/ssr/basic-cloudflare: + dependencies: + '@cloudflare/workers-types': + specifier: ^4.20230724.0 + version: 4.20230724.0 + '@miniflare/http-server': + specifier: ^2.14.0 + version: 2.14.0 + '@miniflare/kv': + specifier: ^2.14.0 + version: 2.14.0 + '@miniflare/web-sockets': + specifier: ^2.14.0 + version: 2.14.0 + '@picocss/pico': + specifier: ^1.5.7 + version: 1.5.7 + '@vinxi/react': + specifier: workspace:^ + version: link:../../../../packages/vinxi-react + '@vitejs/plugin-react': + specifier: ^4.0.1 + version: 4.0.1(vite@4.3.9) + autoprefixer: + specifier: ^10.4.14 + version: 10.4.14(postcss@8.4.27) + miniflare: + specifier: ^2.14.0 + version: 2.14.0 + react: + specifier: 0.0.0-experimental-035a41c4e-20230704 + version: 0.0.0-experimental-035a41c4e-20230704 + react-dom: + specifier: 0.0.0-experimental-035a41c4e-20230704 + version: 0.0.0-experimental-035a41c4e-20230704(react@0.0.0-experimental-035a41c4e-20230704) + tailwindcss: + specifier: ^3.3.2 + version: 3.3.2 + unenv: + specifier: ^1.5.1 + version: 1.5.2 + vinxi: + specifier: workspace:^ + version: link:../../../../packages/vinxi + ws: + specifier: ^8.13.0 + version: 8.13.0 + devDependencies: + '@types/react': + specifier: ^18.2.14 + version: 18.2.14 + '@types/react-dom': + specifier: ^18.2.6 + version: 18.2.6 + examples/react/ssr/tanstack-router-app: dependencies: '@picocss/pico': @@ -1230,6 +1285,10 @@ packages: mime: 3.0.0 dev: false + /@cloudflare/workers-types@4.20230724.0: + resolution: {integrity: sha512-WuFlsai21oJhRMBHdkM0saIuK1Faitp/GXWj31Zlbe3cCtPNlwYtX5WkojDNWWAxX47LMHBF9wv7wrytNLabYA==} + dev: false + /@esbuild/android-arm64@0.17.19: resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} engines: {node: '>=12'} @@ -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'}