diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index c53f1a09f..31307b602 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -25,10 +25,10 @@ jobs: - run: corepack enable - name: Install Deno - uses: denoland/setup-deno@v1 + uses: denoland/setup-deno@v2 with: # Should match the `DENO_VERSION_RANGE` from https://github.com/netlify/edge-bundler/blob/main/node/bridge.ts#L17 - deno-version: v1.37.0 + deno-version: v2.2.4 - run: pnpm install - name: Install Playwright Browsers diff --git a/.github/workflows/publint.yml b/.github/workflows/publint.yml new file mode 100644 index 000000000..e35c5bfa3 --- /dev/null +++ b/.github/workflows/publint.yml @@ -0,0 +1,37 @@ +name: Publint +on: + push: + branches: [main] + pull_request: + types: [opened, synchronize, reopened] + branches: + - '**' + - '!release-please--**' + merge_group: +jobs: + publint: + runs-on: ubuntu-latest + permissions: + contents: read + steps: + - run: git config --global core.symlinks true + - uses: actions/checkout@v5 + with: + fetch-depth: 0 + - run: corepack enable pnpm + - name: Node.js + uses: actions/setup-node@v4 + with: + node-version: lts/* + cache: 'pnpm' + - name: Install Deno + uses: denoland/setup-deno@v2 + with: + # Should satisfy the `DENO_VERSION_RANGE` from https://github.com/netlify/edge-bundler/blob/main/node/bridge.ts#L17 + deno-version: v2.2.4 + - name: Install dependencies + run: pnpm install + - name: Build + run: pnpm run build:packages + - name: Publint + run: pnpm run --filter '@netlify/*' publint diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml index c13431c76..59f8410ef 100644 --- a/.github/workflows/release-please.yml +++ b/.github/workflows/release-please.yml @@ -28,10 +28,10 @@ jobs: registry-url: 'https://registry.npmjs.org' if: ${{ steps.release.outputs.releases_created }} - name: Install Deno - uses: denoland/setup-deno@v1 + uses: denoland/setup-deno@v2 with: # Should satisfy the `DENO_VERSION_RANGE` from https://github.com/netlify/edge-bundler/blob/main/node/bridge.ts#L17 - deno-version: v1 + deno-version: v2.2.4 if: ${{ steps.release.outputs.releases_created }} - run: corepack enable - name: Install dependencies diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 21140c392..ebc482f88 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -22,10 +22,10 @@ jobs: check-latest: true - run: corepack enable - name: Install Deno - uses: denoland/setup-deno@v1 + uses: denoland/setup-deno@v2 with: # Should satisfy the `DENO_VERSION_RANGE` from https://github.com/netlify/edge-bundler/blob/main/node/bridge.ts#L17 - deno-version: v1 + deno-version: v2.2.4 - name: Install run: pnpm install - name: Build diff --git a/package.json b/package.json index 24d9c4bd1..37c4b0416 100644 --- a/package.json +++ b/package.json @@ -47,10 +47,11 @@ "fast-glob": "^3.3.2", "husky": "^9.0.11", "lint-staged": "^15.0.0", - "netlify-cli": "^20.1.1", + "netlify-cli": "^23.9.5", "npm-run-all2": "^6.0.0", "p-limit": "^5.0.0", "prettier": "^3.0.0", + "publint": "^0.3.15", "typescript": "^5.0.0", "vitest": "^3.0.0" }, diff --git a/packages/remix-adapter/package.json b/packages/remix-adapter/package.json index 2d6490816..11b218282 100644 --- a/packages/remix-adapter/package.json +++ b/packages/remix-adapter/package.json @@ -41,7 +41,8 @@ "scripts": { "prepack": "pnpm run build", "build": "tsup-node src/index.ts src/vite/plugin.ts --format esm,cjs --dts --target node16 --clean", - "build:watch": "pnpm run build --watch" + "build:watch": "pnpm run build --watch", + "publint": "publint --strict" }, "repository": { "type": "git", diff --git a/packages/remix-edge-adapter/README.md b/packages/remix-edge-adapter/README.md index f923e4d41..e611fb290 100644 --- a/packages/remix-edge-adapter/README.md +++ b/packages/remix-edge-adapter/README.md @@ -16,12 +16,31 @@ However, if you are using **Remix Vite**, you can instead deploy your existing s ```js // vite.config.js -import { vitePlugin as remix } from "@remix-run/dev"; -import { netlifyPlugin } from "@netlify/remix-edge-adapter/plugin"; +import { vitePlugin as remix } from '@remix-run/dev' +import { netlifyPlugin } from '@netlify/remix-edge-adapter/plugin' export default defineConfig({ - plugins: [remix(), netlifyPlugin(), -}); + plugins: [remix(), netlifyPlugin()], +}) +``` + +If you have your own Netlify Functions (typically in `netlify/functions`) for which you've configured a `path`, you must +exclude those paths to avoid conflicts with the generated Remix SSR handler, which would otherwise run on all dynamic +paths: + +```js +// vite.config.js +import { vitePlugin as remix } from '@remix-run/dev' +import { netlifyPlugin } from '@netlify/remix-edge-adapter/plugin' + +export default defineConfig({ + plugins: [ + remix(), + netlifyPlugin({ + excludedPaths: ['/ping', '/api/*', '/webhooks/*'], + }), + ], +}) ``` 3. Add an `app/entry.jsx` (.tsx if using TypeScript) with these contents: diff --git a/packages/remix-edge-adapter/package.json b/packages/remix-edge-adapter/package.json index 0dbfbcdc0..5fc08f5a1 100644 --- a/packages/remix-edge-adapter/package.json +++ b/packages/remix-edge-adapter/package.json @@ -43,7 +43,8 @@ "build": "pnpm run build:src && pnpm run build:types", "build:src": "tsup-node src/index.ts src/vite/plugin.ts --format esm,cjs --dts --target node16 --clean", "build:types": "deno types > deno.d.ts", - "build:watch": "pnpm run build:src --watch" + "build:watch": "pnpm run build:src --watch", + "publint": "publint --strict" }, "repository": { "type": "git", diff --git a/packages/remix-edge-adapter/src/vite/plugin.ts b/packages/remix-edge-adapter/src/vite/plugin.ts index 3afc38453..c20afcfb1 100644 --- a/packages/remix-edge-adapter/src/vite/plugin.ts +++ b/packages/remix-edge-adapter/src/vite/plugin.ts @@ -85,7 +85,7 @@ export default createRequestHandler({ // This is written to the edge functions directory. It just re-exports // the compiled entrypoint, along with the Netlify function config. -function generateEdgeFunction(handlerPath: string, exclude: Array = []) { +function generateEdgeFunction(handlerPath: string, excludedPath: Array) { return /* js */ ` export { default } from "${handlerPath}"; @@ -94,7 +94,7 @@ function generateEdgeFunction(handlerPath: string, exclude: Array = []) generator: "${name}@${version}", cache: "manual", path: "/*", - excludedPath: ${JSON.stringify(exclude)}, + excludedPath: ${JSON.stringify(excludedPath)}, };` } @@ -125,7 +125,21 @@ const getEdgeFunctionHandlerModuleId = async (root: string, isHydrogenSite: bool return findUserEdgeFunctionHandlerFile(root) } -export function netlifyPlugin(): Plugin { +export interface NetlifyPluginOptions { + /** + * Paths to exclude from being handled by the Remix handler. + * + * @IMPORTANT If you have your own Netlify Functions running on custom `path`s, you + * must exclude those paths here to avoid conflicts. + * + * @type {string[]} + * @default [] + */ + excludedPaths?: string[] +} + +export function netlifyPlugin(options: NetlifyPluginOptions = {}): Plugin { + const additionalExcludedPaths = options.excludedPaths ?? [] let resolvedConfig: ResolvedConfig let currentCommand: string let isSsr: boolean | undefined @@ -264,7 +278,7 @@ export function netlifyPlugin(): Plugin { async writeBundle() { // Write the server entrypoint to the Netlify functions directory if (currentCommand === 'build' && isSsr) { - const exclude: Array = ['/.netlify/*'] + const excludedPath: Array = ['/.netlify/*'] try { // Get the client files so we can skip them in the edge function const clientDirectory = join(resolvedConfig.build.outDir, '..', 'client') @@ -272,15 +286,17 @@ export function netlifyPlugin(): Plugin { for (const entry of entries) { // With directories we don't bother to recurse into it and just skip the whole thing. if (entry.isDirectory()) { - exclude.push(`/${entry.name}/*`) + excludedPath.push(`/${entry.name}/*`) } else if (entry.isFile()) { - exclude.push(`/${entry.name}`) + excludedPath.push(`/${entry.name}`) } } } catch { // Ignore if it doesn't exist } + excludedPath.push(...additionalExcludedPaths) + const edgeFunctionsDirectory = join(resolvedConfig.root, NETLIFY_EDGE_FUNCTIONS_DIR) await mkdir(edgeFunctionsDirectory, { recursive: true }) @@ -290,7 +306,7 @@ export function netlifyPlugin(): Plugin { await writeFile( join(edgeFunctionsDirectory, EDGE_FUNCTION_FILENAME), - generateEdgeFunction(relativeHandlerPath, exclude), + generateEdgeFunction(relativeHandlerPath, excludedPath), ) } }, diff --git a/packages/remix-runtime/package.json b/packages/remix-runtime/package.json index bccdd8011..b267aafbd 100644 --- a/packages/remix-runtime/package.json +++ b/packages/remix-runtime/package.json @@ -21,7 +21,8 @@ "scripts": { "prepack": "pnpm run build", "build": "tsup-node src/index.ts --format esm,cjs --dts --target node16 --clean", - "build:watch": "pnpm run build --watch" + "build:watch": "pnpm run build --watch", + "publint": "publint --strict" }, "repository": { "type": "git", diff --git a/packages/vite-plugin-react-router/README.md b/packages/vite-plugin-react-router/README.md index ec9792eb0..b0826d1cd 100644 --- a/packages/vite-plugin-react-router/README.md +++ b/packages/vite-plugin-react-router/README.md @@ -1,14 +1,13 @@ # React Router Adapter for Netlify -The React Router Adapter for Netlify allows you to deploy your [React Router](https://reactrouter.com) app to -[Netlify Functions](https://docs.netlify.com/functions/overview/). +The React Router Adapter for Netlify allows you to deploy your [React Router](https://reactrouter.com) app to Netlify. ## How to use To deploy a React Router 7+ site to Netlify, install this package: ```sh -npm install --save-dev @netlify/vite-plugin-react-router +npm install @netlify/vite-plugin-react-router ``` It's also recommended (but not required) to use the @@ -38,6 +37,115 @@ export default defineConfig({ }) ``` +Your app is ready to [deploy to Netlify](https://docs.netlify.com/deploy/create-deploys/). + +### Deploying to Edge Functions + +By default, this plugin deploys your React Router app to +[Netlify Functions](https://docs.netlify.com/functions/overview/) (Node.js runtime). You can optionally deploy to +[Netlify Edge Functions](https://docs.netlify.com/edge-functions/overview/) (Deno runtime) instead. + +First, toggle the `edge` option: + +```typescript +export default defineConfig({ + plugins: [ + reactRouter(), + tsconfigPaths(), + netlifyReactRouter({ edge: true }), // <- deploy to Edge Functions + netlify(), + ], +}) +``` + +Second, you **must** provide an `app/entry.server.tsx` (or `.jsx`) file that uses web-standard APIs compatible with the +Deno runtime. Create a file with the following content: + +> [!IMPORTANT] +> +> This file uses `renderToReadableStream` (Web Streams API) instead of `renderToPipeableStream` (Node.js API), which is +> required for the Deno runtime. You may customize your server entry file, but see below for important edge runtime +> constraints. + +```tsx +import type { AppLoadContext, EntryContext } from 'react-router' +import { ServerRouter } from 'react-router' +import { isbot } from 'isbot' +import { renderToReadableStream } from 'react-dom/server' + +export default async function handleRequest( + request: Request, + responseStatusCode: number, + responseHeaders: Headers, + routerContext: EntryContext, + _loadContext: AppLoadContext, +) { + let shellRendered = false + const userAgent = request.headers.get('user-agent') + + const body = await renderToReadableStream(, { + onError(error: unknown) { + responseStatusCode = 500 + // Log streaming rendering errors from inside the shell. Don't log + // errors encountered during initial shell rendering since they'll + // reject and get logged in handleDocumentRequest. + if (shellRendered) { + console.error(error) + } + }, + }) + shellRendered = true + + // Ensure requests from bots and SPA Mode renders wait for all content to load before responding + // https://react.dev/reference/react-dom/server/renderToPipeableStream#waiting-for-all-content-to-load-for-crawlers-and-static-generation + if ((userAgent && isbot(userAgent)) || routerContext.isSpaMode) { + await body.allReady + } + + responseHeaders.set('Content-Type', 'text/html') + return new Response(body, { + headers: responseHeaders, + status: responseStatusCode, + }) +} +``` + +You may need to `npm install isbot` if you do not have this dependency. + +Finally, if you have your own Netlify Functions (typically in `netlify/functions`) for which you've configured a `path`, +you must exclude those paths to avoid conflicts with the generated React Router SSR handler: + +```typescript +export default defineConfig({ + plugins: [ + reactRouter(), + tsconfigPaths(), + netlifyReactRouter({ + edge: true, + excludedPaths: ['/ping', '/api/*', '/webhooks/*'], + }), + netlify(), + ], +}) +``` + +#### Moving back from Edge Functions to Functions + +To switch from Edge Functions back to Functions, you must: + +1. Remove the `edge: true` option from your `vite.config.ts` +2. **Delete the `app/entry.server.tsx` file** (React Router will use its default Node.js-compatible entry) + +#### Edge runtime + +Before deploying to Edge Functions, review the Netlify Edge Functions documentation for important details: + +- [Runtime environment](https://docs.netlify.com/build/edge-functions/api/#runtime-environment) - Understand the Deno + runtime +- [Supported Web APIs](https://docs.netlify.com/build/edge-functions/api/#supported-web-apis) - Check which APIs are + available +- [Limitations](https://docs.netlify.com/build/edge-functions/limits/) - Be aware of resource limits and constraints + ### Load context This plugin automatically includes all @@ -71,7 +179,8 @@ type-safe `RouterContextProvider`. Note that this requires requires v2.0.0+ of ` For example: ```tsx -import { netlifyRouterContext } from '@netlify/vite-plugin-react-router' +import { netlifyRouterContext } from '@netlify/vite-plugin-react-router/serverless' +// NOTE: if setting `edge: true`, import from /edge ^ instead here import { useLoaderData } from 'react-router' import type { Route } from './+types/example' @@ -101,10 +210,11 @@ To use middleware, that this requires requires v2.0.0+ of `@netlify/vite-plugin-react-router`. To access the [Netlify context](https://docs.netlify.com/build/functions/api/#netlify-specific-context-object) -specifically, you must import our `RouterContextProvider` instance: +specifically, you must import our `RouterContext` instance: ```tsx -import { netlifyRouterContext } from '@netlify/vite-plugin-react-router' +import { netlifyRouterContext } from '@netlify/vite-plugin-react-router/serverless' +// NOTE: if setting `edge: true`, import from /edge ^ instead here import type { Route } from './+types/home' diff --git a/packages/vite-plugin-react-router/package.json b/packages/vite-plugin-react-router/package.json index 8db2f49f8..f5f3dffb7 100644 --- a/packages/vite-plugin-react-router/package.json +++ b/packages/vite-plugin-react-router/package.json @@ -16,6 +16,14 @@ "types": "./dist/index.d.mts", "default": "./dist/index.mjs" } + }, + "./serverless": { + "types": "./dist/serverless.d.mts", + "default": "./dist/serverless.mjs" + }, + "./edge": { + "types": "./dist/edge.d.mts", + "default": "./dist/edge.mjs" } }, "files": [ @@ -26,8 +34,9 @@ ], "scripts": { "prepack": "pnpm run build", - "build": "tsup-node src/index.ts --format esm,cjs --dts --target node18 --clean", - "build:watch": "pnpm run build --watch" + "build": "rm -rf dist && tsup-node", + "build:watch": "pnpm run build --watch", + "publint": "publint --strict" }, "repository": { "type": "git", @@ -48,6 +57,7 @@ "isbot": "^5.0.0" }, "devDependencies": { + "@netlify/edge-functions": "^2.11.0", "@netlify/functions": "^3.1.9", "@types/react": "^18.0.27", "@types/react-dom": "^18.0.10", diff --git a/packages/vite-plugin-react-router/src/index.ts b/packages/vite-plugin-react-router/src/index.ts index c17ccbcb4..e245ebf24 100644 --- a/packages/vite-plugin-react-router/src/index.ts +++ b/packages/vite-plugin-react-router/src/index.ts @@ -1,4 +1,8 @@ -export type { GetLoadContextFunction, RequestHandler } from './server' -export { createRequestHandler, netlifyRouterContext } from './server' +// All these `function-handler` exports are here for backwards compatibility. Now that we have separate exports +// for Function and Edge Functions, we should remove these exports in a future major version. +export type { GetLoadContextFunction, RequestHandler } from './runtimes/netlify-functions' +// Also, we never documented the `createRequestHandler` export, which has a very niche intended use case, and is not +// needed for the Edge Functions exports, so we should remove it as well. +export { createRequestHandler, netlifyRouterContext } from './runtimes/netlify-functions' export { netlifyPlugin as default } from './plugin' diff --git a/packages/vite-plugin-react-router/src/lib/context.ts b/packages/vite-plugin-react-router/src/lib/context.ts new file mode 100644 index 000000000..219ef9647 --- /dev/null +++ b/packages/vite-plugin-react-router/src/lib/context.ts @@ -0,0 +1,62 @@ +import type { AppLoadContext } from 'react-router' +import { type RouterContext, createContext, RouterContextProvider } from 'react-router' + +/** + * A function that returns the value to use as `context` in route `loader` and `action` functions. + * + * You can think of this as an escape hatch that allows you to pass environment/platform-specific + * values through to your loader/action. + * + * NOTE: v7.9.0 introduced a breaking change when the user opts in to `future.v8_middleware`. This + * requires returning an instance of `RouterContextProvider` instead of a plain object. We have a + * peer dependency on >=7.9.0 so we can safely *import* these, but we cannot assume the user has + * opted in to the flag. + */ +export type GetLoadContextFunction = + | (( + request: Request, + context: TNetlifyContext, + ) => Promise | RouterContextProvider) + | ((request: Request, context: TNetlifyContext) => Promise | AppLoadContext) + +/** + * Creates a RouterContext that provides access to Netlify request context. + * Uses a Proxy to always read from the current `Netlify.context` value, which is always + * contextual to the in-flight request. + * + * @example context.get(netlifyRouterContext).geo?.country?.name + */ +export function createNetlifyRouterContext(): RouterContext< + Partial +> { + // We must use a singleton because Remix contexts rely on referential equality. + // We can't hook into the request lifecycle in dev mode, so we use a Proxy to always read from the + // current `Netlify.context` value, which is always contextual to the in-flight request. + return createContext>( + new Proxy( + // Can't reference `Netlify.context` here because it isn't set outside of a request lifecycle + {}, + { + get(_target, prop, receiver) { + return Reflect.get(Netlify.context ?? {}, prop, receiver) + }, + set(_target, prop, value, receiver) { + return Reflect.set(Netlify.context ?? {}, prop, value, receiver) + }, + has(_target, prop) { + return Reflect.has(Netlify.context ?? {}, prop) + }, + deleteProperty(_target, prop) { + return Reflect.deleteProperty(Netlify.context ?? {}, prop) + }, + ownKeys(_target) { + return Reflect.ownKeys(Netlify.context ?? {}) + }, + getOwnPropertyDescriptor(_target, prop) { + return Reflect.getOwnPropertyDescriptor(Netlify.context ?? {}, prop) + }, + }, + ), + ) +} + diff --git a/packages/vite-plugin-react-router/src/lib/handler.ts b/packages/vite-plugin-react-router/src/lib/handler.ts new file mode 100644 index 000000000..4f09d4a07 --- /dev/null +++ b/packages/vite-plugin-react-router/src/lib/handler.ts @@ -0,0 +1,74 @@ +import { + type ServerBuild, + type RouterContext, + RouterContextProvider, + createRequestHandler as createReactRouterRequestHandler, +} from 'react-router' + +import type { GetLoadContextFunction } from './context' + +/** + * Configuration for creating a Netlify request handler + */ +export interface CreateRequestHandlerConfig { + build: ServerBuild + mode?: string + getLoadContext?: GetLoadContextFunction + netlifyRouterContext: RouterContext> + runtimeName: string +} + +export type RequestHandler = ( + request: Request, + context: TNetlifyContext, +) => Promise + +/** + * Shared implementation for creating Netlify request handlers (Functions or Edge Functions). + * This is the core logic used by both function-handler and edge-function-handler. + */ +export function createNetlifyRequestHandler({ + build, + mode, + getLoadContext, + netlifyRouterContext, + runtimeName, +}: CreateRequestHandlerConfig): RequestHandler { + const reactRouterHandler = createReactRouterRequestHandler(build, mode) + + return async (request: Request, netlifyContext: TNetlifyContext): Promise => { + const start = Date.now() + console.log(`[${request.method}] ${request.url}`) + try { + const getDefaultReactRouterContext = () => { + const ctx = new RouterContextProvider() + ctx.set(netlifyRouterContext, netlifyContext) + + // Provide backwards compatibility with previous plain object context + // See https://reactrouter.com/how-to/middleware#migration-from-apploadcontext. + Object.assign(ctx, netlifyContext) + + return ctx + } + const reactRouterContext = + (await getLoadContext?.(request, netlifyContext)) ?? getDefaultReactRouterContext() + + // @ts-expect-error -- createReactRouterRequestHandler has conditional types based on the + // presence of `future.v8_middleware` in the user's config. When enabled, it expects + // RouterContextProvider; when disabled, it expects AppLoadContext. We can't know at compile + // time which the user has enabled, so we pass a union type. At runtime, the correct type will + // be used based on the user's configuration. + const response = await reactRouterHandler(request, reactRouterContext) + + // A useful header for debugging + response.headers.set('x-nf-runtime', runtimeName) + + console.log(`[${response.status}] ${request.url} (${Date.now() - start}ms)`) + return response + } catch (error) { + console.error(error) + + return new Response('Internal Error', { status: 500 }) + } + } +} \ No newline at end of file diff --git a/packages/vite-plugin-react-router/src/plugin.ts b/packages/vite-plugin-react-router/src/plugin.ts index f1774d340..cf49b3fcf 100644 --- a/packages/vite-plugin-react-router/src/plugin.ts +++ b/packages/vite-plugin-react-router/src/plugin.ts @@ -1,11 +1,33 @@ -import type { Plugin, ResolvedConfig } from 'vite' -import { mkdir, writeFile } from 'node:fs/promises' +import { mkdir, writeFile, readdir } from 'node:fs/promises' import { join, relative, sep } from 'node:path' import { sep as posixSep } from 'node:path/posix' + +import type { Plugin, ResolvedConfig } from 'vite' + import { version, name } from '../package.json' +export interface NetlifyPluginOptions { + /** + * Deploy to Netlify Edge Functions instead of Netlify Functions. + * @default false + */ + edge?: boolean + /** + * Paths to exclude from being handled by the React Router handler. + * + * @IMPORTANT If you have opted in to edge rendering with `edge: true` and you have your own Netlify + * Functions running on custom `path`s, you must exclude those paths here to avoid conflicts. + * + * @type {URLPattern[]} + * @default [] + */ + excludedPaths?: string[] +} + // https://docs.netlify.com/frameworks-api/#netlify-v1-functions const NETLIFY_FUNCTIONS_DIR = '.netlify/v1/functions' +// https://docs.netlify.com/frameworks-api/#netlify-v1-edge-functions +const NETLIFY_EDGE_FUNCTIONS_DIR = '.netlify/v1/edge-functions' const FUNCTION_FILENAME = 'react-router-server.mjs' /** @@ -20,7 +42,16 @@ const toPosixPath = (path: string) => path.split(sep).join(posixSep) // The virtual module that is the compiled Vite SSR entrypoint (a Netlify Function handler) const FUNCTION_HANDLER = /* js */ ` -import { createRequestHandler } from "@netlify/vite-plugin-react-router"; +import { createRequestHandler } from "@netlify/vite-plugin-react-router/serverless"; +import * as build from "virtual:react-router/server-build"; +export default createRequestHandler({ + build, +}); +` + +// The virtual module for Edge Functions +const EDGE_FUNCTION_HANDLER = /* js */ ` +import { createRequestHandler } from "@netlify/vite-plugin-react-router/edge"; import * as build from "virtual:react-router/server-build"; export default createRequestHandler({ build, @@ -29,7 +60,7 @@ export default createRequestHandler({ // This is written to the functions directory. It just re-exports // the compiled entrypoint, along with Netlify function config. -function generateNetlifyFunction(handlerPath: string) { +function generateNetlifyFunction(handlerPath: string, excludedPath: Array) { return /* js */ ` export { default } from "${handlerPath}"; @@ -37,12 +68,31 @@ function generateNetlifyFunction(handlerPath: string) { name: "React Router server handler", generator: "${name}@${version}", path: "/*", + excludedPath: ${JSON.stringify(excludedPath)}, preferStatic: true, }; ` } -export function netlifyPlugin(): Plugin { +// This is written to the edge functions directory. It just re-exports +// the compiled entrypoint, along with Netlify edge function config. +function generateEdgeFunction(handlerPath: string, excludedPath: Array) { + return /* js */ ` + export { default } from "${handlerPath}"; + + export const config = { + name: "React Router server handler", + generator: "${name}@${version}", + cache: "manual", + path: "/*", + excludedPath: ${JSON.stringify(excludedPath)}, + }; + ` +} + +export function netlifyPlugin(options: NetlifyPluginOptions = {}): Plugin { + const edge = options.edge ?? false + const additionalExcludedPaths = options.excludedPaths ?? [] let resolvedConfig: ResolvedConfig let isProductionSsrBuild = false return { @@ -65,6 +115,21 @@ export function netlifyPlugin(): Plugin { config.build.rollupOptions.output = {} } config.build.rollupOptions.output.entryFileNames = '[name].js' + + // Configure for Edge Functions if enabled + if (edge) { + config.ssr = { + ...config.ssr, + target: 'webworker', + // Bundle everything except Node.js built-ins (which are supported but must use the `node:` prefix): + // https://docs.netlify.com/build/edge-functions/api/#runtime-environment + noExternal: /^(?!node:).*$/, + resolve: { + ...config.resolve, + conditions: ['worker', 'deno', 'browser'], + }, + } + } } }, async resolveId(source) { @@ -75,7 +140,7 @@ export function netlifyPlugin(): Plugin { // See https://vitejs.dev/guide/api-plugin#virtual-modules-convention. load(id) { if (id === RESOLVED_FUNCTION_HANDLER_MODULE_ID) { - return FUNCTION_HANDLER + return edge ? EDGE_FUNCTION_HANDLER : FUNCTION_HANDLER } }, async configResolved(config) { @@ -83,16 +148,41 @@ export function netlifyPlugin(): Plugin { }, // See https://rollupjs.org/plugin-development/#writebundle. async writeBundle() { - // Write the server entrypoint to the Netlify functions directory if (isProductionSsrBuild) { - const functionsDirectory = join(resolvedConfig.root, NETLIFY_FUNCTIONS_DIR) - - await mkdir(functionsDirectory, { recursive: true }) - const handlerPath = join(resolvedConfig.build.outDir, `${FUNCTION_HANDLER_CHUNK}.js`) - const relativeHandlerPath = toPosixPath(relative(functionsDirectory, handlerPath)) - await writeFile(join(functionsDirectory, FUNCTION_FILENAME), generateNetlifyFunction(relativeHandlerPath)) + if (edge) { + // Edge Functions do not have a `preferStatic` option, so we must exhaustively exclude + // static files to serve them from the CDN without compute. + // RR7's build out dir contains /server and /client subdirectories. This is documented and + // not configurable, so the client out dir is always at ../client from the server out dir. + const clientDir = join(resolvedConfig.build.outDir, '..', 'client') + const entries = await readdir(clientDir, { withFileTypes: true }) + const excludedPath = [ + '/.netlify/*', + ...entries.map((entry) => (entry.isDirectory() ? `/${entry.name}/*` : `/${entry.name}`)), + ...additionalExcludedPaths, + ] + + // Write the server entry point to the Netlify Edge Functions directory + const edgeFunctionsDir = join(resolvedConfig.root, NETLIFY_EDGE_FUNCTIONS_DIR) + await mkdir(edgeFunctionsDir, { recursive: true }) + const relativeHandlerPath = toPosixPath(relative(edgeFunctionsDir, handlerPath)) + await writeFile( + join(edgeFunctionsDir, FUNCTION_FILENAME), + generateEdgeFunction(relativeHandlerPath, excludedPath), + ) + } else { + // Write the server entry point to the Netlify Functions directory + const functionsDir = join(resolvedConfig.root, NETLIFY_FUNCTIONS_DIR) + await mkdir(functionsDir, { recursive: true }) + const relativeHandlerPath = toPosixPath(relative(functionsDir, handlerPath)) + const excludedPath = ['/.netlify/*', ...additionalExcludedPaths] + await writeFile( + join(functionsDir, FUNCTION_FILENAME), + generateNetlifyFunction(relativeHandlerPath, excludedPath), + ) + } } }, } diff --git a/packages/vite-plugin-react-router/src/runtimes/netlify-edge-functions.ts b/packages/vite-plugin-react-router/src/runtimes/netlify-edge-functions.ts new file mode 100644 index 000000000..793fbd9c5 --- /dev/null +++ b/packages/vite-plugin-react-router/src/runtimes/netlify-edge-functions.ts @@ -0,0 +1,46 @@ +/** + * This file contains code intended to be used *at runtime* in Netlify Edge Functions. + */ +import type { ServerBuild } from 'react-router' +import type { Context as NetlifyEdgeContext } from '@netlify/edge-functions' + +import { createNetlifyRequestHandler, type RequestHandler } from '../lib/handler' +import { createNetlifyRouterContext, type GetLoadContextFunction } from '../lib/context' + +// Augment the user's `AppLoadContext` to include Netlify context fields +// This is the recommended approach: https://reactrouter.com/upgrading/remix#9-update-types-for-apploadcontext. +declare module 'react-router' { + interface AppLoadContext extends NetlifyEdgeContext {} +} + +/** + * An instance of `RouterContext` providing access to + * [Netlify request context]{@link https://docs.netlify.com/build/edge-functions/api/#netlify-specific-context-object} + * + * @example context.get(netlifyRouterContext).geo?.country?.name + */ +export const netlifyRouterContext = createNetlifyRouterContext() + +/** + * Given a build and a callback to get the base loader context, this returns + * a Netlify Edge Function handler (https://docs.netlify.com/edge-functions/overview/) which renders the + * requested path. The loader context in this lifecycle will contain the Netlify Edge Functions context + * fields merged in. + */ +export function createRequestHandler({ + build, + mode, + getLoadContext, +}: { + build: ServerBuild + mode?: string + getLoadContext?: GetLoadContextFunction +}): RequestHandler { + return createNetlifyRequestHandler({ + build, + mode, + getLoadContext, + netlifyRouterContext, + runtimeName: 'edge', + }) +} diff --git a/packages/vite-plugin-react-router/src/runtimes/netlify-functions.ts b/packages/vite-plugin-react-router/src/runtimes/netlify-functions.ts new file mode 100644 index 000000000..0938a88b3 --- /dev/null +++ b/packages/vite-plugin-react-router/src/runtimes/netlify-functions.ts @@ -0,0 +1,49 @@ +/** + * This file contains code intended to be used *at runtime* in Netlify Functions. + */ +import type { ServerBuild } from 'react-router' +import type { Context as NetlifyContext } from '@netlify/functions' + +import { createNetlifyRequestHandler, type RequestHandler as RequestHandlerType } from '../lib/handler' +import { createNetlifyRouterContext, type GetLoadContextFunction as GetLoadContextFunctionType } from '../lib/context' + +// Augment the user's `AppLoadContext` to include Netlify context fields +// This is the recommended approach: https://reactrouter.com/upgrading/remix#9-update-types-for-apploadcontext. +declare module 'react-router' { + interface AppLoadContext extends NetlifyContext {} +} + +export type GetLoadContextFunction = GetLoadContextFunctionType +export type RequestHandler = RequestHandlerType + +/** + * An instance of `RouterContext` providing access to + * [Netlify request context]{@link https://docs.netlify.com/build/functions/api/#netlify-specific-context-object} + * + * @example context.get(netlifyRouterContext).geo?.country?.name + */ +export const netlifyRouterContext = createNetlifyRouterContext() + +/** + * Given a build and a callback to get the base loader context, this returns + * a Netlify Function handler (https://docs.netlify.com/functions/overview/) which renders the + * requested path. The loader context in this lifecycle will contain the Netlify Functions context + * fields merged in. + */ +export function createRequestHandler({ + build, + mode, + getLoadContext, +}: { + build: ServerBuild + mode?: string + getLoadContext?: GetLoadContextFunction +}): RequestHandler { + return createNetlifyRequestHandler({ + build, + mode, + getLoadContext, + netlifyRouterContext, + runtimeName: 'Node', + }) +} diff --git a/packages/vite-plugin-react-router/src/server.ts b/packages/vite-plugin-react-router/src/server.ts deleted file mode 100644 index 668f62524..000000000 --- a/packages/vite-plugin-react-router/src/server.ts +++ /dev/null @@ -1,123 +0,0 @@ -import type { AppLoadContext, ServerBuild } from 'react-router' -import { - createContext, - RouterContextProvider, - createRequestHandler as createReactRouterRequestHandler, -} from 'react-router' -import type { Context as NetlifyContext } from '@netlify/functions' - -// Augment the user's `AppLoadContext` to include Netlify context fields -// This is the recommended approach: https://reactrouter.com/upgrading/remix#9-update-types-for-apploadcontext. -declare module 'react-router' { - interface AppLoadContext extends NetlifyContext {} -} - -/** - * A function that returns the value to use as `context` in route `loader` and `action` functions. - * - * You can think of this as an escape hatch that allows you to pass environment/platform-specific - * values through to your loader/action. - * - * NOTE: v7.9.0 introduced a breaking change when the user opts in to `future.v8_middleware`. This - * requires returning an instance of `RouterContextProvider` instead of a plain object. We have a - * peer dependency on >=7.9.0 so we can safely *import* these, but we cannot assume the user has - * opted in to the flag. - */ -export type GetLoadContextFunction = GetLoadContextFunction_V7 | GetLoadContextFunction_V8 -export type GetLoadContextFunction_V7 = ( - request: Request, - context: NetlifyContext, -) => Promise | AppLoadContext -export type GetLoadContextFunction_V8 = ( - request: Request, - context: NetlifyContext, -) => Promise | RouterContextProvider - -export type RequestHandler = (request: Request, context: NetlifyContext) => Promise - -/** - * An instance of `ReactContextProvider` providing access to - * [Netlify request context]{@link https://docs.netlify.com/build/functions/api/#netlify-specific-context-object} - * - * @example context.get(netlifyRouterContext).geo?.country?.name - */ -export const netlifyRouterContext = - // We must use a singleton because Remix contexts rely on referential equality. - // We can't hook into the request lifecycle in dev mode, so we use a Proxy to always read from the - // current `Netlify.context` value, which is always contextual to the in-flight request. - createContext>( - new Proxy( - // Can't reference `Netlify.context` here because it isn't set outside of a request lifecycle - {}, - { - get(_target, prop, receiver) { - return Reflect.get(Netlify.context ?? {}, prop, receiver) - }, - set(_target, prop, value, receiver) { - return Reflect.set(Netlify.context ?? {}, prop, value, receiver) - }, - has(_target, prop) { - return Reflect.has(Netlify.context ?? {}, prop) - }, - deleteProperty(_target, prop) { - return Reflect.deleteProperty(Netlify.context ?? {}, prop) - }, - ownKeys(_target) { - return Reflect.ownKeys(Netlify.context ?? {}) - }, - getOwnPropertyDescriptor(_target, prop) { - return Reflect.getOwnPropertyDescriptor(Netlify.context ?? {}, prop) - }, - }, - ), - ) - -/** - * Given a build and a callback to get the base loader context, this returns - * a Netlify Function handler (https://docs.netlify.com/functions/overview/) which renders the - * requested path. The loader context in this lifecycle will contain the Netlify Functions context - * fields merged in. - */ -export function createRequestHandler({ - build, - mode, - getLoadContext, -}: { - build: ServerBuild - mode?: string - getLoadContext?: GetLoadContextFunction -}): RequestHandler { - const reactRouterHandler = createReactRouterRequestHandler(build, mode) - - return async (request: Request, netlifyContext: NetlifyContext): Promise => { - const start = Date.now() - console.log(`[${request.method}] ${request.url}`) - try { - const getDefaultReactRouterContext = () => { - const ctx = new RouterContextProvider() - ctx.set(netlifyRouterContext, netlifyContext) - - // Provide backwards compatibility with previous plain object context - // See https://reactrouter.com/how-to/middleware#migration-from-apploadcontext. - Object.assign(ctx, netlifyContext) - - return ctx - } - const reactRouterContext = (await getLoadContext?.(request, netlifyContext)) ?? getDefaultReactRouterContext() - - // @ts-expect-error -- I don't think there's any way to type this properly. We're passing a - // union of the two types here, but this function accepts a conditional type based on the - // presence of the `future.v8_middleware` flag in the user's config, which we don't have access to. - const response = await reactRouterHandler(request, reactRouterContext) - - // A useful header for debugging - response.headers.set('x-nf-runtime', 'Node') - console.log(`[${response.status}] ${request.url} (${Date.now() - start}ms)`) - return response - } catch (error) { - console.error(error) - - return new Response('Internal Error', { status: 500 }) - } - } -} diff --git a/packages/vite-plugin-react-router/tsup.config.ts b/packages/vite-plugin-react-router/tsup.config.ts new file mode 100644 index 000000000..6fcaf8dbd --- /dev/null +++ b/packages/vite-plugin-react-router/tsup.config.ts @@ -0,0 +1,25 @@ +import { defineConfig } from 'tsup' + +export default defineConfig([ + { + entry: { + index: 'src/index.ts', + serverless: 'src/runtimes/netlify-functions.ts', + edge: 'src/runtimes/netlify-edge-functions.ts', + }, + format: ['esm'], + dts: true, + target: 'node18', + // Can't use `clean: true` because of this bug: https://github.com/egoist/tsup/issues/670. + // TODO(serhalp): Switch to tsdown; tsup is no longer maintained anyway. + clean: false, + }, + // TODO(serhalp): Remove in a future major version. + { + entry: ['src/index.ts'], + format: ['cjs'], + dts: true, + target: 'node18', + clean: false, + }, +]) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 12d125d2b..7da1cbd80 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -58,8 +58,8 @@ importers: specifier: ^15.0.0 version: 15.4.3 netlify-cli: - specifier: ^20.1.1 - version: 20.1.1(@types/node@20.17.30) + specifier: ^23.9.5 + version: 23.9.5(@types/node@20.17.30) npm-run-all2: specifier: ^6.0.0 version: 6.2.6 @@ -69,6 +69,9 @@ importers: prettier: specifier: ^3.0.0 version: 3.5.3 + publint: + specifier: ^0.3.15 + version: 0.3.15 typescript: specifier: ^5.0.0 version: 5.7.3 @@ -400,6 +403,9 @@ importers: specifier: ^5.0.0 version: 5.1.25 devDependencies: + '@netlify/edge-functions': + specifier: ^2.11.0 + version: 2.12.0 '@netlify/functions': specifier: ^3.1.9 version: 3.1.9 @@ -467,7 +473,7 @@ packages: '@babel/traverse': 7.27.1 '@babel/types': 7.27.1 convert-source-map: 2.0.0 - debug: 4.4.0(supports-color@9.4.0) + debug: 4.4.0(supports-color@10.2.2) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -490,7 +496,7 @@ packages: '@babel/traverse': 7.27.1 '@babel/types': 7.27.1 convert-source-map: 2.0.0 - debug: 4.4.0(supports-color@9.4.0) + debug: 4.4.0(supports-color@10.2.2) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -837,34 +843,34 @@ packages: '@babel/parser': 7.27.2 '@babel/template': 7.27.2 '@babel/types': 7.27.1 - debug: 4.4.0(supports-color@9.4.0) + debug: 4.4.0(supports-color@10.2.2) globals: 11.12.0 transitivePeerDependencies: - supports-color - /@babel/types@7.26.10: - resolution: {integrity: sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==} + /@babel/types@7.27.1: + resolution: {integrity: sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 - dev: true - /@babel/types@7.27.1: - resolution: {integrity: sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==} + /@babel/types@7.28.4: + resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 + dev: true - /@bugsnag/browser@7.25.0: - resolution: {integrity: sha512-PzzWy5d9Ly1CU1KkxTB6ZaOw/dO+CYSfVtqxVJccy832e6+7rW/dvSw5Jy7rsNhgcKSKjZq86LtNkPSvritOLA==} + /@bugsnag/browser@8.6.0: + resolution: {integrity: sha512-7UGqTGnQqXUQ09gOlWbDTFUSbeLIIrP+hML3kTOq8Zdc8nP/iuOEflXGLV2TxWBWW8xIUPc928caFPr9EcaDuw==} dependencies: - '@bugsnag/core': 7.25.0 + '@bugsnag/core': 8.6.0 dev: true - /@bugsnag/core@7.25.0: - resolution: {integrity: sha512-JZLak1b5BVzy77CPcklViZrppac/pE07L3uSDmfSvFYSCGReXkik2txOgV05VlF9EDe36dtUAIIV7iAPDfFpQQ==} + /@bugsnag/core@8.6.0: + resolution: {integrity: sha512-94Jo443JegaiKV8z8NXMFdyTGubiUnwppWhq3kG2ldlYKtEvrmIaO5+JA58B6oveySvoRu3cCe2W9ysY7G7mDw==} dependencies: '@bugsnag/cuid': 3.2.1 '@bugsnag/safe-json-stringify': 6.0.0 @@ -877,17 +883,17 @@ packages: resolution: {integrity: sha512-zpvN8xQ5rdRWakMd/BcVkdn2F8HKlDSbM3l7duueK590WmI1T0ObTLc1V/1e55r14WNjPd5AJTYX4yPEAFVi+Q==} dev: true - /@bugsnag/js@7.25.0: - resolution: {integrity: sha512-d8n8SyKdRUz8jMacRW1j/Sj/ckhKbIEp49+Dacp3CS8afRgfMZ//NXhUFFXITsDP5cXouaejR9fx4XVapYXNgg==} + /@bugsnag/js@8.6.0: + resolution: {integrity: sha512-U+ofNTTMA2Z6tCrOhK/QhHBhLoQHoalk8Y82WWc7FAcVSoJZYadND/QuXUriNRZpC4YgJ/s/AxPeQ2y+WvMxzw==} dependencies: - '@bugsnag/browser': 7.25.0 - '@bugsnag/node': 7.25.0 + '@bugsnag/browser': 8.6.0 + '@bugsnag/node': 8.6.0 dev: true - /@bugsnag/node@7.25.0: - resolution: {integrity: sha512-KlxBaJ8EREEsfKInybAjTO9LmdDXV3cUH5+XNXyqUZrcRVuPOu4j4xvljh+n24ifok/wbFZTKVXUzrN4iKIeIA==} + /@bugsnag/node@8.6.0: + resolution: {integrity: sha512-O91sELo6zBjflVeP3roRC9l68iYaafVs5lz2N0FDkrT08mP2UljtNWpjjoR/0h1so5Ny1OxHgnZ1IrsXhz5SMQ==} dependencies: - '@bugsnag/core': 7.25.0 + '@bugsnag/core': 8.6.0 byline: 5.0.0 error-stack-parser: 2.1.4 iserror: 0.0.2 @@ -1059,7 +1065,7 @@ packages: '@commitlint/types': 17.8.1 '@types/node': 20.5.1 chalk: 4.1.2 - cosmiconfig: 8.3.6(typescript@5.7.3) + cosmiconfig: 8.3.6(typescript@5.8.3) cosmiconfig-typescript-loader: 4.4.0(@types/node@20.5.1)(cosmiconfig@8.3.6)(ts-node@10.9.2)(typescript@5.8.3) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 @@ -1238,14 +1244,6 @@ packages: enabled: 2.0.0 kuler: 2.0.0 - /@dependents/detective-less@4.1.0: - resolution: {integrity: sha512-KrkT6qO5NxqNfy68sBl6CTSoJ4SNDIS5iQArkibhlbGU4LaDukZ3q2HIkh8aUKDio6o4itU4xDR7t82Y2eP1Bg==} - engines: {node: '>=14'} - dependencies: - gonzales-pe: 4.3.0 - node-source-walk: 6.0.2 - dev: true - /@dependents/detective-less@5.0.1: resolution: {integrity: sha512-Y6+WUMsTFWE5jb20IFP4YGa5IrGY/+a/FbOSjDF/wz9gepU2hwCYSXRHP/vPwBvwcY3SVMASt4yXxbXNXigmZQ==} engines: {node: '>=18'} @@ -1281,13 +1279,20 @@ packages: /@emotion/hash@0.9.2: resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} + /@envelop/instrumentation@1.0.0: + resolution: {integrity: sha512-cxgkB66RQB95H3X27jlnxCRNTmPuSTgmBAq6/4n2Dtv4hsk4yz8FadA1ggmd0uZzvKqWD6CR+WFgTjhDqg7eyw==} + engines: {node: '>=18.0.0'} + dependencies: + '@whatwg-node/promise-helpers': 1.3.2 + tslib: 2.8.1 + dev: true + /@esbuild/aix-ppc64@0.19.11: resolution: {integrity: sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==} engines: {node: '>=12'} cpu: [ppc64] os: [aix] requiresBuild: true - dev: true optional: true /@esbuild/aix-ppc64@0.21.5: @@ -1307,21 +1312,21 @@ packages: dev: true optional: true - /@esbuild/aix-ppc64@0.25.11: - resolution: {integrity: sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==} + /@esbuild/aix-ppc64@0.25.10: + resolution: {integrity: sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] requiresBuild: true + dev: true optional: true - /@esbuild/aix-ppc64@0.25.2: - resolution: {integrity: sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==} + /@esbuild/aix-ppc64@0.25.11: + resolution: {integrity: sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] requiresBuild: true - dev: true optional: true /@esbuild/aix-ppc64@0.25.4: @@ -1346,7 +1351,6 @@ packages: cpu: [arm64] os: [android] requiresBuild: true - dev: true optional: true /@esbuild/android-arm64@0.21.5: @@ -1366,21 +1370,21 @@ packages: dev: true optional: true - /@esbuild/android-arm64@0.25.11: - resolution: {integrity: sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==} + /@esbuild/android-arm64@0.25.10: + resolution: {integrity: sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==} engines: {node: '>=18'} cpu: [arm64] os: [android] requiresBuild: true + dev: true optional: true - /@esbuild/android-arm64@0.25.2: - resolution: {integrity: sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==} + /@esbuild/android-arm64@0.25.11: + resolution: {integrity: sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==} engines: {node: '>=18'} cpu: [arm64] os: [android] requiresBuild: true - dev: true optional: true /@esbuild/android-arm64@0.25.4: @@ -1405,7 +1409,6 @@ packages: cpu: [arm] os: [android] requiresBuild: true - dev: true optional: true /@esbuild/android-arm@0.21.5: @@ -1425,21 +1428,21 @@ packages: dev: true optional: true - /@esbuild/android-arm@0.25.11: - resolution: {integrity: sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==} + /@esbuild/android-arm@0.25.10: + resolution: {integrity: sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==} engines: {node: '>=18'} cpu: [arm] os: [android] requiresBuild: true + dev: true optional: true - /@esbuild/android-arm@0.25.2: - resolution: {integrity: sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==} + /@esbuild/android-arm@0.25.11: + resolution: {integrity: sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==} engines: {node: '>=18'} cpu: [arm] os: [android] requiresBuild: true - dev: true optional: true /@esbuild/android-arm@0.25.4: @@ -1464,7 +1467,6 @@ packages: cpu: [x64] os: [android] requiresBuild: true - dev: true optional: true /@esbuild/android-x64@0.21.5: @@ -1484,21 +1486,21 @@ packages: dev: true optional: true - /@esbuild/android-x64@0.25.11: - resolution: {integrity: sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==} + /@esbuild/android-x64@0.25.10: + resolution: {integrity: sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==} engines: {node: '>=18'} cpu: [x64] os: [android] requiresBuild: true + dev: true optional: true - /@esbuild/android-x64@0.25.2: - resolution: {integrity: sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==} + /@esbuild/android-x64@0.25.11: + resolution: {integrity: sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==} engines: {node: '>=18'} cpu: [x64] os: [android] requiresBuild: true - dev: true optional: true /@esbuild/android-x64@0.25.4: @@ -1523,7 +1525,6 @@ packages: cpu: [arm64] os: [darwin] requiresBuild: true - dev: true optional: true /@esbuild/darwin-arm64@0.21.5: @@ -1543,21 +1544,21 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64@0.25.11: - resolution: {integrity: sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==} + /@esbuild/darwin-arm64@0.25.10: + resolution: {integrity: sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] requiresBuild: true + dev: true optional: true - /@esbuild/darwin-arm64@0.25.2: - resolution: {integrity: sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==} + /@esbuild/darwin-arm64@0.25.11: + resolution: {integrity: sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] requiresBuild: true - dev: true optional: true /@esbuild/darwin-arm64@0.25.4: @@ -1582,7 +1583,6 @@ packages: cpu: [x64] os: [darwin] requiresBuild: true - dev: true optional: true /@esbuild/darwin-x64@0.21.5: @@ -1602,21 +1602,21 @@ packages: dev: true optional: true - /@esbuild/darwin-x64@0.25.11: - resolution: {integrity: sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==} + /@esbuild/darwin-x64@0.25.10: + resolution: {integrity: sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==} engines: {node: '>=18'} cpu: [x64] os: [darwin] requiresBuild: true + dev: true optional: true - /@esbuild/darwin-x64@0.25.2: - resolution: {integrity: sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==} + /@esbuild/darwin-x64@0.25.11: + resolution: {integrity: sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] requiresBuild: true - dev: true optional: true /@esbuild/darwin-x64@0.25.4: @@ -1641,7 +1641,6 @@ packages: cpu: [arm64] os: [freebsd] requiresBuild: true - dev: true optional: true /@esbuild/freebsd-arm64@0.21.5: @@ -1661,21 +1660,21 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64@0.25.11: - resolution: {integrity: sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==} + /@esbuild/freebsd-arm64@0.25.10: + resolution: {integrity: sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] requiresBuild: true + dev: true optional: true - /@esbuild/freebsd-arm64@0.25.2: - resolution: {integrity: sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==} + /@esbuild/freebsd-arm64@0.25.11: + resolution: {integrity: sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] requiresBuild: true - dev: true optional: true /@esbuild/freebsd-arm64@0.25.4: @@ -1700,7 +1699,6 @@ packages: cpu: [x64] os: [freebsd] requiresBuild: true - dev: true optional: true /@esbuild/freebsd-x64@0.21.5: @@ -1720,21 +1718,21 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64@0.25.11: - resolution: {integrity: sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==} + /@esbuild/freebsd-x64@0.25.10: + resolution: {integrity: sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] requiresBuild: true + dev: true optional: true - /@esbuild/freebsd-x64@0.25.2: - resolution: {integrity: sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==} + /@esbuild/freebsd-x64@0.25.11: + resolution: {integrity: sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] requiresBuild: true - dev: true optional: true /@esbuild/freebsd-x64@0.25.4: @@ -1759,7 +1757,6 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-arm64@0.21.5: @@ -1779,21 +1776,21 @@ packages: dev: true optional: true - /@esbuild/linux-arm64@0.25.11: - resolution: {integrity: sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==} + /@esbuild/linux-arm64@0.25.10: + resolution: {integrity: sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==} engines: {node: '>=18'} cpu: [arm64] os: [linux] requiresBuild: true + dev: true optional: true - /@esbuild/linux-arm64@0.25.2: - resolution: {integrity: sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==} + /@esbuild/linux-arm64@0.25.11: + resolution: {integrity: sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==} engines: {node: '>=18'} cpu: [arm64] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-arm64@0.25.4: @@ -1818,7 +1815,6 @@ packages: cpu: [arm] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-arm@0.21.5: @@ -1838,21 +1834,21 @@ packages: dev: true optional: true - /@esbuild/linux-arm@0.25.11: - resolution: {integrity: sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==} + /@esbuild/linux-arm@0.25.10: + resolution: {integrity: sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==} engines: {node: '>=18'} cpu: [arm] os: [linux] requiresBuild: true + dev: true optional: true - /@esbuild/linux-arm@0.25.2: - resolution: {integrity: sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==} + /@esbuild/linux-arm@0.25.11: + resolution: {integrity: sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==} engines: {node: '>=18'} cpu: [arm] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-arm@0.25.4: @@ -1877,7 +1873,6 @@ packages: cpu: [ia32] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-ia32@0.21.5: @@ -1897,21 +1892,21 @@ packages: dev: true optional: true - /@esbuild/linux-ia32@0.25.11: - resolution: {integrity: sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==} + /@esbuild/linux-ia32@0.25.10: + resolution: {integrity: sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] requiresBuild: true + dev: true optional: true - /@esbuild/linux-ia32@0.25.2: - resolution: {integrity: sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==} + /@esbuild/linux-ia32@0.25.11: + resolution: {integrity: sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==} engines: {node: '>=18'} cpu: [ia32] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-ia32@0.25.4: @@ -1936,7 +1931,6 @@ packages: cpu: [loong64] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-loong64@0.21.5: @@ -1956,21 +1950,21 @@ packages: dev: true optional: true - /@esbuild/linux-loong64@0.25.11: - resolution: {integrity: sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==} + /@esbuild/linux-loong64@0.25.10: + resolution: {integrity: sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] requiresBuild: true + dev: true optional: true - /@esbuild/linux-loong64@0.25.2: - resolution: {integrity: sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==} + /@esbuild/linux-loong64@0.25.11: + resolution: {integrity: sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==} engines: {node: '>=18'} cpu: [loong64] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-loong64@0.25.4: @@ -1995,7 +1989,6 @@ packages: cpu: [mips64el] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-mips64el@0.21.5: @@ -2015,21 +2008,21 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el@0.25.11: - resolution: {integrity: sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==} + /@esbuild/linux-mips64el@0.25.10: + resolution: {integrity: sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] requiresBuild: true + dev: true optional: true - /@esbuild/linux-mips64el@0.25.2: - resolution: {integrity: sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==} + /@esbuild/linux-mips64el@0.25.11: + resolution: {integrity: sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-mips64el@0.25.4: @@ -2054,7 +2047,6 @@ packages: cpu: [ppc64] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-ppc64@0.21.5: @@ -2074,21 +2066,21 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64@0.25.11: - resolution: {integrity: sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==} + /@esbuild/linux-ppc64@0.25.10: + resolution: {integrity: sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] requiresBuild: true + dev: true optional: true - /@esbuild/linux-ppc64@0.25.2: - resolution: {integrity: sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==} + /@esbuild/linux-ppc64@0.25.11: + resolution: {integrity: sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-ppc64@0.25.4: @@ -2113,7 +2105,6 @@ packages: cpu: [riscv64] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-riscv64@0.21.5: @@ -2133,21 +2124,21 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64@0.25.11: - resolution: {integrity: sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==} + /@esbuild/linux-riscv64@0.25.10: + resolution: {integrity: sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] requiresBuild: true + dev: true optional: true - /@esbuild/linux-riscv64@0.25.2: - resolution: {integrity: sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==} + /@esbuild/linux-riscv64@0.25.11: + resolution: {integrity: sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-riscv64@0.25.4: @@ -2172,7 +2163,6 @@ packages: cpu: [s390x] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-s390x@0.21.5: @@ -2192,21 +2182,21 @@ packages: dev: true optional: true - /@esbuild/linux-s390x@0.25.11: - resolution: {integrity: sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==} + /@esbuild/linux-s390x@0.25.10: + resolution: {integrity: sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==} engines: {node: '>=18'} cpu: [s390x] os: [linux] requiresBuild: true + dev: true optional: true - /@esbuild/linux-s390x@0.25.2: - resolution: {integrity: sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==} + /@esbuild/linux-s390x@0.25.11: + resolution: {integrity: sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==} engines: {node: '>=18'} cpu: [s390x] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-s390x@0.25.4: @@ -2231,7 +2221,6 @@ packages: cpu: [x64] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-x64@0.21.5: @@ -2251,21 +2240,21 @@ packages: dev: true optional: true - /@esbuild/linux-x64@0.25.11: - resolution: {integrity: sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==} + /@esbuild/linux-x64@0.25.10: + resolution: {integrity: sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==} engines: {node: '>=18'} cpu: [x64] os: [linux] requiresBuild: true + dev: true optional: true - /@esbuild/linux-x64@0.25.2: - resolution: {integrity: sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==} + /@esbuild/linux-x64@0.25.11: + resolution: {integrity: sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==} engines: {node: '>=18'} cpu: [x64] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-x64@0.25.4: @@ -2285,21 +2274,21 @@ packages: dev: true optional: true - /@esbuild/netbsd-arm64@0.25.11: - resolution: {integrity: sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==} + /@esbuild/netbsd-arm64@0.25.10: + resolution: {integrity: sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] requiresBuild: true + dev: true optional: true - /@esbuild/netbsd-arm64@0.25.2: - resolution: {integrity: sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==} + /@esbuild/netbsd-arm64@0.25.11: + resolution: {integrity: sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] requiresBuild: true - dev: true optional: true /@esbuild/netbsd-arm64@0.25.4: @@ -2324,7 +2313,6 @@ packages: cpu: [x64] os: [netbsd] requiresBuild: true - dev: true optional: true /@esbuild/netbsd-x64@0.21.5: @@ -2344,21 +2332,21 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64@0.25.11: - resolution: {integrity: sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==} + /@esbuild/netbsd-x64@0.25.10: + resolution: {integrity: sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] requiresBuild: true + dev: true optional: true - /@esbuild/netbsd-x64@0.25.2: - resolution: {integrity: sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==} + /@esbuild/netbsd-x64@0.25.11: + resolution: {integrity: sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] requiresBuild: true - dev: true optional: true /@esbuild/netbsd-x64@0.25.4: @@ -2378,21 +2366,21 @@ packages: dev: true optional: true - /@esbuild/openbsd-arm64@0.25.11: - resolution: {integrity: sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==} + /@esbuild/openbsd-arm64@0.25.10: + resolution: {integrity: sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] requiresBuild: true + dev: true optional: true - /@esbuild/openbsd-arm64@0.25.2: - resolution: {integrity: sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==} + /@esbuild/openbsd-arm64@0.25.11: + resolution: {integrity: sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] requiresBuild: true - dev: true optional: true /@esbuild/openbsd-arm64@0.25.4: @@ -2417,7 +2405,6 @@ packages: cpu: [x64] os: [openbsd] requiresBuild: true - dev: true optional: true /@esbuild/openbsd-x64@0.21.5: @@ -2437,21 +2424,21 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64@0.25.11: - resolution: {integrity: sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==} + /@esbuild/openbsd-x64@0.25.10: + resolution: {integrity: sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] requiresBuild: true + dev: true optional: true - /@esbuild/openbsd-x64@0.25.2: - resolution: {integrity: sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==} + /@esbuild/openbsd-x64@0.25.11: + resolution: {integrity: sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] requiresBuild: true - dev: true optional: true /@esbuild/openbsd-x64@0.25.4: @@ -2462,6 +2449,15 @@ packages: requiresBuild: true optional: true + /@esbuild/openharmony-arm64@0.25.10: + resolution: {integrity: sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + requiresBuild: true + dev: true + optional: true + /@esbuild/openharmony-arm64@0.25.11: resolution: {integrity: sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==} engines: {node: '>=18'} @@ -2484,7 +2480,6 @@ packages: cpu: [x64] os: [sunos] requiresBuild: true - dev: true optional: true /@esbuild/sunos-x64@0.21.5: @@ -2504,21 +2499,21 @@ packages: dev: true optional: true - /@esbuild/sunos-x64@0.25.11: - resolution: {integrity: sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==} + /@esbuild/sunos-x64@0.25.10: + resolution: {integrity: sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==} engines: {node: '>=18'} cpu: [x64] os: [sunos] requiresBuild: true + dev: true optional: true - /@esbuild/sunos-x64@0.25.2: - resolution: {integrity: sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==} + /@esbuild/sunos-x64@0.25.11: + resolution: {integrity: sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] requiresBuild: true - dev: true optional: true /@esbuild/sunos-x64@0.25.4: @@ -2543,7 +2538,6 @@ packages: cpu: [arm64] os: [win32] requiresBuild: true - dev: true optional: true /@esbuild/win32-arm64@0.21.5: @@ -2563,21 +2557,21 @@ packages: dev: true optional: true - /@esbuild/win32-arm64@0.25.11: - resolution: {integrity: sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==} + /@esbuild/win32-arm64@0.25.10: + resolution: {integrity: sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==} engines: {node: '>=18'} cpu: [arm64] os: [win32] requiresBuild: true + dev: true optional: true - /@esbuild/win32-arm64@0.25.2: - resolution: {integrity: sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==} + /@esbuild/win32-arm64@0.25.11: + resolution: {integrity: sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==} engines: {node: '>=18'} cpu: [arm64] os: [win32] requiresBuild: true - dev: true optional: true /@esbuild/win32-arm64@0.25.4: @@ -2602,7 +2596,6 @@ packages: cpu: [ia32] os: [win32] requiresBuild: true - dev: true optional: true /@esbuild/win32-ia32@0.21.5: @@ -2622,21 +2615,21 @@ packages: dev: true optional: true - /@esbuild/win32-ia32@0.25.11: - resolution: {integrity: sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==} + /@esbuild/win32-ia32@0.25.10: + resolution: {integrity: sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==} engines: {node: '>=18'} cpu: [ia32] os: [win32] requiresBuild: true + dev: true optional: true - /@esbuild/win32-ia32@0.25.2: - resolution: {integrity: sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==} + /@esbuild/win32-ia32@0.25.11: + resolution: {integrity: sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==} engines: {node: '>=18'} cpu: [ia32] os: [win32] requiresBuild: true - dev: true optional: true /@esbuild/win32-ia32@0.25.4: @@ -2661,7 +2654,6 @@ packages: cpu: [x64] os: [win32] requiresBuild: true - dev: true optional: true /@esbuild/win32-x64@0.21.5: @@ -2681,21 +2673,21 @@ packages: dev: true optional: true - /@esbuild/win32-x64@0.25.11: - resolution: {integrity: sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==} + /@esbuild/win32-x64@0.25.10: + resolution: {integrity: sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==} engines: {node: '>=18'} cpu: [x64] os: [win32] requiresBuild: true + dev: true optional: true - /@esbuild/win32-x64@0.25.2: - resolution: {integrity: sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==} + /@esbuild/win32-x64@0.25.11: + resolution: {integrity: sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==} engines: {node: '>=18'} cpu: [x64] os: [win32] requiresBuild: true - dev: true optional: true /@esbuild/win32-x64@0.25.4: @@ -2746,7 +2738,7 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 - debug: 4.4.0(supports-color@9.4.0) + debug: 4.4.0(supports-color@10.2.2) espree: 9.6.1 globals: 13.24.0 ignore: 5.3.2 @@ -2768,6 +2760,10 @@ packages: engines: {node: '>=14'} dev: true + /@fastify/accept-negotiator@2.0.1: + resolution: {integrity: sha512-/c/TW2bO/v9JeEgoD/g1G5GxGeCF1Hafdf79WPmUlgYiBXummY0oX3VVq4yFkKKVBKDNlaDUYoab7g38RpPqCQ==} + dev: true + /@fastify/ajv-compiler@3.6.0: resolution: {integrity: sha512-LwdXQJjmMD+GwLOkP7TVC68qa+pSSogeWWmznRJ/coyTcfe9qA05AHFSe1eZFwK6q+xVRpChnvFUkf1iYaSZsQ==} dependencies: @@ -2822,7 +2818,7 @@ packages: deprecated: Use @eslint/config-array instead dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.0(supports-color@9.4.0) + debug: 4.4.0(supports-color@10.2.2) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -2847,8 +2843,235 @@ packages: resolution: {integrity: sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==} dev: true - /@import-maps/resolve@1.0.1: - resolution: {integrity: sha512-tWZNBIS1CoekcwlMuyG2mr0a1Wo5lb5lEHwwWvZo+5GLgr3e9LLDTtmgtCWEwBpXMkxn9D+2W9j2FY6eZQq0tA==} + /@img/colour@1.0.0: + resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} + engines: {node: '>=18'} + dev: true + + /@img/sharp-darwin-arm64@0.34.4: + resolution: {integrity: sha512-sitdlPzDVyvmINUdJle3TNHl+AG9QcwiAMsXmccqsCOMZNIdW2/7S26w0LyU8euiLVzFBL3dXPwVCq/ODnf2vA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.2.3 + dev: true + optional: true + + /@img/sharp-darwin-x64@0.34.4: + resolution: {integrity: sha512-rZheupWIoa3+SOdF/IcUe1ah4ZDpKBGWcsPX6MT0lYniH9micvIU7HQkYTfrx5Xi8u+YqwLtxC/3vl8TQN6rMg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.2.3 + dev: true + optional: true + + /@img/sharp-libvips-darwin-arm64@1.2.3: + resolution: {integrity: sha512-QzWAKo7kpHxbuHqUC28DZ9pIKpSi2ts2OJnoIGI26+HMgq92ZZ4vk8iJd4XsxN+tYfNJxzH6W62X5eTcsBymHw==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@img/sharp-libvips-darwin-x64@1.2.3: + resolution: {integrity: sha512-Ju+g2xn1E2AKO6YBhxjj+ACcsPQRHT0bhpglxcEf+3uyPY+/gL8veniKoo96335ZaPo03bdDXMv0t+BBFAbmRA==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@img/sharp-libvips-linux-arm64@1.2.3: + resolution: {integrity: sha512-I4RxkXU90cpufazhGPyVujYwfIm9Nk1QDEmiIsaPwdnm013F7RIceaCc87kAH+oUB1ezqEvC6ga4m7MSlqsJvQ==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@img/sharp-libvips-linux-arm@1.2.3: + resolution: {integrity: sha512-x1uE93lyP6wEwGvgAIV0gP6zmaL/a0tGzJs/BIDDG0zeBhMnuUPm7ptxGhUbcGs4okDJrk4nxgrmxpib9g6HpA==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@img/sharp-libvips-linux-ppc64@1.2.3: + resolution: {integrity: sha512-Y2T7IsQvJLMCBM+pmPbM3bKT/yYJvVtLJGfCs4Sp95SjvnFIjynbjzsa7dY1fRJX45FTSfDksbTp6AGWudiyCg==} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@img/sharp-libvips-linux-s390x@1.2.3: + resolution: {integrity: sha512-RgWrs/gVU7f+K7P+KeHFaBAJlNkD1nIZuVXdQv6S+fNA6syCcoboNjsV2Pou7zNlVdNQoQUpQTk8SWDHUA3y/w==} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@img/sharp-libvips-linux-x64@1.2.3: + resolution: {integrity: sha512-3JU7LmR85K6bBiRzSUc/Ff9JBVIFVvq6bomKE0e63UXGeRw2HPVEjoJke1Yx+iU4rL7/7kUjES4dZ/81Qjhyxg==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@img/sharp-libvips-linuxmusl-arm64@1.2.3: + resolution: {integrity: sha512-F9q83RZ8yaCwENw1GieztSfj5msz7GGykG/BA+MOUefvER69K/ubgFHNeSyUu64amHIYKGDs4sRCMzXVj8sEyw==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@img/sharp-libvips-linuxmusl-x64@1.2.3: + resolution: {integrity: sha512-U5PUY5jbc45ANM6tSJpsgqmBF/VsL6LnxJmIf11kB7J5DctHgqm0SkuXzVWtIY90GnJxKnC/JT251TDnk1fu/g==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@img/sharp-linux-arm64@0.34.4: + resolution: {integrity: sha512-YXU1F/mN/Wu786tl72CyJjP/Ngl8mGHN1hST4BGl+hiW5jhCnV2uRVTNOcaYPs73NeT/H8Upm3y9582JVuZHrQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.2.3 + dev: true + optional: true + + /@img/sharp-linux-arm@0.34.4: + resolution: {integrity: sha512-Xyam4mlqM0KkTHYVSuc6wXRmM7LGN0P12li03jAnZ3EJWZqj83+hi8Y9UxZUbxsgsK1qOEwg7O0Bc0LjqQVtxA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.2.3 + dev: true + optional: true + + /@img/sharp-linux-ppc64@0.34.4: + resolution: {integrity: sha512-F4PDtF4Cy8L8hXA2p3TO6s4aDt93v+LKmpcYFLAVdkkD3hSxZzee0rh6/+94FpAynsuMpLX5h+LRsSG3rIciUQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ppc64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-ppc64': 1.2.3 + dev: true + optional: true + + /@img/sharp-linux-s390x@0.34.4: + resolution: {integrity: sha512-qVrZKE9Bsnzy+myf7lFKvng6bQzhNUAYcVORq2P7bDlvmF6u2sCmK2KyEQEBdYk+u3T01pVsPrkj943T1aJAsw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.2.3 + dev: true + optional: true + + /@img/sharp-linux-x64@0.34.4: + resolution: {integrity: sha512-ZfGtcp2xS51iG79c6Vhw9CWqQC8l2Ot8dygxoDoIQPTat/Ov3qAa8qpxSrtAEAJW+UjTXc4yxCjNfxm4h6Xm2A==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.2.3 + dev: true + optional: true + + /@img/sharp-linuxmusl-arm64@0.34.4: + resolution: {integrity: sha512-8hDVvW9eu4yHWnjaOOR8kHVrew1iIX+MUgwxSuH2XyYeNRtLUe4VNioSqbNkB7ZYQJj9rUTT4PyRscyk2PXFKA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.2.3 + dev: true + optional: true + + /@img/sharp-linuxmusl-x64@0.34.4: + resolution: {integrity: sha512-lU0aA5L8QTlfKjpDCEFOZsTYGn3AEiO6db8W5aQDxj0nQkVrZWmN3ZP9sYKWJdtq3PWPhUNlqehWyXpYDcI9Sg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.2.3 + dev: true + optional: true + + /@img/sharp-wasm32@0.34.4: + resolution: {integrity: sha512-33QL6ZO/qpRyG7woB/HUALz28WnTMI2W1jgX3Nu2bypqLIKx/QKMILLJzJjI+SIbvXdG9fUnmrxR7vbi1sTBeA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + requiresBuild: true + dependencies: + '@emnapi/runtime': 1.5.0 + dev: true + optional: true + + /@img/sharp-win32-arm64@0.34.4: + resolution: {integrity: sha512-2Q250do/5WXTwxW3zjsEuMSv5sUU4Tq9VThWKlU2EYLm4MB7ZeMwF+SFJutldYODXF6jzc6YEOC+VfX0SZQPqA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@img/sharp-win32-ia32@0.34.4: + resolution: {integrity: sha512-3ZeLue5V82dT92CNL6rsal6I2weKw1cYu+rGKm8fOCCtJTR2gYeUfY3FqUnIJsMUPIH68oS5jmZ0NiJ508YpEw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@img/sharp-win32-x64@0.34.4: + resolution: {integrity: sha512-xIyj4wpYs8J18sVN3mSQjwrw7fKUqRw+Z5rnHNCy5fYTxigBz81u5mOMPmFumwjcn8+ld1ppptMBCLic1nz6ig==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@import-maps/resolve@2.0.0: + resolution: {integrity: sha512-RwzRTpmrrS6Q1ZhQExwuxJGK1Wqhv4stt+OF2JzS+uawewpwNyU7EJL1WpBex7aDiiGLs4FsXGkfUBdYuX7xiQ==} + dev: true + + /@inquirer/external-editor@1.0.2(@types/node@20.17.30): + resolution: {integrity: sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + dependencies: + '@types/node': 20.17.30 + chardet: 2.1.0 + iconv-lite: 0.7.0 dev: true /@isaacs/cliui@8.0.2: @@ -2868,17 +3091,6 @@ packages: dependencies: minipass: 7.1.2 - /@jest/types@27.5.1: - resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-reports': 3.0.4 - '@types/node': 20.17.30 - '@types/yargs': 16.0.9 - chalk: 4.1.2 - dev: true - /@jridgewell/gen-mapping@0.3.8: resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} engines: {node: '>=6.0.0'} @@ -2918,32 +3130,14 @@ packages: engines: {node: '>=8'} dev: true - /@mapbox/node-pre-gyp@1.0.11(supports-color@9.4.0): - resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} - hasBin: true - dependencies: - detect-libc: 2.0.3 - https-proxy-agent: 5.0.1(supports-color@9.4.0) - make-dir: 3.1.0 - node-fetch: 2.7.0 - nopt: 5.0.0 - npmlog: 5.0.1 - rimraf: 3.0.2 - semver: 7.7.1 - tar: 6.2.1 - transitivePeerDependencies: - - encoding - - supports-color - dev: true - - /@mapbox/node-pre-gyp@2.0.0: + /@mapbox/node-pre-gyp@2.0.0(supports-color@10.2.2): resolution: {integrity: sha512-llMXd39jtP0HpQLVI37Bf1m2ADlEb35GYSh1SDSLsBhR+5iCxiNGlT31yqbNtVHygHAtMy6dWFERpU2JgufhPg==} engines: {node: '>=18'} hasBin: true dependencies: consola: 3.4.0 detect-libc: 2.0.3 - https-proxy-agent: 7.0.6 + https-proxy-agent: 7.0.6(supports-color@10.2.2) node-fetch: 2.7.0 nopt: 8.1.0 semver: 7.7.1 @@ -2985,12 +3179,34 @@ packages: dev: true optional: true + /@netlify/ai@0.3.0(@netlify/api@14.0.7): + resolution: {integrity: sha512-nMsJS6VXDRrwdqkKdmq4fAn4idyl+sDGwXPB+fjdeX/cX1etWynkKAWK5DifxshjgWlfCAp5GD7ZtVR5bpZQJA==} + engines: {node: '>=20.6.1'} + peerDependencies: + '@netlify/api': '>=14.0.0' + dependencies: + '@netlify/api': 14.0.7 + dev: true + + /@netlify/api@14.0.7: + resolution: {integrity: sha512-smSD3MnyUwi+rdcvRlD2EAGEpzK9RRMiGxaXzKW7FGqIlZSEe08aPySuC0d5BXwl/7EmT43hOkBHH4KtP8DxcQ==} + engines: {node: '>=18.14.0'} + dependencies: + '@netlify/open-api': 2.41.0 + node-fetch: 3.3.2 + p-wait-for: 5.0.2 + picoquery: 2.5.0 + dev: true + /@netlify/binary-info@1.0.0: resolution: {integrity: sha512-4wMPu9iN3/HL97QblBsBay3E1etIciR84izI3U+4iALY+JHCrI+a2jO0qbAZ/nxKoegypYEaiiqWXylm+/zfrw==} - /@netlify/blobs@8.2.0: - resolution: {integrity: sha512-9djLZHBKsoKk8XCgwWSEPK9QnT8qqxEQGuYh48gFIcNLvpBKkLnHbDZuyUxmNemCfDz7h0HnMXgSPnnUVgARhg==} + /@netlify/blobs@10.1.0: + resolution: {integrity: sha512-dFpqDc6/x5LEu9L7kblCQu00CFEchH8J42jmQoXPuhKoE7avajzeLTbVKA8Olk3S/c2m9ejegrgbhL8NRA2Jyw==} engines: {node: ^14.16.0 || >=16.0.0} + dependencies: + '@netlify/dev-utils': 4.3.0 + '@netlify/runtime-utils': 2.2.0 dev: true /@netlify/blobs@9.1.2: @@ -3000,144 +3216,138 @@ packages: '@netlify/dev-utils': 2.2.0 '@netlify/runtime-utils': 1.3.1 - /@netlify/build-info@9.0.4: - resolution: {integrity: sha512-slX+2rPHeaCBGDckExXvHKl5DBVR3uJi+Qeyb6u5bUvdp5f34Ib/61XgK9hO0OvIC7eGRgNcVIPrsE9x50+AEg==} - engines: {node: ^14.16.0 || >=16.0.0} + /@netlify/build-info@10.0.9: + resolution: {integrity: sha512-lkcEejs4D0gwDIVtyRpIXXIv4SPZOii9cstGI5eOsMwoMTlZRL/jniZOSeMk2ZS147l9ncD6vtKxaZPnW1MJew==} + engines: {node: '>=18.14.0'} hasBin: true dependencies: - '@bugsnag/js': 7.25.0 + '@bugsnag/js': 8.6.0 '@iarna/toml': 2.2.5 - dot-prop: 7.2.0 - find-up: 6.3.0 + dot-prop: 9.0.0 + find-up: 7.0.0 minimatch: 9.0.5 - read-pkg: 7.1.0 - semver: 7.7.1 - yaml: 2.7.1 + read-pkg: 9.0.1 + semver: 7.7.2 + yaml: 2.8.1 yargs: 17.7.2 dev: true - /@netlify/build@32.1.0(@opentelemetry/api@1.8.0)(@types/node@20.17.30): - resolution: {integrity: sha512-Fq8f+WFPSxzmfk4WEQGKGeFZ+4E/IEG48Xn2SinJyHUsj3Jy8QHOJz5ViBvGW32J7l20DANu17CEjKc+n2cT0w==} - engines: {node: ^14.16.0 || >=16.0.0} + /@netlify/build@35.2.7(@opentelemetry/api@1.8.0)(@types/node@20.17.30): + resolution: {integrity: sha512-M4SMpqzMGnW9o0gUxhYKPop5tQInbtoFubqgnL9FIb2b0ulLW2O4dK0i6X7Q8eik6esw1cKzgQ5BUwo0m2zshQ==} + engines: {node: '>=18.14.0'} hasBin: true peerDependencies: - '@netlify/opentelemetry-sdk-setup': ^1.1.0 + '@netlify/opentelemetry-sdk-setup': ^2.0.0 '@opentelemetry/api': ~1.8.0 peerDependenciesMeta: '@netlify/opentelemetry-sdk-setup': optional: true dependencies: - '@bugsnag/js': 7.25.0 - '@netlify/blobs': 8.2.0 - '@netlify/cache-utils': 5.2.0 - '@netlify/config': 22.0.1 - '@netlify/edge-bundler': 13.0.2 - '@netlify/framework-info': 9.9.3 - '@netlify/functions-utils': 5.3.16(supports-color@9.4.0) - '@netlify/git-utils': 5.2.0 - '@netlify/opentelemetry-utils': 1.3.1(@opentelemetry/api@1.8.0) + '@bugsnag/js': 8.6.0 + '@netlify/blobs': 10.1.0 + '@netlify/cache-utils': 6.0.4 + '@netlify/config': 24.0.6 + '@netlify/edge-bundler': 14.8.0 + '@netlify/functions-utils': 6.2.11(supports-color@10.2.2) + '@netlify/git-utils': 6.0.2 + '@netlify/opentelemetry-utils': 2.0.1(@opentelemetry/api@1.8.0) '@netlify/plugins-list': 6.80.0 - '@netlify/run-utils': 5.2.0 - '@netlify/zip-it-and-ship-it': 10.0.7(supports-color@9.4.0) + '@netlify/run-utils': 6.0.2 + '@netlify/zip-it-and-ship-it': 14.1.11(supports-color@10.2.2) '@opentelemetry/api': 1.8.0 '@sindresorhus/slugify': 2.2.1 - ansi-escapes: 6.2.1 - chalk: 5.4.1 + ansi-escapes: 7.1.1 + ansis: 4.2.0 clean-stack: 5.2.0 - execa: 7.2.0 + execa: 8.0.1 fdir: 6.5.0(picomatch@4.0.3) - figures: 5.0.0 - filter-obj: 5.1.0 - got: 12.6.1 - hot-shots: 10.2.1 + figures: 6.1.0 + filter-obj: 6.1.0 + hot-shots: 11.2.0 indent-string: 5.0.0 is-plain-obj: 4.1.0 - js-yaml: 4.1.0 - keep-func-props: 4.0.1 - locate-path: 7.2.0 - log-process-errors: 8.0.0 - map-obj: 5.0.2 + keep-func-props: 6.0.0 + log-process-errors: 11.0.1 memoize-one: 6.0.0 minimatch: 9.0.5 - node-fetch: 3.3.2 - os-name: 5.1.0 + os-name: 6.1.0 p-event: 6.0.1 - p-every: 2.0.0 p-filter: 4.1.0 p-locate: 6.0.0 p-map: 7.0.3 p-reduce: 3.0.0 + package-directory: 8.1.0 path-exists: 5.0.0 - path-type: 5.0.0 - pkg-dir: 7.0.0 - pretty-ms: 8.0.0 + pretty-ms: 9.3.0 ps-list: 8.1.1 - read-pkg-up: 9.1.0 - readdirp: 3.6.0 + read-package-up: 11.0.0 + readdirp: 4.1.2 resolve: 2.0.0-next.5 rfdc: 1.4.1 safe-json-stringify: 1.2.0 - semver: 7.7.1 - string-width: 5.1.2 - strip-ansi: 7.1.0 - supports-color: 9.4.0 - terminal-link: 3.0.0 + semver: 7.7.2 + string-width: 7.2.0 + supports-color: 10.2.2 + terminal-link: 4.0.0 ts-node: 10.9.2(@types/node@20.17.30)(typescript@5.8.3) typescript: 5.8.3 - uuid: 9.0.1 + uuid: 11.1.0 + yaml: 2.8.1 yargs: 17.7.2 + zod: 3.25.76 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' - '@types/node' + - bare-abort-controller - encoding - picomatch - rollup dev: true - /@netlify/cache-utils@5.2.0: - resolution: {integrity: sha512-kKzGQ9gKNRUjqFMC1/1goeTe1WfzL6KhphwXac7tialowg10Dtmr2X+eDzfH9enGvD6vhYR4a0QMTQWkjfPVmg==} - engines: {node: ^14.16.0 || >=16.0.0} + /@netlify/cache-utils@6.0.4: + resolution: {integrity: sha512-KD6IXLbJcjJ5BhjGCy32BJtp1WxvTBS9J5cvdxjbBJGgfLWuJwzUzU8LR2sA4fppCCnEdKJdKy40OcVGZE0iUg==} + engines: {node: '>=18.14.0'} dependencies: - cpy: 9.0.1 - get-stream: 6.0.1 - globby: 13.2.2 + cpy: 11.1.0 + get-stream: 9.0.1 + globby: 14.1.0 junk: 4.0.1 locate-path: 7.2.0 move-file: 3.1.0 - path-exists: 5.0.0 - readdirp: 3.6.0 + readdirp: 4.1.2 dev: true - /@netlify/config@22.0.1: - resolution: {integrity: sha512-ukHIeUsHw13boIqalCrrOkJ2Q07RQ2KaiXNA6WQnqDOh8uJ4vQa/2tjwa/i3FWDbBuvSwUGBwjObS7PelVcf8w==} - engines: {node: ^14.16.0 || >=16.0.0} + /@netlify/config@24.0.6: + resolution: {integrity: sha512-ARlsTjoxzjeQQrXqQvTXaGZIHnxZJ99YZId4j3nN4v0gEDtK5Dehsx/Q71+UCYig3uZDjPFP0kyFK52DA++7Aw==} + engines: {node: '>=18.14.0'} hasBin: true dependencies: '@iarna/toml': 2.2.5 - '@netlify/headers-parser': 8.0.0 - '@netlify/redirect-parser': 14.5.1 - chalk: 5.4.1 + '@netlify/api': 14.0.7 + '@netlify/headers-parser': 9.0.2 + '@netlify/redirect-parser': 15.0.3 + chalk: 5.6.2 cron-parser: 4.9.0 deepmerge: 4.3.1 - dot-prop: 7.2.0 - execa: 7.2.0 + dot-prop: 9.0.0 + execa: 8.0.1 fast-safe-stringify: 2.1.1 - figures: 5.0.0 - filter-obj: 5.1.0 - find-up: 6.3.0 + figures: 6.1.0 + filter-obj: 6.1.0 + find-up: 7.0.0 indent-string: 5.0.0 is-plain-obj: 4.1.0 - js-yaml: 4.1.0 map-obj: 5.0.2 - netlify: 13.3.5 - node-fetch: 3.3.2 omit.js: 2.0.2 p-locate: 6.0.0 - path-type: 5.0.0 + path-type: 6.0.0 + read-package-up: 11.0.0 tomlify-j0.4: 3.0.0 - validate-npm-package-name: 4.0.0 + validate-npm-package-name: 5.0.1 + yaml: 2.8.1 yargs: 17.7.2 + zod: 4.1.12 dev: true /@netlify/dev-utils@2.2.0: @@ -3156,41 +3366,66 @@ packages: uuid: 11.1.0 write-file-atomic: 6.0.0 - /@netlify/edge-bundler@13.0.2: - resolution: {integrity: sha512-q95EzA9lRCL7tsLVhgvFEfuYvL+gJFC8T//Q7O1MFKAUGJVGa00UBD9QDQAFEjTg2e9+yYBFXmjsUqCUPM2GUA==} - engines: {node: ^14.16.0 || >=16.0.0} + /@netlify/dev-utils@4.3.0: + resolution: {integrity: sha512-vZAL8pMuj3yPQlmHSgyaA/UQFxc6pZgU0LucFJ1+IPWGJtIzBXHRvuR4acpoP72HtyQPUHJ42s7U9GaaSGVNHg==} + engines: {node: ^18.14.0 || >=20} dependencies: - '@import-maps/resolve': 1.0.1 + '@whatwg-node/server': 0.10.13 + ansis: 4.2.0 + chokidar: 4.0.3 + decache: 4.6.2 + dettle: 1.0.5 + dot-prop: 9.0.0 + empathic: 2.0.0 + env-paths: 3.0.0 + image-size: 2.0.2 + js-image-generator: 1.0.4 + parse-gitignore: 2.0.0 + semver: 7.7.2 + tmp-promise: 3.0.3 + uuid: 11.1.0 + write-file-atomic: 5.0.1 + dev: true + + /@netlify/edge-bundler@14.8.0: + resolution: {integrity: sha512-BzIZ9pn8yLaHVXUVPZQqbWgzXVvfbJsRjWSXNjYJHF7dU9vvr/q+seOOqG+epN+9Sbn9xb2KxTcfJasx7wgAmw==} + engines: {node: '>=18.14.0'} + dependencies: + '@import-maps/resolve': 2.0.0 ajv: 8.17.1 ajv-errors: 3.0.0(ajv@8.17.1) better-ajv-errors: 1.2.0(ajv@8.17.1) common-path-prefix: 3.0.0 env-paths: 3.0.0 - esbuild: 0.25.2 - execa: 7.2.0 - find-up: 6.3.0 - get-package-name: 2.2.0 - get-port: 6.1.2 - is-path-inside: 4.0.0 - node-fetch: 3.3.2 + esbuild: 0.25.10 + execa: 8.0.1 + find-up: 7.0.0 + get-port: 7.1.0 node-stream-zip: 1.15.0 - p-retry: 5.1.2 + p-retry: 6.2.1 p-wait-for: 5.0.2 parse-imports: 2.2.1 path-key: 4.0.0 - semver: 7.7.1 + semver: 7.7.2 + tar: 7.4.3 tmp-promise: 3.0.3 urlpattern-polyfill: 8.0.2 - uuid: 9.0.1 + uuid: 11.1.0 dev: true - /@netlify/edge-functions@2.11.1: - resolution: {integrity: sha512-pyQOTZ8a+ge5lZlE+H/UAHyuqQqtL5gE0pXrHT9mOykr3YQqnkB2hZMtx12odatZ87gHg4EA+UPyMZUbLfnXvw==} + /@netlify/edge-functions-bootstrap@2.17.1: + resolution: {integrity: sha512-KyNJbDhK1rC5wEeI7bXPgfl8QvADMHqNy2nwNJG60EHVRXTF0zxFnOpt/p0m2C512gcMXRrKZxaOZQ032RHVbw==} dev: true /@netlify/edge-functions@2.12.0: resolution: {integrity: sha512-6EWKqCQvOWyM6CHOofvDglX8qkBL2xcMF2T0h7kzZRrdBvHMRgxTk6BmPlBGt8z4LubSQo6vDAb46MYNJ7ZyaA==} - dev: false + + /@netlify/edge-functions@3.0.1: + resolution: {integrity: sha512-5Rd+gd2uD/iHReiY2p0KhVpgYnWKJsFyey2CN8WwGLQTq0GA7CEWkEMyks1azuAkChlqS4YJbpa//lMBmyrjSA==} + engines: {node: '>=18.0.0'} + dependencies: + '@netlify/types': 2.1.0 + dev: true /@netlify/eslint-config-node@7.0.1(typescript@5.7.3): resolution: {integrity: sha512-4xAE0lM3BaVOZu1Oil5Yy1FsiYjZwNS/uwE+4fY61Buuyv3An16mC9LbNCxQ5EFzo3g7U2SRyZdGBHM6ACRLpw==} @@ -3237,29 +3472,15 @@ packages: - typescript dev: true - /@netlify/framework-info@9.9.3: - resolution: {integrity: sha512-kPTF5yemdmadP/+qMDcc3p10NkZKXHXGm2BCFvB192paCNxQrSJz+qb56SO+kvSn9exg+HvhGJ0gfIcVwPjzWw==} - engines: {node: ^14.14.0 || >=16.0.0} - dependencies: - ajv: 8.17.1 - filter-obj: 5.1.0 - find-up: 6.3.0 - is-plain-obj: 4.1.0 - locate-path: 7.2.0 - p-filter: 4.1.0 - p-locate: 6.0.0 - read-pkg-up: 9.1.0 - semver: 7.7.1 - dev: true - - /@netlify/functions-utils@5.3.16(supports-color@9.4.0): - resolution: {integrity: sha512-RDvY+WWacc/5MBPLseNwtHTouGj3CNSZzquMa2X6C+6vGECsMXSem2mKobnqcewL1IUZeAin/O8poHTwdgpQSQ==} - engines: {node: ^14.16.0 || >=16.0.0} + /@netlify/functions-utils@6.2.11(supports-color@10.2.2): + resolution: {integrity: sha512-gCCjXtCtBShvZvCZwO2IxWYVjHUssnrSDea/JRoVBFc4DP3qbNoa1hdwsZ8fydguMOQaf5zFIqnDF4DKXaMA6Q==} + engines: {node: '>=18.14.0'} dependencies: - '@netlify/zip-it-and-ship-it': 10.0.7(supports-color@9.4.0) - cpy: 9.0.1 + '@netlify/zip-it-and-ship-it': 14.1.11(supports-color@10.2.2) + cpy: 11.1.0 path-exists: 5.0.0 transitivePeerDependencies: + - bare-abort-controller - encoding - rollup - supports-color @@ -3287,20 +3508,20 @@ packages: - rollup - supports-color - /@netlify/git-utils@5.2.0: - resolution: {integrity: sha512-maNQyhQ6zTS5Kwl03HXoUa7uTNjmCvZea5Jko2pyDWz0xW1cunnil+4s33wXrMZJNDvyv97O2vkC5N1sAS3fyQ==} - engines: {node: ^14.16.0 || >=16.0.0} + /@netlify/git-utils@6.0.2: + resolution: {integrity: sha512-ASp8T6ZAxL5OE0xvTTn5+tIBua5F8ruLH7oYtI/m2W/8rYb9V3qvNeenf9SnKlGj1xv6mPv8l7Tc93kmBLLofw==} + engines: {node: '>=18.14.0'} dependencies: - execa: 6.1.0 + execa: 8.0.1 map-obj: 5.0.2 micromatch: 4.0.8 moize: 6.1.6 path-exists: 5.0.0 dev: true - /@netlify/headers-parser@8.0.0: - resolution: {integrity: sha512-TAxRPOpPDphDttDukWj1mTJtjxA81FhxV9EBOwP3DipqKMNs1mXlucMu/3kvIKG1o2XMrQbvSttHK8URdVROrw==} - engines: {node: ^14.16.0 || >=16.0.0} + /@netlify/headers-parser@9.0.2: + resolution: {integrity: sha512-86YEGPxVemhksY1LeSr8NSOyH11RHvYHq+FuBJnTlPZoRDX+TD+0TAxF6lwzAgVTd1VPkyFEHlNgUGqw7aNzRQ==} + engines: {node: '>=18.14.0'} dependencies: '@iarna/toml': 2.2.5 escape-string-regexp: 5.0.0 @@ -3440,9 +3661,14 @@ packages: resolution: {integrity: sha512-zXnRFkxgNsalSgU8/vwTWnav3R+8KG8SsqHxqaoJdjjJtnZR7wo3f+qqu4z+WtZ/4V7fly91HFUwZ6Uz2OdW7w==} engines: {node: '>=14.8.0'} - /@netlify/opentelemetry-utils@1.3.1(@opentelemetry/api@1.8.0): - resolution: {integrity: sha512-WAzYBrRQdPw+2JWRESxmUwBSOnUGGgBh4l9GvNmMCxa/ecLw42MhNIONETZ+j2hvQd9T7qRxHece/QREgF9J0g==} - engines: {node: '>=18.0.0'} + /@netlify/open-api@2.41.0: + resolution: {integrity: sha512-e9eGmWs0AAJF5jxRlr6FJyfyftY3sj5IXyT26QF6vHXK5rzZNpJHhFenszKtuVFhUgScJeOfCOucvodqfKAzeg==} + engines: {node: '>=14.8.0'} + dev: true + + /@netlify/opentelemetry-utils@2.0.1(@opentelemetry/api@1.8.0): + resolution: {integrity: sha512-SE9dZZR620yTYky8By/8h+UaTMugxue8oL51aRUrvtDg7y8Ed6fYKC8VY5JExCkLWQ1k3874qktwfc5gdMVx+w==} + engines: {node: '>=18.14.0'} peerDependencies: '@opentelemetry/api': ~1.8.0 dependencies: @@ -3454,56 +3680,65 @@ packages: engines: {node: ^14.14.0 || >=16.0.0} dev: true - /@netlify/redirect-parser@14.5.1: - resolution: {integrity: sha512-pg5Oa/da6P0djfLOaBj/5IiB4tXNzGlvl2IK6MzxM4W0zkwdLprw3NjduBeaSmWe7h+9WZKKVTh2IVNEXqs3iQ==} - engines: {node: ^14.16.0 || >=16.0.0} + /@netlify/redirect-parser@15.0.3: + resolution: {integrity: sha512-/HB3fcRRNgf6O/pbLn4EYNDHrU2kiadMMnazg8/OjvQK2S9i4y61vQcrICvDxYKUKQdgeEaABUuaCNAJFnfD9w==} + engines: {node: '>=18.14.0'} dependencies: '@iarna/toml': 2.2.5 fast-safe-stringify: 2.1.1 - filter-obj: 5.1.0 is-plain-obj: 4.1.0 path-exists: 5.0.0 dev: true - /@netlify/run-utils@5.2.0: - resolution: {integrity: sha512-bsrv7Sjge5g71VMgZ65Ioc5q4lHXdLQCmpUU6sY06Aeol1psi1iDOGVMx/7ExJjbCtQgxye35wZjAz60i6X22Q==} - engines: {node: ^14.16.0 || >=16.0.0} + /@netlify/run-utils@6.0.2: + resolution: {integrity: sha512-62K++LDoPqcR1hTnOL2JhuAfY0LMgQ6MgW89DehPplKLbKaEXQH1K1+hUDvgKsn68ofTpE1CTq30PGZQo8fVxw==} + engines: {node: '>=18.14.0'} dependencies: - execa: 6.1.0 + execa: 8.0.1 dev: true /@netlify/runtime-utils@1.3.1: resolution: {integrity: sha512-7/vIJlMYrPJPlEW84V2yeRuG3QBu66dmlv9neTmZ5nXzwylhBEOhy11ai+34A8mHCSZI4mKns25w3HM9kaDdJg==} engines: {node: '>=16.0.0'} - /@netlify/serverless-functions-api@1.38.0: - resolution: {integrity: sha512-AuTzLH4BlQxPViwdEP9WcW/9NjqmjzaPHxOd9fyaMZUOkAgF0iauio9PF9QylAtgyodhLd6mGuASESZZiJcXaw==} - engines: {node: '>=18.0.0'} + /@netlify/runtime-utils@2.2.0: + resolution: {integrity: sha512-K3kWIxIMucibzQsATU2xw2JI+OpS9PZfPW/a+81gmeLC8tLv5YAxTVT0NFY/3imk1kcOJb9g7658jPLqDJaiAw==} + engines: {node: ^18.14.0 || >=20} dev: true /@netlify/serverless-functions-api@1.41.2: resolution: {integrity: sha512-pfCkH50JV06SGMNsNPjn8t17hOcId4fA881HeYQgMBOrewjsw4csaYgHEnCxCEu24Y5x75E2ULbFpqm9CvRCqw==} engines: {node: '>=18.0.0'} - /@netlify/zip-it-and-ship-it@10.0.7(supports-color@9.4.0): - resolution: {integrity: sha512-h7VUDyY6ePD8JA1tM0m8zbWDp03UOmBlPdqgl9/aK1fSVYcoo0qhXmp1Z1n+viKkNkmvBx4KvOLScUJEXPeRnA==} - engines: {node: ^14.18.0 || >=16.0.0} + /@netlify/serverless-functions-api@2.7.1: + resolution: {integrity: sha512-NQcLB8BHbIsgSBPk9A/OBR5mGpc6dOAg1iRsYHWK0IoKsvwQ9a7bZc2+E40nE41Mnk24UjfK09vDLxP85O/zwA==} + engines: {node: '>=18.0.0'} + dev: true + + /@netlify/types@2.1.0: + resolution: {integrity: sha512-ktUb5d58pt1lQGXO5E9S0F1ljM0g+CoQuGTVII0IxBc0apmPq5RI0o3OWLY7U3ZERRiYTg5UfjiMihBEzuZsuw==} + engines: {node: ^18.14.0 || >=20} + dev: true + + /@netlify/zip-it-and-ship-it@12.1.0: + resolution: {integrity: sha512-+ND2fNnfeOZwnho79aMQ5rreFpI9tu/l4N9/F5H8t9rKYwVHHlv5Zi9o6g/gxZHDLfSbGC9th7Z46CihV8JaZw==} + engines: {node: '>=18.14.0'} hasBin: true dependencies: '@babel/parser': 7.27.2 - '@babel/types': 7.26.10 + '@babel/types': 7.27.1 '@netlify/binary-info': 1.0.0 - '@netlify/serverless-functions-api': 1.38.0 - '@vercel/nft': 0.27.7(supports-color@9.4.0) - archiver: 5.3.2 + '@netlify/serverless-functions-api': 1.41.2 + '@vercel/nft': 0.29.3 + archiver: 7.0.1 common-path-prefix: 3.0.0 - cp-file: 10.0.0 + copy-file: 11.0.0 es-module-lexer: 1.7.0 - esbuild: 0.19.11 - execa: 7.2.0 + esbuild: 0.25.4 + execa: 8.0.1 fast-glob: 3.3.3 - filter-obj: 5.1.0 - find-up: 6.3.0 + filter-obj: 6.1.0 + find-up: 7.0.0 glob: 8.1.0 is-builtin-module: 3.2.1 is-path-inside: 4.0.0 @@ -3514,7 +3749,7 @@ packages: normalize-path: 3.0.0 p-map: 7.0.3 path-exists: 5.0.0 - precinct: 11.0.5(supports-color@9.4.0) + precinct: 12.2.0(supports-color@10.2.2) require-package-name: 2.0.1 resolve: 2.0.0-next.5 semver: 7.7.1 @@ -3525,32 +3760,30 @@ packages: yargs: 17.7.2 zod: 3.23.8 transitivePeerDependencies: + - bare-abort-controller - encoding - rollup - supports-color - dev: true - /@netlify/zip-it-and-ship-it@12.1.0: - resolution: {integrity: sha512-+ND2fNnfeOZwnho79aMQ5rreFpI9tu/l4N9/F5H8t9rKYwVHHlv5Zi9o6g/gxZHDLfSbGC9th7Z46CihV8JaZw==} + /@netlify/zip-it-and-ship-it@14.1.11(supports-color@10.2.2): + resolution: {integrity: sha512-5Ed9XH1JVPL7pAdq9zpC2WHjqHhHkaghuV3r2bvTTpx9JrTdzZxPeNnjZRjJMkjQAi8xSped5hNFJuD0QYmOuw==} engines: {node: '>=18.14.0'} hasBin: true dependencies: '@babel/parser': 7.27.2 - '@babel/types': 7.27.1 + '@babel/types': 7.28.4 '@netlify/binary-info': 1.0.0 - '@netlify/serverless-functions-api': 1.41.2 - '@vercel/nft': 0.29.3 + '@netlify/serverless-functions-api': 2.7.1 + '@vercel/nft': 0.29.4(supports-color@10.2.2) archiver: 7.0.1 common-path-prefix: 3.0.0 copy-file: 11.0.0 es-module-lexer: 1.7.0 - esbuild: 0.25.4 + esbuild: 0.25.10 execa: 8.0.1 fast-glob: 3.3.3 filter-obj: 6.1.0 find-up: 7.0.0 - glob: 8.1.0 - is-builtin-module: 3.2.1 is-path-inside: 4.0.0 junk: 4.0.1 locate-path: 7.2.0 @@ -3559,10 +3792,10 @@ packages: normalize-path: 3.0.0 p-map: 7.0.3 path-exists: 5.0.0 - precinct: 12.2.0 + precinct: 12.2.0(supports-color@10.2.2) require-package-name: 2.0.1 resolve: 2.0.0-next.5 - semver: 7.7.1 + semver: 7.7.2 tmp-promise: 3.0.3 toml: 3.0.0 unixify: 1.0.0 @@ -3574,6 +3807,7 @@ packages: - encoding - rollup - supports-color + dev: true /@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1: resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} @@ -3645,116 +3879,106 @@ packages: dependencies: which: 3.0.1 - /@octokit/auth-token@5.1.2: - resolution: {integrity: sha512-JcQDsBdg49Yky2w2ld20IHAlwr8d/d8N6NiOXbtuoPCqzbsiJgF633mVUw3x4mo0H5ypataQIX7SFu3yy44Mpw==} - engines: {node: '>= 18'} + /@octokit/auth-token@6.0.0: + resolution: {integrity: sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==} + engines: {node: '>= 20'} dev: true - /@octokit/core@6.1.5: - resolution: {integrity: sha512-vvmsN0r7rguA+FySiCsbaTTobSftpIDIpPW81trAmsv9TGxg3YCujAxRYp/Uy8xmDgYCzzgulG62H7KYUFmeIg==} - engines: {node: '>= 18'} + /@octokit/core@7.0.5: + resolution: {integrity: sha512-t54CUOsFMappY1Jbzb7fetWeO0n6K0k/4+/ZpkS+3Joz8I4VcvY9OiEBFRYISqaI2fq5sCiPtAjRDOzVYG8m+Q==} + engines: {node: '>= 20'} dependencies: - '@octokit/auth-token': 5.1.2 - '@octokit/graphql': 8.2.2 - '@octokit/request': 9.2.3 - '@octokit/request-error': 6.1.8 - '@octokit/types': 14.0.0 - before-after-hook: 3.0.2 + '@octokit/auth-token': 6.0.0 + '@octokit/graphql': 9.0.2 + '@octokit/request': 10.0.5 + '@octokit/request-error': 7.0.1 + '@octokit/types': 15.0.2 + before-after-hook: 4.0.0 universal-user-agent: 7.0.2 dev: true - /@octokit/endpoint@10.1.4: - resolution: {integrity: sha512-OlYOlZIsfEVZm5HCSR8aSg02T2lbUWOsCQoPKfTXJwDzcHQBrVBGdGXb89dv2Kw2ToZaRtudp8O3ZIYoaOjKlA==} - engines: {node: '>= 18'} + /@octokit/endpoint@11.0.1: + resolution: {integrity: sha512-7P1dRAZxuWAOPI7kXfio88trNi/MegQ0IJD3vfgC3b+LZo1Qe6gRJc2v0mz2USWWJOKrB2h5spXCzGbw+fAdqA==} + engines: {node: '>= 20'} dependencies: - '@octokit/types': 14.0.0 + '@octokit/types': 15.0.2 universal-user-agent: 7.0.2 dev: true - /@octokit/graphql@8.2.2: - resolution: {integrity: sha512-Yi8hcoqsrXGdt0yObxbebHXFOiUA+2v3n53epuOg1QUgOB6c4XzvisBNVXJSl8RYA5KrDuSL2yq9Qmqe5N0ryA==} - engines: {node: '>= 18'} + /@octokit/graphql@9.0.2: + resolution: {integrity: sha512-iz6KzZ7u95Fzy9Nt2L8cG88lGRMr/qy1Q36ih/XVzMIlPDMYwaNLE/ENhqmIzgPrlNWiYJkwmveEetvxAgFBJw==} + engines: {node: '>= 20'} dependencies: - '@octokit/request': 9.2.3 - '@octokit/types': 14.0.0 + '@octokit/request': 10.0.5 + '@octokit/types': 15.0.2 universal-user-agent: 7.0.2 dev: true - /@octokit/openapi-types@24.2.0: - resolution: {integrity: sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==} - dev: true - - /@octokit/openapi-types@25.0.0: - resolution: {integrity: sha512-FZvktFu7HfOIJf2BScLKIEYjDsw6RKc7rBJCdvCTfKsVnx2GEB/Nbzjr29DUdb7vQhlzS/j8qDzdditP0OC6aw==} + /@octokit/openapi-types@26.0.0: + resolution: {integrity: sha512-7AtcfKtpo77j7Ts73b4OWhOZHTKo/gGY8bB3bNBQz4H+GRSWqx2yvj8TXRsbdTE0eRmYmXOEY66jM7mJ7LzfsA==} dev: true - /@octokit/plugin-paginate-rest@11.6.0(@octokit/core@6.1.5): - resolution: {integrity: sha512-n5KPteiF7pWKgBIBJSk8qzoZWcUkza2O6A0za97pMGVrGfPdltxrfmfF5GucHYvHGZD8BdaZmmHGz5cX/3gdpw==} - engines: {node: '>= 18'} + /@octokit/plugin-paginate-rest@13.2.1(@octokit/core@7.0.5): + resolution: {integrity: sha512-Tj4PkZyIL6eBMYcG/76QGsedF0+dWVeLhYprTmuFVVxzDW7PQh23tM0TP0z+1MvSkxB29YFZwnUX+cXfTiSdyw==} + engines: {node: '>= 20'} peerDependencies: '@octokit/core': '>=6' dependencies: - '@octokit/core': 6.1.5 - '@octokit/types': 13.10.0 + '@octokit/core': 7.0.5 + '@octokit/types': 15.0.2 dev: true - /@octokit/plugin-request-log@5.3.1(@octokit/core@6.1.5): - resolution: {integrity: sha512-n/lNeCtq+9ofhC15xzmJCNKP2BWTv8Ih2TTy+jatNCCq/gQP/V7rK3fjIfuz0pDWDALO/o/4QY4hyOF6TQQFUw==} - engines: {node: '>= 18'} + /@octokit/plugin-request-log@6.0.0(@octokit/core@7.0.5): + resolution: {integrity: sha512-UkOzeEN3W91/eBq9sPZNQ7sUBvYCqYbrrD8gTbBuGtHEuycE4/awMXcYvx6sVYo7LypPhmQwwpUe4Yyu4QZN5Q==} + engines: {node: '>= 20'} peerDependencies: '@octokit/core': '>=6' dependencies: - '@octokit/core': 6.1.5 + '@octokit/core': 7.0.5 dev: true - /@octokit/plugin-rest-endpoint-methods@13.5.0(@octokit/core@6.1.5): - resolution: {integrity: sha512-9Pas60Iv9ejO3WlAX3maE1+38c5nqbJXV5GrncEfkndIpZrJ/WPMRd2xYDcPPEt5yzpxcjw9fWNoPhsSGzqKqw==} - engines: {node: '>= 18'} + /@octokit/plugin-rest-endpoint-methods@16.1.1(@octokit/core@7.0.5): + resolution: {integrity: sha512-VztDkhM0ketQYSh5Im3IcKWFZl7VIrrsCaHbDINkdYeiiAsJzjhS2xRFCSJgfN6VOcsoW4laMtsmf3HcNqIimg==} + engines: {node: '>= 20'} peerDependencies: '@octokit/core': '>=6' dependencies: - '@octokit/core': 6.1.5 - '@octokit/types': 13.10.0 + '@octokit/core': 7.0.5 + '@octokit/types': 15.0.2 dev: true - /@octokit/request-error@6.1.8: - resolution: {integrity: sha512-WEi/R0Jmq+IJKydWlKDmryPcmdYSVjL3ekaiEL1L9eo1sUnqMJ+grqmC9cjk7CA7+b2/T397tO5d8YLOH3qYpQ==} - engines: {node: '>= 18'} + /@octokit/request-error@7.0.1: + resolution: {integrity: sha512-CZpFwV4+1uBrxu7Cw8E5NCXDWFNf18MSY23TdxCBgjw1tXXHvTrZVsXlW8hgFTOLw8RQR1BBrMvYRtuyaijHMA==} + engines: {node: '>= 20'} dependencies: - '@octokit/types': 14.0.0 + '@octokit/types': 15.0.2 dev: true - /@octokit/request@9.2.3: - resolution: {integrity: sha512-Ma+pZU8PXLOEYzsWf0cn/gY+ME57Wq8f49WTXA8FMHp2Ps9djKw//xYJ1je8Hm0pR2lU9FUGeJRWOtxq6olt4w==} - engines: {node: '>= 18'} + /@octokit/request@10.0.5: + resolution: {integrity: sha512-TXnouHIYLtgDhKo+N6mXATnDBkV05VwbR0TtMWpgTHIoQdRQfCSzmy/LGqR1AbRMbijq/EckC/E3/ZNcU92NaQ==} + engines: {node: '>= 20'} dependencies: - '@octokit/endpoint': 10.1.4 - '@octokit/request-error': 6.1.8 - '@octokit/types': 14.0.0 - fast-content-type-parse: 2.0.1 + '@octokit/endpoint': 11.0.1 + '@octokit/request-error': 7.0.1 + '@octokit/types': 15.0.2 + fast-content-type-parse: 3.0.0 universal-user-agent: 7.0.2 dev: true - /@octokit/rest@21.1.1: - resolution: {integrity: sha512-sTQV7va0IUVZcntzy1q3QqPm/r8rWtDCqpRAmb8eXXnKkjoQEtFe3Nt5GTVsHft+R6jJoHeSiVLcgcvhtue/rg==} - engines: {node: '>= 18'} - dependencies: - '@octokit/core': 6.1.5 - '@octokit/plugin-paginate-rest': 11.6.0(@octokit/core@6.1.5) - '@octokit/plugin-request-log': 5.3.1(@octokit/core@6.1.5) - '@octokit/plugin-rest-endpoint-methods': 13.5.0(@octokit/core@6.1.5) - dev: true - - /@octokit/types@13.10.0: - resolution: {integrity: sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==} + /@octokit/rest@22.0.0: + resolution: {integrity: sha512-z6tmTu9BTnw51jYGulxrlernpsQYXpui1RK21vmXn8yF5bp6iX16yfTtJYGK5Mh1qDkvDOmp2n8sRMcQmR8jiA==} + engines: {node: '>= 20'} dependencies: - '@octokit/openapi-types': 24.2.0 + '@octokit/core': 7.0.5 + '@octokit/plugin-paginate-rest': 13.2.1(@octokit/core@7.0.5) + '@octokit/plugin-request-log': 6.0.0(@octokit/core@7.0.5) + '@octokit/plugin-rest-endpoint-methods': 16.1.1(@octokit/core@7.0.5) dev: true - /@octokit/types@14.0.0: - resolution: {integrity: sha512-VVmZP0lEhbo2O1pdq63gZFiGCKkm8PPp8AUOijlwPO6hojEVjspA0MWKP7E4hbvGxzFKNqKr6p0IYtOH/Wf/zA==} + /@octokit/types@15.0.2: + resolution: {integrity: sha512-rR+5VRjhYSer7sC51krfCctQhVTmjyUMAaShfPB8mscVa8tSoLyon3coxQmXu0ahJoLVWl8dSGD/3OGZlFV44Q==} dependencies: - '@octokit/openapi-types': 25.0.0 + '@octokit/openapi-types': 26.0.0 dev: true /@opentelemetry/api@1.8.0: @@ -3953,7 +4177,7 @@ packages: resolution: {integrity: sha512-bWLDlHsBlgKY/05wDN/V3ETcn5G2SV/SiA2ZmNvKGGlmVX4G5li7GRDhHcgYvHJHyJ8TUStqg2xtHmCs0UbAbg==} engines: {node: '>=18'} dependencies: - debug: 4.4.0(supports-color@9.4.0) + debug: 4.4.3(supports-color@10.2.2) enquirer: 2.4.1 minimist: 1.2.8 untildify: 4.0.0 @@ -3961,6 +4185,11 @@ packages: - supports-color dev: true + /@publint/pack@0.1.2: + resolution: {integrity: sha512-S+9ANAvUmjutrshV4jZjaiG8XQyuJIZ8a4utWmN/vW1sgQ9IfBnPndwkmQYw53QmouOIytT874u65HEmu6H5jw==} + engines: {node: '>=18'} + dev: true + /@remix-run/css-bundle@2.16.6: resolution: {integrity: sha512-NMFOWo5gE3AKn3SnQo4CQJOHzdJ00JHooFmPR5PfM1nNwbnkapyulDK0D3XlqKb3TQ28dNsqimSHifVeeYf5OA==} engines: {node: '>=18.0.0'} @@ -4710,11 +4939,20 @@ packages: resolution: {integrity: sha512-zxnHvoMQVqewTJr/W4pKjF0bMGiKJv1WX7bSrkl46Hg0QjESbzBROWK0Wg4RphzSOS5Jiy7eFimmM3UgMrMZbQ==} dev: true + /@sec-ant/readable-stream@0.4.1: + resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + dev: true + /@sindresorhus/is@5.6.0: resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} engines: {node: '>=14.16'} dev: true + /@sindresorhus/merge-streams@2.3.0: + resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} + engines: {node: '>=18'} + dev: true + /@sindresorhus/slugify@2.2.1: resolution: {integrity: sha512-MkngSCRZ8JdSOCHRaYd+D01XhvU3Hjy6MGl06zhOk614hp9EOAp5gIkBeQg7wtmxpitU6eAL4kdiRMcJa2dlrw==} engines: {node: '>=12'} @@ -4755,11 +4993,6 @@ packages: resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} dev: true - /@trysound/sax@0.2.0: - resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} - engines: {node: '>=10.13.0'} - dev: true - /@tsconfig/node10@1.0.11: resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} @@ -4830,22 +5063,6 @@ packages: '@types/node': 20.17.30 dev: true - /@types/istanbul-lib-coverage@2.0.6: - resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} - dev: true - - /@types/istanbul-lib-report@3.0.3: - resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} - dependencies: - '@types/istanbul-lib-coverage': 2.0.6 - dev: true - - /@types/istanbul-reports@3.0.4: - resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} - dependencies: - '@types/istanbul-lib-report': 3.0.3 - dev: true - /@types/json-schema@7.0.15: resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} dev: true @@ -4900,8 +5117,8 @@ packages: csstype: 3.1.3 dev: true - /@types/retry@0.12.1: - resolution: {integrity: sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==} + /@types/retry@0.12.2: + resolution: {integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==} dev: true /@types/semver@7.7.0: @@ -4914,16 +5131,6 @@ packages: /@types/unist@2.0.11: resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} - /@types/yargs-parser@21.0.3: - resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} - dev: true - - /@types/yargs@16.0.9: - resolution: {integrity: sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==} - dependencies: - '@types/yargs-parser': 21.0.3 - dev: true - /@types/yauzl@2.10.3: resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} requiresBuild: true @@ -4947,7 +5154,7 @@ packages: '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.1)(typescript@5.7.3) '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.7.3) - debug: 4.4.0(supports-color@9.4.0) + debug: 4.4.0(supports-color@10.2.2) eslint: 8.57.1 graphemer: 1.4.0 ignore: 5.3.2 @@ -4999,7 +5206,7 @@ packages: '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.7.3) - debug: 4.4.0(supports-color@9.4.0) + debug: 4.4.0(supports-color@10.2.2) eslint: 8.57.1 typescript: 5.7.3 transitivePeerDependencies: @@ -5020,7 +5227,7 @@ packages: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.3) '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.4.0(supports-color@9.4.0) + debug: 4.4.0(supports-color@10.2.2) eslint: 8.57.1 typescript: 5.7.3 transitivePeerDependencies: @@ -5055,7 +5262,7 @@ packages: dependencies: '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.7.3) '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.7.3) - debug: 4.4.0(supports-color@9.4.0) + debug: 4.4.0(supports-color@10.2.2) eslint: 8.57.1 tsutils: 3.21.0(typescript@5.7.3) typescript: 5.7.3 @@ -5075,7 +5282,7 @@ packages: dependencies: '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.3) '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.7.3) - debug: 4.4.0(supports-color@9.4.0) + debug: 4.4.0(supports-color@10.2.2) eslint: 8.57.1 ts-api-utils: 1.4.3(typescript@5.7.3) typescript: 5.7.3 @@ -5097,27 +5304,6 @@ packages: resolution: {integrity: sha512-YmybwXUJcgGqgAp6bEsgpPXEg6dcCyPyCSr0CAAueacR/CCBi25G3V8gGQ2kRzQRBNol7VQknxMs9HvVa9Rvfg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - /@typescript-eslint/typescript-estree@5.62.0(supports-color@9.4.0)(typescript@5.8.3): - resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.4.0(supports-color@9.4.0) - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.7.1 - tsutils: 3.21.0(typescript@5.8.3) - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - dev: true - /@typescript-eslint/typescript-estree@5.62.0(typescript@5.7.3): resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -5129,7 +5315,7 @@ packages: dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.4.0(supports-color@9.4.0) + debug: 4.4.0(supports-color@10.2.2) globby: 11.1.0 is-glob: 4.0.3 semver: 7.7.1 @@ -5150,7 +5336,7 @@ packages: dependencies: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.4.0(supports-color@9.4.0) + debug: 4.4.0(supports-color@10.2.2) globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.5 @@ -5161,7 +5347,7 @@ packages: - supports-color dev: true - /@typescript-eslint/typescript-estree@8.32.1(typescript@5.8.3): + /@typescript-eslint/typescript-estree@8.32.1(supports-color@10.2.2)(typescript@5.8.3): resolution: {integrity: sha512-Y3AP9EIfYwBb4kWGb+simvPaqQoT5oJuzzj9m0i6FCY6SPvlomY2Ei4UEMm7+FXtlNJbor80ximyslzaQF6xhg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: @@ -5169,7 +5355,7 @@ packages: dependencies: '@typescript-eslint/types': 8.32.1 '@typescript-eslint/visitor-keys': 8.32.1 - debug: 4.4.0(supports-color@9.4.0) + debug: 4.4.0(supports-color@10.2.2) fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 @@ -5412,7 +5598,7 @@ packages: '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.27.1) '@vanilla-extract/babel-plugin-debug-ids': 1.2.0 '@vanilla-extract/css': 1.17.1 - esbuild: 0.17.6 + esbuild: 0.19.11 eval: 0.1.8 find-up: 5.0.0 javascript-stringify: 2.1.0 @@ -5436,35 +5622,34 @@ packages: /@vanilla-extract/private@1.0.6: resolution: {integrity: sha512-ytsG/JLweEjw7DBuZ/0JCN4WAQgM9erfSTdS1NQY778hFQSZ6cfCDEZZ0sgVm4k54uNz6ImKB33AYvSR//fjxw==} - /@vercel/nft@0.27.7(supports-color@9.4.0): - resolution: {integrity: sha512-FG6H5YkP4bdw9Ll1qhmbxuE8KwW2E/g8fJpM183fWQLeVDGqzeywMIeJ9h2txdWZ03psgWMn6QymTxaDLmdwUg==} - engines: {node: '>=16'} + /@vercel/nft@0.29.3: + resolution: {integrity: sha512-aVV0E6vJpuvImiMwU1/5QKkw2N96BRFE7mBYGS7FhXUoS6V7SarQ+8tuj33o7ofECz8JtHpmQ9JW+oVzOoB7MA==} + engines: {node: '>=18'} hasBin: true dependencies: - '@mapbox/node-pre-gyp': 1.0.11(supports-color@9.4.0) + '@mapbox/node-pre-gyp': 2.0.0(supports-color@10.2.2) '@rollup/pluginutils': 5.1.4 acorn: 8.14.1 acorn-import-attributes: 1.9.5(acorn@8.14.1) async-sema: 3.1.1 bindings: 1.5.0 estree-walker: 2.0.2 - glob: 7.2.3 + glob: 10.4.5 graceful-fs: 4.2.11 - micromatch: 4.0.8 node-gyp-build: 4.8.4 + picomatch: 4.0.3 resolve-from: 5.0.0 transitivePeerDependencies: - encoding - rollup - supports-color - dev: true - /@vercel/nft@0.29.3: - resolution: {integrity: sha512-aVV0E6vJpuvImiMwU1/5QKkw2N96BRFE7mBYGS7FhXUoS6V7SarQ+8tuj33o7ofECz8JtHpmQ9JW+oVzOoB7MA==} + /@vercel/nft@0.29.4(supports-color@10.2.2): + resolution: {integrity: sha512-6lLqMNX3TuycBPABycx7A9F1bHQR7kiQln6abjFbPrf5C/05qHM9M5E4PeTE59c7z8g6vHnx1Ioihb2AQl7BTA==} engines: {node: '>=18'} hasBin: true dependencies: - '@mapbox/node-pre-gyp': 2.0.0 + '@mapbox/node-pre-gyp': 2.0.0(supports-color@10.2.2) '@rollup/pluginutils': 5.1.4 acorn: 8.14.1 acorn-import-attributes: 1.9.5(acorn@8.14.1) @@ -5480,6 +5665,7 @@ packages: - encoding - rollup - supports-color + dev: true /@vitest/expect@3.1.1: resolution: {integrity: sha512-q/zjrW9lgynctNbwvFtQkGK9+vvHA5UzVi2V8APrp1C6fG6/MuYYkmlx4FubuqLycCeSdHD5aadWfua/Vr0EUA==} @@ -5589,6 +5775,14 @@ packages: '@whatwg-node/promise-helpers': 1.3.1 tslib: 2.8.1 + /@whatwg-node/fetch@0.10.11: + resolution: {integrity: sha512-eR8SYtf9Nem1Tnl0IWrY33qJ5wCtIWlt3Fs3c6V4aAaTFLtkEQErXu3SSZg/XCHrj9hXSJ8/8t+CdMk5Qec/ZA==} + engines: {node: '>=18.0.0'} + dependencies: + '@whatwg-node/node-fetch': 0.8.1 + urlpattern-polyfill: 10.0.0 + dev: true + /@whatwg-node/fetch@0.10.6: resolution: {integrity: sha512-6uzhO2aQ757p3bSHcemA8C4pqEXuyBqyGAM7cYpO0c6/igRMV9As9XL0W12h5EPYMclgr7FgjmbVQBoWEdJ/yA==} engines: {node: '>=18.0.0'} @@ -5605,12 +5799,40 @@ packages: '@whatwg-node/promise-helpers': 1.3.1 tslib: 2.8.1 + /@whatwg-node/node-fetch@0.8.1: + resolution: {integrity: sha512-cQmQEo7IsI0EPX9VrwygXVzrVlX43Jb7/DBZSmpnC7xH4xkyOnn/HykHpTaQk7TUs7zh59A5uTGqx3p2Ouzffw==} + engines: {node: '>=18.0.0'} + dependencies: + '@fastify/busboy': 3.1.1 + '@whatwg-node/disposablestack': 0.0.6 + '@whatwg-node/promise-helpers': 1.3.2 + tslib: 2.8.1 + dev: true + /@whatwg-node/promise-helpers@1.3.1: resolution: {integrity: sha512-D+OwTEunoQhVHVToD80dPhfz9xgPLqJyEA3F5jCRM14A2u8tBBQVdZekqfqx6ZAfZ+POT4Hb0dn601UKMsvADw==} engines: {node: '>=16.0.0'} dependencies: tslib: 2.8.1 + /@whatwg-node/promise-helpers@1.3.2: + resolution: {integrity: sha512-Nst5JdK47VIl9UcGwtv2Rcgyn5lWtZ0/mhRQ4G8NN2isxpq2TO30iqHzmwoJycjWuyUfg3GFXqP/gFHXeV57IA==} + engines: {node: '>=16.0.0'} + dependencies: + tslib: 2.8.1 + dev: true + + /@whatwg-node/server@0.10.13: + resolution: {integrity: sha512-Otmxo+0mp8az3B48pLI1I4msNOXPIoP7TLm6h5wOEQmynqHt8oP9nR6NJUeJk6iI5OtFpQtkbJFwfGkmplvc3Q==} + engines: {node: '>=18.0.0'} + dependencies: + '@envelop/instrumentation': 1.0.0 + '@whatwg-node/disposablestack': 0.0.6 + '@whatwg-node/fetch': 0.10.11 + '@whatwg-node/promise-helpers': 1.3.2 + tslib: 2.8.1 + dev: true + /@whatwg-node/server@0.9.71: resolution: {integrity: sha512-ueFCcIPaMgtuYDS9u0qlUoEvj6GiSsKrwnOLPp9SshqjtcRaR1IEHRjoReq3sXNydsF5i0ZnmuYgXq9dV53t0g==} engines: {node: '>=18.0.0'} @@ -5717,10 +5939,6 @@ packages: through: 2.3.8 dev: true - /abbrev@1.1.1: - resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} - dev: true - /abbrev@3.0.1: resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==} engines: {node: ^18.17.0 || >=20.5.0} @@ -5781,15 +5999,6 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - /agent-base@6.0.2(supports-color@9.4.0): - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} - dependencies: - debug: 4.4.0(supports-color@9.4.0) - transitivePeerDependencies: - - supports-color - dev: true - /agent-base@7.1.3: resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} engines: {node: '>= 14'} @@ -5801,14 +6010,6 @@ packages: clean-stack: 2.2.0 indent-string: 4.0.0 - /aggregate-error@4.0.1: - resolution: {integrity: sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==} - engines: {node: '>=12'} - dependencies: - clean-stack: 4.2.0 - indent-string: 5.0.0 - dev: true - /ajv-errors@3.0.0(ajv@8.17.1): resolution: {integrity: sha512-V3wD15YHfHz6y0KdhYFjyy9vWtEVALT9UrxfN3zqlI6dMioHnJrqOYfyPKol3oqrnCM9uwkcdCwkJ0WUcbLMTQ==} peerDependencies: @@ -5875,20 +6076,15 @@ packages: type-fest: 0.21.3 dev: true - /ansi-escapes@5.0.0: - resolution: {integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==} - engines: {node: '>=12'} + /ansi-escapes@7.0.0: + resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} + engines: {node: '>=18'} dependencies: - type-fest: 1.4.0 - dev: true - - /ansi-escapes@6.2.1: - resolution: {integrity: sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==} - engines: {node: '>=14.16'} + environment: 1.1.0 dev: true - /ansi-escapes@7.0.0: - resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} + /ansi-escapes@7.1.1: + resolution: {integrity: sha512-Zhl0ErHcSRUaVfGUeUdDuLgpkEo8KIFjB4Y9uAc46ScOpdDiU1Dbyplh7qWJeJ/ZHpbyMSM26+X3BySgnIz40Q==} engines: {node: '>=18'} dependencies: environment: 1.1.0 @@ -5937,6 +6133,11 @@ packages: entities: 2.2.0 dev: true + /ansis@4.2.0: + resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==} + engines: {node: '>=14'} + dev: true + /any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} dev: true @@ -5948,42 +6149,6 @@ packages: normalize-path: 3.0.0 picomatch: 2.3.1 - /aproba@2.0.0: - resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} - dev: true - - /archiver-utils@2.1.0: - resolution: {integrity: sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==} - engines: {node: '>= 6'} - dependencies: - glob: 7.2.3 - graceful-fs: 4.2.11 - lazystream: 1.0.1 - lodash.defaults: 4.2.0 - lodash.difference: 4.5.0 - lodash.flatten: 4.4.0 - lodash.isplainobject: 4.0.6 - lodash.union: 4.6.0 - normalize-path: 3.0.0 - readable-stream: 2.3.8 - dev: true - - /archiver-utils@3.0.4: - resolution: {integrity: sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==} - engines: {node: '>= 10'} - dependencies: - glob: 7.2.3 - graceful-fs: 4.2.11 - lazystream: 1.0.1 - lodash.defaults: 4.2.0 - lodash.difference: 4.5.0 - lodash.flatten: 4.4.0 - lodash.isplainobject: 4.0.6 - lodash.union: 4.6.0 - normalize-path: 3.0.0 - readable-stream: 3.6.2 - dev: true - /archiver-utils@5.0.2: resolution: {integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==} engines: {node: '>= 14'} @@ -5996,19 +6161,6 @@ packages: normalize-path: 3.0.0 readable-stream: 4.7.0 - /archiver@5.3.2: - resolution: {integrity: sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==} - engines: {node: '>= 10'} - dependencies: - archiver-utils: 2.1.0 - async: 3.2.6 - buffer-crc32: 0.2.13 - readable-stream: 3.6.2 - readdir-glob: 1.1.3 - tar-stream: 2.2.0 - zip-stream: 4.1.1 - dev: true - /archiver@7.0.1: resolution: {integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==} engines: {node: '>= 14'} @@ -6023,15 +6175,6 @@ packages: transitivePeerDependencies: - bare-abort-controller - /are-we-there-yet@2.0.0: - resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} - engines: {node: '>=10'} - deprecated: This package is no longer supported. - dependencies: - delegates: 1.0.0 - readable-stream: 3.6.2 - dev: true - /arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} @@ -6167,11 +6310,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /arrify@3.0.0: - resolution: {integrity: sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==} - engines: {node: '>=12'} - dev: true - /ascii-table@0.0.9: resolution: {integrity: sha512-xpkr6sCDIYTPqzvjG8M3ncw1YOTaloWZOyrUmicoEifBEKzQzt+ooUpRpQ/AbOoJfO/p2ZKiyp79qHThzJDulQ==} dev: true @@ -6181,11 +6319,6 @@ packages: engines: {node: '>=12'} dev: true - /ast-module-types@5.0.0: - resolution: {integrity: sha512-JvqziE0Wc0rXQfma0HZC/aY7URXHFuZV84fJRtP8u+lhp0JYCNd5wJzVXP45t0PH0Mej3ynlzvdyITYIu0G4LQ==} - engines: {node: '>=14'} - dev: true - /ast-module-types@6.0.1: resolution: {integrity: sha512-WHw67kLXYbZuHTmcdbIrVArCq5wxo6NEuj3hiYAWr8mwJeC+C2mMCIBIWCiDoCye/OF/xelc+teJ1ERoWmnEIA==} engines: {node: '>=18'} @@ -6275,68 +6408,6 @@ packages: optional: true optional: true - /bare-fs@4.4.11: - resolution: {integrity: sha512-Bejmm9zRMvMTRoHS+2adgmXw1ANZnCNx+B5dgZpGwlP1E3x6Yuxea8RToddHUbWtVV0iUMWqsgZr8+jcgUI2SA==} - engines: {bare: '>=1.16.0'} - requiresBuild: true - peerDependencies: - bare-buffer: '*' - peerDependenciesMeta: - bare-buffer: - optional: true - dependencies: - bare-events: 2.8.0 - bare-path: 3.0.0 - bare-stream: 2.6.5(bare-events@2.8.0) - bare-url: 2.3.1 - fast-fifo: 1.3.2 - transitivePeerDependencies: - - bare-abort-controller - dev: true - optional: true - - /bare-os@3.5.1: - resolution: {integrity: sha512-LvfVNDcWLw2AnIw5f2mWUgumW3I3N/WYGiWeimhQC1Ybt71n2FjlS9GJKeCnFeg1MKZHxzIFmpFnBXDI+sBeFg==} - engines: {bare: '>=1.14.0'} - requiresBuild: true - dev: true - optional: true - - /bare-path@3.0.0: - resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} - requiresBuild: true - dependencies: - bare-os: 3.5.1 - dev: true - optional: true - - /bare-stream@2.6.5(bare-events@2.8.0): - resolution: {integrity: sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==} - requiresBuild: true - peerDependencies: - bare-buffer: '*' - bare-events: '*' - peerDependenciesMeta: - bare-buffer: - optional: true - bare-events: - optional: true - dependencies: - bare-events: 2.8.0 - streamx: 2.22.0 - transitivePeerDependencies: - - bare-abort-controller - dev: true - optional: true - - /bare-url@2.3.1: - resolution: {integrity: sha512-v2yl0TnaZTdEnelkKtXZGnotiV6qATBlnNuUMrHl6v9Lmmrh9mw9RYyImPU7/4RahumSwQS1k2oKXcRfXcbjJw==} - requiresBuild: true - dependencies: - bare-path: 3.0.0 - dev: true - optional: true - /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -6346,8 +6417,8 @@ packages: dependencies: safe-buffer: 5.1.2 - /before-after-hook@3.0.2: - resolution: {integrity: sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==} + /before-after-hook@4.0.0: + resolution: {integrity: sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==} dev: true /better-ajv-errors@1.2.0(ajv@8.17.1): @@ -6409,7 +6480,7 @@ packages: dependencies: ansi-align: 3.0.1 camelcase: 8.0.0 - chalk: 5.4.1 + chalk: 5.6.2 cli-boxes: 3.0.0 string-width: 7.2.0 type-fest: 4.40.0 @@ -6596,11 +6667,6 @@ packages: engines: {node: '>=6'} dev: true - /camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - dev: true - /camelcase@8.0.0: resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} engines: {node: '>=16'} @@ -6652,6 +6718,11 @@ packages: engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} dev: true + /chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: true + /character-entities-html4@2.1.0: resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} @@ -6680,6 +6751,10 @@ packages: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} dev: true + /chardet@2.1.0: + resolution: {integrity: sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==} + dev: true + /check-error@2.1.1: resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} engines: {node: '>= 16'} @@ -6721,15 +6796,15 @@ packages: engines: {node: '>=8'} dev: true - /ci-info@4.2.0: - resolution: {integrity: sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==} + /ci-info@4.3.0: + resolution: {integrity: sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==} engines: {node: '>=8'} dev: true /citty@0.1.6: resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} dependencies: - consola: 3.4.0 + consola: 3.4.2 dev: true /clean-deep@3.4.0: @@ -6752,13 +6827,6 @@ packages: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} - /clean-stack@4.2.0: - resolution: {integrity: sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==} - engines: {node: '>=12'} - dependencies: - escape-string-regexp: 5.0.0 - dev: true - /clean-stack@5.2.0: resolution: {integrity: sha512-TyUIUJgdFnCISzG5zu3291TAsE77ddchd0bepon1VVQrKLGKFED4iXFEDQ24mIPdPBbyE16PK3F8MYE1CmcBEQ==} engines: {node: '>=14.16'} @@ -6845,39 +6913,16 @@ packages: color-name: 1.1.4 simple-swizzle: 0.2.2 - /color-support@1.1.3: - resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} - hasBin: true - dev: true - /color@3.2.1: resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} dependencies: color-convert: 1.9.3 color-string: 1.9.1 - /color@4.2.3: - resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} - engines: {node: '>=12.5.0'} - dependencies: - color-convert: 2.0.1 - color-string: 1.9.1 - dev: true - /colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} dev: true - /colors-option@3.0.0: - resolution: {integrity: sha512-DP3FpjsiDDvnQC1OJBsdOJZPuy7r0o6sepY2T5M3L/d2nrE23O/ErFkEqyY3ngVL1ZhTj/H0pCMNObZGkEOaaQ==} - engines: {node: '>=12.20.0'} - dependencies: - chalk: 5.4.1 - filter-obj: 3.0.0 - is-plain-obj: 4.1.0 - jest-validate: 27.5.1 - dev: true - /colors@1.4.0: resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} engines: {node: '>=0.1.90'} @@ -6896,6 +6941,11 @@ packages: resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} engines: {node: '>=14'} + /commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + dev: true + /commander@12.1.0: resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} engines: {node: '>=18'} @@ -6914,25 +6964,18 @@ packages: engines: {node: '>= 6'} dev: true - /commander@7.2.0: - resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} - engines: {node: '>= 10'} - dev: true - /commander@9.5.0: resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} engines: {node: ^12.20.0 || >=14} dev: true - /comment-json@4.2.5: - resolution: {integrity: sha512-bKw/r35jR3HGt5PEPm1ljsQQGyCrR8sFGNiN5L+ykDHdpO8Smxkrkla9Yi6NkQyUrb8V54PGhfMs6NrIwtxtdw==} + /comment-json@4.3.0: + resolution: {integrity: sha512-DczdmbvWLd09KATFWY0xcihOO45b32+5V34vZg1oelxqgjtGJotaLrrdFpJRLOdG6Wb031qcg4zOKgnQoBWbEw==} engines: {node: '>= 6'} dependencies: array-timsort: 1.0.3 core-util-is: 1.0.3 esprima: 4.0.1 - has-own-prop: 2.0.0 - repeat-string: 1.6.1 dev: true /common-path-prefix@3.0.0: @@ -6941,18 +6984,8 @@ packages: /compare-func@2.0.0: resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} dependencies: - array-ify: 1.0.0 - dot-prop: 5.3.0 - dev: true - - /compress-commons@4.1.2: - resolution: {integrity: sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==} - engines: {node: '>= 10'} - dependencies: - buffer-crc32: 0.2.13 - crc32-stream: 4.0.3 - normalize-path: 3.0.0 - readable-stream: 3.6.2 + array-ify: 1.0.0 + dot-prop: 5.3.0 dev: true /compress-commons@6.0.2: @@ -7016,8 +7049,9 @@ packages: resolution: {integrity: sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==} engines: {node: ^14.18.0 || >=16.10.0} - /console-control-strings@1.1.0: - resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + /consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} + engines: {node: ^14.18.0 || >=16.10.0} dev: true /content-disposition@0.5.4: @@ -7120,7 +7154,7 @@ packages: typescript: '>=4' dependencies: '@types/node': 20.5.1 - cosmiconfig: 8.3.6(typescript@5.7.3) + cosmiconfig: 8.3.6(typescript@5.8.3) ts-node: 10.9.2(@types/node@20.17.30)(typescript@5.7.3) typescript: 5.8.3 dev: true @@ -7139,7 +7173,7 @@ packages: typescript: 5.7.3 dev: true - /cosmiconfig@8.3.6(typescript@5.7.3): + /cosmiconfig@8.3.6(typescript@5.8.3): resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} engines: {node: '>=14'} peerDependencies: @@ -7152,7 +7186,7 @@ packages: js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 - typescript: 5.7.3 + typescript: 5.8.3 dev: true /cosmiconfig@9.0.0(typescript@5.7.3): @@ -7171,37 +7205,16 @@ packages: typescript: 5.7.3 dev: true - /cp-file@10.0.0: - resolution: {integrity: sha512-vy2Vi1r2epK5WqxOLnskeKeZkdZvTKfFZQCplE3XWsP+SUJyd5XAUFC9lFgTjjXJF2GMne/UML14iEmkAaDfFg==} - engines: {node: '>=14.16'} - dependencies: - graceful-fs: 4.2.11 - nested-error-stacks: 2.1.1 - p-event: 5.0.1 - dev: true - - /cp-file@9.1.0: - resolution: {integrity: sha512-3scnzFj/94eb7y4wyXRWwvzLFaQp87yyfTnChIjlfYrVqp5lVO3E2hIJMeQIltUT0K2ZAB3An1qXcBmwGyvuwA==} - engines: {node: '>=10'} - dependencies: - graceful-fs: 4.2.11 - make-dir: 3.1.0 - nested-error-stacks: 2.1.1 - p-event: 4.2.0 - dev: true - - /cpy@9.0.1: - resolution: {integrity: sha512-D9U0DR5FjTCN3oMTcFGktanHnAG5l020yvOCR1zKILmAyPP7I/9pl6NFgRbDcmSENtbK1sQLBz1p9HIOlroiNg==} - engines: {node: ^12.20.0 || ^14.17.0 || >=16.0.0} + /cpy@11.1.0: + resolution: {integrity: sha512-QGHetPSSuprVs+lJmMDcivvrBwTKASzXQ5qxFvRC2RFESjjod71bDvFvhxTjDgkNjrrb72AI6JPjfYwxrIy33A==} + engines: {node: '>=18'} dependencies: - arrify: 3.0.0 - cp-file: 9.1.0 - globby: 13.2.2 + copy-file: 11.0.0 + globby: 14.1.0 junk: 4.0.1 micromatch: 4.0.8 - nested-error-stacks: 2.1.1 - p-filter: 3.0.0 - p-map: 5.5.0 + p-filter: 4.1.0 + p-map: 7.0.3 dev: true /crc-32@1.2.2: @@ -7209,14 +7222,6 @@ packages: engines: {node: '>=0.8'} hasBin: true - /crc32-stream@4.0.3: - resolution: {integrity: sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==} - engines: {node: '>= 10'} - dependencies: - crc-32: 1.2.2 - readable-stream: 3.6.2 - dev: true - /crc32-stream@6.0.0: resolution: {integrity: sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==} engines: {node: '>= 14'} @@ -7272,6 +7277,12 @@ packages: uncrypto: 0.1.3 dev: true + /crossws@0.3.5: + resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} + dependencies: + uncrypto: 0.1.3 + dev: true + /css-select@5.1.0: resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} dependencies: @@ -7290,11 +7301,11 @@ packages: source-map-js: 1.2.1 dev: true - /css-tree@2.3.1: - resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} + /css-tree@3.1.0: + resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} dependencies: - mdn-data: 2.0.30 + mdn-data: 2.12.2 source-map-js: 1.2.1 dev: true @@ -7395,7 +7406,7 @@ packages: ms: 2.1.3 dev: true - /debug@4.4.0(supports-color@9.4.0): + /debug@4.4.0(supports-color@10.2.2): resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} peerDependencies: @@ -7405,7 +7416,19 @@ packages: optional: true dependencies: ms: 2.1.3 - supports-color: 9.4.0 + supports-color: 10.2.2 + + /debug@4.4.3(supports-color@10.2.2): + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + supports-color: 10.2.2 /decache@4.6.2: resolution: {integrity: sha512-2LPqkLeu8XWHU8qNCS3kcF6sCcb5zIzvWaAHYSvPfwhdd7mHuah29NssMzrTYyHN4F5oFy2ko9OBYxegtU0FEw==} @@ -7539,10 +7562,6 @@ packages: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} dev: true - /delegates@1.0.0: - resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} - dev: true - /depd@1.1.2: resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} engines: {node: '>= 0.6'} @@ -7556,8 +7575,8 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} - /destr@2.0.3: - resolution: {integrity: sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==} + /destr@2.0.5: + resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} dev: true /destroy@1.2.0: @@ -7574,15 +7593,9 @@ packages: resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} engines: {node: '>=8'} - /detective-amd@5.0.2: - resolution: {integrity: sha512-XFd/VEQ76HSpym80zxM68ieB77unNuoMwopU2TFT/ErUk5n4KvUTwW4beafAVUugrjV48l4BmmR0rh2MglBaiA==} - engines: {node: '>=14'} - hasBin: true - dependencies: - ast-module-types: 5.0.0 - escodegen: 2.1.0 - get-amd-module-type: 5.0.1 - node-source-walk: 6.0.2 + /detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} dev: true /detective-amd@6.0.1: @@ -7595,14 +7608,6 @@ packages: get-amd-module-type: 6.0.1 node-source-walk: 7.0.1 - /detective-cjs@5.0.1: - resolution: {integrity: sha512-6nTvAZtpomyz/2pmEmGX1sXNjaqgMplhQkskq2MLrar0ZAIkHMrDhLXkRiK2mvbu9wSWr0V5/IfiTrZqAQMrmQ==} - engines: {node: '>=14'} - dependencies: - ast-module-types: 5.0.0 - node-source-walk: 6.0.2 - dev: true - /detective-cjs@6.0.1: resolution: {integrity: sha512-tLTQsWvd2WMcmn/60T2inEJNhJoi7a//PQ7DwRKEj1yEeiQs4mrONgsUtEJKnZmrGWBBmE0kJ1vqOG/NAxwaJw==} engines: {node: '>=18'} @@ -7610,28 +7615,12 @@ packages: ast-module-types: 6.0.1 node-source-walk: 7.0.1 - /detective-es6@4.0.1: - resolution: {integrity: sha512-k3Z5tB4LQ8UVHkuMrFOlvb3GgFWdJ9NqAa2YLUU/jTaWJIm+JJnEh4PsMc+6dfT223Y8ACKOaC0qcj7diIhBKw==} - engines: {node: '>=14'} - dependencies: - node-source-walk: 6.0.2 - dev: true - /detective-es6@5.0.1: resolution: {integrity: sha512-XusTPuewnSUdoxRSx8OOI6xIA/uld/wMQwYsouvFN2LAg7HgP06NF1lHRV3x6BZxyL2Kkoih4ewcq8hcbGtwew==} engines: {node: '>=18'} dependencies: node-source-walk: 7.0.1 - /detective-postcss@6.1.3: - resolution: {integrity: sha512-7BRVvE5pPEvk2ukUWNQ+H2XOq43xENWbH0LcdCE14mwgTBEAMoAx+Fc1rdp76SmyZ4Sp48HlV7VedUnP6GA1Tw==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - dependencies: - is-url: 1.2.4 - postcss: 8.5.6 - postcss-values-parser: 6.0.2(postcss@8.5.6) - dev: true - /detective-postcss@7.0.1(postcss@8.5.6): resolution: {integrity: sha512-bEOVpHU9picRZux5XnwGsmCN4+8oZo7vSW0O0/Enq/TO5R2pIAP2279NsszpJR7ocnQt4WXU0+nnh/0JuK4KHQ==} engines: {node: ^14.0.0 || >=16.0.0} @@ -7642,14 +7631,6 @@ packages: postcss: 8.5.6 postcss-values-parser: 6.0.2(postcss@8.5.6) - /detective-sass@5.0.3: - resolution: {integrity: sha512-YsYT2WuA8YIafp2RVF5CEfGhhyIVdPzlwQgxSjK+TUm3JoHP+Tcorbk3SfG0cNZ7D7+cYWa0ZBcvOaR0O8+LlA==} - engines: {node: '>=14'} - dependencies: - gonzales-pe: 4.3.0 - node-source-walk: 6.0.2 - dev: true - /detective-sass@6.0.1: resolution: {integrity: sha512-jSGPO8QDy7K7pztUmGC6aiHkexBQT4GIH+mBAL9ZyBmnUIOFbkfZnO8wPRRJFP/QP83irObgsZHCoDHZ173tRw==} engines: {node: '>=18'} @@ -7657,14 +7638,6 @@ packages: gonzales-pe: 4.3.0 node-source-walk: 7.0.1 - /detective-scss@4.0.3: - resolution: {integrity: sha512-VYI6cHcD0fLokwqqPFFtDQhhSnlFWvU614J42eY6G0s8c+MBhi9QAWycLwIOGxlmD8I/XvGSOUV1kIDhJ70ZPg==} - engines: {node: '>=14'} - dependencies: - gonzales-pe: 4.3.0 - node-source-walk: 6.0.2 - dev: true - /detective-scss@5.0.1: resolution: {integrity: sha512-MAyPYRgS6DCiS6n6AoSBJXLGVOydsr9huwXORUlJ37K3YLyiN0vYHpzs3AdJOgHobBfispokoqrEon9rbmKacg==} engines: {node: '>=18'} @@ -7672,41 +7645,24 @@ packages: gonzales-pe: 4.3.0 node-source-walk: 7.0.1 - /detective-stylus@4.0.0: - resolution: {integrity: sha512-TfPotjhszKLgFBzBhTOxNHDsutIxx9GTWjrL5Wh7Qx/ydxKhwUrlSFeLIn+ZaHPF+h0siVBkAQSuy6CADyTxgQ==} - engines: {node: '>=14'} - dev: true - /detective-stylus@5.0.1: resolution: {integrity: sha512-Dgn0bUqdGbE3oZJ+WCKf8Dmu7VWLcmRJGc6RCzBgG31DLIyai9WAoEhYRgIHpt/BCRMrnXLbGWGPQuBUrnF0TA==} engines: {node: '>=18'} - /detective-typescript@11.2.0(supports-color@9.4.0): - resolution: {integrity: sha512-ARFxjzizOhPqs1fYC/2NMC3N4jrQ6HvVflnXBTRqNEqJuXwyKLRr9CrJwkRcV/SnZt1sNXgsF6FPm0x57Tq0rw==} - engines: {node: ^14.14.0 || >=16.0.0} - dependencies: - '@typescript-eslint/typescript-estree': 5.62.0(supports-color@9.4.0)(typescript@5.8.3) - ast-module-types: 5.0.0 - node-source-walk: 6.0.2 - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - dev: true - - /detective-typescript@14.0.0(typescript@5.8.3): + /detective-typescript@14.0.0(supports-color@10.2.2)(typescript@5.8.3): resolution: {integrity: sha512-pgN43/80MmWVSEi5LUuiVvO/0a9ss5V7fwVfrJ4QzAQRd3cwqU1SfWGXJFcNKUqoD5cS+uIovhw5t/0rSeC5Mw==} engines: {node: '>=18'} peerDependencies: typescript: ^5.4.4 dependencies: - '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3) + '@typescript-eslint/typescript-estree': 8.32.1(supports-color@10.2.2)(typescript@5.8.3) ast-module-types: 6.0.1 node-source-walk: 7.0.1 typescript: 5.8.3 transitivePeerDependencies: - supports-color - /detective-vue2@2.2.0(typescript@5.8.3): + /detective-vue2@2.2.0(supports-color@10.2.2)(typescript@5.8.3): resolution: {integrity: sha512-sVg/t6O2z1zna8a/UIV6xL5KUa2cMTQbdTIIvqNM0NIPswp52fe43Nwmbahzj3ww4D844u/vC2PYfiGLvD3zFA==} engines: {node: '>=18'} peerDependencies: @@ -7718,11 +7674,15 @@ packages: detective-sass: 6.0.1 detective-scss: 5.0.1 detective-stylus: 5.0.1 - detective-typescript: 14.0.0(typescript@5.8.3) + detective-typescript: 14.0.0(supports-color@10.2.2)(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: - supports-color + /dettle@1.0.5: + resolution: {integrity: sha512-ZVyjhAJ7sCe1PNXEGveObOH9AC8QvMga3HJIghHawtG7mE4K5pW9nz/vDGAr/U7a3LWgdOzEE7ac9MURnyfaTA==} + dev: true + /diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} @@ -7790,13 +7750,6 @@ packages: is-obj: 2.0.0 dev: true - /dot-prop@7.2.0: - resolution: {integrity: sha512-Ol/IPXUARn9CSbkrdV4VJo7uCy1I3VuSiWCaFSg+8BdUOzF9n3jefIpcgAydvUZbTdEBZs2vEiTiS9m61ssiDA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - type-fest: 2.19.0 - dev: true - /dot-prop@9.0.0: resolution: {integrity: sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==} engines: {node: '>=18'} @@ -7807,6 +7760,11 @@ packages: resolution: {integrity: sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==} engines: {node: '>=12'} + /dotenv@17.2.3: + resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==} + engines: {node: '>=12'} + dev: true + /dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -7852,6 +7810,11 @@ packages: /emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + /empathic@2.0.0: + resolution: {integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==} + engines: {node: '>=14'} + dev: true + /enabled@2.0.0: resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} @@ -7908,8 +7871,8 @@ packages: resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - /envinfo@7.14.0: - resolution: {integrity: sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==} + /envinfo@7.15.0: + resolution: {integrity: sha512-chR+t7exF6y59kelhXw5I3849nTy7KIRO+ePdLMhCD+JRP/JvmkenDWP7QSFGlsHX+kxGxdDutOPrmj5j1HR6g==} engines: {node: '>=4'} hasBin: true dev: true @@ -8139,7 +8102,6 @@ packages: '@esbuild/win32-arm64': 0.19.11 '@esbuild/win32-ia32': 0.19.11 '@esbuild/win32-x64': 0.19.11 - dev: true /esbuild@0.21.5: resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} @@ -8204,6 +8166,40 @@ packages: '@esbuild/win32-x64': 0.25.0 dev: true + /esbuild@0.25.10: + resolution: {integrity: sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==} + engines: {node: '>=18'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.10 + '@esbuild/android-arm': 0.25.10 + '@esbuild/android-arm64': 0.25.10 + '@esbuild/android-x64': 0.25.10 + '@esbuild/darwin-arm64': 0.25.10 + '@esbuild/darwin-x64': 0.25.10 + '@esbuild/freebsd-arm64': 0.25.10 + '@esbuild/freebsd-x64': 0.25.10 + '@esbuild/linux-arm': 0.25.10 + '@esbuild/linux-arm64': 0.25.10 + '@esbuild/linux-ia32': 0.25.10 + '@esbuild/linux-loong64': 0.25.10 + '@esbuild/linux-mips64el': 0.25.10 + '@esbuild/linux-ppc64': 0.25.10 + '@esbuild/linux-riscv64': 0.25.10 + '@esbuild/linux-s390x': 0.25.10 + '@esbuild/linux-x64': 0.25.10 + '@esbuild/netbsd-arm64': 0.25.10 + '@esbuild/netbsd-x64': 0.25.10 + '@esbuild/openbsd-arm64': 0.25.10 + '@esbuild/openbsd-x64': 0.25.10 + '@esbuild/openharmony-arm64': 0.25.10 + '@esbuild/sunos-x64': 0.25.10 + '@esbuild/win32-arm64': 0.25.10 + '@esbuild/win32-ia32': 0.25.10 + '@esbuild/win32-x64': 0.25.10 + dev: true + /esbuild@0.25.11: resolution: {integrity: sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==} engines: {node: '>=18'} @@ -8237,39 +8233,6 @@ packages: '@esbuild/win32-ia32': 0.25.11 '@esbuild/win32-x64': 0.25.11 - /esbuild@0.25.2: - resolution: {integrity: sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==} - engines: {node: '>=18'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/aix-ppc64': 0.25.2 - '@esbuild/android-arm': 0.25.2 - '@esbuild/android-arm64': 0.25.2 - '@esbuild/android-x64': 0.25.2 - '@esbuild/darwin-arm64': 0.25.2 - '@esbuild/darwin-x64': 0.25.2 - '@esbuild/freebsd-arm64': 0.25.2 - '@esbuild/freebsd-x64': 0.25.2 - '@esbuild/linux-arm': 0.25.2 - '@esbuild/linux-arm64': 0.25.2 - '@esbuild/linux-ia32': 0.25.2 - '@esbuild/linux-loong64': 0.25.2 - '@esbuild/linux-mips64el': 0.25.2 - '@esbuild/linux-ppc64': 0.25.2 - '@esbuild/linux-riscv64': 0.25.2 - '@esbuild/linux-s390x': 0.25.2 - '@esbuild/linux-x64': 0.25.2 - '@esbuild/netbsd-arm64': 0.25.2 - '@esbuild/netbsd-x64': 0.25.2 - '@esbuild/openbsd-arm64': 0.25.2 - '@esbuild/openbsd-x64': 0.25.2 - '@esbuild/sunos-x64': 0.25.2 - '@esbuild/win32-arm64': 0.25.2 - '@esbuild/win32-ia32': 0.25.2 - '@esbuild/win32-x64': 0.25.2 - dev: true - /esbuild@0.25.4: resolution: {integrity: sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==} engines: {node: '>=18'} @@ -8423,7 +8386,7 @@ packages: optional: true dependencies: '@nolyfill/is-core-module': 1.0.39 - debug: 4.4.0(supports-color@9.4.0) + debug: 4.4.0(supports-color@10.2.2) eslint: 8.57.1 eslint-plugin-import: 2.31.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) get-tsconfig: 4.10.0 @@ -8449,7 +8412,7 @@ packages: optional: true dependencies: '@nolyfill/is-core-module': 1.0.39 - debug: 4.4.0(supports-color@9.4.0) + debug: 4.4.0(supports-color@10.2.2) enhanced-resolve: 5.18.1 eslint: 8.57.1 eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0)(eslint-import-resolver-typescript@3.8.3)(eslint@8.57.1) @@ -8963,7 +8926,7 @@ packages: ajv: 6.12.6 chalk: 2.4.2 cross-spawn: 6.0.6 - debug: 4.4.0(supports-color@9.4.0) + debug: 4.4.0(supports-color@10.2.2) doctrine: 3.0.0 eslint-scope: 5.1.1 eslint-utils: 1.4.3 @@ -9017,7 +8980,7 @@ packages: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.0(supports-color@9.4.0) + debug: 4.4.0(supports-color@10.2.2) doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -9208,21 +9171,6 @@ packages: strip-final-newline: 3.0.0 dev: true - /execa@7.2.0: - resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} - engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} - dependencies: - cross-spawn: 7.0.6 - get-stream: 6.0.1 - human-signals: 4.3.1 - is-stream: 3.0.0 - merge-stream: 2.0.0 - npm-run-path: 5.3.0 - onetime: 6.0.0 - signal-exit: 3.0.7 - strip-final-newline: 3.0.0 - dev: true - /execa@8.0.1: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} @@ -9241,11 +9189,6 @@ packages: resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} engines: {node: '>=6'} - /expand-template@2.0.3: - resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} - engines: {node: '>=6'} - dev: true - /expect-type@1.2.1: resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==} engines: {node: '>=12.0.0'} @@ -9331,7 +9274,7 @@ packages: engines: {node: '>= 10.17.0'} hasBin: true dependencies: - debug: 4.4.0(supports-color@9.4.0) + debug: 4.4.3(supports-color@10.2.2) get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: @@ -9343,8 +9286,8 @@ packages: resolution: {integrity: sha512-fBHHqSTFLVnR61C+gltJuE5GkVQMV0S2nqUO8TJ+5Z3qAKG8vAx4FKai1s5jq/inV1+sREynIWSuQ6HgoSXpDQ==} dev: true - /fast-content-type-parse@2.0.1: - resolution: {integrity: sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==} + /fast-content-type-parse@3.0.0: + resolution: {integrity: sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==} dev: true /fast-decode-uri-component@1.0.1: @@ -9424,8 +9367,8 @@ packages: resolution: {integrity: sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ==} dev: true - /fastify@4.29.0: - resolution: {integrity: sha512-MaaUHUGcCgC8fXQDsDtioaCcag1fmPJ9j64vAKunqZF4aSub040ZGi/ag8NGE2714yREPOKZuHCfpPzuUD3UQQ==} + /fastify@4.29.1: + resolution: {integrity: sha512-m2kMNHIG92tSNWv+Z3UeTR9AWLLuo7KctC7mlFPtMEVrfjIhmQhkQnT9v15qA/BfVq3vvj134Y0jl9SBje3jXQ==} dependencies: '@fastify/ajv-compiler': 3.6.0 '@fastify/error': 3.4.1 @@ -9441,7 +9384,7 @@ packages: proxy-addr: 2.0.7 rfdc: 1.4.1 secure-json-parse: 2.7.0 - semver: 7.7.1 + semver: 7.7.2 toad-cache: 3.7.0 dev: true @@ -9488,20 +9431,11 @@ packages: escape-string-regexp: 1.0.5 dev: true - /figures@4.0.1: - resolution: {integrity: sha512-rElJwkA/xS04Vfg+CaZodpso7VqBknOYbzi6I76hI4X80RUjkSxO2oAyPmGbuXUppywjqndOrQDl817hDnI++w==} - engines: {node: '>=12'} - dependencies: - escape-string-regexp: 5.0.0 - is-unicode-supported: 1.3.0 - dev: true - - /figures@5.0.0: - resolution: {integrity: sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==} - engines: {node: '>=14'} + /figures@6.1.0: + resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} + engines: {node: '>=18'} dependencies: - escape-string-regexp: 5.0.0 - is-unicode-supported: 1.3.0 + is-unicode-supported: 2.1.0 dev: true /file-entry-cache@5.0.1: @@ -9551,16 +9485,6 @@ packages: dependencies: to-regex-range: 5.0.1 - /filter-obj@3.0.0: - resolution: {integrity: sha512-oQZM+QmVni8MsYzcq9lgTHD/qeLqaG8XaOPOW7dzuSafVxSUlH1+1ZDefj2OD9f2XsmG5lFl2Euc9NI4jgwFWg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true - - /filter-obj@5.1.0: - resolution: {integrity: sha512-qWeTREPoT7I0bifpPUXtxkZJ1XJzxWtfoWWkdVGqa+eCr3SHW/Ocp89o8vLvbUuQnadybJpjOKu4V+RwO6sGng==} - engines: {node: '>=14.16'} - dev: true - /filter-obj@6.1.0: resolution: {integrity: sha512-xdMtCAODmPloU9qtmPcdBV9Kd27NtMse+4ayThxqIHUES5Z2S6bGpap5PpdmNM56ub7y3i1eyr+vJJIIgWGKmA==} engines: {node: '>=18'} @@ -9607,14 +9531,6 @@ packages: locate-path: 6.0.0 path-exists: 4.0.0 - /find-up@6.3.0: - resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - locate-path: 7.2.0 - path-exists: 5.0.0 - dev: true - /find-up@7.0.0: resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} engines: {node: '>=18'} @@ -9658,7 +9574,7 @@ packages: from2: 2.3.0 dev: true - /follow-redirects@1.15.9(debug@4.4.0): + /follow-redirects@1.15.9(debug@4.4.3): resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} engines: {node: '>=4.0'} peerDependencies: @@ -9667,7 +9583,7 @@ packages: debug: optional: true dependencies: - debug: 4.4.0(supports-color@9.4.0) + debug: 4.4.3(supports-color@10.2.2) dev: true /for-each@0.3.5: @@ -9800,22 +9716,6 @@ packages: engines: {node: '>= 0.6.0'} dev: true - /gauge@3.0.2: - resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} - engines: {node: '>=10'} - deprecated: This package is no longer supported. - dependencies: - aproba: 2.0.0 - color-support: 1.1.3 - console-control-strings: 1.1.0 - has-unicode: 2.0.1 - object-assign: 4.1.1 - signal-exit: 3.0.7 - string-width: 4.2.3 - strip-ansi: 6.0.1 - wide-align: 1.1.5 - dev: true - /generic-names@4.0.0: resolution: {integrity: sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==} dependencies: @@ -9825,14 +9725,6 @@ packages: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} - /get-amd-module-type@5.0.1: - resolution: {integrity: sha512-jb65zDeHyDjFR1loOVk0HQGM5WNwoGB8aLWy3LKCieMKol0/ProHkhO2X1JxojuN10vbz1qNn09MJ7tNp7qMzw==} - engines: {node: '>=14'} - dependencies: - ast-module-types: 5.0.0 - node-source-walk: 6.0.2 - dev: true - /get-amd-module-type@6.0.1: resolution: {integrity: sha512-MtjsmYiCXcYDDrGqtNbeIYdAl85n+5mSv2r3FbzER/YV3ZILw4HNNIw34HuV5pyl0jzs6GFYU1VHVEefhgcNHQ==} engines: {node: '>=18'} @@ -9864,11 +9756,6 @@ packages: hasown: 2.0.2 math-intrinsics: 1.1.0 - /get-package-name@2.2.0: - resolution: {integrity: sha512-LmCKVxioe63Fy6KDAQ/mmCSOSSRUE/x4zdrMD+7dU8quF3bGpzvP8mOmq4Dgce3nzU9AgkVDotucNOOg7c27BQ==} - engines: {node: '>= 12.0.0'} - dev: true - /get-port-please@3.1.2: resolution: {integrity: sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ==} dev: true @@ -9877,9 +9764,9 @@ packages: resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} engines: {node: '>=8'} - /get-port@6.1.2: - resolution: {integrity: sha512-BrGGraKm2uPqurfGVj/z97/zv8dPleC6x9JBNRTrDNtCkkRF4rPwrQXFgL7+I+q8QSdU4ntLQX2D7KIxSy8nGw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + /get-port@7.1.0: + resolution: {integrity: sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==} + engines: {node: '>=16'} dev: true /get-proto@1.0.1: @@ -9903,6 +9790,14 @@ packages: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} + /get-stream@9.0.1: + resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} + engines: {node: '>=18'} + dependencies: + '@sec-ant/readable-stream': 0.4.1 + is-stream: 4.0.1 + dev: true + /get-symbol-description@1.1.0: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} @@ -9924,7 +9819,7 @@ packages: dependencies: '@xhmikosr/downloader': 13.0.1 node-fetch: 3.3.2 - semver: 7.7.1 + semver: 7.7.2 transitivePeerDependencies: - bare-abort-controller dev: true @@ -9962,10 +9857,6 @@ packages: ini: 1.3.8 dev: true - /github-from-package@0.0.0: - resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} - dev: true - /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -10065,15 +9956,16 @@ packages: slash: 3.0.0 dev: true - /globby@13.2.2: - resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + /globby@14.1.0: + resolution: {integrity: sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==} + engines: {node: '>=18'} dependencies: - dir-glob: 3.0.1 + '@sindresorhus/merge-streams': 2.3.0 fast-glob: 3.3.3 - ignore: 5.3.2 - merge2: 1.4.1 - slash: 4.0.0 + ignore: 7.0.5 + path-type: 6.0.0 + slash: 5.1.0 + unicorn-magic: 0.3.0 dev: true /globrex@0.1.2: @@ -10130,15 +10022,15 @@ packages: pumpify: 1.5.1 through2: 2.0.5 - /h3@1.15.1: - resolution: {integrity: sha512-+ORaOBttdUm1E2Uu/obAyCguiI7MbBvsLTndc3gyK3zU+SYLoZXlyCP9Xgy0gikkGufFLTZXCXD6+4BsufnmHA==} + /h3@1.15.4: + resolution: {integrity: sha512-z5cFQWDffyOe4vQ9xIqNfCZdV4p//vy6fBnr8Q1AWnVZ0teurKMG66rLj++TKwKPUP3u7iMUvrvKaEUiQw2QWQ==} dependencies: cookie-es: 1.2.2 - crossws: 0.3.4 + crossws: 0.3.5 defu: 6.1.4 - destr: 2.0.3 + destr: 2.0.5 iron-webcrypto: 1.2.1 - node-mock-http: 1.0.0 + node-mock-http: 1.0.3 radix3: 1.1.2 ufo: 1.6.1 uncrypto: 0.1.3 @@ -10163,11 +10055,6 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - /has-own-prop@2.0.0: - resolution: {integrity: sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==} - engines: {node: '>=8'} - dev: true - /has-property-descriptors@1.0.2: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} dependencies: @@ -10190,10 +10077,6 @@ packages: dependencies: has-symbols: 1.1.0 - /has-unicode@2.0.1: - resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} - dev: true - /hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} @@ -10247,9 +10130,16 @@ packages: dependencies: lru-cache: 10.4.3 - /hot-shots@10.2.1: - resolution: {integrity: sha512-tmjcyZkG/qADhcdC7UjAp8D7v7W2DOYFgaZ48fYMuayMQmVVUg8fntKmrjes/b40ef6yZ+qt1lB8kuEDfLC4zw==} - engines: {node: '>=10.0.0'} + /hosted-git-info@8.1.0: + resolution: {integrity: sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==} + engines: {node: ^18.17.0 || >=20.5.0} + dependencies: + lru-cache: 10.4.3 + dev: true + + /hot-shots@11.2.0: + resolution: {integrity: sha512-cGiFSgTZtVODx0yMW67gPICgref3XuxkTMrXP0h5cSd1HHG3OG7L2C6+aW70MAtlUNl+9+DOq/xXyJUVKDyeUg==} + engines: {node: '>=16.0.0'} optionalDependencies: unix-dgram: 2.0.7 dev: true @@ -10288,7 +10178,7 @@ packages: statuses: 2.0.1 toidentifier: 1.0.1 - /http-proxy-middleware@2.0.9(debug@4.4.0): + /http-proxy-middleware@2.0.9(debug@4.4.3): resolution: {integrity: sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==} engines: {node: '>=12.0.0'} peerDependencies: @@ -10298,7 +10188,7 @@ packages: optional: true dependencies: '@types/http-proxy': 1.17.16 - http-proxy: 1.18.1(debug@4.4.0) + http-proxy: 1.18.1(debug@4.4.3) is-glob: 4.0.3 is-plain-obj: 3.0.0 micromatch: 4.0.8 @@ -10306,12 +10196,12 @@ packages: - debug dev: true - /http-proxy@1.18.1(debug@4.4.0): + /http-proxy@1.18.1(debug@4.4.3): resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} engines: {node: '>=8.0.0'} dependencies: eventemitter3: 4.0.7 - follow-redirects: 1.15.9(debug@4.4.0) + follow-redirects: 1.15.9(debug@4.4.3) requires-port: 1.0.0 transitivePeerDependencies: - debug @@ -10330,22 +10220,12 @@ packages: resolve-alpn: 1.2.1 dev: true - /https-proxy-agent@5.0.1(supports-color@9.4.0): - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} - dependencies: - agent-base: 6.0.2(supports-color@9.4.0) - debug: 4.4.0(supports-color@9.4.0) - transitivePeerDependencies: - - supports-color - dev: true - - /https-proxy-agent@7.0.6: + /https-proxy-agent@7.0.6(supports-color@10.2.2): resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} dependencies: agent-base: 7.1.3 - debug: 4.4.0(supports-color@9.4.0) + debug: 4.4.3(supports-color@10.2.2) transitivePeerDependencies: - supports-color @@ -10358,11 +10238,6 @@ packages: engines: {node: '>=12.20.0'} dev: true - /human-signals@4.3.1: - resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} - engines: {node: '>=14.18.0'} - dev: true - /human-signals@5.0.0: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} @@ -10385,8 +10260,8 @@ packages: dependencies: safer-buffer: 2.1.2 - /iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + /iconv-lite@0.7.0: + resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==} engines: {node: '>=0.10.0'} dependencies: safer-buffer: 2.1.2 @@ -10413,10 +10288,21 @@ packages: engines: {node: '>= 4'} dev: true + /ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + dev: true + /image-meta@0.2.1: resolution: {integrity: sha512-K6acvFaelNxx8wc2VjbIzXKDVB0Khs0QT35U6NkGfTdCmjLNcO2945m7RFNR9/RPVFm48hq7QPzK8uGH18HCGw==} dev: true + /image-size@2.0.2: + resolution: {integrity: sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==} + engines: {node: '>=16.x'} + hasBin: true + dev: true + /import-fresh@3.3.1: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} @@ -10477,7 +10363,7 @@ packages: /inline-style-parser@0.1.1: resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} - /inquirer-autocomplete-prompt@1.4.0(inquirer@8.2.6): + /inquirer-autocomplete-prompt@1.4.0(inquirer@8.2.7): resolution: {integrity: sha512-qHgHyJmbULt4hI+kCmwX92MnSxDs/Yhdt4wPA30qnoa01OF6uTXV8yvH4hKXgdaTNmkZ9D01MHjqKYEuJN+ONw==} engines: {node: '>=10'} peerDependencies: @@ -10486,7 +10372,7 @@ packages: ansi-escapes: 4.3.2 chalk: 4.1.2 figures: 3.2.0 - inquirer: 8.2.6 + inquirer: 8.2.7(@types/node@20.17.30) run-async: 2.4.1 rxjs: 6.6.7 dev: true @@ -10510,15 +10396,15 @@ packages: through: 2.3.8 dev: true - /inquirer@8.2.6: - resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==} + /inquirer@8.2.7(@types/node@20.17.30): + resolution: {integrity: sha512-UjOaSel/iddGZJ5xP/Eixh6dY1XghiBw4XK13rCCIJcJfyhhoul/7KhLLUGtebEj6GDYM6Vnx/mVsjx2L/mFIA==} engines: {node: '>=12.0.0'} dependencies: + '@inquirer/external-editor': 1.0.2(@types/node@20.17.30) ansi-escapes: 4.3.2 chalk: 4.1.2 cli-cursor: 3.1.0 cli-width: 3.0.0 - external-editor: 3.1.0 figures: 3.2.0 lodash: 4.17.21 mute-stream: 0.0.8 @@ -10529,6 +10415,8 @@ packages: strip-ansi: 6.0.1 through: 2.3.8 wrap-ansi: 6.2.0 + transitivePeerDependencies: + - '@types/node' dev: true /inspect-with-kind@1.0.5: @@ -10550,25 +10438,25 @@ packages: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} - /ipx@2.1.0(@netlify/blobs@8.2.0): - resolution: {integrity: sha512-AVnPGXJ8L41vjd11Z4akIF2yd14636Klxul3tBySxHA6PKfCOQPxBDkCFK5zcWh0z/keR6toh1eg8qzdBVUgdA==} + /ipx@3.1.1(@netlify/blobs@10.1.0): + resolution: {integrity: sha512-7Xnt54Dco7uYkfdAw0r2vCly3z0rSaVhEXMzPvl3FndsTVm5p26j+PO+gyinkYmcsEUvX2Rh7OGK7KzYWRu6BA==} hasBin: true dependencies: - '@fastify/accept-negotiator': 1.1.0 + '@fastify/accept-negotiator': 2.0.1 citty: 0.1.6 - consola: 3.4.0 + consola: 3.4.2 defu: 6.1.4 - destr: 2.0.3 + destr: 2.0.5 etag: 1.8.1 - h3: 1.15.1 + h3: 1.15.4 image-meta: 0.2.1 listhen: 1.9.0 ofetch: 1.4.1 - pathe: 1.1.2 - sharp: 0.32.6 - svgo: 3.3.2 + pathe: 2.0.3 + sharp: 0.34.4 + svgo: 4.0.0 ufo: 1.6.1 - unstorage: 1.15.0(@netlify/blobs@8.2.0) + unstorage: 1.17.1(@netlify/blobs@10.1.0) xss: 1.0.15 transitivePeerDependencies: - '@azure/app-configuration' @@ -10583,10 +10471,9 @@ packages: - '@planetscale/database' - '@upstash/redis' - '@vercel/blob' + - '@vercel/functions' - '@vercel/kv' - aws4fetch - - bare-abort-controller - - bare-buffer - db0 - idb-keyval - ioredis @@ -10744,6 +10631,11 @@ packages: hasBin: true dev: true + /is-error-instance@2.0.0: + resolution: {integrity: sha512-5RuM+oFY0P5MRa1nXJo6IcTx9m2VyXYhRtb4h0olsi2GHci4bqZ6akHk+GmCYvDrAR9yInbiYdr2pnoqiOMw/Q==} + engines: {node: '>=16.17.0'} + dev: true + /is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -10833,6 +10725,11 @@ packages: engines: {node: '>= 0.4'} dev: true + /is-network-error@1.3.0: + resolution: {integrity: sha512-6oIwpsgRfnDiyEDLMay/GqCl3HoAtH5+RUKW29gYkL0QA+ipzpDLA16yQs7/RHCSu+BwgbJaOUqa4A99qNVQVw==} + engines: {node: '>=16'} + dev: true + /is-npm@6.0.0: resolution: {integrity: sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -10960,9 +10857,9 @@ packages: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} - /is-unicode-supported@1.3.0: - resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} - engines: {node: '>=12'} + /is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} dev: true /is-url-superb@4.0.0: @@ -11052,23 +10949,6 @@ packages: /javascript-stringify@2.1.0: resolution: {integrity: sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==} - /jest-get-type@27.5.1: - resolution: {integrity: sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dev: true - - /jest-validate@27.5.1: - resolution: {integrity: sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/types': 27.5.1 - camelcase: 6.3.0 - chalk: 4.1.2 - jest-get-type: 27.5.1 - leven: 3.1.0 - pretty-format: 27.5.1 - dev: true - /jiti@2.4.2: resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} hasBin: true @@ -11079,6 +10959,16 @@ packages: engines: {node: '>=10'} dev: true + /jpeg-js@0.4.4: + resolution: {integrity: sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==} + dev: true + + /js-image-generator@1.0.4: + resolution: {integrity: sha512-ckb7kyVojGAnArouVR+5lBIuwU1fcrn7E/YYSd0FK7oIngAkMmRvHASLro9Zt5SQdWToaI66NybG+OGxPw/HlQ==} + dependencies: + jpeg-js: 0.4.4 + dev: true + /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -11183,7 +11073,7 @@ packages: lodash.isstring: 4.0.1 lodash.once: 4.1.1 ms: 2.1.3 - semver: 7.7.1 + semver: 7.7.2 dev: true /jsx-ast-utils@3.3.5: @@ -11223,9 +11113,9 @@ packages: resolution: {integrity: sha512-7n6wXq4gNgBELfDCpzKc+mRrZFs7D+wgfF5WRFLNAr4DA/qtr9Js8uOAVAfHhuLMfAcQ0pRKqbpjx+TcJVdE1Q==} dev: true - /keep-func-props@4.0.1: - resolution: {integrity: sha512-87ftOIICfdww3SxR5P1veq3ThBNyRPG0JGL//oaR08v0k2yTicEIHd7s0GqSJfQvlb+ybC3GiDepOweo0LDhvw==} - engines: {node: '>=12.20.0'} + /keep-func-props@6.0.0: + resolution: {integrity: sha512-XDYA44ccm6W2MXZeQcDZykS5srkTpPf6Z59AEuOFbfuqdQ5TVxhAjxgzAEFBpr8XpsCEgr/XeCBFAmc9x6wRmQ==} + engines: {node: '>=16.17.0'} dependencies: mimic-fn: 4.0.0 dev: true @@ -11330,7 +11220,7 @@ packages: dependencies: chalk: 5.4.1 commander: 13.1.0 - debug: 4.4.0(supports-color@9.4.0) + debug: 4.4.0(supports-color@10.2.2) execa: 8.0.1 lilconfig: 3.1.3 listr2: 8.2.5 @@ -11350,11 +11240,11 @@ packages: '@parcel/watcher-wasm': 2.5.1 citty: 0.1.6 clipboardy: 4.0.0 - consola: 3.4.0 + consola: 3.4.2 crossws: 0.3.4 defu: 6.1.4 get-port-please: 3.1.2 - h3: 1.15.1 + h3: 1.15.4 http-shutdown: 1.2.2 jiti: 2.4.2 mlly: 1.7.4 @@ -11433,18 +11323,6 @@ packages: /lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} - /lodash.defaults@4.2.0: - resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} - dev: true - - /lodash.difference@4.5.0: - resolution: {integrity: sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==} - dev: true - - /lodash.flatten@4.4.0: - resolution: {integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==} - dev: true - /lodash.get@4.4.2: resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} deprecated: This package is deprecated. Use the optional chaining (?.) operator instead. @@ -11514,10 +11392,6 @@ packages: resolution: {integrity: sha512-LO37ZnhmBVx0GvOU/caQuipEh4GN82TcWv3yHlebGDgOxbxiwwzW5Pcx2AcvpIv2WmvmSMoC492yQFNhy/l/UQ==} dev: true - /lodash.union@4.6.0: - resolution: {integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==} - dev: true - /lodash.uniq@4.5.0: resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} dev: true @@ -11533,17 +11407,14 @@ packages: /lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - /log-process-errors@8.0.0: - resolution: {integrity: sha512-+SNGqNC1gCMJfhwYzAHr/YgNT/ZJc+V2nCkvtPnjrENMeCe+B/jgShBW0lmWoh6uVV2edFAPc/IUOkDdsjTbTg==} - engines: {node: '>=12.20.0'} + /log-process-errors@11.0.1: + resolution: {integrity: sha512-HXYU83z3kH0VHfJgGyv9ZP9z7uNEayssgvpeQwSzh60mvpNqUBCPyXLSzCDSMxfGvAUUa0Kw06wJjVR46Ohd3A==} + engines: {node: '>=16.17.0'} dependencies: - colors-option: 3.0.0 - figures: 4.0.1 - filter-obj: 3.0.0 - jest-validate: 27.5.1 - map-obj: 5.0.2 - moize: 6.1.6 - semver: 7.7.1 + is-error-instance: 2.0.0 + is-plain-obj: 4.1.0 + normalize-exception: 3.0.0 + set-error-message: 2.0.1 dev: true /log-symbols@3.0.0: @@ -11636,20 +11507,13 @@ packages: /magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 - - /make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} - dependencies: - semver: 6.3.1 - dev: true + '@jridgewell/sourcemap-codec': 1.5.0 /make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} dependencies: - semver: 7.7.1 + semver: 7.7.2 dev: true /make-error@1.3.6: @@ -11829,8 +11693,8 @@ packages: resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} dev: true - /mdn-data@2.0.30: - resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + /mdn-data@2.12.2: + resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} dev: true /media-query-parser@2.0.2: @@ -12126,7 +11990,7 @@ packages: /micromark@2.11.4: resolution: {integrity: sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==} dependencies: - debug: 4.4.0(supports-color@9.4.0) + debug: 4.4.0(supports-color@10.2.2) parse-entities: 2.0.0 transitivePeerDependencies: - supports-color @@ -12136,7 +12000,7 @@ packages: resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} dependencies: '@types/debug': 4.1.12 - debug: 4.4.0(supports-color@9.4.0) + debug: 4.4.0(supports-color@10.2.2) decode-named-character-reference: 1.1.0 micromark-core-commonmark: 1.1.0 micromark-factory-space: 1.1.0 @@ -12321,15 +12185,6 @@ packages: /modern-ahocorasick@1.1.0: resolution: {integrity: sha512-sEKPVl2rM+MNVkGQt3ChdmD8YsigmXdn5NifZn6jiwn9LRJpWm8F3guhaqrJT/JOat6pwpbXEk6kv+b9DMIjsQ==} - /module-definition@5.0.1: - resolution: {integrity: sha512-kvw3B4G19IXk+BOXnYq/D/VeO9qfHaapMeuS7w7sNUqmGaA6hywdFHMi+VWeR9wUScXM7XjoryTffCZ5B0/8IA==} - engines: {node: '>=14'} - hasBin: true - dependencies: - ast-module-types: 5.0.0 - node-source-walk: 6.0.2 - dev: true - /module-definition@6.0.1: resolution: {integrity: sha512-FeVc50FTfVVQnolk/WQT8MX+2WVcDnTGiq6Wo+/+lJ2ET1bRVi3HG3YlJUfqagNMc/kUlFSoR96AJkxGpKz13g==} engines: {node: '>=18'} @@ -12416,10 +12271,6 @@ packages: picocolors: 1.1.1 dev: true - /napi-build-utils@2.0.0: - resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} - dev: true - /napi-postinstall@0.2.3: resolution: {integrity: sha512-Mi7JISo/4Ij2tDZ2xBE2WH+/KvVlkhA6juEjpEeRAVPNCpN3nxJo/5FhDNKgBcdmcmhaH6JjgST4xY/23ZYK0w==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} @@ -12442,57 +12293,57 @@ packages: resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} engines: {node: '>= 0.6'} - /nested-error-stacks@2.1.1: - resolution: {integrity: sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==} - dev: true - - /netlify-cli@20.1.1(@types/node@20.17.30): - resolution: {integrity: sha512-TyOaHXN8CwesnTiavZQtXquzarJ8Bxu1ufa9SdEcJ/g7usy4/OIBrOVQiAk2RdOHn2gGV07ttJ1KxHt+RP9xew==} - engines: {node: '>=18.14.0'} + /netlify-cli@23.9.5(@types/node@20.17.30): + resolution: {integrity: sha512-6hayHzdatDl80maIST41RH0BS9NjGCjEhc6+zV8PQbSPL/BVSjhecfw/vxfVKzZEkvkO3mcJwhrLl3l4FvvY/g==} + engines: {node: '>=20.12.2'} hasBin: true requiresBuild: true dependencies: '@fastify/static': 7.0.4 - '@netlify/blobs': 8.2.0 - '@netlify/build': 32.1.0(@opentelemetry/api@1.8.0)(@types/node@20.17.30) - '@netlify/build-info': 9.0.4 - '@netlify/config': 22.0.1 - '@netlify/edge-bundler': 13.0.2 - '@netlify/edge-functions': 2.11.1 - '@netlify/headers-parser': 8.0.0 + '@netlify/ai': 0.3.0(@netlify/api@14.0.7) + '@netlify/api': 14.0.7 + '@netlify/blobs': 10.1.0 + '@netlify/build': 35.2.7(@opentelemetry/api@1.8.0)(@types/node@20.17.30) + '@netlify/build-info': 10.0.9 + '@netlify/config': 24.0.6 + '@netlify/dev-utils': 4.3.0 + '@netlify/edge-bundler': 14.8.0 + '@netlify/edge-functions': 3.0.1 + '@netlify/edge-functions-bootstrap': 2.17.1 + '@netlify/headers-parser': 9.0.2 '@netlify/local-functions-proxy': 2.0.3 - '@netlify/redirect-parser': 14.5.1 - '@netlify/zip-it-and-ship-it': 10.0.7(supports-color@9.4.0) - '@octokit/rest': 21.1.1 + '@netlify/redirect-parser': 15.0.3 + '@netlify/zip-it-and-ship-it': 14.1.11(supports-color@10.2.2) + '@octokit/rest': 22.0.0 '@opentelemetry/api': 1.8.0 '@pnpm/tabtab': 0.5.4 - ansi-escapes: 7.0.0 + ansi-escapes: 7.1.1 ansi-to-html: 0.7.2 ascii-table: 0.0.9 backoff: 2.5.0 boxen: 8.0.1 - chalk: 5.4.1 - chokidar: 3.6.0 - ci-info: 4.2.0 + chalk: 5.6.2 + chokidar: 4.0.3 + ci-info: 4.3.0 clean-deep: 3.4.0 commander: 12.1.0 - comment-json: 4.2.5 + comment-json: 4.3.0 content-type: 1.0.5 cookie: 1.0.2 cron-parser: 4.9.0 - debug: 4.4.0(supports-color@9.4.0) + debug: 4.4.3(supports-color@10.2.2) decache: 4.6.2 dot-prop: 9.0.0 - dotenv: 16.5.0 + dotenv: 17.2.3 env-paths: 3.0.0 - envinfo: 7.14.0 + envinfo: 7.15.0 etag: 1.8.1 execa: 5.1.1 express: 4.21.2 express-logging: 1.1.1 extract-zip: 2.0.1 fastest-levenshtein: 1.0.16 - fastify: 4.29.0 + fastify: 4.29.1 find-up: 7.0.0 folder-walker: 3.2.0 fuzzy: 0.1.3 @@ -12500,12 +12351,12 @@ packages: gh-release-fetch: 4.0.3 git-repo-info: 2.1.1 gitconfiglocal: 2.1.0 - http-proxy: 1.18.1(debug@4.4.0) - http-proxy-middleware: 2.0.9(debug@4.4.0) - https-proxy-agent: 7.0.6 - inquirer: 8.2.6 - inquirer-autocomplete-prompt: 1.4.0(inquirer@8.2.6) - ipx: 2.1.0(@netlify/blobs@8.2.0) + http-proxy: 1.18.1(debug@4.4.3) + http-proxy-middleware: 2.0.9(debug@4.4.3) + https-proxy-agent: 7.0.6(supports-color@10.2.2) + inquirer: 8.2.7(@types/node@20.17.30) + inquirer-autocomplete-prompt: 1.4.0(inquirer@8.2.7) + ipx: 3.1.1(@netlify/blobs@10.1.0) is-docker: 3.0.0 is-stream: 4.0.1 is-wsl: 3.1.0 @@ -12520,32 +12371,30 @@ packages: maxstache-stream: 1.0.4 multiparty: 4.2.3 nanospinner: 1.2.2 - netlify: 13.3.5 netlify-redirector: 0.5.0 node-fetch: 3.3.2 - normalize-package-data: 6.0.2 - open: 10.1.1 + normalize-package-data: 7.0.1 + open: 10.2.0 p-filter: 4.1.0 p-map: 7.0.3 p-wait-for: 5.0.2 parallel-transform: 1.2.0 parse-github-url: 1.0.3 - parse-gitignore: 2.0.0 prettyjson: 1.2.5 - raw-body: 3.0.0 + raw-body: 3.0.1 read-package-up: 11.0.0 readdirp: 4.1.2 - semver: 7.7.1 + semver: 7.7.2 source-map-support: 0.5.21 terminal-link: 4.0.0 toml: 3.0.0 tomlify-j0.4: 3.0.0 - ulid: 2.3.0 + ulid: 3.0.1 update-notifier: 7.3.1 uuid: 11.1.0 wait-port: 1.1.0 write-file-atomic: 5.0.1 - ws: 8.18.1 + ws: 8.18.3 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -12563,10 +12412,10 @@ packages: - '@types/node' - '@upstash/redis' - '@vercel/blob' + - '@vercel/functions' - '@vercel/kv' - aws4fetch - bare-abort-controller - - bare-buffer - bufferutil - db0 - encoding @@ -12598,17 +12447,6 @@ packages: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} dev: true - /node-abi@3.74.0: - resolution: {integrity: sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w==} - engines: {node: '>=10'} - dependencies: - semver: 7.7.1 - dev: true - - /node-addon-api@6.1.0: - resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} - dev: true - /node-addon-api@7.1.1: resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} dev: true @@ -12622,6 +12460,10 @@ packages: resolution: {integrity: sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==} dev: true + /node-fetch-native@1.6.7: + resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} + dev: true + /node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} @@ -12650,20 +12492,13 @@ packages: resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} hasBin: true - /node-mock-http@1.0.0: - resolution: {integrity: sha512-0uGYQ1WQL1M5kKvGRXWQ3uZCHtLTO8hln3oBjIusM75WoesZ909uQJs/Hb946i2SS+Gsrhkaa6iAO17jRIv6DQ==} + /node-mock-http@1.0.3: + resolution: {integrity: sha512-jN8dK25fsfnMrVsEhluUTPkBFY+6ybu7jSB1n+ri/vOGjJxU8J9CZhpSGkHXSkFjtUhbmoncG/YG9ta5Ludqog==} dev: true /node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} - /node-source-walk@6.0.2: - resolution: {integrity: sha512-jn9vOIK/nfqoFCcpK89/VCVaLg1IHE6UVfDOzvqmANaJ/rWCTEdH8RZ1V278nv2jr36BJdyQXIAavBLXpzdlag==} - engines: {node: '>=14'} - dependencies: - '@babel/parser': 7.27.2 - dev: true - /node-source-walk@7.0.1: resolution: {integrity: sha512-3VW/8JpPqPvnJvseXowjZcirPisssnBuDikk6JIZ8jQzF7KJQX52iPFX4RYYxLycYH7IbMRSPUOga/esVjy5Yg==} engines: {node: '>=18'} @@ -12675,14 +12510,6 @@ packages: engines: {node: '>=0.12.0'} dev: true - /nopt@5.0.0: - resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} - engines: {node: '>=6'} - hasBin: true - dependencies: - abbrev: 1.1.1 - dev: true - /nopt@8.1.0: resolution: {integrity: sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==} engines: {node: ^18.17.0 || >=20.5.0} @@ -12690,6 +12517,14 @@ packages: dependencies: abbrev: 3.0.1 + /normalize-exception@3.0.0: + resolution: {integrity: sha512-SMZtWSLjls45KBgwvS2jWyXLtOI9j90JyQ6tJstl91Gti4W7QwZyF/nWwlFRz/Cx4Gy70DAtLT0EzXYXcPJJUw==} + engines: {node: '>=16.17.0'} + dependencies: + is-error-instance: 2.0.0 + is-plain-obj: 4.1.0 + dev: true + /normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} dependencies: @@ -12726,6 +12561,15 @@ packages: semver: 7.7.1 validate-npm-package-license: 3.0.4 + /normalize-package-data@7.0.1: + resolution: {integrity: sha512-linxNAT6M0ebEYZOx2tO6vBEFsVgnPpv+AVjk0wJHfaUIbq31Jm3T6vvZaarnOeWDh8ShnwXuaAyM7WT3RzErA==} + engines: {node: ^18.17.0 || >=20.5.0} + dependencies: + hosted-git-info: 8.1.0 + semver: 7.7.2 + validate-npm-package-license: 3.0.4 + dev: true + /normalize-path@2.1.1: resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} engines: {node: '>=0.10.0'} @@ -12812,16 +12656,6 @@ packages: dependencies: path-key: 4.0.0 - /npmlog@5.0.1: - resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} - deprecated: This package is no longer supported. - dependencies: - are-we-there-yet: 2.0.0 - console-control-strings: 1.1.0 - gauge: 3.0.2 - set-blocking: 2.0.0 - dev: true - /nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} dependencies: @@ -12904,7 +12738,7 @@ packages: /ofetch@1.4.1: resolution: {integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==} dependencies: - destr: 2.0.3 + destr: 2.0.5 node-fetch-native: 1.6.6 ufo: 1.6.1 dev: true @@ -12963,14 +12797,14 @@ packages: mimic-function: 5.0.1 dev: true - /open@10.1.1: - resolution: {integrity: sha512-zy1wx4+P3PfhXSEPJNtZmJXfhkkIaxU1VauWIrDZw1O7uJRDRJtKr9n3Ic4NgbA16KyOxOXO2ng9gYwCdXuSXA==} + /open@10.2.0: + resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} engines: {node: '>=18'} dependencies: default-browser: 5.2.1 define-lazy-prop: 3.0.0 is-inside-container: 1.0.0 - is-wsl: 3.1.0 + wsl-utils: 0.1.0 dev: true /optionator@0.8.3: @@ -13025,12 +12859,12 @@ packages: strip-ansi: 6.0.1 wcwidth: 1.0.1 - /os-name@5.1.0: - resolution: {integrity: sha512-YEIoAnM6zFmzw3PQ201gCVCIWbXNyKObGlVvpAVvraAeOHnlYVKFssbA/riRX5R40WA6kKrZ7Dr7dWzO3nKSeQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + /os-name@6.1.0: + resolution: {integrity: sha512-zBd1G8HkewNd2A8oQ8c6BN/f/c9EId7rSUueOLGu28govmUctXmM+3765GwsByv9nYUdrLqHphXlYIc86saYsg==} + engines: {node: '>=18'} dependencies: macos-release: 3.3.0 - windows-release: 5.1.1 + windows-release: 6.1.0 dev: true /os-tmpdir@1.0.2: @@ -13055,13 +12889,6 @@ packages: engines: {node: '>=12.20'} dev: true - /p-event@4.2.0: - resolution: {integrity: sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==} - engines: {node: '>=8'} - dependencies: - p-timeout: 3.2.0 - dev: true - /p-event@5.0.1: resolution: {integrity: sha512-dd589iCQ7m1L0bmC5NLlVYfy3TbBEsMUfWx9PyAgPeIcFZ/E2yaTZ4Rz4MiBmmJShviiftHVXOqfnfzJ6kyMrQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -13075,20 +12902,6 @@ packages: dependencies: p-timeout: 6.1.4 - /p-every@2.0.0: - resolution: {integrity: sha512-MCz9DqD5opPC48Zsd+BHm56O/HfhYIQQtupfDzhXoVgQdg/Ux4F8/JcdRuQ+arq7zD5fB6zP3axbH3d9Nr8dlw==} - engines: {node: '>=8'} - dependencies: - p-map: 2.1.0 - dev: true - - /p-filter@3.0.0: - resolution: {integrity: sha512-QtoWLjXAW++uTX67HZQz1dbTpqBfiidsB6VtQUC9iR85S120+s0T5sO6s+B5MLzFcZkrEd/DGMmCjR+f2Qpxwg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - p-map: 5.5.0 - dev: true - /p-filter@4.1.0: resolution: {integrity: sha512-37/tPdZ3oJwHaS3gNJdenCDB3Tz26i9sjhnguBtvN0vYlRIiDNnvTWkuh+0hETV9rLPdJ3rlL3yVOYPIAnM8rw==} engines: {node: '>=18'} @@ -13096,11 +12909,6 @@ packages: p-map: 7.0.3 dev: true - /p-finally@1.0.0: - resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} - engines: {node: '>=4'} - dev: true - /p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -13146,24 +12954,12 @@ packages: dependencies: p-limit: 4.0.0 - /p-map@2.1.0: - resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} - engines: {node: '>=6'} - dev: true - /p-map@4.0.0: resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} engines: {node: '>=10'} dependencies: aggregate-error: 3.1.0 - /p-map@5.5.0: - resolution: {integrity: sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==} - engines: {node: '>=12'} - dependencies: - aggregate-error: 4.0.1 - dev: true - /p-map@7.0.3: resolution: {integrity: sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==} engines: {node: '>=18'} @@ -13173,21 +12969,15 @@ packages: engines: {node: '>=12'} dev: true - /p-retry@5.1.2: - resolution: {integrity: sha512-couX95waDu98NfNZV+i/iLt+fdVxmI7CbrrdC2uDWfPdUAApyxT4wmDlyOtR5KtTDmkDO0zDScDjDou9YHhd9g==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + /p-retry@6.2.1: + resolution: {integrity: sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==} + engines: {node: '>=16.17'} dependencies: - '@types/retry': 0.12.1 + '@types/retry': 0.12.2 + is-network-error: 1.3.0 retry: 0.13.1 dev: true - /p-timeout@3.2.0: - resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} - engines: {node: '>=8'} - dependencies: - p-finally: 1.0.0 - dev: true - /p-timeout@5.1.0: resolution: {integrity: sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==} engines: {node: '>=12'} @@ -13208,6 +12998,13 @@ packages: dependencies: p-timeout: 6.1.4 + /package-directory@8.1.0: + resolution: {integrity: sha512-qHKRW0pw3lYdZMQVkjDBqh8HlamH/LCww2PH7OWEp4Qrt3SFeYMNpnJrQzlSnGrDD5zGR51XqBh7FnNCdVNEHA==} + engines: {node: '>=18'} + dependencies: + find-up-simple: 1.0.0 + dev: true + /package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} @@ -13218,7 +13015,11 @@ packages: ky: 1.7.5 registry-auth-token: 5.1.0 registry-url: 6.0.1 - semver: 7.7.1 + semver: 7.7.2 + dev: true + + /package-manager-detector@1.5.0: + resolution: {integrity: sha512-uBj69dVlYe/+wxj8JOpr97XfsxH/eumMt6HqjNTmJDf/6NO9s+0uxeOneIz3AsPt2m6y9PqzDzd3ATcU17MNfw==} dev: true /pako@0.2.9: @@ -13309,9 +13110,9 @@ packages: resolution: {integrity: sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==} engines: {node: '>=6'} - /parse-ms@3.0.0: - resolution: {integrity: sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==} - engines: {node: '>=12'} + /parse-ms@4.0.0: + resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} + engines: {node: '>=18'} dev: true /parseurl@1.3.3: @@ -13369,9 +13170,9 @@ packages: engines: {node: '>=8'} dev: true - /path-type@5.0.0: - resolution: {integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==} - engines: {node: '>=12'} + /path-type@6.0.0: + resolution: {integrity: sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==} + engines: {node: '>=18'} dev: true /path@0.12.7: @@ -13425,6 +13226,10 @@ packages: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} + /picoquery@2.5.0: + resolution: {integrity: sha512-j1kgOFxtaCyoFCkpoYG2Oj3OdGakadO7HZ7o5CqyRazlmBekKhbDoUnNnXASE07xSY4nDImWZkrZv7toSxMi/g==} + dev: true + /pidtree@0.3.1: resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==} engines: {node: '>=0.10'} @@ -13480,13 +13285,6 @@ packages: find-up: 5.0.0 dev: true - /pkg-dir@7.0.0: - resolution: {integrity: sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==} - engines: {node: '>=14.16'} - dependencies: - find-up: 6.3.0 - dev: true - /pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} dependencies: @@ -13684,47 +13482,7 @@ packages: picocolors: 1.1.1 source-map-js: 1.2.1 - /prebuild-install@7.1.3: - resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} - engines: {node: '>=10'} - hasBin: true - dependencies: - detect-libc: 2.0.3 - expand-template: 2.0.3 - github-from-package: 0.0.0 - minimist: 1.2.8 - mkdirp-classic: 0.5.3 - napi-build-utils: 2.0.0 - node-abi: 3.74.0 - pump: 3.0.2 - rc: 1.2.8 - simple-get: 4.0.1 - tar-fs: 2.1.2 - tunnel-agent: 0.6.0 - dev: true - - /precinct@11.0.5(supports-color@9.4.0): - resolution: {integrity: sha512-oHSWLC8cL/0znFhvln26D14KfCQFFn4KOLSw6hmLhd+LQ2SKt9Ljm89but76Pc7flM9Ty1TnXyrA2u16MfRV3w==} - engines: {node: ^14.14.0 || >=16.0.0} - hasBin: true - dependencies: - '@dependents/detective-less': 4.1.0 - commander: 10.0.1 - detective-amd: 5.0.2 - detective-cjs: 5.0.1 - detective-es6: 4.0.1 - detective-postcss: 6.1.3 - detective-sass: 5.0.3 - detective-scss: 4.0.3 - detective-stylus: 4.0.0 - detective-typescript: 11.2.0(supports-color@9.4.0) - module-definition: 5.0.1 - node-source-walk: 6.0.2 - transitivePeerDependencies: - - supports-color - dev: true - - /precinct@12.2.0: + /precinct@12.2.0(supports-color@10.2.2): resolution: {integrity: sha512-NFBMuwIfaJ4SocE9YXPU/n4AcNSoFMVFjP72nvl3cx69j/ke61/hPOWFREVxLkFhhEGnA8ZuVfTqJBa+PK3b5w==} engines: {node: '>=18'} hasBin: true @@ -13738,8 +13496,8 @@ packages: detective-sass: 6.0.1 detective-scss: 5.0.1 detective-stylus: 5.0.1 - detective-typescript: 14.0.0(typescript@5.8.3) - detective-vue2: 2.2.0(typescript@5.8.3) + detective-typescript: 14.0.0(supports-color@10.2.2)(typescript@5.8.3) + detective-vue2: 2.2.0(supports-color@10.2.2)(typescript@5.8.3) module-definition: 6.0.1 node-source-walk: 7.0.1 postcss: 8.5.6 @@ -13794,11 +13552,11 @@ packages: dependencies: parse-ms: 2.1.0 - /pretty-ms@8.0.0: - resolution: {integrity: sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==} - engines: {node: '>=14.16'} + /pretty-ms@9.3.0: + resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} + engines: {node: '>=18'} dependencies: - parse-ms: 3.0.0 + parse-ms: 4.0.0 dev: true /prettyjson@1.2.5: @@ -13875,6 +13633,17 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true + /publint@0.3.15: + resolution: {integrity: sha512-xPbRAPW+vqdiaKy5sVVY0uFAu3LaviaPO3pZ9FaRx59l9+U/RKR1OEbLhkug87cwiVKxPXyB4txsv5cad67u+A==} + engines: {node: '>=18'} + hasBin: true + dependencies: + '@publint/pack': 0.1.2 + package-manager-detector: 1.5.0 + picocolors: 1.1.1 + sade: 1.8.1 + dev: true + /pump@1.0.3: resolution: {integrity: sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==} dependencies: @@ -13970,13 +13739,13 @@ packages: iconv-lite: 0.4.24 unpipe: 1.0.0 - /raw-body@3.0.0: - resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==} - engines: {node: '>= 0.8'} + /raw-body@3.0.1: + resolution: {integrity: sha512-9G8cA+tuMS75+6G/TzW8OtLzmBDMo8p1JRxN5AZ+LAp8uxGA8V8GZm4GQ4/N5QNQEnLmg6SS7wyuSmbKepiKqA==} + engines: {node: '>= 0.10'} dependencies: bytes: 3.1.2 http-errors: 2.0.0 - iconv-lite: 0.6.3 + iconv-lite: 0.7.0 unpipe: 1.0.0 dev: true @@ -14079,15 +13848,6 @@ packages: type-fest: 0.8.1 dev: true - /read-pkg-up@9.1.0: - resolution: {integrity: sha512-vaMRR1AC1nrd5CQM0PhlRsO5oc2AAigqr7cCrZ/MW/Rsaflz4RlgzkpL4qoU/z1F6wrbd85iFv1OQj/y5RdGvg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - find-up: 6.3.0 - read-pkg: 7.1.0 - type-fest: 2.19.0 - dev: true - /read-pkg@3.0.0: resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} engines: {node: '>=4'} @@ -14107,16 +13867,6 @@ packages: type-fest: 0.6.0 dev: true - /read-pkg@7.1.0: - resolution: {integrity: sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg==} - engines: {node: '>=12.20'} - dependencies: - '@types/normalize-package-data': 2.4.4 - normalize-package-data: 3.0.3 - parse-json: 5.2.0 - type-fest: 2.19.0 - dev: true - /read-pkg@9.0.1: resolution: {integrity: sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==} engines: {node: '>=18'} @@ -14291,11 +14041,6 @@ packages: /remove-trailing-separator@1.1.0: resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} - /repeat-string@1.6.1: - resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} - engines: {node: '>=0.10'} - dev: true - /req-all@0.1.0: resolution: {integrity: sha512-ZdvPr8uXy9ujX3KujwE2P1HWkMYgogIhqeAeyb47MqWjSfyxERSm0TNbN/IapCCmWDufXab04AYrRgObaJCJ6Q==} engines: {node: '>=4'} @@ -14581,6 +14326,10 @@ packages: /safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + /sax@1.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + dev: true + /scheduler@0.23.2: resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} dependencies: @@ -14619,6 +14368,12 @@ packages: engines: {node: '>=10'} hasBin: true + /semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} + hasBin: true + dev: true + /send@0.19.0: resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} engines: {node: '>= 0.8.0'} @@ -14650,13 +14405,16 @@ packages: transitivePeerDependencies: - supports-color - /set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - dev: true - /set-cookie-parser@2.7.1: resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} + /set-error-message@2.0.1: + resolution: {integrity: sha512-s/eeP0f4ed1S3fl0KbxZoy5Pbeg5D6Nbple9nut4VPwHTvEIk5r7vKq0FwjNjszdUPdlTrs4GJCOkWUqWeTeWg==} + engines: {node: '>=16.17.0'} + dependencies: + normalize-exception: 3.0.0 + dev: true + /set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -14690,22 +14448,37 @@ packages: /setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - /sharp@0.32.6: - resolution: {integrity: sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==} - engines: {node: '>=14.15.0'} + /sharp@0.34.4: + resolution: {integrity: sha512-FUH39xp3SBPnxWvd5iib1X8XY7J0K0X7d93sie9CJg2PO8/7gmg89Nve6OjItK53/MlAushNNxteBYfM6DEuoA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} requiresBuild: true dependencies: - color: 4.2.3 - detect-libc: 2.0.3 - node-addon-api: 6.1.0 - prebuild-install: 7.1.3 - semver: 7.7.1 - simple-get: 4.0.1 - tar-fs: 3.0.8 - tunnel-agent: 0.6.0 - transitivePeerDependencies: - - bare-abort-controller - - bare-buffer + '@img/colour': 1.0.0 + detect-libc: 2.1.2 + semver: 7.7.2 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.34.4 + '@img/sharp-darwin-x64': 0.34.4 + '@img/sharp-libvips-darwin-arm64': 1.2.3 + '@img/sharp-libvips-darwin-x64': 1.2.3 + '@img/sharp-libvips-linux-arm': 1.2.3 + '@img/sharp-libvips-linux-arm64': 1.2.3 + '@img/sharp-libvips-linux-ppc64': 1.2.3 + '@img/sharp-libvips-linux-s390x': 1.2.3 + '@img/sharp-libvips-linux-x64': 1.2.3 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.3 + '@img/sharp-libvips-linuxmusl-x64': 1.2.3 + '@img/sharp-linux-arm': 0.34.4 + '@img/sharp-linux-arm64': 0.34.4 + '@img/sharp-linux-ppc64': 0.34.4 + '@img/sharp-linux-s390x': 0.34.4 + '@img/sharp-linux-x64': 0.34.4 + '@img/sharp-linuxmusl-arm64': 0.34.4 + '@img/sharp-linuxmusl-x64': 0.34.4 + '@img/sharp-wasm32': 0.34.4 + '@img/sharp-win32-arm64': 0.34.4 + '@img/sharp-win32-ia32': 0.34.4 + '@img/sharp-win32-x64': 0.34.4 dev: true /shebang-command@1.2.0: @@ -14782,18 +14555,6 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - /simple-concat@1.0.1: - resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} - dev: true - - /simple-get@4.0.1: - resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} - dependencies: - decompress-response: 6.0.0 - once: 1.4.0 - simple-concat: 1.0.1 - dev: true - /simple-swizzle@0.2.2: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} dependencies: @@ -14804,9 +14565,9 @@ packages: engines: {node: '>=8'} dev: true - /slash@4.0.0: - resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} - engines: {node: '>=12'} + /slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} dev: true /slashes@3.0.12: @@ -15219,6 +14980,10 @@ packages: ts-interface-checker: 0.1.13 dev: true + /supports-color@10.2.2: + resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==} + engines: {node: '>=18'} + /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -15232,18 +14997,6 @@ packages: dependencies: has-flag: 4.0.0 - /supports-color@9.4.0: - resolution: {integrity: sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==} - engines: {node: '>=12'} - - /supports-hyperlinks@2.3.0: - resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - supports-color: 7.2.0 - dev: true - /supports-hyperlinks@3.2.0: resolution: {integrity: sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==} engines: {node: '>=14.18'} @@ -15256,18 +15009,18 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - /svgo@3.3.2: - resolution: {integrity: sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==} - engines: {node: '>=14.0.0'} + /svgo@4.0.0: + resolution: {integrity: sha512-VvrHQ+9uniE+Mvx3+C9IEe/lWasXCU0nXMY2kZeLrHNICuRiC8uMPyM14UEaMOFA5mhyQqEkB02VoQ16n3DLaw==} + engines: {node: '>=16'} hasBin: true dependencies: - '@trysound/sax': 0.2.0 - commander: 7.2.0 + commander: 11.1.0 css-select: 5.1.0 - css-tree: 2.3.1 + css-tree: 3.1.0 css-what: 6.1.0 csso: 5.0.5 picocolors: 1.1.1 + sax: 1.4.1 dev: true /system-architecture@0.1.0: @@ -15298,19 +15051,6 @@ packages: pump: 3.0.2 tar-stream: 2.2.0 - /tar-fs@3.0.8: - resolution: {integrity: sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg==} - dependencies: - pump: 3.0.2 - tar-stream: 3.1.7 - optionalDependencies: - bare-fs: 4.4.11 - bare-path: 3.0.0 - transitivePeerDependencies: - - bare-abort-controller - - bare-buffer - dev: true - /tar-stream@2.2.0: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} engines: {node: '>=6'} @@ -15352,19 +15092,11 @@ packages: mkdirp: 3.0.1 yallist: 5.0.0 - /terminal-link@3.0.0: - resolution: {integrity: sha512-flFL3m4wuixmf6IfhFJd1YPiLiMuxEc8uHRM1buzIeZPm22Au2pDqBJQgdo7n1WfPU1ONFGv7YDwpFBmHGF6lg==} - engines: {node: '>=12'} - dependencies: - ansi-escapes: 5.0.0 - supports-hyperlinks: 2.3.0 - dev: true - /terminal-link@4.0.0: resolution: {integrity: sha512-lk+vH+MccxNqgVqSnkMVKx4VLJfnLjDBGzH16JVZjKE2DoxP57s6/vt6JmXV5I3jBcfGrxNrYtC+mPtU7WJztA==} engines: {node: '>=18'} dependencies: - ansi-escapes: 7.0.0 + ansi-escapes: 7.1.1 supports-hyperlinks: 3.2.0 dev: true @@ -15689,7 +15421,7 @@ packages: cac: 6.7.14 chokidar: 4.0.3 consola: 3.4.0 - debug: 4.4.0(supports-color@9.4.0) + debug: 4.4.0(supports-color@10.2.2) esbuild: 0.25.0 joycon: 3.1.1 picocolors: 1.1.1 @@ -15733,7 +15465,7 @@ packages: cac: 6.7.14 chokidar: 4.0.3 consola: 3.4.0 - debug: 4.4.0(supports-color@9.4.0) + debug: 4.4.0(supports-color@10.2.2) esbuild: 0.25.0 joycon: 3.1.1 picocolors: 1.1.1 @@ -15777,7 +15509,7 @@ packages: cac: 6.7.14 chokidar: 4.0.3 consola: 3.4.0 - debug: 4.4.0(supports-color@9.4.0) + debug: 4.4.0(supports-color@10.2.2) esbuild: 0.25.0 joycon: 3.1.1 picocolors: 1.1.1 @@ -15821,7 +15553,7 @@ packages: cac: 6.7.14 chokidar: 4.0.3 consola: 3.4.0 - debug: 4.4.0(supports-color@9.4.0) + debug: 4.4.0(supports-color@10.2.2) esbuild: 0.25.0 joycon: 3.1.1 picocolors: 1.1.1 @@ -15852,22 +15584,6 @@ packages: typescript: 5.7.3 dev: true - /tsutils@3.21.0(typescript@5.8.3): - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' - dependencies: - tslib: 1.14.1 - typescript: 5.8.3 - dev: true - - /tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - dependencies: - safe-buffer: 5.2.1 - dev: true - /turbo-stream@2.4.1: resolution: {integrity: sha512-v8kOJXpG3WoTN/+at8vK7erSzo6nW6CIaeOvNOkHQVDajfz1ZVeSxCbc6tOH4hrGZW7VUCV0TOXd8CPzYnYkrw==} @@ -15910,16 +15626,6 @@ packages: engines: {node: '>=8'} dev: true - /type-fest@1.4.0: - resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} - engines: {node: '>=10'} - dev: true - - /type-fest@2.19.0: - resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} - engines: {node: '>=12.20'} - dev: true - /type-fest@4.40.0: resolution: {integrity: sha512-ABHZ2/tS2JkvH1PEjxFDTUWC8dB5OsIGZP4IFLhR293GqT5Y5qB1WwL2kMPYhQW9DVgVD8Hd7I8gjwPIf5GFkw==} engines: {node: '>=16'} @@ -15996,8 +15702,8 @@ packages: random-bytes: 1.0.0 dev: true - /ulid@2.3.0: - resolution: {integrity: sha512-keqHubrlpvT6G2wH0OEfSW4mquYRcbe/J8NMmveoQOjUqmo+hXtO+ORCpWhdbZ7k72UtY61BL7haGxW6enBnjw==} + /ulid@3.0.1: + resolution: {integrity: sha512-dPJyqPzx8preQhqq24bBG1YNkvigm87K8kVEHCD+ruZg24t6IFEFv00xMWfxcC4djmFtiTLdFuADn4+DOz6R7Q==} hasBin: true dev: true @@ -16033,6 +15739,11 @@ packages: resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} engines: {node: '>=18'} + /unicorn-magic@0.3.0: + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} + engines: {node: '>=18'} + dev: true + /unified@10.1.2: resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} dependencies: @@ -16162,8 +15873,8 @@ packages: '@unrs/resolver-binding-win32-x64-msvc': 1.7.2 dev: true - /unstorage@1.15.0(@netlify/blobs@8.2.0): - resolution: {integrity: sha512-m40eHdGY/gA6xAPqo8eaxqXgBuzQTlAKfmB1iF7oCKXE1HfwHwzDJBywK+qQGn52dta+bPlZluPF7++yR3p/bg==} + /unstorage@1.17.1(@netlify/blobs@10.1.0): + resolution: {integrity: sha512-KKGwRTT0iVBCErKemkJCLs7JdxNVfqTPc/85ae1XES0+bsHbc/sFBfVi5kJp156cc51BHinIH2l3k0EZ24vOBQ==} peerDependencies: '@azure/app-configuration': ^1.8.0 '@azure/cosmos': ^4.2.0 @@ -16171,12 +15882,13 @@ packages: '@azure/identity': ^4.6.0 '@azure/keyvault-secrets': ^4.9.0 '@azure/storage-blob': ^12.26.0 - '@capacitor/preferences': ^6.0.3 + '@capacitor/preferences': ^6.0.3 || ^7.0.0 '@deno/kv': '>=0.9.0' - '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 + '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0 '@planetscale/database': ^1.19.0 '@upstash/redis': ^1.34.3 '@vercel/blob': '>=0.27.1' + '@vercel/functions': ^2.2.12 || ^3.0.0 '@vercel/kv': ^1.0.1 aws4fetch: ^1.0.20 db0: '>=0.2.1' @@ -16208,6 +15920,8 @@ packages: optional: true '@vercel/blob': optional: true + '@vercel/functions': + optional: true '@vercel/kv': optional: true aws4fetch: @@ -16221,13 +15935,13 @@ packages: uploadthing: optional: true dependencies: - '@netlify/blobs': 8.2.0 + '@netlify/blobs': 10.1.0 anymatch: 3.1.3 chokidar: 4.0.3 - destr: 2.0.3 - h3: 1.15.1 + destr: 2.0.5 + h3: 1.15.4 lru-cache: 10.4.3 - node-fetch-native: 1.6.6 + node-fetch-native: 1.6.7 ofetch: 1.4.1 ufo: 1.6.1 dev: true @@ -16242,7 +15956,7 @@ packages: hasBin: true dependencies: citty: 0.1.6 - consola: 3.4.0 + consola: 3.4.2 pathe: 1.1.2 dev: true @@ -16261,14 +15975,14 @@ packages: engines: {node: '>=18'} dependencies: boxen: 8.0.1 - chalk: 5.4.1 + chalk: 5.6.2 configstore: 7.0.0 is-in-ci: 1.0.0 is-installed-globally: 1.0.0 is-npm: 6.0.0 latest-version: 9.0.0 pupa: 3.1.0 - semver: 7.7.1 + semver: 7.7.2 xdg-basedir: 5.1.0 dev: true @@ -16314,11 +16028,6 @@ packages: resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} hasBin: true - /uuid@9.0.1: - resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} - hasBin: true - dev: true - /uvu@0.5.6: resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} engines: {node: '>=8'} @@ -16363,13 +16072,6 @@ packages: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - /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.1.0 - dev: true - /validate-npm-package-name@5.0.1: resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -16398,7 +16100,7 @@ packages: hasBin: true dependencies: cac: 6.7.14 - debug: 4.4.0(supports-color@9.4.0) + debug: 4.4.0(supports-color@10.2.2) pathe: 1.1.2 picocolors: 1.1.1 vite: 5.4.21(@types/node@20.17.30) @@ -16419,7 +16121,7 @@ packages: hasBin: true dependencies: cac: 6.7.14 - debug: 4.4.0(supports-color@9.4.0) + debug: 4.4.0(supports-color@10.2.2) es-module-lexer: 1.7.0 pathe: 1.1.2 vite: 6.4.1(@types/node@20.17.30) @@ -16443,7 +16145,7 @@ packages: hasBin: true dependencies: cac: 6.7.14 - debug: 4.4.0(supports-color@9.4.0) + debug: 4.4.0(supports-color@10.2.2) es-module-lexer: 1.7.0 pathe: 2.0.3 vite: 6.4.1(@types/node@20.17.30) @@ -16470,7 +16172,7 @@ packages: vite: optional: true dependencies: - debug: 4.4.0(supports-color@9.4.0) + debug: 4.4.0(supports-color@10.2.2) globrex: 0.1.2 tsconfck: 3.1.5(typescript@5.7.3) vite: 6.4.1(@types/node@20.17.30) @@ -16604,7 +16306,7 @@ packages: '@vitest/spy': 3.1.1 '@vitest/utils': 3.1.1 chai: 5.2.0 - debug: 4.4.0(supports-color@9.4.0) + debug: 4.4.0(supports-color@10.2.2) expect-type: 1.2.1 magic-string: 0.30.17 pathe: 2.0.3 @@ -16638,7 +16340,7 @@ packages: dependencies: chalk: 4.1.2 commander: 9.5.0 - debug: 4.4.0(supports-color@9.4.0) + debug: 4.4.3(supports-color@10.2.2) transitivePeerDependencies: - supports-color dev: true @@ -16766,12 +16468,6 @@ packages: stackback: 0.0.2 dev: true - /wide-align@1.1.5: - resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} - dependencies: - string-width: 4.2.3 - dev: true - /widest-line@5.0.0: resolution: {integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==} engines: {node: '>=18'} @@ -16779,11 +16475,11 @@ packages: string-width: 7.2.0 dev: true - /windows-release@5.1.1: - resolution: {integrity: sha512-NMD00arvqcq2nwqc5Q6KtrSRHK+fVD31erE5FEMahAw5PmVCgD7MUXodq3pdZSUkqA9Cda2iWx6s1XYwiJWRmw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + /windows-release@6.1.0: + resolution: {integrity: sha512-1lOb3qdzw6OFmOzoY0nauhLG72TpWtb5qgYPiSh/62rjc1XidBSDio2qw0pwHh17VINF217ebIkZJdFLZFn9SA==} + engines: {node: '>=18'} dependencies: - execa: 5.1.1 + execa: 8.0.1 dev: true /winston-transport@4.9.0: @@ -16886,8 +16582,8 @@ packages: utf-8-validate: optional: true - /ws@8.18.1: - resolution: {integrity: sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==} + /ws@8.18.3: + resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -16899,6 +16595,13 @@ packages: optional: true dev: true + /wsl-utils@0.1.0: + resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} + engines: {node: '>=18'} + dependencies: + is-wsl: 3.1.0 + dev: true + /xdg-basedir@5.1.0: resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} engines: {node: '>=12'} @@ -16942,6 +16645,12 @@ packages: engines: {node: '>= 14'} hasBin: true + /yaml@2.8.1: + resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==} + engines: {node: '>= 14.6'} + hasBin: true + dev: true + /yargs-parser@20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} @@ -16986,15 +16695,6 @@ packages: resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} engines: {node: '>=12.20'} - /zip-stream@4.1.1: - resolution: {integrity: sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==} - engines: {node: '>= 10'} - dependencies: - archiver-utils: 3.0.4 - compress-commons: 4.1.2 - readable-stream: 3.6.2 - dev: true - /zip-stream@6.0.1: resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} engines: {node: '>= 14'} @@ -17006,5 +16706,13 @@ packages: /zod@3.23.8: resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} + /zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + dev: true + + /zod@4.1.12: + resolution: {integrity: sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==} + dev: true + /zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} diff --git a/tests/e2e/fixtures/edge-site/vite.config.ts b/tests/e2e/fixtures/edge-site/vite.config.ts index 3babacc65..2dc9dff1e 100644 --- a/tests/e2e/fixtures/edge-site/vite.config.ts +++ b/tests/e2e/fixtures/edge-site/vite.config.ts @@ -4,5 +4,9 @@ import tsconfigPaths from "vite-tsconfig-paths"; import { netlifyPlugin } from "@netlify/remix-edge-adapter/plugin"; export default defineConfig({ - plugins: [remix(), netlifyPlugin(), tsconfigPaths()], + plugins: [ + remix(), + netlifyPlugin({ excludedPaths: ["/please-blorble"] }), + tsconfigPaths(), + ], }); diff --git a/tests/e2e/fixtures/react-router-v8-middleware/app/app.css b/tests/e2e/fixtures/react-router-edge-site/app/app.css similarity index 100% rename from tests/e2e/fixtures/react-router-v8-middleware/app/app.css rename to tests/e2e/fixtures/react-router-edge-site/app/app.css diff --git a/tests/e2e/fixtures/react-router-edge-site/app/entry.server.tsx b/tests/e2e/fixtures/react-router-edge-site/app/entry.server.tsx new file mode 100644 index 000000000..cec760ad4 --- /dev/null +++ b/tests/e2e/fixtures/react-router-edge-site/app/entry.server.tsx @@ -0,0 +1,40 @@ +import type { AppLoadContext, EntryContext } from 'react-router' +import { ServerRouter } from 'react-router' +import { isbot } from 'isbot' +import { renderToReadableStream } from 'react-dom/server' + +export default async function handleRequest( + request: Request, + responseStatusCode: number, + responseHeaders: Headers, + routerContext: EntryContext, + _loadContext: AppLoadContext, +) { + let shellRendered = false + const userAgent = request.headers.get('user-agent') + + const body = await renderToReadableStream(, { + onError(error: unknown) { + responseStatusCode = 500 + // Log streaming rendering errors from inside the shell. Don't log + // errors encountered during initial shell rendering since they'll + // reject and get logged in handleDocumentRequest. + if (shellRendered) { + console.error(error) + } + }, + }) + shellRendered = true + + // Ensure requests from bots and SPA Mode renders wait for all content to load before responding + // https://react.dev/reference/react-dom/server/renderToPipeableStream#waiting-for-all-content-to-load-for-crawlers-and-static-generation + if ((userAgent && isbot(userAgent)) || routerContext.isSpaMode) { + await body.allReady + } + + responseHeaders.set('Content-Type', 'text/html') + return new Response(body, { + headers: responseHeaders, + status: responseStatusCode, + }) +} diff --git a/tests/e2e/fixtures/react-router-v8-middleware/app/root.tsx b/tests/e2e/fixtures/react-router-edge-site/app/root.tsx similarity index 100% rename from tests/e2e/fixtures/react-router-v8-middleware/app/root.tsx rename to tests/e2e/fixtures/react-router-edge-site/app/root.tsx diff --git a/tests/e2e/fixtures/react-router-edge-site/app/routes.ts b/tests/e2e/fixtures/react-router-edge-site/app/routes.ts new file mode 100644 index 000000000..03e0351cd --- /dev/null +++ b/tests/e2e/fixtures/react-router-edge-site/app/routes.ts @@ -0,0 +1,13 @@ +import { type RouteConfig, index, route } from '@react-router/dev/routes' + +export default [ + index('routes/home.tsx'), + route('about', 'routes/about.tsx'), + route('blobs', 'routes/blobs.tsx'), + route('cacheable', 'routes/cacheable.tsx'), + route('context', 'routes/context.tsx'), + route('headers', 'routes/headers.tsx'), + route('images', 'routes/images.tsx'), + route('middleware-header', 'routes/middleware-header.tsx'), + route('prerendered', 'routes/prerendered.tsx'), +] satisfies RouteConfig diff --git a/tests/e2e/fixtures/react-router-edge-site/app/routes/about.tsx b/tests/e2e/fixtures/react-router-edge-site/app/routes/about.tsx new file mode 100644 index 000000000..f71c0bf6e --- /dev/null +++ b/tests/e2e/fixtures/react-router-edge-site/app/routes/about.tsx @@ -0,0 +1,22 @@ +import { Await, useLoaderData } from 'react-router' +import { Suspense } from 'react' + +export async function loader() { + const messagePromise = new Promise((resolve) => { + setTimeout(() => { + resolve('This is an about page streamed from the server.') + }, 2000) + }) + return { message: messagePromise } +} +export default function About() { + const { message } = useLoaderData() + return ( +
+

About

+ + {(message) =>

{message}

}
+
+
+ ) +} diff --git a/tests/e2e/fixtures/react-router-edge-site/app/routes/blobs.tsx b/tests/e2e/fixtures/react-router-edge-site/app/routes/blobs.tsx new file mode 100644 index 000000000..92c8fee41 --- /dev/null +++ b/tests/e2e/fixtures/react-router-edge-site/app/routes/blobs.tsx @@ -0,0 +1,19 @@ +import { useLoaderData } from 'react-router' +import { getStore } from '@netlify/blobs' + +export async function loader() { + const store = getStore({ name: 'favorites', consistency: 'strong' }) + await store.set('cereal', 'Raisin Bran') + const favCereal = await store.get('cereal') + return { favCereal } +} + +export default function BlobsDemo() { + const { favCereal } = useLoaderData() + return ( +
+

Netlify Blobs demo page

+

My favorite breakfast cereal is {favCereal}

+
+ ) +} diff --git a/tests/e2e/fixtures/react-router-edge-site/app/routes/cacheable.tsx b/tests/e2e/fixtures/react-router-edge-site/app/routes/cacheable.tsx new file mode 100644 index 000000000..adacef87d --- /dev/null +++ b/tests/e2e/fixtures/react-router-edge-site/app/routes/cacheable.tsx @@ -0,0 +1,28 @@ +import { type HeadersFunction, data, useLoaderData } from 'react-router' + +export const loader = () => { + return data( + { + message: `Response generated at ${new Date().toISOString()}`, + }, + { + headers: { + 'CDN-Cache-Control': 'public, max-age=60', + }, + }, + ) +} + +export const headers: HeadersFunction = ({ loaderHeaders }) => { + return loaderHeaders +} + +export default function SWRDemo() { + const { message } = useLoaderData() + return ( +
+

Cacheable

+

{message}

+
+ ) +} diff --git a/tests/e2e/fixtures/react-router-edge-site/app/routes/context.tsx b/tests/e2e/fixtures/react-router-edge-site/app/routes/context.tsx new file mode 100644 index 000000000..f357e1f3a --- /dev/null +++ b/tests/e2e/fixtures/react-router-edge-site/app/routes/context.tsx @@ -0,0 +1,12 @@ +import { useLoaderData } from 'react-router' +import type { Route } from './+types/context' + +export async function loader({ context }: Route.LoaderArgs) { + return { + siteName: context.site?.name, + } +} +export default function About() { + const { siteName } = useLoaderData() + return
This site name is {siteName}
+} diff --git a/tests/e2e/fixtures/react-router-edge-site/app/routes/headers.tsx b/tests/e2e/fixtures/react-router-edge-site/app/routes/headers.tsx new file mode 100644 index 000000000..41dd6379b --- /dev/null +++ b/tests/e2e/fixtures/react-router-edge-site/app/routes/headers.tsx @@ -0,0 +1,28 @@ +import { type HeadersFunction, data, useLoaderData } from 'react-router' + +export const loader = () => { + return data( + { + message: 'Loader for this page is passing caching headers', + }, + { + headers: { + 'Cache-Control': 'public, max-age=3600', + }, + }, + ) +} + +export const headers: HeadersFunction = ({ loaderHeaders }) => { + return loaderHeaders +} + +export default function HeadersDemo() { + const { message } = useLoaderData() + return ( +
+

Headers

+

{message}

+
+ ) +} diff --git a/tests/e2e/fixtures/react-router-edge-site/app/routes/home.tsx b/tests/e2e/fixtures/react-router-edge-site/app/routes/home.tsx new file mode 100644 index 000000000..e6a266368 --- /dev/null +++ b/tests/e2e/fixtures/react-router-edge-site/app/routes/home.tsx @@ -0,0 +1,10 @@ +import type { Route } from './+types/home' +import { Welcome } from '../welcome/welcome' + +export function meta({}: Route.MetaArgs) { + return [{ title: 'New React Router App' }, { name: 'description', content: 'Welcome to React Router!' }] +} + +export default function Home() { + return +} diff --git a/tests/e2e/fixtures/react-router-edge-site/app/routes/images.tsx b/tests/e2e/fixtures/react-router-edge-site/app/routes/images.tsx new file mode 100644 index 000000000..15507e3bf --- /dev/null +++ b/tests/e2e/fixtures/react-router-edge-site/app/routes/images.tsx @@ -0,0 +1,8 @@ +export default function ImagesDemo() { + return ( +
+

Netlify Image CDN demo page

+ A camel +
+ ) +} diff --git a/tests/e2e/fixtures/react-router-edge-site/app/routes/middleware-header.tsx b/tests/e2e/fixtures/react-router-edge-site/app/routes/middleware-header.tsx new file mode 100644 index 000000000..69bb553cf --- /dev/null +++ b/tests/e2e/fixtures/react-router-edge-site/app/routes/middleware-header.tsx @@ -0,0 +1,7 @@ +export default function MiddlewareHeader() { + return ( +
+

Response header added by Edge Middleware

+
+ ) +} diff --git a/tests/e2e/fixtures/react-router-edge-site/app/routes/prerendered.tsx b/tests/e2e/fixtures/react-router-edge-site/app/routes/prerendered.tsx new file mode 100644 index 000000000..ff3ff331f --- /dev/null +++ b/tests/e2e/fixtures/react-router-edge-site/app/routes/prerendered.tsx @@ -0,0 +1,14 @@ +import type { Route } from './+types/prerendered' + +export function meta({}: Route.MetaArgs) { + return [{ title: 'Prerendered Page' }, { name: 'description', content: 'This page is prerendered at build time' }] +} + +export default function Prerendered() { + return ( +
+

Prerendered Page

+

This page was prerendered at build time and served from the CDN.

+
+ ) +} diff --git a/tests/e2e/fixtures/react-router-edge-site/app/welcome/logo-dark.svg b/tests/e2e/fixtures/react-router-edge-site/app/welcome/logo-dark.svg new file mode 100644 index 000000000..dd8202894 --- /dev/null +++ b/tests/e2e/fixtures/react-router-edge-site/app/welcome/logo-dark.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/e2e/fixtures/react-router-edge-site/app/welcome/logo-light.svg b/tests/e2e/fixtures/react-router-edge-site/app/welcome/logo-light.svg new file mode 100644 index 000000000..73284929d --- /dev/null +++ b/tests/e2e/fixtures/react-router-edge-site/app/welcome/logo-light.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/e2e/fixtures/react-router-edge-site/app/welcome/welcome.tsx b/tests/e2e/fixtures/react-router-edge-site/app/welcome/welcome.tsx new file mode 100644 index 000000000..b041ee556 --- /dev/null +++ b/tests/e2e/fixtures/react-router-edge-site/app/welcome/welcome.tsx @@ -0,0 +1,80 @@ +import logoDark from './logo-dark.svg' +import logoLight from './logo-light.svg' + +export function Welcome() { + return ( +
+

Welcome to React Router

+
+
+
+ React Router + React Router +
+
+
+ +
+
+
+ ) +} + +const resources = [ + { + href: 'https://reactrouter.com/docs', + text: 'React Router Docs', + icon: ( + + + + ), + }, + { + href: 'https://rmx.as/discord', + text: 'Join Discord', + icon: ( + + + + ), + }, +] diff --git a/tests/e2e/fixtures/react-router-edge-site/netlify.toml b/tests/e2e/fixtures/react-router-edge-site/netlify.toml new file mode 100644 index 000000000..3b400c4fe --- /dev/null +++ b/tests/e2e/fixtures/react-router-edge-site/netlify.toml @@ -0,0 +1,6 @@ +[build] +command = "react-router build" +publish = "build/client" + +[dev] +command = "react-router dev" diff --git a/tests/e2e/fixtures/react-router-edge-site/netlify/edge-functions/middleware-header.ts b/tests/e2e/fixtures/react-router-edge-site/netlify/edge-functions/middleware-header.ts new file mode 100644 index 000000000..50731f2b0 --- /dev/null +++ b/tests/e2e/fixtures/react-router-edge-site/netlify/edge-functions/middleware-header.ts @@ -0,0 +1,14 @@ +import type { Config, Context } from '@netlify/edge-functions' + +const handler = async (_request: Request, context: Context): Promise => { + const originResponse = await context.next() + + originResponse.headers.set('Foo', 'bar') + return originResponse +} + +export default handler + +export const config: Config = { + path: '/middleware-header', +} diff --git a/tests/e2e/fixtures/react-router-edge-site/netlify/edge-functions/pong.ts b/tests/e2e/fixtures/react-router-edge-site/netlify/edge-functions/pong.ts new file mode 100644 index 000000000..42b62e556 --- /dev/null +++ b/tests/e2e/fixtures/react-router-edge-site/netlify/edge-functions/pong.ts @@ -0,0 +1,11 @@ +import type { Config } from '@netlify/edge-functions' + +const handler = async (): Promise => { + return new Response('Pong!') +} + +export default handler + +export const config: Config = { + path: '/ping', +} diff --git a/tests/e2e/fixtures/react-router-edge-site/netlify/functions/blorble.ts b/tests/e2e/fixtures/react-router-edge-site/netlify/functions/blorble.ts new file mode 100644 index 000000000..5bf16db5a --- /dev/null +++ b/tests/e2e/fixtures/react-router-edge-site/netlify/functions/blorble.ts @@ -0,0 +1,11 @@ +import type { Config } from '@netlify/functions' + +const handler = async (): Promise => { + return new Response('gurble') +} + +export default handler + +export const config: Config = { + path: '/please-blorble', +} diff --git a/tests/e2e/fixtures/react-router-edge-site/package.json b/tests/e2e/fixtures/react-router-edge-site/package.json new file mode 100644 index 000000000..1ece61cc5 --- /dev/null +++ b/tests/e2e/fixtures/react-router-edge-site/package.json @@ -0,0 +1,34 @@ +{ + "name": "react-router-edge-site", + "private": true, + "type": "module", + "scripts": { + "build": "react-router build", + "dev": "react-router dev", + "start": "react-router-serve ./build/server/index.js", + "typecheck": "react-router typegen && tsc" + }, + "dependencies": { + "@netlify/blobs": "^8.2.0", + "@react-router/node": "^7.9.4", + "@react-router/serve": "^7.9.4", + "isbot": "^5.1.17", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-router": "^7.9.4" + }, + "devDependencies": { + "@netlify/functions": "^3.1.9", + "@netlify/vite-plugin-react-router": "*", + "@react-router/dev": "^7.9.4", + "@types/node": "^20", + "@types/react": "^18.3.12", + "@types/react-dom": "^18.3.1", + "autoprefixer": "^10.4.20", + "postcss": "^8.4.49", + "tailwindcss": "^3.4.15", + "typescript": "^5.6.3", + "vite": "^6.2.5", + "vite-tsconfig-paths": "^5.1.4" + } +} diff --git a/tests/e2e/fixtures/react-router-edge-site/public/camel.jpg b/tests/e2e/fixtures/react-router-edge-site/public/camel.jpg new file mode 100644 index 000000000..62b82e5c3 Binary files /dev/null and b/tests/e2e/fixtures/react-router-edge-site/public/camel.jpg differ diff --git a/tests/e2e/fixtures/react-router-v8-middleware/public/favicon.ico b/tests/e2e/fixtures/react-router-edge-site/public/favicon.ico similarity index 100% rename from tests/e2e/fixtures/react-router-v8-middleware/public/favicon.ico rename to tests/e2e/fixtures/react-router-edge-site/public/favicon.ico diff --git a/tests/e2e/fixtures/react-router-edge-site/react-router.config.ts b/tests/e2e/fixtures/react-router-edge-site/react-router.config.ts new file mode 100644 index 000000000..23bad8817 --- /dev/null +++ b/tests/e2e/fixtures/react-router-edge-site/react-router.config.ts @@ -0,0 +1,10 @@ +import type { Config } from '@react-router/dev/config' + +export default { + // Config options... + // Server-side render by default, to enable SPA mode set this to `false` + ssr: true, + // TODO(serhalp) Revisit this if RR team changes their minds: + // https://github.com/remix-run/react-router/issues/13226#issuecomment-2776672461. + // prerender: ['/prerendered'], +} satisfies Config diff --git a/tests/e2e/fixtures/react-router-v8-middleware/tailwind.config.ts b/tests/e2e/fixtures/react-router-edge-site/tailwind.config.ts similarity index 100% rename from tests/e2e/fixtures/react-router-v8-middleware/tailwind.config.ts rename to tests/e2e/fixtures/react-router-edge-site/tailwind.config.ts diff --git a/tests/e2e/fixtures/react-router-v8-middleware/tsconfig.json b/tests/e2e/fixtures/react-router-edge-site/tsconfig.json similarity index 100% rename from tests/e2e/fixtures/react-router-v8-middleware/tsconfig.json rename to tests/e2e/fixtures/react-router-edge-site/tsconfig.json diff --git a/tests/e2e/fixtures/react-router-edge-site/vite.config.ts b/tests/e2e/fixtures/react-router-edge-site/vite.config.ts new file mode 100644 index 000000000..bfaf89d78 --- /dev/null +++ b/tests/e2e/fixtures/react-router-edge-site/vite.config.ts @@ -0,0 +1,22 @@ +import { reactRouter } from '@react-router/dev/vite' +import autoprefixer from 'autoprefixer' +import tailwindcss from 'tailwindcss' +import { defineConfig } from 'vite' +import tsconfigPaths from 'vite-tsconfig-paths' +import netlifyPlugin from '@netlify/vite-plugin-react-router' + +export default defineConfig({ + css: { + postcss: { + plugins: [tailwindcss, autoprefixer], + }, + }, + plugins: [ + reactRouter(), + netlifyPlugin({ + edge: true, + excludedPaths: ['/please-blorble'], + }), + tsconfigPaths(), + ], +}) diff --git a/tests/e2e/fixtures/react-router-edge-v8-middleware/app/app.css b/tests/e2e/fixtures/react-router-edge-v8-middleware/app/app.css new file mode 100644 index 000000000..303fe158f --- /dev/null +++ b/tests/e2e/fixtures/react-router-edge-v8-middleware/app/app.css @@ -0,0 +1,12 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +html, +body { + @apply bg-white dark:bg-gray-950; + + @media (prefers-color-scheme: dark) { + color-scheme: dark; + } +} diff --git a/tests/e2e/fixtures/react-router-edge-v8-middleware/app/entry.server.tsx b/tests/e2e/fixtures/react-router-edge-v8-middleware/app/entry.server.tsx new file mode 100644 index 000000000..cec760ad4 --- /dev/null +++ b/tests/e2e/fixtures/react-router-edge-v8-middleware/app/entry.server.tsx @@ -0,0 +1,40 @@ +import type { AppLoadContext, EntryContext } from 'react-router' +import { ServerRouter } from 'react-router' +import { isbot } from 'isbot' +import { renderToReadableStream } from 'react-dom/server' + +export default async function handleRequest( + request: Request, + responseStatusCode: number, + responseHeaders: Headers, + routerContext: EntryContext, + _loadContext: AppLoadContext, +) { + let shellRendered = false + const userAgent = request.headers.get('user-agent') + + const body = await renderToReadableStream(, { + onError(error: unknown) { + responseStatusCode = 500 + // Log streaming rendering errors from inside the shell. Don't log + // errors encountered during initial shell rendering since they'll + // reject and get logged in handleDocumentRequest. + if (shellRendered) { + console.error(error) + } + }, + }) + shellRendered = true + + // Ensure requests from bots and SPA Mode renders wait for all content to load before responding + // https://react.dev/reference/react-dom/server/renderToPipeableStream#waiting-for-all-content-to-load-for-crawlers-and-static-generation + if ((userAgent && isbot(userAgent)) || routerContext.isSpaMode) { + await body.allReady + } + + responseHeaders.set('Content-Type', 'text/html') + return new Response(body, { + headers: responseHeaders, + status: responseStatusCode, + }) +} diff --git a/tests/e2e/fixtures/react-router-edge-v8-middleware/app/root.tsx b/tests/e2e/fixtures/react-router-edge-v8-middleware/app/root.tsx new file mode 100644 index 000000000..f661df484 --- /dev/null +++ b/tests/e2e/fixtures/react-router-edge-v8-middleware/app/root.tsx @@ -0,0 +1,66 @@ +import { isRouteErrorResponse, Links, Meta, Outlet, Scripts, ScrollRestoration } from 'react-router' + +import type { Route } from './+types/root' +import stylesheet from './app.css?url' + +export const links: Route.LinksFunction = () => [ + { rel: 'preconnect', href: 'https://fonts.googleapis.com' }, + { + rel: 'preconnect', + href: 'https://fonts.gstatic.com', + crossOrigin: 'anonymous', + }, + { + rel: 'stylesheet', + href: 'https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&display=swap', + }, + { rel: 'stylesheet', href: stylesheet }, +] + +export function Layout({ children }: { children: React.ReactNode }) { + return ( + + + + + + + + + {children} + + + + + ) +} + +export default function App() { + return +} + +export function ErrorBoundary({ error }: Route.ErrorBoundaryProps) { + let message = 'Oops!' + let details = 'An unexpected error occurred.' + let stack: string | undefined + + if (isRouteErrorResponse(error)) { + message = error.status === 404 ? '404' : 'Error' + details = error.status === 404 ? 'The requested page could not be found.' : error.statusText || details + } else if (import.meta.env.DEV && error && error instanceof Error) { + details = error.message + stack = error.stack + } + + return ( +
+

{message}

+

{details}

+ {stack && ( +
+          {stack}
+        
+ )} +
+ ) +} diff --git a/tests/e2e/fixtures/react-router-v8-middleware/app/routes.ts b/tests/e2e/fixtures/react-router-edge-v8-middleware/app/routes.ts similarity index 100% rename from tests/e2e/fixtures/react-router-v8-middleware/app/routes.ts rename to tests/e2e/fixtures/react-router-edge-v8-middleware/app/routes.ts diff --git a/tests/e2e/fixtures/react-router-edge-v8-middleware/app/routes/context.tsx b/tests/e2e/fixtures/react-router-edge-v8-middleware/app/routes/context.tsx new file mode 100644 index 000000000..b1cd783bc --- /dev/null +++ b/tests/e2e/fixtures/react-router-edge-v8-middleware/app/routes/context.tsx @@ -0,0 +1,14 @@ +import { netlifyRouterContext } from '@netlify/vite-plugin-react-router/edge' +import { useLoaderData } from 'react-router' + +import type { Route } from './+types/context' + +export async function loader({ context }: Route.LoaderArgs) { + return { + siteName: context.get(netlifyRouterContext).site.name, + } +} +export default function About() { + const { siteName } = useLoaderData() + return
This site name is {siteName}
+} diff --git a/tests/e2e/fixtures/react-router-v8-middleware/app/routes/home.tsx b/tests/e2e/fixtures/react-router-edge-v8-middleware/app/routes/home.tsx similarity index 100% rename from tests/e2e/fixtures/react-router-v8-middleware/app/routes/home.tsx rename to tests/e2e/fixtures/react-router-edge-v8-middleware/app/routes/home.tsx diff --git a/tests/e2e/fixtures/react-router-edge-v8-middleware/app/routes/middleware.tsx b/tests/e2e/fixtures/react-router-edge-v8-middleware/app/routes/middleware.tsx new file mode 100644 index 000000000..c61060fe9 --- /dev/null +++ b/tests/e2e/fixtures/react-router-edge-v8-middleware/app/routes/middleware.tsx @@ -0,0 +1,17 @@ +import { netlifyRouterContext } from '@netlify/vite-plugin-react-router/edge' + +import type { Route } from './+types/middleware' + +const logMiddleware: Route.MiddlewareFunction = async ({ request, context }, next) => { + const siteName = context.get(netlifyRouterContext).site.name + console.log(`Handling ${request.method} request to ${request.url} on ${siteName}`) + const response = await next() + response.headers.set('x-test-site-name', siteName) + return response +} + +export const middleware: Route.MiddlewareFunction[] = [logMiddleware] + +export default function Home() { + return

Middleware

+} diff --git a/tests/e2e/fixtures/react-router-v8-middleware/netlify.toml b/tests/e2e/fixtures/react-router-edge-v8-middleware/netlify.toml similarity index 100% rename from tests/e2e/fixtures/react-router-v8-middleware/netlify.toml rename to tests/e2e/fixtures/react-router-edge-v8-middleware/netlify.toml diff --git a/tests/e2e/fixtures/react-router-v8-middleware/package.json b/tests/e2e/fixtures/react-router-edge-v8-middleware/package.json similarity index 100% rename from tests/e2e/fixtures/react-router-v8-middleware/package.json rename to tests/e2e/fixtures/react-router-edge-v8-middleware/package.json diff --git a/tests/e2e/fixtures/react-router-edge-v8-middleware/public/favicon.ico b/tests/e2e/fixtures/react-router-edge-v8-middleware/public/favicon.ico new file mode 100644 index 000000000..5dbdfcddc Binary files /dev/null and b/tests/e2e/fixtures/react-router-edge-v8-middleware/public/favicon.ico differ diff --git a/tests/e2e/fixtures/react-router-v8-middleware/react-router.config.ts b/tests/e2e/fixtures/react-router-edge-v8-middleware/react-router.config.ts similarity index 100% rename from tests/e2e/fixtures/react-router-v8-middleware/react-router.config.ts rename to tests/e2e/fixtures/react-router-edge-v8-middleware/react-router.config.ts diff --git a/tests/e2e/fixtures/react-router-edge-v8-middleware/tailwind.config.ts b/tests/e2e/fixtures/react-router-edge-v8-middleware/tailwind.config.ts new file mode 100644 index 000000000..2e66b027a --- /dev/null +++ b/tests/e2e/fixtures/react-router-edge-v8-middleware/tailwind.config.ts @@ -0,0 +1,22 @@ +import type { Config } from 'tailwindcss' + +export default { + content: ['./app/**/{**,.client,.server}/**/*.{js,jsx,ts,tsx}'], + theme: { + extend: { + fontFamily: { + sans: [ + '"Inter"', + 'ui-sans-serif', + 'system-ui', + 'sans-serif', + '"Apple Color Emoji"', + '"Segoe UI Emoji"', + '"Segoe UI Symbol"', + '"Noto Color Emoji"', + ], + }, + }, + }, + plugins: [], +} satisfies Config diff --git a/tests/e2e/fixtures/react-router-edge-v8-middleware/tsconfig.json b/tests/e2e/fixtures/react-router-edge-v8-middleware/tsconfig.json new file mode 100644 index 000000000..a6b90b7c8 --- /dev/null +++ b/tests/e2e/fixtures/react-router-edge-v8-middleware/tsconfig.json @@ -0,0 +1,22 @@ +{ + "include": ["**/*", "**/.server/**/*", "**/.client/**/*", ".react-router/types/**/*"], + "compilerOptions": { + "lib": ["DOM", "DOM.Iterable", "ES2022"], + "types": ["node", "vite/client"], + "target": "ES2022", + "module": "ES2022", + "moduleResolution": "bundler", + "jsx": "react-jsx", + "rootDirs": [".", "./.react-router/types"], + "baseUrl": ".", + "paths": { + "~/*": ["./app/*"] + }, + "esModuleInterop": true, + "verbatimModuleSyntax": true, + "noEmit": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "strict": true + } +} diff --git a/tests/e2e/fixtures/react-router-edge-v8-middleware/vite.config.ts b/tests/e2e/fixtures/react-router-edge-v8-middleware/vite.config.ts new file mode 100644 index 000000000..63217ec41 --- /dev/null +++ b/tests/e2e/fixtures/react-router-edge-v8-middleware/vite.config.ts @@ -0,0 +1,15 @@ +import { reactRouter } from '@react-router/dev/vite' +import autoprefixer from 'autoprefixer' +import tailwindcss from 'tailwindcss' +import { defineConfig } from 'vite' +import tsconfigPaths from 'vite-tsconfig-paths' +import netlifyPlugin from '@netlify/vite-plugin-react-router' + +export default defineConfig({ + css: { + postcss: { + plugins: [tailwindcss, autoprefixer], + }, + }, + plugins: [reactRouter(), netlifyPlugin({ edge: true }), tsconfigPaths()], +}) diff --git a/tests/e2e/fixtures/react-router-serverless-site/app/routes.ts b/tests/e2e/fixtures/react-router-serverless-site/app/routes.ts index 9ea12dfee..03e0351cd 100644 --- a/tests/e2e/fixtures/react-router-serverless-site/app/routes.ts +++ b/tests/e2e/fixtures/react-router-serverless-site/app/routes.ts @@ -9,4 +9,5 @@ export default [ route('headers', 'routes/headers.tsx'), route('images', 'routes/images.tsx'), route('middleware-header', 'routes/middleware-header.tsx'), + route('prerendered', 'routes/prerendered.tsx'), ] satisfies RouteConfig diff --git a/tests/e2e/fixtures/react-router-serverless-site/app/routes/prerendered.tsx b/tests/e2e/fixtures/react-router-serverless-site/app/routes/prerendered.tsx new file mode 100644 index 000000000..ff3ff331f --- /dev/null +++ b/tests/e2e/fixtures/react-router-serverless-site/app/routes/prerendered.tsx @@ -0,0 +1,14 @@ +import type { Route } from './+types/prerendered' + +export function meta({}: Route.MetaArgs) { + return [{ title: 'Prerendered Page' }, { name: 'description', content: 'This page is prerendered at build time' }] +} + +export default function Prerendered() { + return ( +
+

Prerendered Page

+

This page was prerendered at build time and served from the CDN.

+
+ ) +} diff --git a/tests/e2e/fixtures/react-router-serverless-site/react-router.config.ts b/tests/e2e/fixtures/react-router-serverless-site/react-router.config.ts index d5306db85..23bad8817 100644 --- a/tests/e2e/fixtures/react-router-serverless-site/react-router.config.ts +++ b/tests/e2e/fixtures/react-router-serverless-site/react-router.config.ts @@ -4,4 +4,7 @@ export default { // Config options... // Server-side render by default, to enable SPA mode set this to `false` ssr: true, + // TODO(serhalp) Revisit this if RR team changes their minds: + // https://github.com/remix-run/react-router/issues/13226#issuecomment-2776672461. + // prerender: ['/prerendered'], } satisfies Config diff --git a/tests/e2e/fixtures/react-router-serverless-v8-middleware/app/app.css b/tests/e2e/fixtures/react-router-serverless-v8-middleware/app/app.css new file mode 100644 index 000000000..303fe158f --- /dev/null +++ b/tests/e2e/fixtures/react-router-serverless-v8-middleware/app/app.css @@ -0,0 +1,12 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +html, +body { + @apply bg-white dark:bg-gray-950; + + @media (prefers-color-scheme: dark) { + color-scheme: dark; + } +} diff --git a/tests/e2e/fixtures/react-router-serverless-v8-middleware/app/root.tsx b/tests/e2e/fixtures/react-router-serverless-v8-middleware/app/root.tsx new file mode 100644 index 000000000..f661df484 --- /dev/null +++ b/tests/e2e/fixtures/react-router-serverless-v8-middleware/app/root.tsx @@ -0,0 +1,66 @@ +import { isRouteErrorResponse, Links, Meta, Outlet, Scripts, ScrollRestoration } from 'react-router' + +import type { Route } from './+types/root' +import stylesheet from './app.css?url' + +export const links: Route.LinksFunction = () => [ + { rel: 'preconnect', href: 'https://fonts.googleapis.com' }, + { + rel: 'preconnect', + href: 'https://fonts.gstatic.com', + crossOrigin: 'anonymous', + }, + { + rel: 'stylesheet', + href: 'https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&display=swap', + }, + { rel: 'stylesheet', href: stylesheet }, +] + +export function Layout({ children }: { children: React.ReactNode }) { + return ( + + + + + + + + + {children} + + + + + ) +} + +export default function App() { + return +} + +export function ErrorBoundary({ error }: Route.ErrorBoundaryProps) { + let message = 'Oops!' + let details = 'An unexpected error occurred.' + let stack: string | undefined + + if (isRouteErrorResponse(error)) { + message = error.status === 404 ? '404' : 'Error' + details = error.status === 404 ? 'The requested page could not be found.' : error.statusText || details + } else if (import.meta.env.DEV && error && error instanceof Error) { + details = error.message + stack = error.stack + } + + return ( +
+

{message}

+

{details}

+ {stack && ( +
+          {stack}
+        
+ )} +
+ ) +} diff --git a/tests/e2e/fixtures/react-router-serverless-v8-middleware/app/routes.ts b/tests/e2e/fixtures/react-router-serverless-v8-middleware/app/routes.ts new file mode 100644 index 000000000..61cc2967c --- /dev/null +++ b/tests/e2e/fixtures/react-router-serverless-v8-middleware/app/routes.ts @@ -0,0 +1,7 @@ +import { type RouteConfig, index, route } from '@react-router/dev/routes' + +export default [ + index('routes/home.tsx'), + route('context', 'routes/context.tsx'), + route('middleware', 'routes/middleware.tsx'), +] satisfies RouteConfig diff --git a/tests/e2e/fixtures/react-router-v8-middleware/app/routes/context.tsx b/tests/e2e/fixtures/react-router-serverless-v8-middleware/app/routes/context.tsx similarity index 100% rename from tests/e2e/fixtures/react-router-v8-middleware/app/routes/context.tsx rename to tests/e2e/fixtures/react-router-serverless-v8-middleware/app/routes/context.tsx diff --git a/tests/e2e/fixtures/react-router-serverless-v8-middleware/app/routes/home.tsx b/tests/e2e/fixtures/react-router-serverless-v8-middleware/app/routes/home.tsx new file mode 100644 index 000000000..7062a8a97 --- /dev/null +++ b/tests/e2e/fixtures/react-router-serverless-v8-middleware/app/routes/home.tsx @@ -0,0 +1,9 @@ +import type { Route } from './+types/home' + +export function meta({}: Route.MetaArgs) { + return [{ title: 'New React Router App' }, { name: 'description', content: 'Welcome to React Router!' }] +} + +export default function Home() { + return

Home

+} diff --git a/tests/e2e/fixtures/react-router-v8-middleware/app/routes/middleware.tsx b/tests/e2e/fixtures/react-router-serverless-v8-middleware/app/routes/middleware.tsx similarity index 100% rename from tests/e2e/fixtures/react-router-v8-middleware/app/routes/middleware.tsx rename to tests/e2e/fixtures/react-router-serverless-v8-middleware/app/routes/middleware.tsx diff --git a/tests/e2e/fixtures/react-router-serverless-v8-middleware/netlify.toml b/tests/e2e/fixtures/react-router-serverless-v8-middleware/netlify.toml new file mode 100644 index 000000000..d63d1d62c --- /dev/null +++ b/tests/e2e/fixtures/react-router-serverless-v8-middleware/netlify.toml @@ -0,0 +1,6 @@ +[build] + command = "react-router build" + publish = "build/client" + +[dev] + command = "react-router dev" diff --git a/tests/e2e/fixtures/react-router-serverless-v8-middleware/package.json b/tests/e2e/fixtures/react-router-serverless-v8-middleware/package.json new file mode 100644 index 000000000..41c7b5dcc --- /dev/null +++ b/tests/e2e/fixtures/react-router-serverless-v8-middleware/package.json @@ -0,0 +1,34 @@ +{ + "name": "react-router-serverless-v8-middleware", + "private": true, + "type": "module", + "scripts": { + "build": "react-router build", + "dev": "react-router dev", + "start": "react-router-serve ./build/server/index.js", + "typecheck": "react-router typegen && tsc" + }, + "dependencies": { + "@netlify/blobs": "^8.2.0", + "@react-router/node": "^7.9.4", + "@react-router/serve": "^7.9.4", + "isbot": "^5.1.17", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-router": "^7.9.4" + }, + "devDependencies": { + "@netlify/functions": "^3.1.9", + "@netlify/vite-plugin-react-router": "*", + "@react-router/dev": "^7.9.4", + "@types/node": "^20", + "@types/react": "^18.3.12", + "@types/react-dom": "^18.3.1", + "autoprefixer": "^10.4.20", + "postcss": "^8.4.49", + "tailwindcss": "^3.4.15", + "typescript": "^5.6.3", + "vite": "^6.2.5", + "vite-tsconfig-paths": "^5.1.4" + } +} diff --git a/tests/e2e/fixtures/react-router-serverless-v8-middleware/public/favicon.ico b/tests/e2e/fixtures/react-router-serverless-v8-middleware/public/favicon.ico new file mode 100644 index 000000000..5dbdfcddc Binary files /dev/null and b/tests/e2e/fixtures/react-router-serverless-v8-middleware/public/favicon.ico differ diff --git a/tests/e2e/fixtures/react-router-serverless-v8-middleware/react-router.config.ts b/tests/e2e/fixtures/react-router-serverless-v8-middleware/react-router.config.ts new file mode 100644 index 000000000..cf5e289af --- /dev/null +++ b/tests/e2e/fixtures/react-router-serverless-v8-middleware/react-router.config.ts @@ -0,0 +1,10 @@ +import type { Config } from '@react-router/dev/config' + +export default { + // Config options... + // Server-side render by default, to enable SPA mode set this to `false` + ssr: true, + future: { + v8_middleware: true, + }, +} satisfies Config diff --git a/tests/e2e/fixtures/react-router-serverless-v8-middleware/tailwind.config.ts b/tests/e2e/fixtures/react-router-serverless-v8-middleware/tailwind.config.ts new file mode 100644 index 000000000..2e66b027a --- /dev/null +++ b/tests/e2e/fixtures/react-router-serverless-v8-middleware/tailwind.config.ts @@ -0,0 +1,22 @@ +import type { Config } from 'tailwindcss' + +export default { + content: ['./app/**/{**,.client,.server}/**/*.{js,jsx,ts,tsx}'], + theme: { + extend: { + fontFamily: { + sans: [ + '"Inter"', + 'ui-sans-serif', + 'system-ui', + 'sans-serif', + '"Apple Color Emoji"', + '"Segoe UI Emoji"', + '"Segoe UI Symbol"', + '"Noto Color Emoji"', + ], + }, + }, + }, + plugins: [], +} satisfies Config diff --git a/tests/e2e/fixtures/react-router-serverless-v8-middleware/tsconfig.json b/tests/e2e/fixtures/react-router-serverless-v8-middleware/tsconfig.json new file mode 100644 index 000000000..a6b90b7c8 --- /dev/null +++ b/tests/e2e/fixtures/react-router-serverless-v8-middleware/tsconfig.json @@ -0,0 +1,22 @@ +{ + "include": ["**/*", "**/.server/**/*", "**/.client/**/*", ".react-router/types/**/*"], + "compilerOptions": { + "lib": ["DOM", "DOM.Iterable", "ES2022"], + "types": ["node", "vite/client"], + "target": "ES2022", + "module": "ES2022", + "moduleResolution": "bundler", + "jsx": "react-jsx", + "rootDirs": [".", "./.react-router/types"], + "baseUrl": ".", + "paths": { + "~/*": ["./app/*"] + }, + "esModuleInterop": true, + "verbatimModuleSyntax": true, + "noEmit": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "strict": true + } +} diff --git a/tests/e2e/fixtures/react-router-v8-middleware/vite.config.ts b/tests/e2e/fixtures/react-router-serverless-v8-middleware/vite.config.ts similarity index 100% rename from tests/e2e/fixtures/react-router-v8-middleware/vite.config.ts rename to tests/e2e/fixtures/react-router-serverless-v8-middleware/vite.config.ts diff --git a/tests/e2e/react-router-user-journeys.spec.ts b/tests/e2e/react-router-user-journeys.spec.ts index af91ecb35..5cfac7c2c 100644 --- a/tests/e2e/react-router-user-journeys.spec.ts +++ b/tests/e2e/react-router-user-journeys.spec.ts @@ -1,6 +1,7 @@ import { expect, test } from './support/fixtures' const CACHE_STORE_DELAY_BUFFER_MS = 5000 +const CACHE_STATUS_SERVED_FROM_EDGE = /^"Netlify Edge"; [a-z=]+$/ test.describe('React Router user journeys', () => { test.describe('origin SSR', () => { @@ -17,6 +18,33 @@ test.describe('React Router user journeys', () => { await expect(page.getByRole('heading', { name: /404/ })).toBeVisible() }) + test('serves a response from the CDN (without compute) for a client asset', async ({ + page, + reactRouterServerlessSite, + }) => { + await page.goto(reactRouterServerlessSite.url) + const logoImg = page.locator('img[src*="logo-dark"]').first() + const src = await logoImg.getAttribute('src') + expect(src).toBeTruthy() + + const logoUrl = new URL(src!, reactRouterServerlessSite.url).toString() + const response = await page.goto(logoUrl) + expect(response?.status()).toBe(200) + expect(response?.headers()['cache-status']).toMatch(CACHE_STATUS_SERVED_FROM_EDGE) + }) + + // TODO(serhalp) Revisit this if RR team changes their minds: + // https://github.com/remix-run/react-router/issues/13226#issuecomment-2776672461. + test.skip('serves a response from the CDN (without compute) for a pre-rendered route', async ({ + page, + reactRouterServerlessSite, + }) => { + const response = await page.goto(`${reactRouterServerlessSite.url}/prerendered`) + expect(response?.status()).toBe(200) + await expect(page.getByRole('heading', { name: /Prerendered Page/i })).toBeVisible() + expect(response?.headers()['cache-status']).toMatch(CACHE_STATUS_SERVED_FROM_EDGE) + }) + test('serves a response from a user-defined Netlify Function on a custom path', async ({ page, reactRouterServerlessSite, @@ -76,18 +104,18 @@ test.describe('React Router user journeys', () => { test('can access Netlify Functions context in loader context when opted in to v8 middleware flag', async ({ page, - reactRouterWithV8Middleware, + reactRouterServerlessWithV8Middleware, }) => { - const response = await page.goto(`${reactRouterWithV8Middleware.url}/context`) + const response = await page.goto(`${reactRouterServerlessWithV8Middleware.url}/context`) expect(response?.status()).toBe(200) await expect(page.getByText('This site name is remix-compute-e2e-tests')).toBeVisible() }) test('can access Netlify Functions context in v8 middleware context', async ({ page, - reactRouterWithV8Middleware, + reactRouterServerlessWithV8Middleware, }) => { - const response = await page.goto(`${reactRouterWithV8Middleware.url}/middleware`) + const response = await page.goto(`${reactRouterServerlessWithV8Middleware.url}/middleware`) expect(response?.status()).toBe(200) expect(response?.headers()['x-test-site-name']).toBe('remix-compute-e2e-tests') }) @@ -119,32 +147,71 @@ test.describe('React Router user journeys', () => { }) }) - // TODO(serhalp) Unskip once we've implemented edge support (FRB-1519) - test.describe.skip('edge SSR', () => { - test('serves a response from the edge', async ({ page, edgeSite }) => { - const response = await page.goto(edgeSite.url) + test.describe('edge SSR', () => { + test('serves a response from the edge', async ({ page, reactRouterEdgeSite }) => { + const response = await page.goto(reactRouterEdgeSite.url) expect(response?.status()).toBe(200) - await expect(page.getByRole('heading', { name: /Welcome to Remix/i })).toBeVisible() - expect(response?.headers()['debug-x-nf-edge-functions']).toBe('remix-server') + await expect(page.getByRole('heading', { name: /Welcome to React Router/i })).toBeVisible() + expect(response?.headers()['debug-x-nf-edge-functions']).toBe('react-router-server') }) - test('serves a response from a user-defined Netlify Function on a custom path', async ({ page, edgeSite }) => { - const response = await page.goto(`${edgeSite.url}/please-blorble`) + test('serves a 404 for a request to a URL matching no routes', async ({ page, reactRouterEdgeSite }) => { + const response = await page.goto(`${reactRouterEdgeSite.url}/not-a-real-path`) + expect(response?.status()).toBe(404) + // NOT the Netlify default 404 page - actually served by React Router + await expect(page.getByRole('heading', { name: /404/ })).toBeVisible() + }) + + test('serves a response from the CDN (without compute) for a client asset', async ({ + page, + reactRouterEdgeSite, + }) => { + await page.goto(reactRouterEdgeSite.url) + const logoImg = page.locator('img[src*="logo-dark"]').first() + const src = await logoImg.getAttribute('src') + expect(src).toBeTruthy() + + const logoUrl = new URL(src!, reactRouterEdgeSite.url).toString() + const response = await page.goto(logoUrl) + expect(response?.status()).toBe(200) + expect(response?.headers()['cache-status']).toMatch(CACHE_STATUS_SERVED_FROM_EDGE) + }) + + // TODO(serhalp) Revisit this if RR team changes their minds: + // https://github.com/remix-run/react-router/issues/13226#issuecomment-2776672461. + test.skip('serves a response from the CDN (without compute) for a pre-rendered route', async ({ + page, + reactRouterEdgeSite, + }) => { + const response = await page.goto(`${reactRouterEdgeSite.url}/prerendered`) + expect(response?.status()).toBe(200) + await expect(page.getByRole('heading', { name: /Prerendered Page/i })).toBeVisible() + expect(response?.headers()['cache-status']).toMatch(CACHE_STATUS_SERVED_FROM_EDGE) + }) + + test('serves a response from a user-defined Netlify Function on a custom path', async ({ + page, + reactRouterEdgeSite, + }) => { + const response = await page.goto(`${reactRouterEdgeSite.url}/please-blorble`) expect(response?.status()).toBe(200) await expect(page.getByText('gurble')).toBeVisible() }) - test('serves a response from a user-defined Netlify Edge Function on a custom path', async ({ page, edgeSite }) => { - const response = await page.goto(`${edgeSite.url}/ping`) + test('serves a response from a user-defined Netlify Edge Function on a custom path', async ({ + page, + reactRouterEdgeSite, + }) => { + const response = await page.goto(`${reactRouterEdgeSite.url}/ping`) expect(response?.status()).toBe(200) await expect(page.getByText('Pong!')).toBeVisible() }) test('streams a response from the edge as it is rendered and renders postponed nodes afterward', async ({ page, - edgeSite, + reactRouterEdgeSite, }) => { - const response = await page.goto(`${edgeSite.url}/about`) + const response = await page.goto(`${reactRouterEdgeSite.url}/about`) expect(response?.status()).toBe(200) await expect(page.getByRole('heading', { name: /About/i })).toBeVisible() // This page has an artificial 2s delay on the server @@ -153,20 +220,55 @@ test.describe('React Router user journeys', () => { }) }) - test('can access Netlify Edge Functions context in loader context', async ({ page, edgeSite }) => { - const response = await page.goto(`${edgeSite.url}/context`) + test('can use Netlify Blobs in Remix loaders', async ({ page, reactRouterEdgeSite }) => { + const response = await page.goto(`${reactRouterEdgeSite.url}/blobs`) + expect(response?.status()).toBe(200) + await expect(page.getByRole('heading', { name: /Netlify Blobs/i })).toBeVisible() + await expect(page.getByText('My favorite breakfast cereal is Raisin Bran')).toBeVisible() + }) + + test('can use the Netlify Image CDN with manually constructed URLs', async ({ page, reactRouterEdgeSite }) => { + const response = await page.goto(`${reactRouterEdgeSite.url}/images`) + expect(response?.status()).toBe(200) + await expect(page.getByRole('heading', { name: /Netlify Image CDN/i })).toBeVisible() + await expect(page.getByRole('img')).toBeVisible() + // We've dynamically requested these dimensions from the Image CDN, so this proves that it works + await expect(page.getByRole('img')).toHaveJSProperty('width', 300) + await expect(page.getByRole('img')).toHaveJSProperty('height', 300) + }) + + test('can access Netlify Edge Functions context in loader context', async ({ page, reactRouterEdgeSite }) => { + const response = await page.goto(`${reactRouterEdgeSite.url}/context`) + expect(response?.status()).toBe(200) + await expect(page.getByText('This site name is remix-compute-e2e-tests')).toBeVisible() + }) + + test('can access Netlify Functions context in loader context when opted in to v8 middleware flag', async ({ + page, + reactRouterEdgeWithV8Middleware, + }) => { + const response = await page.goto(`${reactRouterEdgeWithV8Middleware.url}/context`) expect(response?.status()).toBe(200) await expect(page.getByText('This site name is remix-compute-e2e-tests')).toBeVisible() }) - test('response has user-defined Cache-Control header', async ({ page, edgeSite }) => { - const response = await page.goto(`${edgeSite.url}/headers`) + test('can access Netlify Functions context in v8 middleware context', async ({ + page, + reactRouterEdgeWithV8Middleware, + }) => { + const response = await page.goto(`${reactRouterEdgeWithV8Middleware.url}/middleware`) + expect(response?.status()).toBe(200) + expect(response?.headers()['x-test-site-name']).toBe('remix-compute-e2e-tests') + }) + + test('response has user-defined Cache-Control header', async ({ page, reactRouterEdgeSite }) => { + const response = await page.goto(`${reactRouterEdgeSite.url}/headers`) await expect(page.getByRole('heading', { name: /Headers/i })).toBeVisible() expect(response?.headers()['cache-control']).toBe('public,max-age=3600') }) - test('can cache edge function responses on CDN', async ({ page, edgeSite }) => { - const ssrResponse = await page.goto(`${edgeSite.url}/cacheable`) + test('can cache edge function responses on CDN', async ({ page, reactRouterEdgeSite }) => { + const ssrResponse = await page.goto(`${reactRouterEdgeSite.url}/cacheable`) expect(ssrResponse?.status()).toBe(200) expect(ssrResponse?.headers()['cdn-cache-control']).toBe('public, max-age=60') @@ -179,8 +281,8 @@ test.describe('React Router user journeys', () => { expect(cachedResponse?.headers()['debug-x-nf-gen-etag']).toBe(ssrResponse?.headers()['debug-x-nf-gen-etag']) }) - test('Netlify Edge Middleware can add response headers', async ({ page, edgeSite }) => { - const response = await page.goto(`${edgeSite.url}/middleware-header`) + test('Netlify Edge Middleware can add response headers', async ({ page, reactRouterEdgeSite }) => { + const response = await page.goto(`${reactRouterEdgeSite.url}/middleware-header`) expect(response?.status()).toBe(200) expect(response?.headers()['foo']).toBe('bar') }) diff --git a/tests/e2e/support/deploy-to-netlify.ts b/tests/e2e/support/deploy-to-netlify.ts index 01ad7db71..4f7fb0351 100644 --- a/tests/e2e/support/deploy-to-netlify.ts +++ b/tests/e2e/support/deploy-to-netlify.ts @@ -81,7 +81,7 @@ const deploySite = async (isolatedFixtureRoot: string): Promise => { console.log(`🚀 Building and deploying site...`) const outputFile = 'deploy-output.txt' - const cmd = `ntl deploy --build --site ${SITE_ID}` + const cmd = `ntl deploy --site ${SITE_ID}` await execaCommand(cmd, { cwd: isolatedFixtureRoot, all: true }).pipeAll?.(join(isolatedFixtureRoot, outputFile)) const output = await readFile(join(isolatedFixtureRoot, outputFile), 'utf-8') diff --git a/tests/e2e/support/fixtures.ts b/tests/e2e/support/fixtures.ts index 09b036f7d..af3db3169 100644 --- a/tests/e2e/support/fixtures.ts +++ b/tests/e2e/support/fixtures.ts @@ -41,10 +41,18 @@ interface WorkerFixtures { * A React Router 7 site using origin SSR */ reactRouterServerlessSite: Fixture + /** + * A React Router 7 site using edge SSR + */ + reactRouterEdgeSite: Fixture /** * A React Router 7 site using origin SSR and opted in to the `future.v8_middleware` flag */ - reactRouterWithV8Middleware: Fixture + reactRouterServerlessWithV8Middleware: Fixture + /** + * A React Router 7 site using edge SSR and opted in to the `future.v8_middleware` flag + */ + reactRouterEdgeWithV8Middleware: Fixture } export const test = base.extend({ @@ -101,9 +109,23 @@ export const test = base.extend({ }, { scope: 'worker' }, ], - reactRouterWithV8Middleware: [ + reactRouterEdgeSite: [ + async ({}, use) => { + const fixture = await deployFixture('react-router-edge-site') + await use(fixture) + }, + { scope: 'worker' }, + ], + reactRouterServerlessWithV8Middleware: [ + async ({}, use) => { + const fixture = await deployFixture('react-router-serverless-v8-middleware') + await use(fixture) + }, + { scope: 'worker' }, + ], + reactRouterEdgeWithV8Middleware: [ async ({}, use) => { - const fixture = await deployFixture('react-router-v8-middleware') + const fixture = await deployFixture('react-router-edge-v8-middleware') await use(fixture) }, { scope: 'worker' },