diff --git a/.changeset/fluffy-dots-grin.md b/.changeset/fluffy-dots-grin.md new file mode 100644 index 00000000000..9dbf3b8549c --- /dev/null +++ b/.changeset/fluffy-dots-grin.md @@ -0,0 +1,16 @@ +--- +"@remix-run/cloudflare-pages": patch +"@remix-run/dev": patch +"@remix-run/server-runtime": patch +--- + +Vite: Cloudflare Pages support + +To get started with Cloudflare, you can use the [`unstable-vite-cloudflare`][template-vite-cloudflare] template: + +```shellscript nonumber +npx create-remix@latest --template remix-run/remix/templates/unstable-vite-cloudflare +``` + +Or read the new docs at [Future > Vite > Cloudflare](https://remix.run/docs/en/main/future/vite#cloudflare) and +[Future > Vite > Migrating > Migrating Cloudflare Functions](https://remix.run/docs/en/main/future/vite#migrating-cloudflare-functions). diff --git a/docs/future/vite.md b/docs/future/vite.md index cd0a1c18834..f2d27ecb4cb 100644 --- a/docs/future/vite.md +++ b/docs/future/vite.md @@ -6,20 +6,19 @@ title: Vite (Unstable) [Vite][vite] is a powerful, performant and extensible development environment for JavaScript projects. In order to improve and extend Remix's bundling capabilities, we now support Vite as an alternative compiler. In the future, Vite will become the default compiler for Remix. -Note that Cloudflare is not yet supported when using Vite. - ## Getting started -To get started with a minimal server, you can use the [`unstable-vite`][template-vite] template: +We've got a few different Vite-based templates to get you started. ```shellscript nonumber +# Minimal server: npx create-remix@latest --template remix-run/remix/templates/unstable-vite -``` - -If you'd rather customize your server, you can use the [`unstable-vite-express`][template-vite-express] template: -```shellscript nonumber +# Express: npx create-remix@latest --template remix-run/remix/templates/unstable-vite-express + +# Cloudflare: +npx create-remix@latest --template remix-run/remix/templates/unstable-vite-cloudflare ``` These templates include a `vite.config.ts` file which is where the Remix Vite plugin is configured. @@ -80,6 +79,62 @@ A function for assigning addressable routes to [server bundles][server-bundles]. You may also want to enable the `manifest` option since, when server bundles are enabled, it contains mappings between routes and server bundles. +## Cloudflare + +To get started with Cloudflare, you can use the [`unstable-vite-cloudflare`][template-vite-cloudflare] template: + +```shellscript nonumber +npx create-remix@latest --template remix-run/remix/templates/unstable-vite-cloudflare +``` + +#### Bindings + +Bindings for Cloudflare resources can be configured [within `wrangler.toml` for local development][wrangler-toml-bindings] or within the [Cloudflare dashboard for deployments][cloudflare-pages-bindings]. +Then, you can access your bindings via `context.env`. +For example, with a [KV namespace][cloudflare-kv] bound as `MY_KV`: + +```ts filename=app/routes/_index.tsx +export async function loader({ context }) { + const { MY_KV } = context.env; + const value = await MY_KV.get("my-key"); + return json({ value }); +} +``` + +#### Vite & Wrangler + +There are two ways to run your Cloudflare app locally: + +```shellscript nonumber +# Vite +remix vite:dev + +# Wrangler +remix vite:build # build app before running wrangler +wranger pages dev ./build/client +``` + +While Vite provides a better development experience, Wrangler provides closer emulation of the Cloudflare environment by running your server code in [Cloudflare's `workerd` runtime][cloudflare-workerd] instead of Node. +To simulate the Cloudflare environment in Vite, Wrangler provides [Node proxies for resource bindings][wrangler-getbindingsproxy] which are automatically available when using the Remix Cloudflare adapter: + +```ts filename=vite.config.ts lines=[3,10] +import { + unstable_vitePlugin as remix, + unstable_vitePluginAdapterCloudflare as cloudflare, +} from "@remix-run/dev"; +import { defineConfig } from "vite"; + +export default defineConfig({ + plugins: [ + remix({ + adapter: cloudflare(), + }), + ], +}); +``` + +Vite will not use your Cloudflare Pages Functions (`functions/*`) in development as those are purely for Wrangler routing. + ## Splitting up client and server code Remix lets you write code that [runs on both the client and the server][server-vs-client]. @@ -263,7 +318,7 @@ export default defineConfig({ }); ``` -#### Migrating from a custom server +#### Migrating a custom server If you were using a custom server in development, you'll need to edit your custom server to use Vite's `connect` middleware. This will delegate asset requests and initial render requests to Vite during development, letting you benefit from Vite's excellent DX even with a custom server. @@ -349,6 +404,66 @@ node --loader tsm ./server.ts Just remember that there might be some noticeable slowdown for initial server startup if you do this. +#### Migrating Cloudflare Functions + + + +The Remix Vite plugin only officially supports [Cloudflare Pages][cloudflare-pages] which is specifically designed for fullstack applications, unlike [Cloudflare Workers Sites][cloudflare-workers-sites]. If you're currently on Cloudflare Workers Sites, refer to the [Cloudflare Pages migration guide][cloudflare-pages-migration-guide]. + + + +👉 **Add the Cloudflare adapter to your Vite config** + +```ts filename=vite.config.ts lines=[3,10] +import { + unstable_vitePlugin as remix, + unstable_vitePluginAdapterCloudflare as cloudflare, +} from "@remix-run/dev"; +import { defineConfig } from "vite"; + +export default defineConfig({ + plugins: [ + remix({ + adapter: cloudflare(), + }), + ], +}); +``` + +Your Cloudflare app may be setting the [the Remix Config `server` field][remix-config-server] to generate a catch-all Cloudflare Function. +With Vite, this indirection is no longer necessary. +Instead, you can author a catch-all route directly for Cloudflare, just like how you would for Express or any other custom servers. + +👉 **Create a catch-all route for Remix** + +```ts filename=functions/[[page]].ts +import { createPagesFunctionHandler } from "@remix-run/cloudflare-pages"; + +// @ts-ignore - the server build file is generated by `remix vite:build` +import * as build from "../build/server"; + +export const onRequest = createPagesFunctionHandler({ + build, + getLoadContext: (context) => ({ env: context.env }), +}); +``` + +While you'll mostly use Vite during development, you can also use Wrangler to preview and deploy your app. +To learn more, see [_Cloudflare > Vite & Wrangler_](#vite--wrangler). + +👉 **Update your `package.json` scripts** + +```json filename=package.json lines=[3-6] +{ + "scripts": { + "dev": "remix vite:dev", + "build": "remix vite:build", + "preview": "wrangler pages dev ./build/client", + "deploy": "wrangler pages deploy ./build/client" + } +} +``` + #### Migrate references to build output paths When using the existing Remix compiler's default options, the server was compiled into `build` and the client was compiled into `public/build`. Due to differences with the way Vite typically works with its `public` directory compared to the existing Remix compiler, these output paths have changed. @@ -916,6 +1031,23 @@ export default function BoundaryRoute() { You would then nest all other routes within this, e.g. `app/routes/about.tsx` would become `app/routes/_boundary.about.tsx`, etc. +#### Wrangler errors in development + +When using Cloudflare Pages, you may encounter the following error from `wrangler pages dev`: + +```txt nonumber +ERROR: Your worker called response.clone(), but did not read the body of both clones. +This is wasteful, as it forces the system to buffer the entire response body +in memory, rather than streaming it through. This may cause your worker to be +unexpectedly terminated for going over the memory limit. If you only meant to +copy the response headers and metadata (e.g. in order to be able to modify +them), use `new Response(response.body, response)` instead. +``` + +This is a [known issue with Wrangler][cloudflare-request-clone-errors]. + + + ## Acknowledgements Vite is an amazing project, and we're grateful to the Vite team for their work. @@ -938,8 +1070,7 @@ We're definitely late to the Vite party, but we're excited to be here now! [vite]: https://vitejs.dev [supported-with-some-deprecations]: #add-mdx-plugin -[template-vite]: https://github.com/remix-run/remix/tree/main/templates/unstable-vite -[template-vite-express]: https://github.com/remix-run/remix/tree/main/templates/unstable-vite-express +[template-vite-cloudflare]: https://github.com/remix-run/remix/tree/main/templates/unstable-vite-cloudflare [remix-config]: ../file-conventions/remix-config [app-directory]: ../file-conventions/remix-config#appdirectory [assets-build-directory]: ../file-conventions/remix-config#assetsbuilddirectory @@ -1007,3 +1138,13 @@ We're definitely late to the Vite party, but we're excited to be here now! [hydrate-fallback]: ../route/hydrate-fallback [react-canaries]: https://react.dev/blog/2023/05/03/react-canaries [package-overrides]: https://docs.npmjs.com/cli/v10/configuring-npm/package-json#overrides +[wrangler-toml-bindings]: https://developers.cloudflare.com/workers/wrangler/configuration/#bindings +[cloudflare-pages]: https://pages.cloudflare.com +[cloudflare-workers-sites]: https://developers.cloudflare.com/workers/configuration/sites +[cloudflare-pages-migration-guide]: https://developers.cloudflare.com/pages/migrations/migrating-from-workers +[cloudflare-request-clone-errors]: https://github.com/cloudflare/workers-sdk/issues/3259 +[cloudflare-pages-bindings]: https://developers.cloudflare.com/pages/functions/bindings/ +[cloudflare-kv]: https://developers.cloudflare.com/pages/functions/bindings/#kv-namespaces +[cloudflare-workerd]: https://blog.cloudflare.com/workerd-open-source-workers-runtime +[wrangler-getbindingsproxy]: https://github.com/cloudflare/workers-sdk/pull/4523 +[remix-config-server]: https://remix.run/docs/en/main/file-conventions/remix-config#server diff --git a/integration/package.json b/integration/package.json index 9c7654c8048..50d6b69d704 100644 --- a/integration/package.json +++ b/integration/package.json @@ -36,6 +36,7 @@ "type-fest": "^4.0.0", "typescript": "^5.1.0", "vite-env-only": "^2.0.0", - "vite-tsconfig-paths": "^4.2.2" + "vite-tsconfig-paths": "^4.2.2", + "wrangler": "^3.24.0" } } diff --git a/integration/vite-cloudflare-test.ts b/integration/vite-cloudflare-test.ts new file mode 100644 index 00000000000..deff4241247 --- /dev/null +++ b/integration/vite-cloudflare-test.ts @@ -0,0 +1,153 @@ +import { test, expect } from "@playwright/test"; +import getPort from "get-port"; + +import { VITE_CONFIG, createProject, using, viteDev } from "./helpers/vite.js"; + +test.describe("Vite / cloudflare", async () => { + let port: number; + let cwd: string; + + test.beforeAll(async () => { + port = await getPort(); + cwd = await createProject({ + "package.json": JSON.stringify( + { + private: true, + sideEffects: false, + type: "module", + scripts: { + dev: "remix vite:dev", + build: "remix vite:build", + start: "wrangler pages dev ./build/client", + deploy: "wrangler pages deploy ./build/client", + typecheck: "tsc", + }, + dependencies: { + "@remix-run/cloudflare": "*", + "@remix-run/cloudflare-pages": "*", + "@remix-run/react": "*", + isbot: "^4.1.0", + miniflare: "^3.20231030.4", + react: "^18.2.0", + "react-dom": "^18.2.0", + }, + devDependencies: { + "@cloudflare/workers-types": "^4.20230518.0", + "@remix-run/dev": "*", + "@types/react": "^18.2.20", + "@types/react-dom": "^18.2.7", + "node-fetch": "^3.3.2", + typescript: "^5.1.6", + vite: "^5.0.0", + "vite-tsconfig-paths": "^4.2.1", + wrangler: "^3.24.0", + }, + engines: { + node: ">=18.0.0", + }, + }, + null, + 2 + ), + "vite.config.ts": await VITE_CONFIG({ + port, + pluginOptions: `{ adapter: (await import("@remix-run/dev")).unstable_vitePluginAdapterCloudflare() }`, + }), + "functions/[[page]].ts": ` + import { createPagesFunctionHandler } from "@remix-run/cloudflare-pages"; + + // @ts-ignore - the server build file is generated by \`remix vite:build\` + import * as build from "../build/server"; + + export const onRequest = createPagesFunctionHandler({ + build, + getLoadContext: (context) => ({ env: context.env }), + }); + `, + "wrangler.toml": ` + kv_namespaces = [ + { id = "abc123", binding="MY_KV" } + ] + `, + "app/routes/_index.tsx": ` + import { + json, + type LoaderFunctionArgs, + type ActionFunctionArgs, + } from "@remix-run/cloudflare"; + import { Form, useLoaderData } from "@remix-run/react"; + + const key = "__my-key__"; + + export async function loader({ context }: LoaderFunctionArgs) { + const { MY_KV } = context.env; + const value = await MY_KV.get(key); + return json({ value }); + } + + export async function action({ request, context }: ActionFunctionArgs) { + const { MY_KV: myKv } = context.env; + + if (request.method === "POST") { + const formData = await request.formData(); + const value = formData.get("value") as string; + await myKv.put(key, value); + return null; + } + + if (request.method === "DELETE") { + await myKv.delete(key); + return null; + } + + throw new Error(\`Method not supported: "\${request.method}"\`); + } + + export default function Index() { + const { value } = useLoaderData(); + return ( +
+

Welcome to Remix

+ {value ? ( + <> +

Value: {value}

+
+ +
+ + ) : ( + <> +

No value

+
+ + +
+ +
+ + )} +
+ ); + } + `, + }); + }); + + test("vite dev", async ({ page }) => { + await using(await viteDev({ cwd, port }), async () => { + let pageErrors: Error[] = []; + page.on("pageerror", (error) => pageErrors.push(error)); + + await page.goto(`http://localhost:${port}/`, { + waitUntil: "networkidle", + }); + await expect(page.locator("[data-text]")).toHaveText("No value"); + + await page.getByLabel("Set value:").fill("my-value"); + await page.getByRole("button").click(); + await expect(page.locator("[data-text]")).toHaveText("Value: my-value"); + + expect(pageErrors).toEqual([]); + }); + }); +}); diff --git a/packages/remix-cloudflare-pages/worker.ts b/packages/remix-cloudflare-pages/worker.ts index cacc41e38a4..5b24e6e36b9 100644 --- a/packages/remix-cloudflare-pages/worker.ts +++ b/packages/remix-cloudflare-pages/worker.ts @@ -8,14 +8,18 @@ import { createRequestHandler as createRemixRequestHandler } from "@remix-run/cl * You can think of this as an escape hatch that allows you to pass * environment/platform-specific values through to your loader/action. */ -export type GetLoadContextFunction = ( - context: Parameters>[0] +export type GetLoadContextFunction< + Env = unknown, + Params extends string = any, + Data extends Record = Record +> = ( + context: EventContext ) => Promise | AppLoadContext; export type RequestHandler = PagesFunction; export interface createPagesFunctionHandlerParams { - build: ServerBuild; + build: ServerBuild | (() => ServerBuild | Promise); getLoadContext?: GetLoadContextFunction; mode?: string; } diff --git a/packages/remix-dev/index.ts b/packages/remix-dev/index.ts index bbbbcbd41f2..db014d6db65 100644 --- a/packages/remix-dev/index.ts +++ b/packages/remix-dev/index.ts @@ -10,4 +10,7 @@ export type { Unstable_BuildManifest, Unstable_VitePluginAdapter, } from "./vite"; -export { unstable_vitePlugin } from "./vite"; +export { + unstable_vitePlugin, + unstable_vitePluginAdapterCloudflare, +} from "./vite"; diff --git a/packages/remix-dev/package.json b/packages/remix-dev/package.json index beb0f6b15f6..960d4241099 100644 --- a/packages/remix-dev/package.json +++ b/packages/remix-dev/package.json @@ -91,12 +91,14 @@ "msw": "^1.2.3", "strip-ansi": "^6.0.1", "tiny-invariant": "^1.2.0", - "vite": "^5.0.0" + "vite": "^5.0.0", + "wrangler": "^3.24.0" }, "peerDependencies": { "@remix-run/serve": "^2.5.1", "typescript": "^5.1.0", - "vite": "^5.0.0" + "vite": "^5.0.0", + "wrangler": "^3.24.0" }, "peerDependenciesMeta": { "@remix-run/serve": { @@ -107,6 +109,9 @@ }, "vite": { "optional": true + }, + "wrangler": { + "optional": true } }, "engines": { diff --git a/packages/remix-dev/vite/adapters/cloudflare.ts b/packages/remix-dev/vite/adapters/cloudflare.ts new file mode 100644 index 00000000000..88983bf471c --- /dev/null +++ b/packages/remix-dev/vite/adapters/cloudflare.ts @@ -0,0 +1,13 @@ +export const adapter = () => async () => { + let { getBindingsProxy } = await import("wrangler"); + let { bindings } = await getBindingsProxy(); + let loadContext = bindings && { env: bindings }; + let viteConfig = { + ssr: { + resolve: { + externalConditions: ["workerd", "worker"], + }, + }, + }; + return { viteConfig, loadContext }; +}; diff --git a/packages/remix-dev/vite/index.ts b/packages/remix-dev/vite/index.ts index 2cc7075c144..332ab2816b0 100644 --- a/packages/remix-dev/vite/index.ts +++ b/packages/remix-dev/vite/index.ts @@ -12,3 +12,5 @@ export const unstable_vitePlugin: RemixVitePlugin = (...args) => { let { remixVitePlugin } = require("./plugin") as typeof import("./plugin"); return remixVitePlugin(...args); }; + +export { adapter as unstable_vitePluginAdapterCloudflare } from "./adapters/cloudflare"; diff --git a/packages/remix-dev/vite/node-adapter.ts b/packages/remix-dev/vite/node-adapter.ts new file mode 100644 index 00000000000..8abd0422b06 --- /dev/null +++ b/packages/remix-dev/vite/node-adapter.ts @@ -0,0 +1,85 @@ +import type { + IncomingHttpHeaders, + IncomingMessage, + ServerResponse, +} from "node:http"; +import { once } from "node:events"; +import { Readable } from "node:stream"; +import { splitCookiesString } from "set-cookie-parser"; +import { createReadableStreamFromReadable } from "@remix-run/node"; + +import invariant from "../invariant"; + +export type NodeRequestHandler = ( + req: IncomingMessage, + res: ServerResponse +) => Promise; + +function fromNodeHeaders(nodeHeaders: IncomingHttpHeaders): Headers { + let headers = new Headers(); + + for (let [key, values] of Object.entries(nodeHeaders)) { + if (values) { + if (Array.isArray(values)) { + for (let value of values) { + headers.append(key, value); + } + } else { + headers.set(key, values); + } + } + } + + return headers; +} + +// Based on `createRemixRequest` in packages/remix-express/server.ts +export function fromNodeRequest(nodeReq: IncomingMessage): Request { + let origin = + nodeReq.headers.origin && "null" !== nodeReq.headers.origin + ? nodeReq.headers.origin + : `http://${nodeReq.headers.host}`; + invariant(nodeReq.url, 'Expected "req.url" to be defined'); + let url = new URL(nodeReq.url, origin); + + let init: RequestInit = { + method: nodeReq.method, + headers: fromNodeHeaders(nodeReq.headers), + }; + + if (nodeReq.method !== "GET" && nodeReq.method !== "HEAD") { + init.body = createReadableStreamFromReadable(nodeReq); + (init as { duplex: "half" }).duplex = "half"; + } + + return new Request(url.href, init); +} + +// Adapted from solid-start's `handleNodeResponse`: +// https://github.com/solidjs/solid-start/blob/7398163869b489cce503c167e284891cf51a6613/packages/start/node/fetch.js#L162-L185 +export async function toNodeRequest(res: Response, nodeRes: ServerResponse) { + nodeRes.statusCode = res.status; + nodeRes.statusMessage = res.statusText; + + let cookiesStrings = []; + + for (let [name, value] of res.headers) { + if (name === "set-cookie") { + cookiesStrings.push(...splitCookiesString(value)); + } else nodeRes.setHeader(name, value); + } + + if (cookiesStrings.length) { + nodeRes.setHeader("set-cookie", cookiesStrings); + } + + if (res.body) { + // https://github.com/microsoft/TypeScript/issues/29867 + let responseBody = res.body as unknown as AsyncIterable; + let readable = Readable.from(responseBody); + readable.pipe(nodeRes); + await once(readable, "end"); + } else { + nodeRes.end(); + } +} diff --git a/packages/remix-dev/vite/node/adapter.ts b/packages/remix-dev/vite/node/adapter.ts deleted file mode 100644 index 204b649c28a..00000000000 --- a/packages/remix-dev/vite/node/adapter.ts +++ /dev/null @@ -1,96 +0,0 @@ -import type { - IncomingHttpHeaders, - IncomingMessage, - ServerResponse, -} from "node:http"; -import { once } from "node:events"; -import { Readable } from "node:stream"; -import { splitCookiesString } from "set-cookie-parser"; -import { - type ServerBuild, - createReadableStreamFromReadable, -} from "@remix-run/node"; -import { createRequestHandler as createBaseRequestHandler } from "@remix-run/server-runtime"; - -import invariant from "../../invariant"; - -function createHeaders(requestHeaders: IncomingHttpHeaders) { - let headers = new Headers(); - - for (let [key, values] of Object.entries(requestHeaders)) { - if (values) { - if (Array.isArray(values)) { - for (let value of values) { - headers.append(key, value); - } - } else { - headers.set(key, values); - } - } - } - - return headers; -} - -// Based on `createRemixRequest` in packages/remix-express/server.ts -function createRequest(req: IncomingMessage, res: ServerResponse): Request { - let origin = - req.headers.origin && "null" !== req.headers.origin - ? req.headers.origin - : `http://${req.headers.host}`; - invariant(req.url, 'Expected "req.url" to be defined'); - let url = new URL(req.url, origin); - - let init: RequestInit = { - method: req.method, - headers: createHeaders(req.headers), - }; - - if (req.method !== "GET" && req.method !== "HEAD") { - init.body = createReadableStreamFromReadable(req); - (init as { duplex: "half" }).duplex = "half"; - } - - return new Request(url.href, init); -} - -// Adapted from solid-start's `handleNodeResponse`: -// https://github.com/solidjs/solid-start/blob/7398163869b489cce503c167e284891cf51a6613/packages/start/node/fetch.js#L162-L185 -async function handleNodeResponse(webRes: Response, res: ServerResponse) { - res.statusCode = webRes.status; - res.statusMessage = webRes.statusText; - - let cookiesStrings = []; - - for (let [name, value] of webRes.headers) { - if (name === "set-cookie") { - cookiesStrings.push(...splitCookiesString(value)); - } else res.setHeader(name, value); - } - - if (cookiesStrings.length) { - res.setHeader("set-cookie", cookiesStrings); - } - - if (webRes.body) { - // https://github.com/microsoft/TypeScript/issues/29867 - let responseBody = webRes.body as unknown as AsyncIterable; - let readable = Readable.from(responseBody); - readable.pipe(res); - await once(readable, "end"); - } else { - res.end(); - } -} - -export let createRequestHandler = ( - build: ServerBuild, - { mode = "production" }: { mode?: string } -) => { - let handler = createBaseRequestHandler(build, mode); - return async (req: IncomingMessage, res: ServerResponse) => { - let request = createRequest(req, res); - let response = await handler(request, {}); - handleNodeResponse(response, res); - }; -}; diff --git a/packages/remix-dev/vite/plugin.ts b/packages/remix-dev/vite/plugin.ts index 6cf2e561c95..8558b1c78f3 100644 --- a/packages/remix-dev/vite/plugin.ts +++ b/packages/remix-dev/vite/plugin.ts @@ -9,6 +9,7 @@ import babel from "@babel/core"; import { type ServerBuild, unstable_setDevServerHooks as setDevServerHooks, + createRequestHandler, } from "@remix-run/server-runtime"; import { init as initEsModuleLexer, @@ -27,7 +28,11 @@ import { } from "../config"; import { type Manifest as BrowserManifest } from "../manifest"; import invariant from "../invariant"; -import { createRequestHandler } from "./node/adapter"; +import { + type NodeRequestHandler, + fromNodeRequest, + toNodeRequest, +} from "./node-adapter"; import { getStylesForUrl, isCssModulesFile } from "./styles"; import * as VirtualModule from "./vmod"; import { resolveFileUrl } from "./resolve-file-url"; @@ -124,13 +129,16 @@ type AdapterRemixConfigOverrides = Pick< >; type AdapterConfig = AdapterRemixConfigOverrides & { + loadContext?: Record; buildEnd?: BuildEndHook; + viteConfig: Vite.UserConfig; }; type Adapter = Omit; export type VitePluginAdapter = (args: { remixConfig: VitePluginConfig; + viteConfig: Vite.UserConfig; }) => AdapterConfig | Promise; export type VitePluginConfig = RemixEsbuildUserConfigJsdocOverrides & @@ -454,6 +462,7 @@ export const remixVitePlugin: RemixVitePlugin = (remixUserConfig = {}) => { // We only pass in the plugin config that the user defined. We don't // know the final resolved config until the adapter has been resolved. remixConfig: remixUserConfig, + viteConfig: viteUserConfig, }) : undefined; let adapter: Adapter | undefined = @@ -738,7 +747,7 @@ export const remixVitePlugin: RemixVitePlugin = (remixUserConfig = {}) => { ) ); - return { + let defaults = { __remixPluginContext: ctx, appType: "custom", experimental: { hmrPartialAccept: true }, @@ -784,13 +793,11 @@ export const remixVitePlugin: RemixVitePlugin = (remixUserConfig = {}) => { ...(viteCommand === "build" && { base: ctx.remixConfig.publicPath, build: { - ...viteUserConfig.build, ...(!viteConfigEnv.isSsrBuild ? { manifest: true, outDir: getClientBuildDirectory(ctx.remixConfig), rollupOptions: { - ...viteUserConfig.build?.rollupOptions, preserveEntrySignatures: "exports-only", input: [ ctx.entryClientFilePath, @@ -815,7 +822,6 @@ export const remixVitePlugin: RemixVitePlugin = (remixUserConfig = {}) => { manifest: true, // We need the manifest to detect SSR-only assets outDir: getServerBuildDirectory(ctx), rollupOptions: { - ...viteUserConfig.build?.rollupOptions, preserveEntrySignatures: "exports-only", input: serverBuildId, output: { @@ -827,6 +833,10 @@ export const remixVitePlugin: RemixVitePlugin = (remixUserConfig = {}) => { }, }), }; + return vite.mergeConfig( + defaults, + ctx.remixConfig.adapter?.viteConfig ?? {} + ); }, async configResolved(resolvedViteConfig) { await initEsModuleLexer; @@ -944,7 +954,7 @@ export const remixVitePlugin: RemixVitePlugin = (remixUserConfig = {}) => { ); } }, - configureServer(viteDevServer) { + async configureServer(viteDevServer) { setDevServerHooks({ // Give the request handler access to the critical CSS in dev to avoid a // flash of unstyled content since Vite injects CSS file contents via JS @@ -1004,11 +1014,17 @@ export const remixVitePlugin: RemixVitePlugin = (remixUserConfig = {}) => { serverBuildId )) as ServerBuild; - let handle = createRequestHandler(build, { - mode: "development", - }); - - await handle(req, res); + let handler = createRequestHandler(build, "development"); + let nodeHandler: NodeRequestHandler = async ( + nodeReq, + nodeRes + ) => { + let req = fromNodeRequest(nodeReq); + let { adapter } = ctx.remixConfig; + let res = await handler(req, adapter?.loadContext); + await toNodeRequest(res, nodeRes); + }; + await nodeHandler(req, res); } catch (error) { next(error); } diff --git a/packages/remix-server-runtime/server.ts b/packages/remix-server-runtime/server.ts index e205828dc02..a477d3db58a 100644 --- a/packages/remix-server-runtime/server.ts +++ b/packages/remix-server-runtime/server.ts @@ -36,7 +36,7 @@ export type RequestHandler = ( ) => Promise; export type CreateRequestHandlerFunction = ( - build: ServerBuild | (() => Promise), + build: ServerBuild | (() => ServerBuild | Promise), mode?: string ) => RequestHandler; @@ -81,6 +81,7 @@ export const createRequestHandler: CreateRequestHandlerFunction = ( return async function requestHandler(request, loadContext = {}) { _build = typeof build === "function" ? await build() : build; + mode ??= _build.mode; if (typeof build === "function") { let derived = derive(_build, mode); routes = derived.routes; diff --git a/templates/unstable-vite-cloudflare/.eslintrc.cjs b/templates/unstable-vite-cloudflare/.eslintrc.cjs new file mode 100644 index 00000000000..8f2bbcd8af9 --- /dev/null +++ b/templates/unstable-vite-cloudflare/.eslintrc.cjs @@ -0,0 +1,83 @@ +/** + * This is intended to be a basic starting point for linting in your app. + * It relies on recommended configs out of the box for simplicity, but you can + * and should modify this configuration to best suit your team's needs. + */ + +/** @type {import('eslint').Linter.Config} */ +module.exports = { + root: true, + parserOptions: { + ecmaVersion: "latest", + sourceType: "module", + ecmaFeatures: { + jsx: true, + }, + }, + env: { + browser: true, + commonjs: true, + es6: true, + }, + + // Base config + extends: ["eslint:recommended"], + + overrides: [ + // React + { + files: ["**/*.{js,jsx,ts,tsx}"], + plugins: ["react", "jsx-a11y"], + extends: [ + "plugin:react/recommended", + "plugin:react/jsx-runtime", + "plugin:react-hooks/recommended", + "plugin:jsx-a11y/recommended", + ], + settings: { + react: { + version: "detect", + }, + formComponents: ["Form"], + linkComponents: [ + { name: "Link", linkAttribute: "to" }, + { name: "NavLink", linkAttribute: "to" }, + ], + "import/resolver": { + typescript: {}, + }, + }, + }, + + // Typescript + { + files: ["**/*.{ts,tsx}"], + plugins: ["@typescript-eslint", "import"], + parser: "@typescript-eslint/parser", + settings: { + "import/internal-regex": "^~/", + "import/resolver": { + node: { + extensions: [".ts", ".tsx"], + }, + typescript: { + alwaysTryTypes: true, + }, + }, + }, + extends: [ + "plugin:@typescript-eslint/recommended", + "plugin:import/recommended", + "plugin:import/typescript", + ], + }, + + // Node + { + files: [".eslintrc.js"], + env: { + node: true, + }, + }, + ], +}; diff --git a/templates/unstable-vite-cloudflare/.gitignore b/templates/unstable-vite-cloudflare/.gitignore new file mode 100644 index 00000000000..541e1f23367 --- /dev/null +++ b/templates/unstable-vite-cloudflare/.gitignore @@ -0,0 +1,7 @@ +node_modules + +/.cache +/build +.env + +.wrangler diff --git a/templates/unstable-vite-cloudflare/README.md b/templates/unstable-vite-cloudflare/README.md new file mode 100644 index 00000000000..c05e097d923 --- /dev/null +++ b/templates/unstable-vite-cloudflare/README.md @@ -0,0 +1,36 @@ +# Welcome to Remix + Vite! + +📖 See the [Remix docs](https://remix.run/docs) and the [Remix Vite docs](https://remix.run/docs/en/main/future/vite) for details on supported features. + +## Development + +Run the Vite dev server: + +```shellscript +npm run dev +``` + +## Deployment + +First, build your app for production: + +```sh +npm run build +``` + +Then run the app in production mode: + +```sh +npm start +``` + +Now you'll need to pick a host to deploy it to. + +### DIY + +If you're familiar with deploying Node applications, the built-in Remix app server is production-ready. + +Make sure to deploy the output of `npm run build` + +- `build/server` +- `build/client` diff --git a/templates/unstable-vite-cloudflare/app/root.tsx b/templates/unstable-vite-cloudflare/app/root.tsx new file mode 100644 index 00000000000..1d6916394c3 --- /dev/null +++ b/templates/unstable-vite-cloudflare/app/root.tsx @@ -0,0 +1,27 @@ +import { + Links, + LiveReload, + Meta, + Outlet, + Scripts, + ScrollRestoration, +} from "@remix-run/react"; + +export default function App() { + return ( + + + + + + + + + + + + + + + ); +} diff --git a/templates/unstable-vite-cloudflare/app/routes/_index.tsx b/templates/unstable-vite-cloudflare/app/routes/_index.tsx new file mode 100644 index 00000000000..cad20670fcd --- /dev/null +++ b/templates/unstable-vite-cloudflare/app/routes/_index.tsx @@ -0,0 +1,59 @@ +import { + json, + type LoaderFunctionArgs, + type ActionFunctionArgs, +} from "@remix-run/cloudflare"; +import { Form, useLoaderData } from "@remix-run/react"; + +const key = "__my-key__"; + +export async function loader({ context }: LoaderFunctionArgs) { + const { MY_KV } = context.env; + const value = await MY_KV.get(key); + return json({ value }); +} + +export async function action({ request, context }: ActionFunctionArgs) { + const { MY_KV: myKv } = context.env; + + if (request.method === "POST") { + const formData = await request.formData(); + const value = formData.get("value") as string; + await myKv.put(key, value); + return null; + } + + if (request.method === "DELETE") { + await myKv.delete(key); + return null; + } + + throw new Error(`Method not supported: "${request.method}"`); +} + +export default function Index() { + const { value } = useLoaderData(); + return ( +
+

Welcome to Remix

+ {value ? ( + <> +

Value: {value}

+
+ +
+ + ) : ( + <> +

No value

+
+ + +
+ +
+ + )} +
+ ); +} diff --git a/templates/unstable-vite-cloudflare/env.d.ts b/templates/unstable-vite-cloudflare/env.d.ts new file mode 100644 index 00000000000..73677952eed --- /dev/null +++ b/templates/unstable-vite-cloudflare/env.d.ts @@ -0,0 +1,12 @@ +/// +/// + +import type { KVNamespace } from "@cloudflare/workers-types"; + +declare module "@remix-run/cloudflare" { + interface AppLoadContext { + env: { + MY_KV: KVNamespace; + }; + } +} diff --git a/templates/unstable-vite-cloudflare/functions/[[path]].ts b/templates/unstable-vite-cloudflare/functions/[[path]].ts new file mode 100644 index 00000000000..5ae9958f145 --- /dev/null +++ b/templates/unstable-vite-cloudflare/functions/[[path]].ts @@ -0,0 +1,11 @@ +import { createPagesFunctionHandler } from "@remix-run/cloudflare-pages"; + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore - the server build file is generated by `remix vite:build` +// eslint-disable-next-line import/no-unresolved +import * as build from "../build/server"; + +export const onRequest = createPagesFunctionHandler({ + build, + getLoadContext: (context) => ({ env: context.env }), +}); diff --git a/templates/unstable-vite-cloudflare/package.json b/templates/unstable-vite-cloudflare/package.json new file mode 100644 index 00000000000..0c6df05def1 --- /dev/null +++ b/templates/unstable-vite-cloudflare/package.json @@ -0,0 +1,44 @@ +{ + "private": true, + "sideEffects": false, + "type": "module", + "scripts": { + "dev": "remix vite:dev", + "build": "remix vite:build", + "start": "wrangler pages dev ./build/client", + "deploy": "wrangler pages deploy ./build/client", + "lint": "eslint --ignore-path .gitignore --cache --cache-location ./node_modules/.cache/eslint .", + "typecheck": "tsc" + }, + "dependencies": { + "@remix-run/cloudflare": "*", + "@remix-run/cloudflare-pages": "*", + "@remix-run/react": "*", + "isbot": "^4.1.0", + "miniflare": "^3.20231030.4", + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@cloudflare/workers-types": "^4.20230518.0", + "@remix-run/dev": "*", + "@types/react": "^18.2.20", + "@types/react-dom": "^18.2.7", + "@typescript-eslint/eslint-plugin": "^6.7.4", + "eslint": "^8.38.0", + "eslint-config-prettier": "^9.0.0", + "eslint-import-resolver-typescript": "^3.6.1", + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.6.0", + "node-fetch": "^3.3.2", + "typescript": "^5.1.6", + "vite": "^5.0.0", + "vite-tsconfig-paths": "^4.2.1", + "wrangler": "^3.24.0" + }, + "engines": { + "node": ">=18.0.0" + } +} diff --git a/templates/unstable-vite-cloudflare/public/favicon.ico b/templates/unstable-vite-cloudflare/public/favicon.ico new file mode 100644 index 00000000000..8830cf6821b Binary files /dev/null and b/templates/unstable-vite-cloudflare/public/favicon.ico differ diff --git a/templates/unstable-vite-cloudflare/tsconfig.json b/templates/unstable-vite-cloudflare/tsconfig.json new file mode 100644 index 00000000000..77291a91091 --- /dev/null +++ b/templates/unstable-vite-cloudflare/tsconfig.json @@ -0,0 +1,24 @@ +{ + "include": ["env.d.ts", "**/*.ts", "**/*.tsx"], + "compilerOptions": { + "lib": ["DOM", "DOM.Iterable", "ES2022"], + "isolatedModules": true, + "esModuleInterop": true, + "jsx": "react-jsx", + "module": "ESNext", + "moduleResolution": "Bundler", + "resolveJsonModule": true, + "target": "ES2022", + "strict": true, + "allowJs": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "baseUrl": ".", + "paths": { + "~/*": ["./app/*"] + }, + + // Vite takes care of building everything, not tsc. + "noEmit": true + } +} diff --git a/templates/unstable-vite-cloudflare/vite.config.ts b/templates/unstable-vite-cloudflare/vite.config.ts new file mode 100644 index 00000000000..ebb089b505a --- /dev/null +++ b/templates/unstable-vite-cloudflare/vite.config.ts @@ -0,0 +1,15 @@ +import { + unstable_vitePlugin as remix, + unstable_vitePluginAdapterCloudflare as cloudflare, +} from "@remix-run/dev"; +import { defineConfig } from "vite"; +import tsconfigPaths from "vite-tsconfig-paths"; + +export default defineConfig({ + plugins: [ + remix({ + adapter: cloudflare(), + }), + tsconfigPaths(), + ], +}); diff --git a/templates/unstable-vite-cloudflare/wrangler.toml b/templates/unstable-vite-cloudflare/wrangler.toml new file mode 100644 index 00000000000..83dfc02cf88 --- /dev/null +++ b/templates/unstable-vite-cloudflare/wrangler.toml @@ -0,0 +1,3 @@ +kv_namespaces = [ + { id = "MY_KV", binding="MY_KV" } +] diff --git a/yarn.lock b/yarn.lock index 8fe96ca5cc4..3996047c337 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1258,6 +1258,13 @@ dependencies: mime "^2.5.2" +"@cloudflare/kv-asset-handler@^0.2.0": + version "0.2.0" + resolved "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.2.0.tgz#c9959bbd7a1c40bd7c674adae98aa8c8d0e5ca68" + integrity sha512-MVbXLbTcAotOPUj0pAMhVtJ+3/kFkwJqc5qNOleOZTv6QkZZABDMS21dSrSlVswEHwrpWC03e4fWytjqKvuE2A== + dependencies: + mime "^3.0.0" + "@cloudflare/kv-asset-handler@^0.3.0": version "0.3.0" resolved "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.3.0.tgz#11f0af0749a400ddadcca16dcd6f4696d7036991" @@ -1265,6 +1272,31 @@ dependencies: mime "^3.0.0" +"@cloudflare/workerd-darwin-64@1.20231218.0": + version "1.20231218.0" + resolved "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20231218.0.tgz#e887296a6bfa707b2e02dbf5168582cd3afb800c" + integrity sha512-547gOmTIVmRdDy7HNAGJUPELa+fSDm2Y0OCxqAtQOz0GLTDu1vX61xYmsb2rn91+v3xW6eMttEIpbYokKjtfJA== + +"@cloudflare/workerd-darwin-arm64@1.20231218.0": + version "1.20231218.0" + resolved "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20231218.0.tgz#9346de61b74324b09e3ef83e1666ffc84f1c4559" + integrity sha512-b39qrU1bKolCfmKFDAnX4vXcqzISkEUVE/V8sMBsFzxrIpNAbcUHBZAQPYmS/OHIGB94KjOVokvDi7J6UNurPw== + +"@cloudflare/workerd-linux-64@1.20231218.0": + version "1.20231218.0" + resolved "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20231218.0.tgz#7d21aaa0b4a97f9d7769fa6af2e484538f7e3713" + integrity sha512-dMUF1wA+0mybm6hHNOCgY/WMNMwomPPs4I7vvYCgwHSkch0Q2Wb7TnxQZSt8d1PK/myibaBwadrlIxpjxmpz3w== + +"@cloudflare/workerd-linux-arm64@1.20231218.0": + version "1.20231218.0" + resolved "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20231218.0.tgz#e8280275379aca868886db7d2491517be3f473f4" + integrity sha512-2s5uc8IHt0QmWyKxAr1Fy+4b8Xy0b/oUtlPnm5MrKi2gDRlZzR7JvxENPJCpCnYENydS8lzvkMiAFECPBccmyQ== + +"@cloudflare/workerd-windows-64@1.20231218.0": + version "1.20231218.0" + resolved "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20231218.0.tgz#85fc18f18f7c6593b427c58bf58224850f706d20" + integrity sha512-oN5hz6TXUDB5YKUN5N3QWAv6cYz9JjTZ9g16HVyoegVFEL6/zXU3tV19MBX2IvlE11ab/mRogEv9KXVIrHfKmA== + "@cloudflare/workers-types@^4.20230518.0": version "4.20230628.0" resolved "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20230628.0.tgz#2aacc7ec8c250cd02213b331f1e267cc25db7299" @@ -1275,6 +1307,13 @@ resolved "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz" integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== +"@cspotcode/source-map-support@0.8.1": + version "0.8.1" + resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + "@cypress/request@^2.88.10": version "2.88.10" resolved "https://registry.npmjs.org/@cypress/request/-/request-2.88.10.tgz" @@ -1312,6 +1351,24 @@ resolved "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.0.tgz" integrity sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ== +"@esbuild-plugins/node-globals-polyfill@^0.2.3": + version "0.2.3" + resolved "https://registry.npmjs.org/@esbuild-plugins/node-globals-polyfill/-/node-globals-polyfill-0.2.3.tgz#0e4497a2b53c9e9485e149bc92ddb228438d6bcf" + integrity sha512-r3MIryXDeXDOZh7ih1l/yE9ZLORCd5e8vWg02azWRGj5SPTuoh69A2AIyn0Z31V/kHBfZ4HgWJ+OK3GTTwLmnw== + +"@esbuild-plugins/node-modules-polyfill@^0.2.2": + version "0.2.2" + resolved "https://registry.npmjs.org/@esbuild-plugins/node-modules-polyfill/-/node-modules-polyfill-0.2.2.tgz#cefa3dc0bd1c16277a8338b52833420c94987327" + integrity sha512-LXV7QsWJxRuMYvKbiznh+U1ilIop3g2TeKRzUxOG5X3YITc8JyyTa90BmLwqqv0YnX4v32CSlG+vsziZp9dMvA== + dependencies: + escape-string-regexp "^4.0.0" + rollup-plugin-node-polyfills "^0.2.1" + +"@esbuild/android-arm64@0.17.19": + version "0.17.19" + resolved "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz#bafb75234a5d3d1b690e7c2956a599345e84a2fd" + integrity sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA== + "@esbuild/android-arm64@0.17.6": version "0.17.6" resolved "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.6.tgz#b11bd4e4d031bb320c93c83c137797b2be5b403b" @@ -1327,6 +1384,11 @@ resolved "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.5.tgz#276c5f99604054d3dbb733577e09adae944baa90" integrity sha512-5d1OkoJxnYQfmC+Zd8NBFjkhyCNYwM4n9ODrycTFY6Jk1IGiZ+tjVJDDSwDt77nK+tfpGP4T50iMtVi4dEGzhQ== +"@esbuild/android-arm@0.17.19": + version "0.17.19" + resolved "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz#5898f7832c2298bc7d0ab53701c57beb74d78b4d" + integrity sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A== + "@esbuild/android-arm@0.17.6": version "0.17.6" resolved "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.6.tgz#ac6b5674da2149997f6306b3314dae59bbe0ac26" @@ -1342,6 +1404,11 @@ resolved "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.5.tgz#4a3cbf14758166abaae8ba9c01a80e68342a4eec" integrity sha512-bhvbzWFF3CwMs5tbjf3ObfGqbl/17ict2/uwOSfr3wmxDE6VdS2GqY/FuzIPe0q0bdhj65zQsvqfArI9MY6+AA== +"@esbuild/android-x64@0.17.19": + version "0.17.19" + resolved "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz#658368ef92067866d95fb268719f98f363d13ae1" + integrity sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww== + "@esbuild/android-x64@0.17.6": version "0.17.6" resolved "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.6.tgz#18c48bf949046638fc209409ff684c6bb35a5462" @@ -1357,6 +1424,11 @@ resolved "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.5.tgz#21a3d11cd4613d2d3c5ccb9e746c254eb9265b0a" integrity sha512-9t+28jHGL7uBdkBjL90QFxe7DVA+KGqWlHCF8ChTKyaKO//VLuoBricQCgwhOjA1/qOczsw843Fy4cbs4H3DVA== +"@esbuild/darwin-arm64@0.17.19": + version "0.17.19" + resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz#584c34c5991b95d4d48d333300b1a4e2ff7be276" + integrity sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg== + "@esbuild/darwin-arm64@0.17.6": version "0.17.6" resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.6.tgz#b3fe19af1e4afc849a07c06318124e9c041e0646" @@ -1372,6 +1444,11 @@ resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.5.tgz#714cb839f467d6a67b151ee8255886498e2b9bf6" integrity sha512-mvXGcKqqIqyKoxq26qEDPHJuBYUA5KizJncKOAf9eJQez+L9O+KfvNFu6nl7SCZ/gFb2QPaRqqmG0doSWlgkqw== +"@esbuild/darwin-x64@0.17.19": + version "0.17.19" + resolved "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz#7751d236dfe6ce136cce343dce69f52d76b7f6cb" + integrity sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw== + "@esbuild/darwin-x64@0.17.6": version "0.17.6" resolved "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.6.tgz#f4dacd1ab21e17b355635c2bba6a31eba26ba569" @@ -1387,6 +1464,11 @@ resolved "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.5.tgz#2c553e97a6d2b4ae76a884e35e6cbab85a990bbf" integrity sha512-Ly8cn6fGLNet19s0X4unjcniX24I0RqjPv+kurpXabZYSXGM4Pwpmf85WHJN3lAgB8GSth7s5A0r856S+4DyiA== +"@esbuild/freebsd-arm64@0.17.19": + version "0.17.19" + resolved "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz#cacd171665dd1d500f45c167d50c6b7e539d5fd2" + integrity sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ== + "@esbuild/freebsd-arm64@0.17.6": version "0.17.6" resolved "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.6.tgz#ea4531aeda70b17cbe0e77b0c5c36298053855b4" @@ -1402,6 +1484,11 @@ resolved "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.5.tgz#d554f556718adb31917a0da24277bf84b6ee87f3" integrity sha512-GGDNnPWTmWE+DMchq1W8Sd0mUkL+APvJg3b11klSGUDvRXh70JqLAO56tubmq1s2cgpVCSKYywEiKBfju8JztQ== +"@esbuild/freebsd-x64@0.17.19": + version "0.17.19" + resolved "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz#0769456eee2a08b8d925d7c00b79e861cb3162e4" + integrity sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ== + "@esbuild/freebsd-x64@0.17.6": version "0.17.6" resolved "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.6.tgz#1896170b3c9f63c5e08efdc1f8abc8b1ed7af29f" @@ -1417,6 +1504,11 @@ resolved "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.5.tgz#288f7358a3bb15d99e73c65c9adaa3dabb497432" integrity sha512-1CCwDHnSSoA0HNwdfoNY0jLfJpd7ygaLAp5EHFos3VWJCRX9DMwWODf96s9TSse39Br7oOTLryRVmBoFwXbuuQ== +"@esbuild/linux-arm64@0.17.19": + version "0.17.19" + resolved "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz#38e162ecb723862c6be1c27d6389f48960b68edb" + integrity sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg== + "@esbuild/linux-arm64@0.17.6": version "0.17.6" resolved "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.6.tgz#967dfb951c6b2de6f2af82e96e25d63747f75079" @@ -1432,6 +1524,11 @@ resolved "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.5.tgz#95933ae86325c93cb6b5e8333d22120ecfdc901b" integrity sha512-o3vYippBmSrjjQUCEEiTZ2l+4yC0pVJD/Dl57WfPwwlvFkrxoSO7rmBZFii6kQB3Wrn/6GwJUPLU5t52eq2meA== +"@esbuild/linux-arm@0.17.19": + version "0.17.19" + resolved "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz#1a2cd399c50040184a805174a6d89097d9d1559a" + integrity sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA== + "@esbuild/linux-arm@0.17.6": version "0.17.6" resolved "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.6.tgz#097a0ee2be39fed3f37ea0e587052961e3bcc110" @@ -1447,6 +1544,11 @@ resolved "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.5.tgz#0acef93aa3e0579e46d33b666627bddb06636664" integrity sha512-lrWXLY/vJBzCPC51QN0HM71uWgIEpGSjSZZADQhq7DKhPcI6NH1IdzjfHkDQws2oNpJKpR13kv7/pFHBbDQDwQ== +"@esbuild/linux-ia32@0.17.19": + version "0.17.19" + resolved "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz#e28c25266b036ce1cabca3c30155222841dc035a" + integrity sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ== + "@esbuild/linux-ia32@0.17.6": version "0.17.6" resolved "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.6.tgz#a38a789d0ed157495a6b5b4469ec7868b59e5278" @@ -1462,6 +1564,11 @@ resolved "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.5.tgz#b6e5c9e80b42131cbd6b1ddaa48c92835f1ed67f" integrity sha512-MkjHXS03AXAkNp1KKkhSKPOCYztRtK+KXDNkBa6P78F8Bw0ynknCSClO/ztGszILZtyO/lVKpa7MolbBZ6oJtQ== +"@esbuild/linux-loong64@0.17.19": + version "0.17.19" + resolved "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz#0f887b8bb3f90658d1a0117283e55dbd4c9dcf72" + integrity sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ== + "@esbuild/linux-loong64@0.17.6": version "0.17.6" resolved "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.6.tgz#ae3983d0fb4057883c8246f57d2518c2af7cf2ad" @@ -1477,6 +1584,11 @@ resolved "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.5.tgz#e5f0cf95a180158b01ff5f417da796a1c09dfbea" integrity sha512-42GwZMm5oYOD/JHqHska3Jg0r+XFb/fdZRX+WjADm3nLWLcIsN27YKtqxzQmGNJgu0AyXg4HtcSK9HuOk3v1Dw== +"@esbuild/linux-mips64el@0.17.19": + version "0.17.19" + resolved "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz#f5d2a0b8047ea9a5d9f592a178ea054053a70289" + integrity sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A== + "@esbuild/linux-mips64el@0.17.6": version "0.17.6" resolved "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.6.tgz#15fbbe04648d944ec660ee5797febdf09a9bd6af" @@ -1492,6 +1604,11 @@ resolved "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.5.tgz#ae36fb86c7d5f641f3a0c8472e83dcb6ea36a408" integrity sha512-kcjndCSMitUuPJobWCnwQ9lLjiLZUR3QLQmlgaBfMX23UEa7ZOrtufnRds+6WZtIS9HdTXqND4yH8NLoVVIkcg== +"@esbuild/linux-ppc64@0.17.19": + version "0.17.19" + resolved "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz#876590e3acbd9fa7f57a2c7d86f83717dbbac8c7" + integrity sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg== + "@esbuild/linux-ppc64@0.17.6": version "0.17.6" resolved "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.6.tgz#38210094e8e1a971f2d1fd8e48462cc65f15ef19" @@ -1507,6 +1624,11 @@ resolved "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.5.tgz#7960cb1666f0340ddd9eef7b26dcea3835d472d0" integrity sha512-yJAxJfHVm0ZbsiljbtFFP1BQKLc8kUF6+17tjQ78QjqjAQDnhULWiTA6u0FCDmYT1oOKS9PzZ2z0aBI+Mcyj7Q== +"@esbuild/linux-riscv64@0.17.19": + version "0.17.19" + resolved "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz#7f49373df463cd9f41dc34f9b2262d771688bf09" + integrity sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA== + "@esbuild/linux-riscv64@0.17.6": version "0.17.6" resolved "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.6.tgz#bc3c66d5578c3b9951a6ed68763f2a6856827e4a" @@ -1522,6 +1644,11 @@ resolved "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.5.tgz#32207df26af60a3a9feea1783fc21b9817bade19" integrity sha512-5u8cIR/t3gaD6ad3wNt1MNRstAZO+aNyBxu2We8X31bA8XUNyamTVQwLDA1SLoPCUehNCymhBhK3Qim1433Zag== +"@esbuild/linux-s390x@0.17.19": + version "0.17.19" + resolved "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz#e2afd1afcaf63afe2c7d9ceacd28ec57c77f8829" + integrity sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q== + "@esbuild/linux-s390x@0.17.6": version "0.17.6" resolved "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.6.tgz#d7ba7af59285f63cfce6e5b7f82a946f3e6d67fc" @@ -1537,6 +1664,11 @@ resolved "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.5.tgz#b38d5681db89a3723862dfa792812397b1510a7d" integrity sha512-Z6JrMyEw/EmZBD/OFEFpb+gao9xJ59ATsoTNlj39jVBbXqoZm4Xntu6wVmGPB/OATi1uk/DB+yeDPv2E8PqZGw== +"@esbuild/linux-x64@0.17.19": + version "0.17.19" + resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz#8a0e9738b1635f0c53389e515ae83826dec22aa4" + integrity sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw== + "@esbuild/linux-x64@0.17.6": version "0.17.6" resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.6.tgz#ba51f8760a9b9370a2530f98964be5f09d90fed0" @@ -1552,6 +1684,11 @@ resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.5.tgz#46feba2ad041a241379d150f415b472fe3885075" integrity sha512-psagl+2RlK1z8zWZOmVdImisMtrUxvwereIdyJTmtmHahJTKb64pAcqoPlx6CewPdvGvUKe2Jw+0Z/0qhSbG1A== +"@esbuild/netbsd-x64@0.17.19": + version "0.17.19" + resolved "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz#c29fb2453c6b7ddef9a35e2c18b37bda1ae5c462" + integrity sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q== + "@esbuild/netbsd-x64@0.17.6": version "0.17.6" resolved "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.6.tgz#e84d6b6fdde0261602c1e56edbb9e2cb07c211b9" @@ -1567,6 +1704,11 @@ resolved "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.5.tgz#3b5c1fb068f26bfc681d31f682adf1bea4ef0702" integrity sha512-kL2l+xScnAy/E/3119OggX8SrWyBEcqAh8aOY1gr4gPvw76la2GlD4Ymf832UCVbmuWeTf2adkZDK+h0Z/fB4g== +"@esbuild/openbsd-x64@0.17.19": + version "0.17.19" + resolved "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz#95e75a391403cb10297280d524d66ce04c920691" + integrity sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g== + "@esbuild/openbsd-x64@0.17.6": version "0.17.6" resolved "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.6.tgz#cf4b9fb80ce6d280a673d54a731d9c661f88b083" @@ -1582,6 +1724,11 @@ resolved "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.5.tgz#ca6830316ca68056c5c88a875f103ad3235e00db" integrity sha512-sPOfhtzFufQfTBgRnE1DIJjzsXukKSvZxloZbkJDG383q0awVAq600pc1nfqBcl0ice/WN9p4qLc39WhBShRTA== +"@esbuild/sunos-x64@0.17.19": + version "0.17.19" + resolved "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz#722eaf057b83c2575937d3ffe5aeb16540da7273" + integrity sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg== + "@esbuild/sunos-x64@0.17.6": version "0.17.6" resolved "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.6.tgz#a6838e246079b24d962b9dcb8d208a3785210a73" @@ -1597,6 +1744,11 @@ resolved "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.5.tgz#9efc4eb9539a7be7d5a05ada52ee43cda0d8e2dd" integrity sha512-dGZkBXaafuKLpDSjKcB0ax0FL36YXCvJNnztjKV+6CO82tTYVDSH2lifitJ29jxRMoUhgkg9a+VA/B03WK5lcg== +"@esbuild/win32-arm64@0.17.19": + version "0.17.19" + resolved "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz#9aa9dc074399288bdcdd283443e9aeb6b9552b6f" + integrity sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag== + "@esbuild/win32-arm64@0.17.6": version "0.17.6" resolved "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.6.tgz#ace0186e904d109ea4123317a3ba35befe83ac21" @@ -1612,6 +1764,11 @@ resolved "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.5.tgz#29f8184afa7a02a956ebda4ed638099f4b8ff198" integrity sha512-dWVjD9y03ilhdRQ6Xig1NWNgfLtf2o/STKTS+eZuF90fI2BhbwD6WlaiCGKptlqXlURVB5AUOxUj09LuwKGDTg== +"@esbuild/win32-ia32@0.17.19": + version "0.17.19" + resolved "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz#95ad43c62ad62485e210f6299c7b2571e48d2b03" + integrity sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw== + "@esbuild/win32-ia32@0.17.6": version "0.17.6" resolved "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.6.tgz#7fb3f6d4143e283a7f7dffc98a6baf31bb365c7e" @@ -1627,6 +1784,11 @@ resolved "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.5.tgz#f3de07afb292ecad651ae4bb8727789de2d95b05" integrity sha512-4liggWIA4oDgUxqpZwrDhmEfAH4d0iljanDOK7AnVU89T6CzHon/ony8C5LeOdfgx60x5cnQJFZwEydVlYx4iw== +"@esbuild/win32-x64@0.17.19": + version "0.17.19" + resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz#8cfaf2ff603e9aabb910e9c0558c26cf32744061" + integrity sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA== + "@esbuild/win32-x64@0.17.6": version "0.17.6" resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.6.tgz#563ff4277f1230a006472664fa9278a83dd124da" @@ -1679,6 +1841,11 @@ resolved "https://registry.npmjs.org/@extra-number/significant-digits/-/significant-digits-1.3.9.tgz" integrity sha512-E5PY/bCwrNqEHh4QS6AQBinLZ+sxM1lT8tsSVYk8VwhWIPp6fCU/BMRVq0V8iJ8LwS3FHmaA4vUzb78s4BIIyA== +"@fastify/busboy@^2.0.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz#0709e9f4cb252351c609c6e6d8d6779a8d25edff" + integrity sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA== + "@hapi/hoek@^9.0.0": version "9.3.0" resolved "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" @@ -1947,7 +2114,7 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/resolve-uri@^3.1.0": +"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": version "3.1.1" resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== @@ -1962,6 +2129,14 @@ resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.9": version "0.3.19" resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz#f8a3249862f91be48d3127c3cfe992f79b4b8811" @@ -2967,6 +3142,13 @@ resolved "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz" integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== +"@types/node-forge@^1.3.0": + version "1.3.11" + resolved "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz#0972ea538ddb0f4d9c2fa0ec5db5724773a604da" + integrity sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ== + dependencies: + "@types/node" "*" + "@types/node@*", "@types/node@^18.17.1": version "18.17.1" resolved "https://registry.npmjs.org/@types/node/-/node-18.17.1.tgz#84c32903bf3a09f7878c391d31ff08f6fe7d8335" @@ -3408,6 +3590,11 @@ acorn-jsx@^5.0.0, acorn-jsx@^5.3.2: resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== +acorn-walk@^8.2.0: + version "8.3.2" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz#7703af9415f1b6db9315d6895503862e231d34aa" + integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== + acorn@^8.0.0, acorn@^8.8.0, acorn@^8.8.1: version "8.11.3" resolved "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" @@ -3854,6 +4041,13 @@ arrify@^1.0.1: resolved "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz" integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== +as-table@^1.0.36: + version "1.0.55" + resolved "https://registry.npmjs.org/as-table/-/as-table-1.0.55.tgz#dc984da3937745de902cea1d45843c01bdbbec4f" + integrity sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ== + dependencies: + printable-characters "^1.0.42" + asap@^2.0.0: version "2.0.6" resolved "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" @@ -4092,6 +4286,11 @@ bl@^4.0.3, bl@^4.1.0: inherits "^2.0.4" readable-stream "^3.4.0" +blake3-wasm@^2.1.5: + version "2.1.5" + resolved "https://registry.npmjs.org/blake3-wasm/-/blake3-wasm-2.1.5.tgz#b22dbb84bc9419ed0159caa76af4b1b132e6ba52" + integrity sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g== + blob-util@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz" @@ -4286,6 +4485,14 @@ caniuse-lite@^1.0.30001565: resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001576.tgz#893be772cf8ee6056d6c1e2d07df365b9ec0a5c4" integrity sha512-ff5BdakGe2P3SQsMsiqmt1Lc8221NR1VzHj5jXN5vBny9A6fpze94HiVV/n7XRosOlsShJcvMv5mdnpjOGCEgg== +capnp-ts@^0.7.0: + version "0.7.0" + resolved "https://registry.npmjs.org/capnp-ts/-/capnp-ts-0.7.0.tgz#16fd8e76b667d002af8fcf4bf92bf15d1a7b54a9" + integrity sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g== + dependencies: + debug "^4.3.1" + tslib "^2.2.0" + caseless@~0.12.0: version "0.12.0" resolved "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz" @@ -4923,6 +5130,11 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" +data-uri-to-buffer@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-2.0.2.tgz#d296973d5a4897a5dbe31716d118211921f04770" + integrity sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA== + data-uri-to-buffer@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz" @@ -5451,6 +5663,34 @@ esbuild-register@^3.3.2: resolved "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.3.2.tgz" integrity sha512-jceAtTO6zxPmCfSD5cBb3rgIK1vmuqCKYwgylHiS1BF4pq0jJiJb4K2QMuqF4BEw7XDBRatYzip0upyTzfkgsQ== +esbuild@0.17.19: + version "0.17.19" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz#087a727e98299f0462a3d0bcdd9cd7ff100bd955" + integrity sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw== + optionalDependencies: + "@esbuild/android-arm" "0.17.19" + "@esbuild/android-arm64" "0.17.19" + "@esbuild/android-x64" "0.17.19" + "@esbuild/darwin-arm64" "0.17.19" + "@esbuild/darwin-x64" "0.17.19" + "@esbuild/freebsd-arm64" "0.17.19" + "@esbuild/freebsd-x64" "0.17.19" + "@esbuild/linux-arm" "0.17.19" + "@esbuild/linux-arm64" "0.17.19" + "@esbuild/linux-ia32" "0.17.19" + "@esbuild/linux-loong64" "0.17.19" + "@esbuild/linux-mips64el" "0.17.19" + "@esbuild/linux-ppc64" "0.17.19" + "@esbuild/linux-riscv64" "0.17.19" + "@esbuild/linux-s390x" "0.17.19" + "@esbuild/linux-x64" "0.17.19" + "@esbuild/netbsd-x64" "0.17.19" + "@esbuild/openbsd-x64" "0.17.19" + "@esbuild/sunos-x64" "0.17.19" + "@esbuild/win32-arm64" "0.17.19" + "@esbuild/win32-ia32" "0.17.19" + "@esbuild/win32-x64" "0.17.19" + esbuild@0.17.6: version "0.17.6" resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.17.6.tgz#bbccd4433629deb6e0a83860b3b61da120ba4e01" @@ -5942,6 +6182,11 @@ estree-util-visit@^2.0.0: "@types/estree-jsx" "^1.0.0" "@types/unist" "^3.0.0" +estree-walker@^0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362" + integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w== + estree-walker@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz" @@ -6027,7 +6272,7 @@ executable@^4.1.1: dependencies: pify "^2.2.0" -exit-hook@2.2.1: +exit-hook@2.2.1, exit-hook@^2.2.1: version "2.2.1" resolved "https://registry.npmjs.org/exit-hook/-/exit-hook-2.2.1.tgz" integrity sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw== @@ -6442,6 +6687,11 @@ function-bind@^1.1.1: resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + function.prototype.name@^1.1.5: version "1.1.5" resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz" @@ -6493,6 +6743,14 @@ get-port@5.1.1, get-port@^5.1.1: resolved "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz#0469ed07563479de6efb986baf053dcd7d4e3193" integrity sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ== +get-source@^2.0.12: + version "2.0.12" + resolved "https://registry.npmjs.org/get-source/-/get-source-2.0.12.tgz#0b47d57ea1e53ce0d3a69f4f3d277eb8047da944" + integrity sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w== + dependencies: + data-uri-to-buffer "^2.0.0" + source-map "^0.6.1" + get-stream@^5.0.0, get-stream@^5.1.0: version "5.2.0" resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz" @@ -6561,6 +6819,11 @@ glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + glob@7.1.6: version "7.1.6" resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" @@ -6789,6 +7052,13 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" +hasown@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" + integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== + dependencies: + function-bind "^1.1.2" + hast-util-to-estree@^2.0.0: version "2.0.2" resolved "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-2.0.2.tgz" @@ -7222,6 +7492,13 @@ is-core-module@^2.11.0, is-core-module@^2.8.1, is-core-module@^2.9.0: dependencies: has "^1.0.3" +is-core-module@^2.13.0: + version "2.13.1" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== + dependencies: + hasown "^2.0.0" + is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz" @@ -8530,6 +8807,13 @@ lz-string@^1.4.4: resolved "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz" integrity sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY= +magic-string@^0.25.3: + version "0.25.9" + resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" + integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== + dependencies: + sourcemap-codec "^1.4.8" + magic-string@^0.27.0: version "0.27.0" resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz#e4a3413b4bab6d98d2becffd48b4a257effdbbf3" @@ -9652,6 +9936,24 @@ min-indent@^1.0.0: resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz" integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== +miniflare@3.20231218.3: + version "3.20231218.3" + resolved "https://registry.npmjs.org/miniflare/-/miniflare-3.20231218.3.tgz#31aa7f9165970ae53d3048eeb24ffb13ee84cf1e" + integrity sha512-OrPBYWO0WnFv6DrxZ7hF8f5agZ4+xo/2qSLE0wwCJSqlFhr91dfSJautxfCOBD896nAA7Jqr5LBPEnqq3/k/JQ== + dependencies: + "@cspotcode/source-map-support" "0.8.1" + acorn "^8.8.0" + acorn-walk "^8.2.0" + capnp-ts "^0.7.0" + exit-hook "^2.2.1" + glob-to-regexp "^0.4.1" + stoppable "^1.1.0" + undici "^5.28.2" + workerd "1.20231218.0" + ws "^8.11.0" + youch "^3.2.2" + zod "^3.20.6" + minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" @@ -9844,6 +10146,11 @@ msw@^1.2.3: type-fest "^2.19.0" yargs "^17.3.1" +mustache@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz#e5892324d60a12ec9c2a73359edca52972bf6f64" + integrity sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ== + mute-stream@0.0.7: version "0.0.7" resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz" @@ -9863,7 +10170,7 @@ mz@^2.7.0: object-assign "^4.0.1" thenify-all "^1.0.0" -nanoid@^3.3.6: +nanoid@^3.3.3, nanoid@^3.3.6: version "3.3.7" resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== @@ -9900,6 +10207,11 @@ node-fetch@^2.5.0, node-fetch@^2.6.7: dependencies: whatwg-url "^5.0.0" +node-forge@^1: + version "1.3.1" + resolved "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" + integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== + node-int64@^0.4.0: version "0.4.0" resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" @@ -10714,6 +11026,11 @@ pretty-ms@^7.0.1: dependencies: parse-ms "^2.1.0" +printable-characters@^1.0.42: + version "1.0.42" + resolved "https://registry.npmjs.org/printable-characters/-/printable-characters-1.0.42.tgz#3f18e977a9bd8eb37fcc4ff5659d7be90868b3d8" + integrity sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ== + proc-log@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz#fb05ef83ccd64fd7b20bbe9c8c1070fc08338dd8" @@ -11370,6 +11687,15 @@ resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.14. path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +resolve@^1.22.8: + version "1.22.8" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + resolve@^2.0.0-next.4: version "2.0.0-next.4" resolved "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660" @@ -11447,6 +11773,29 @@ rollup-plugin-copy@^3.3.0: globby "10.0.1" is-plain-object "^3.0.0" +rollup-plugin-inject@^3.0.0: + version "3.0.2" + resolved "https://registry.npmjs.org/rollup-plugin-inject/-/rollup-plugin-inject-3.0.2.tgz#e4233855bfba6c0c12a312fd6649dff9a13ee9f4" + integrity sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w== + dependencies: + estree-walker "^0.6.1" + magic-string "^0.25.3" + rollup-pluginutils "^2.8.1" + +rollup-plugin-node-polyfills@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/rollup-plugin-node-polyfills/-/rollup-plugin-node-polyfills-0.2.1.tgz#53092a2744837164d5b8a28812ba5f3ff61109fd" + integrity sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA== + dependencies: + rollup-plugin-inject "^3.0.0" + +rollup-pluginutils@^2.8.1: + version "2.8.2" + resolved "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz#72f2af0748b592364dbd3389e600e5a9444a351e" + integrity sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ== + dependencies: + estree-walker "^0.6.1" + rollup@^2.36.1: version "2.75.7" resolved "https://registry.npmjs.org/rollup/-/rollup-2.75.7.tgz" @@ -11561,6 +11910,14 @@ scheduler@^0.23.0: dependencies: loose-envify "^1.1.0" +selfsigned@^2.0.1: + version "2.4.1" + resolved "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz#560d90565442a3ed35b674034cec4e95dceb4ae0" + integrity sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q== + dependencies: + "@types/node-forge" "^1.3.0" + node-forge "^1" + "semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.6.0: version "5.7.1" resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" @@ -11848,7 +12205,7 @@ source-map-support@^0.5.21: buffer-from "^1.0.0" source-map "^0.6.0" -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: +source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== @@ -11858,6 +12215,11 @@ source-map@^0.7.0, source-map@^0.7.3: resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz" integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== +sourcemap-codec@^1.4.8: + version "1.4.8" + resolved "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== + space-separated-tokens@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.1.tgz" @@ -11936,6 +12298,14 @@ stack-utils@^2.0.3: dependencies: escape-string-regexp "^2.0.0" +stacktracey@^2.1.8: + version "2.1.8" + resolved "https://registry.npmjs.org/stacktracey/-/stacktracey-2.1.8.tgz#bf9916020738ce3700d1323b32bd2c91ea71199d" + integrity sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw== + dependencies: + as-table "^1.0.36" + get-source "^2.0.12" + static-extend@^0.1.2: version "0.1.2" resolved "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz" @@ -11956,6 +12326,11 @@ stop-iteration-iterator@^1.0.0: dependencies: internal-slot "^1.0.4" +stoppable@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz#32da568e83ea488b08e4d7ea2c3bcc9d75015d5b" + integrity sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw== + stream-shift@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz" @@ -12558,6 +12933,11 @@ tslib@^2.0.1, tslib@^2.1.0, tslib@^2.4.0, tslib@^2.5.0: resolved "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== +tslib@^2.2.0: + version "2.6.2" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + tsscmp@1.0.6: version "1.0.6" resolved "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz" @@ -12696,6 +13076,13 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" +undici@^5.28.2: + version "5.28.2" + resolved "https://registry.npmjs.org/undici/-/undici-5.28.2.tgz#fea200eac65fc7ecaff80a023d1a0543423b4c91" + integrity sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w== + dependencies: + "@fastify/busboy" "^2.0.0" + unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz" @@ -13309,6 +13696,39 @@ word-wrap@^1.2.3: resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== +workerd@1.20231218.0: + version "1.20231218.0" + resolved "https://registry.npmjs.org/workerd/-/workerd-1.20231218.0.tgz#a00403af346f654c1d73f4805c07b9ef3a6d2142" + integrity sha512-AGIsDvqCrcwhoA9kb1hxOhVAe53/xJeaGZxL4FbYI9FvO17DZwrnqGq+6eqItJ6Cfw1ZLmf3BM+QdMWaL2bFWQ== + optionalDependencies: + "@cloudflare/workerd-darwin-64" "1.20231218.0" + "@cloudflare/workerd-darwin-arm64" "1.20231218.0" + "@cloudflare/workerd-linux-64" "1.20231218.0" + "@cloudflare/workerd-linux-arm64" "1.20231218.0" + "@cloudflare/workerd-windows-64" "1.20231218.0" + +wrangler@^3.24.0: + version "3.24.0" + resolved "https://registry.npmjs.org/wrangler/-/wrangler-3.24.0.tgz#a8ca60eaec280fecee7293189604a8b75150fa9a" + integrity sha512-jEnqpY+9/J4VPjtuEnS2lhCPXkvbDClnMalSWaRxSx+1tiTWMJhMjtK9oyXLdO+ZUf9Q4LvFTYSPm8O1uwmnxQ== + dependencies: + "@cloudflare/kv-asset-handler" "^0.2.0" + "@esbuild-plugins/node-globals-polyfill" "^0.2.3" + "@esbuild-plugins/node-modules-polyfill" "^0.2.2" + blake3-wasm "^2.1.5" + chokidar "^3.5.3" + esbuild "0.17.19" + miniflare "3.20231218.3" + nanoid "^3.3.3" + path-to-regexp "^6.2.0" + resolve "^1.22.8" + resolve.exports "^2.0.2" + selfsigned "^2.0.1" + source-map "0.6.1" + xxhash-wasm "^1.0.1" + optionalDependencies: + fsevents "~2.3.2" + "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" @@ -13363,7 +13783,7 @@ ws@^7.4.5: resolved "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz" integrity sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A== -ws@^8.13.0: +ws@^8.11.0, ws@^8.13.0: version "8.16.0" resolved "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz#d1cd774f36fbc07165066a60e40323eab6446fd4" integrity sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ== @@ -13383,6 +13803,11 @@ xtend@~4.0.1: resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== +xxhash-wasm@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-1.0.2.tgz#ecc0f813219b727af4d5f3958ca6becee2f2f1ff" + integrity sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A== + y18n@^4.0.0: version "4.0.3" resolved "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz" @@ -13492,6 +13917,20 @@ yocto-queue@^0.1.0: resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== +youch@^3.2.2: + version "3.3.3" + resolved "https://registry.npmjs.org/youch/-/youch-3.3.3.tgz#50cfdf5bc395ce664a5073e31b712ff4a859d928" + integrity sha512-qSFXUk3UZBLfggAW3dJKg0BMblG5biqSF8M34E06o5CSsZtH92u9Hqmj2RzGiHDi64fhe83+4tENFP2DB6t6ZA== + dependencies: + cookie "^0.5.0" + mustache "^4.2.0" + stacktracey "^2.1.8" + +zod@^3.20.6: + version "3.22.4" + resolved "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz#f31c3a9386f61b1f228af56faa9255e845cf3fff" + integrity sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg== + zwitch@^2.0.0: version "2.0.2" resolved "https://registry.npmjs.org/zwitch/-/zwitch-2.0.2.tgz"