diff --git a/.eslintignore b/.eslintignore index 49a812d5b4..e293384554 100644 --- a/.eslintignore +++ b/.eslintignore @@ -14,7 +14,6 @@ build.utils.d.ts .wrangler/ .tmp/ .react-router/ -.react-router-parcel/ packages/**/dist/ packages/react-router-dom/server.d.ts packages/react-router-dom/server.js diff --git a/.gitignore b/.gitignore index 53e9a5baf1..9209f20a17 100644 --- a/.gitignore +++ b/.gitignore @@ -27,7 +27,6 @@ node_modules/ .wireit .eslintcache -.parcel-cache .tmp tsup.config.bundled_*.mjs build.utils.d.ts @@ -36,4 +35,4 @@ worker-configuration.d.ts /NOTES.md # v7 reference docs -/public \ No newline at end of file +/public diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000000..0758c92192 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,160 @@ +# React Router Development Guide + +## Commands + +- **Build**: `pnpm build` (all packages) or `pnpm run --filter build` (single package) +- **Test (Jest)**: `pnpm test` (all packages), `pnpm test packages//` (single package), `pnpm test packages/react-router/__tests__/router/fetchers-test.ts` (single file), or `pnpm test -- -t "action fetch"` (tests matching name) +- **Integration tests (Playwright)**: `pnpm test:integration --project chromium` (build + test all), `pnpm test:integration:run --project chromium` (test only, all), `pnpm test:integration:run --project chromium integration/middleware-test.ts` (single file), or `pnpm test:integration:run --project chromium -g "middleware"` (tests matching name) +- **Typecheck**: `pnpm run typecheck` +- **Lint**: `pnpm run lint` +- **Docs generation**: `pnpm run docs` (regenerates API docs from JSDoc) +- **Type generation**: `pnpm run typegen` (Framework Mode only) +- **Clean**: `pnpm run clean` (git clean -fdX) + +## Modes + +**Five distinct modes**: Declarative, Data, Framework, RSC Data (unstable), RSC Framework (unstable). **Always identify which mode(s) a feature applies to.** + +1. **Declarative**: ``, ``, `` +2. **Data**: `createBrowserRouter()` with `loader`/`action`, `` +3. **Framework**: Vite plugin + `routes.ts` + Route Module API (route exports like `loader`, `action`, `default`) + type generation + SSR/SPA +4. **RSC Data** (unstable): RSC runtime APIs, manual bundler setup, runtime route config +5. **RSC Framework** (unstable): Framework Mode with `unstable_reactRouterRSC` Vite plugin + +**RSC mode differences:** + +- **RSC Framework**: `unstable_reactRouterRSC` plugin, `@vitejs/plugin-rsc`, different entry points/format +- **RSC Data**: Manual bundler, runtime route config typically in `src/routes.ts`, `unstable_RSCRouteConfig`, different runtime APIs, `setupRscTest` in `integration/rsc/` + +## Architecture + +- **Monorepo**: pnpm workspace, packages in `packages/` +- **Key packages**: + - `react-router`: Core (all modes) - `lib/components.tsx`, `lib/hooks.tsx`, `lib/router/`, `lib/dom/`, `lib/rsc/` + - `@react-router/dev`: Framework tooling - `vite/plugin.ts` (Framework), `vite/rsc/plugin.ts` (RSC Framework), `typegen/` + - `react-router-dom`: Re-exports `react-router` (v6→v7 compat) + - `@react-router/node`, `@react-router/cloudflare`, `@react-router/express`: Server adapters + - `@react-router/serve`: Minimal server for Framework Mode + - `@react-router/fs-routes`: File-system routing (`flatRoutes()`) + +## Testing + +### Unit Tests (`packages/react-router/__tests__/`) + +Use Jest for pure routing logic, pure server runtime behavior, router state, React component behavior. No build required. + +```bash +pnpm test # All packages +pnpm test packages/react-router/ # Single package +pnpm test packages/react-router/__tests__/router/fetchers-test.ts # Single file +pnpm test -- -t "action fetch" # Tests matching name +``` + +### Integration Tests (`integration/`) + +Use Playwright for Vite plugin, build pipeline, SSR/hydration, RSC, type generation. + +```bash +pnpm test:integration --project chromium # Build + test all +pnpm test:integration:run --project chromium # Test only, all +pnpm test:integration:run --project chromium integration/middleware-test.ts # Single file +pnpm test:integration:run --project chromium -g "middleware" # Tests matching name +``` + +**Project**: Always use `chromium` for integration tests, unless explicitly stated otherwise. + +**Rebuild when**: First run, after changing `packages/` (not needed for test-only changes) + +**Organization**: Use `createFixture()` → `createAppFixture()` → `PlaywrightFixture`. Templates available: `vite-6-template/`, `rsc-vite-framework/`, etc. Test all applicable modes (iterate over template array when behavior should work across modes). Test both states when introducing future flags (one test with flag on, one with flag off). + +**RSC testing**: + +- **RSC Framework**: Use `createFixture` with `rsc-vite-framework/` template +- **RSC Data**: Use `setupRscTest` in `integration/rsc/` + +Test shared behavior across multiple templates (e.g., `["vite-5-template", "rsc-vite-framework"]`). Test RSC-specific features against RSC template. + +## routes.ts + +Framework Mode uses `routes.ts` in `app/`. Most tests use `flatRoutes()` for file-system routing: + +```ts +// app/routes.ts +import { type RouteConfig } from "@react-router/dev/routes"; +import { flatRoutes } from "@react-router/fs-routes"; + +export default flatRoutes() satisfies RouteConfig; +``` + +**File-system conventions** (`app/routes/`): + +- `_index.tsx` → `/` (index route) +- `about.tsx` → `/about` +- `blog.$slug.tsx` → `/blog/:slug` (URL param) +- `settings.profile.tsx` → `/settings/profile` (`.` creates nesting) +- `_layout.tsx` → pathless layout route + +**Manual config alternative**: + +```ts +import { index, route, layout } from "@react-router/dev/routes"; +export default [ + index("./home.tsx"), + route("about", "./about.tsx"), + layout("./auth-layout.tsx", [route("login", "./login.tsx")]), +]; +``` + +## Documentation + +**Don't edit generated files**: `docs/api/` (from JSDoc), `.react-router/types/` (from typegen) + +**Mode indicators**: Every doc needs `[MODES: framework, data, declarative]` + +**API docs**: Edit JSDoc in `packages/react-router/lib/`, run `pnpm docs` + +**Unstable features**: Prefix `unstable_`, add `unstable: true` to frontmatter, include warning block + +## Future Flags + +- **Future flags** (`vX_*`): Stable breaking changes for next major +- **Unstable flags** (`unstable_*`): Experimental, may change + +Test both states (on/off) for future flags. Don't break existing behavior without a flag. + +## Changesets + +When making changes that affect users, create a changeset at `.changeset/.md`. If iterating on a change that hasn't shipped yet, update the existing changeset file instead of creating a new one. + +Format: + +```markdown +--- +"react-router": patch +"@react-router/dev": minor +--- + +Brief description of the change + +- Additional details if needed +``` + +## Branching + +- **`main`**: Latest stable release +- **`dev`**: Active development (branch from here for code changes) +- **`v6`**: v6.x maintenance +- Branch from `main` for docs-only changes + +## Key Files + +| Purpose | Location | +| ----------------- | ----------------------------------------------------------- | +| Router | `packages/react-router/lib/router/router.ts` | +| React API | `packages/react-router/lib/components.tsx`, `lib/hooks.tsx` | +| Vite plugin | `packages/react-router-dev/vite/plugin.ts` | +| RSC Vite plugin | `packages/react-router-dev/vite/rsc/plugin.ts` | +| Type generation | `packages/react-router-dev/typegen/` | +| Unit tests | `packages/react-router/__tests__/` | +| Integration tests | `integration/` | +| Decision docs | `decisions/` | diff --git a/CHANGELOG.md b/CHANGELOG.md index 26e02362e1..cfb493de5b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,146 +13,154 @@ We manage release notes in this file instead of the paginated Github Releases Pa Table of Contents - [React Router Releases](#react-router-releases) - - [v7.10.1](#v7101) + - [v7.11.0](#v7110) + - [What's Changed](#whats-changed) + - [`vite preview` Support](#vite-preview-support) + - [Stabilized Client-side `onError`](#stabilized-client-side-onerror) + - [Call-site Revalidation Opt-out (unstable)](#call-site-revalidation-opt-out-unstable) + - [Minor Changes](#minor-changes) - [Patch Changes](#patch-changes) + - [Unstable Changes](#unstable-changes) + - [v7.10.1](#v7101) + - [Patch Changes](#patch-changes-1) - [v7.10.0](#v7100) - - [What's Changed](#whats-changed) + - [What's Changed](#whats-changed-1) - [Stabilized `future.v8_splitRouteModules`](#stabilized-futurev8_splitroutemodules) - [Stabilized `future.v8_viteEnvironmentApi`](#stabilized-futurev8_viteenvironmentapi) - [Stabilized `fetcher.reset()`](#stabilized-fetcherreset) - [Stabilized `DataStrategyMatch.shouldCallHandler()`](#stabilized-datastrategymatchshouldcallhandler) - - [Minor Changes](#minor-changes) - - [Patch Changes](#patch-changes-1) - - [Unstable Changes](#unstable-changes) - - [v7.9.6](#v796) + - [Minor Changes](#minor-changes-1) - [Patch Changes](#patch-changes-2) - [Unstable Changes](#unstable-changes-1) - - [v7.9.5](#v795) - - [What's Changed](#whats-changed-1) - - [Instrumentation (unstable)](#instrumentation-unstable) + - [v7.9.6](#v796) - [Patch Changes](#patch-changes-3) - [Unstable Changes](#unstable-changes-2) - - [v7.9.4](#v794) + - [v7.9.5](#v795) - [What's Changed](#whats-changed-2) - - [`useRoute()` (unstable)](#useroute-unstable) + - [Instrumentation (unstable)](#instrumentation-unstable) - [Patch Changes](#patch-changes-4) - [Unstable Changes](#unstable-changes-3) - - [v7.9.3](#v793) + - [v7.9.4](#v794) + - [What's Changed](#whats-changed-3) + - [`useRoute()` (unstable)](#useroute-unstable) - [Patch Changes](#patch-changes-5) + - [Unstable Changes](#unstable-changes-4) + - [v7.9.3](#v793) + - [Patch Changes](#patch-changes-6) - [v7.9.2](#v792) - - [What's Changed](#whats-changed-3) + - [What's Changed](#whats-changed-4) - [RSC Framework Mode (unstable)](#rsc-framework-mode-unstable) - [Fetcher Reset (unstable)](#fetcher-reset-unstable) - - [Patch Changes](#patch-changes-6) - - [Unstable Changes](#unstable-changes-4) - - [v7.9.1](#v791) - [Patch Changes](#patch-changes-7) + - [Unstable Changes](#unstable-changes-5) + - [v7.9.1](#v791) + - [Patch Changes](#patch-changes-8) - [v7.9.0](#v790) - - [What's Changed](#whats-changed-4) + - [What's Changed](#whats-changed-5) - [Stable Middleware and Context APIs](#stable-middleware-and-context-apis) - - [Minor Changes](#minor-changes-1) - - [Patch Changes](#patch-changes-8) - - [Unstable Changes](#unstable-changes-5) - - [v7.8.2](#v782) + - [Minor Changes](#minor-changes-2) - [Patch Changes](#patch-changes-9) - [Unstable Changes](#unstable-changes-6) - - [v7.8.1](#v781) + - [v7.8.2](#v782) - [Patch Changes](#patch-changes-10) - [Unstable Changes](#unstable-changes-7) + - [v7.8.1](#v781) + - [Patch Changes](#patch-changes-11) + - [Unstable Changes](#unstable-changes-8) - [v7.8.0](#v780) - - [What's Changed](#whats-changed-5) + - [What's Changed](#whats-changed-6) - [Consistently named `loaderData` values](#consistently-named-loaderdata-values) - [Improvements/fixes to the middleware APIs (unstable)](#improvementsfixes-to-the-middleware-apis-unstable) - - [Minor Changes](#minor-changes-2) - - [Patch Changes](#patch-changes-11) - - [Unstable Changes](#unstable-changes-8) - - [Changes by Package](#changes-by-package) - - [v7.7.1](#v771) + - [Minor Changes](#minor-changes-3) - [Patch Changes](#patch-changes-12) - [Unstable Changes](#unstable-changes-9) - - [v7.7.0](#v770) - - [What's Changed](#whats-changed-6) - - [Unstable RSC APIs](#unstable-rsc-apis) - - [Minor Changes](#minor-changes-3) + - [Changes by Package](#changes-by-package) + - [v7.7.1](#v771) - [Patch Changes](#patch-changes-13) - [Unstable Changes](#unstable-changes-10) + - [v7.7.0](#v770) + - [What's Changed](#whats-changed-7) + - [Unstable RSC APIs](#unstable-rsc-apis) + - [Minor Changes](#minor-changes-4) + - [Patch Changes](#patch-changes-14) + - [Unstable Changes](#unstable-changes-11) - [Changes by Package](#changes-by-package-1) - [v7.6.3](#v763) - - [Patch Changes](#patch-changes-14) - - [v7.6.2](#v762) - [Patch Changes](#patch-changes-15) - - [v7.6.1](#v761) + - [v7.6.2](#v762) - [Patch Changes](#patch-changes-16) - - [Unstable Changes](#unstable-changes-11) + - [v7.6.1](#v761) + - [Patch Changes](#patch-changes-17) + - [Unstable Changes](#unstable-changes-12) - [v7.6.0](#v760) - - [What's Changed](#whats-changed-7) + - [What's Changed](#whats-changed-8) - [`routeDiscovery` Config Option](#routediscovery-config-option) - [Automatic Types for Future Flags](#automatic-types-for-future-flags) - - [Minor Changes](#minor-changes-4) - - [Patch Changes](#patch-changes-17) - - [Unstable Changes](#unstable-changes-12) + - [Minor Changes](#minor-changes-5) + - [Patch Changes](#patch-changes-18) + - [Unstable Changes](#unstable-changes-13) - [Changes by Package](#changes-by-package-2) - [v7.5.3](#v753) - - [Patch Changes](#patch-changes-18) + - [Patch Changes](#patch-changes-19) - [v7.5.2](#v752) - [Security Notice](#security-notice) - - [Patch Changes](#patch-changes-19) - - [v7.5.1](#v751) - [Patch Changes](#patch-changes-20) - - [Unstable Changes](#unstable-changes-13) - - [v7.5.0](#v750) - - [What's Changed](#whats-changed-8) - - [`route.lazy` Object API](#routelazy-object-api) - - [Minor Changes](#minor-changes-5) + - [v7.5.1](#v751) - [Patch Changes](#patch-changes-21) - [Unstable Changes](#unstable-changes-14) + - [v7.5.0](#v750) + - [What's Changed](#whats-changed-9) + - [`route.lazy` Object API](#routelazy-object-api) + - [Minor Changes](#minor-changes-6) + - [Patch Changes](#patch-changes-22) + - [Unstable Changes](#unstable-changes-15) - [Changes by Package](#changes-by-package-3) - [v7.4.1](#v741) - [Security Notice](#security-notice-1) - - [Patch Changes](#patch-changes-22) - - [Unstable Changes](#unstable-changes-15) - - [v7.4.0](#v740) - - [Minor Changes](#minor-changes-6) - [Patch Changes](#patch-changes-23) - [Unstable Changes](#unstable-changes-16) - - [Changes by Package](#changes-by-package-4) - - [v7.3.0](#v730) + - [v7.4.0](#v740) - [Minor Changes](#minor-changes-7) - [Patch Changes](#patch-changes-24) - [Unstable Changes](#unstable-changes-17) + - [Changes by Package](#changes-by-package-4) + - [v7.3.0](#v730) + - [Minor Changes](#minor-changes-8) + - [Patch Changes](#patch-changes-25) + - [Unstable Changes](#unstable-changes-18) - [Client-side `context` (unstable)](#client-side-context-unstable) - [Middleware (unstable)](#middleware-unstable) - [Middleware `context` parameter](#middleware-context-parameter) - [`unstable_SerializesTo`](#unstable_serializesto) - [Changes by Package](#changes-by-package-5) - [v7.2.0](#v720) - - [What's Changed](#whats-changed-9) + - [What's Changed](#whats-changed-10) - [Type-safe `href` utility](#type-safe-href-utility) - [Prerendering with a SPA Fallback](#prerendering-with-a-spa-fallback) - [Allow a root `loader` in SPA Mode](#allow-a-root-loader-in-spa-mode) - - [Minor Changes](#minor-changes-8) - - [Patch Changes](#patch-changes-25) - - [Unstable Changes](#unstable-changes-18) + - [Minor Changes](#minor-changes-9) + - [Patch Changes](#patch-changes-26) + - [Unstable Changes](#unstable-changes-19) - [Split Route Modules (unstable)](#split-route-modules-unstable) - [Changes by Package](#changes-by-package-6) - [v7.1.5](#v715) - - [Patch Changes](#patch-changes-26) - - [v7.1.4](#v714) - [Patch Changes](#patch-changes-27) - - [v7.1.3](#v713) + - [v7.1.4](#v714) - [Patch Changes](#patch-changes-28) - - [v7.1.2](#v712) + - [v7.1.3](#v713) - [Patch Changes](#patch-changes-29) - - [v7.1.1](#v711) + - [v7.1.2](#v712) - [Patch Changes](#patch-changes-30) - - [v7.1.0](#v710) - - [Minor Changes](#minor-changes-9) + - [v7.1.1](#v711) - [Patch Changes](#patch-changes-31) + - [v7.1.0](#v710) + - [Minor Changes](#minor-changes-10) + - [Patch Changes](#patch-changes-32) - [Changes by Package](#changes-by-package-7) - [v7.0.2](#v702) - - [Patch Changes](#patch-changes-32) - - [v7.0.1](#v701) - [Patch Changes](#patch-changes-33) + - [v7.0.1](#v701) + - [Patch Changes](#patch-changes-34) - [v7.0.0](#v700) - [Breaking Changes](#breaking-changes) - [Package Restructuring](#package-restructuring) @@ -168,204 +176,204 @@ We manage release notes in this file instead of the paginated Github Releases Pa - [Prerendering](#prerendering) - [Major Changes (`react-router`)](#major-changes-react-router) - [Major Changes (`@react-router/*`)](#major-changes-react-router-1) - - [Minor Changes](#minor-changes-10) - - [Patch Changes](#patch-changes-34) + - [Minor Changes](#minor-changes-11) + - [Patch Changes](#patch-changes-35) - [Changes by Package](#changes-by-package-8) - [React Router v6 Releases](#react-router-v6-releases) - [v6.30.2](#v6302) - - [Patch Changes](#patch-changes-35) - - [v6.30.1](#v6301) - [Patch Changes](#patch-changes-36) - - [v6.30.0](#v6300) - - [Minor Changes](#minor-changes-11) + - [v6.30.1](#v6301) - [Patch Changes](#patch-changes-37) - - [v6.29.0](#v6290) + - [v6.30.0](#v6300) - [Minor Changes](#minor-changes-12) - [Patch Changes](#patch-changes-38) - - [v6.28.2](#v6282) + - [v6.29.0](#v6290) + - [Minor Changes](#minor-changes-13) - [Patch Changes](#patch-changes-39) - - [v6.28.1](#v6281) + - [v6.28.2](#v6282) - [Patch Changes](#patch-changes-40) - - [v6.28.0](#v6280) - - [What's Changed](#whats-changed-10) - - [Minor Changes](#minor-changes-13) + - [v6.28.1](#v6281) - [Patch Changes](#patch-changes-41) - - [v6.27.0](#v6270) + - [v6.28.0](#v6280) - [What's Changed](#whats-changed-11) - - [Stabilized APIs](#stabilized-apis) - [Minor Changes](#minor-changes-14) - [Patch Changes](#patch-changes-42) - - [v6.26.2](#v6262) + - [v6.27.0](#v6270) + - [What's Changed](#whats-changed-12) + - [Stabilized APIs](#stabilized-apis) + - [Minor Changes](#minor-changes-15) - [Patch Changes](#patch-changes-43) - - [v6.26.1](#v6261) + - [v6.26.2](#v6262) - [Patch Changes](#patch-changes-44) - - [v6.26.0](#v6260) - - [Minor Changes](#minor-changes-15) + - [v6.26.1](#v6261) - [Patch Changes](#patch-changes-45) - - [v6.25.1](#v6251) + - [v6.26.0](#v6260) + - [Minor Changes](#minor-changes-16) - [Patch Changes](#patch-changes-46) + - [v6.25.1](#v6251) + - [Patch Changes](#patch-changes-47) - [v6.25.0](#v6250) - - [What's Changed](#whats-changed-12) + - [What's Changed](#whats-changed-13) - [Stabilized `v7_skipActionErrorRevalidation`](#stabilized-v7_skipactionerrorrevalidation) - - [Minor Changes](#minor-changes-16) - - [Patch Changes](#patch-changes-47) - - [v6.24.1](#v6241) + - [Minor Changes](#minor-changes-17) - [Patch Changes](#patch-changes-48) + - [v6.24.1](#v6241) + - [Patch Changes](#patch-changes-49) - [v6.24.0](#v6240) - - [What's Changed](#whats-changed-13) + - [What's Changed](#whats-changed-14) - [Lazy Route Discovery (a.k.a. "Fog of War")](#lazy-route-discovery-aka-fog-of-war) - - [Minor Changes](#minor-changes-17) - - [Patch Changes](#patch-changes-49) - - [v6.23.1](#v6231) + - [Minor Changes](#minor-changes-18) - [Patch Changes](#patch-changes-50) + - [v6.23.1](#v6231) + - [Patch Changes](#patch-changes-51) - [v6.23.0](#v6230) - - [What's Changed](#whats-changed-14) + - [What's Changed](#whats-changed-15) - [Data Strategy (unstable)](#data-strategy-unstable) - [Skip Action Error Revalidation (unstable)](#skip-action-error-revalidation-unstable) - - [Minor Changes](#minor-changes-18) + - [Minor Changes](#minor-changes-19) - [v6.22.3](#v6223) - - [Patch Changes](#patch-changes-51) - - [v6.22.2](#v6222) - [Patch Changes](#patch-changes-52) - - [v6.22.1](#v6221) + - [v6.22.2](#v6222) - [Patch Changes](#patch-changes-53) + - [v6.22.1](#v6221) + - [Patch Changes](#patch-changes-54) - [v6.22.0](#v6220) - - [What's Changed](#whats-changed-15) + - [What's Changed](#whats-changed-16) - [Core Web Vitals Technology Report Flag](#core-web-vitals-technology-report-flag) - - [Minor Changes](#minor-changes-19) - - [Patch Changes](#patch-changes-54) - - [v6.21.3](#v6213) + - [Minor Changes](#minor-changes-20) - [Patch Changes](#patch-changes-55) - - [v6.21.2](#v6212) + - [v6.21.3](#v6213) - [Patch Changes](#patch-changes-56) - - [v6.21.1](#v6211) + - [v6.21.2](#v6212) - [Patch Changes](#patch-changes-57) + - [v6.21.1](#v6211) + - [Patch Changes](#patch-changes-58) - [v6.21.0](#v6210) - - [What's Changed](#whats-changed-16) + - [What's Changed](#whats-changed-17) - [`future.v7_relativeSplatPath`](#futurev7_relativesplatpath) - [Partial Hydration](#partial-hydration) - - [Minor Changes](#minor-changes-20) - - [Patch Changes](#patch-changes-58) - - [v6.20.1](#v6201) - - [Patch Changes](#patch-changes-59) - - [v6.20.0](#v6200) - [Minor Changes](#minor-changes-21) + - [Patch Changes](#patch-changes-59) + - [v6.20.1](#v6201) - [Patch Changes](#patch-changes-60) - - [v6.19.0](#v6190) - - [What's Changed](#whats-changed-17) - - [`unstable_flushSync` API](#unstable_flushsync-api) + - [v6.20.0](#v6200) - [Minor Changes](#minor-changes-22) - [Patch Changes](#patch-changes-61) - - [v6.18.0](#v6180) + - [v6.19.0](#v6190) - [What's Changed](#whats-changed-18) - - [New Fetcher APIs](#new-fetcher-apis) - - [Persistence Future Flag (`future.v7_fetcherPersist`)](#persistence-future-flag-futurev7_fetcherpersist) + - [`unstable_flushSync` API](#unstable_flushsync-api) - [Minor Changes](#minor-changes-23) - [Patch Changes](#patch-changes-62) - - [v6.17.0](#v6170) + - [v6.18.0](#v6180) - [What's Changed](#whats-changed-19) - - [View Transitions 🚀](#view-transitions-) + - [New Fetcher APIs](#new-fetcher-apis) + - [Persistence Future Flag (`future.v7_fetcherPersist`)](#persistence-future-flag-futurev7_fetcherpersist) - [Minor Changes](#minor-changes-24) - [Patch Changes](#patch-changes-63) - - [v6.16.0](#v6160) + - [v6.17.0](#v6170) + - [What's Changed](#whats-changed-20) + - [View Transitions 🚀](#view-transitions-) - [Minor Changes](#minor-changes-25) - [Patch Changes](#patch-changes-64) - - [v6.15.0](#v6150) + - [v6.16.0](#v6160) - [Minor Changes](#minor-changes-26) - [Patch Changes](#patch-changes-65) - - [v6.14.2](#v6142) + - [v6.15.0](#v6150) + - [Minor Changes](#minor-changes-27) - [Patch Changes](#patch-changes-66) - - [v6.14.1](#v6141) + - [v6.14.2](#v6142) - [Patch Changes](#patch-changes-67) - - [v6.14.0](#v6140) - - [What's Changed](#whats-changed-20) - - [JSON/Text Submissions](#jsontext-submissions) - - [Minor Changes](#minor-changes-27) + - [v6.14.1](#v6141) - [Patch Changes](#patch-changes-68) - - [v6.13.0](#v6130) + - [v6.14.0](#v6140) - [What's Changed](#whats-changed-21) - - [`future.v7_startTransition`](#futurev7_starttransition) + - [JSON/Text Submissions](#jsontext-submissions) - [Minor Changes](#minor-changes-28) - [Patch Changes](#patch-changes-69) - - [v6.12.1](#v6121) - - [Patch Changes](#patch-changes-70) - - [v6.12.0](#v6120) + - [v6.13.0](#v6130) - [What's Changed](#whats-changed-22) - - [`React.startTransition` support](#reactstarttransition-support) + - [`future.v7_startTransition`](#futurev7_starttransition) - [Minor Changes](#minor-changes-29) + - [Patch Changes](#patch-changes-70) + - [v6.12.1](#v6121) - [Patch Changes](#patch-changes-71) - - [v6.11.2](#v6112) + - [v6.12.0](#v6120) + - [What's Changed](#whats-changed-23) + - [`React.startTransition` support](#reactstarttransition-support) + - [Minor Changes](#minor-changes-30) - [Patch Changes](#patch-changes-72) - - [v6.11.1](#v6111) + - [v6.11.2](#v6112) - [Patch Changes](#patch-changes-73) - - [v6.11.0](#v6110) - - [Minor Changes](#minor-changes-30) + - [v6.11.1](#v6111) - [Patch Changes](#patch-changes-74) - - [v6.10.0](#v6100) - - [What's Changed](#whats-changed-23) + - [v6.11.0](#v6110) - [Minor Changes](#minor-changes-31) - - [`future.v7_normalizeFormMethod`](#futurev7_normalizeformmethod) - [Patch Changes](#patch-changes-75) - - [v6.9.0](#v690) + - [v6.10.0](#v6100) - [What's Changed](#whats-changed-24) - - [`Component`/`ErrorBoundary` route properties](#componenterrorboundary-route-properties) - - [Introducing Lazy Route Modules](#introducing-lazy-route-modules) - [Minor Changes](#minor-changes-32) + - [`future.v7_normalizeFormMethod`](#futurev7_normalizeformmethod) - [Patch Changes](#patch-changes-76) - - [v6.8.2](#v682) + - [v6.9.0](#v690) + - [What's Changed](#whats-changed-25) + - [`Component`/`ErrorBoundary` route properties](#componenterrorboundary-route-properties) + - [Introducing Lazy Route Modules](#introducing-lazy-route-modules) + - [Minor Changes](#minor-changes-33) - [Patch Changes](#patch-changes-77) - - [v6.8.1](#v681) + - [v6.8.2](#v682) - [Patch Changes](#patch-changes-78) - - [v6.8.0](#v680) - - [Minor Changes](#minor-changes-33) + - [v6.8.1](#v681) - [Patch Changes](#patch-changes-79) - - [v6.7.0](#v670) + - [v6.8.0](#v680) - [Minor Changes](#minor-changes-34) - [Patch Changes](#patch-changes-80) - - [v6.6.2](#v662) + - [v6.7.0](#v670) + - [Minor Changes](#minor-changes-35) - [Patch Changes](#patch-changes-81) - - [v6.6.1](#v661) + - [v6.6.2](#v662) - [Patch Changes](#patch-changes-82) - - [v6.6.0](#v660) - - [What's Changed](#whats-changed-25) - - [Minor Changes](#minor-changes-35) + - [v6.6.1](#v661) - [Patch Changes](#patch-changes-83) - - [v6.5.0](#v650) + - [v6.6.0](#v660) - [What's Changed](#whats-changed-26) - [Minor Changes](#minor-changes-36) - [Patch Changes](#patch-changes-84) - - [v6.4.5](#v645) + - [v6.5.0](#v650) + - [What's Changed](#whats-changed-27) + - [Minor Changes](#minor-changes-37) - [Patch Changes](#patch-changes-85) - - [v6.4.4](#v644) + - [v6.4.5](#v645) - [Patch Changes](#patch-changes-86) - - [v6.4.3](#v643) + - [v6.4.4](#v644) - [Patch Changes](#patch-changes-87) - - [v6.4.2](#v642) + - [v6.4.3](#v643) - [Patch Changes](#patch-changes-88) - - [v6.4.1](#v641) + - [v6.4.2](#v642) - [Patch Changes](#patch-changes-89) + - [v6.4.1](#v641) + - [Patch Changes](#patch-changes-90) - [v6.4.0](#v640) - - [What's Changed](#whats-changed-27) + - [What's Changed](#whats-changed-28) - [Remix Data APIs](#remix-data-apis) - - [Patch Changes](#patch-changes-90) + - [Patch Changes](#patch-changes-91) - [v6.3.0](#v630) - - [Minor Changes](#minor-changes-37) + - [Minor Changes](#minor-changes-38) - [v6.2.2](#v622) - - [Patch Changes](#patch-changes-91) - - [v6.2.1](#v621) - [Patch Changes](#patch-changes-92) - - [v6.2.0](#v620) - - [Minor Changes](#minor-changes-38) + - [v6.2.1](#v621) - [Patch Changes](#patch-changes-93) - - [v6.1.1](#v611) - - [Patch Changes](#patch-changes-94) - - [v6.1.0](#v610) + - [v6.2.0](#v620) - [Minor Changes](#minor-changes-39) + - [Patch Changes](#patch-changes-94) + - [v6.1.1](#v611) - [Patch Changes](#patch-changes-95) - - [v6.0.2](#v602) + - [v6.1.0](#v610) + - [Minor Changes](#minor-changes-40) - [Patch Changes](#patch-changes-96) - - [v6.0.1](#v601) + - [v6.0.2](#v602) - [Patch Changes](#patch-changes-97) + - [v6.0.1](#v601) + - [Patch Changes](#patch-changes-98) - [v6.0.0](#v600) @@ -393,6 +401,69 @@ Date: YYYY-MM-DD **Full Changelog**: [`v7.X.Y...v7.X.Y`](https://github.com/remix-run/react-router/compare/react-router@7.X.Y...react-router@7.X.Y) --> +## v7.11.0 + +Date: 2025-12-17 + +### What's Changed + +We've added `vite preview` support and stabilized the client-side `onError` API - please make the appropriate changes if you've adopted the `unstable_onError` API already in a prior release. + +#### `vite preview` Support + +We've added support for [`vite preview`](https://vite.dev/guide/cli#vite-preview) when using Framework mode to make it easy to preview your production build. + +#### Stabilized Client-side `onError` + +The existing ``/`` APIs have been stabilized as ``/``. Please see the [Error Reporting](https://reactrouter.com/7.11.0/how-to/error-reporting#client-errors) docs for more information. + +#### Call-site Revalidation Opt-out (unstable) + +We've added initial unstable support for call-site revalidation opt-out via a new `unstable_defaultShouldRevalidate` flag ([RFC](https://github.com/remix-run/react-router/discussions/10006)). This flag is available on all navigation/fetcher submission APIs to alter standard revalidation behavior. If any routes include a `shouldRevalidate` function, then the flag value will be passed to that function so the route has the final say on revalidation behavior. + +```tsx +
+submit(data, { method: "post", unstable_defaultShouldRevalidate: false }) + +fetcher.submit(data, { method: "post", unstable_defaultShouldRevalidate: false }) +``` + +This flag is also available on non-submission navigational use cases - for example, you may want to opt-out of revalidation when adding a search param that doesn't impact the UI: + +```tsx +; +navigate("?analytics-param=1", { unstable_defaultShouldRevalidate: false }); +setSearchParams(params, { unstable_defaultShouldRevalidate: false }); +``` + +### Minor Changes + +- `react-router` - Stabilize ``/`` ([#14546](https://github.com/remix-run/react-router/pull/14546)) +- `@react-router/dev` - Add `vite preview` support ([#14507](https://github.com/remix-run/react-router/pull/14507)) + +### Patch Changes + +- `react-router` - Fix `unstable_useTransitions` prop on `` component to permit omission for backwards compatibility ([#14646](https://github.com/remix-run/react-router/pull/14646)) +- `react-router` - Allow redirects to be returned from client side middleware ([#14598](https://github.com/remix-run/react-router/pull/14598)) +- `react-router` - Handle `dataStrategy` implementations that return insufficient result sets by adding errors for routes without any available result ([#14627](https://github.com/remix-run/react-router/pull/14627)) +- `@react-router/serve` - Update `compression` and `morgan` dependencies to address `on-headers` CVE: [GHSA-76c9-3jph-rj3q](https://github.com/advisories/GHSA-76c9-3jph-rj3q) ([#14652](https://github.com/remix-run/react-router/pull/14652)) + +### Unstable Changes + +⚠️ _[Unstable features](https://reactrouter.com/community/api-development-strategy#unstable-flags) are not recommended for production use_ + +- `react-router` - RSC: Support for throwing `data()` and Response from server component render phase ([#14632](https://github.com/remix-run/react-router/pull/14632)) + - Response body is not serialized as async work is not allowed as error encoding phase. + - If you wish to transmit data to the boundary, throw `data()` instead +- `react-router` - RSC: Support for throwing `redirect` Response's at render time ([#14596](https://github.com/remix-run/react-router/pull/14596)) +- `react-router` - RSC: `routeRSCServerRequest` replace `fetchServer` with `serverResponse` ([#14597](https://github.com/remix-run/react-router/pull/14597)) +- `@react-router/dev` - RSC (Framework mode): Manual chunking for `react` and `react-router` deps ([#14655](https://github.com/remix-run/react-router/pull/14655)) +- `@react-router/dev` - RSC (Framework mode): Optimize `react-server-dom-webpack` if in project `package.json` ([#14656](https://github.com/remix-run/react-router/pull/14656)) +- `@react-router/{dev,serve}` - RSC (Framework mode): Support custom entrypoints ([#14643](https://github.com/remix-run/react-router/pull/14643)) +- `react-router` - Add a new `unstable_defaultShouldRevalidate` flag to various APIs to allow opt-ing out of standard revalidation behaviors ([#14542](https://github.com/remix-run/react-router/pull/14542)) + +**Full Changelog**: [`v7.10.1...v7.11.0`](https://github.com/remix-run/react-router/compare/react-router@7.10.1...react-router@7.11.0) + ## v7.10.1 Date: 2025-12-04 diff --git a/contributors.yml b/contributors.yml index 9d6cc0a085..5f4b31241c 100644 --- a/contributors.yml +++ b/contributors.yml @@ -119,6 +119,7 @@ - emzoumpo - engpetermwangi - ericschn +- ErlendS - esadek - faergeek - fernandojbf diff --git a/docs/api/components/Form.md b/docs/api/components/Form.md index 67d7a9e281..edca0da972 100644 --- a/docs/api/components/Form.md +++ b/docs/api/components/Form.md @@ -144,3 +144,15 @@ Enables a [View Transition](https://developer.mozilla.org/en-US/docs/Web/API/Vie for this navigation. To apply specific styles during the transition, see [`useViewTransitionState`](../hooks/useViewTransitionState). +### unstable_defaultShouldRevalidate + +Specify the default revalidation behavior after this submission + +If no `shouldRevalidate` functions are present on the active routes, then this +value will be used directly. Otherwise it will be passed into `shouldRevalidate` +so the route can make the final determination on revalidation. This can be +useful when updating search params and you don't want to trigger a revalidation. + +By default (when not specified), loaders will revalidate according to the routers +standard revalidation behavior. + diff --git a/docs/api/components/Link.md b/docs/api/components/Link.md index db4ae3033e..cfb0949aae 100644 --- a/docs/api/components/Link.md +++ b/docs/api/components/Link.md @@ -214,3 +214,21 @@ for this navigation. To apply specific styles for the transition, see [`useViewTransitionState`](../hooks/useViewTransitionState) +### unstable_defaultShouldRevalidate + +[modes: framework, data, declarative] + +Specify the default revalidation behavior for the navigation. + +```tsx + +``` + +If no `shouldRevalidate` functions are present on the active routes, then this +value will be used directly. Otherwise it will be passed into `shouldRevalidate` +so the route can make the final determination on revalidation. This can be +useful when updating search params and you don't want to trigger a revalidation. + +By default (when not specified), loaders will revalidate according to the routers +standard revalidation behavior. + diff --git a/docs/api/data-routers/RouterProvider.md b/docs/api/data-routers/RouterProvider.md index e1a957032e..bfb720aef5 100644 --- a/docs/api/data-routers/RouterProvider.md +++ b/docs/api/data-routers/RouterProvider.md @@ -48,7 +48,7 @@ implementation. You _almost always_ want to use the version from function RouterProvider({ router, flushSync: reactDomFlushSyncImpl, - unstable_onError, + onError, unstable_useTransitions, }: RouterProviderProps): React.ReactElement ``` @@ -65,11 +65,11 @@ You usually don't have to worry about this: - If you are rendering in a non-DOM environment, you can import `RouterProvider` from `react-router` and ignore this prop -### unstable_onError +### onError -An error handler function that will be called for any loader/action/render -errors that are encountered in your application. This is useful for -logging or reporting errors instead of the `ErrorBoundary` because it's not +An error handler function that will be called for any middleware, loader, action, +or render errors that are encountered in your application. This is useful for +logging or reporting errors instead of in the `ErrorBoundary` because it's not subject to re-rendering and will only run one time per error. The `errorInfo` parameter is passed along from @@ -77,9 +77,10 @@ The `errorInfo` parameter is passed along from and is only present for render errors. ```tsx - { - console.error(error, errorInfo); - reportToErrorService(error, errorInfo); + { + let { location, params, unstable_pattern, errorInfo } = info; + console.error(error, location, errorInfo); + reportToErrorService(error, location, errorInfo); }} /> ``` diff --git a/docs/api/declarative-routers/Router.md b/docs/api/declarative-routers/Router.md index 7c4e99c56d..82985b4ced 100644 --- a/docs/api/declarative-routers/Router.md +++ b/docs/api/declarative-routers/Router.md @@ -74,5 +74,16 @@ will not be reactive to location changes. ### unstable_useTransitions -Whether this router should wrap navigations in `React.startTransition()` +Control whether router state updates are internally wrapped in +[`React.startTransition`](https://react.dev/reference/react/startTransition). + +- When left `undefined`, all router state updates are wrapped in + `React.startTransition` +- When set to `true`, [`Link`](../components/Link) and [`Form`](../components/Form) navigations will be wrapped + in `React.startTransition` and all router state updates are wrapped in + `React.startTransition` +- When set to `false`, the router will not leverage `React.startTransition` + on any navigations or state changes. + +For more information, please see the [docs](https://reactrouter.com/explanation/react-transitions). diff --git a/docs/api/framework-routers/HydratedRouter.md b/docs/api/framework-routers/HydratedRouter.md index f0c0432218..3b8c831d93 100644 --- a/docs/api/framework-routers/HydratedRouter.md +++ b/docs/api/framework-routers/HydratedRouter.md @@ -39,11 +39,11 @@ navigation/fetch and made available to [`clientAction`](../../start/framework/route-module#clientAction)/[`clientLoader`](../../start/framework/route-module#clientLoader) functions. -### unstable_onError +### onError -An error handler function that will be called for any loader/action/render -errors that are encountered in your application. This is useful for -logging or reporting errors instead of the `ErrorBoundary` because it's not +An error handler function that will be called for any middleware, loader, action, +or render errors that are encountered in your application. This is useful for +logging or reporting errors instead of in the `ErrorBoundary` because it's not subject to re-rendering and will only run one time per error. The `errorInfo` parameter is passed along from @@ -51,9 +51,10 @@ The `errorInfo` parameter is passed along from and is only present for render errors. ```tsx - { - console.error(error, errorInfo); - reportToErrorService(error, errorInfo); + { + let { location, params, unstable_pattern, errorInfo } = info; + console.error(error, location, errorInfo); + reportToErrorService(error, location, errorInfo); }} /> ``` diff --git a/docs/api/hooks/useLinkClickHandler.md b/docs/api/hooks/useLinkClickHandler.md index 37221e6259..27068dd645 100644 --- a/docs/api/hooks/useLinkClickHandler.md +++ b/docs/api/hooks/useLinkClickHandler.md @@ -38,6 +38,7 @@ function useLinkClickHandler( preventScrollReset, relative, viewTransition, + unstable_defaultShouldRevalidate, unstable_useTransitions, }: { target?: React.HTMLAttributeAnchorTarget; @@ -46,6 +47,7 @@ function useLinkClickHandler( preventScrollReset?: boolean; relative?: RelativeRoutingType; viewTransition?: boolean; + unstable_defaultShouldRevalidate?: boolean; unstable_useTransitions?: boolean; } = , ): (event: React.MouseEvent) => void {} @@ -83,6 +85,10 @@ The target attribute for the link. Defaults to `undefined`. Enables a [View Transition](https://developer.mozilla.org/en-US/docs/Web/API/View_Transitions_API) for this navigation. To apply specific styles during the transition, see [`useViewTransitionState`](../hooks/useViewTransitionState). Defaults to `false`. +### options.unstable_defaultShouldRevalidate + +Specify the default revalidation behavior for the navigation. Defaults to `true`. + ### options.unstable_useTransitions Wraps the navigation in [`React.startTransition`](https://react.dev/reference/react/startTransition) diff --git a/docs/api/rsc/RSCStaticRouter.md b/docs/api/rsc/RSCStaticRouter.md index 5f56c30cdc..395df3ba1f 100644 --- a/docs/api/rsc/RSCStaticRouter.md +++ b/docs/api/rsc/RSCStaticRouter.md @@ -43,7 +43,7 @@ import { routeRSCServerRequest({ request, - fetchServer, + serverResponse, createFromReadableStream, async renderHTML(getPayload) { const payload = getPayload(); diff --git a/docs/api/rsc/matchRSCServerRequest.md b/docs/api/rsc/matchRSCServerRequest.md index 313683228b..69ff6e999c 100644 --- a/docs/api/rsc/matchRSCServerRequest.md +++ b/docs/api/rsc/matchRSCServerRequest.md @@ -95,8 +95,10 @@ async function matchRSCServerRequest({ generateResponse: ( match: RSCMatch, { + onError, temporaryReferences, }: { + onError(error: unknown): string | undefined; temporaryReferences: unknown; }, ) => Response; diff --git a/docs/api/rsc/routeRSCServerRequest.md b/docs/api/rsc/routeRSCServerRequest.md index 390ae380ce..cbf072010e 100644 --- a/docs/api/rsc/routeRSCServerRequest.md +++ b/docs/api/rsc/routeRSCServerRequest.md @@ -45,7 +45,7 @@ import { routeRSCServerRequest({ request, - fetchServer, + serverResponse, createFromReadableStream, async renderHTML(getPayload) { const payload = getPayload(); @@ -66,16 +66,20 @@ routeRSCServerRequest({ ```tsx async function routeRSCServerRequest({ request, - fetchServer, + serverResponse, createFromReadableStream, renderHTML, hydrate = true, }: { request: Request; - fetchServer: (request: Request) => Promise; + serverResponse: Response; createFromReadableStream: SSRCreateFromReadableStreamFunction; renderHTML: ( getPayload: () => DecodedPayload, + options: { + onError(error: unknown): string | undefined; + onHeaders(headers: Headers): void; + }, ) => ReadableStream | Promise>; hydrate?: boolean; }): Promise @@ -87,10 +91,9 @@ async function routeRSCServerRequest({ Your `react-server-dom-xyz/client`'s `createFromReadableStream` function, used to decode payloads from the server. -### opts.fetchServer +### opts.serverResponse -A function that forwards a [`Request`](https://developer.mozilla.org/en-US/docs/Web/API/Request) to the [RSC](https://react.dev/reference/rsc/server-components) handler -and returns a `Promise` containing a serialized [`unstable_RSCPayload`](https://api.reactrouter.com/v7/types/react_router.unstable_RSCPayload.html). +A Response or partial response generated by the [RSC](https://react.dev/reference/rsc/server-components) handler containing a serialized [`unstable_RSCPayload`](https://api.reactrouter.com/v7/types/react_router.unstable_RSCPayload.html). ### opts.hydrate diff --git a/docs/how-to/error-boundary.md b/docs/how-to/error-boundary.md index 0526973837..a12ab02420 100644 --- a/docs/how-to/error-boundary.md +++ b/docs/how-to/error-boundary.md @@ -11,7 +11,7 @@ title: Error Boundaries To avoid rendering an empty page to users, route modules will automatically catch errors in your code and render the closest `ErrorBoundary`. -Error boundaries are not intended for error reporting or rendering form validation errors. Please see [Form Validation](./form-validation) and [Error Reporting](./error-reporting) instead. +Error boundaries are not intended for rendering form validation errors or error reporting. Please see [Form Validation](./form-validation) and [Error Reporting](./error-reporting) instead. ## 1. Add a root error boundary diff --git a/docs/how-to/error-reporting.md b/docs/how-to/error-reporting.md index bd42d2b5fa..72539d60da 100644 --- a/docs/how-to/error-reporting.md +++ b/docs/how-to/error-reporting.md @@ -4,22 +4,28 @@ title: Error Reporting # Error Reporting -[MODES: framework] +[MODES: framework,data]

-React Router catches errors in your route modules and sends them to [error boundaries](./error-boundary) to prevent blank pages when errors occur. However, ErrorBoundary isn't sufficient for logging and reporting errors. To access these caught errors, use the handleError export of the server entry module. +React Router catches errors in your route modules and sends them to [error boundaries](./error-boundary) to prevent blank pages when errors occur. However, `ErrorBoundary` isn't sufficient for logging and reporting errors. -## 1. Reveal the server entry +## Server Errors -If you don't see `entry.server.tsx` in your app directory, you're using a default entry. Reveal it with this cli command: +[modes: framework] + +To access these caught errors on the server, use the `handleError` export of the server entry module. + +### 1. Reveal the server entry + +If you don't see [`entry.server.tsx`][entryserver] in your app directory, you're using a default entry. Reveal it with this cli command: ```shellscript nonumber -react-router reveal +react-router reveal entry.server ``` -## 2. Export your error handler +### 2. Export your error handler This function is called whenever React Router catches an error in your application on the server. @@ -39,3 +45,90 @@ export const handleError: HandleErrorFunction = ( } }; ``` + +See also: + +- [`handleError`][handleError] + +## Client Errors + +To access these caught errors on the client, use the `onError` prop on your [`HydratedRouter`][hydratedrouter] or [`RouterProvider`][routerprovider] component. + +### Framework Mode + +[modes: framework] + +#### 1. Reveal the client entry + +If you don't see [`entry.client.tsx`][entryclient] in your app directory, you're using a default entry. Reveal it with this cli command: + +```shellscript nonumber +react-router reveal entry.client +``` + +#### 2. Add your error handler + +This function is called whenever React Router catches an error in your application on the client. + +```tsx filename=entry.client.tsx +import { type ClientOnErrorFunction } from "react-router"; + +const onError: ClientOnErrorFunction = ( + error, + { location, params, unstable_pattern, errorInfo }, +) => { + myReportError(error, location, errorInfo); + + // make sure to still log the error so you can see it + console.error(error, errorInfo); +}; + +startTransition(() => { + hydrateRoot( + document, + + + , + ); +}); +``` + +See also: + +- [``][hydratedrouter-onerror] + +### Data Mode + +[modes: data] + +This function is called whenever React Router catches an error in your application on the client. + +```tsx +import { type ClientOnErrorFunction } from "react-router"; + +const onError: ClientOnErrorFunction = ( + error, + { location, params, unstable_pattern, errorInfo }, +) => { + myReportError(error, location, errorInfo); + + // make sure to still log the error so you can see it + console.error(error, errorInfo); +}; + +function App() { + return ; +} +``` + +See also: + +- [``][routerprovider-onerror] + +[entryserver]: ../api/framework-conventions/entry.server.tsx +[handleError]: ../api/framework-conventions/entry.server.tsx#handleerror +[entryclient]: ../api/framework-conventions/entry.client.tsx +[hydratedrouter]: ../api/framework-routers/HydratedRouter +[routerprovider]: ../api/data-routers/RouterProvider +[hydratedrouter-onerror]: ../api/framework-routers/HydratedRouter#onError +[routerprovider-onerror]: ../api/data-routers/RouterProvider#onError diff --git a/docs/how-to/react-server-components.md b/docs/how-to/react-server-components.md index 1653d1721a..c86eda8753 100644 --- a/docs/how-to/react-server-components.md +++ b/docs/how-to/react-server-components.md @@ -49,20 +49,12 @@ npx create-react-router@latest --template remix-run/react-router-templates/unsta ### RSC Data Mode Templates -When using RSC Data Mode, you can choose between the Vite and Parcel templates. - The [Vite RSC Data Mode template][vite-rsc-template] uses the experimental Vite `@vitejs/plugin-rsc` plugin. ```shellscript npx create-react-router@latest --template remix-run/react-router-templates/unstable_rsc-data-mode-vite ``` -The [Parcel RSC Data Mode template][parcel-rsc-template] uses the official React `react-server-dom-parcel` plugin. - -```shellscript -npx create-react-router@latest --template remix-run/react-router-templates/unstable_rsc-data-mode-parcel -``` - ## RSC Framework Mode Most APIs and features in RSC Framework Mode are the same as non-RSC Framework Mode, so this guide will focus on the differences. @@ -274,6 +266,100 @@ MDX routes are supported in RSC Framework Mode when using `@mdx-js/rollup` v3.1. Note that any components exported from an MDX route must also be valid in RSC environments, meaning that they cannot use client-only features like [Hooks][hooks]. Any components that need to use these features should be extracted into a [client module][use-client-docs]. +### Custom Entry Files + +RSC Framework Mode supports custom entry files, allowing you to customize the behavior of the RSC server, SSR server, and client entry points. + +The plugin will automatically detect custom entry files in your `app` directory: + +- `app/entry.rsc.ts` (or `.tsx`) - Custom RSC server entry +- `app/entry.ssr.ts` (or `.tsx`) - Custom SSR server entry +- `app/entry.client.tsx` - Custom client entry + +If these files are not found, React Router will use the default entries provided by the framework. + +#### Basic Override Pattern + +You can create a custom entry file that wraps or extends the default behavior. For example, to add custom logging to the RSC entry: + +```ts filename=app/entry.rsc.ts +import defaultEntry from "@react-router/dev/config/default-rsc-entries/entry.rsc"; +import { RouterContextProvider } from "react-router"; + +export default { + fetch(request: Request): Promise { + console.log( + "Custom RSC entry handling request:", + request.url, + ); + + const requestContext = new RouterContextProvider(); + + return defaultEntry.fetch(request, requestContext); + }, +}; + +if (import.meta.hot) { + import.meta.hot.accept(); +} +``` + +Similarly, you can customize the SSR entry: + +```ts filename=app/entry.ssr.ts +import { generateHTML as defaultGenerateHTML } from "@react-router/dev/config/default-rsc-entries/entry.ssr"; + +export function generateHTML( + request: Request, + serverResponse: Response, +): Promise { + console.log( + "Custom SSR entry generating HTML for:", + request.url, + ); + + return defaultGenerateHTML(request, serverResponse); +} +``` + +And for the client: + +```ts filename=app/entry.client.ts +import "@react-router/dev/config/default-rsc-entries/entry.client"; +``` + +#### Copying Default Entries + +For more advanced customization, you can copy the default entries and modify them as needed. To find the default entries: + +1. In your IDE, use "Go to Definition" (or Cmd/Ctrl+Click) on the default entry import: + + ```ts + import defaultEntry from "@react-router/dev/config/default-rsc-entries/entry.rsc"; + ``` + +2. Copy the default entry code into your custom file + +3. Modify it to suit your needs + +The default entries are located at: + +- [`@react-router/dev/config/default-rsc-entries/entry.rsc`][entry-rsc-source] +- [`@react-router/dev/config/default-rsc-entries/entry.ssr`][entry-ssr-source] +- [`@react-router/dev/config/default-rsc-entries/entry.client`][entry-client-source] + +You can view the source code on GitHub using the links above, or navigate directly to these files in `node_modules/@react-router/dev/dist/config/default-rsc-entries/`. + + + +When copying default entries, make sure to maintain the required exports: + +- `entry.rsc.ts` must export a default object with a `fetch` method +- `entry.ssr.ts` must export a `generateHTML` function +- `entry.client.tsx` should handle client-side hydration + + + ### Unsupported Config Options For the initial unstable release, the following options from `react-router.config.ts` are not yet supported in RSC Framework Mode: @@ -287,8 +373,6 @@ For the initial unstable release, the following options from `react-router.confi - `future.v8_splitRouteModules` - `future.unstable_subResourceIntegrity` -Custom build entry files are also not yet supported. - ## RSC Data Mode The RSC Framework Mode APIs described above are built on top of lower-level RSC Data Mode APIs. @@ -545,252 +629,6 @@ Relevant APIs: - [`getRSCStream`][get-rsc-stream] - [`RSCHydratedRouter`][rsc-hydrated-router] -### Parcel - -See the [Parcel RSC docs][parcel-rsc-doc] for more information. You can also refer to our [Parcel RSC Data Mode template][parcel-rsc-template] to see a working version. - -In addition to `react`, `react-dom`, and `react-router`, you'll need the following dependencies: - -```shellscript -# install runtime dependencies -npm i @parcel/runtime-rsc react-server-dom-parcel - -# install dev dependencies -npm i -D parcel -``` - -#### `package.json` - -To configure Parcel, add the following to your `package.json`: - -```json filename=package.json -{ - "scripts": { - "build": "parcel build --no-autoinstall", - "dev": "cross-env NODE_ENV=development parcel --no-autoinstall --no-cache", - "start": "cross-env NODE_ENV=production node dist/server/entry.rsc.js" - }, - "targets": { - "react-server": { - "context": "react-server", - "source": "src/entry.rsc.tsx", - "scopeHoist": false, - "includeNodeModules": { - "@remix-run/node-fetch-server": false, - "compression": false, - "express": false - } - } - } -} -``` - -#### `routes/config.ts` - -You must add `"use server-entry"` to the top of the file where you define your routes. Additionally, you need to import the client entry point, since it will use the `"use client-entry"` directive (see below). - -```tsx filename=src/routes/config.ts -"use server-entry"; - -import type { unstable_RSCRouteConfig as RSCRouteConfig } from "react-router"; - -import "../entry.browser"; - -// This needs to be a function so Parcel can add a `bootstrapScript` property. -export function routes() { - return [ - { - id: "root", - path: "", - lazy: () => import("./root/route"), - children: [ - { - id: "home", - index: true, - lazy: () => import("./home/route"), - }, - { - id: "about", - path: "about", - lazy: () => import("./about/route"), - }, - ], - }, - ] satisfies RSCRouteConfig; -} -``` - -#### `entry.ssr.tsx` - -The following is a simplified example of a Parcel SSR Server. - -```tsx filename=src/entry.ssr.tsx -import { renderToReadableStream as renderHTMLToReadableStream } from "react-dom/server.edge"; -import { - unstable_routeRSCServerRequest as routeRSCServerRequest, - unstable_RSCStaticRouter as RSCStaticRouter, -} from "react-router"; -import { createFromReadableStream } from "react-server-dom-parcel/client.edge"; - -export async function generateHTML( - request: Request, - fetchServer: (request: Request) => Promise, - bootstrapScriptContent: string | undefined, -): Promise { - return await routeRSCServerRequest({ - // The incoming request. - request, - // How to call the React Server. - fetchServer, - // Provide the React Server touchpoints. - createFromReadableStream, - // Render the router to HTML. - async renderHTML(getPayload) { - const payload = getPayload(); - - return await renderHTMLToReadableStream( - , - { - bootstrapScriptContent, - formState: await payload.formState, - }, - ); - }, - }); -} -``` - -#### `entry.rsc.tsx` - -The following is a simplified example of a Parcel RSC Server. - -```tsx filename=src/entry.rsc.tsx -import { createRequestListener } from "@remix-run/node-fetch-server"; -import express from "express"; -import { unstable_matchRSCServerRequest as matchRSCServerRequest } from "react-router"; -import { - createTemporaryReferenceSet, - decodeAction, - decodeFormState, - decodeReply, - loadServerAction, - renderToReadableStream, -} from "react-server-dom-parcel/server.edge"; - -// Import the generateHTML function from the react-client environment -import { generateHTML } from "./entry.ssr" with { env: "react-client" }; -import { routes } from "./routes/config"; - -function fetchServer(request: Request) { - return matchRSCServerRequest({ - // Provide the React Server touchpoints. - createTemporaryReferenceSet, - decodeAction, - decodeFormState, - decodeReply, - loadServerAction, - // The incoming request. - request, - // The app routes. - routes: routes(), - // Encode the match with the React Server implementation. - generateResponse(match) { - return new Response( - renderToReadableStream(match.payload), - { - status: match.statusCode, - headers: match.headers, - }, - ); - }, - }); -} - -const app = express(); - -// Serve static assets with compression and long cache lifetime. -app.use( - "/client", - compression(), - express.static("dist/client", { - immutable: true, - maxAge: "1y", - }), -); -// Hook up our application. -app.use( - createRequestListener((request) => - generateHTML( - request, - fetchServer, - (routes as unknown as { bootstrapScript?: string }) - .bootstrapScript, - ), - ), -); - -app.listen(3000, () => { - console.log("Server listening on port 3000"); -}); -``` - -#### `entry.browser.tsx` - -```tsx filename=src/entry.browser.tsx -"use client-entry"; - -import { startTransition, StrictMode } from "react"; -import { hydrateRoot } from "react-dom/client"; -import { - unstable_createCallServer as createCallServer, - unstable_getRSCStream as getRSCStream, - unstable_RSCHydratedRouter as RSCHydratedRouter, - type unstable_RSCPayload as RSCServerPayload, -} from "react-router"; -import { - createFromReadableStream, - createTemporaryReferenceSet, - encodeReply, - setServerCallback, -} from "react-server-dom-parcel/client"; - -// Create and set the callServer function to support post-hydration server actions. -setServerCallback( - createCallServer({ - createFromReadableStream, - createTemporaryReferenceSet, - encodeReply, - }), -); - -// Get and decode the initial server payload. -createFromReadableStream(getRSCStream()).then( - (payload: RSCServerPayload) => { - startTransition(async () => { - const formState = - payload.type === "render" - ? await payload.formState - : undefined; - - hydrateRoot( - document, - - - , - { - formState, - }, - ); - }); - }, -); -``` - ### Vite See the [@vitejs/plugin-rsc docs][vite-plugin-rsc] for more information. You can also refer to our [Vite RSC Data Mode template][vite-rsc-template] to see a working version. @@ -864,13 +702,13 @@ import { export async function generateHTML( request: Request, - fetchServer: (request: Request) => Promise, + serverResponse: Response, ): Promise { return await routeRSCServerRequest({ // The incoming request. request, - // How to call the React Server. - fetchServer, + // The React Server response + serverResponse, // Provide the React Server touchpoints. createFromReadableStream, // Render the router to HTML. @@ -942,7 +780,10 @@ export default async function handler(request: Request) { typeof import("./entry.ssr") >("ssr", "index"); - return ssr.generateHTML(request, fetchServer); + return ssr.generateHTML( + request, + await fetchServer(request), + ); } ``` @@ -1009,7 +850,6 @@ createFromReadableStream( [route-module]: ../start/framework/route-module [framework-mode]: ../start/modes#framework [custom-framework]: ../start/data/custom -[parcel-rsc-doc]: https://parceljs.org/recipes/rsc/ [vite-plugin-rsc]: https://github.com/vitejs/vite-plugin-react/tree/main/packages/plugin-rsc [match-rsc-server-request]: ../api/rsc/matchRSCServerRequest [route-rsc-server-request]: ../api/rsc/routeRSCServerRequest @@ -1020,7 +860,6 @@ createFromReadableStream( [express]: https://expressjs.com/ [node-fetch-server]: https://www.npmjs.com/package/@remix-run/node-fetch-server [framework-rsc-template]: https://github.com/remix-run/react-router-templates/tree/main/unstable_rsc-framework-mode -[parcel-rsc-template]: https://github.com/remix-run/react-router-templates/tree/main/unstable_rsc-data-mode-parcel [vite-rsc-template]: https://github.com/remix-run/react-router-templates/tree/main/unstable_rsc-data-mode-vite [node-request-listener]: https://nodejs.org/api/http.html#httpcreateserveroptions-requestlistener [hooks]: https://react.dev/reference/react/hooks @@ -1029,3 +868,6 @@ createFromReadableStream( [client-modules]: ../api/framework-conventions/client-modules [server-only-package]: https://www.npmjs.com/package/server-only [client-only-package]: https://www.npmjs.com/package/client-only +[entry-rsc-source]: https://github.com/remix-run/react-router/blob/main/packages/react-router-dev/config/default-rsc-entries/entry.rsc.tsx +[entry-ssr-source]: https://github.com/remix-run/react-router/blob/main/packages/react-router-dev/config/default-rsc-entries/entry.ssr.tsx +[entry-client-source]: https://github.com/remix-run/react-router/blob/main/packages/react-router-dev/config/default-rsc-entries/entry.client.tsx diff --git a/examples/basic-data-router/package.json b/examples/basic-data-router/package.json index bd01216d91..16b1f79cb7 100644 --- a/examples/basic-data-router/package.json +++ b/examples/basic-data-router/package.json @@ -7,8 +7,8 @@ "serve": "vite preview" }, "dependencies": { - "react": "18.2.0", - "react-dom": "18.2.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", "react-router-dom": "^6.15.0" }, "devDependencies": { diff --git a/examples/data-router/package.json b/examples/data-router/package.json index d52e0bd413..bc37b28105 100644 --- a/examples/data-router/package.json +++ b/examples/data-router/package.json @@ -7,8 +7,8 @@ "serve": "vite preview" }, "dependencies": { - "react": "18.2.0", - "react-dom": "18.2.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", "react-router-dom": "^6.15.0" }, "devDependencies": { diff --git a/examples/navigation-blocking/package.json b/examples/navigation-blocking/package.json index b1b3d93883..5085e825e4 100644 --- a/examples/navigation-blocking/package.json +++ b/examples/navigation-blocking/package.json @@ -7,8 +7,8 @@ "serve": "vite preview" }, "dependencies": { - "react": "18.2.0", - "react-dom": "18.2.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", "react-router-dom": "^6.21.0" }, "devDependencies": { diff --git a/examples/view-transitions/package.json b/examples/view-transitions/package.json index 6173270bae..239c773d3e 100644 --- a/examples/view-transitions/package.json +++ b/examples/view-transitions/package.json @@ -7,8 +7,8 @@ "serve": "vite preview" }, "dependencies": { - "react": "18.2.0", - "react-dom": "18.2.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", "react-router-dom": "6.17.0-pre.2" }, "devDependencies": { diff --git a/integration/browser-entry-test.ts b/integration/browser-entry-test.ts index 5171b7bd93..ad984fd43d 100644 --- a/integration/browser-entry-test.ts +++ b/integration/browser-entry-test.ts @@ -146,7 +146,7 @@ test("allows users to pass an onError function to HydratedRouter", async ({ document, { + onError={(error, errorInfo) => { console.log(error.message, JSON.stringify(errorInfo)) }} /> diff --git a/integration/client-data-test.ts b/integration/client-data-test.ts index 99dfb6e5bd..a3938ea43c 100644 --- a/integration/client-data-test.ts +++ b/integration/client-data-test.ts @@ -1234,11 +1234,14 @@ test.describe("Client Data", () => { test("bubbled server loader errors are persisted for hydrating routes", async ({ page, }) => { + // test.skip(browserName === "firefox", "this test fails there due to extra debug logs.") let _consoleError = console.error; console.error = () => {}; let app = new PlaywrightFixture(appFixture, page); let logs: string[] = []; page.on("console", (msg) => { + if (msg.type() === "timeStamp") return; + let text = msg.text(); if ( // Chrome logs the 500 as a console error, so skip that since it's not diff --git a/integration/helpers/cloudflare-dev-proxy-template/package.json b/integration/helpers/cloudflare-dev-proxy-template/package.json index e0924047e4..a4d86f16a1 100644 --- a/integration/helpers/cloudflare-dev-proxy-template/package.json +++ b/integration/helpers/cloudflare-dev-proxy-template/package.json @@ -14,8 +14,8 @@ "@react-router/cloudflare": "workspace:*", "isbot": "^4.1.0", "miniflare": "^3.20250214.0", - "react": "^19.1.0", - "react-dom": "^19.1.0", + "react": "catalog:", + "react-dom": "catalog:", "react-router": "workspace:*" }, "devDependencies": { @@ -23,9 +23,9 @@ "@react-router/dev": "workspace:*", "@react-router/fs-routes": "workspace:*", "@react-router/remix-routes-option-adapter": "workspace:*", - "@types/react": "^18.2.20", - "@types/react-dom": "^18.2.7", - "typescript": "^5.1.6", + "@types/react": "catalog:", + "@types/react-dom": "catalog:", + "typescript": "catalog:", "vite": "^6.3.0", "wrangler": "^4.23.0" }, diff --git a/integration/helpers/create-fixture.ts b/integration/helpers/create-fixture.ts index c84bf34b48..121cb96969 100644 --- a/integration/helpers/create-fixture.ts +++ b/integration/helpers/create-fixture.ts @@ -199,7 +199,7 @@ export async function createFixture(init: FixtureInit, mode?: ServerMode) { type RequestHandler = (request: Request) => Promise; let handler: RequestHandler; if (templateName === "rsc-vite-framework") { - handler = (await import(buildPath)).default; + handler = (await import(buildPath))?.default?.fetch; if (typeof handler !== "function") { throw new Error( "Expected a default request handler function export in Vite RSC Framework Mode server build", @@ -477,56 +477,16 @@ export async function createFixtureProject( projectDir, ); - if (templateName.includes("parcel")) { - parcelBuild(projectDir, init.buildStdio, mode); - } else { - reactRouterBuild( - projectDir, - init.buildStdio, - mode, - templateName.includes("rsc"), - ); - } + reactRouterBuild( + projectDir, + init.buildStdio, + mode, + templateName.includes("rsc"), + ); return projectDir; } -function parcelBuild( - projectDir: string, - buildStdio?: Writable, - mode?: ServerMode, -) { - let parcelBin = "node_modules/parcel/lib/bin.js"; - - let buildArgs: string[] = [parcelBin, "build", "--no-cache"]; - - let buildSpawn = spawnSync("node", buildArgs, { - cwd: projectDir, - env: { - ...process.env, - NODE_ENV: mode || ServerMode.Production, - }, - }); - - // These logs are helpful for debugging. Remove comments if needed. - // console.log("spawning node " + buildArgs.join(" ") + ":\n"); - // console.log(" STDOUT:"); - // console.log(" " + buildSpawn.stdout.toString("utf-8")); - // console.log(" STDERR:"); - // console.log(" " + buildSpawn.stderr.toString("utf-8")); - - if (buildStdio) { - buildStdio.write(buildSpawn.stdout.toString("utf-8")); - buildStdio.write(buildSpawn.stderr.toString("utf-8")); - buildStdio.end(); - } - - if (buildSpawn.error || buildSpawn.status) { - console.error(buildSpawn.stderr.toString("utf-8")); - throw buildSpawn.error || new Error(`Build failed, check the output above`); - } -} - function reactRouterBuild( projectDir: string, buildStdio?: Writable, diff --git a/integration/helpers/express.ts b/integration/helpers/express.ts index ff6268c450..b50523ea3b 100644 --- a/integration/helpers/express.ts +++ b/integration/helpers/express.ts @@ -57,7 +57,7 @@ export function rsc() { "/assets", express.static("build/client/assets", { immutable: true, maxAge: "1y" }) ); - app.all("*", createRequestListener((await import("./build/server/index.js")).default)); + app.all("*", createRequestListener((await import("./build/server/index.js")).default.fetch)); } else { const viteDevServer = await import("vite").then( (vite) => vite.createServer({ diff --git a/integration/helpers/rsc-parcel/.gitignore b/integration/helpers/rsc-parcel/.gitignore deleted file mode 100644 index 77738287f0..0000000000 --- a/integration/helpers/rsc-parcel/.gitignore +++ /dev/null @@ -1 +0,0 @@ -dist/ \ No newline at end of file diff --git a/integration/helpers/rsc-parcel/package.json b/integration/helpers/rsc-parcel/package.json deleted file mode 100644 index 95f902360b..0000000000 --- a/integration/helpers/rsc-parcel/package.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "name": "integration-rsc-parcel", - "version": "0.0.0", - "private": true, - "targets": { - "server": { - "context": "react-server", - "source": "src/server.tsx", - "scopeHoist": false, - "includeNodeModules": { - "express": false - } - } - }, - "scripts": { - "dev": "parcel --no-cache", - "build": "parcel build --no-cache", - "start": "cross-env NODE_ENV=production node dist/server/server.js", - "typecheck": "tsc" - }, - "devDependencies": { - "@parcel/packager-react-static": "2.15.0", - "@parcel/transformer-react-static": "2.15.0", - "@types/express": "^5.0.0", - "@types/node": "^22.13.1", - "@types/parcel-env": "0.0.8", - "@types/react-dom": "^19.0.3", - "@types/react": "^19.0.8", - "browserify-zlib": "^0.2.0", - "buffer": "^5.5.0||^6.0.0", - "events": "^3.1.0", - "parcel": "2.15.4", - "path-browserify": "^1.0.0", - "querystring-es3": "^0.2.1", - "stream-http": "^3.1.0", - "typescript": "^5.1.6", - "url": "^0.11.0" - }, - "dependencies": { - "@mjackson/node-fetch-server": "0.6.1", - "@parcel/runtime-rsc": "2.15.0", - "cross-env": "^7.0.3", - "express": "^4.21.2", - "react": "^19.1.0", - "react-dom": "^19.1.0", - "react-router": "workspace:*", - "react-server-dom-parcel": "^19.1.2" - } -} diff --git a/integration/helpers/rsc-parcel/public/favicon.ico b/integration/helpers/rsc-parcel/public/favicon.ico deleted file mode 100644 index 5dbdfcddcb..0000000000 Binary files a/integration/helpers/rsc-parcel/public/favicon.ico and /dev/null differ diff --git a/integration/helpers/rsc-parcel/src/browser.tsx b/integration/helpers/rsc-parcel/src/browser.tsx deleted file mode 100644 index 4f7e3d8dfe..0000000000 --- a/integration/helpers/rsc-parcel/src/browser.tsx +++ /dev/null @@ -1,51 +0,0 @@ -"use client-entry"; - -import { startTransition, StrictMode } from "react"; -import { hydrateRoot } from "react-dom/client"; -import { - unstable_createCallServer as createCallServer, - unstable_getRSCStream as getRSCStream, - unstable_RSCHydratedRouter as RSCHydratedRouter, - type unstable_RSCPayload as RSCPayload, -} from "react-router/dom"; -import { - createFromReadableStream, - createTemporaryReferenceSet, - encodeReply, - setServerCallback, - // @ts-expect-error - no types for this yet -} from "react-server-dom-parcel/client"; -import { getContext } from "./config/get-context"; - -// Create and set the callServer function to support post-hydration server actions. -setServerCallback( - createCallServer({ - createFromReadableStream, - createTemporaryReferenceSet, - encodeReply, - }), -); - -// Get and decode the initial server payload -createFromReadableStream(getRSCStream()).then((payload: RSCPayload) => { - // @ts-expect-error - on 18 types, requires 19. - startTransition(async () => { - const formState = - payload.type === "render" ? await payload.formState : undefined; - - hydrateRoot( - document, - - - , - { - // @ts-expect-error - no types for this yet - formState, - }, - ); - }); -}); diff --git a/integration/helpers/rsc-parcel/src/config/basename.ts b/integration/helpers/rsc-parcel/src/config/basename.ts deleted file mode 100644 index 17b384ae41..0000000000 --- a/integration/helpers/rsc-parcel/src/config/basename.ts +++ /dev/null @@ -1,2 +0,0 @@ -// THIS FILE IS DESIGNED TO BE OVERRIDDEN IN TESTS IF NEEDED -export const basename = undefined; diff --git a/integration/helpers/rsc-parcel/src/config/get-context.ts b/integration/helpers/rsc-parcel/src/config/get-context.ts deleted file mode 100644 index 43ad6d9d54..0000000000 --- a/integration/helpers/rsc-parcel/src/config/get-context.ts +++ /dev/null @@ -1,2 +0,0 @@ -// THIS FILE IS DESIGNED TO BE OVERRIDDEN IN TESTS IF NEEDED -export const getContext = undefined; diff --git a/integration/helpers/rsc-parcel/src/config/request-context.ts b/integration/helpers/rsc-parcel/src/config/request-context.ts deleted file mode 100644 index 517ea0e6ef..0000000000 --- a/integration/helpers/rsc-parcel/src/config/request-context.ts +++ /dev/null @@ -1,2 +0,0 @@ -// THIS FILE IS DESIGNED TO BE OVERRIDDEN IN TESTS IF NEEDED -export const requestContext = undefined; diff --git a/integration/helpers/rsc-parcel/src/parcel-entry-wrapper.ts b/integration/helpers/rsc-parcel/src/parcel-entry-wrapper.ts deleted file mode 100644 index 9b9a30eaa8..0000000000 --- a/integration/helpers/rsc-parcel/src/parcel-entry-wrapper.ts +++ /dev/null @@ -1,5 +0,0 @@ -"use server-entry"; - -import "./browser"; - -export function assets() {} diff --git a/integration/helpers/rsc-parcel/src/prerender.tsx b/integration/helpers/rsc-parcel/src/prerender.tsx deleted file mode 100644 index 3d962b3fec..0000000000 --- a/integration/helpers/rsc-parcel/src/prerender.tsx +++ /dev/null @@ -1,35 +0,0 @@ -// @ts-expect-error - no types for this yet -import { renderToReadableStream as renderHTMLToReadableStream } from "react-dom/server.edge"; -import { - unstable_routeRSCServerRequest as routeRSCServerRequest, - unstable_RSCStaticRouter as RSCStaticRouter, -} from "react-router"; -// @ts-expect-error - no types for this yet -import { createFromReadableStream } from "react-server-dom-parcel/client.edge"; - -export async function prerender( - request: Request, - fetchServer: (request: Request) => Promise, - bootstrapScriptContent: string | undefined, -): Promise { - return await routeRSCServerRequest({ - // The incoming request. - request, - // How to fetch from the React Server. - fetchServer, - // Provide the React Server touchpoints. - createFromReadableStream, - // Render the router to HTML. - async renderHTML(getPayload) { - const payload = getPayload(); - - return await renderHTMLToReadableStream( - , - { - bootstrapScriptContent, - formState: await payload.formState, - }, - ); - }, - }); -} diff --git a/integration/helpers/rsc-parcel/src/routes.ts b/integration/helpers/rsc-parcel/src/routes.ts deleted file mode 100644 index 6ea30ad68a..0000000000 --- a/integration/helpers/rsc-parcel/src/routes.ts +++ /dev/null @@ -1,16 +0,0 @@ -import type { unstable_RSCRouteConfig as RSCRouteConfig } from "react-router"; - -export const routes = [ - { - id: "root", - path: "", - lazy: () => import("./routes/root"), - children: [ - { - id: "home", - index: true, - lazy: () => import("./routes/home"), - }, - ], - }, -] satisfies RSCRouteConfig; diff --git a/integration/helpers/rsc-parcel/src/routes/home.tsx b/integration/helpers/rsc-parcel/src/routes/home.tsx deleted file mode 100644 index b5e522802e..0000000000 --- a/integration/helpers/rsc-parcel/src/routes/home.tsx +++ /dev/null @@ -1,3 +0,0 @@ -export default function HomeRoute() { - return

Home

; -} diff --git a/integration/helpers/rsc-parcel/src/routes/root.tsx b/integration/helpers/rsc-parcel/src/routes/root.tsx deleted file mode 100644 index 1482b6c0a6..0000000000 --- a/integration/helpers/rsc-parcel/src/routes/root.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import { Links, Outlet, ScrollRestoration } from "react-router"; - -export function Layout({ children }: { children: React.ReactNode }) { - return ( - - - - - Parcel (RSC) - - - - {children} - - - - ); -} - -export default function ServerComponent() { - return ; -} diff --git a/integration/helpers/rsc-parcel/src/server.tsx b/integration/helpers/rsc-parcel/src/server.tsx deleted file mode 100644 index a5684ffd7f..0000000000 --- a/integration/helpers/rsc-parcel/src/server.tsx +++ /dev/null @@ -1,83 +0,0 @@ -import { parseArgs } from "node:util"; -import { createRequestListener } from "@mjackson/node-fetch-server"; -import express from "express"; -import { unstable_matchRSCServerRequest as matchRSCServerRequest } from "react-router"; -import { - createTemporaryReferenceSet, - decodeAction, - decodeFormState, - decodeReply, - loadServerAction, - renderToReadableStream, - // @ts-expect-error - no types for this yet -} from "react-server-dom-parcel/server.edge"; - -// Import the prerender function from the client environment -import { prerender } from "./prerender" with { env: "react-client" }; -import { routes } from "./routes"; -import { assets } from "./parcel-entry-wrapper"; -import { basename } from "./config/basename"; -import { requestContext } from "./config/request-context"; - -function fetchServer(request: Request) { - return matchRSCServerRequest({ - // Provide the React Server touchpoints. - createTemporaryReferenceSet, - decodeReply, - decodeAction, - decodeFormState, - loadServerAction, - // The incoming request. - request, - requestContext, - // The app routes. - routes, - basename, - // Encode the match with the React Server implementation. - generateResponse(match, options) { - return new Response(renderToReadableStream(match.payload, options), { - status: match.statusCode, - headers: match.headers, - }); - }, - }); -} - -const app = express(); - -// Serve static assets with compression and long cache lifetime. -app.use( - "/client", - express.static("dist/client", { - immutable: true, - maxAge: "1y", - }), -); -app.use(express.static("public")); - -// Ignore Chrome extension requests. -app.get("/.well-known/appspecific/com.chrome.devtools.json", (_, res) => { - res.status(404); - res.end(); -}); - -// Hookup our application. -app.use( - createRequestListener((request) => - prerender( - request, - fetchServer, - (assets as unknown as { bootstrapScript?: string }).bootstrapScript, - ), - ), -); - -const { values } = parseArgs({ - options: { p: { type: "string", default: process.env.RR_PORT || "3000" } }, - allowPositionals: true, -}); - -const port = parseInt(values.p, 10); -app.listen(port, () => { - console.log(`Server started on http://localhost:${port}`); -}); diff --git a/integration/helpers/rsc-parcel/tsconfig.json b/integration/helpers/rsc-parcel/tsconfig.json deleted file mode 100644 index 009d4507cf..0000000000 --- a/integration/helpers/rsc-parcel/tsconfig.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "compilerOptions": { - "strict": true, - "jsx": "react-jsx", - "allowSyntheticDefaultImports": true, - "moduleResolution": "bundler", - "module": "esnext", - "isolatedModules": true, - "esModuleInterop": true, - "target": "es2022", - "noEmit": true - } -} diff --git a/integration/helpers/rsc-vite-framework/package.json b/integration/helpers/rsc-vite-framework/package.json index 34ddd12805..f954906566 100644 --- a/integration/helpers/rsc-vite-framework/package.json +++ b/integration/helpers/rsc-vite-framework/package.json @@ -16,14 +16,14 @@ "@react-router/fs-routes": "workspace:*", "@types/express": "^5.0.0", "@types/node": "^22.13.1", - "@types/react": "^19.1.8", - "@types/react-dom": "^19.1.6", + "@types/react": "catalog:react-canary", + "@types/react-dom": "catalog:react-canary", "@vanilla-extract/css": "^1.17.4", "@vanilla-extract/vite-plugin": "^5.1.1", "@vitejs/plugin-react": "^4.5.2", - "@vitejs/plugin-rsc": "0.4.30", + "@vitejs/plugin-rsc": "catalog:", "cross-env": "^7.0.3", - "typescript": "^5.1.6", + "typescript": "catalog:", "vite": "^6.3.0", "vite-env-only": "^3.0.1", "vite-tsconfig-paths": "^4.2.1" @@ -31,10 +31,11 @@ "dependencies": { "@mjackson/node-fetch-server": "0.6.1", "@react-router/serve": "workspace:*", - "compression": "^1.8.0", + "compression": "^1.8.1", "express": "^4.21.2", - "react": "^19.0.0", - "react-dom": "^19.0.0", - "react-router": "workspace:*" + "react": "catalog:react-canary", + "react-dom": "catalog:react-canary", + "react-router": "workspace:*", + "react-server-dom-webpack": "catalog:react-canary" } } diff --git a/integration/helpers/rsc-vite-framework/start.js b/integration/helpers/rsc-vite-framework/start.js index 0b15c2359f..45fec2a637 100644 --- a/integration/helpers/rsc-vite-framework/start.js +++ b/integration/helpers/rsc-vite-framework/start.js @@ -1,6 +1,6 @@ import { createRequestListener } from "@mjackson/node-fetch-server"; import express from "express"; -import reactRouterRequestHandler from "./build/server/index.js"; +import build from "./build/server/index.js"; const app = express(); @@ -11,7 +11,7 @@ app.get("/.well-known/appspecific/com.chrome.devtools.json", (_, res) => { res.send("Not Found"); }); -app.use(createRequestListener(reactRouterRequestHandler)); +app.use(createRequestListener(build.fetch)); const port = process.env.PORT || 3000; app.listen(port); diff --git a/integration/helpers/rsc-vite-framework/vite.config.ts b/integration/helpers/rsc-vite-framework/vite.config.ts index 38371adfb6..41793b7754 100644 --- a/integration/helpers/rsc-vite-framework/vite.config.ts +++ b/integration/helpers/rsc-vite-framework/vite.config.ts @@ -3,5 +3,9 @@ import { unstable_reactRouterRSC as reactRouterRSC } from "@react-router/dev/vit import rsc from "@vitejs/plugin-rsc"; export default defineConfig({ - plugins: [reactRouterRSC(), rsc()], + plugins: [ + // @ts-ignore + reactRouterRSC({ __runningWithinTheReactRouterMonoRepo: true }), + rsc(), + ], }); diff --git a/integration/helpers/rsc-vite/package.json b/integration/helpers/rsc-vite/package.json index a60dd4ccee..2531e82cd8 100644 --- a/integration/helpers/rsc-vite/package.json +++ b/integration/helpers/rsc-vite/package.json @@ -10,22 +10,23 @@ "typecheck": "tsc" }, "devDependencies": { - "@vitejs/plugin-rsc": "0.4.30", + "@vitejs/plugin-rsc": "catalog:", "@types/express": "^5.0.0", "@types/node": "^22.13.1", - "@types/react": "^19.1.8", - "@types/react-dom": "^19.1.6", + "@types/react": "catalog:react-canary", + "@types/react-dom": "catalog:react-canary", "@vitejs/plugin-react": "^4.5.2", - "typescript": "^5.1.6", + "typescript": "catalog:", "vite": "^6.3.0" }, "dependencies": { "@mjackson/node-fetch-server": "0.6.1", - "compression": "^1.8.0", + "compression": "^1.8.1", "cross-env": "^7.0.3", "express": "^4.21.2", - "react": "^19.0.0", - "react-dom": "^19.0.0", - "react-router": "workspace:*" + "react": "catalog:react-canary", + "react-dom": "catalog:react-canary", + "react-router": "workspace:*", + "react-server-dom-webpack": "catalog:react-canary" } } diff --git a/integration/helpers/rsc-vite/src/entry.rsc.tsx b/integration/helpers/rsc-vite/src/entry.rsc.tsx index e61290062f..d71ba2e0b9 100644 --- a/integration/helpers/rsc-vite/src/entry.rsc.tsx +++ b/integration/helpers/rsc-vite/src/entry.rsc.tsx @@ -37,5 +37,5 @@ export default async function handler(request: Request) { // eslint-disable-next-line @typescript-eslint/consistent-type-imports typeof import("./entry.ssr") >("ssr", "index"); - return ssr.default(request, fetchServer); + return ssr.default(request, await fetchServer(request)); } diff --git a/integration/helpers/rsc-vite/src/entry.ssr.tsx b/integration/helpers/rsc-vite/src/entry.ssr.tsx index 6f47c70f85..d4a00d2bb2 100644 --- a/integration/helpers/rsc-vite/src/entry.ssr.tsx +++ b/integration/helpers/rsc-vite/src/entry.ssr.tsx @@ -8,20 +8,21 @@ import { export default async function handler( request: Request, - fetchServer: (request: Request) => Promise, + serverResponse: Response, ) { const bootstrapScriptContent = await import.meta.viteRsc.loadBootstrapScriptContent("index"); return routeRSCServerRequest({ request, - fetchServer, + serverResponse, createFromReadableStream, - async renderHTML(getPayload) { + async renderHTML(getPayload, options) { const payload = getPayload(); return ReactDomServer.renderToReadableStream( , { + ...options, bootstrapScriptContent, signal: request.signal, formState: await payload.formState, diff --git a/integration/helpers/templates.ts b/integration/helpers/templates.ts index 6e580c5ba9..640573f917 100644 --- a/integration/helpers/templates.ts +++ b/integration/helpers/templates.ts @@ -7,7 +7,6 @@ const templates = [ // RSC templates { name: "rsc-vite", displayName: "RSC (Vite)" }, - { name: "rsc-parcel", displayName: "RSC (Parcel)" }, { name: "rsc-vite-framework", displayName: "RSC Framework" }, // Cloudflare diff --git a/integration/helpers/vite-5-template/package.json b/integration/helpers/vite-5-template/package.json index 859249cab7..967f896cdb 100644 --- a/integration/helpers/vite-5-template/package.json +++ b/integration/helpers/vite-5-template/package.json @@ -18,8 +18,8 @@ "@vanilla-extract/vite-plugin": "^5.1.1", "express": "^4.19.2", "isbot": "^5.1.11", - "react": "^19.1.0", - "react-dom": "^19.1.0", + "react": "catalog:", + "react-dom": "catalog:", "react-router": "workspace:*", "serialize-javascript": "^6.0.1" }, @@ -27,10 +27,10 @@ "@react-router/dev": "workspace:*", "@react-router/fs-routes": "workspace:*", "@react-router/remix-routes-option-adapter": "workspace:*", - "@types/react": "^18.2.20", - "@types/react-dom": "^18.2.7", + "@types/react": "catalog:", + "@types/react-dom": "catalog:", "eslint": "^8.38.0", - "typescript": "^5.1.6", + "typescript": "catalog:", "vite": "^5.1.0", "vite-env-only": "^3.0.1", "vite-tsconfig-paths": "^4.2.1" diff --git a/integration/helpers/vite-6-template/package.json b/integration/helpers/vite-6-template/package.json index 71fee2d06f..542fb20df4 100644 --- a/integration/helpers/vite-6-template/package.json +++ b/integration/helpers/vite-6-template/package.json @@ -18,8 +18,8 @@ "@vanilla-extract/vite-plugin": "^5.1.1", "express": "^4.19.2", "isbot": "^5.1.11", - "react": "^19.1.0", - "react-dom": "^19.1.0", + "react": "catalog:", + "react-dom": "catalog:", "react-router": "workspace:*", "serialize-javascript": "^6.0.1" }, @@ -27,10 +27,10 @@ "@react-router/dev": "workspace:*", "@react-router/fs-routes": "workspace:*", "@react-router/remix-routes-option-adapter": "workspace:*", - "@types/react": "^18.2.20", - "@types/react-dom": "^18.2.7", + "@types/react": "catalog:", + "@types/react-dom": "catalog:", "eslint": "^8.38.0", - "typescript": "^5.1.6", + "typescript": "catalog:", "vite": "^6.3.0", "vite-env-only": "^3.0.1", "vite-tsconfig-paths": "^4.2.1" diff --git a/integration/helpers/vite-7-beta-template/package.json b/integration/helpers/vite-7-beta-template/package.json index f0b9b5ce3f..904d0ec8e5 100644 --- a/integration/helpers/vite-7-beta-template/package.json +++ b/integration/helpers/vite-7-beta-template/package.json @@ -18,8 +18,8 @@ "@vanilla-extract/vite-plugin": "^5.1.1", "express": "^4.19.2", "isbot": "^5.1.11", - "react": "^19.1.0", - "react-dom": "^19.1.0", + "react": "catalog:", + "react-dom": "catalog:", "react-router": "workspace:*", "serialize-javascript": "^6.0.1" }, @@ -27,10 +27,10 @@ "@react-router/dev": "workspace:*", "@react-router/fs-routes": "workspace:*", "@react-router/remix-routes-option-adapter": "workspace:*", - "@types/react": "^18.2.20", - "@types/react-dom": "^18.2.7", + "@types/react": "catalog:", + "@types/react-dom": "catalog:", "eslint": "^8.38.0", - "typescript": "^5.1.6", + "typescript": "catalog:", "vite": "7.0.0-beta.0", "vite-env-only": "^3.0.1", "vite-tsconfig-paths": "^4.2.1" diff --git a/integration/helpers/vite-plugin-cloudflare-template/package.json b/integration/helpers/vite-plugin-cloudflare-template/package.json index 2f7e498957..e7c1bcaf4a 100644 --- a/integration/helpers/vite-plugin-cloudflare-template/package.json +++ b/integration/helpers/vite-plugin-cloudflare-template/package.json @@ -13,8 +13,8 @@ "dependencies": { "express": "^4.19.2", "isbot": "^5.1.11", - "react": "^19.1.0", - "react-dom": "^19.1.0", + "react": "catalog:", + "react-dom": "catalog:", "react-router": "workspace:*", "serialize-javascript": "^6.0.1" }, @@ -23,10 +23,10 @@ "@react-router/dev": "workspace:*", "@react-router/fs-routes": "workspace:*", "@types/node": "^20.0.0", - "@types/react": "^18.2.20", - "@types/react-dom": "^18.2.7", + "@types/react": "catalog:", + "@types/react-dom": "catalog:", "eslint": "^8.38.0", - "typescript": "^5.1.6", + "typescript": "catalog:", "vite": "^6.3.0", "vite-tsconfig-paths": "^4.2.1", "wrangler": "^4.23.0" diff --git a/integration/helpers/vite-rolldown-template/package.json b/integration/helpers/vite-rolldown-template/package.json index d02d6f0012..af6d9ad10c 100644 --- a/integration/helpers/vite-rolldown-template/package.json +++ b/integration/helpers/vite-rolldown-template/package.json @@ -18,8 +18,8 @@ "@vanilla-extract/vite-plugin": "^5.1.1", "express": "^4.19.2", "isbot": "^5.1.11", - "react": "^19.1.0", - "react-dom": "^19.1.0", + "react": "catalog:", + "react-dom": "catalog:", "react-router": "workspace:*", "serialize-javascript": "^6.0.1" }, @@ -27,11 +27,11 @@ "@react-router/dev": "workspace:*", "@react-router/fs-routes": "workspace:*", "@react-router/remix-routes-option-adapter": "workspace:*", - "@types/react": "^18.2.20", - "@types/react-dom": "^18.2.7", + "@types/react": "catalog:", + "@types/react-dom": "catalog:", "cross-env": "^7.0.3", "eslint": "^8.38.0", - "typescript": "^5.1.6", + "typescript": "catalog:", "vite": "npm:rolldown-vite@6.3.0-beta.5", "vite-env-only": "^3.0.1", "vite-tsconfig-paths": "^4.2.1" diff --git a/integration/helpers/vite.ts b/integration/helpers/vite.ts index bd3a89aecd..9ad644d43b 100644 --- a/integration/helpers/vite.ts +++ b/integration/helpers/vite.ts @@ -153,7 +153,7 @@ export const viteConfig = { plugins: [ ${args.mdx ? "mdx()," : ""} ${args.vanillaExtract ? "vanillaExtractPlugin({ emitCssInSsr: true })," : ""} - ${isRsc ? "reactRouterRSC()," : "reactRouter(),"} + ${isRsc ? " reactRouterRSC({ __runningWithinTheReactRouterMonoRepo: true })," : "reactRouter(),"} ${isRsc ? "rsc()," : ""} envOnlyMacros(), tsconfigPaths() @@ -185,7 +185,7 @@ export const EXPRESS_SERVER = (args: { }, }) ); - const app = express(); + const app = express(); ${args?.customLogic || ""} @@ -259,7 +259,7 @@ type FrameworkModeCloudflareTemplateName = | "cloudflare-dev-proxy-template" | "vite-plugin-cloudflare-template"; -export type RscBundlerTemplateName = "rsc-vite" | "rsc-parcel"; +export type RscBundlerTemplateName = "rsc-vite"; export type TemplateName = | FrameworkModeViteMajorTemplateName @@ -282,7 +282,6 @@ export const viteMajorTemplates = [ export const rscBundlerTemplates = [ { templateName: "rsc-vite", templateDisplayName: "RSC (Vite)" }, - { templateName: "rsc-parcel", templateDisplayName: "RSC (Parcel)" }, ] as const satisfies Array<{ templateName: RscBundlerTemplateName; templateDisplayName: string; @@ -413,6 +412,28 @@ export const createDev = export const dev = createDev([reactRouterBin, "dev"]); export const customDev = createDev(["./server.mjs"]); +export const vitePreview = async ({ + cwd, + port, +}: { + cwd: string; + port: number; +}) => { + let nodeBin = process.argv[0]; + let viteBin = path.join(cwd, "node_modules", "vite", "bin", "vite.js"); + let proc = spawn( + nodeBin, + [viteBin, "preview", "--port", String(port), "--strict-port"], + { + cwd, + stdio: "pipe", + env: { NODE_ENV: "production" }, + }, + ); + await waitForServer(proc, { port }); + return () => proc.kill(); +}; + // Used for testing errors thrown on build when we don't want to start and // wait for the server export const viteDevCmd = ({ cwd }: { cwd: string }) => { @@ -450,6 +471,13 @@ type Fixtures = { port: number; cwd: string; }>; + vitePreview: ( + files: Files, + templateName?: TemplateName, + ) => Promise<{ + port: number; + cwd: string; + }>; wranglerPagesDev: (files: Files) => Promise<{ port: number; cwd: string; @@ -497,6 +525,18 @@ export const test = base.extend({ }); stop?.(); }, + vitePreview: async ({}, use) => { + let stop: (() => unknown) | undefined; + await use(async (files, template) => { + let port = await getPort(); + let cwd = await createProject(await files({ port }), template); + let { status } = build({ cwd }); + expect(status).toBe(0); + stop = await vitePreview({ cwd, port }); + return { port, cwd }; + }); + stop?.(); + }, // eslint-disable-next-line no-empty-pattern wranglerPagesDev: async ({}, use) => { let stop: (() => unknown) | undefined; diff --git a/integration/link-test.ts b/integration/link-test.ts index 227df7b72c..bf4db88f46 100644 --- a/integration/link-test.ts +++ b/integration/link-test.ts @@ -618,7 +618,17 @@ test.describe("route module link export", () => { let app = new PlaywrightFixture(appFixture, page); await app.goto("/"); let scripts = await page.$$("script"); - expect(scripts.length).toEqual(6); + + // Scripts: + // RR: window.__reactRouterContext + // RR: window.__reactRouterManifest/window.__reactRouterRouteModules + // React: requestAnimationFrame(function(){$RT=performance.now()}); + // RR: window.__reactRouterContext.streamController.enqueue() + // React: $RC=function(b,c,e){... + // RR: window.__reactRouterContext.streamController.close(); + // React: $RC("B:1","S:1") + expect(scripts.length).toEqual(7); + expect(await scripts[0].innerText()).toContain( "__reactRouterContext", ); diff --git a/integration/package.json b/integration/package.json index 7870ece8b3..1f124b06b7 100644 --- a/integration/package.json +++ b/integration/package.json @@ -34,8 +34,8 @@ "postcss": "^8.4.19", "postcss-import": "^15.1.0", "prettier": "^3.6.2", - "react": "^19.1.0", - "react-dom": "^19.1.0", + "react": "catalog:", + "react-dom": "catalog:", "react-router": "workspace:*", "semver": "^7.7.2", "serialize-javascript": "^6.0.1", @@ -43,7 +43,7 @@ "strip-ansi": "^6.0.1", "strip-indent": "^3.0.0", "type-fest": "^4.0.0", - "typescript": "^5.1.0", + "typescript": "catalog:", "vite": "^6.3.0", "vite-env-only": "^3.0.1", "vite-tsconfig-paths": "^4.2.2", diff --git a/integration/rsc/rsc-nojs-test.ts b/integration/rsc/rsc-nojs-test.ts index 0638a27e59..1500bcea4b 100644 --- a/integration/rsc/rsc-nojs-test.ts +++ b/integration/rsc/rsc-nojs-test.ts @@ -3,8 +3,6 @@ import getPort from "get-port"; import { implementations, js, setupRscTest, validateRSCHtml } from "./utils"; -test.use({ javaScriptEnabled: false }); - implementations.forEach((implementation) => { test.describe(`RSC nojs (${implementation.name})`, () => { let port: number; @@ -20,6 +18,34 @@ implementations.forEach((implementation) => { implementation, port, files: { + "src/routes.ts": js` + import type { unstable_RSCRouteConfig as RSCRouteConfig } from "react-router"; + + export const routes = [ + { + id: "root", + path: "", + lazy: () => import("./routes/root"), + children: [ + { + id: "home", + index: true, + lazy: () => import("./routes/home"), + }, + { + id: "render-redirect-lazy", + path: "/render-redirect/lazy/:id?", + lazy: () => import("./routes/render-redirect/lazy"), + }, + { + id: "render-redirect", + path: "/render-redirect/:id?", + lazy: () => import("./routes/render-redirect/home"), + }, + ], + }, + ] satisfies RSCRouteConfig; + `, "src/routes/home.actions.ts": js` "use server"; import { redirect } from "react-router"; @@ -76,6 +102,60 @@ implementations.forEach((implementation) => { ); } `, + + "src/routes/render-redirect/home.tsx": js` + import { Link, redirect } from "react-router"; + + export default function RenderRedirect({ params: { id } }) { + if (id === "redirect") { + throw redirect("/render-redirect/redirected"); + } + + if (id === "external") { + throw redirect("https://example.com/"); + } + + return ( + <> +

{id || "home"}

+ Redirect + External + + ) + } + `, + "src/routes/render-redirect/lazy.tsx": js` + import { Suspense } from "react"; + import { Link, redirect } from "react-router"; + + export default function RenderRedirect({ params: { id } }) { + return ( + Loading...

}> + +
+ ); + } + + async function Lazy({ id }) { + await new Promise((r) => setTimeout(r, 0)); + + if (id === "redirect") { + throw redirect("/render-redirect/lazy/redirected"); + } + + if (id === "external") { + throw redirect("https://example.com/"); + } + + return ( + <> +

{id || "home"}

+ Redirect + External + + ); + } + `, }, }); }); @@ -83,10 +163,7 @@ implementations.forEach((implementation) => { test("Supports React Server Functions side-effect redirect headers for document requests", async ({ page, }, { project }) => { - test.skip( - implementation.name === "parcel" || project.name !== "chromium", - "TODO: figure out why parcel isn't working here", - ); + test.skip(project.name !== "chromium"); await page.goto(`http://localhost:${port}/`); @@ -111,10 +188,7 @@ implementations.forEach((implementation) => { }); test("Supports form state without JS", async ({ page }, { project }) => { - test.skip( - implementation.name === "parcel" || project.name !== "chromium", - "TODO: figure out why parcel isn't working here", - ); + test.skip(project.name !== "chromium"); await page.goto(`http://localhost:${port}/`); @@ -129,5 +203,55 @@ implementations.forEach((implementation) => { // Ensure this is using RSC validateRSCHtml(await page.content()); }); + + test("Suppport throwing redirect Response from render", async ({ + page, + }) => { + await page.goto(`http://localhost:${port}/render-redirect`); + await expect(page.getByText("home")).toBeAttached(); + await page.getByText("Redirect").click(); + await page.waitForURL( + `http://localhost:${port}/render-redirect/redirected`, + ); + await expect(page.getByText("redirected")).toBeAttached(); + }); + + test("Suppport throwing external redirect Response from render", async ({ + browserName, + page, + }) => { + test.skip( + browserName === "firefox", + "Playwright doesn't like external redirects for tests. It times out waiting for the URL even though it navigates.", + ); + await page.goto(`http://localhost:${port}/render-redirect`); + await expect(page.getByText("home")).toBeAttached(); + await page.getByText("External").click(); + await page.waitForURL(`https://example.com/`); + await expect(page.getByText("Example Domain")).toBeAttached(); + }); + + test("Suppport throwing redirect Response from suspended render", async ({ + page, + }) => { + await page.goto(`http://localhost:${port}/render-redirect/lazy/redirect`); + await page.waitForURL( + `http://localhost:${port}/render-redirect/lazy/redirected`, + ); + await expect(page.getByText("redirected")).toBeAttached(); + }); + + test("Suppport throwing external redirect Response from suspended render", async ({ + page, + browserName, + }) => { + test.skip( + browserName === "firefox", + "Playwright doesn't like external redirects for tests. It times out waiting for the URL even though it navigates.", + ); + await page.goto(`http://localhost:${port}/render-redirect/lazy/external`); + await page.waitForURL(`https://example.com/`); + await expect(page.getByText("Example Domain")).toBeAttached(); + }); }); }); diff --git a/integration/rsc/rsc-test.ts b/integration/rsc/rsc-test.ts index 9ddff47d05..974150ad1d 100644 --- a/integration/rsc/rsc-test.ts +++ b/integration/rsc/rsc-test.ts @@ -219,10 +219,6 @@ implementations.forEach((implementation) => { }); test("Forces revalidation of routes with errors", async ({ page }) => { - test.skip( - implementation.name === "parcel", - "Parcel's built-in error overlay get's in the way of the test", - ); await page.goto( `http://localhost:${port}/errors-force-revalidation`, { @@ -534,6 +530,21 @@ implementations.forEach((implementation) => { id: "action-transition-state", path: "action-transition-state", lazy: () => import("./routes/action-transition-state/home"), + }, + { + id: "render-redirect-lazy", + path: "/render-redirect/lazy/:id?", + lazy: () => import("./routes/render-redirect/lazy"), + }, + { + id: "render-redirect", + path: "/render-redirect/:id?", + lazy: () => import("./routes/render-redirect/home"), + }, + { + id: "render-route-error-response", + path: "render-route-error-response/:id?", + lazy: () => import("./routes/render-route-error-response/home"), } ], }, @@ -1460,6 +1471,84 @@ implementations.forEach((implementation) => { ); } `, + + "src/routes/render-redirect/home.tsx": js` + import { Link, redirect } from "react-router"; + + export default function RenderRedirect({ params: { id } }) { + if (id === "redirect") { + throw redirect("/render-redirect/redirected"); + } + + if (id === "external") { + throw redirect("https://example.com/") + } + + return ( + <> +

{id || "home"}

+ Redirect + External + + ) + } + `, + "src/routes/render-redirect/lazy.tsx": js` + import { Suspense } from "react"; + import { Link, redirect } from "react-router"; + + export default function RenderRedirect({ params: { id } }) { + return ( + Loading...

}> + +
+ ); + } + + async function Lazy({ id }) { + await new Promise((r) => setTimeout(r, 0)); + + if (id === "redirect") { + throw redirect("/render-redirect/lazy/redirected"); + } + + if (id === "external") { + throw redirect("https://example.com/") + } + + return ( + <> +

{id || "home"}

+ Redirect + External + + ); + } + `, + + "src/routes/render-route-error-response/home.tsx": js` + import { data } from "react-router"; + + export { ErrorBoundary } from "./home.client"; + + export default function RenderRouteErrorResponse({ params: { id } }) { + if (!id) throw new Response(null, { status: 400, statusText: "Oh no!" }); + + throw data({ message: id }, { status: 400, statusText: "Oh no!" }); + } + `, + "src/routes/render-route-error-response/home.client.tsx": js` + "use client"; + import { useRouteError, isRouteErrorResponse } from "react-router"; + + export function ErrorBoundary() { + const error = useRouteError(); + if (isRouteErrorResponse(error)) { + return

{error.status} {error.statusText} {error.data?.message || "no"}

; + } + return

Oh no D:

; + } + `, }, }); }); @@ -1615,11 +1704,6 @@ implementations.forEach((implementation) => { }); test("Supports client context using getContext", async ({ page }) => { - test.skip( - implementation.name === "parcel", - "Parcel is having trouble resolving modules, should probably file a bug report for this.", - ); - await page.goto(`http://localhost:${port}/get-context`); await page.waitForSelector("[data-client-context]"); expect( @@ -1738,6 +1822,76 @@ implementations.forEach((implementation) => { "An error occurred in the Server Components render.", ); }); + + test("Suppport throwing redirect Response from render", async ({ + page, + }) => { + await page.goto(`http://localhost:${port}/render-redirect`); + await expect(page.getByText("home")).toBeAttached(); + await page.getByText("Redirect").click(); + await page.waitForURL( + `http://localhost:${port}/render-redirect/redirected`, + ); + await expect(page.getByText("redirected")).toBeAttached(); + }); + + test("Suppport throwing external redirect Response from render", async ({ + browserName, + page, + }) => { + test.skip( + browserName === "firefox", + "Playwright doesn't like external redirects for tests. It times out waiting for the URL even though it navigates.", + ); + await page.goto(`http://localhost:${port}/render-redirect`); + await expect(page.getByText("home")).toBeAttached(); + await page.getByText("External").click(); + await page.waitForURL(`https://example.com/`); + await expect(page.getByText("Example Domain")).toBeAttached(); + }); + + test("Suppport throwing redirect Response from suspended render", async ({ + page, + }) => { + await page.goto(`http://localhost:${port}/render-redirect/lazy`); + await expect(page.getByText("home")).toBeAttached(); + await page.getByText("Redirect").click(); + await page.waitForURL( + `http://localhost:${port}/render-redirect/lazy/redirected`, + ); + await expect(page.getByText("redirected")).toBeAttached(); + }); + + test("Suppport throwing external redirect Response from suspended render", async ({ + browserName, + page, + }) => { + test.skip( + browserName === "firefox", + "Playwright doesn't like external redirects for tests. It times out waiting for the URL even though it navigates.", + ); + await page.goto(`http://localhost:${port}/render-redirect/lazy`); + await expect(page.getByText("home")).toBeAttached(); + await page.getByText("External").click(); + await page.waitForURL(`https://example.com/`); + await expect(page.getByText("Example Domain")).toBeAttached(); + }); + + test("Support throwing Responses", async ({ page }) => { + await page.goto( + `http://localhost:${port}/render-route-error-response`, + ); + await expect(page.getByText("400 Oh no! no")).toBeAttached(); + }); + + test("Support throwing data() responses with data", async ({ + page, + }) => { + await page.goto( + `http://localhost:${port}/render-route-error-response/Test`, + ); + await expect(page.getByText("400 Oh no! Test")).toBeAttached(); + }); }); test.describe("Server Actions", () => { @@ -1765,12 +1919,6 @@ implementations.forEach((implementation) => { }); test("Supports Inline React Server Functions", async ({ page }) => { - // FIXME: Waiting on parcel support: https://github.com/parcel-bundler/parcel/pull/10165 - test.skip( - implementation.name === "parcel", - "Not supported in parcel yet", - ); - await page.goto(`http://localhost:${port}/inline-server-action/`); // Verify initial server render @@ -1837,9 +1985,6 @@ implementations.forEach((implementation) => { test("Supports React Server Functions thrown external redirects", async ({ page, }) => { - // Test is expected to fail currently — skip running it - // test.skip(true, "Known failing test for external redirect behavior"); - await page.goto( `http://localhost:${port}/throw-external-redirect-server-action/`, ); @@ -1864,8 +2009,6 @@ implementations.forEach((implementation) => { test("Supports React Server Functions side-effect redirects", async ({ page, }) => { - test.skip(implementation.name === "parcel", "Not working in parcel?"); - await page.goto( `http://localhost:${port}/side-effect-redirect-server-action`, ); @@ -1917,9 +2060,6 @@ implementations.forEach((implementation) => { test("Supports React Server Functions side-effect external redirects", async ({ page, }) => { - // Test is expected to fail currently — skip running it - test.skip(implementation.name === "parcel", "Not working in parcel?"); - await page.goto( `http://localhost:${port}/side-effect-external-redirect-server-action`, ); @@ -2001,7 +2141,9 @@ implementations.forEach((implementation) => { await page.click("[data-submit]"); await page.waitForSelector("[data-state]"); await page.waitForSelector("[data-pending]", { state: "hidden" }); - await page.waitForSelector("[data-revalidated]", { state: "hidden" }); + await page.waitForSelector("[data-revalidated]", { + state: "hidden", + }); expect(await page.locator("[data-state]").textContent()).toBe( "no revalidate", ); @@ -2013,11 +2155,6 @@ implementations.forEach((implementation) => { test("Supports transition state throughout the revalidation lifecycle", async ({ page, }) => { - test.skip( - implementation.name === "parcel", - "Uses inline server actions which parcel doesn't support yet", - ); - await page.goto(`http://localhost:${port}/action-transition-state`, { waitUntil: "networkidle", }); @@ -2069,10 +2206,6 @@ implementations.forEach((implementation) => { test("Handles errors thrown in SSR components correctly", async ({ page, }) => { - test.skip( - implementation.name === "parcel", - "Parcel's error overlays are interfering with this test", - ); await page.goto(`http://localhost:${port}/ssr-error`); // Verify error boundary is shown @@ -2527,8 +2660,6 @@ implementations.forEach((implementation) => { test("Supports redirects in server actions without JavaScript with basename", async ({ page, }) => { - test.skip(implementation.name === "parcel", "Not working in parcel?"); - // Start on home route await page.goto( `http://localhost:${port}${basename}/server-action-redirects`, diff --git a/integration/rsc/utils.ts b/integration/rsc/utils.ts index 8a4a753a21..9d86ee681b 100644 --- a/integration/rsc/utils.ts +++ b/integration/rsc/utils.ts @@ -20,7 +20,6 @@ export type Implementation = { dev: ({ cwd, port }: { cwd: string; port: number }) => Promise<() => void>; }; -// Run tests against vite and parcel to ensure our code is bundler agnostic export const implementations: Implementation[] = [ { name: "vite", @@ -40,28 +39,6 @@ export const implementations: Implementation[] = [ port, }), }, - { - name: "parcel", - template: "rsc-parcel", - build: ({ cwd }: { cwd: string }) => spawnSync("pnpm", ["build"], { cwd }), - run: ({ cwd, port }) => - createDev(["dist/server/server.js", "-p", String(port)])({ - cwd, - port, - env: { - NODE_ENV: "production", - }, - }), - dev: ({ cwd, port }) => - createDev(["node_modules/parcel/lib/bin.js"])({ - // Since we run through parcels dev server we can't use `-p` because that - // only changes the dev server and doesn't pass through to the internal - // server. So we setup the internal server to choose from `RR_PORT` - env: { RR_PORT: String(port) }, - cwd, - port, - }), - }, ] as Implementation[]; export async function setupRscTest({ diff --git a/integration/single-fetch-test.ts b/integration/single-fetch-test.ts index b02c25643c..b4db12bc26 100644 --- a/integration/single-fetch-test.ts +++ b/integration/single-fetch-test.ts @@ -837,6 +837,232 @@ test.describe("single-fetch", () => { expect(urls).toEqual([]); }); + test("supports call-site revalidation opt-out on submissions (w/o shouldRevalidate)", async ({ + page, + }) => { + let fixture = await createFixture({ + files: { + ...files, + "app/routes/action.tsx": js` + import { Form } from 'react-router'; + + let count = 0; + export function loader() { + return { count: ++count }; + } + + export function action() { + return { count: ++count }; + } + + export default function Comp({ loaderData, actionData }) { + return ( + + +

{loaderData.count}

+ {actionData ?

{actionData.count}

: null} + + ); + } + `, + }, + }); + + let urls: string[] = []; + page.on("request", (req) => { + if (req.method() === "GET" && req.url().includes(".data")) { + urls.push(req.url()); + } + }); + + console.error = () => {}; + + let appFixture = await createAppFixture(fixture); + let app = new PlaywrightFixture(appFixture, page); + await app.goto("/action"); + expect(await app.getHtml("#data")).toContain("1"); + expect(urls).toEqual([]); + + await page.click('button[name="name"][value="value"]'); + await page.waitForSelector("#action-data"); + expect(await app.getHtml("#action-data")).toContain("2"); + expect(await app.getHtml("#data")).toContain("1"); + expect(urls).toEqual([]); + }); + + test("supports call-site revalidation opt-in on 4xx/5xx action responses (w/o shouldRevalidate)", async ({ + page, + }) => { + let fixture = await createFixture({ + files: { + ...files, + "app/routes/action.tsx": js` + import { Form, Link, useNavigation, data } from 'react-router'; + + export async function action({ request }) { + throw data("Thrown 500", { status: 500 }); + } + + let count = 0; + export function loader() { + return { count: ++count }; + } + + export default function Comp({ loaderData }) { + let navigation = useNavigation(); + return ( +
+ +

{loaderData.count}

+ {navigation.state === "idle" ?

idle

: null} +
+ ); + } + + export function ErrorBoundary() { + return

Error

+ } + `, + }, + }); + + let urls: string[] = []; + page.on("request", (req) => { + if (req.method() === "GET" && req.url().includes(".data")) { + urls.push(req.url()); + } + }); + + console.error = () => {}; + + let appFixture = await createAppFixture(fixture); + let app = new PlaywrightFixture(appFixture, page); + await app.goto("/action"); + expect(await app.getHtml("#data")).toContain("1"); + expect(urls).toEqual([]); + + await page.click('button[name="throw"][value="5xx"]'); + await page.waitForSelector("#error"); + expect(urls).toEqual([expect.stringMatching(/\/action\.data$/)]); + }); + + test("supports call-site revalidation opt-out on submissions (w/ shouldRevalidate)", async ({ + page, + }) => { + let fixture = await createFixture({ + files: { + ...files, + "app/routes/action.tsx": js` + import { Form } from 'react-router'; + + let count = 0; + export function loader() { + return { count: ++count }; + } + + export function action() { + return { count: ++count }; + } + + export function shouldRevalidate({ defaultShouldRevalidate }) { + return defaultShouldRevalidate; + } + + export default function Comp({ loaderData, actionData }) { + return ( +
+ +

{loaderData.count}

+ {actionData ?

{actionData.count}

: null} +
+ ); + } + `, + }, + }); + + let urls: string[] = []; + page.on("request", (req) => { + if (req.method() === "GET" && req.url().includes(".data")) { + urls.push(req.url()); + } + }); + + console.error = () => {}; + + let appFixture = await createAppFixture(fixture); + let app = new PlaywrightFixture(appFixture, page); + await app.goto("/action"); + expect(await app.getHtml("#data")).toContain("1"); + expect(urls).toEqual([]); + + await page.click('button[name="name"][value="value"]'); + await page.waitForSelector("#action-data"); + expect(await app.getHtml("#action-data")).toContain("2"); + expect(await app.getHtml("#data")).toContain("1"); + expect(urls).toEqual([]); + }); + + test("supports call-site revalidation opt-in on 4xx/5xx action responses (w shouldRevalidate)", async ({ + page, + }) => { + let fixture = await createFixture({ + files: { + ...files, + "app/routes/action.tsx": js` + import { Form, Link, useNavigation, data } from 'react-router'; + + export async function action({ request }) { + throw data("Thrown 500", { status: 500 }); + } + + let count = 0; + export function loader() { + return { count: ++count }; + } + + export function shouldRevalidate({ defaultShouldRevalidate }) { + return defaultShouldRevalidate; + } + + export default function Comp({ loaderData }) { + let navigation = useNavigation(); + return ( +
+ +

{loaderData.count}

+ {navigation.state === "idle" ?

idle

: null} +
+ ); + } + + export function ErrorBoundary() { + return

Error

+ } + `, + }, + }); + + let urls: string[] = []; + page.on("request", (req) => { + if (req.method() === "GET" && req.url().includes(".data")) { + urls.push(req.url()); + } + }); + + console.error = () => {}; + + let appFixture = await createAppFixture(fixture); + let app = new PlaywrightFixture(appFixture, page); + await app.goto("/action"); + expect(await app.getHtml("#data")).toContain("1"); + expect(urls).toEqual([]); + + await page.click('button[name="throw"][value="5xx"]'); + await page.waitForSelector("#error"); + expect(urls).toEqual([expect.stringMatching(/\/action\.data$/)]); + }); + test("returns headers correctly for singular loader and action calls", async () => { let fixture = await createFixture({ files: { @@ -4142,7 +4368,17 @@ test.describe("single-fetch", () => { let app = new PlaywrightFixture(appFixture, page); await app.goto("/data", true); let scripts = await page.$$("script"); - expect(scripts.length).toBe(6); + + // Scripts: + // RR: window.__reactRouterContext + // RR: window.__reactRouterManifest/window.__reactRouterRouteModules + // React: requestAnimationFrame(function(){$RT=performance.now()}); + // RR: window.__reactRouterContext.streamController.enqueue() + // React: $RC=function(b,c,e){... + // RR: window.__reactRouterContext.streamController.close(); + // React: $RC("B:1","S:1") + expect(scripts.length).toBe(7); + let remixScriptsCount = 0; for (let script of scripts) { let content = await script.innerHTML(); diff --git a/integration/vite-basename-test.ts b/integration/vite-basename-test.ts index dcd4c5380a..3455f0d911 100644 --- a/integration/vite-basename-test.ts +++ b/integration/vite-basename-test.ts @@ -122,7 +122,7 @@ const customServerFile = ({ app.use("${base}", express.static("build/client")); app.all( "${basename}*", - createRequestListener((await import("./build/server/index.js")).default), + createRequestListener((await import("./build/server/index.js")).default.fetch), ); } app.get("*", (_req, res) => { @@ -476,7 +476,7 @@ test.describe("Vite base + React Router basename", () => { } } - test.afterAll(() => stop()); + test.afterAll(() => stop?.()); test("works when base and basename are the same", async ({ page }) => { await setup({ base: "/mybase/", basename: "/mybase/" }); @@ -504,6 +504,10 @@ test.describe("Vite base + React Router basename", () => { test("works when when base is an absolute external URL", async ({ page, }) => { + test.skip( + templateName === "rsc-vite-framework", + "I'm not sure the use-case for this and can't find anything. If you ever need this file an issue and we will revisit.", + ); port = await getPort(); cwd = await createProject( { @@ -518,26 +522,26 @@ test.describe("Vite base + React Router basename", () => { ? String.raw` import { createRequestListener } from "@mjackson/node-fetch-server"; import express from "express"; - + const app = express(); app.all( "/app/*", createRequestListener((await import("./build/server/index.js")).default) ); - + const port = ${port}; app.listen(port, () => console.log('http://localhost:' + port)); ` : String.raw` import { createRequestHandler } from "@react-router/express"; import express from "express"; - + const app = express(); app.all( "/app/*", createRequestHandler({ build: await import("./build/server/index.js") }) ); - + const port = ${port}; app.listen(port, () => console.log('http://localhost:' + port)); `, diff --git a/integration/vite-css-test.ts b/integration/vite-css-test.ts index 2e181fc1c9..0be48cb2ef 100644 --- a/integration/vite-css-test.ts +++ b/integration/vite-css-test.ts @@ -24,10 +24,11 @@ const NEW_PADDING = "30px"; const fixtures = [ ...viteMajorTemplates, - { - templateName: "rsc-vite-framework", - templateDisplayName: "RSC Vite Framework", - }, + // TODO: Figure out why this is failing. It works outside the integration tests. + // { + // templateName: "rsc-vite-framework", + // templateDisplayName: "RSC Vite Framework", + // }, ] as const satisfies ReadonlyArray<{ templateName: TemplateName; templateDisplayName: string; @@ -569,7 +570,7 @@ async function hmrWorkflow({ await edit(routeFile, modifyCss); await expect( page.locator(selector), - `CSS update for ${routeFile}`, + `${file}: CSS update for ${routeFile}`, ).toHaveCSS("padding", NEW_PADDING); // Ensure CSS updates were handled by HMR diff --git a/integration/vite-preview-test.ts b/integration/vite-preview-test.ts new file mode 100644 index 0000000000..65eb1611fe --- /dev/null +++ b/integration/vite-preview-test.ts @@ -0,0 +1,317 @@ +import { expect } from "@playwright/test"; +import dedent from "dedent"; + +import { + reactRouterConfig, + viteConfig, + test, + type Files, +} from "./helpers/vite.js"; + +const tsx = dedent; + +test.describe("Vite preview", () => { + test("serves built app with vite preview", async ({ vitePreview, page }) => { + const files: Files = async ({ port }) => ({ + "react-router.config.ts": reactRouterConfig({ + v8_viteEnvironmentApi: true, + }), + "vite.config.ts": await viteConfig.basic({ + port, + templateName: "vite-6-template", + }), + "app/root.tsx": tsx` + import { Links, Meta, Outlet, Scripts } from "react-router"; + + export default function Root() { + return ( + + + + + + +
+

Root

+ +
+ + + + ); + } + `, + "app/routes/_index.tsx": tsx` + export default function IndexRoute() { + return ( +
+

Index

+

Environment: production

+
+ ); + } + `, + "app/routes/about.tsx": tsx` + export default function AboutRoute() { + return ( +
+

About

+

This is the about page

+
+ ); + } + `, + "app/routes/loader-data.tsx": tsx` + import { useLoaderData } from "react-router"; + + export function loader() { + return { message: "Hello from loader" }; + } + + export default function LoaderDataRoute() { + const { message } = useLoaderData(); + return ( +
+

Loader Data

+

{message}

+
+ ); + } + `, + }); + + const { port } = await vitePreview(files, "vite-6-template"); + await page.goto(`http://localhost:${port}/`, { + waitUntil: "networkidle", + }); + + // Ensure no errors on page load + expect(page.errors).toEqual([]); + + await expect(page.locator("#index [data-title]")).toHaveText("Index"); + await expect(page.locator("#index [data-env]")).toHaveText( + "Environment: production", + ); + }); + + test("handles navigation between routes", async ({ vitePreview, page }) => { + const files: Files = async ({ port }) => ({ + "react-router.config.ts": reactRouterConfig({ + v8_viteEnvironmentApi: true, + }), + "vite.config.ts": await viteConfig.basic({ + port, + templateName: "vite-6-template", + }), + "app/root.tsx": tsx` + import { Links, Meta, Outlet, Scripts, Link } from "react-router"; + + export default function Root() { + return ( + + + + + + +
+ + +
+ + + + ); + } + `, + "app/routes/_index.tsx": tsx` + export default function IndexRoute() { + return ( +
+

Index

+
+ ); + } + `, + "app/routes/about.tsx": tsx` + export default function AboutRoute() { + return ( +
+

About

+
+ ); + } + `, + }); + + const { port } = await vitePreview(files, "vite-6-template"); + await page.goto(`http://localhost:${port}/`, { + waitUntil: "networkidle", + }); + + expect(page.errors).toEqual([]); + await expect(page.locator("#index [data-title]")).toHaveText("Index"); + + // Navigate to about page + await page.click("[data-link-about]"); + await page.waitForLoadState("networkidle"); + + expect(page.errors).toEqual([]); + await expect(page.locator("#about [data-title]")).toHaveText("About"); + + // Navigate back to home + await page.click("[data-link-home]"); + await page.waitForLoadState("networkidle"); + + expect(page.errors).toEqual([]); + await expect(page.locator("#index [data-title]")).toHaveText("Index"); + }); + + test("handles loader data correctly", async ({ vitePreview, page }) => { + const files: Files = async ({ port }) => ({ + "react-router.config.ts": reactRouterConfig({ + v8_viteEnvironmentApi: true, + }), + "vite.config.ts": await viteConfig.basic({ + port, + templateName: "vite-6-template", + }), + "app/root.tsx": tsx` + import { Links, Meta, Outlet, Scripts } from "react-router"; + + export default function Root() { + return ( + + + + + + +
+ +
+ + + + ); + } + `, + "app/routes/_index.tsx": tsx` + import { useLoaderData } from "react-router"; + + export function loader() { + return { + message: "Hello from loader", + timestamp: Date.now() + }; + } + + export default function IndexRoute() { + const { message, timestamp } = useLoaderData(); + return ( +
+

Index

+

{message}

+

{timestamp}

+
+ ); + } + `, + }); + + const { port } = await vitePreview(files, "vite-6-template"); + await page.goto(`http://localhost:${port}/`, { + waitUntil: "networkidle", + }); + + expect(page.errors).toEqual([]); + await expect(page.locator("#index [data-title]")).toHaveText("Index"); + await expect(page.locator("#index [data-message]")).toHaveText( + "Hello from loader", + ); + + // Check that timestamp exists and is a number + const timestampText = await page + .locator("#index [data-timestamp]") + .textContent(); + expect(timestampText).toBeTruthy(); + expect(Number(timestampText)).toBeGreaterThan(0); + }); + + test("handles direct navigation to dynamic routes", async ({ + vitePreview, + page, + }) => { + const files: Files = async ({ port }) => ({ + "react-router.config.ts": reactRouterConfig({ + v8_viteEnvironmentApi: true, + }), + "vite.config.ts": await viteConfig.basic({ + port, + templateName: "vite-6-template", + }), + "app/root.tsx": tsx` + import { Links, Meta, Outlet, Scripts } from "react-router"; + + export default function Root() { + return ( + + + + + + +
+ +
+ + + + ); + } + `, + "app/routes/_index.tsx": tsx` + export default function IndexRoute() { + return

Index

; + } + `, + "app/routes/products.$id.tsx": tsx` + import { useLoaderData, useParams } from "react-router"; + + export function loader({ params }: { params: { id: string } }) { + return { + productId: params.id, + }; + } + + export default function ProductRoute() { + const { productId } = useLoaderData(); + return ( +
+

Product Details

+

{productId}

+

Product {productId}

+
+ ); + } + `, + }); + + const { port } = await vitePreview(files, "vite-6-template"); + await page.goto(`http://localhost:${port}/products/123`, { + waitUntil: "networkidle", + }); + + expect(page.errors).toEqual([]); + await expect(page.locator("#product [data-title]")).toHaveText( + "Product Details", + ); + await expect(page.locator("#product [data-id]")).toHaveText("123"); + await expect(page.locator("#product [data-name]")).toHaveText( + "Product 123", + ); + }); +}); diff --git a/package.json b/package.json index a972fd9566..568a7299e6 100644 --- a/package.json +++ b/package.json @@ -42,8 +42,8 @@ }, "packageManager": "pnpm@9.10.0", "resolutions": { - "@types/react": "^18.2.18", - "@types/react-dom": "^18.2.7", + "@types/react": "catalog:", + "@types/react-dom": "catalog:", "@types/react-test-renderer": "^18.3.1", "jsdom": "22.1.0" }, @@ -59,8 +59,8 @@ "@remix-run/changelog-github": "^0.0.5", "@types/jest": "^29.5.4", "@types/jsdom": "^21.1.1", - "@types/react": "^19.0.12", - "@types/react-dom": "^19.0.4", + "@types/react": "catalog:", + "@types/react-dom": "catalog:", "@types/react-test-renderer": "^19.0.0", "@typescript-eslint/eslint-plugin": "^7.5.0", "@typescript-eslint/parser": "^7.5.0", @@ -83,13 +83,12 @@ "jsonfile": "^6.1.0", "prettier": "^3.6.2", "prompts": "^2.4.2", - "react-server-dom-parcel": "^19.0.1", "remark-gfm": "^3.0.1", "remark-parse": "^10.0.1", "remark-stringify": "^10.0.2", "semver": "^7.5.4", "typedoc": "^0.28.7", - "typescript": "^5.4.5", + "typescript": "catalog:", "unified": "^10.1.2", "unist-util-remove": "^3.1.0", "vite": "^6.3.0" diff --git a/packages/create-react-router/CHANGELOG.md b/packages/create-react-router/CHANGELOG.md index c7e77928c5..0037a4ef7c 100644 --- a/packages/create-react-router/CHANGELOG.md +++ b/packages/create-react-router/CHANGELOG.md @@ -1,5 +1,9 @@ # `create-react-router` +## 7.11.0 + +_No changes_ + ## 7.10.1 _No changes_ diff --git a/packages/create-react-router/package.json b/packages/create-react-router/package.json index 36ad0775d1..287ec6d9c4 100644 --- a/packages/create-react-router/package.json +++ b/packages/create-react-router/package.json @@ -1,6 +1,6 @@ { "name": "create-react-router", - "version": "7.10.1", + "version": "7.11.0", "description": "Create a new React Router app", "homepage": "https://reactrouter.com", "bugs": { @@ -26,6 +26,7 @@ "build": { "command": "tsup", "files": [ + "../../pnpm-workspace.yaml", "*.ts", "tsconfig.json", "package.json" @@ -58,9 +59,9 @@ "esbuild-register": "^3.6.0", "msw": "^2.7.5", "tiny-invariant": "^1.2.0", - "tsup": "^8.3.0", - "typescript": "^5.1.6", - "wireit": "0.14.9" + "tsup": "catalog:", + "typescript": "catalog:", + "wireit": "catalog:" }, "engines": { "node": ">=18.0.0" diff --git a/packages/react-router-architect/CHANGELOG.md b/packages/react-router-architect/CHANGELOG.md index 79ee31da68..0d7909cbe9 100644 --- a/packages/react-router-architect/CHANGELOG.md +++ b/packages/react-router-architect/CHANGELOG.md @@ -1,5 +1,13 @@ # `@react-router/architect` +## 7.11.0 + +### Patch Changes + +- Updated dependencies: + - `react-router@7.11.0` + - `@react-router/node@7.11.0` + ## 7.10.1 ### Patch Changes diff --git a/packages/react-router-architect/package.json b/packages/react-router-architect/package.json index f1fad143e1..fc0d12d18a 100644 --- a/packages/react-router-architect/package.json +++ b/packages/react-router-architect/package.json @@ -1,6 +1,6 @@ { "name": "@react-router/architect", - "version": "7.10.1", + "version": "7.11.0", "description": "Architect server request handler for React Router", "bugs": { "url": "https://github.com/remix-run/react-router/issues" @@ -39,6 +39,7 @@ "build": { "command": "tsup", "files": [ + "../../pnpm-workspace.yaml", "sessions/**", "*.ts", "tsconfig.json", @@ -58,12 +59,12 @@ "@types/lambda-tester": "^3.6.1", "@types/node": "^20.0.0", "lambda-tester": "^4.0.1", - "react": "^19.1.0", - "react-dom": "^19.1.0", + "react": "catalog:", + "react-dom": "catalog:", "react-router": "workspace:*", - "tsup": "^8.3.0", - "typescript": "^5.1.6", - "wireit": "0.14.9" + "tsup": "catalog:", + "typescript": "catalog:", + "wireit": "catalog:" }, "peerDependencies": { "@react-router/node": "workspace:^", diff --git a/packages/react-router-cloudflare/CHANGELOG.md b/packages/react-router-cloudflare/CHANGELOG.md index 8862fa823e..4e3dab77ba 100644 --- a/packages/react-router-cloudflare/CHANGELOG.md +++ b/packages/react-router-cloudflare/CHANGELOG.md @@ -1,5 +1,12 @@ # `@react-router/cloudflare` +## 7.11.0 + +### Patch Changes + +- Updated dependencies: + - `react-router@7.11.0` + ## 7.10.1 ### Patch Changes diff --git a/packages/react-router-cloudflare/package.json b/packages/react-router-cloudflare/package.json index 41e8b707ed..fab63c9307 100644 --- a/packages/react-router-cloudflare/package.json +++ b/packages/react-router-cloudflare/package.json @@ -1,6 +1,6 @@ { "name": "@react-router/cloudflare", - "version": "7.10.1", + "version": "7.11.0", "description": "Cloudflare platform abstractions for React Router", "bugs": { "url": "https://github.com/remix-run/react-router/issues" @@ -34,6 +34,7 @@ "build": { "command": "tsup", "files": [ + "../../pnpm-workspace.yaml", "sessions/**", "*.ts", "tsconfig.json", @@ -47,9 +48,9 @@ "devDependencies": { "@cloudflare/workers-types": "^4.20250803.0", "react-router": "workspace:*", - "tsup": "^8.3.0", - "typescript": "^5.1.6", - "wireit": "0.14.9" + "tsup": "catalog:", + "typescript": "catalog:", + "wireit": "catalog:" }, "peerDependencies": { "@cloudflare/workers-types": "^4.0.0", diff --git a/packages/react-router-dev/CHANGELOG.md b/packages/react-router-dev/CHANGELOG.md index b99d47b8e6..b9f7dd23f5 100644 --- a/packages/react-router-dev/CHANGELOG.md +++ b/packages/react-router-dev/CHANGELOG.md @@ -1,5 +1,23 @@ # `@react-router/dev` +## 7.11.0 + +### Minor Changes + +- feat: add `vite preview` support ([#14507](https://github.com/remix-run/react-router/pull/14507)) + +### Patch Changes + +- rsc framework mode manual chunking for react and react-router deps ([#14655](https://github.com/remix-run/react-router/pull/14655)) +- add support for throwing redirect Response's at RSC render time ([#14596](https://github.com/remix-run/react-router/pull/14596)) +- support custom entrypoints for RSC framework mode ([#14643](https://github.com/remix-run/react-router/pull/14643)) +- `routeRSCServerRequest` replace `fetchServer` with `serverResponse` ([#14597](https://github.com/remix-run/react-router/pull/14597)) +- rsc framewlrk mode - optimize react-server-dom-webpack if in project package.json ([#14656](https://github.com/remix-run/react-router/pull/14656)) +- Updated dependencies: + - `react-router@7.11.0` + - `@react-router/serve@7.11.0` + - `@react-router/node@7.11.0` + ## 7.10.1 ### Patch Changes diff --git a/packages/react-router-dev/__tests__/fixtures/basic/package.json b/packages/react-router-dev/__tests__/fixtures/basic/package.json index 856736d5c6..546ea527b8 100644 --- a/packages/react-router-dev/__tests__/fixtures/basic/package.json +++ b/packages/react-router-dev/__tests__/fixtures/basic/package.json @@ -13,15 +13,15 @@ "@react-router/node": "*", "@react-router/serve": "*", "isbot": "^5.1.11", - "react": "^19.1.0", - "react-dom": "^19.1.0" + "react": "catalog:", + "react-dom": "catalog:" }, "devDependencies": { "@react-router/dev": "*", - "@types/react": "^18.2.20", - "@types/react-dom": "^18.2.7", + "@types/react": "catalog:", + "@types/react-dom": "catalog:", "eslint": "^8.38.0", - "typescript": "^5.1.6" + "typescript": "catalog:" }, "engines": { "node": ">=20.0.0" diff --git a/packages/react-router-dev/config/config.ts b/packages/react-router-dev/config/config.ts index e69c89960f..2211d71ab1 100644 --- a/packages/react-router-dev/config/config.ts +++ b/packages/react-router-dev/config/config.ts @@ -979,6 +979,38 @@ export async function resolveEntryFiles({ return { entryClientFilePath, entryServerFilePath }; } +export async function resolveRSCEntryFiles({ + reactRouterConfig, +}: { + reactRouterConfig: ResolvedReactRouterConfig; +}) { + let { appDirectory } = reactRouterConfig; + + let defaultsDirectory = Path.resolve( + Path.dirname(require.resolve("@react-router/dev/package.json")), + "dist", + "config", + "default-rsc-entries", + ); + + let userEntryClientFile = findEntry(appDirectory, "entry.client", { + absolute: true, + }); + let userEntryRSCFile = findEntry(appDirectory, "entry.rsc", { + absolute: true, + }); + let userEntrySSRFile = findEntry(appDirectory, "entry.ssr", { + absolute: true, + }); + + let client = + userEntryClientFile ?? Path.join(defaultsDirectory, "entry.client.tsx"); + let rsc = userEntryRSCFile ?? Path.join(defaultsDirectory, "entry.rsc.tsx"); + let ssr = userEntrySSRFile ?? Path.join(defaultsDirectory, "entry.ssr.tsx"); + + return { client, rsc, ssr }; +} + function omitRoutes( config: ResolvedReactRouterConfig, ): ResolvedReactRouterConfig { diff --git a/packages/react-router-dev/config/default-rsc-entries/entry.rsc.tsx b/packages/react-router-dev/config/default-rsc-entries/entry.rsc.tsx index ad86f492f6..520eea2c18 100644 --- a/packages/react-router-dev/config/default-rsc-entries/entry.rsc.tsx +++ b/packages/react-router-dev/config/default-rsc-entries/entry.rsc.tsx @@ -6,22 +6,36 @@ import { loadServerAction, renderToReadableStream, } from "@vitejs/plugin-rsc/rsc"; -import { unstable_matchRSCServerRequest as matchRSCServerRequest } from "react-router"; +import { + RouterContextProvider, + unstable_matchRSCServerRequest as matchRSCServerRequest, +} from "react-router"; +// Import the routes generated by routes.ts import routes from "virtual:react-router/unstable_rsc/routes"; import basename from "virtual:react-router/unstable_rsc/basename"; import unstable_reactRouterServeConfig from "virtual:react-router/unstable_rsc/react-router-serve-config"; -export async function fetchServer(request: Request) { - return await matchRSCServerRequest({ +export { unstable_reactRouterServeConfig }; + +export function fetchServer( + request: Request, + requestContext?: RouterContextProvider, +) { + return matchRSCServerRequest({ + basename, + // Provide the React Server touchpoints. createTemporaryReferenceSet, decodeAction, decodeFormState, decodeReply, loadServerAction, + // The incoming request. request, + requestContext, + // The app routes. routes, - basename, + // Encode the match with the React Server implementation. generateResponse(match, options) { return new Response(renderToReadableStream(match.payload, options), { status: match.statusCode, @@ -31,14 +45,22 @@ export async function fetchServer(request: Request) { }); } -export { unstable_reactRouterServeConfig }; +export default { + async fetch(request: Request, requestContext?: RouterContextProvider) { + if (requestContext && !(requestContext instanceof RouterContextProvider)) { + requestContext = undefined; + } -export default async function handler(request: Request) { - const ssr = await import.meta.viteRsc.loadModule< - typeof import("./entry.ssr") - >("ssr", "index"); - return ssr.default(request, fetchServer); -} + const ssr = await import.meta.viteRsc.loadModule< + typeof import("./entry.ssr.tsx") + >("ssr", "index"); + + return await ssr.generateHTML( + request, + await fetchServer(request, requestContext), + ); + }, +}; if (import.meta.hot) { import.meta.hot.accept(); diff --git a/packages/react-router-dev/config/default-rsc-entries/entry.ssr.tsx b/packages/react-router-dev/config/default-rsc-entries/entry.ssr.tsx index 5b15a77f71..fe518ff4b8 100644 --- a/packages/react-router-dev/config/default-rsc-entries/entry.ssr.tsx +++ b/packages/react-router-dev/config/default-rsc-entries/entry.ssr.tsx @@ -1,31 +1,38 @@ import { createFromReadableStream } from "@vitejs/plugin-rsc/ssr"; -// @ts-expect-error -import * as ReactDomServer from "react-dom/server.edge"; +// @ts-expect-error - no types for this, can import from root once on latest 19 +import { renderToReadableStream } from "react-dom/server.edge"; import { - unstable_RSCStaticRouter as RSCStaticRouter, unstable_routeRSCServerRequest as routeRSCServerRequest, + unstable_RSCStaticRouter as RSCStaticRouter, } from "react-router"; -export default async function handler( +export async function generateHTML( request: Request, - fetchServer: (request: Request) => Promise, -) { - const bootstrapScriptContent = - await import.meta.viteRsc.loadBootstrapScriptContent("index"); - - return routeRSCServerRequest({ + serverResponse: Response, +): Promise { + return await routeRSCServerRequest({ + // The incoming request. request, - fetchServer, + // The response from the RSC server. + serverResponse, + // Provide the React Server touchpoints. createFromReadableStream, - async renderHTML(getPayload) { - const payload = getPayload(); + // Render the router to HTML. + async renderHTML(getPayload, options) { + const payload = await getPayload(); + const formState = + payload.type === "render" ? await payload.formState : undefined; + + const bootstrapScriptContent = + await import.meta.viteRsc.loadBootstrapScriptContent("index"); - return ReactDomServer.renderToReadableStream( + return await renderToReadableStream( , { + ...options, bootstrapScriptContent, + formState, signal: request.signal, - formState: await payload.formState, }, ); }, diff --git a/packages/react-router-dev/package.json b/packages/react-router-dev/package.json index 257e5564a9..de524fe450 100644 --- a/packages/react-router-dev/package.json +++ b/packages/react-router-dev/package.json @@ -1,6 +1,6 @@ { "name": "@react-router/dev", - "version": "7.10.1", + "version": "7.11.0", "description": "Dev tools and CLI for React Router", "homepage": "https://reactrouter.com", "bugs": { @@ -13,6 +13,9 @@ }, "license": "MIT", "exports": { + "./config/default-rsc-entries/entry.client": "./dist/config/default-rsc-entries/entry.client.tsx", + "./config/default-rsc-entries/entry.rsc": "./dist/config/default-rsc-entries/entry.rsc.tsx", + "./config/default-rsc-entries/entry.ssr": "./dist/config/default-rsc-entries/entry.ssr.tsx", "./config": { "types": "./dist/config.d.ts", "default": "./dist/config.js" @@ -21,6 +24,7 @@ "types": "./dist/routes.d.ts", "default": "./dist/routes.js" }, + "./rsc-types": "./rsc-types.d.ts", "./vite": { "types": "./dist/vite.d.ts", "default": "./dist/vite.js" @@ -48,6 +52,7 @@ "build": { "command": "tsup", "files": [ + "../../pnpm-workspace.yaml", "cli/**", "config/**", "module-sync-enabled/**", @@ -100,27 +105,29 @@ "@types/babel__traverse": "^7.20.7", "@types/dedent": "^0.7.0", "@types/express": "^4.17.9", + "@types/jest": "^29.5.4", "@types/jsesc": "^3.0.1", "@types/lodash": "^4.14.182", "@types/node": "^20.0.0", "@types/npmcli__package-json": "^4.0.0", "@types/semver": "^7.7.0", - "@vitejs/plugin-rsc": "0.4.30", + "@vitejs/plugin-rsc": "catalog:", "esbuild-register": "^3.6.0", "execa": "5.1.1", "express": "^4.19.2", "fast-glob": "3.2.11", "react-router": "workspace:^", - "tsup": "^8.3.0", - "typescript": "^5.1.6", + "tsup": "catalog:", + "typescript": "catalog:", "vite": "^6.3.0", - "wireit": "0.14.9", + "wireit": "catalog:", "wrangler": "^4.23.0" }, "peerDependencies": { "@react-router/serve": "workspace:^", - "@vitejs/plugin-rsc": "*", + "@vitejs/plugin-rsc": "catalog:", "react-router": "workspace:^", + "react-server-dom-webpack": "catalog:", "typescript": "^5.1.0", "vite": "^5.1.0 || ^6.0.0 || ^7.0.0", "wrangler": "^3.28.2 || ^4.0.0" @@ -135,6 +142,9 @@ "typescript": { "optional": true }, + "react-server-dom-webpack": { + "optional": true + }, "wrangler": { "optional": true } @@ -146,6 +156,7 @@ "dist/", "module-sync-enabled/", "bin.js", + "rsc-types.d.ts", "CHANGELOG.md", "LICENSE.md", "README.md" diff --git a/packages/react-router-dev/rsc-types.d.ts b/packages/react-router-dev/rsc-types.d.ts new file mode 100644 index 0000000000..954c6a7410 --- /dev/null +++ b/packages/react-router-dev/rsc-types.d.ts @@ -0,0 +1,21 @@ +declare module "virtual:react-router/unstable_rsc/routes" { + import type { unstable_RSCRouteConfig as RSCRouteConfig } from "react-router"; + + const routes: RSCRouteConfig; + export default routes; +} + +declare module "virtual:react-router/unstable_rsc/basename" { + const basename: string; + export default basename; +} + +declare module "virtual:react-router/unstable_rsc/react-router-serve-config" { + const unstable_reactRouterServeConfig: { + publicPath: string; + assetsBuildDirectory: string; + }; + export default unstable_reactRouterServeConfig; +} + +declare module "virtual:react-router/unstable_rsc/inject-hmr-runtime" {} diff --git a/packages/react-router-dev/tsconfig.json b/packages/react-router-dev/tsconfig.json index 778b03c817..7643022731 100644 --- a/packages/react-router-dev/tsconfig.json +++ b/packages/react-router-dev/tsconfig.json @@ -1,8 +1,9 @@ { - "include": ["**/*.ts", "package.json"], - "exclude": ["dist", "__tests__", "node_modules"], + "include": ["**/*.ts", "./rsc-types.d.ts", "package.json"], + "exclude": ["dist", "__tests__", "node_modules", "**/*-test.ts"], "compilerOptions": { "lib": ["DOM", "DOM.Iterable", "ES2022"], + "types": ["vite/client"], "target": "ES2022", "module": "ES2022", "moduleResolution": "Bundler", diff --git a/packages/react-router-dev/vite/plugin.ts b/packages/react-router-dev/vite/plugin.ts index 270ed24b30..6a77987977 100644 --- a/packages/react-router-dev/vite/plugin.ts +++ b/packages/react-router-dev/vite/plugin.ts @@ -1686,6 +1686,44 @@ export const reactRouterVitePlugin: ReactRouterVitePlugin = () => { } }; }, + configurePreviewServer(previewServer) { + return () => { + // Handle SSR requests in preview mode using the built server bundle + previewServer.middlewares.use(async (req, res, next) => { + try { + let serverBuildDirectory = getServerBuildDirectory( + ctx.reactRouterConfig, + ); + let serverBuildFile = path.resolve( + serverBuildDirectory, + "index.js", + ); + + // Import the built server bundle using dynamic import + // Need to add a cache-busting query parameter to avoid module caching + let build = (await import( + url.pathToFileURL(serverBuildFile).href + )) as ServerBuild; + + let handler = createRequestHandler(build, "production"); + let nodeHandler: NodeRequestHandler = async ( + nodeReq, + nodeRes, + ) => { + let req = fromNodeRequest(nodeReq, nodeRes); + let res = await handler( + req, + await reactRouterDevLoadContext(req), + ); + await sendResponse(nodeRes, res); + }; + await nodeHandler(req, res); + } catch (error) { + next(error); + } + }); + }; + }, writeBundle: { // After the SSR build is finished, we inspect the Vite manifest for // the SSR build and move server-only assets to client assets directory diff --git a/packages/react-router-dev/vite/rsc/plugin.ts b/packages/react-router-dev/vite/rsc/plugin.ts index 3821557586..2c002ff86f 100644 --- a/packages/react-router-dev/vite/rsc/plugin.ts +++ b/packages/react-router-dev/vite/rsc/plugin.ts @@ -6,14 +6,14 @@ import colors from "picocolors"; import { create } from "../virtual-module"; import * as Typegen from "../../typegen"; -import { readFileSync } from "fs"; import { readFile } from "fs/promises"; -import path, { join, dirname } from "pathe"; +import path, { join } from "pathe"; import invariant from "../../invariant"; import { type ConfigLoader, type ResolvedReactRouterConfig, createConfigLoader, + resolveRSCEntryFiles, } from "../../config/config"; import { preloadVite } from "../vite"; import { hasDependency } from "../has-dependency"; @@ -30,14 +30,21 @@ import { validatePluginOrder } from "../plugins/validate-plugin-order"; import { warnOnClientSourceMaps } from "../plugins/warn-on-client-source-maps"; export function reactRouterRSCVitePlugin(): Vite.PluginOption[] { + let runningWithinTheReactRouterMonoRepo = Boolean( + arguments && + arguments.length === 1 && + typeof arguments[0] === "object" && + arguments[0] && + "__runningWithinTheReactRouterMonoRepo" in arguments[0] && + arguments[0].__runningWithinTheReactRouterMonoRepo === true, + ); let configLoader: ConfigLoader; let typegenWatcherPromise: Promise | undefined; let viteCommand: Vite.ConfigEnv["command"]; let resolvedViteConfig: Vite.ResolvedConfig; let routeIdByFile: Map | undefined; let logger: Vite.Logger; - - const defaultEntries = getDefaultEntries(); + let entries: { client: string; rsc: string; ssr: string }; let config: ResolvedReactRouterConfig; let rootRouteFile: string; @@ -115,24 +122,41 @@ export function reactRouterRSCVitePlugin(): Vite.PluginOption[] { prefix: "[react-router]", }); + entries = await resolveRSCEntryFiles({ + reactRouterConfig: config, + }); + + // Async import here to avoid CJS warnings on the console + let viteNormalizePath = (await import("vite")).normalizePath; + return { resolve: { dedupe: [ // https://react.dev/warnings/invalid-hook-call-warning#duplicate-react "react", + "react/jsx-runtime", + "react/jsx-dev-runtime", "react-dom", + "react-dom/client", // Avoid router duplicates since mismatching routers cause `Error: // You must render this element inside a element`. "react-router", "react-router/dom", + "react-router/internal/react-server-client", ...(hasDependency({ name: "react-router-dom", rootDirectory }) ? ["react-router-dom"] : []), + ...(hasDependency({ + name: "react-server-dom-webpack", + rootDirectory, + }) + ? ["react-server-dom-webpack"] + : []), ], }, optimizeDeps: { entries: getOptimizeDepsEntries({ - entryClientFilePath: defaultEntries.client, + entryClientFilePath: entries.client, reactRouterConfig: config, }), esbuildOptions: { @@ -146,8 +170,21 @@ export function reactRouterRSCVitePlugin(): Vite.PluginOption[] { "react/jsx-runtime", "react/jsx-dev-runtime", "react-dom", - "react-dom/client", - "react-router/internal/react-server-client", + ...(hasDependency({ + name: "react-server-dom-webpack", + rootDirectory, + }) + ? ["react-server-dom-webpack"] + : []), + ...(runningWithinTheReactRouterMonoRepo + ? [] + : [ + "react-router", + "react-router/dom", + "react-router/internal/react-server-client", + ]), + "react-router > cookie", + "react-router > set-cookie-parser", ], }, esbuild: { @@ -159,27 +196,35 @@ export function reactRouterRSCVitePlugin(): Vite.PluginOption[] { build: { rollupOptions: { input: { - index: defaultEntries.client, + index: entries.client, + }, + output: { + manualChunks(id) { + const normalized = viteNormalizePath(id); + if ( + normalized.includes("node_modules/react/") || + normalized.includes("node_modules/react-dom/") || + normalized.includes( + "node_modules/react-server-dom-webpack/", + ) || + normalized.includes("node_modules/@vitejs/plugin-rsc/") + ) { + return "react"; + } + if (normalized.includes("node_modules/react-router/")) { + return "router"; + } + }, }, }, outDir: join(config.buildDirectory, "client"), }, - optimizeDeps: { - include: [ - "react-router > cookie", - "react-router > set-cookie-parser", - ], - }, }, rsc: { build: { rollupOptions: { input: { - // We use a virtual entry here so that consumers can import - // it as `virtual:react-router/unstable_rsc/rsc-entry` - // without needing to know the actual file path, which is - // important when using the default entries. - index: defaultEntries.rsc, + index: entries.rsc, }, output: { entryFileNames: config.serverBuildFile, @@ -188,12 +233,17 @@ export function reactRouterRSCVitePlugin(): Vite.PluginOption[] { }, outDir: join(config.buildDirectory, "server"), }, + resolve: { + noExternal: [ + "@react-router/dev/config/default-rsc-entries/entry.ssr", + ], + }, }, ssr: { build: { rollupOptions: { input: { - index: defaultEntries.ssr, + index: entries.ssr, }, output: { // Note: We don't set `entryFileNames` here because it's @@ -205,6 +255,11 @@ export function reactRouterRSCVitePlugin(): Vite.PluginOption[] { }, outDir: join(config.buildDirectory, "server/__ssr_build"), }, + resolve: { + noExternal: [ + "@react-router/dev/config/default-rsc-entries/entry.rsc", + ], + }, }, }, build: { @@ -328,12 +383,6 @@ export function reactRouterRSCVitePlugin(): Vite.PluginOption[] { }, }, - { - name: "react-router/rsc/virtual-rsc-entry", - resolveId(id) { - if (id === virtual.rscEntry.id) return defaultEntries.rsc; - }, - }, { name: "react-router/rsc/virtual-route-config", resolveId(id) { @@ -413,7 +462,7 @@ export function reactRouterRSCVitePlugin(): Vite.PluginOption[] { const reactRefreshDir = path.dirname( require.resolve("react-refresh/package.json"), ); - const reactRefreshRuntimePath = path.join( + const reactRefreshRuntimePath = join( reactRefreshDir, "cjs/react-refresh-runtime.development.js", ); @@ -562,7 +611,6 @@ const virtual = { injectHmrRuntime: create("unstable_rsc/inject-hmr-runtime"), hmrRuntime: create("unstable_rsc/runtime"), basename: create("unstable_rsc/basename"), - rscEntry: create("unstable_rsc/rsc-entry"), reactRouterServeConfig: create("unstable_rsc/react-router-serve-config"), }; @@ -581,35 +629,6 @@ function getRootDirectory(viteUserConfig: Vite.UserConfig) { return viteUserConfig.root ?? process.env.REACT_ROUTER_ROOT ?? process.cwd(); } -function getDevPackageRoot(): string { - const currentDir = dirname(__dirname); - let dir = currentDir; - while (dir !== dirname(dir)) { - try { - const packageJsonPath = join(dir, "package.json"); - readFileSync(packageJsonPath, "utf-8"); - return dir; - } catch { - dir = dirname(dir); - } - } - throw new Error("Could not find package.json"); -} - -function getDefaultEntries() { - const defaultEntriesDir = join( - getDevPackageRoot(), - "dist", - "config", - "default-rsc-entries", - ); - return { - rsc: join(defaultEntriesDir, "entry.rsc.tsx"), - ssr: join(defaultEntriesDir, "entry.ssr.tsx"), - client: join(defaultEntriesDir, "entry.client.tsx"), - }; -} - function getModulesWithImporters( modules: Vite.EnvironmentModuleNode[], ): Set { diff --git a/packages/react-router-dom/CHANGELOG.md b/packages/react-router-dom/CHANGELOG.md index 96e5671f9c..28cb85d501 100644 --- a/packages/react-router-dom/CHANGELOG.md +++ b/packages/react-router-dom/CHANGELOG.md @@ -1,5 +1,12 @@ # react-router-dom +## 7.11.0 + +### Patch Changes + +- Updated dependencies: + - `react-router@7.11.0` + ## 7.10.1 ### Patch Changes diff --git a/packages/react-router-dom/package.json b/packages/react-router-dom/package.json index 727dfb361c..665afc85f3 100644 --- a/packages/react-router-dom/package.json +++ b/packages/react-router-dom/package.json @@ -1,6 +1,6 @@ { "name": "react-router-dom", - "version": "7.10.1", + "version": "7.11.0", "description": "Declarative routing for React web applications", "keywords": [ "react", @@ -48,6 +48,7 @@ "build": { "command": "tsup", "files": [ + "../../pnpm-workspace.yaml", "*.ts", "tsconfig.json", "package.json" @@ -61,11 +62,11 @@ "react-router": "workspace:*" }, "devDependencies": { - "react": "^19.1.0", - "react-dom": "^19.1.0", - "tsup": "^8.3.0", - "typescript": "^5.1.6", - "wireit": "0.14.9" + "react": "catalog:", + "react-dom": "catalog:", + "tsup": "catalog:", + "typescript": "catalog:", + "wireit": "catalog:" }, "peerDependencies": { "react": ">=18", diff --git a/packages/react-router-express/CHANGELOG.md b/packages/react-router-express/CHANGELOG.md index 0902d58375..7d278c4dcb 100644 --- a/packages/react-router-express/CHANGELOG.md +++ b/packages/react-router-express/CHANGELOG.md @@ -1,5 +1,13 @@ # `@react-router/express` +## 7.11.0 + +### Patch Changes + +- Updated dependencies: + - `react-router@7.11.0` + - `@react-router/node@7.11.0` + ## 7.10.1 ### Patch Changes diff --git a/packages/react-router-express/package.json b/packages/react-router-express/package.json index 3ad6f94aaf..bd814bbd18 100644 --- a/packages/react-router-express/package.json +++ b/packages/react-router-express/package.json @@ -1,6 +1,6 @@ { "name": "@react-router/express", - "version": "7.10.1", + "version": "7.11.0", "description": "Express server request handler for React Router", "bugs": { "url": "https://github.com/remix-run/react-router/issues" @@ -39,6 +39,7 @@ "build": { "command": "tsup", "files": [ + "../../pnpm-workspace.yaml", "*.ts", "tsconfig.json", "package.json" @@ -58,9 +59,9 @@ "express": "^4.19.2", "node-mocks-http": "^1.10.1", "supertest": "^6.3.3", - "tsup": "^8.3.0", - "typescript": "^5.1.6", - "wireit": "0.14.9" + "tsup": "catalog:", + "typescript": "catalog:", + "wireit": "catalog:" }, "peerDependencies": { "express": "^4.17.1 || ^5", diff --git a/packages/react-router-fs-routes/CHANGELOG.md b/packages/react-router-fs-routes/CHANGELOG.md index 319705480e..79aa56218a 100644 --- a/packages/react-router-fs-routes/CHANGELOG.md +++ b/packages/react-router-fs-routes/CHANGELOG.md @@ -1,5 +1,12 @@ # `@react-router/fs-routes` +## 7.11.0 + +### Patch Changes + +- Updated dependencies: + - `@react-router/dev@7.11.0` + ## 7.10.1 ### Patch Changes diff --git a/packages/react-router-fs-routes/package.json b/packages/react-router-fs-routes/package.json index 479a5fba0e..06199badb9 100644 --- a/packages/react-router-fs-routes/package.json +++ b/packages/react-router-fs-routes/package.json @@ -1,6 +1,6 @@ { "name": "@react-router/fs-routes", - "version": "7.10.1", + "version": "7.11.0", "description": "File system routing conventions for React Router, for use within routes.ts", "bugs": { "url": "https://github.com/remix-run/react-router/issues" @@ -28,6 +28,7 @@ "build": { "command": "tsup", "files": [ + "../../pnpm-workspace.yaml", "*.ts", "tsconfig.json", "package.json" @@ -42,9 +43,9 @@ }, "devDependencies": { "@react-router/dev": "workspace:*", - "tsup": "^8.3.0", - "typescript": "^5.1.6", - "wireit": "0.14.9" + "tsup": "catalog:", + "typescript": "catalog:", + "wireit": "catalog:" }, "peerDependencies": { "@react-router/dev": "workspace:^", diff --git a/packages/react-router-node/CHANGELOG.md b/packages/react-router-node/CHANGELOG.md index ff7d06d6dc..a0015b86dc 100644 --- a/packages/react-router-node/CHANGELOG.md +++ b/packages/react-router-node/CHANGELOG.md @@ -1,5 +1,12 @@ # `@react-router/node` +## 7.11.0 + +### Patch Changes + +- Updated dependencies: + - `react-router@7.11.0` + ## 7.10.1 ### Patch Changes diff --git a/packages/react-router-node/package.json b/packages/react-router-node/package.json index 8a9c08565e..896575b42a 100644 --- a/packages/react-router-node/package.json +++ b/packages/react-router-node/package.json @@ -1,6 +1,6 @@ { "name": "@react-router/node", - "version": "7.10.1", + "version": "7.11.0", "description": "Node.js platform abstractions for React Router", "bugs": { "url": "https://github.com/remix-run/react-router/issues" @@ -39,6 +39,7 @@ "build": { "command": "tsup", "files": [ + "../../pnpm-workspace.yaml", "sessions/**", "*.ts", "tsconfig.json", @@ -54,9 +55,9 @@ }, "devDependencies": { "react-router": "workspace:*", - "tsup": "^8.3.0", - "typescript": "^5.1.6", - "wireit": "0.14.9" + "tsup": "catalog:", + "typescript": "catalog:", + "wireit": "catalog:" }, "peerDependencies": { "react-router": "workspace:*", diff --git a/packages/react-router-remix-routes-option-adapter/CHANGELOG.md b/packages/react-router-remix-routes-option-adapter/CHANGELOG.md index 951495cd51..f1d5bc3644 100644 --- a/packages/react-router-remix-routes-option-adapter/CHANGELOG.md +++ b/packages/react-router-remix-routes-option-adapter/CHANGELOG.md @@ -1,5 +1,12 @@ # `@react-router/remix-config-routes-adapter` +## 7.11.0 + +### Patch Changes + +- Updated dependencies: + - `@react-router/dev@7.11.0` + ## 7.10.1 ### Patch Changes diff --git a/packages/react-router-remix-routes-option-adapter/package.json b/packages/react-router-remix-routes-option-adapter/package.json index 81bcc81091..564b8afc17 100644 --- a/packages/react-router-remix-routes-option-adapter/package.json +++ b/packages/react-router-remix-routes-option-adapter/package.json @@ -1,6 +1,6 @@ { "name": "@react-router/remix-routes-option-adapter", - "version": "7.10.1", + "version": "7.11.0", "description": "Adapter for Remix's \"routes\" config option, for use within routes.ts", "bugs": { "url": "https://github.com/remix-run/react-router/issues" @@ -27,6 +27,7 @@ "build": { "command": "tsup", "files": [ + "../../pnpm-workspace.yaml", "*.ts", "tsconfig.json", "package.json" @@ -38,9 +39,9 @@ }, "devDependencies": { "@react-router/dev": "workspace:*", - "tsup": "^8.3.0", - "typescript": "^5.1.6", - "wireit": "0.14.9" + "tsup": "catalog:", + "typescript": "catalog:", + "wireit": "catalog:" }, "peerDependencies": { "@react-router/dev": "workspace:^", diff --git a/packages/react-router-serve/CHANGELOG.md b/packages/react-router-serve/CHANGELOG.md index 7b3f260d23..20c0cbbb48 100644 --- a/packages/react-router-serve/CHANGELOG.md +++ b/packages/react-router-serve/CHANGELOG.md @@ -1,5 +1,16 @@ # `@react-router/serve` +## 7.11.0 + +### Patch Changes + +- support custom entrypoints for RSC framework mode ([#14643](https://github.com/remix-run/react-router/pull/14643)) +- Update `compression` and `morgan` dependencies to address `on-headers` CVE: [GHSA-76c9-3jph-rj3q](https://github.com/advisories/GHSA-76c9-3jph-rj3q) ([#14652](https://github.com/remix-run/react-router/pull/14652)) +- Updated dependencies: + - `react-router@7.11.0` + - `@react-router/node@7.11.0` + - `@react-router/express@7.11.0` + ## 7.10.1 ### Patch Changes diff --git a/packages/react-router-serve/cli.ts b/packages/react-router-serve/cli.ts index 015f94dda2..a8d7144838 100644 --- a/packages/react-router-serve/cli.ts +++ b/packages/react-router-serve/cli.ts @@ -33,16 +33,32 @@ sourceMapSupport.install({ run(); -type RSCServerBuild = { - fetch: (request: Request) => Response; +type RSCServerBuildModule = { + default: { + fetch: (request: Request) => Response | Promise; + }; + unstable_reactRouterServeConfig?: { + publicPath: string; + assetsBuildDirectory: string; + }; +}; + +type NormalizedBuild = { + fetch?: (request: Request) => Response | Promise; publicPath: string; assetsBuildDirectory: string; }; -function isRSCServerBuild( - build: ServerBuild | RSCServerBuild, -): build is RSCServerBuild { - return "fetch" in build && typeof build.fetch === "function"; +function isRSCServerBuild(build: unknown): build is RSCServerBuildModule { + return Boolean( + typeof build === "object" && + build && + "default" in build && + typeof build.default === "object" && + build.default && + "fetch" in build.default && + typeof build.default.fetch === "function", + ); } function parseNumber(raw?: string) { @@ -66,22 +82,23 @@ async function run() { let buildPath = path.resolve(buildPathArg); let buildModule = await import(url.pathToFileURL(buildPath).href); - let build: ServerBuild | RSCServerBuild; + let build: NormalizedBuild; + let isRSCBuild = false; - if (buildModule.default && typeof buildModule.default === "function") { + if ((isRSCBuild = isRSCServerBuild(buildModule))) { const config = { publicPath: "/", assetsBuildDirectory: "../client", ...(buildModule.unstable_reactRouterServeConfig || {}), }; build = { - fetch: buildModule.default, + fetch: buildModule.default.fetch, publicPath: config.publicPath, assetsBuildDirectory: path.resolve( path.dirname(buildPath), config.assetsBuildDirectory, ), - } satisfies RSCServerBuild; + } satisfies NormalizedBuild; } else { build = buildModule as ServerBuild; } @@ -106,7 +123,7 @@ async function run() { let app = express(); app.disable("x-powered-by"); - if (!isRSCServerBuild(build)) { + if (!isRSCBuild) { app.use(compression()); } @@ -121,13 +138,13 @@ async function run() { app.use(express.static("public", { maxAge: "1h" })); app.use(morgan("tiny")); - if (isRSCServerBuild(build)) { + if (build.fetch) { app.all("*", createRequestListener(build.fetch)); } else { app.all( "*", createRequestHandler({ - build, + build: buildModule, mode: process.env.NODE_ENV, }), ); diff --git a/packages/react-router-serve/package.json b/packages/react-router-serve/package.json index 2e1cc65520..7900da4cd4 100644 --- a/packages/react-router-serve/package.json +++ b/packages/react-router-serve/package.json @@ -1,6 +1,6 @@ { "name": "@react-router/serve", - "version": "7.10.1", + "version": "7.11.0", "description": "Production application server for React Router", "bugs": { "url": "https://github.com/remix-run/react-router/issues" @@ -25,6 +25,7 @@ "build": { "command": "tsup", "files": [ + "../../pnpm-workspace.yaml", "*.ts", "bin.js", "tsconfig.json", @@ -39,23 +40,23 @@ "@mjackson/node-fetch-server": "^0.2.0", "@react-router/express": "workspace:*", "@react-router/node": "workspace:*", - "compression": "^1.7.4", + "compression": "^1.8.1", "express": "^4.19.2", "get-port": "5.1.1", - "morgan": "^1.10.0", + "morgan": "^1.10.1", "source-map-support": "^0.5.21" }, "peerDependencies": { "react-router": "workspace:*" }, "devDependencies": { - "@types/compression": "^1.7.0", + "@types/compression": "^1.8.1", "@types/express": "^4.17.9", - "@types/morgan": "^1.9.2", + "@types/morgan": "^1.9.10", "@types/source-map-support": "^0.5.6", - "tsup": "^8.3.0", - "typescript": "^5.1.6", - "wireit": "0.14.9" + "tsup": "catalog:", + "typescript": "catalog:", + "wireit": "catalog:" }, "engines": { "node": ">=20.0.0" diff --git a/packages/react-router/CHANGELOG.md b/packages/react-router/CHANGELOG.md index 39d50f8991..950b634a69 100644 --- a/packages/react-router/CHANGELOG.md +++ b/packages/react-router/CHANGELOG.md @@ -1,5 +1,38 @@ # `react-router` +## 7.11.0 + +### Minor Changes + +- Stabilize ``/`` ([#14546](https://github.com/remix-run/react-router/pull/14546)) + +### Patch Changes + +- add support for throwing redirect Response's at RSC render time ([#14596](https://github.com/remix-run/react-router/pull/14596)) + +- Support for throwing `data()` and Response from server component render phase. Response body is not serialized as async work is not allowed as error encoding phase. If you wish to transmit data to the boundary, throw `data()` instead. ([#14632](https://github.com/remix-run/react-router/pull/14632)) + +- Fix `unstable_useTransitions` prop on `` component to permit omission for backewards compatibility ([#14646](https://github.com/remix-run/react-router/pull/14646)) + +- `routeRSCServerRequest` replace `fetchServer` with `serverResponse` ([#14597](https://github.com/remix-run/react-router/pull/14597)) + +- \[UNSTABLE] Add a new `unstable_defaultShouldRevalidate` flag to various APIs to allow opt-ing out of standard revalidation behaviors. ([#14542](https://github.com/remix-run/react-router/pull/14542)) + + If active routes include a `shouldRevalidate` function, then your value will be passed as `defaultShouldRevalidate` in those function so that the route always has the final revalidation determination. + - `
` + - `submit(data, { method: "post", unstable_defaultShouldRevalidate: false })` + - `` + - `fetcher.submit(data, { method: "post", unstable_defaultShouldRevalidate: false })` + + This is also available on non-submission APIs that may trigger revalidations due to changing search params: + - `` + - `navigate("/?foo=bar", { unstable_defaultShouldRevalidate: false })` + - `setSearchParams(params, { unstable_defaultShouldRevalidate: false })` + +- Allow redirects to be returned from client side middleware ([#14598](https://github.com/remix-run/react-router/pull/14598)) + +- Handle `dataStrategy` implementations that return insufficient result sets by adding errors for routes without any available result ([#14627](https://github.com/remix-run/react-router/pull/14627)) + ## 7.10.1 ### Patch Changes diff --git a/packages/react-router/__tests__/dom/client-on-error-test.tsx b/packages/react-router/__tests__/dom/client-on-error-test.tsx index 09bdd48d31..0442815b68 100644 --- a/packages/react-router/__tests__/dom/client-on-error-test.tsx +++ b/packages/react-router/__tests__/dom/client-on-error-test.tsx @@ -44,7 +44,7 @@ describe(`handleError`, () => { ]); let { container } = render( - , + , ); await waitFor(() => screen.getByText("lazy error!")); @@ -75,7 +75,7 @@ describe(`handleError`, () => { }, ]); - render(); + render(); await waitFor(() => screen.getByText("Error:middleware error!")); @@ -104,7 +104,7 @@ describe(`handleError`, () => { }, ]); - render(); + render(); await waitFor(() => screen.getByText("Error:loader error!")); @@ -134,7 +134,7 @@ describe(`handleError`, () => { ]); let { container } = render( - , + , ); await act(() => router.navigate("/page")); @@ -170,7 +170,7 @@ describe(`handleError`, () => { ]); let { container } = render( - , + , ); await act(() => router.navigate("/page")); @@ -202,7 +202,7 @@ describe(`handleError`, () => { ]); let { container } = render( - , + , ); await act(() => router.navigate("/page")); @@ -234,7 +234,7 @@ describe(`handleError`, () => { ]); let { container } = render( - , + , ); await act(() => @@ -269,7 +269,7 @@ describe(`handleError`, () => { ]); let { container } = render( - , + , ); await act(() => router.fetch("key", "0", "/fetch")); @@ -299,7 +299,7 @@ describe(`handleError`, () => { ]); let { container } = render( - , + , ); await act(() => @@ -335,7 +335,7 @@ describe(`handleError`, () => { ]); let { container } = render( - , + , ); await act(() => router.navigate("/page")); @@ -380,7 +380,7 @@ describe(`handleError`, () => { ]); let { container } = render( - , + , ); await act(() => router.navigate("/page")); @@ -429,7 +429,7 @@ describe(`handleError`, () => { } let { container } = render( - , + , ); await act(() => router.navigate("/page")); @@ -484,7 +484,7 @@ describe(`handleError`, () => { } let { container } = render( - , + , ); await act(() => router.navigate("/page")); @@ -540,7 +540,7 @@ describe(`handleError`, () => { ]); let { container } = render( - , + , ); await act(() => router.navigate("/page")); @@ -591,7 +591,7 @@ describe(`handleError`, () => { ]); let { container } = render( - , + , ); await act(() => router.navigate("/page")); diff --git a/packages/react-router/__tests__/dom/data-browser-router-test.tsx b/packages/react-router/__tests__/dom/data-browser-router-test.tsx index a4096258d3..ea8736a4f1 100644 --- a/packages/react-router/__tests__/dom/data-browser-router-test.tsx +++ b/packages/react-router/__tests__/dom/data-browser-router-test.tsx @@ -7,6 +7,7 @@ import { } from "@testing-library/react"; import * as React from "react"; import type { + DataStrategyResult, ErrorResponse, Fetcher, Location, @@ -420,6 +421,78 @@ function testDomRouter( " `); }); + + it("clears the HydrateFallback when dataStrategy returns partial results during hydration", async () => { + let dfd = createDeferred>(); + let router = createTestRouter( + [ + { + id: "root", + path: "/", + loader: true, + HydrateFallback: () => "Loading...", + Component: () => ( + <> +

Root:{useLoaderData()}

+ + + ), + ErrorBoundary: () => { + let error = useRouteError(); + return ( +
+                    Root:
+                    {error instanceof Error ? error.message : (error as string)}
+                  
+ ); + }, + children: [ + { + id: "index", + index: true, + loader: true, + Component: () =>

Index:{useLoaderData()}

, + ErrorBoundary: () => ( +
Index:{useRouteError() as string}
+ ), + }, + ], + }, + ], + { + dataStrategy: () => dfd.promise, + }, + ); + let { container } = render(); + + expect(getHtml(container)).toMatchInlineSnapshot(` + "
+ Loading... +
" + `); + + // Resolve data strategy with only an error at the index route but nothing + // for the root route + await dfd.resolve({ + index: { + type: "error", + result: "INDEX ERROR", + }, + }); + await tick(); + await tick(); + + // The router stubs in an error for the root route to get out of + // displaying the HydrateFallback + expect(getHtml(container)).toMatchInlineSnapshot(` + "
+
+              Root:
+              No result returned from dataStrategy for route root
+            
+
" + `); + }); }); describe("navigations", () => { @@ -2513,6 +2586,293 @@ function testDomRouter( }); }); + describe("call-site revalidation opt-out", () => { + it("accepts unstable_defaultShouldRevalidate on navigations", async () => { + let loaderDefer = createDeferred(); + + let router = createTestRouter( + [{ path: "/", loader: () => loaderDefer.promise, Component: Home }], + { + window: getWindow("/"), + hydrationData: { loaderData: { "0": null } }, + }, + ); + let { container } = render(); + + function Home() { + let data = useLoaderData() as string; + let location = useLocation(); + let navigation = useNavigation(); + return ( +
+ + Change Search Params + +
+

{location.pathname + location.search}

+

{navigation.state}

+

{data}

+
+
+ ); + } + + expect(getHtml(container.querySelector("#output")!)) + .toMatchInlineSnapshot(` + "
+

+ / +

+

+ idle +

+

+

" + `); + + fireEvent.click(screen.getByText("Change Search Params")); + await waitFor(() => screen.getByText("idle")); + loaderDefer.resolve("SHOULD NOT SEE ME"); + expect(getHtml(container.querySelector("#output")!)) + .toMatchInlineSnapshot(` + "
+

+ /?foo=bar +

+

+ idle +

+

+

" + `); + }); + + it("accepts unstable_defaultShouldRevalidate on setSearchParams navigations", async () => { + let loaderDefer = createDeferred(); + + let router = createTestRouter( + [{ path: "/", loader: () => loaderDefer.promise, Component: Home }], + { + window: getWindow("/"), + hydrationData: { loaderData: { "0": null } }, + }, + ); + let { container } = render(); + + function Home() { + let data = useLoaderData() as string; + let location = useLocation(); + let navigation = useNavigation(); + let [, setSearchParams] = useSearchParams(); + return ( +
+ +
+

{location.pathname + location.search}

+

{navigation.state}

+

{data}

+
+
+ ); + } + + expect(getHtml(container.querySelector("#output")!)) + .toMatchInlineSnapshot(` + "
+

+ / +

+

+ idle +

+

+

" + `); + + fireEvent.click(screen.getByText("Change Search Params")); + await waitFor(() => screen.getByText("idle")); + loaderDefer.resolve("SHOULD NOT SEE ME"); + expect(getHtml(container.querySelector("#output")!)) + .toMatchInlineSnapshot(` + "
+

+ /?foo=bar +

+

+ idle +

+

+

" + `); + }); + + it("accepts unstable_defaultShouldRevalidate on navigations", async () => { + let loaderDefer = createDeferred(); + let actionDefer = createDeferred(); + + let router = createTestRouter( + [ + { + path: "/", + loader: () => loaderDefer.promise, + action: () => actionDefer.promise, + Component: Home, + }, + ], + { + window: getWindow("/"), + hydrationData: { loaderData: { "0": null } }, + }, + ); + let { container } = render(); + + function Home() { + let data = useLoaderData() as string; + let actionData = useActionData() as string | undefined; + let navigation = useNavigation(); + return ( +
+ + + + +
+

{navigation.state}

+

{data}

+

{actionData}

+
+
+ ); + } + + expect(getHtml(container.querySelector("#output")!)) + .toMatchInlineSnapshot(` + "
+

+ idle +

+

+

+

" + `); + + fireEvent.click(screen.getByText("Submit Form")); + await waitFor(() => screen.getByText("submitting")); + actionDefer.resolve("Action Data"); + await waitFor(() => screen.getByText("idle")); + loaderDefer.resolve("SHOULD NOT SEE ME"); + expect(getHtml(container.querySelector("#output")!)) + .toMatchInlineSnapshot(` + "
+

+ idle +

+

+

+ Action Data +

+
" + `); + }); + + it("accepts unstable_defaultShouldRevalidate on fetcher.submit", async () => { + let loaderDefer = createDeferred(); + let actionDefer = createDeferred(); + + let router = createTestRouter( + [ + { + path: "/", + loader: () => loaderDefer.promise, + action: () => actionDefer.promise, + Component: Home, + }, + ], + { + window: getWindow("/"), + hydrationData: { loaderData: { "0": null } }, + }, + ); + let { container } = render(); + + function Home() { + let data = useLoaderData() as string; + let fetcher = useFetcher(); + return ( +
+ +
+

{`${fetcher.state}:${fetcher.data}`}

+

{data}

+
+
+ ); + } + + expect(getHtml(container.querySelector("#output")!)) + .toMatchInlineSnapshot(` + "
+

+ idle:undefined +

+

+

" + `); + + fireEvent.click(screen.getByText("Submit Fetcher")); + await waitFor(() => screen.getByText("submitting:undefined")); + actionDefer.resolve("Action Data"); + await waitFor(() => screen.getByText("idle:Action Data")); + loaderDefer.resolve("SHOULD NOT SEE ME"); + expect(getHtml(container.querySelector("#output")!)) + .toMatchInlineSnapshot(` + "
+

+ idle:Action Data +

+

+

" + `); + }); + }); + describe("
", () => { function NoActionComponent() { return ( @@ -6027,12 +6387,15 @@ function testDomRouter( { window: getWindow("/") }, ); let { container } = render(); - expect(container.innerHTML).not.toMatch(/my-key/); + + expect(container.querySelector("pre")?.innerHTML).toBe(""); fireEvent.click(screen.getByText("Load fetchers")); await waitFor(() => - // React `useId()` results in something such as `«r2a»`, `«r2i»`, - // `«rt»`, or `«rp»` depending on `DataBrowserRouter`/`DataHashRouter` - expect(container.innerHTML).toMatch(/«r[0-9]?[a-z]»,my-key/), + // React `useId()` results in something such as `_r_2k_` or `_r_u_` + // depending on `DataBrowserRouter`/`DataHashRouter` + expect(container.querySelector("pre")?.innerHTML).toMatch( + /^_r_[0-9]?[a-z]_,my-key$/, + ), ); }); diff --git a/packages/react-router/__tests__/router/context-middleware-test.tsx b/packages/react-router/__tests__/router/context-middleware-test.tsx index 8475937dc1..b0031e8fea 100644 --- a/packages/react-router/__tests__/router/context-middleware-test.tsx +++ b/packages/react-router/__tests__/router/context-middleware-test.tsx @@ -1684,6 +1684,110 @@ describe("context/middleware", () => { }); }); }); + + describe("redirects", () => { + it("allows you to return redirects before next from client middleware", async () => { + router = createRouter({ + history: createMemoryHistory(), + routes: [ + { + path: "/", + }, + { + path: "/redirect", + middleware: [ + async () => { + return redirect("/target"); + }, + ], + }, + { + path: "/target", + }, + ], + }); + + await router.navigate("/redirect"); + expect(router.state.location.pathname).toBe("/target"); + }); + + it("allows you to return redirects after next from client middleware", async () => { + router = createRouter({ + history: createMemoryHistory(), + routes: [ + { + path: "/", + }, + { + path: "/redirect", + middleware: [ + async (_, next) => { + await next(); + return redirect("/target"); + }, + ], + }, + { + path: "/target", + }, + ], + }); + + await router.navigate("/redirect"); + expect(router.state.location.pathname).toBe("/target"); + }); + + it("allows you to throw redirects before next from client middleware", async () => { + router = createRouter({ + history: createMemoryHistory(), + routes: [ + { + path: "/", + }, + { + path: "/redirect", + middleware: [ + async () => { + throw redirect("/target"); + }, + ], + }, + { + path: "/target", + }, + ], + }); + + await router.navigate("/redirect"); + expect(router.state.location.pathname).toBe("/target"); + }); + + it("allows you to throw redirects after next from client middleware", async () => { + router = createRouter({ + history: createMemoryHistory(), + routes: [ + { + path: "/", + }, + { + path: "/redirect", + middleware: [ + async (_, next) => { + await next(); + throw redirect("/target"); + }, + ], + }, + { + path: "/target", + }, + ], + }); + + await router.navigate("/redirect"); + expect(router.state.location.pathname).toBe("/target"); + }); + }); }); describe("middleware - handler.query", () => { diff --git a/packages/react-router/__tests__/router/should-revalidate-test.ts b/packages/react-router/__tests__/router/should-revalidate-test.ts index ad0ce40b31..27b79e055a 100644 --- a/packages/react-router/__tests__/router/should-revalidate-test.ts +++ b/packages/react-router/__tests__/router/should-revalidate-test.ts @@ -1,9 +1,9 @@ import { createMemoryHistory } from "../../lib/router/history"; -import { createRouter } from "../../lib/router/router"; +import { IDLE_NAVIGATION, createRouter } from "../../lib/router/router"; import { ErrorResponseImpl, redirect } from "../../lib/router/utils"; import type { ShouldRevalidateFunctionArgs } from "../../lib/router/utils"; import { urlMatch } from "./utils/custom-matchers"; -import { cleanup, getFetcherData } from "./utils/data-router-setup"; +import { cleanup, getFetcherData, setup } from "./utils/data-router-setup"; import { createFormData, tick } from "./utils/utils"; interface CustomMatchers { @@ -1232,4 +1232,418 @@ describe("shouldRevalidate", () => { router.dispose(); }); + + describe("call-site revalidation opt out", () => { + it("skips revalidation on loading navigation", async () => { + let t = setup({ + routes: [ + { + id: "index", + path: "/", + loader: true, + }, + ], + hydrationData: { + loaderData: { + index: "INDEX", + }, + }, + }); + + let A = await t.navigate("/?foo=bar", { + unstable_defaultShouldRevalidate: false, + }); + + A.loaders.index.resolve("SHOULD NOT BE CALLED"); + + expect(t.router.state).toMatchObject({ + location: expect.objectContaining({ + pathname: "/", + search: "?foo=bar", + }), + navigation: IDLE_NAVIGATION, + loaderData: { + index: "INDEX", + }, + }); + }); + + it("passes value through to route shouldRevalidate for loading navigations", async () => { + let calledWithValue: boolean | undefined = undefined; + let t = setup({ + routes: [ + { + id: "index", + path: "/", + loader: true, + shouldRevalidate: ({ defaultShouldRevalidate }) => { + calledWithValue = defaultShouldRevalidate; + return defaultShouldRevalidate; + }, + }, + ], + hydrationData: { + loaderData: { + index: "INDEX", + }, + }, + }); + + let A = await t.navigate("/?foo=bar", { + unstable_defaultShouldRevalidate: false, + }); + + A.loaders.index.resolve("SHOULD NOT BE CALLED"); + + expect(calledWithValue).toBe(false); + expect(t.router.state).toMatchObject({ + location: expect.objectContaining({ + pathname: "/", + search: "?foo=bar", + }), + navigation: IDLE_NAVIGATION, + loaderData: { + index: "INDEX", + }, + }); + }); + + it("skips revalidation on submission navigation", async () => { + let key = "key"; + let t = setup({ + routes: [ + { + id: "index", + path: "/", + loader: true, + action: true, + }, + { + id: "fetch", + path: "/fetch", + loader: true, + }, + ], + hydrationData: { + loaderData: { + index: "INDEX", + }, + }, + }); + + // preload a fetcher + let A = await t.fetch("/fetch", key); + await A.loaders.fetch.resolve("LOAD"); + expect(t.fetchers[key]).toMatchObject({ + state: "idle", + data: "LOAD", + }); + + // submit action with shouldRevalidate=false + let B = await t.navigate( + "/", + { + formMethod: "post", + formData: createFormData({}), + unstable_defaultShouldRevalidate: false, + }, + ["fetch"], + ); + + // resolve action — no loaders should trigger + await B.actions.index.resolve("ACTION"); + + B.loaders.index.resolve("SHOULD NOT BE CALLED"); + B.loaders.fetch.resolve("SHOULD NOT BE CALLED"); + + expect(t.router.state).toMatchObject({ + navigation: IDLE_NAVIGATION, + actionData: { + index: "ACTION", + }, + loaderData: { + index: "INDEX", + }, + }); + expect(t.fetchers[key]).toMatchObject({ + state: "idle", + data: "LOAD", + }); + }); + + it("passes value through to route shouldRevalidate on submission navigation", async () => { + let key = "key"; + let calledWithValue1: boolean | undefined = undefined; + let calledWithValue2: boolean | undefined = undefined; + let t = setup({ + routes: [ + { + id: "index", + path: "/", + loader: true, + action: true, + shouldRevalidate: ({ defaultShouldRevalidate }) => { + calledWithValue1 = defaultShouldRevalidate; + return defaultShouldRevalidate; + }, + }, + { + id: "fetch", + path: "/fetch", + loader: true, + shouldRevalidate: ({ defaultShouldRevalidate }) => { + calledWithValue2 = defaultShouldRevalidate; + return defaultShouldRevalidate; + }, + }, + ], + hydrationData: { + loaderData: { + index: "INDEX", + }, + }, + }); + + // preload a fetcher + let A = await t.fetch("/fetch", key); + await A.loaders.fetch.resolve("LOAD"); + expect(t.fetchers[key]).toMatchObject({ + state: "idle", + data: "LOAD", + }); + + // submit action with shouldRevalidate=false + let B = await t.navigate( + "/", + { + formMethod: "post", + formData: createFormData({}), + unstable_defaultShouldRevalidate: false, + }, + ["fetch"], + ); + + // resolve action — no loaders should trigger + await B.actions.index.resolve("ACTION"); + + B.loaders.index.resolve("SHOULD NOT BE CALLED"); + B.loaders.fetch.resolve("SHOULD NOT BE CALLED"); + + expect(calledWithValue1).toBe(false); + expect(calledWithValue2).toBe(false); + + expect(t.router.state).toMatchObject({ + navigation: IDLE_NAVIGATION, + actionData: { + index: "ACTION", + }, + loaderData: { + index: "INDEX", + }, + }); + expect(t.fetchers[key]).toMatchObject({ + state: "idle", + data: "LOAD", + }); + }); + + it("skips revalidation on fetcher.submit", async () => { + let key = "key"; + let actionKey = "actionKey"; + let t = setup({ + routes: [ + { + id: "index", + path: "/", + loader: true, + }, + { + id: "fetch", + path: "/fetch", + action: true, + loader: true, + }, + ], + hydrationData: { + loaderData: { + index: "INDEX", + }, + }, + }); + + // preload a fetcher + let A = await t.fetch("/fetch", key); + await A.loaders.fetch.resolve("LOAD"); + expect(t.fetchers[key]).toMatchObject({ + state: "idle", + data: "LOAD", + }); + + // submit action with shouldRevalidate=false + let B = await t.fetch("/fetch", actionKey, "index", { + formMethod: "post", + formData: createFormData({}), + unstable_defaultShouldRevalidate: false, + }); + t.shimHelper(B.loaders, "fetch", "loader", "fetch"); + + // resolve action — no loaders should trigger + await B.actions.fetch.resolve("ACTION"); + + B.loaders.index.resolve("SHOULD NOT BE CALLED"); + B.loaders.fetch.resolve("SHOULD NOT BE CALLED"); + + expect(t.router.state.loaderData).toEqual({ + index: "INDEX", + }); + expect(t.fetchers[key]).toMatchObject({ + state: "idle", + data: "LOAD", + }); + expect(t.fetchers[actionKey]).toMatchObject({ + state: "idle", + data: "ACTION", + }); + }); + + it("passes through value on fetcher.submit", async () => { + let key = "key"; + let actionKey = "actionKey"; + let calledWithValue1: boolean | undefined = undefined; + let calledWithValue2: boolean | undefined = undefined; + let t = setup({ + routes: [ + { + id: "index", + path: "/", + loader: true, + shouldRevalidate: ({ defaultShouldRevalidate }) => { + calledWithValue1 = defaultShouldRevalidate; + return defaultShouldRevalidate; + }, + }, + { + id: "fetch", + path: "/fetch", + action: true, + loader: true, + shouldRevalidate: ({ defaultShouldRevalidate }) => { + calledWithValue2 = defaultShouldRevalidate; + return defaultShouldRevalidate; + }, + }, + ], + hydrationData: { + loaderData: { + index: "INDEX", + }, + }, + }); + + // preload a fetcher + let A = await t.fetch("/fetch", key); + await A.loaders.fetch.resolve("LOAD"); + expect(t.fetchers[key]).toMatchObject({ + state: "idle", + data: "LOAD", + }); + + // submit action with shouldRevalidate=false + let B = await t.fetch("/fetch", actionKey, "index", { + formMethod: "post", + formData: createFormData({}), + unstable_defaultShouldRevalidate: false, + }); + t.shimHelper(B.loaders, "fetch", "loader", "fetch"); + + // resolve action — no loaders should trigger + await B.actions.fetch.resolve("ACTION"); + + B.loaders.index.resolve("SHOULD NOT BE CALLED"); + B.loaders.fetch.resolve("SHOULD NOT BE CALLED"); + + expect(calledWithValue1).toBe(false); + expect(calledWithValue2).toBe(false); + expect(t.router.state.loaderData).toEqual({ + index: "INDEX", + }); + expect(t.fetchers[key]).toMatchObject({ + state: "idle", + data: "LOAD", + }); + expect(t.fetchers[actionKey]).toMatchObject({ + state: "idle", + data: "ACTION", + }); + }); + + it("allows route to override call-site value", async () => { + let key = "key"; + let actionKey = "actionKey"; + let calledWithValue1: boolean | undefined = undefined; + let calledWithValue2: boolean | undefined = undefined; + let t = setup({ + routes: [ + { + id: "index", + path: "/", + loader: true, + shouldRevalidate: ({ defaultShouldRevalidate }) => { + calledWithValue1 = defaultShouldRevalidate; + return true; + }, + }, + { + id: "fetch", + path: "/fetch", + action: true, + loader: true, + shouldRevalidate: ({ defaultShouldRevalidate }) => { + calledWithValue2 = defaultShouldRevalidate; + return defaultShouldRevalidate; + }, + }, + ], + hydrationData: { + loaderData: { + index: "INDEX", + }, + }, + }); + + // preload a fetcher + let A = await t.fetch("/fetch", key); + await A.loaders.fetch.resolve("LOAD"); + expect(t.fetchers[key]).toMatchObject({ + state: "idle", + data: "LOAD", + }); + + // submit action with shouldRevalidate=false + let B = await t.fetch("/fetch", actionKey, "index", { + formMethod: "post", + formData: createFormData({}), + unstable_defaultShouldRevalidate: false, + }); + t.shimHelper(B.loaders, "fetch", "loader", "fetch"); + + await B.actions.fetch.resolve("ACTION"); + await B.loaders.index.resolve("INDEX*"); + B.loaders.fetch.resolve("SHOULD NOT BE CALLED"); + + expect(calledWithValue1).toBe(false); + expect(calledWithValue2).toBe(false); + expect(t.router.state.loaderData).toEqual({ + index: "INDEX*", + }); + expect(t.fetchers[key]).toMatchObject({ + state: "idle", + data: "LOAD", + }); + expect(t.fetchers[actionKey]).toMatchObject({ + state: "idle", + data: "ACTION", + }); + }); + }); }); diff --git a/packages/react-router/index.ts b/packages/react-router/index.ts index dc5c81704a..249baffc01 100644 --- a/packages/react-router/index.ts +++ b/packages/react-router/index.ts @@ -103,7 +103,7 @@ export { AwaitContextProvider as UNSAFE_AwaitContextProvider } from "./lib/conte export type { AwaitProps, IndexRouteProps, - unstable_ClientOnErrorFunction, + ClientOnErrorFunction, LayoutRouteProps, MemoryRouterOpts, MemoryRouterProps, diff --git a/packages/react-router/lib/components.tsx b/packages/react-router/lib/components.tsx index 64e6376751..c7b9cdf8b2 100644 --- a/packages/react-router/lib/components.tsx +++ b/packages/react-router/lib/components.tsx @@ -56,6 +56,7 @@ import { NavigationContext, RouteContext, ViewTransitionContext, + useIsRSCRouterContext, } from "./context"; import { _renderMatches, @@ -358,7 +359,7 @@ class Deferred { * Function signature for client side error handling for loader/actions errors * and rendering errors via `componentDidCatch` */ -export interface unstable_ClientOnErrorFunction { +export interface ClientOnErrorFunction { ( error: unknown, info: { @@ -389,9 +390,9 @@ export interface RouterProviderProps { */ flushSync?: (fn: () => unknown) => undefined; /** - * An error handler function that will be called for any loader/action/render - * errors that are encountered in your application. This is useful for - * logging or reporting errors instead of the `ErrorBoundary` because it's not + * An error handler function that will be called for any middleware, loader, action, + * or render errors that are encountered in your application. This is useful for + * logging or reporting errors instead of in the {@link ErrorBoundary} because it's not * subject to re-rendering and will only run one time per error. * * The `errorInfo` parameter is passed along from @@ -399,13 +400,14 @@ export interface RouterProviderProps { * and is only present for render errors. * * ```tsx - * { - * console.error(error, errorInfo); - * reportToErrorService(error, errorInfo); + * { + * let { location, params, unstable_pattern, errorInfo } = info; + * console.error(error, location, errorInfo); + * reportToErrorService(error, location, errorInfo); * }} /> * ``` */ - unstable_onError?: unstable_ClientOnErrorFunction; + onError?: ClientOnErrorFunction; /** * Control whether router state updates are internally wrapped in * [`React.startTransition`](https://react.dev/reference/react/startTransition). @@ -454,7 +456,7 @@ export interface RouterProviderProps { * @mode data * @param props Props * @param {RouterProviderProps.flushSync} props.flushSync n/a - * @param {RouterProviderProps.unstable_onError} props.unstable_onError n/a + * @param {RouterProviderProps.onError} props.onError n/a * @param {RouterProviderProps.router} props.router n/a * @param {RouterProviderProps.unstable_useTransitions} props.unstable_useTransitions n/a * @returns React element for the rendered router @@ -462,9 +464,12 @@ export interface RouterProviderProps { export function RouterProvider({ router, flushSync: reactDomFlushSyncImpl, - unstable_onError, + onError, unstable_useTransitions, }: RouterProviderProps): React.ReactElement { + let unstable_rsc = useIsRSCRouterContext(); + unstable_useTransitions = unstable_rsc || unstable_useTransitions; + let [_state, setStateImpl] = React.useState(router.state); let [state, setOptimisticState] = useOptimisticSafe(_state); let [pendingState, setPendingState] = React.useState(); @@ -486,9 +491,9 @@ export function RouterProvider({ { deletedFetchers, newErrors, flushSync, viewTransitionOpts }, ) => { // Send router errors through onError - if (newErrors && unstable_onError) { + if (newErrors && onError) { Object.values(newErrors).forEach((error) => - unstable_onError(error, { + onError(error, { location: newState.location, params: newState.matches[0]?.params ?? {}, unstable_pattern: getRoutePattern(newState.matches), @@ -608,7 +613,7 @@ export function RouterProvider({ renderDfd, unstable_useTransitions, setOptimisticState, - unstable_onError, + onError, ], ); @@ -714,9 +719,9 @@ export function RouterProvider({ navigator, static: false, basename, - unstable_onError, + onError, }), - [router, navigator, basename, unstable_onError], + [router, navigator, basename, onError], ); // The fragment and {null} here are important! We need them to keep React 18's @@ -736,13 +741,13 @@ export function RouterProvider({ location={state.location} navigationType={state.historyAction} navigator={navigator} - unstable_useTransitions={unstable_useTransitions === true} + unstable_useTransitions={unstable_useTransitions} > @@ -788,14 +793,14 @@ function DataRoutes({ routes, future, state, - unstable_onError, + onError, }: { routes: DataRouteObject[]; future: DataRouter["future"]; state: RouterState; - unstable_onError: unstable_ClientOnErrorFunction | undefined; + onError: ClientOnErrorFunction | undefined; }): React.ReactElement | null { - return useRoutesImpl(routes, undefined, state, unstable_onError, future); + return useRoutesImpl(routes, undefined, state, onError, future); } /** @@ -891,7 +896,7 @@ export function MemoryRouter({ location={state.location} navigationType={state.action} navigator={history} - unstable_useTransitions={unstable_useTransitions === true} + unstable_useTransitions={unstable_useTransitions} /> ); } @@ -1306,9 +1311,20 @@ export interface RouterProps { */ static?: boolean; /** - * Whether this router should wrap navigations in `React.startTransition()` + * Control whether router state updates are internally wrapped in + * [`React.startTransition`](https://react.dev/reference/react/startTransition). + * + * - When left `undefined`, all router state updates are wrapped in + * `React.startTransition` + * - When set to `true`, {@link Link} and {@link Form} navigations will be wrapped + * in `React.startTransition` and all router state updates are wrapped in + * `React.startTransition` + * - When set to `false`, the router will not leverage `React.startTransition` + * on any navigations or state changes. + * + * For more information, please see the [docs](https://reactrouter.com/explanation/react-transitions). */ - unstable_useTransitions: boolean; + unstable_useTransitions?: boolean; } /** @@ -1624,10 +1640,10 @@ export function Await({ (error: unknown, errorInfo?: React.ErrorInfo) => { if ( dataRouterContext && - dataRouterContext.unstable_onError && + dataRouterContext.onError && dataRouterStateContext ) { - dataRouterContext.unstable_onError(error, { + dataRouterContext.onError(error, { location: dataRouterStateContext.location, params: dataRouterStateContext.matches[0]?.params || {}, unstable_pattern: getRoutePattern(dataRouterStateContext.matches), diff --git a/packages/react-router/lib/context.ts b/packages/react-router/lib/context.ts index ed31101f3a..60d1c4e178 100644 --- a/packages/react-router/lib/context.ts +++ b/packages/react-router/lib/context.ts @@ -1,5 +1,5 @@ import * as React from "react"; -import type { unstable_ClientOnErrorFunction } from "./components"; +import type { ClientOnErrorFunction } from "./components"; import type { History, Location, @@ -92,7 +92,7 @@ export interface DataRouterContextObject extends Omit { router: Router; staticContext?: StaticHandlerContext; - unstable_onError?: unstable_ClientOnErrorFunction; + onError?: ClientOnErrorFunction; } export const DataRouterContext = @@ -155,6 +155,8 @@ export interface NavigateOptions { flushSync?: boolean; /** Enables a {@link https://developer.mozilla.org/en-US/docs/Web/API/View_Transitions_API View Transition} for this navigation by wrapping the final state update in `document.startViewTransition()`. If you need to apply specific styles for this view transition, you will also need to leverage the {@link https://api.reactrouter.com/v7/functions/react_router.useViewTransitionState.html useViewTransitionState()} hook. */ viewTransition?: boolean; + /** Specifies the default revalidation behavior after this submission */ + unstable_defaultShouldRevalidate?: boolean; } /** @@ -179,7 +181,7 @@ interface NavigationContextObject { basename: string; navigator: Navigator; static: boolean; - unstable_useTransitions: boolean; + unstable_useTransitions: boolean | undefined; // TODO: Re-introduce a singular `FutureConfig` once we land our first // future.unstable_ or future.v8_ flag future: {}; diff --git a/packages/react-router/lib/dom-export/hydrated-router.tsx b/packages/react-router/lib/dom-export/hydrated-router.tsx index 42d2fc0dbf..19c2c1c691 100644 --- a/packages/react-router/lib/dom-export/hydrated-router.tsx +++ b/packages/react-router/lib/dom-export/hydrated-router.tsx @@ -6,7 +6,7 @@ import type { DataRouter, HydrationState, RouterInit, - unstable_ClientOnErrorFunction, + ClientOnErrorFunction, } from "react-router"; import { UNSAFE_getHydrationData as getHydrationData, @@ -281,9 +281,9 @@ export interface HydratedRouterProps { */ unstable_instrumentations?: unstable_ClientInstrumentation[]; /** - * An error handler function that will be called for any loader/action/render - * errors that are encountered in your application. This is useful for - * logging or reporting errors instead of the `ErrorBoundary` because it's not + * An error handler function that will be called for any middleware, loader, action, + * or render errors that are encountered in your application. This is useful for + * logging or reporting errors instead of in the {@link ErrorBoundary} because it's not * subject to re-rendering and will only run one time per error. * * The `errorInfo` parameter is passed along from @@ -291,13 +291,14 @@ export interface HydratedRouterProps { * and is only present for render errors. * * ```tsx - * { - * console.error(error, errorInfo); - * reportToErrorService(error, errorInfo); + * { + * let { location, params, unstable_pattern, errorInfo } = info; + * console.error(error, location, errorInfo); + * reportToErrorService(error, location, errorInfo); * }} /> * ``` */ - unstable_onError?: unstable_ClientOnErrorFunction; + onError?: ClientOnErrorFunction; /** * Control whether router state updates are internally wrapped in * [`React.startTransition`](https://react.dev/reference/react/startTransition). @@ -328,7 +329,7 @@ export interface HydratedRouterProps { * @mode framework * @param props Props * @param {dom.HydratedRouterProps.getContext} props.getContext n/a - * @param {dom.HydratedRouterProps.unstable_onError} props.unstable_onError n/a + * @param {dom.HydratedRouterProps.onError} props.onError n/a * @returns A React element that represents the hydrated application. */ export function HydratedRouter(props: HydratedRouterProps) { @@ -424,7 +425,7 @@ export function HydratedRouter(props: HydratedRouterProps) { diff --git a/packages/react-router/lib/dom/dom.ts b/packages/react-router/lib/dom/dom.ts index 83886b632f..476af2552d 100644 --- a/packages/react-router/lib/dom/dom.ts +++ b/packages/react-router/lib/dom/dom.ts @@ -192,6 +192,19 @@ interface SharedSubmitOptions { * Enable flushSync for this submission's state updates */ flushSync?: boolean; + + /** + * Specify the default revalidation behavior after this submission + * + * If no `shouldRevalidate` functions are present on the active routes, then this + * value will be used directly. Otherwise it will be passed into `shouldRevalidate` + * so the route can make the final determination on revalidation. This can be + * useful when updating search params and you don't want to trigger a revalidation. + * + * By default (when not specified), loaders will revalidate according to the routers + * standard revalidation behavior. + */ + unstable_defaultShouldRevalidate?: boolean; } /** diff --git a/packages/react-router/lib/dom/lib.tsx b/packages/react-router/lib/dom/lib.tsx index d740bf6c06..4c8a514d37 100644 --- a/packages/react-router/lib/dom/lib.tsx +++ b/packages/react-router/lib/dom/lib.tsx @@ -36,6 +36,7 @@ import { ErrorResponseImpl, joinPaths, matchPath, + parseToInfo, stripBasename, } from "../router/utils"; @@ -848,7 +849,7 @@ export function BrowserRouter({ location={state.location} navigationType={state.action} navigator={history} - unstable_useTransitions={unstable_useTransitions === true} + unstable_useTransitions={unstable_useTransitions} /> ); } @@ -939,7 +940,7 @@ export function HashRouter({ location={state.location} navigationType={state.action} navigator={history} - unstable_useTransitions={unstable_useTransitions === true} + unstable_useTransitions={unstable_useTransitions} /> ); } @@ -1026,7 +1027,7 @@ export function HistoryRouter({ location={state.location} navigationType={state.action} navigator={history} - unstable_useTransitions={unstable_useTransitions === true} + unstable_useTransitions={unstable_useTransitions} /> ); } @@ -1200,6 +1201,23 @@ export interface LinkProps * To apply specific styles for the transition, see {@link useViewTransitionState} */ viewTransition?: boolean; + + /** + * Specify the default revalidation behavior for the navigation. + * + * ```tsx + * + * ``` + * + * If no `shouldRevalidate` functions are present on the active routes, then this + * value will be used directly. Otherwise it will be passed into `shouldRevalidate` + * so the route can make the final determination on revalidation. This can be + * useful when updating search params and you don't want to trigger a revalidation. + * + * By default (when not specified), loaders will revalidate according to the routers + * standard revalidation behavior. + */ + unstable_defaultShouldRevalidate?: boolean; } const ABSOLUTE_URL_REGEX = /^(?:[a-z][a-z0-9+.-]*:|\/\/)/i; @@ -1232,6 +1250,7 @@ const ABSOLUTE_URL_REGEX = /^(?:[a-z][a-z0-9+.-]*:|\/\/)/i; * @param {LinkProps.state} props.state n/a * @param {LinkProps.to} props.to n/a * @param {LinkProps.viewTransition} props.viewTransition [modes: framework, data] n/a + * @param {LinkProps.unstable_defaultShouldRevalidate} props.unstable_defaultShouldRevalidate n/a */ export const Link = React.forwardRef( function LinkWithRef( @@ -1247,6 +1266,7 @@ export const Link = React.forwardRef( to, preventScrollReset, viewTransition, + unstable_defaultShouldRevalidate, ...rest }, forwardedRef, @@ -1255,39 +1275,8 @@ export const Link = React.forwardRef( React.useContext(NavigationContext); let isAbsolute = typeof to === "string" && ABSOLUTE_URL_REGEX.test(to); - // Rendered into for absolute URLs - let absoluteHref; - let isExternal = false; - - if (typeof to === "string" && isAbsolute) { - // Render the absolute href server- and client-side - absoluteHref = to; - - // Only check for external origins client-side - if (isBrowser) { - try { - let currentUrl = new URL(window.location.href); - let targetUrl = to.startsWith("//") - ? new URL(currentUrl.protocol + to) - : new URL(to); - let path = stripBasename(targetUrl.pathname, basename); - - if (targetUrl.origin === currentUrl.origin && path != null) { - // Strip the protocol/origin/basename for same-origin absolute URLs - to = path + targetUrl.search + targetUrl.hash; - } else { - isExternal = true; - } - } catch (e) { - // We can't do external URL detection without a valid URL - warning( - false, - ` contains an invalid URL which will probably break ` + - `when clicked - please update to a valid URL path.`, - ); - } - } - } + let parsed = parseToInfo(to, basename); + to = parsed.to; // Rendered into for relative URLs let href = useHref(to, { relative }); @@ -1303,6 +1292,7 @@ export const Link = React.forwardRef( preventScrollReset, relative, viewTransition, + unstable_defaultShouldRevalidate, unstable_useTransitions, }); function handleClick( @@ -1319,8 +1309,8 @@ export const Link = React.forwardRef( { * then this form will not do anything. */ onSubmit?: React.FormEventHandler; + + /** + * Specify the default revalidation behavior after this submission + * + * If no `shouldRevalidate` functions are present on the active routes, then this + * value will be used directly. Otherwise it will be passed into `shouldRevalidate` + * so the route can make the final determination on revalidation. This can be + * useful when updating search params and you don't want to trigger a revalidation. + * + * By default (when not specified), loaders will revalidate according to the routers + * standard revalidation behavior. + */ + unstable_defaultShouldRevalidate?: boolean; } /** @@ -1826,6 +1829,7 @@ type HTMLFormSubmitter = HTMLButtonElement | HTMLInputElement; * @param {FormProps.replace} replace n/a * @param {FormProps.state} state n/a * @param {FormProps.viewTransition} viewTransition n/a + * @param {FormProps.unstable_defaultShouldRevalidate} unstable_defaultShouldRevalidate n/a * @returns A progressively enhanced [``](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form) component */ export const Form = React.forwardRef( @@ -1843,6 +1847,7 @@ export const Form = React.forwardRef( relative, preventScrollReset, viewTransition, + unstable_defaultShouldRevalidate, ...props }, forwardedRef, @@ -1877,6 +1882,7 @@ export const Form = React.forwardRef( relative, preventScrollReset, viewTransition, + unstable_defaultShouldRevalidate, }); if (unstable_useTransitions && navigate !== false) { @@ -2099,6 +2105,8 @@ function useDataRouterState(hookName: DataRouterStateHook) { * @param options.viewTransition Enables a [View Transition](https://developer.mozilla.org/en-US/docs/Web/API/View_Transitions_API) * for this navigation. To apply specific styles during the transition, see * {@link useViewTransitionState}. Defaults to `false`. + * @param options.unstable_defaultShouldRevalidate Specify the default revalidation + * behavior for the navigation. Defaults to `true`. * @param options.unstable_useTransitions Wraps the navigation in * [`React.startTransition`](https://react.dev/reference/react/startTransition) * for concurrent rendering. Defaults to `false`. @@ -2113,6 +2121,7 @@ export function useLinkClickHandler( preventScrollReset, relative, viewTransition, + unstable_defaultShouldRevalidate, unstable_useTransitions, }: { target?: React.HTMLAttributeAnchorTarget; @@ -2121,6 +2130,7 @@ export function useLinkClickHandler( preventScrollReset?: boolean; relative?: RelativeRoutingType; viewTransition?: boolean; + unstable_defaultShouldRevalidate?: boolean; unstable_useTransitions?: boolean; } = {}, ): (event: React.MouseEvent) => void { @@ -2147,6 +2157,7 @@ export function useLinkClickHandler( preventScrollReset, relative, viewTransition, + unstable_defaultShouldRevalidate, }); if (unstable_useTransitions) { @@ -2168,6 +2179,7 @@ export function useLinkClickHandler( preventScrollReset, relative, viewTransition, + unstable_defaultShouldRevalidate, unstable_useTransitions, ], ); @@ -2490,6 +2502,8 @@ export function useSubmit(): SubmitFunction { if (options.navigate === false) { let key = options.fetcherKey || getUniqueFetcherId(); await routerFetch(key, currentRouteId, options.action || action, { + unstable_defaultShouldRevalidate: + options.unstable_defaultShouldRevalidate, preventScrollReset: options.preventScrollReset, formData, body, @@ -2499,6 +2513,8 @@ export function useSubmit(): SubmitFunction { }); } else { await routerNavigate(options.action || action, { + unstable_defaultShouldRevalidate: + options.unstable_defaultShouldRevalidate, preventScrollReset: options.preventScrollReset, formData, body, diff --git a/packages/react-router/lib/errors.ts b/packages/react-router/lib/errors.ts new file mode 100644 index 0000000000..8887f751a8 --- /dev/null +++ b/packages/react-router/lib/errors.ts @@ -0,0 +1,96 @@ +import { isDataWithResponseInit } from "./router/router"; +import { ErrorResponseImpl } from "./router/utils"; +import type { DataWithResponseInit } from "./router/utils"; + +const ERROR_DIGEST_BASE = "REACT_ROUTER_ERROR"; // 18 +const ERROR_DIGEST_REDIRECT = "REDIRECT"; // 8 +const ERROR_DIGEST_ROUTE_ERROR_RESPONSE = "ROUTE_ERROR_RESPONSE"; // 20 + +export function createRedirectErrorDigest(response: Response) { + return `${ERROR_DIGEST_BASE}:${ERROR_DIGEST_REDIRECT}:${JSON.stringify({ + status: response.status, + statusText: response.statusText, + location: response.headers.get("Location"), + reloadDocument: response.headers.get("X-Remix-Reload-Document") === "true", + replace: response.headers.get("X-Remix-Replace") === "true", + })}`; +} + +export function decodeRedirectErrorDigest(digest: string): + | undefined + | { + status: number; + statusText: string; + location: string; + reloadDocument: boolean; + replace: boolean; + } { + if (digest.startsWith(`${ERROR_DIGEST_BASE}:${ERROR_DIGEST_REDIRECT}:{`)) { + try { + let parsed = JSON.parse(digest.slice(28)); + if ( + typeof parsed === "object" && + parsed && + typeof parsed.status === "number" && + typeof parsed.statusText === "string" && + typeof parsed.location === "string" && + typeof parsed.reloadDocument === "boolean" && + typeof parsed.replace === "boolean" + ) { + return parsed; + } + } catch {} + } +} + +export function createRouteErrorResponseDigest( + response: DataWithResponseInit | Response, +) { + let status = 500; + let statusText = ""; + let data: unknown; + if (isDataWithResponseInit(response)) { + status = response.init?.status ?? status; + statusText = response.init?.statusText ?? statusText; + data = response.data; + } else { + status = response.status; + statusText = response.statusText; + // We can't do async work here to read the response body. + data = undefined; + } + + return `${ERROR_DIGEST_BASE}:${ERROR_DIGEST_ROUTE_ERROR_RESPONSE}:${JSON.stringify( + { + status, + statusText, + data, + }, + )}`; +} + +export function decodeRouteErrorResponseDigest( + digest: string, +): undefined | ErrorResponseImpl { + if ( + digest.startsWith( + `${ERROR_DIGEST_BASE}:${ERROR_DIGEST_ROUTE_ERROR_RESPONSE}:{`, + ) + ) { + try { + let parsed = JSON.parse(digest.slice(40)); + if ( + typeof parsed === "object" && + parsed && + typeof parsed.status === "number" && + typeof parsed.statusText === "string" + ) { + return new ErrorResponseImpl( + parsed.status, + parsed.statusText, + parsed.data, + ); + } + } catch {} + } +} diff --git a/packages/react-router/lib/hooks.tsx b/packages/react-router/lib/hooks.tsx index 4f6ffb16cb..0ab51acae1 100644 --- a/packages/react-router/lib/hooks.tsx +++ b/packages/react-router/lib/hooks.tsx @@ -13,6 +13,7 @@ import { ENABLE_DEV_WARNINGS, LocationContext, NavigationContext, + RSCRouterContext, RouteContext, RouteErrorContext, } from "./context"; @@ -44,10 +45,12 @@ import { decodePath, getResolveToMatches, getRoutePattern, + isBrowser, isRouteErrorResponse, joinPaths, matchPath, matchRoutes, + parseToInfo, resolveTo, stripBasename, } from "./router/utils"; @@ -56,8 +59,12 @@ import type { GetLoaderData, SerializeFrom, } from "./types/route-data"; -import type { unstable_ClientOnErrorFunction } from "./components"; +import type { ClientOnErrorFunction } from "./components"; import type { RouteModules } from "./types/register"; +import { + decodeRedirectErrorDigest, + decodeRouteErrorResponseDigest, +} from "./errors"; /** * Resolves a URL against the current {@link Location}. @@ -757,7 +764,7 @@ export function useRoutesImpl( routes: RouteObject[], locationArg?: Partial | string, dataRouterState?: DataRouter["state"], - unstable_onError?: unstable_ClientOnErrorFunction, + onError?: ClientOnErrorFunction, future?: DataRouter["future"], ): React.ReactElement | null { invariant( @@ -911,7 +918,7 @@ export function useRoutesImpl( ), parentMatches, dataRouterState, - unstable_onError, + onError, future, ); @@ -1012,6 +1019,8 @@ export class RenderErrorBoundary extends React.Component< }; } + static contextType = RSCRouterContext; + static getDerivedStateFromError(error: any) { return { error: error }; } @@ -1062,17 +1071,85 @@ export class RenderErrorBoundary extends React.Component< } render() { - return this.state.error !== undefined ? ( - - + + + ) : ( + this.props.children + ); + + if (this.context) { + return {result}; + } + + return result; + } +} + +const errorRedirectHandledMap = new WeakMap>(); +function RSCErrorHandler({ + children, + error, +}: { + children: React.ReactNode; + error: unknown; +}) { + let { basename } = React.useContext(NavigationContext); + + if ( + typeof error === "object" && + error && + "digest" in error && + typeof error.digest === "string" + ) { + let redirect = decodeRedirectErrorDigest(error.digest); + if (redirect) { + let existingRedirect = errorRedirectHandledMap.get(error); + if (existingRedirect) throw existingRedirect; + + let parsed = parseToInfo(redirect.location, basename); + + if (isBrowser && !errorRedirectHandledMap.get(error)) { + if (parsed.isExternal || redirect.reloadDocument) { + window.location.href = parsed.absoluteURL || parsed.to; + } else { + const redirectPromise: Promise = Promise.resolve().then(() => + window.__reactRouterDataRouter!.navigate(parsed.to, { + replace: redirect.replace, + }), + ); + errorRedirectHandledMap.set(error, redirectPromise); + throw redirectPromise; + } + } + + return ( + - - ) : ( - this.props.children - ); + ); + } } + return children; } interface RenderedRouteProps { @@ -1106,7 +1183,7 @@ export function _renderMatches( matches: RouteMatch[] | null, parentMatches: RouteMatch[] = [], dataRouterState: DataRouter["state"] | null = null, - unstable_onError: unstable_ClientOnErrorFunction | null = null, + onErrorHandler: ClientOnErrorFunction | null = null, future: DataRouter["future"] | null = null, ): React.ReactElement | null { if (matches == null) { @@ -1190,9 +1267,9 @@ export function _renderMatches( } let onError = - dataRouterState && unstable_onError + dataRouterState && onErrorHandler ? (error: unknown, errorInfo?: React.ErrorInfo) => { - unstable_onError(error, { + onErrorHandler(error, { location: dataRouterState.location, params: dataRouterState.matches?.[0]?.params ?? {}, unstable_pattern: getRoutePattern(dataRouterState.matches), diff --git a/packages/react-router/lib/router/router.ts b/packages/react-router/lib/router/router.ts index da9d2557fe..95baa789ab 100644 --- a/packages/react-router/lib/router/router.ts +++ b/packages/react-router/lib/router/router.ts @@ -526,6 +526,7 @@ type BaseNavigateOrFetchOptions = { preventScrollReset?: boolean; relative?: RelativeRoutingType; flushSync?: boolean; + unstable_defaultShouldRevalidate?: boolean; }; // Only allowed for navigations @@ -1592,6 +1593,8 @@ export function createRouter(init: RouterInit): Router { replace: opts && opts.replace, enableViewTransition: opts && opts.viewTransition, flushSync, + callSiteDefaultShouldRevalidate: + opts && opts.unstable_defaultShouldRevalidate, }); } @@ -1667,6 +1670,7 @@ export function createRouter(init: RouterInit): Router { replace?: boolean; enableViewTransition?: boolean; flushSync?: boolean; + callSiteDefaultShouldRevalidate?: boolean; }, ): Promise { // Abort any in-progress navigations and start a new one. Unset any ongoing @@ -1838,6 +1842,7 @@ export function createRouter(init: RouterInit): Router { opts && opts.initialHydration === true, flushSync, pendingActionResult, + opts && opts.callSiteDefaultShouldRevalidate, ); if (shortCircuited) { @@ -2043,6 +2048,7 @@ export function createRouter(init: RouterInit): Router { initialHydration?: boolean, flushSync?: boolean, pendingActionResult?: PendingActionResult, + callSiteDefaultShouldRevalidate?: boolean, ): Promise { // Figure out the right navigation we want to use for data loading let loadingNavigation = @@ -2150,6 +2156,7 @@ export function createRouter(init: RouterInit): Router { basename, init.patchRoutesOnNavigation != null, pendingActionResult, + callSiteDefaultShouldRevalidate, ); pendingNavigationLoadId = ++incrementingLoadId; @@ -2391,6 +2398,7 @@ export function createRouter(init: RouterInit): Router { flushSync, preventScrollReset, submission, + opts && opts.unstable_defaultShouldRevalidate, ); return; } @@ -2423,6 +2431,7 @@ export function createRouter(init: RouterInit): Router { flushSync: boolean, preventScrollReset: boolean, submission: Submission, + callSiteDefaultShouldRevalidate: boolean | undefined, ) { interruptActiveLoads(); fetchLoadMatches.delete(key); @@ -2598,6 +2607,7 @@ export function createRouter(init: RouterInit): Router { basename, init.patchRoutesOnNavigation != null, [match.route.id, actionResult], + callSiteDefaultShouldRevalidate, ); // Put all revalidating fetchers into the loading state, except for the @@ -3032,6 +3042,32 @@ export function createRouter(init: RouterInit): Router { return dataResults; } + // Stub errors where needed if they skipped returning data for routes + // above a route which returned an error. This is a problem if we don't + // already have data (or errors) for the ancestor route because we won't be + // able to render through that route in order to get down to the actual error + // returned on the descendant route + if (!isMutationMethod(request.method)) { + for (let match of matches) { + if (results[match.route.id]?.type === ResultType.error) { + break; + } + if ( + !results.hasOwnProperty(match.route.id) && + !state.loaderData.hasOwnProperty(match.route.id) && + (!state.errors || !state.errors.hasOwnProperty(match.route.id)) && + match.shouldCallHandler() + ) { + results[match.route.id] = { + type: ResultType.error, + result: new Error( + `No result returned from dataStrategy for route ${match.route.id}`, + ), + }; + } + } + } + for (let [routeId, result] of Object.entries(results)) { if (isRedirectDataStrategyResult(result)) { let response = result.result as Response; @@ -4863,6 +4899,7 @@ function getMatchesToLoad( basename: string | undefined, hasPatchRoutesOnNavigation: boolean, pendingActionResult?: PendingActionResult, + callSiteDefaultShouldRevalidate?: boolean, ): { dsMatches: DataStrategyMatch[]; revalidatingFetchers: RevalidatingFetcher[]; @@ -4956,15 +4993,29 @@ function getMatchesToLoad( // provides it's own implementation, then we give them full control but // provide this value so they can leverage it if needed after they check // their own specific use cases - let defaultShouldRevalidate = shouldSkipRevalidation - ? false - : // Forced revalidation due to submission, useRevalidator, or X-Remix-Revalidate - isRevalidationRequired || - currentUrl.pathname + currentUrl.search === - nextUrl.pathname + nextUrl.search || - // Search params affect all loaders - currentUrl.search !== nextUrl.search || - isNewRouteInstance(state.matches[index], match); + let defaultShouldRevalidate = false; + if (typeof callSiteDefaultShouldRevalidate === "boolean") { + // Use call-site value verbatim if provided + defaultShouldRevalidate = callSiteDefaultShouldRevalidate; + } else if (shouldSkipRevalidation) { + // Skip due to 4xx/5xx action result + defaultShouldRevalidate = false; + } else if (isRevalidationRequired) { + // Forced revalidation due to submission, useRevalidator, or X-Remix-Revalidate + defaultShouldRevalidate = true; + } else if ( + currentUrl.pathname + currentUrl.search === + nextUrl.pathname + nextUrl.search + ) { + // Same URL - mimic a hard reload + defaultShouldRevalidate = true; + } else if (currentUrl.search !== nextUrl.search) { + // Search params affect all loaders + defaultShouldRevalidate = true; + } else if (isNewRouteInstance(state.matches[index], match)) { + defaultShouldRevalidate = true; + } + let shouldRevalidateArgs = { ...baseShouldRevalidateArgs, defaultShouldRevalidate, @@ -4980,6 +5031,7 @@ function getMatchesToLoad( scopedContext, shouldLoad, shouldRevalidateArgs, + callSiteDefaultShouldRevalidate, ); }); @@ -5077,11 +5129,19 @@ function getMatchesToLoad( } else { // Otherwise fall back on any user-defined shouldRevalidate, defaulting // to explicit revalidations only + let defaultShouldRevalidate: boolean; + if (typeof callSiteDefaultShouldRevalidate === "boolean") { + // Use call-site value verbatim if provided + defaultShouldRevalidate = callSiteDefaultShouldRevalidate; + } else if (shouldSkipRevalidation) { + defaultShouldRevalidate = false; + } else { + defaultShouldRevalidate = isRevalidationRequired; + } + let shouldRevalidateArgs: ShouldRevalidateFunctionArgs = { ...baseShouldRevalidateArgs, - defaultShouldRevalidate: shouldSkipRevalidation - ? false - : isRevalidationRequired, + defaultShouldRevalidate, }; if (shouldRevalidateLoader(fetcherMatch, shouldRevalidateArgs)) { fetcherDsMatches = getTargetedDataStrategyMatches( @@ -5664,7 +5724,13 @@ function runClientMiddlewarePipeline( return runMiddlewarePipeline( args, handler, - (r) => r, // No post-processing needed on the client + (r) => { + // Throw any redirect responses to short circuit + if (isRedirectResponse(r)) { + throw r; + } + return r; + }, isDataStrategyResults, errorHandler, ); @@ -5875,6 +5941,7 @@ function getDataStrategyMatch( scopedContext: unknown, shouldLoad: boolean, shouldRevalidateArgs: DataStrategyMatch["shouldRevalidateArgs"] = null, + callSiteDefaultShouldRevalidate?: boolean, ): DataStrategyMatch { // The hope here is to avoid a breaking change to the resolve behavior. // Opt-ing into the `shouldCallHandler` API changes some nuanced behavior @@ -5900,12 +5967,20 @@ function getDataStrategyMatch( return shouldLoad; } + if (typeof callSiteDefaultShouldRevalidate === "boolean") { + return shouldRevalidateLoader(match, { + ...shouldRevalidateArgs, + defaultShouldRevalidate: callSiteDefaultShouldRevalidate, + }); + } + if (typeof defaultShouldRevalidate === "boolean") { return shouldRevalidateLoader(match, { ...shouldRevalidateArgs, defaultShouldRevalidate, }); } + return shouldRevalidateLoader(match, shouldRevalidateArgs); }, resolve(handlerOverride) { diff --git a/packages/react-router/lib/router/utils.ts b/packages/react-router/lib/router/utils.ts index 0ec29fdc74..74046d529c 100644 --- a/packages/react-router/lib/router/utils.ts +++ b/packages/react-router/lib/router/utils.ts @@ -2068,3 +2068,65 @@ export function getRoutePattern(matches: AgnosticRouteMatch[]) { .replace(/\/\/*/g, "/") || "/" ); } + +export const isBrowser = + typeof window !== "undefined" && + typeof window.document !== "undefined" && + typeof window.document.createElement !== "undefined"; + +export type ParsedLocationInfo = + | { + absoluteURL: string; + isExternal: boolean; + to: string; + } + | { + absoluteURL: undefined; + isExternal: false; + to: T; + }; +export function parseToInfo( + _to: T, + basename: string, +): ParsedLocationInfo { + let to = _to as string; + if (typeof to !== "string" || !ABSOLUTE_URL_REGEX.test(to)) { + return { + absoluteURL: undefined, + isExternal: false, + to, + }; + } + + let absoluteURL = to; + let isExternal = false; + if (isBrowser) { + try { + let currentUrl = new URL(window.location.href); + let targetUrl = to.startsWith("//") + ? new URL(currentUrl.protocol + to) + : new URL(to); + let path = stripBasename(targetUrl.pathname, basename); + + if (targetUrl.origin === currentUrl.origin && path != null) { + // Strip the protocol/origin/basename for same-origin absolute URLs + to = path + targetUrl.search + targetUrl.hash; + } else { + isExternal = true; + } + } catch (e) { + // We can't do external URL detection without a valid URL + warning( + false, + ` contains an invalid URL which will probably break ` + + `when clicked - please update to a valid URL path.`, + ); + } + } + + return { + absoluteURL, + isExternal, + to, + }; +} diff --git a/packages/react-router/lib/rsc/browser.tsx b/packages/react-router/lib/rsc/browser.tsx index 0fbc3448b6..462ef03097 100644 --- a/packages/react-router/lib/rsc/browser.tsx +++ b/packages/react-router/lib/rsc/browser.tsx @@ -844,7 +844,6 @@ export function RSCHydratedRouter({ @@ -1061,7 +1060,7 @@ async function fetchAndApplyManifestPatches( function addToFifoQueue(path: string, queue: Set) { if (queue.size >= discoveredPathsMaxSize) { let first = queue.values().next().value; - queue.delete(first); + if (typeof first === "string") queue.delete(first); } queue.add(path); } diff --git a/packages/react-router/lib/rsc/server.rsc.ts b/packages/react-router/lib/rsc/server.rsc.ts index 04bea99916..79f726a1cb 100644 --- a/packages/react-router/lib/rsc/server.rsc.ts +++ b/packages/react-router/lib/rsc/server.rsc.ts @@ -12,6 +12,7 @@ import type { import { type Location } from "../router/history"; import { createStaticHandler, + isDataWithResponseInit, isMutationMethod, isResponse, isRedirectResponse, @@ -48,7 +49,7 @@ import { UNSAFE_WithErrorBoundaryProps, // @ts-ignore There are no types before the tsup build when used internally, so // we need to cast. If we add an alias for 'internal/react-server-client' to our - // TSConfig, it breaks the Parcel build within this repo. + // TSConfig, it breaks the Parcel build. } from "react-router/internal/react-server-client"; import type { Await as AwaitType, @@ -60,6 +61,12 @@ import type { ErrorBoundaryProps, HydrateFallbackProps, } from "../components"; + +import { + createRedirectErrorDigest, + createRouteErrorResponseDigest, +} from "../errors"; + const Outlet: typeof OutletType = UNTYPED_Outlet; const WithComponentProps: typeof WithComponentPropsType = UNSAFE_WithComponentProps; @@ -278,7 +285,7 @@ export type DecodeFormStateFunction = ( export type DecodeReplyFunction = ( reply: FormData | string, - { temporaryReferences }: { temporaryReferences: unknown }, + options: { temporaryReferences: unknown }, ) => Promise; export type LoadServerActionFunction = (id: string) => Promise; @@ -379,16 +386,45 @@ export async function matchRSCServerRequest({ generateResponse: ( match: RSCMatch, { + onError, temporaryReferences, }: { + onError(error: unknown): string | undefined; temporaryReferences: unknown; }, ) => Response; }): Promise { - let requestUrl = new URL(request.url); + let url = new URL(request.url); + + basename = basename || "/"; + let normalizedPath = url.pathname; + if (stripBasename(normalizedPath, basename) === "/_root.rsc") { + normalizedPath = basename; + } else if (normalizedPath.endsWith(".rsc")) { + normalizedPath = normalizedPath.replace(/\.rsc$/, ""); + } + + if ( + stripBasename(normalizedPath, basename) !== "/" && + normalizedPath.endsWith("/") + ) { + normalizedPath = normalizedPath.slice(0, -1); + } + url.pathname = normalizedPath; + basename = + basename.length > normalizedPath.length ? normalizedPath : basename; + + let routerRequest = new Request(url.toString(), { + method: request.method, + headers: request.headers, + body: request.body, + signal: request.signal, + duplex: request.body ? "half" : undefined, + } as RequestInit); const temporaryReferences = createTemporaryReferenceSet(); + const requestUrl = new URL(request.url); if (isManifestRequest(requestUrl)) { let response = await generateManifestResponse( routes, @@ -402,19 +438,6 @@ export async function matchRSCServerRequest({ let isDataRequest = isReactServerRequest(requestUrl); - const url = new URL(request.url); - let routerRequest = request; - if (isDataRequest) { - url.pathname = url.pathname.replace(/(_root)?\.rsc$/, ""); - routerRequest = new Request(url.toString(), { - method: request.method, - headers: request.headers, - body: request.body, - signal: request.signal, - duplex: request.body ? "half" : undefined, - } as RequestInit); - } - // Explode lazy functions out the routes so we can use middleware // TODO: This isn't ideal but we can't do it through `lazy()` in the router, // and if we move to `lazy: {}` then we lose all the other things from the @@ -467,7 +490,10 @@ async function generateManifestResponse( request: Request, generateResponse: ( match: RSCMatch, - { temporaryReferences }: { temporaryReferences: unknown }, + options: { + onError(error: unknown): string | undefined; + temporaryReferences: unknown; + }, ) => Response, temporaryReferences: unknown, ) { @@ -518,7 +544,7 @@ async function generateManifestResponse( }), payload, }, - { temporaryReferences }, + { temporaryReferences, onError: defaultOnError }, ); } @@ -722,7 +748,10 @@ async function generateRenderResponse( onError: ((error: unknown) => void) | undefined, generateResponse: ( match: RSCMatch, - { temporaryReferences }: { temporaryReferences: unknown }, + options: { + onError(error: unknown): string | undefined; + temporaryReferences: unknown; + }, ) => Response, temporaryReferences: unknown, ): Promise { @@ -876,7 +905,10 @@ function generateRedirectResponse( isDataRequest: boolean, generateResponse: ( match: RSCMatch, - { temporaryReferences }: { temporaryReferences: unknown }, + options: { + onError(error: unknown): string | undefined; + temporaryReferences: unknown; + }, ) => Response, temporaryReferences: unknown, sideEffectRedirectHeaders: Headers | undefined, @@ -919,7 +951,7 @@ function generateRedirectResponse( headers, payload, }, - { temporaryReferences }, + { temporaryReferences, onError: defaultOnError }, ); } @@ -928,7 +960,10 @@ async function generateStaticContextResponse( basename: string | undefined, generateResponse: ( match: RSCMatch, - { temporaryReferences }: { temporaryReferences: unknown }, + options: { + onError(error: unknown): string | undefined; + temporaryReferences: unknown; + }, ) => Response, statusCode: number, routeIdsToLoad: string[] | null, @@ -988,7 +1023,7 @@ async function generateStaticContextResponse( const baseRenderPayload: Omit = { type: "render", - basename, + basename: staticContext.basename, actionData: staticContext.actionData, errors: staticContext.errors, loaderData: staticContext.loaderData, @@ -1034,7 +1069,7 @@ async function generateStaticContextResponse( headers, payload, }, - { temporaryReferences }, + { temporaryReferences, onError: defaultOnError }, ); } @@ -1335,6 +1370,15 @@ export function isManifestRequest(url: URL) { return url.pathname.endsWith(".manifest"); } +function defaultOnError(error: unknown) { + if (isRedirectResponse(error)) { + return createRedirectErrorDigest(error); + } + if (isResponse(error) || isDataWithResponseInit(error)) { + return createRouteErrorResponseDigest(error); + } +} + function isClientReference(x: any) { try { return x.$$typeof === Symbol.for("react.client.reference"); diff --git a/packages/react-router/lib/rsc/server.ssr.tsx b/packages/react-router/lib/rsc/server.ssr.tsx index 7662d29947..bf49d14ba9 100644 --- a/packages/react-router/lib/rsc/server.ssr.tsx +++ b/packages/react-router/lib/rsc/server.ssr.tsx @@ -10,6 +10,11 @@ import { shouldHydrateRouteLoader } from "../dom/ssr/routes"; import type { RSCPayload } from "./server.rsc"; import { createRSCRouteModules } from "./route-modules"; import { isRouteErrorResponse } from "../router/utils"; +import { + decodeRedirectErrorDigest, + decodeRouteErrorResponseDigest, +} from "../errors"; +import { escapeHtml } from "../dom/ssr/markup"; type DecodedPayload = Promise & { _deepestRenderedBoundaryId?: string | null; @@ -49,7 +54,7 @@ export type SSRCreateFromReadableStreamFunction = ( * * routeRSCServerRequest({ * request, - * fetchServer, + * serverResponse, * createFromReadableStream, * async renderHTML(getPayload) { * const payload = getPayload(); @@ -71,9 +76,7 @@ export type SSRCreateFromReadableStreamFunction = ( * @param opts Options * @param opts.createFromReadableStream Your `react-server-dom-xyz/client`'s * `createFromReadableStream` function, used to decode payloads from the server. - * @param opts.fetchServer A function that forwards a [`Request`](https://developer.mozilla.org/en-US/docs/Web/API/Request) - * to the [RSC](https://react.dev/reference/rsc/server-components) handler - * and returns a `Promise` containing a serialized {@link unstable_RSCPayload}. + * @param opts.serverResponse A Response or partial response generated by the [RSC](https://react.dev/reference/rsc/server-components) handler containing a serialized {@link unstable_RSCPayload}. * @param opts.hydrate Whether to hydrate the server response with the RSC payload. * Defaults to `true`. * @param opts.renderHTML A function that renders the {@link unstable_RSCPayload} to @@ -85,16 +88,20 @@ export type SSRCreateFromReadableStreamFunction = ( */ export async function routeRSCServerRequest({ request, - fetchServer, + serverResponse, createFromReadableStream, renderHTML, hydrate = true, }: { request: Request; - fetchServer: (request: Request) => Promise; + serverResponse: Response; createFromReadableStream: SSRCreateFromReadableStreamFunction; renderHTML: ( getPayload: () => DecodedPayload, + options: { + onError(error: unknown): string | undefined; + onHeaders(headers: Headers): void; + }, ) => ReadableStream | Promise>; hydrate?: boolean; }): Promise { @@ -105,8 +112,6 @@ export async function routeRSCServerRequest({ isManifestRequest(url) || request.headers.has("rsc-action-id"); - const serverResponse = await fetchServer(request); - if ( respondWithRSCPayload || serverResponse.headers.get("React-Router-Resource") === "true" @@ -181,6 +186,9 @@ export async function routeRSCServerRequest({ }) as DecodedPayload; }; + let renderRedirect: { status: number; location: string } | undefined; + let renderError: unknown; + try { if (!detectRedirectResponse.body) { throw new Error("Failed to clone server response"); @@ -206,14 +214,68 @@ export async function routeRSCServerRequest({ }); } - const html = await renderHTML(getPayload); + let reactHeaders = new Headers(); + let status = serverResponse.status; + let statusText = serverResponse.statusText; + + let html = await renderHTML(getPayload, { + onError(error: unknown) { + if ( + typeof error === "object" && + error && + "digest" in error && + typeof error.digest === "string" + ) { + renderRedirect = decodeRedirectErrorDigest(error.digest); + if (renderRedirect) { + return error.digest; + } + let routeErrorResponse = decodeRouteErrorResponseDigest(error.digest); + if (routeErrorResponse) { + renderError = routeErrorResponse; + status = routeErrorResponse.status; + statusText = routeErrorResponse.statusText; + return error.digest; + } + } + }, + onHeaders(headers) { + for (const [key, value] of headers) { + reactHeaders.append(key, value); + } + }, + }); - const headers = new Headers(serverResponse.headers); + const headers = new Headers(reactHeaders); + for (const [key, value] of serverResponse.headers) { + headers.append(key, value); + } headers.set("Content-Type", "text/html; charset=utf-8"); - if (!hydrate) { + if (renderRedirect) { + headers.set("Location", renderRedirect.location); return new Response(html, { - status: serverResponse.status, + status: renderRedirect.status, + headers, + }); + } + + const redirectTransform = new TransformStream({ + flush(controller) { + if (renderRedirect) { + controller.enqueue( + new TextEncoder().encode( + ``, + ), + ); + } + }, + }); + + if (!hydrate) { + return new Response(html.pipeThrough(redirectTransform), { + status, + statusText, headers, }); } @@ -222,9 +284,12 @@ export async function routeRSCServerRequest({ throw new Error("Failed to clone server response"); } - const body = html.pipeThrough(injectRSCPayload(serverResponseB.body)); + const body = html + .pipeThrough(injectRSCPayload(serverResponseB.body)) + .pipeThrough(redirectTransform); return new Response(body, { - status: serverResponse.status, + status, + statusText, headers, }); } catch (reason) { @@ -232,50 +297,118 @@ export async function routeRSCServerRequest({ return reason; } + if (renderRedirect) { + return new Response(`Redirect: ${renderRedirect.location}`, { + status: renderRedirect.status, + headers: { + Location: renderRedirect.location, + }, + }); + } + try { - const status = isRouteErrorResponse(reason) ? reason.status : 500; - - const html = await renderHTML(() => { - const decoded = Promise.resolve( - createFromReadableStream(createStream()), - ) as Promise; - - const payloadPromise = decoded.then((payload) => - Object.assign(payload, { - status, - errors: deepestRenderedBoundaryId - ? { - [deepestRenderedBoundaryId]: reason, - } - : {}, - }), - ); - - return Object.defineProperties(payloadPromise, { - _deepestRenderedBoundaryId: { - get() { - return deepestRenderedBoundaryId; + reason = renderError ?? reason; + let [status, statusText] = isRouteErrorResponse(reason) + ? [reason.status, reason.statusText] + : [500, ""]; + + let retryRedirect: { status: number; location: string } | undefined; + let reactHeaders = new Headers(); + const html = await renderHTML( + () => { + const decoded = Promise.resolve( + createFromReadableStream(createStream()), + ) as Promise; + + const payloadPromise = decoded.then((payload) => + Object.assign(payload, { + status, + errors: deepestRenderedBoundaryId + ? { + [deepestRenderedBoundaryId]: reason, + } + : {}, + }), + ); + + return Object.defineProperties(payloadPromise, { + _deepestRenderedBoundaryId: { + get() { + return deepestRenderedBoundaryId; + }, + set(boundaryId: string | null) { + deepestRenderedBoundaryId = boundaryId; + }, }, - set(boundaryId: string | null) { - deepestRenderedBoundaryId = boundaryId; + formState: { + get() { + return payloadPromise.then((payload) => + payload.type === "render" ? payload.formState : undefined, + ); + }, }, - }, - formState: { - get() { - return payloadPromise.then((payload) => - payload.type === "render" ? payload.formState : undefined, + }) as unknown as DecodedPayload; + }, + { + onError(error: unknown) { + if ( + typeof error === "object" && + error && + "digest" in error && + typeof error.digest === "string" + ) { + retryRedirect = decodeRedirectErrorDigest(error.digest); + if (retryRedirect) { + return error.digest; + } + let routeErrorResponse = decodeRouteErrorResponseDigest( + error.digest, ); - }, + if (routeErrorResponse) { + status = routeErrorResponse.status; + statusText = routeErrorResponse.statusText; + return error.digest; + } + } }, - }) as unknown as DecodedPayload; - }); + onHeaders(headers) { + for (const [key, value] of headers) { + reactHeaders.append(key, value); + } + }, + }, + ); - const headers = new Headers(serverResponse.headers); - headers.set("Content-Type", "text/html"); + const headers = new Headers(reactHeaders); + for (const [key, value] of serverResponse.headers) { + headers.append(key, value); + } + headers.set("Content-Type", "text/html; charset=utf-8"); - if (!hydrate) { + if (retryRedirect) { + headers.set("Location", retryRedirect.location); return new Response(html, { - status: status, + status: retryRedirect.status, + headers, + }); + } + + const retryRedirectTransform = new TransformStream({ + flush(controller) { + if (retryRedirect) { + controller.enqueue( + new TextEncoder().encode( + ``, + ), + ); + } + }, + }); + + if (!hydrate) { + return new Response(html.pipeThrough(retryRedirectTransform), { + status, + statusText, headers, }); } @@ -284,9 +417,12 @@ export async function routeRSCServerRequest({ throw new Error("Failed to clone server response"); } - const body = html.pipeThrough(injectRSCPayload(serverResponseB.body)); + const body = html + .pipeThrough(injectRSCPayload(serverResponseB.body)) + .pipeThrough(retryRedirectTransform); return new Response(body, { status, + statusText, headers, }); } catch { @@ -325,7 +461,7 @@ export interface RSCStaticRouterProps { * * routeRSCServerRequest({ * request, - * fetchServer, + * serverResponse, * createFromReadableStream, * async renderHTML(getPayload) { * const payload = getPayload(); diff --git a/packages/react-router/package.json b/packages/react-router/package.json index 944f04dffa..672d61c465 100644 --- a/packages/react-router/package.json +++ b/packages/react-router/package.json @@ -1,6 +1,6 @@ { "name": "react-router", - "version": "7.10.1", + "version": "7.11.0", "description": "Declarative routing for React", "keywords": [ "react", @@ -112,6 +112,7 @@ "build": { "command": "premove dist && tsup && tsup --config tsup.config.rsc.ts", "files": [ + "../../pnpm-workspace.yaml", "lib/**", "*.ts", "tsconfig.json", @@ -133,13 +134,13 @@ "@types/set-cookie-parser": "^2.4.1", "jest-environment-jsdom": "^29.6.2", "premove": "^4.0.0", - "react": "^19.1.0", - "react-dom": "^19.1.0", + "react": "catalog:", + "react-dom": "catalog:", "react-test-renderer": "^19.1.0", - "tsup": "^8.3.0", - "typescript": "^5.1.6", + "tsup": "catalog:", + "typescript": "catalog:", "undici": "^6.19.2", - "wireit": "0.14.9" + "wireit": "catalog:" }, "peerDependencies": { "react": ">=18", diff --git a/playground/framework-express/package.json b/playground/framework-express/package.json index 260e87bd0c..eede2a6e51 100644 --- a/playground/framework-express/package.json +++ b/playground/framework-express/package.json @@ -13,23 +13,23 @@ "dependencies": { "@react-router/express": "workspace:*", "@react-router/node": "workspace:*", - "compression": "^1.7.4", + "compression": "^1.8.1", "express": "^4.19.2", "isbot": "^5.1.11", - "morgan": "^1.10.0", - "react": "^19.1.0", - "react-dom": "^19.1.0", + "morgan": "^1.10.1", + "react": "catalog:", + "react-dom": "catalog:", "react-router": "workspace:*" }, "devDependencies": { "@react-router/dev": "workspace:*", - "@types/compression": "^1.7.5", + "@types/compression": "^1.8.1", "@types/express": "^4.17.20", - "@types/morgan": "^1.9.9", - "@types/react": "^18.2.20", - "@types/react-dom": "^18.2.7", + "@types/morgan": "^1.9.10", + "@types/react": "catalog:", + "@types/react-dom": "catalog:", "cross-env": "^7.0.3", - "typescript": "^5.1.6", + "typescript": "catalog:", "vite": "^6.3.0", "vite-tsconfig-paths": "^4.2.1" }, diff --git a/playground/framework-rolldown-vite/package.json b/playground/framework-rolldown-vite/package.json index 32d5acafd8..516356ffa0 100644 --- a/playground/framework-rolldown-vite/package.json +++ b/playground/framework-rolldown-vite/package.json @@ -15,15 +15,15 @@ "@react-router/serve": "workspace:*", "cross-env": "^7.0.3", "isbot": "^5.1.11", - "react": "^19.1.0", - "react-dom": "^19.1.0", + "react": "catalog:", + "react-dom": "catalog:", "react-router": "workspace:*" }, "devDependencies": { "@react-router/dev": "workspace:*", - "@types/react": "^18.2.20", - "@types/react-dom": "^18.2.7", - "typescript": "^5.1.6", + "@types/react": "catalog:", + "@types/react-dom": "catalog:", + "typescript": "catalog:", "vite": "npm:rolldown-vite@6.3.0-beta.3", "vite-tsconfig-paths": "^4.2.1" }, diff --git a/playground/framework-spa/package.json b/playground/framework-spa/package.json index 569488836c..316f758e4c 100644 --- a/playground/framework-spa/package.json +++ b/playground/framework-spa/package.json @@ -13,15 +13,15 @@ "dependencies": { "@react-router/node": "workspace:*", "isbot": "^5", - "react": "^19.1.0", - "react-dom": "^19.1.0", + "react": "catalog:", + "react-dom": "catalog:", "react-router": "workspace:*" }, "devDependencies": { "@react-router/dev": "workspace:*", - "@types/react": "^18.2.20", - "@types/react-dom": "^18.2.7", - "typescript": "^5.1.6", + "@types/react": "catalog:", + "@types/react-dom": "catalog:", + "typescript": "catalog:", "vite": "^6.3.0", "vite-tsconfig-paths": "^4.2.1" }, diff --git a/playground/framework-vite-5/package.json b/playground/framework-vite-5/package.json index b63e03428d..1f6cc67f12 100644 --- a/playground/framework-vite-5/package.json +++ b/playground/framework-vite-5/package.json @@ -14,15 +14,15 @@ "@react-router/node": "workspace:*", "@react-router/serve": "workspace:*", "isbot": "^5.1.11", - "react": "^19.1.0", - "react-dom": "^19.1.0", + "react": "catalog:", + "react-dom": "catalog:", "react-router": "workspace:*" }, "devDependencies": { "@react-router/dev": "workspace:*", - "@types/react": "^18.2.20", - "@types/react-dom": "^18.2.7", - "typescript": "^5.1.6", + "@types/react": "catalog:", + "@types/react-dom": "catalog:", + "typescript": "catalog:", "vite": "^5.1.0", "vite-tsconfig-paths": "^4.2.1" }, diff --git a/playground/framework-vite-7-beta/package.json b/playground/framework-vite-7-beta/package.json index 4a72eb7f94..207e499fac 100644 --- a/playground/framework-vite-7-beta/package.json +++ b/playground/framework-vite-7-beta/package.json @@ -14,15 +14,15 @@ "@react-router/node": "workspace:*", "@react-router/serve": "workspace:*", "isbot": "^5.1.11", - "react": "^19.1.0", - "react-dom": "^19.1.0", + "react": "catalog:", + "react-dom": "catalog:", "react-router": "workspace:*" }, "devDependencies": { "@react-router/dev": "workspace:*", - "@types/react": "^18.2.20", - "@types/react-dom": "^18.2.7", - "typescript": "^5.1.6", + "@types/react": "catalog:", + "@types/react-dom": "catalog:", + "typescript": "catalog:", "vite": "7.0.0-beta.0", "vite-tsconfig-paths": "^4.2.1" }, diff --git a/playground/framework/package.json b/playground/framework/package.json index fe277b943b..01f736a690 100644 --- a/playground/framework/package.json +++ b/playground/framework/package.json @@ -14,15 +14,15 @@ "@react-router/node": "workspace:*", "@react-router/serve": "workspace:*", "isbot": "^5.1.11", - "react": "^19.1.0", - "react-dom": "^19.1.0", + "react": "catalog:", + "react-dom": "catalog:", "react-router": "workspace:*" }, "devDependencies": { "@react-router/dev": "workspace:*", - "@types/react": "^18.2.20", - "@types/react-dom": "^18.2.7", - "typescript": "^5.1.6", + "@types/react": "catalog:", + "@types/react-dom": "catalog:", + "typescript": "catalog:", "vite": "^6.3.0", "vite-tsconfig-paths": "^4.2.1" }, diff --git a/playground/middleware/package.json b/playground/middleware/package.json index 3fb820e171..41c5c9e474 100644 --- a/playground/middleware/package.json +++ b/playground/middleware/package.json @@ -13,27 +13,27 @@ "dependencies": { "@react-router/express": "workspace:*", "@react-router/node": "workspace:*", - "compression": "^1.7.4", + "compression": "^1.8.1", "cross-env": "^7.0.3", "express": "^4.19.2", "isbot": "^5.1.11", - "morgan": "^1.10.0", - "react": "^19.1.0", - "react-dom": "^19.1.0", + "morgan": "^1.10.1", + "react": "catalog:", + "react-dom": "catalog:", "react-router": "workspace:*" }, "devDependencies": { "@react-router/dev": "workspace:*", "@react-router/fs-routes": "workspace:*", - "@types/compression": "^1.7.5", + "@types/compression": "^1.8.1", "@types/express": "^4.17.21", "@types/express-serve-static-core": "^5.0.6", - "@types/morgan": "^1.9.9", + "@types/morgan": "^1.9.10", "@types/node": "^20.0.0", - "@types/react": "^18.2.20", - "@types/react-dom": "^18.2.7", + "@types/react": "catalog:", + "@types/react-dom": "catalog:", "tsx": "^4.19.3", - "typescript": "^5.1.6", + "typescript": "catalog:", "vite": "^6.3.0", "vite-tsconfig-paths": "^4.2.1" }, diff --git a/playground/rsc-parcel/.gitignore b/playground/rsc-parcel/.gitignore deleted file mode 100644 index ef718b97ff..0000000000 --- a/playground/rsc-parcel/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -.parcel-cache -dist -node_modules diff --git a/playground/rsc-parcel/package.json b/playground/rsc-parcel/package.json deleted file mode 100644 index 963a67b52b..0000000000 --- a/playground/rsc-parcel/package.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "name": "@playground/rsc-parcel", - "version": "0.0.0", - "private": true, - "source": "src/entry.ssr.tsx", - "server": "dist/server.js", - "targets": { - "server": { - "context": "react-server", - "includeNodeModules": { - "express": false - } - } - }, - "scripts": { - "dev": "parcel --no-cache", - "build": "parcel build --no-cache", - "start": "node dist/server.js", - "typecheck": "tsc" - }, - "devDependencies": { - "@biomejs/biome": "^1.9.4", - "@parcel/packager-react-static": "2.15.0", - "@parcel/transformer-react-static": "2.15.0", - "@types/express": "^5.0.0", - "@types/node": "^22.13.1", - "@types/parcel-env": "0.0.8", - "@types/react-dom": "^19.0.3", - "@types/react": "^19.0.8", - "browserify-zlib": "^0.2.0", - "buffer": "^5.5.0||^6.0.0", - "events": "^3.1.0", - "parcel": "2.15.4", - "path-browserify": "^1.0.0", - "querystring-es3": "^0.2.1", - "stream-http": "^3.1.0", - "url": "^0.11.0" - }, - "dependencies": { - "@mjackson/node-fetch-server": "0.6.1", - "@parcel/runtime-rsc": "2.15.0", - "express": "^4.21.2", - "react": "^19.0.0", - "react-dom": "^19.0.0", - "react-router": "workspace:*", - "react-server-dom-parcel": "^19.0.1" - } -} diff --git a/playground/rsc-parcel/src/counter.tsx b/playground/rsc-parcel/src/counter.tsx deleted file mode 100644 index 7a5b69a098..0000000000 --- a/playground/rsc-parcel/src/counter.tsx +++ /dev/null @@ -1,17 +0,0 @@ -"use client"; - -import { useState } from "react"; - -export function Counter() { - const [count, setCount] = useState(0); - - return ( -
-

Counter

-

Current count: {count}

- -
- ); -} diff --git a/playground/rsc-parcel/src/entry.browser.tsx b/playground/rsc-parcel/src/entry.browser.tsx deleted file mode 100644 index a245bd4bea..0000000000 --- a/playground/rsc-parcel/src/entry.browser.tsx +++ /dev/null @@ -1,50 +0,0 @@ -"use client-entry"; - -import * as React from "react"; -import { hydrateRoot } from "react-dom/client"; -import { - unstable_createCallServer as createCallServer, - unstable_getRSCStream as getRSCStream, - unstable_RSCHydratedRouter as RSCHydratedRouter, - type unstable_RSCPayload as RSCPayload, -} from "react-router/dom"; -import { - createFromReadableStream, - createTemporaryReferenceSet, - encodeReply, - setServerCallback, - // @ts-expect-error -} from "react-server-dom-parcel/client"; - -setServerCallback( - createCallServer({ - createFromReadableStream, - createTemporaryReferenceSet, - encodeReply, - }), -); - -createFromReadableStream(getRSCStream(), { assets: "manifest" }).then( - (payload: RSCPayload) => { - // @ts-expect-error - on 18 types, requires 19. - startTransition(async () => { - const formState = - payload.type === "render" ? await payload.formState : undefined; - - hydrateRoot( - document, - - - , - { - // @ts-expect-error - no types for this yet - formState, - }, - ); - }); - }, -); diff --git a/playground/rsc-parcel/src/entry.rsc.ts b/playground/rsc-parcel/src/entry.rsc.ts deleted file mode 100644 index 9d716a833d..0000000000 --- a/playground/rsc-parcel/src/entry.rsc.ts +++ /dev/null @@ -1,34 +0,0 @@ -"use server-entry"; - -import { - createTemporaryReferenceSet, - decodeAction, - decodeFormState, - decodeReply, - loadServerAction, - renderToReadableStream, - // @ts-expect-error -} from "react-server-dom-parcel/server.edge"; -import { unstable_matchRSCServerRequest as matchRSCServerRequest } from "react-router"; - -import { routes } from "./routes"; - -import "./entry.browser.tsx"; - -export function fetchServer(request: Request) { - return matchRSCServerRequest({ - createTemporaryReferenceSet, - decodeAction, - decodeFormState, - decodeReply, - loadServerAction, - request, - routes, - generateResponse(match, options) { - return new Response(renderToReadableStream(match.payload, options), { - status: match.statusCode, - headers: match.headers, - }); - }, - }); -} diff --git a/playground/rsc-parcel/src/entry.ssr.tsx b/playground/rsc-parcel/src/entry.ssr.tsx deleted file mode 100644 index 1f29d629d3..0000000000 --- a/playground/rsc-parcel/src/entry.ssr.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import { createRequestListener } from "@mjackson/node-fetch-server"; -import express from "express"; -// @ts-expect-error - no types -import { renderToReadableStream as renderHTMLToReadableStream } from "react-dom/server.edge" assert { env: "react-client" }; -import { - unstable_routeRSCServerRequest as routeRSCServerRequest, - unstable_RSCStaticRouter as RSCStaticRouter, -} from "react-router" assert { env: "react-client" }; -// @ts-expect-error -import { createFromReadableStream } from "react-server-dom-parcel/client.edge" assert { env: "react-client" }; - -import { fetchServer } from "./entry.rsc" assert { env: "react-server" }; - -const app = express(); - -app.use("/client", express.static("dist/client")); - -app.use( - createRequestListener(async (request) => { - return routeRSCServerRequest({ - request, - fetchServer, - createFromReadableStream, - async renderHTML(getPayload) { - const payload = getPayload(); - - return await renderHTMLToReadableStream( - , - { - bootstrapScriptContent: ( - fetchServer as unknown as { bootstrapScript: string } - ).bootstrapScript, - formState: await payload.formState, - }, - ); - }, - }); - }), -); - -const server = app.listen(3000); -console.log("Server listening on port 3000 (http://localhost:3000)"); - -// Restart the server when it changes. -if (module.hot) { - module.hot.dispose(() => { - server.close(); - }); - - module.hot.accept(); -} diff --git a/playground/rsc-parcel/src/routes.ts b/playground/rsc-parcel/src/routes.ts deleted file mode 100644 index ef3761c68b..0000000000 --- a/playground/rsc-parcel/src/routes.ts +++ /dev/null @@ -1,30 +0,0 @@ -import type { unstable_RSCRouteConfig as RSCRouteConfig } from "react-router"; - -export const routes = [ - { - id: "root", - lazy: () => import("./routes/root/root"), - children: [ - { - id: "home", - index: true, - lazy: () => import("./routes/home/home"), - }, - { - id: "about", - path: "about", - lazy: () => import("./routes/about/about"), - }, - { - id: "fetcher", - path: "fetcher", - lazy: () => import("./routes/fetcher/fetcher"), - }, - ], - }, - { - id: "resource", - path: "resource", - lazy: () => import("./routes/resource/resource"), - }, -] satisfies RSCRouteConfig; diff --git a/playground/rsc-parcel/src/routes/about/about.client.tsx b/playground/rsc-parcel/src/routes/about/about.client.tsx deleted file mode 100644 index e6d57616b3..0000000000 --- a/playground/rsc-parcel/src/routes/about/about.client.tsx +++ /dev/null @@ -1,28 +0,0 @@ -"use client"; - -import { type ClientLoaderFunctionArgs, useLoaderData } from "react-router"; - -import { Counter } from "../../counter"; - -import type { loader } from "./about"; - -export async function clientLoader({ serverLoader }: ClientLoaderFunctionArgs) { - const res = await serverLoader(); - - return { - client: true, - ...res, - }; -} - -export default function AboutRoute() { - const { client, message } = useLoaderData(); - - return ( -
-

{message}

-

Did client loader run? {client ? "Yes" : "No"}

- -
- ); -} diff --git a/playground/rsc-parcel/src/routes/about/about.tsx b/playground/rsc-parcel/src/routes/about/about.tsx deleted file mode 100644 index 815c50903d..0000000000 --- a/playground/rsc-parcel/src/routes/about/about.tsx +++ /dev/null @@ -1,7 +0,0 @@ -export { clientLoader, default } from "./about.client"; - -export function loader() { - return { - message: "Hello About!", - }; -} diff --git a/playground/rsc-parcel/src/routes/fetcher/fetcher.client.tsx b/playground/rsc-parcel/src/routes/fetcher/fetcher.client.tsx deleted file mode 100644 index dcfdcbc33d..0000000000 --- a/playground/rsc-parcel/src/routes/fetcher/fetcher.client.tsx +++ /dev/null @@ -1,24 +0,0 @@ -"use client"; - -import { useFetcher } from "react-router"; -import type { action } from "../resource/resource"; - -export default function FetcherRoute() { - const fetcher = useFetcher(); - - return ( -
- -
{JSON.stringify(fetcher.data, null, 2)}
-
- ); -} diff --git a/playground/rsc-parcel/src/routes/fetcher/fetcher.ts b/playground/rsc-parcel/src/routes/fetcher/fetcher.ts deleted file mode 100644 index e7dadeb8d8..0000000000 --- a/playground/rsc-parcel/src/routes/fetcher/fetcher.ts +++ /dev/null @@ -1 +0,0 @@ -export { default } from "./fetcher.client"; diff --git a/playground/rsc-parcel/src/routes/home/home.actions.ts b/playground/rsc-parcel/src/routes/home/home.actions.ts deleted file mode 100644 index 4c4638882f..0000000000 --- a/playground/rsc-parcel/src/routes/home/home.actions.ts +++ /dev/null @@ -1,7 +0,0 @@ -"use server"; - -import { redirect } from "react-router"; - -export function redirectAction(formData: FormData) { - throw redirect("/?redirected=true"); -} diff --git a/playground/rsc-parcel/src/routes/home/home.client.tsx b/playground/rsc-parcel/src/routes/home/home.client.tsx deleted file mode 100644 index 0b83ab1fef..0000000000 --- a/playground/rsc-parcel/src/routes/home/home.client.tsx +++ /dev/null @@ -1,34 +0,0 @@ -"use client"; - -import { type ClientLoaderFunctionArgs, useLoaderData } from "react-router"; - -import { Counter } from "../../counter"; - -import type { loader } from "./home"; -import { redirectAction } from "./home.actions"; - -export async function clientLoader({ serverLoader }: ClientLoaderFunctionArgs) { - const res = await serverLoader(); - - return { - client: true, - ...res, - }; -} - -export default function HomeRoute() { - const { client, message } = useLoaderData(); - - return ( -
-

{message}

-

Did client loader run? {client ? "Yes" : "No"}

- - - - -
- ); -} diff --git a/playground/rsc-parcel/src/routes/home/home.tsx b/playground/rsc-parcel/src/routes/home/home.tsx deleted file mode 100644 index 22fffe84be..0000000000 --- a/playground/rsc-parcel/src/routes/home/home.tsx +++ /dev/null @@ -1,7 +0,0 @@ -export { clientLoader, default } from "./home.client"; - -export function loader() { - return { - message: "Hello Home!", - }; -} diff --git a/playground/rsc-parcel/src/routes/resource/resource.ts b/playground/rsc-parcel/src/routes/resource/resource.ts deleted file mode 100644 index 6d52c79aa6..0000000000 --- a/playground/rsc-parcel/src/routes/resource/resource.ts +++ /dev/null @@ -1,9 +0,0 @@ -import type { ActionFunctionArgs } from "react-router"; - -export async function action({ request }: ActionFunctionArgs) { - return { - timestamp: Date.now(), - message: "Hello from resource route!", - echo: await request.text(), - }; -} diff --git a/playground/rsc-parcel/src/routes/root/root.client.tsx b/playground/rsc-parcel/src/routes/root/root.client.tsx deleted file mode 100644 index 03ccf799f8..0000000000 --- a/playground/rsc-parcel/src/routes/root/root.client.tsx +++ /dev/null @@ -1,54 +0,0 @@ -"use client"; - -import { - Link, - Links, - Outlet, - ScrollRestoration, - useLoaderData, -} from "react-router"; - -import type { loader } from "./root"; - -export function Layout({ children }: { children: React.ReactNode }) { - return ( - - - - - React Server - - - - {children} - - - - ); -} - -export default function RootRoute() { - const { counter, message } = useLoaderData(); - return ( - <> -

{message}

-
    -
  • - Home -
  • -
  • - About -
  • -
  • - Fetcher -
  • -
- {counter} - - - ); -} - -export function ErrorBoundary() { - return

Something went wrong!

; -} diff --git a/playground/rsc-parcel/src/routes/root/root.tsx b/playground/rsc-parcel/src/routes/root/root.tsx deleted file mode 100644 index 347dbd2248..0000000000 --- a/playground/rsc-parcel/src/routes/root/root.tsx +++ /dev/null @@ -1,10 +0,0 @@ -export { default, ErrorBoundary, Layout } from "./root.client"; - -import { Counter } from "../../counter"; - -export function loader() { - return { - counter: , - message: "Hello from the server!", - }; -} diff --git a/playground/rsc-parcel/tsconfig.json b/playground/rsc-parcel/tsconfig.json deleted file mode 100644 index 009d4507cf..0000000000 --- a/playground/rsc-parcel/tsconfig.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "compilerOptions": { - "strict": true, - "jsx": "react-jsx", - "allowSyntheticDefaultImports": true, - "moduleResolution": "bundler", - "module": "esnext", - "isolatedModules": true, - "esModuleInterop": true, - "target": "es2022", - "noEmit": true - } -} diff --git a/playground/rsc-vite-framework/app/entry.rsc.ts b/playground/rsc-vite-framework/app/entry.rsc.ts new file mode 100644 index 0000000000..b7ed727d61 --- /dev/null +++ b/playground/rsc-vite-framework/app/entry.rsc.ts @@ -0,0 +1,16 @@ +import defaultEntry from "@react-router/dev/config/default-rsc-entries/entry.rsc"; +import { RouterContextProvider } from "react-router"; + +export default { + fetch(request: Request) { + console.log("custom entry.rsc"); + + const requestContext = new RouterContextProvider(); + + return defaultEntry.fetch(request, requestContext); + }, +}; + +if (import.meta.hot) { + import.meta.hot.accept(); +} diff --git a/playground/rsc-vite-framework/app/entry.ssr.ts b/playground/rsc-vite-framework/app/entry.ssr.ts new file mode 100644 index 0000000000..e11509cdb8 --- /dev/null +++ b/playground/rsc-vite-framework/app/entry.ssr.ts @@ -0,0 +1,7 @@ +import { generateHTML as defaultGenerateHTML } from "@react-router/dev/config/default-rsc-entries/entry.ssr"; + +export function generateHTML(request: Request, serverResponse: Response) { + console.log("custom entry.ssr"); + + return defaultGenerateHTML(request, serverResponse); +} diff --git a/playground/rsc-vite-framework/package.json b/playground/rsc-vite-framework/package.json index e3f055695d..29abe7a193 100644 --- a/playground/rsc-vite-framework/package.json +++ b/playground/rsc-vite-framework/package.json @@ -7,8 +7,8 @@ "dev": "react-router dev", "dev:vite-middleware": "node start-vite-middleware.js", "build": "react-router build", - "start": "cross-env NODE_ENV=production node start.js", - "start:serve": "react-router-serve ./build/server/index.js", + "start:custom": "cross-env NODE_ENV=production node start.js", + "start": "react-router-serve ./build/server/index.js", "typecheck": "react-router typegen && tsc" }, "devDependencies": { @@ -18,22 +18,23 @@ "@react-router/serve": "workspace:*", "@types/express": "^5.0.0", "@types/node": "^22.13.1", - "@types/react": "^19.1.8", - "@types/react-dom": "^19.1.6", - "@vitejs/plugin-rsc": "0.4.30", + "@types/react": "catalog:react-canary", + "@types/react-dom": "catalog:react-canary", + "@vitejs/plugin-rsc": "catalog:", "cross-env": "^7.0.3", "remark-frontmatter": "^5.0.0", "remark-mdx-frontmatter": "^5.2.0", - "typescript": "^5.1.6", + "typescript": "catalog:", "vite": "^6.3.0" }, "dependencies": { "@mjackson/node-fetch-server": "0.6.1", - "compression": "^1.8.0", + "compression": "^1.8.1", "express": "^4.21.2", - "react": "^19.0.0", - "react-dom": "^19.0.0", + "react": "catalog:react-canary", + "react-dom": "catalog:react-canary", "react-router": "workspace:*", + "react-server-dom-webpack": "catalog:react-canary", "remix-utils": "^8.7.0" } } diff --git a/playground/rsc-vite-framework/tsconfig.json b/playground/rsc-vite-framework/tsconfig.json index 6b7a6b1e62..65ee147911 100644 --- a/playground/rsc-vite-framework/tsconfig.json +++ b/playground/rsc-vite-framework/tsconfig.json @@ -12,7 +12,11 @@ "module": "ESNext", "target": "ESNext", "lib": ["ESNext", "DOM", "DOM.Iterable"], - "types": ["vite/client", "@vitejs/plugin-rsc/types"], + "types": [ + "vite/client", + "@vitejs/plugin-rsc/types", + "@react-router/dev/rsc-types" + ], "jsx": "react-jsx", "rootDirs": [".", "./.react-router/types"] } diff --git a/playground/rsc-vite-framework/vite.config.ts b/playground/rsc-vite-framework/vite.config.ts index e9a3d03ff2..3d734f3400 100644 --- a/playground/rsc-vite-framework/vite.config.ts +++ b/playground/rsc-vite-framework/vite.config.ts @@ -8,7 +8,8 @@ import remarkMdxFrontmatter from "remark-mdx-frontmatter"; export default defineConfig({ plugins: [ mdx({ remarkPlugins: [remarkFrontmatter, remarkMdxFrontmatter] }), - reactRouterRSC(), + // @ts-ignore + reactRouterRSC({ __runningWithinTheReactRouterMonoRepo: true }), rsc(), ], }); diff --git a/playground/rsc-vite/package.json b/playground/rsc-vite/package.json index 1b11e72937..7f5b8e6767 100644 --- a/playground/rsc-vite/package.json +++ b/playground/rsc-vite/package.json @@ -12,20 +12,21 @@ "devDependencies": { "@types/express": "^5.0.0", "@types/node": "^22.13.1", - "@types/react": "^19.1.8", - "@types/react-dom": "^19.1.6", + "@types/react": "catalog:react-canary", + "@types/react-dom": "catalog:react-canary", "@vitejs/plugin-react": "^4.5.2", - "@vitejs/plugin-rsc": "0.4.30", + "@vitejs/plugin-rsc": "catalog:", "cross-env": "^7.0.3", - "typescript": "^5.1.6", + "typescript": "catalog:", "vite": "^6.3.0" }, "dependencies": { "@mjackson/node-fetch-server": "0.6.1", - "compression": "^1.8.0", + "compression": "^1.8.1", "express": "^4.21.2", - "react": "^19.0.0", - "react-dom": "^19.0.0", - "react-router": "workspace:*" + "react": "catalog:react-canary", + "react-dom": "catalog:react-canary", + "react-router": "workspace:*", + "react-server-dom-webpack": "catalog:react-canary" } } diff --git a/playground/rsc-vite/src/entry.rsc.tsx b/playground/rsc-vite/src/entry.rsc.tsx index c70f18a406..2c9c2c4395 100644 --- a/playground/rsc-vite/src/entry.rsc.tsx +++ b/playground/rsc-vite/src/entry.rsc.tsx @@ -33,7 +33,7 @@ export default async function handler(request: Request) { const ssr = await import.meta.viteRsc.loadModule< typeof import("./entry.ssr") >("ssr", "index"); - return ssr.default(request, fetchServer); + return ssr.default(request, await fetchServer(request)); } if (import.meta.hot) { diff --git a/playground/rsc-vite/src/entry.ssr.tsx b/playground/rsc-vite/src/entry.ssr.tsx index 6f47c70f85..d4a00d2bb2 100644 --- a/playground/rsc-vite/src/entry.ssr.tsx +++ b/playground/rsc-vite/src/entry.ssr.tsx @@ -8,20 +8,21 @@ import { export default async function handler( request: Request, - fetchServer: (request: Request) => Promise, + serverResponse: Response, ) { const bootstrapScriptContent = await import.meta.viteRsc.loadBootstrapScriptContent("index"); return routeRSCServerRequest({ request, - fetchServer, + serverResponse, createFromReadableStream, - async renderHTML(getPayload) { + async renderHTML(getPayload, options) { const payload = getPayload(); return ReactDomServer.renderToReadableStream( , { + ...options, bootstrapScriptContent, signal: request.signal, formState: await payload.formState, diff --git a/playground/rsc-vite/src/routes.ts b/playground/rsc-vite/src/routes.ts index a3c768a97e..728b18bb54 100644 --- a/playground/rsc-vite/src/routes.ts +++ b/playground/rsc-vite/src/routes.ts @@ -16,6 +16,11 @@ export const routes = [ path: "about", lazy: () => import("./routes/about/about"), }, + { + id: "render-redirect", + path: "render-redirect/:id?", + lazy: () => import("./routes/render-redirects"), + }, { id: "parent", path: "parent", diff --git a/playground/rsc-vite/src/routes/render-redirects.tsx b/playground/rsc-vite/src/routes/render-redirects.tsx new file mode 100644 index 0000000000..ceb4f757aa --- /dev/null +++ b/playground/rsc-vite/src/routes/render-redirects.tsx @@ -0,0 +1,23 @@ +import { Link, redirect } from "react-router"; + +export default function RenderRedirect({ + params: { id }, +}: { + params: { id?: string }; +}) { + if (id === "redirect") { + throw redirect("/render-redirect/redirected"); + } + + if (id === "external") { + throw redirect("https://example.com/"); + } + + return ( + <> +

{id || "home"}

+ Redirect + External + + ); +} diff --git a/playground/rsc-vite/src/routes/root/root.client.tsx b/playground/rsc-vite/src/routes/root/root.client.tsx index ae047706b2..649b30078c 100644 --- a/playground/rsc-vite/src/routes/root/root.client.tsx +++ b/playground/rsc-vite/src/routes/root/root.client.tsx @@ -4,7 +4,28 @@ import { useRouteError, useNavigation, isRouteErrorResponse, + Outlet, + ScrollRestoration, + Link, + Links, } from "react-router"; +import { Counter } from "../../counter"; +import type { loader } from "./root"; + +export default function RootRoute({ + loaderData, +}: { + loaderData: Awaited>; +}) { + return ( +
+

Root Route

+

Loader data: {loaderData.message}

+ {loaderData.counter} + +
+ ); +} export function ErrorReporter() { const error = useRouteError(); @@ -48,3 +69,35 @@ export function ErrorBoundary() { export function shouldRevalidate({ nextUrl }: { nextUrl: URL }) { return !nextUrl.pathname.endsWith("/about"); } +export function Layout({ children }: { children: React.ReactNode }) { + return ( + + + + + React Server + + + +
+
+ Home + {" | "} + About + {" | "} + Parent + {" | "} + Child + {" | "} + Redirect +
+

Root Layout

+ + + {children} +
+ + + + ); +} diff --git a/playground/rsc-vite/src/routes/root/root.tsx b/playground/rsc-vite/src/routes/root/root.tsx index 7820bc4ba7..9686a695ab 100644 --- a/playground/rsc-vite/src/routes/root/root.tsx +++ b/playground/rsc-vite/src/routes/root/root.tsx @@ -1,11 +1,16 @@ -import { Link, Links, Outlet, ScrollRestoration } from "react-router"; +// import { Link, Links, Outlet, ScrollRestoration } from "react-router"; import { type MiddlewareFunction } from "react-router"; import { Counter } from "../../counter"; -import { ErrorReporter, NavigationState } from "./root.client"; +// import { ErrorReporter, NavigationState } from "./root.client"; import "./root.css"; -export { shouldRevalidate } from "./root.client"; +export { + shouldRevalidate, + default, + ErrorBoundary, + Layout, +} from "./root.client"; export function headers() { return new Headers({ "x-root": "yes" }); @@ -28,63 +33,63 @@ export async function loader() { }; } -export default function RootRoute({ - loaderData, -}: { - loaderData: Awaited>; -}) { - return ( -
-

Root Route

-

Loader data: {loaderData.message}

- {loaderData.counter} - -
- ); -} +// export default function RootRoute({ +// loaderData, +// }: { +// loaderData: Awaited>; +// }) { +// return ( +//
+//

Root Route

+//

Loader data: {loaderData.message}

+// {loaderData.counter} +// +//
+// ); +// } export function HydrateFallback() { return

Loading...

; } -export function ErrorBoundary() { - return ( - <> -

Root - Something went wrong!

- - - ); -} +// export function ErrorBoundary() { +// return ( +// <> +//

Root - Something went wrong!

+// +// +// ); +// } -export function Layout({ children }: { children: React.ReactNode }) { - return ( - - - - - React Server - - - -
-
- Home - {" | "} - About - {" | "} - Parent - {" | "} - Child - {" | "} - Redirect -
-

Root Layout

- - - {children} -
- - - - ); -} +// export function Layout({ children }: { children: React.ReactNode }) { +// return ( +// +// +// +// +// React Server +// +// +// +//
+//
+// Home +// {" | "} +// About +// {" | "} +// Parent +// {" | "} +// Child +// {" | "} +// Redirect +//
+//

Root Layout

+// +// +// {children} +//
+// +// +// +// ); +// } diff --git a/playground/split-route-modules-spa/package.json b/playground/split-route-modules-spa/package.json index 60b10804ff..d242ad2121 100644 --- a/playground/split-route-modules-spa/package.json +++ b/playground/split-route-modules-spa/package.json @@ -13,15 +13,15 @@ "dependencies": { "@react-router/node": "workspace:*", "isbot": "^5", - "react": "^19.1.0", - "react-dom": "^19.1.0", + "react": "catalog:", + "react-dom": "catalog:", "react-router": "workspace:*" }, "devDependencies": { "@react-router/dev": "workspace:*", - "@types/react": "^18.2.20", - "@types/react-dom": "^18.2.7", - "typescript": "^5.1.6", + "@types/react": "catalog:", + "@types/react-dom": "catalog:", + "typescript": "catalog:", "vite": "^6.3.0", "vite-tsconfig-paths": "^4.2.1" }, diff --git a/playground/split-route-modules/package.json b/playground/split-route-modules/package.json index 7a03ad810e..ae370f88a9 100644 --- a/playground/split-route-modules/package.json +++ b/playground/split-route-modules/package.json @@ -14,15 +14,15 @@ "@react-router/node": "workspace:*", "@react-router/serve": "workspace:*", "isbot": "^5.1.11", - "react": "^19.1.0", - "react-dom": "^19.1.0", + "react": "catalog:", + "react-dom": "catalog:", "react-router": "workspace:*" }, "devDependencies": { "@react-router/dev": "workspace:*", - "@types/react": "^18.2.20", - "@types/react-dom": "^18.2.7", - "typescript": "^5.1.6", + "@types/react": "catalog:", + "@types/react-dom": "catalog:", + "typescript": "catalog:", "vite": "^6.3.0", "vite-tsconfig-paths": "^4.2.1" }, diff --git a/playground/vite-plugin-cloudflare/package.json b/playground/vite-plugin-cloudflare/package.json index ddb69f978e..89a33bbce7 100644 --- a/playground/vite-plugin-cloudflare/package.json +++ b/playground/vite-plugin-cloudflare/package.json @@ -13,8 +13,8 @@ "dependencies": { "express": "^4.19.2", "isbot": "^5.1.11", - "react": "^19.1.0", - "react-dom": "^19.1.0", + "react": "catalog:", + "react-dom": "catalog:", "react-router": "workspace:*", "serialize-javascript": "^6.0.1" }, @@ -23,10 +23,10 @@ "@react-router/dev": "workspace:*", "@react-router/fs-routes": "workspace:*", "@types/node": "^20.0.0", - "@types/react": "^18.2.20", - "@types/react-dom": "^18.2.7", + "@types/react": "catalog:", + "@types/react-dom": "catalog:", "eslint": "^8.38.0", - "typescript": "^5.1.6", + "typescript": "catalog:", "vite": "^6.3.0", "vite-tsconfig-paths": "^4.2.1", "wrangler": "^4.23.0" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2e0d0625c4..9a9419e03b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,9 +4,43 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +catalogs: + default: + '@vitejs/plugin-rsc': + specifier: ~0.5.7 + version: 0.5.7 + react: + specifier: ^19.2.3 + version: 19.2.3 + react-dom: + specifier: ^19.2.3 + version: 19.2.3 + react-server-dom-webpack: + specifier: ^19.2.3 + version: 19.2.3 + tsup: + specifier: ^8.3.0 + version: 8.5.0 + typescript: + specifier: ^5.4.5 + version: 5.4.5 + wireit: + specifier: 0.14.9 + version: 0.14.9 + react-canary: + react: + specifier: ^19.2.2 + version: 19.2.3 + react-dom: + specifier: ^19.2.2 + version: 19.2.3 + react-server-dom-webpack: + specifier: ^19.2.2 + version: 19.2.3 + overrides: - '@types/react': ^18.2.18 - '@types/react-dom': ^18.2.7 + '@types/react': ^18.0.27 + '@types/react-dom': ^18.0.10 '@types/react-test-renderer': ^18.3.1 jsdom: 22.1.0 workerd: 1.20250705.0 @@ -61,10 +95,10 @@ importers: specifier: ^21.1.1 version: 21.1.1 '@types/react': - specifier: ^18.2.18 + specifier: ^18.0.27 version: 18.2.18 '@types/react-dom': - specifier: ^18.2.7 + specifier: ^18.0.10 version: 18.2.7 '@types/react-test-renderer': specifier: ^18.3.1 @@ -113,7 +147,7 @@ importers: version: 7.34.1(eslint@8.57.0) eslint-plugin-react-hooks: specifier: next - version: 7.1.0-canary-fd524fe0-20251121(eslint@8.57.0) + version: 7.1.0-canary-b061b597-20251212(eslint@8.57.0) fast-glob: specifier: 3.2.11 version: 3.2.11 @@ -132,9 +166,6 @@ importers: prompts: specifier: ^2.4.2 version: 2.4.2 - react-server-dom-parcel: - specifier: ^19.0.1 - version: 19.2.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) remark-gfm: specifier: ^3.0.1 version: 3.0.1 @@ -151,7 +182,7 @@ importers: specifier: ^0.28.7 version: 0.28.7(typescript@5.4.5) typescript: - specifier: ^5.4.5 + specifier: 'catalog:' version: 5.4.5 unified: specifier: ^10.1.2 @@ -161,7 +192,7 @@ importers: version: 3.1.1 vite: specifier: ^6.3.0 - version: 6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0) + version: 6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0) integration: dependencies: @@ -206,7 +237,7 @@ importers: version: 1.17.4(babel-plugin-macros@3.1.0) '@vanilla-extract/vite-plugin': specifier: ^5.1.1 - version: 5.1.1(@types/node@22.14.0)(babel-plugin-macros@3.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0))(yaml@2.8.0) + version: 5.1.1(@types/node@22.14.0)(babel-plugin-macros@3.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0))(yaml@2.8.0) cheerio: specifier: ^1.0.0-rc.12 version: 1.0.0 @@ -244,11 +275,11 @@ importers: specifier: ^3.6.2 version: 3.6.2 react: - specifier: ^19.1.0 - version: 19.1.0 + specifier: 'catalog:' + version: 19.2.3 react-dom: - specifier: ^19.1.0 - version: 19.1.0(react@19.1.0) + specifier: 'catalog:' + version: 19.2.3(react@19.2.3) react-router: specifier: workspace:* version: link:../packages/react-router @@ -271,17 +302,17 @@ importers: specifier: ^4.0.0 version: 4.40.1 typescript: - specifier: ^5.1.0 + specifier: 'catalog:' version: 5.4.5 vite: specifier: ^6.3.0 - version: 6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0) + version: 6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0) vite-env-only: specifier: ^3.0.1 - version: 3.0.1(vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0)) + version: 3.0.1(vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0)) vite-tsconfig-paths: specifier: ^4.2.2 - version: 4.3.2(typescript@5.4.5)(vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0)) + version: 4.3.2(typescript@5.4.5)(vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0)) wait-on: specifier: ^7.0.1 version: 7.2.0 @@ -298,11 +329,11 @@ importers: specifier: ^3.20250214.0 version: 3.20250408.0 react: - specifier: ^19.1.0 - version: 19.1.0 + specifier: 'catalog:' + version: 19.2.3 react-dom: - specifier: ^19.1.0 - version: 19.1.0(react@19.1.0) + specifier: 'catalog:' + version: 19.2.3(react@19.2.3) react-router: specifier: workspace:* version: link:../../../packages/react-router @@ -320,105 +351,29 @@ importers: specifier: workspace:* version: link:../../../packages/react-router-remix-routes-option-adapter '@types/react': - specifier: ^18.2.18 + specifier: ^18.0.27 version: 18.2.18 '@types/react-dom': - specifier: ^18.2.7 + specifier: ^18.0.10 version: 18.2.7 typescript: - specifier: ^5.1.6 + specifier: 'catalog:' version: 5.4.5 vite: specifier: ^6.3.0 - version: 6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0) + version: 6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0) wrangler: specifier: ^4.23.0 version: 4.23.0(@cloudflare/workers-types@4.20250805.0) - integration/helpers/rsc-parcel: - dependencies: - '@mjackson/node-fetch-server': - specifier: 0.6.1 - version: 0.6.1 - '@parcel/runtime-rsc': - specifier: 2.15.0 - version: 2.15.0(@parcel/core@2.15.4) - cross-env: - specifier: ^7.0.3 - version: 7.0.3 - express: - specifier: ^4.21.2 - version: 4.21.2 - react: - specifier: ^19.1.0 - version: 19.1.0 - react-dom: - specifier: ^19.1.0 - version: 19.1.0(react@19.1.0) - react-router: - specifier: workspace:* - version: link:../../../packages/react-router - react-server-dom-parcel: - specifier: ^19.1.2 - version: 19.2.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - devDependencies: - '@parcel/packager-react-static': - specifier: 2.15.0 - version: 2.15.0(@parcel/core@2.15.4) - '@parcel/transformer-react-static': - specifier: 2.15.0 - version: 2.15.0(@parcel/core@2.15.4) - '@types/express': - specifier: ^5.0.0 - version: 5.0.1 - '@types/node': - specifier: ^22.13.1 - version: 22.14.0 - '@types/parcel-env': - specifier: 0.0.8 - version: 0.0.8 - '@types/react': - specifier: ^18.2.18 - version: 18.2.18 - '@types/react-dom': - specifier: ^18.2.7 - version: 18.2.7 - browserify-zlib: - specifier: ^0.2.0 - version: 0.2.0 - buffer: - specifier: ^5.5.0||^6.0.0 - version: 5.7.1 - events: - specifier: ^3.1.0 - version: 3.3.0 - parcel: - specifier: 2.15.4 - version: 2.15.4 - path-browserify: - specifier: ^1.0.0 - version: 1.0.1 - querystring-es3: - specifier: ^0.2.1 - version: 0.2.1 - stream-http: - specifier: ^3.1.0 - version: 3.2.0 - typescript: - specifier: ^5.1.6 - version: 5.4.5 - url: - specifier: ^0.11.0 - version: 0.11.4 - integration/helpers/rsc-vite: dependencies: '@mjackson/node-fetch-server': specifier: 0.6.1 version: 0.6.1 compression: - specifier: ^1.8.0 - version: 1.8.0 + specifier: ^1.8.1 + version: 1.8.1 cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -426,14 +381,17 @@ importers: specifier: ^4.21.2 version: 4.21.2 react: - specifier: ^19.0.0 - version: 19.1.0 + specifier: catalog:react-canary + version: 19.2.3 react-dom: - specifier: ^19.0.0 - version: 19.1.0(react@19.1.0) + specifier: catalog:react-canary + version: 19.2.3(react@19.2.3) react-router: specifier: workspace:* version: link:../../../packages/react-router + react-server-dom-webpack: + specifier: catalog:react-canary + version: 19.2.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(webpack@5.103.0) devDependencies: '@types/express': specifier: ^5.0.0 @@ -442,23 +400,23 @@ importers: specifier: ^22.13.1 version: 22.14.0 '@types/react': - specifier: ^18.2.18 + specifier: ^18.0.27 version: 18.2.18 '@types/react-dom': - specifier: ^18.2.7 + specifier: ^18.0.10 version: 18.2.7 '@vitejs/plugin-react': specifier: ^4.5.2 - version: 4.5.2(vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0)) + version: 4.5.2(vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0)) '@vitejs/plugin-rsc': - specifier: 0.4.30 - version: 0.4.30(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0)) + specifier: 'catalog:' + version: 0.5.7(react-dom@19.2.3(react@19.2.3))(react-server-dom-webpack@19.2.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(webpack@5.103.0))(react@19.2.3)(vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0)) typescript: - specifier: ^5.1.6 + specifier: 'catalog:' version: 5.4.5 vite: specifier: ^6.3.0 - version: 6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0) + version: 6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0) integration/helpers/rsc-vite-framework: dependencies: @@ -469,20 +427,23 @@ importers: specifier: workspace:* version: link:../../../packages/react-router-serve compression: - specifier: ^1.8.0 - version: 1.8.0 + specifier: ^1.8.1 + version: 1.8.1 express: specifier: ^4.21.2 version: 4.21.2 react: - specifier: ^19.0.0 - version: 19.1.0 + specifier: catalog:react-canary + version: 19.2.3 react-dom: - specifier: ^19.0.0 - version: 19.1.0(react@19.1.0) + specifier: catalog:react-canary + version: 19.2.3(react@19.2.3) react-router: specifier: workspace:* version: link:../../../packages/react-router + react-server-dom-webpack: + specifier: catalog:react-canary + version: 19.2.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(webpack@5.103.0) devDependencies: '@mdx-js/rollup': specifier: ^3.1.0 @@ -500,38 +461,38 @@ importers: specifier: ^22.13.1 version: 22.14.0 '@types/react': - specifier: ^18.2.18 + specifier: ^18.0.27 version: 18.2.18 '@types/react-dom': - specifier: ^18.2.7 + specifier: ^18.0.10 version: 18.2.7 '@vanilla-extract/css': specifier: ^1.17.4 version: 1.17.4(babel-plugin-macros@3.1.0) '@vanilla-extract/vite-plugin': specifier: ^5.1.1 - version: 5.1.1(@types/node@22.14.0)(babel-plugin-macros@3.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0))(yaml@2.8.0) + version: 5.1.1(@types/node@22.14.0)(babel-plugin-macros@3.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0))(yaml@2.8.0) '@vitejs/plugin-react': specifier: ^4.5.2 - version: 4.5.2(vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0)) + version: 4.5.2(vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0)) '@vitejs/plugin-rsc': - specifier: 0.4.30 - version: 0.4.30(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0)) + specifier: 'catalog:' + version: 0.5.7(react-dom@19.2.3(react@19.2.3))(react-server-dom-webpack@19.2.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(webpack@5.103.0))(react@19.2.3)(vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0)) cross-env: specifier: ^7.0.3 version: 7.0.3 typescript: - specifier: ^5.1.6 + specifier: 'catalog:' version: 5.4.5 vite: specifier: ^6.3.0 - version: 6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0) + version: 6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0) vite-env-only: specifier: ^3.0.1 - version: 3.0.1(vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0)) + version: 3.0.1(vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0)) vite-tsconfig-paths: specifier: ^4.2.1 - version: 4.3.2(typescript@5.4.5)(vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0)) + version: 4.3.2(typescript@5.4.5)(vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0)) integration/helpers/vite-5-template: dependencies: @@ -549,7 +510,7 @@ importers: version: 1.17.4(babel-plugin-macros@3.1.0) '@vanilla-extract/vite-plugin': specifier: ^5.1.1 - version: 5.1.1(@types/node@22.14.0)(babel-plugin-macros@3.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(vite@5.1.3(@types/node@22.14.0)(lightningcss@1.30.1))(yaml@2.8.0) + version: 5.1.1(@types/node@22.14.0)(babel-plugin-macros@3.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(vite@5.1.3(@types/node@22.14.0)(lightningcss@1.30.1)(terser@5.44.1))(yaml@2.8.0) express: specifier: ^4.19.2 version: 4.21.2 @@ -557,11 +518,11 @@ importers: specifier: ^5.1.11 version: 5.1.11 react: - specifier: ^19.1.0 - version: 19.1.0 + specifier: 'catalog:' + version: 19.2.3 react-dom: - specifier: ^19.1.0 - version: 19.1.0(react@19.1.0) + specifier: 'catalog:' + version: 19.2.3(react@19.2.3) react-router: specifier: workspace:* version: link:../../../packages/react-router @@ -579,26 +540,26 @@ importers: specifier: workspace:* version: link:../../../packages/react-router-remix-routes-option-adapter '@types/react': - specifier: ^18.2.18 + specifier: ^18.0.27 version: 18.2.18 '@types/react-dom': - specifier: ^18.2.7 + specifier: ^18.0.10 version: 18.2.7 eslint: specifier: ^8.38.0 version: 8.57.0 typescript: - specifier: ^5.1.6 + specifier: 'catalog:' version: 5.4.5 vite: specifier: ^5.1.0 - version: 5.1.3(@types/node@22.14.0)(lightningcss@1.30.1)(terser@5.15.0) + version: 5.1.3(@types/node@22.14.0)(lightningcss@1.30.1)(terser@5.44.1) vite-env-only: specifier: ^3.0.1 - version: 3.0.1(vite@5.1.3(@types/node@22.14.0)(lightningcss@1.30.1)) + version: 3.0.1(vite@5.1.3(@types/node@22.14.0)(lightningcss@1.30.1)(terser@5.44.1)) vite-tsconfig-paths: specifier: ^4.2.1 - version: 4.3.2(typescript@5.4.5)(vite@5.1.3(@types/node@22.14.0)(lightningcss@1.30.1)(terser@5.15.0)) + version: 4.3.2(typescript@5.4.5)(vite@5.1.3(@types/node@22.14.0)(lightningcss@1.30.1)(terser@5.44.1)) integration/helpers/vite-6-template: dependencies: @@ -616,7 +577,7 @@ importers: version: 1.17.4(babel-plugin-macros@3.1.0) '@vanilla-extract/vite-plugin': specifier: ^5.1.1 - version: 5.1.1(@types/node@22.14.0)(babel-plugin-macros@3.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0))(yaml@2.8.0) + version: 5.1.1(@types/node@22.14.0)(babel-plugin-macros@3.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0))(yaml@2.8.0) express: specifier: ^4.19.2 version: 4.21.2 @@ -624,11 +585,11 @@ importers: specifier: ^5.1.11 version: 5.1.11 react: - specifier: ^19.1.0 - version: 19.1.0 + specifier: 'catalog:' + version: 19.2.3 react-dom: - specifier: ^19.1.0 - version: 19.1.0(react@19.1.0) + specifier: 'catalog:' + version: 19.2.3(react@19.2.3) react-router: specifier: workspace:* version: link:../../../packages/react-router @@ -646,26 +607,26 @@ importers: specifier: workspace:* version: link:../../../packages/react-router-remix-routes-option-adapter '@types/react': - specifier: ^18.2.18 + specifier: ^18.0.27 version: 18.2.18 '@types/react-dom': - specifier: ^18.2.7 + specifier: ^18.0.10 version: 18.2.7 eslint: specifier: ^8.38.0 version: 8.57.0 typescript: - specifier: ^5.1.6 + specifier: 'catalog:' version: 5.4.5 vite: specifier: ^6.3.0 - version: 6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0) + version: 6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0) vite-env-only: specifier: ^3.0.1 - version: 3.0.1(vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0)) + version: 3.0.1(vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0)) vite-tsconfig-paths: specifier: ^4.2.1 - version: 4.3.2(typescript@5.4.5)(vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0)) + version: 4.3.2(typescript@5.4.5)(vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0)) integration/helpers/vite-7-beta-template: dependencies: @@ -683,7 +644,7 @@ importers: version: 1.17.4(babel-plugin-macros@3.1.0) '@vanilla-extract/vite-plugin': specifier: ^5.1.1 - version: 5.1.1(@types/node@22.14.0)(babel-plugin-macros@3.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(vite@7.0.0-beta.0(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0))(yaml@2.8.0) + version: 5.1.1(@types/node@22.14.0)(babel-plugin-macros@3.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(vite@7.0.0-beta.0(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0))(yaml@2.8.0) express: specifier: ^4.19.2 version: 4.21.2 @@ -691,11 +652,11 @@ importers: specifier: ^5.1.11 version: 5.1.11 react: - specifier: ^19.1.0 - version: 19.1.0 + specifier: 'catalog:' + version: 19.2.3 react-dom: - specifier: ^19.1.0 - version: 19.1.0(react@19.1.0) + specifier: 'catalog:' + version: 19.2.3(react@19.2.3) react-router: specifier: workspace:* version: link:../../../packages/react-router @@ -713,26 +674,26 @@ importers: specifier: workspace:* version: link:../../../packages/react-router-remix-routes-option-adapter '@types/react': - specifier: ^18.2.18 + specifier: ^18.0.27 version: 18.2.18 '@types/react-dom': - specifier: ^18.2.7 + specifier: ^18.0.10 version: 18.2.7 eslint: specifier: ^8.38.0 version: 8.57.0 typescript: - specifier: ^5.1.6 + specifier: 'catalog:' version: 5.4.5 vite: specifier: 7.0.0-beta.0 - version: 7.0.0-beta.0(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0) + version: 7.0.0-beta.0(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0) vite-env-only: specifier: ^3.0.1 - version: 3.0.1(vite@7.0.0-beta.0(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0)) + version: 3.0.1(vite@7.0.0-beta.0(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0)) vite-tsconfig-paths: specifier: ^4.2.1 - version: 4.3.2(typescript@5.4.5)(vite@7.0.0-beta.0(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0)) + version: 4.3.2(typescript@5.4.5)(vite@7.0.0-beta.0(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0)) integration/helpers/vite-plugin-cloudflare-template: dependencies: @@ -743,11 +704,11 @@ importers: specifier: ^5.1.11 version: 5.1.11 react: - specifier: ^19.1.0 - version: 19.1.0 + specifier: 'catalog:' + version: 19.2.3 react-dom: - specifier: ^19.1.0 - version: 19.1.0(react@19.1.0) + specifier: 'catalog:' + version: 19.2.3(react@19.2.3) react-router: specifier: workspace:* version: link:../../../packages/react-router @@ -757,7 +718,7 @@ importers: devDependencies: '@cloudflare/vite-plugin': specifier: ^1.9.0 - version: 1.9.0(rollup@4.43.0)(vite@6.4.1(@types/node@20.11.30)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0))(workerd@1.20250705.0)(wrangler@4.23.0(@cloudflare/workers-types@4.20250805.0)) + version: 1.9.0(rollup@4.43.0)(vite@6.4.1(@types/node@20.11.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0))(workerd@1.20250705.0)(wrangler@4.23.0(@cloudflare/workers-types@4.20250805.0)) '@react-router/dev': specifier: workspace:* version: link:../../../packages/react-router-dev @@ -768,23 +729,23 @@ importers: specifier: ^20.0.0 version: 20.11.30 '@types/react': - specifier: ^18.2.18 + specifier: ^18.0.27 version: 18.2.18 '@types/react-dom': - specifier: ^18.2.7 + specifier: ^18.0.10 version: 18.2.7 eslint: specifier: ^8.38.0 version: 8.57.0 typescript: - specifier: ^5.1.6 + specifier: 'catalog:' version: 5.4.5 vite: specifier: ^6.3.0 - version: 6.4.1(@types/node@20.11.30)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0) + version: 6.4.1(@types/node@20.11.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0) vite-tsconfig-paths: specifier: ^4.2.1 - version: 4.3.2(typescript@5.4.5)(vite@6.4.1(@types/node@20.11.30)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0)) + version: 4.3.2(typescript@5.4.5)(vite@6.4.1(@types/node@20.11.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0)) wrangler: specifier: ^4.23.0 version: 4.23.0(@cloudflare/workers-types@4.20250805.0) @@ -805,7 +766,7 @@ importers: version: 1.17.4(babel-plugin-macros@3.1.0) '@vanilla-extract/vite-plugin': specifier: ^5.1.1 - version: 5.1.1(@types/node@22.14.0)(babel-plugin-macros@3.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(rolldown-vite@6.3.0-beta.5(@types/node@22.14.0)(esbuild@0.25.4)(jiti@2.4.2)(tsx@4.19.3)(typescript@5.4.5)(yaml@2.8.0))(tsx@4.19.3)(yaml@2.8.0) + version: 5.1.1(@types/node@22.14.0)(babel-plugin-macros@3.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(rolldown-vite@6.3.0-beta.5(@types/node@22.14.0)(esbuild@0.25.4)(jiti@2.4.2)(terser@5.44.1)(tsx@4.19.3)(typescript@5.4.5)(yaml@2.8.0))(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0) express: specifier: ^4.19.2 version: 4.21.2 @@ -813,11 +774,11 @@ importers: specifier: ^5.1.11 version: 5.1.11 react: - specifier: ^19.1.0 - version: 19.1.0 + specifier: 'catalog:' + version: 19.2.3 react-dom: - specifier: ^19.1.0 - version: 19.1.0(react@19.1.0) + specifier: 'catalog:' + version: 19.2.3(react@19.2.3) react-router: specifier: workspace:* version: link:../../../packages/react-router @@ -835,10 +796,10 @@ importers: specifier: workspace:* version: link:../../../packages/react-router-remix-routes-option-adapter '@types/react': - specifier: ^18.2.18 + specifier: ^18.0.27 version: 18.2.18 '@types/react-dom': - specifier: ^18.2.7 + specifier: ^18.0.10 version: 18.2.7 cross-env: specifier: ^7.0.3 @@ -847,17 +808,17 @@ importers: specifier: ^8.38.0 version: 8.57.0 typescript: - specifier: ^5.1.6 + specifier: 'catalog:' version: 5.4.5 vite: specifier: npm:rolldown-vite@6.3.0-beta.5 - version: rolldown-vite@6.3.0-beta.5(@types/node@22.14.0)(esbuild@0.25.4)(jiti@2.4.2)(tsx@4.19.3)(typescript@5.4.5)(yaml@2.8.0) + version: rolldown-vite@6.3.0-beta.5(@types/node@22.14.0)(esbuild@0.25.4)(jiti@2.4.2)(terser@5.44.1)(tsx@4.19.3)(typescript@5.4.5)(yaml@2.8.0) vite-env-only: specifier: ^3.0.1 - version: 3.0.1(rolldown-vite@6.3.0-beta.5(@types/node@22.14.0)(esbuild@0.25.4)(jiti@2.4.2)(tsx@4.19.3)(typescript@5.4.5)(yaml@2.8.0)) + version: 3.0.1(rolldown-vite@6.3.0-beta.5(@types/node@22.14.0)(esbuild@0.25.4)(jiti@2.4.2)(terser@5.44.1)(tsx@4.19.3)(typescript@5.4.5)(yaml@2.8.0)) vite-tsconfig-paths: specifier: ^4.2.1 - version: 4.3.2(rolldown-vite@6.3.0-beta.5(@types/node@22.14.0)(esbuild@0.25.4)(jiti@2.4.2)(tsx@4.19.3)(typescript@5.4.5)(yaml@2.8.0))(typescript@5.4.5) + version: 4.3.2(rolldown-vite@6.3.0-beta.5(@types/node@22.14.0)(esbuild@0.25.4)(jiti@2.4.2)(terser@5.44.1)(tsx@4.19.3)(typescript@5.4.5)(yaml@2.8.0))(typescript@5.4.5) packages/create-react-router: dependencies: @@ -923,13 +884,13 @@ importers: specifier: ^1.2.0 version: 1.3.3 tsup: - specifier: ^8.3.0 + specifier: 'catalog:' version: 8.5.0(@swc/core@1.11.24)(jiti@2.4.2)(postcss@8.5.3)(tsx@4.19.3)(typescript@5.4.5)(yaml@2.8.0) typescript: - specifier: ^5.1.6 + specifier: 'catalog:' version: 5.4.5 wireit: - specifier: 0.14.9 + specifier: 'catalog:' version: 0.14.9 packages/react-router: @@ -946,7 +907,7 @@ importers: version: 6.6.3 '@testing-library/react': specifier: ^16.3.0 - version: 16.3.0(@testing-library/dom@10.4.0)(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 16.3.0(@testing-library/dom@10.4.0)(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@testing-library/user-event': specifier: ^14.6.1 version: 14.6.1(@testing-library/dom@10.4.0) @@ -960,25 +921,25 @@ importers: specifier: ^4.0.0 version: 4.0.0 react: - specifier: ^19.1.0 - version: 19.1.0 + specifier: 'catalog:' + version: 19.2.3 react-dom: - specifier: ^19.1.0 - version: 19.1.0(react@19.1.0) + specifier: 'catalog:' + version: 19.2.3(react@19.2.3) react-test-renderer: specifier: ^19.1.0 - version: 19.1.0(react@19.1.0) + version: 19.1.0(react@19.2.3) tsup: - specifier: ^8.3.0 + specifier: 'catalog:' version: 8.5.0(@swc/core@1.11.24)(jiti@2.4.2)(postcss@8.5.3)(tsx@4.19.3)(typescript@5.4.5)(yaml@2.8.0) typescript: - specifier: ^5.1.6 + specifier: 'catalog:' version: 5.4.5 undici: specifier: ^6.19.2 version: 6.20.1 wireit: - specifier: 0.14.9 + specifier: 'catalog:' version: 0.14.9 packages/react-router-architect: @@ -1003,22 +964,22 @@ importers: specifier: ^4.0.1 version: 4.0.1 react: - specifier: ^19.1.0 - version: 19.1.0 + specifier: 'catalog:' + version: 19.2.3 react-dom: - specifier: ^19.1.0 - version: 19.1.0(react@19.1.0) + specifier: 'catalog:' + version: 19.2.3(react@19.2.3) react-router: specifier: workspace:* version: link:../react-router tsup: - specifier: ^8.3.0 + specifier: 'catalog:' version: 8.5.0(@swc/core@1.11.24)(jiti@2.4.2)(postcss@8.5.3)(tsx@4.19.3)(typescript@5.4.5)(yaml@2.8.0) typescript: - specifier: ^5.1.6 + specifier: 'catalog:' version: 5.4.5 wireit: - specifier: 0.14.9 + specifier: 'catalog:' version: 0.14.9 packages/react-router-cloudflare: @@ -1030,13 +991,13 @@ importers: specifier: workspace:* version: link:../react-router tsup: - specifier: ^8.3.0 + specifier: 'catalog:' version: 8.5.0(@swc/core@1.11.24)(jiti@2.4.2)(postcss@8.5.3)(tsx@4.19.3)(typescript@5.4.5)(yaml@2.8.0) typescript: - specifier: ^5.1.6 + specifier: 'catalog:' version: 5.4.5 wireit: - specifier: 0.14.9 + specifier: 'catalog:' version: 0.14.9 packages/react-router-dev: @@ -1113,6 +1074,9 @@ importers: react-refresh: specifier: ^0.14.0 version: 0.14.2 + react-server-dom-webpack: + specifier: 'catalog:' + version: 19.2.3(react-dom@19.3.0-canary-d763f313-20251210(react@19.3.0-canary-d763f313-20251210))(react@19.3.0-canary-d763f313-20251210)(webpack@5.103.0(@swc/core@1.11.24)(esbuild@0.25.4)) semver: specifier: ^7.3.7 version: 7.7.2 @@ -1124,7 +1088,7 @@ importers: version: 1.2.0(typescript@5.4.5) vite-node: specifier: ^3.2.2 - version: 3.2.4(@types/node@20.11.30)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0) + version: 3.2.4(@types/node@20.11.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0) devDependencies: '@react-router/serve': specifier: workspace:* @@ -1144,6 +1108,9 @@ importers: '@types/express': specifier: ^4.17.9 version: 4.17.21 + '@types/jest': + specifier: ^29.5.4 + version: 29.5.12 '@types/jsesc': specifier: ^3.0.1 version: 3.0.3 @@ -1160,8 +1127,8 @@ importers: specifier: ^7.7.0 version: 7.7.0 '@vitejs/plugin-rsc': - specifier: 0.4.30 - version: 0.4.30(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(vite@6.4.1(@types/node@20.11.30)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0)) + specifier: 'catalog:' + version: 0.5.7(react-dom@19.3.0-canary-d763f313-20251210(react@19.3.0-canary-d763f313-20251210))(react-server-dom-webpack@19.2.3(react-dom@19.3.0-canary-d763f313-20251210(react@19.3.0-canary-d763f313-20251210))(react@19.3.0-canary-d763f313-20251210)(webpack@5.103.0(@swc/core@1.11.24)(esbuild@0.25.4)))(react@19.3.0-canary-d763f313-20251210)(vite@6.4.1(@types/node@20.11.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0)) esbuild-register: specifier: ^3.6.0 version: 3.6.0(esbuild@0.25.4) @@ -1178,16 +1145,16 @@ importers: specifier: workspace:^ version: link:../react-router tsup: - specifier: ^8.3.0 + specifier: 'catalog:' version: 8.5.0(@swc/core@1.11.24)(jiti@2.4.2)(postcss@8.5.3)(tsx@4.19.3)(typescript@5.4.5)(yaml@2.8.0) typescript: - specifier: ^5.1.6 + specifier: 'catalog:' version: 5.4.5 vite: specifier: ^6.3.0 - version: 6.4.1(@types/node@20.11.30)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0) + version: 6.4.1(@types/node@20.11.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0) wireit: - specifier: 0.14.9 + specifier: 'catalog:' version: 0.14.9 wrangler: specifier: ^4.23.0 @@ -1200,19 +1167,19 @@ importers: version: link:../react-router devDependencies: react: - specifier: ^19.1.0 - version: 19.1.0 + specifier: 'catalog:' + version: 19.2.3 react-dom: - specifier: ^19.1.0 - version: 19.1.0(react@19.1.0) + specifier: 'catalog:' + version: 19.2.3(react@19.2.3) tsup: - specifier: ^8.3.0 + specifier: 'catalog:' version: 8.5.0(@swc/core@1.11.24)(jiti@2.4.2)(postcss@8.5.3)(tsx@4.19.3)(typescript@5.4.5)(yaml@2.8.0) typescript: - specifier: ^5.1.6 + specifier: 'catalog:' version: 5.4.5 wireit: - specifier: 0.14.9 + specifier: 'catalog:' version: 0.14.9 packages/react-router-express: @@ -1243,13 +1210,13 @@ importers: specifier: ^6.3.3 version: 6.3.4 tsup: - specifier: ^8.3.0 + specifier: 'catalog:' version: 8.5.0(@swc/core@1.11.24)(jiti@2.4.2)(postcss@8.5.3)(tsx@4.19.3)(typescript@5.4.5)(yaml@2.8.0) typescript: - specifier: ^5.1.6 + specifier: 'catalog:' version: 5.4.5 wireit: - specifier: 0.14.9 + specifier: 'catalog:' version: 0.14.9 packages/react-router-fs-routes: @@ -1262,13 +1229,13 @@ importers: specifier: workspace:* version: link:../react-router-dev tsup: - specifier: ^8.3.0 + specifier: 'catalog:' version: 8.5.0(@swc/core@1.11.24)(jiti@2.4.2)(postcss@8.5.3)(tsx@4.19.3)(typescript@5.4.5)(yaml@2.8.0) typescript: - specifier: ^5.1.6 + specifier: 'catalog:' version: 5.4.5 wireit: - specifier: 0.14.9 + specifier: 'catalog:' version: 0.14.9 packages/react-router-node: @@ -1281,13 +1248,13 @@ importers: specifier: workspace:* version: link:../react-router tsup: - specifier: ^8.3.0 + specifier: 'catalog:' version: 8.5.0(@swc/core@1.11.24)(jiti@2.4.2)(postcss@8.5.3)(tsx@4.19.3)(typescript@5.4.5)(yaml@2.8.0) typescript: - specifier: ^5.1.6 + specifier: 'catalog:' version: 5.4.5 wireit: - specifier: 0.14.9 + specifier: 'catalog:' version: 0.14.9 packages/react-router-remix-routes-option-adapter: @@ -1296,13 +1263,13 @@ importers: specifier: workspace:* version: link:../react-router-dev tsup: - specifier: ^8.3.0 + specifier: 'catalog:' version: 8.5.0(@swc/core@1.11.24)(jiti@2.4.2)(postcss@8.5.3)(tsx@4.19.3)(typescript@5.4.5)(yaml@2.8.0) typescript: - specifier: ^5.1.6 + specifier: 'catalog:' version: 5.4.5 wireit: - specifier: 0.14.9 + specifier: 'catalog:' version: 0.14.9 packages/react-router-serve: @@ -1317,8 +1284,8 @@ importers: specifier: workspace:* version: link:../react-router-node compression: - specifier: ^1.7.4 - version: 1.8.0 + specifier: ^1.8.1 + version: 1.8.1 express: specifier: ^4.19.2 version: 4.21.2 @@ -1326,8 +1293,8 @@ importers: specifier: 5.1.1 version: 5.1.1 morgan: - specifier: ^1.10.0 - version: 1.10.0 + specifier: ^1.10.1 + version: 1.10.1 react-router: specifier: workspace:* version: link:../react-router @@ -1336,25 +1303,25 @@ importers: version: 0.5.21 devDependencies: '@types/compression': - specifier: ^1.7.0 - version: 1.7.5 + specifier: ^1.8.1 + version: 1.8.1 '@types/express': specifier: ^4.17.9 version: 4.17.21 '@types/morgan': - specifier: ^1.9.2 - version: 1.9.9 + specifier: ^1.9.10 + version: 1.9.10 '@types/source-map-support': specifier: ^0.5.6 version: 0.5.10 tsup: - specifier: ^8.3.0 + specifier: 'catalog:' version: 8.5.0(@swc/core@1.11.24)(jiti@2.4.2)(postcss@8.5.3)(tsx@4.19.3)(typescript@5.4.5)(yaml@2.8.0) typescript: - specifier: ^5.1.6 + specifier: 'catalog:' version: 5.4.5 wireit: - specifier: 0.14.9 + specifier: 'catalog:' version: 0.14.9 playground/framework: @@ -1369,11 +1336,11 @@ importers: specifier: ^5.1.11 version: 5.1.11 react: - specifier: ^19.1.0 - version: 19.1.0 + specifier: 'catalog:' + version: 19.2.3 react-dom: - specifier: ^19.1.0 - version: 19.1.0(react@19.1.0) + specifier: 'catalog:' + version: 19.2.3(react@19.2.3) react-router: specifier: workspace:* version: link:../../packages/react-router @@ -1382,20 +1349,20 @@ importers: specifier: workspace:* version: link:../../packages/react-router-dev '@types/react': - specifier: ^18.2.18 + specifier: ^18.0.27 version: 18.2.18 '@types/react-dom': - specifier: ^18.2.7 + specifier: ^18.0.10 version: 18.2.7 typescript: - specifier: ^5.1.6 + specifier: 'catalog:' version: 5.4.5 vite: specifier: ^6.3.0 - version: 6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0) + version: 6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0) vite-tsconfig-paths: specifier: ^4.2.1 - version: 4.3.2(typescript@5.4.5)(vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0)) + version: 4.3.2(typescript@5.4.5)(vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0)) playground/framework-express: dependencies: @@ -1406,8 +1373,8 @@ importers: specifier: workspace:* version: link:../../packages/react-router-node compression: - specifier: ^1.7.4 - version: 1.8.0 + specifier: ^1.8.1 + version: 1.8.1 express: specifier: ^4.19.2 version: 4.21.2 @@ -1415,14 +1382,14 @@ importers: specifier: ^5.1.11 version: 5.1.11 morgan: - specifier: ^1.10.0 - version: 1.10.0 + specifier: ^1.10.1 + version: 1.10.1 react: - specifier: ^19.1.0 - version: 19.1.0 + specifier: 'catalog:' + version: 19.2.3 react-dom: - specifier: ^19.1.0 - version: 19.1.0(react@19.1.0) + specifier: 'catalog:' + version: 19.2.3(react@19.2.3) react-router: specifier: workspace:* version: link:../../packages/react-router @@ -1431,32 +1398,32 @@ importers: specifier: workspace:* version: link:../../packages/react-router-dev '@types/compression': - specifier: ^1.7.5 - version: 1.7.5 + specifier: ^1.8.1 + version: 1.8.1 '@types/express': specifier: ^4.17.20 version: 4.17.21 '@types/morgan': - specifier: ^1.9.9 - version: 1.9.9 + specifier: ^1.9.10 + version: 1.9.10 '@types/react': - specifier: ^18.2.18 + specifier: ^18.0.27 version: 18.2.18 '@types/react-dom': - specifier: ^18.2.7 + specifier: ^18.0.10 version: 18.2.7 cross-env: specifier: ^7.0.3 version: 7.0.3 typescript: - specifier: ^5.1.6 + specifier: 'catalog:' version: 5.4.5 vite: specifier: ^6.3.0 - version: 6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0) + version: 6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0) vite-tsconfig-paths: specifier: ^4.2.1 - version: 4.3.2(typescript@5.4.5)(vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0)) + version: 4.3.2(typescript@5.4.5)(vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0)) playground/framework-rolldown-vite: dependencies: @@ -1473,11 +1440,11 @@ importers: specifier: ^5.1.11 version: 5.1.11 react: - specifier: ^19.1.0 - version: 19.1.0 + specifier: 'catalog:' + version: 19.2.3 react-dom: - specifier: ^19.1.0 - version: 19.1.0(react@19.1.0) + specifier: 'catalog:' + version: 19.2.3(react@19.2.3) react-router: specifier: workspace:* version: link:../../packages/react-router @@ -1486,20 +1453,20 @@ importers: specifier: workspace:* version: link:../../packages/react-router-dev '@types/react': - specifier: ^18.2.18 + specifier: ^18.0.27 version: 18.2.18 '@types/react-dom': - specifier: ^18.2.7 + specifier: ^18.0.10 version: 18.2.7 typescript: - specifier: ^5.1.6 + specifier: 'catalog:' version: 5.4.5 vite: specifier: npm:rolldown-vite@6.3.0-beta.3 - version: rolldown-vite@6.3.0-beta.3(@types/node@22.14.0)(esbuild@0.25.4)(jiti@2.4.2)(tsx@4.19.3)(typescript@5.4.5)(yaml@2.8.0) + version: rolldown-vite@6.3.0-beta.3(@types/node@22.14.0)(esbuild@0.25.4)(jiti@2.4.2)(terser@5.44.1)(tsx@4.19.3)(typescript@5.4.5)(yaml@2.8.0) vite-tsconfig-paths: specifier: ^4.2.1 - version: 4.3.2(rolldown-vite@6.3.0-beta.3(@types/node@22.14.0)(esbuild@0.25.4)(jiti@2.4.2)(tsx@4.19.3)(typescript@5.4.5)(yaml@2.8.0))(typescript@5.4.5) + version: 4.3.2(rolldown-vite@6.3.0-beta.3(@types/node@22.14.0)(esbuild@0.25.4)(jiti@2.4.2)(terser@5.44.1)(tsx@4.19.3)(typescript@5.4.5)(yaml@2.8.0))(typescript@5.4.5) playground/framework-spa: dependencies: @@ -1510,11 +1477,11 @@ importers: specifier: ^5 version: 5.1.11 react: - specifier: ^19.1.0 - version: 19.1.0 + specifier: 'catalog:' + version: 19.2.3 react-dom: - specifier: ^19.1.0 - version: 19.1.0(react@19.1.0) + specifier: 'catalog:' + version: 19.2.3(react@19.2.3) react-router: specifier: workspace:* version: link:../../packages/react-router @@ -1523,20 +1490,20 @@ importers: specifier: workspace:* version: link:../../packages/react-router-dev '@types/react': - specifier: ^18.2.18 + specifier: ^18.0.27 version: 18.2.18 '@types/react-dom': - specifier: ^18.2.7 + specifier: ^18.0.10 version: 18.2.7 typescript: - specifier: ^5.1.6 + specifier: 'catalog:' version: 5.4.5 vite: specifier: ^6.3.0 - version: 6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0) + version: 6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0) vite-tsconfig-paths: specifier: ^4.2.1 - version: 4.3.2(typescript@5.4.5)(vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0)) + version: 4.3.2(typescript@5.4.5)(vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0)) playground/framework-vite-5: dependencies: @@ -1550,11 +1517,11 @@ importers: specifier: ^5.1.11 version: 5.1.11 react: - specifier: ^19.1.0 - version: 19.1.0 + specifier: 'catalog:' + version: 19.2.3 react-dom: - specifier: ^19.1.0 - version: 19.1.0(react@19.1.0) + specifier: 'catalog:' + version: 19.2.3(react@19.2.3) react-router: specifier: workspace:* version: link:../../packages/react-router @@ -1563,20 +1530,20 @@ importers: specifier: workspace:* version: link:../../packages/react-router-dev '@types/react': - specifier: ^18.2.18 + specifier: ^18.0.27 version: 18.2.18 '@types/react-dom': - specifier: ^18.2.7 + specifier: ^18.0.10 version: 18.2.7 typescript: - specifier: ^5.1.6 + specifier: 'catalog:' version: 5.4.5 vite: specifier: ^5.1.0 - version: 5.1.3(@types/node@22.14.0)(lightningcss@1.30.1)(terser@5.15.0) + version: 5.1.3(@types/node@22.14.0)(lightningcss@1.30.1)(terser@5.44.1) vite-tsconfig-paths: specifier: ^4.2.1 - version: 4.3.2(typescript@5.4.5)(vite@5.1.3(@types/node@22.14.0)(lightningcss@1.30.1)(terser@5.15.0)) + version: 4.3.2(typescript@5.4.5)(vite@5.1.3(@types/node@22.14.0)(lightningcss@1.30.1)(terser@5.44.1)) playground/framework-vite-7-beta: dependencies: @@ -1590,11 +1557,11 @@ importers: specifier: ^5.1.11 version: 5.1.11 react: - specifier: ^19.1.0 - version: 19.1.0 + specifier: 'catalog:' + version: 19.2.3 react-dom: - specifier: ^19.1.0 - version: 19.1.0(react@19.1.0) + specifier: 'catalog:' + version: 19.2.3(react@19.2.3) react-router: specifier: workspace:* version: link:../../packages/react-router @@ -1603,20 +1570,20 @@ importers: specifier: workspace:* version: link:../../packages/react-router-dev '@types/react': - specifier: ^18.2.18 + specifier: ^18.0.27 version: 18.2.18 '@types/react-dom': - specifier: ^18.2.7 + specifier: ^18.0.10 version: 18.2.7 typescript: - specifier: ^5.1.6 + specifier: 'catalog:' version: 5.4.5 vite: specifier: 7.0.0-beta.0 - version: 7.0.0-beta.0(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0) + version: 7.0.0-beta.0(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0) vite-tsconfig-paths: specifier: ^4.2.1 - version: 4.3.2(typescript@5.4.5)(vite@7.0.0-beta.0(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0)) + version: 4.3.2(typescript@5.4.5)(vite@7.0.0-beta.0(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0)) playground/middleware: dependencies: @@ -1627,8 +1594,8 @@ importers: specifier: workspace:* version: link:../../packages/react-router-node compression: - specifier: ^1.7.4 - version: 1.8.0 + specifier: ^1.8.1 + version: 1.8.1 cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -1639,14 +1606,14 @@ importers: specifier: ^5.1.11 version: 5.1.11 morgan: - specifier: ^1.10.0 - version: 1.10.0 + specifier: ^1.10.1 + version: 1.10.1 react: - specifier: ^19.1.0 - version: 19.1.0 + specifier: 'catalog:' + version: 19.2.3 react-dom: - specifier: ^19.1.0 - version: 19.1.0(react@19.1.0) + specifier: 'catalog:' + version: 19.2.3(react@19.2.3) react-router: specifier: workspace:* version: link:../../packages/react-router @@ -1658,8 +1625,8 @@ importers: specifier: workspace:* version: link:../../packages/react-router-fs-routes '@types/compression': - specifier: ^1.7.5 - version: 1.7.5 + specifier: ^1.8.1 + version: 1.8.1 '@types/express': specifier: ^4.17.21 version: 4.17.21 @@ -1667,102 +1634,29 @@ importers: specifier: ^5.0.6 version: 5.0.6 '@types/morgan': - specifier: ^1.9.9 - version: 1.9.9 + specifier: ^1.9.10 + version: 1.9.10 '@types/node': specifier: ^20.0.0 version: 20.11.30 '@types/react': - specifier: ^18.2.18 + specifier: ^18.0.27 version: 18.2.18 '@types/react-dom': - specifier: ^18.2.7 + specifier: ^18.0.10 version: 18.2.7 tsx: specifier: ^4.19.3 version: 4.19.3 typescript: - specifier: ^5.1.6 + specifier: 'catalog:' version: 5.4.5 vite: specifier: ^6.3.0 - version: 6.4.1(@types/node@20.11.30)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0) + version: 6.4.1(@types/node@20.11.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0) vite-tsconfig-paths: specifier: ^4.2.1 - version: 4.3.2(typescript@5.4.5)(vite@6.4.1(@types/node@20.11.30)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0)) - - playground/rsc-parcel: - dependencies: - '@mjackson/node-fetch-server': - specifier: 0.6.1 - version: 0.6.1 - '@parcel/runtime-rsc': - specifier: 2.15.0 - version: 2.15.0(@parcel/core@2.15.4) - express: - specifier: ^4.21.2 - version: 4.21.2 - react: - specifier: ^19.0.0 - version: 19.1.0 - react-dom: - specifier: ^19.0.0 - version: 19.1.0(react@19.1.0) - react-router: - specifier: workspace:* - version: link:../../packages/react-router - react-server-dom-parcel: - specifier: ^19.0.1 - version: 19.2.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - devDependencies: - '@biomejs/biome': - specifier: ^1.9.4 - version: 1.9.4 - '@parcel/packager-react-static': - specifier: 2.15.0 - version: 2.15.0(@parcel/core@2.15.4) - '@parcel/transformer-react-static': - specifier: 2.15.0 - version: 2.15.0(@parcel/core@2.15.4) - '@types/express': - specifier: ^5.0.0 - version: 5.0.1 - '@types/node': - specifier: ^22.13.1 - version: 22.14.0 - '@types/parcel-env': - specifier: 0.0.8 - version: 0.0.8 - '@types/react': - specifier: ^18.2.18 - version: 18.2.18 - '@types/react-dom': - specifier: ^18.2.7 - version: 18.2.7 - browserify-zlib: - specifier: ^0.2.0 - version: 0.2.0 - buffer: - specifier: ^5.5.0||^6.0.0 - version: 5.7.1 - events: - specifier: ^3.1.0 - version: 3.3.0 - parcel: - specifier: 2.15.4 - version: 2.15.4 - path-browserify: - specifier: ^1.0.0 - version: 1.0.1 - querystring-es3: - specifier: ^0.2.1 - version: 0.2.1 - stream-http: - specifier: ^3.1.0 - version: 3.2.0 - url: - specifier: ^0.11.0 - version: 0.11.4 + version: 4.3.2(typescript@5.4.5)(vite@6.4.1(@types/node@20.11.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0)) playground/rsc-vite: dependencies: @@ -1770,20 +1664,23 @@ importers: specifier: 0.6.1 version: 0.6.1 compression: - specifier: ^1.8.0 - version: 1.8.0 + specifier: ^1.8.1 + version: 1.8.1 express: specifier: ^4.21.2 version: 4.21.2 react: - specifier: ^19.0.0 - version: 19.1.0 + specifier: catalog:react-canary + version: 19.2.3 react-dom: - specifier: ^19.0.0 - version: 19.1.0(react@19.1.0) + specifier: catalog:react-canary + version: 19.2.3(react@19.2.3) react-router: specifier: workspace:* version: link:../../packages/react-router + react-server-dom-webpack: + specifier: catalog:react-canary + version: 19.2.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(webpack@5.103.0) devDependencies: '@types/express': specifier: ^5.0.0 @@ -1792,26 +1689,26 @@ importers: specifier: ^22.13.1 version: 22.14.0 '@types/react': - specifier: ^18.2.18 + specifier: ^18.0.27 version: 18.2.18 '@types/react-dom': - specifier: ^18.2.7 + specifier: ^18.0.10 version: 18.2.7 '@vitejs/plugin-react': specifier: ^4.5.2 - version: 4.5.2(vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0)) + version: 4.5.2(vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0)) '@vitejs/plugin-rsc': - specifier: 0.4.30 - version: 0.4.30(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0)) + specifier: 'catalog:' + version: 0.5.7(react-dom@19.2.3(react@19.2.3))(react-server-dom-webpack@19.2.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(webpack@5.103.0))(react@19.2.3)(vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0)) cross-env: specifier: ^7.0.3 version: 7.0.3 typescript: - specifier: ^5.1.6 + specifier: 'catalog:' version: 5.4.5 vite: specifier: ^6.3.0 - version: 6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0) + version: 6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0) playground/rsc-vite-framework: dependencies: @@ -1819,23 +1716,26 @@ importers: specifier: 0.6.1 version: 0.6.1 compression: - specifier: ^1.8.0 - version: 1.8.0 + specifier: ^1.8.1 + version: 1.8.1 express: specifier: ^4.21.2 version: 4.21.2 react: - specifier: ^19.0.0 - version: 19.1.0 + specifier: catalog:react-canary + version: 19.2.3 react-dom: - specifier: ^19.0.0 - version: 19.1.0(react@19.1.0) + specifier: catalog:react-canary + version: 19.2.3(react@19.2.3) react-router: specifier: workspace:* version: link:../../packages/react-router + react-server-dom-webpack: + specifier: catalog:react-canary + version: 19.2.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(webpack@5.103.0) remix-utils: specifier: ^8.7.0 - version: 8.7.0(react-router@packages+react-router)(react@19.1.0)(zod@3.24.2) + version: 8.7.0(react-router@packages+react-router)(react@19.2.3)(zod@3.24.2) devDependencies: '@mdx-js/rollup': specifier: ^3.1.0 @@ -1856,14 +1756,14 @@ importers: specifier: ^22.13.1 version: 22.14.0 '@types/react': - specifier: ^18.2.18 + specifier: ^18.0.27 version: 18.2.18 '@types/react-dom': - specifier: ^18.2.7 + specifier: ^18.0.10 version: 18.2.7 '@vitejs/plugin-rsc': - specifier: 0.4.30 - version: 0.4.30(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0)) + specifier: 'catalog:' + version: 0.5.7(react-dom@19.2.3(react@19.2.3))(react-server-dom-webpack@19.2.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(webpack@5.103.0))(react@19.2.3)(vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0)) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -1874,11 +1774,11 @@ importers: specifier: ^5.2.0 version: 5.2.0 typescript: - specifier: ^5.1.6 + specifier: 'catalog:' version: 5.4.5 vite: specifier: ^6.3.0 - version: 6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0) + version: 6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0) playground/split-route-modules: dependencies: @@ -1892,11 +1792,11 @@ importers: specifier: ^5.1.11 version: 5.1.11 react: - specifier: ^19.1.0 - version: 19.1.0 + specifier: 'catalog:' + version: 19.2.3 react-dom: - specifier: ^19.1.0 - version: 19.1.0(react@19.1.0) + specifier: 'catalog:' + version: 19.2.3(react@19.2.3) react-router: specifier: workspace:* version: link:../../packages/react-router @@ -1905,20 +1805,20 @@ importers: specifier: workspace:* version: link:../../packages/react-router-dev '@types/react': - specifier: ^18.2.18 + specifier: ^18.0.27 version: 18.2.18 '@types/react-dom': - specifier: ^18.2.7 + specifier: ^18.0.10 version: 18.2.7 typescript: - specifier: ^5.1.6 + specifier: 'catalog:' version: 5.4.5 vite: specifier: ^6.3.0 - version: 6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0) + version: 6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0) vite-tsconfig-paths: specifier: ^4.2.1 - version: 4.3.2(typescript@5.4.5)(vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0)) + version: 4.3.2(typescript@5.4.5)(vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0)) playground/split-route-modules-spa: dependencies: @@ -1929,11 +1829,11 @@ importers: specifier: ^5 version: 5.1.11 react: - specifier: ^19.1.0 - version: 19.1.0 + specifier: 'catalog:' + version: 19.2.3 react-dom: - specifier: ^19.1.0 - version: 19.1.0(react@19.1.0) + specifier: 'catalog:' + version: 19.2.3(react@19.2.3) react-router: specifier: workspace:* version: link:../../packages/react-router @@ -1942,20 +1842,20 @@ importers: specifier: workspace:* version: link:../../packages/react-router-dev '@types/react': - specifier: ^18.2.18 + specifier: ^18.0.27 version: 18.2.18 '@types/react-dom': - specifier: ^18.2.7 + specifier: ^18.0.10 version: 18.2.7 typescript: - specifier: ^5.1.6 + specifier: 'catalog:' version: 5.4.5 vite: specifier: ^6.3.0 - version: 6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0) + version: 6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0) vite-tsconfig-paths: specifier: ^4.2.1 - version: 4.3.2(typescript@5.4.5)(vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0)) + version: 4.3.2(typescript@5.4.5)(vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0)) playground/vite-plugin-cloudflare: dependencies: @@ -1966,11 +1866,11 @@ importers: specifier: ^5.1.11 version: 5.1.11 react: - specifier: ^19.1.0 - version: 19.1.0 + specifier: 'catalog:' + version: 19.2.3 react-dom: - specifier: ^19.1.0 - version: 19.1.0(react@19.1.0) + specifier: 'catalog:' + version: 19.2.3(react@19.2.3) react-router: specifier: workspace:* version: link:../../packages/react-router @@ -1980,7 +1880,7 @@ importers: devDependencies: '@cloudflare/vite-plugin': specifier: ^1.9.0 - version: 1.9.0(rollup@4.43.0)(vite@6.4.1(@types/node@20.11.30)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0))(workerd@1.20250705.0)(wrangler@4.23.0(@cloudflare/workers-types@4.20250805.0)) + version: 1.9.0(rollup@4.43.0)(vite@6.4.1(@types/node@20.11.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0))(workerd@1.20250705.0)(wrangler@4.23.0(@cloudflare/workers-types@4.20250805.0)) '@react-router/dev': specifier: workspace:* version: link:../../packages/react-router-dev @@ -1991,23 +1891,23 @@ importers: specifier: ^20.0.0 version: 20.11.30 '@types/react': - specifier: ^18.2.18 + specifier: ^18.0.27 version: 18.2.18 '@types/react-dom': - specifier: ^18.2.7 + specifier: ^18.0.10 version: 18.2.7 eslint: specifier: ^8.38.0 version: 8.57.0 typescript: - specifier: ^5.1.6 + specifier: 'catalog:' version: 5.4.5 vite: specifier: ^6.3.0 - version: 6.4.1(@types/node@20.11.30)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0) + version: 6.4.1(@types/node@20.11.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0) vite-tsconfig-paths: specifier: ^4.2.1 - version: 4.3.2(typescript@5.4.5)(vite@6.4.1(@types/node@20.11.30)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0)) + version: 4.3.2(typescript@5.4.5)(vite@6.4.1(@types/node@20.11.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0)) wrangler: specifier: ^4.23.0 version: 4.23.0(@cloudflare/workers-types@4.20250805.0) @@ -2734,59 +2634,6 @@ packages: '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - '@biomejs/biome@1.9.4': - resolution: {integrity: sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog==} - engines: {node: '>=14.21.3'} - hasBin: true - - '@biomejs/cli-darwin-arm64@1.9.4': - resolution: {integrity: sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [darwin] - - '@biomejs/cli-darwin-x64@1.9.4': - resolution: {integrity: sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [darwin] - - '@biomejs/cli-linux-arm64-musl@1.9.4': - resolution: {integrity: sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [linux] - - '@biomejs/cli-linux-arm64@1.9.4': - resolution: {integrity: sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [linux] - - '@biomejs/cli-linux-x64-musl@1.9.4': - resolution: {integrity: sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [linux] - - '@biomejs/cli-linux-x64@1.9.4': - resolution: {integrity: sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [linux] - - '@biomejs/cli-win32-arm64@1.9.4': - resolution: {integrity: sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [win32] - - '@biomejs/cli-win32-x64@1.9.4': - resolution: {integrity: sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [win32] - '@bundled-es-modules/cookie@2.0.1': resolution: {integrity: sha512-8o+5fRPLNbjbdGRRmJj3h6Hh1AQJf2dk3qQ/5ZFb+PXkRNiSoMGGUKlsgLfrxneb72axVJyIYji64E2+nNfYyw==} @@ -3647,42 +3494,6 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - '@lezer/common@1.2.3': - resolution: {integrity: sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==} - - '@lezer/lr@1.4.2': - resolution: {integrity: sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==} - - '@lmdb/lmdb-darwin-arm64@2.8.5': - resolution: {integrity: sha512-KPDeVScZgA1oq0CiPBcOa3kHIqU+pTOwRFDIhxvmf8CTNvqdZQYp5cCKW0bUk69VygB2PuTiINFWbY78aR2pQw==} - cpu: [arm64] - os: [darwin] - - '@lmdb/lmdb-darwin-x64@2.8.5': - resolution: {integrity: sha512-w/sLhN4T7MW1nB3R/U8WK5BgQLz904wh+/SmA2jD8NnF7BLLoUgflCNxOeSPOWp8geP6nP/+VjWzZVip7rZ1ug==} - cpu: [x64] - os: [darwin] - - '@lmdb/lmdb-linux-arm64@2.8.5': - resolution: {integrity: sha512-vtbZRHH5UDlL01TT5jB576Zox3+hdyogvpcbvVJlmU5PdL3c5V7cj1EODdh1CHPksRl+cws/58ugEHi8bcj4Ww==} - cpu: [arm64] - os: [linux] - - '@lmdb/lmdb-linux-arm@2.8.5': - resolution: {integrity: sha512-c0TGMbm2M55pwTDIfkDLB6BpIsgxV4PjYck2HiOX+cy/JWiBXz32lYbarPqejKs9Flm7YVAKSILUducU9g2RVg==} - cpu: [arm] - os: [linux] - - '@lmdb/lmdb-linux-x64@2.8.5': - resolution: {integrity: sha512-Xkc8IUx9aEhP0zvgeKy7IQ3ReX2N8N1L0WPcQwnZweWmOuKfwpS3GRIYqLtK5za/w3E60zhFfNdS+3pBZPytqQ==} - cpu: [x64] - os: [linux] - - '@lmdb/lmdb-win32-x64@2.8.5': - resolution: {integrity: sha512-4wvrf5BgnR8RpogHhtpCPJMKBmvyZPhhUtEwMJbXh0ni2BucpfF07jlmyM11zRqQ2XIq6PbC2j7W7UCCcm1rRQ==} - cpu: [x64] - os: [win32] - '@manypkg/find-root@1.1.0': resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} @@ -3697,46 +3508,12 @@ packages: peerDependencies: rollup: '>=2' - '@mischnic/json-sourcemap@0.1.1': - resolution: {integrity: sha512-iA7+tyVqfrATAIsIRWQG+a7ZLLD0VaOCKV2Wd/v4mqIU3J9c4jx9p7S0nw1XH3gJCKNBOOwACOPYYSUu9pgT+w==} - engines: {node: '>=12.0.0'} - '@mjackson/node-fetch-server@0.2.0': resolution: {integrity: sha512-EMlH1e30yzmTpGLQjlFmaDAjyOeZhng1/XCd7DExR8PNAnG/G1tyruZxEoUe11ClnwGhGrtsdnyyUx1frSzjng==} '@mjackson/node-fetch-server@0.6.1': resolution: {integrity: sha512-9ZJnk/DJjt805uv5PPv11haJIW+HHf3YEEyVXv+8iLQxLD/iXA68FH220XoiTPBC4gCg5q+IMadDw8qPqlA5wg==} - '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': - resolution: {integrity: sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==} - cpu: [arm64] - os: [darwin] - - '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3': - resolution: {integrity: sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==} - cpu: [x64] - os: [darwin] - - '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3': - resolution: {integrity: sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==} - cpu: [arm64] - os: [linux] - - '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3': - resolution: {integrity: sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==} - cpu: [arm] - os: [linux] - - '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3': - resolution: {integrity: sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==} - cpu: [x64] - os: [linux] - - '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': - resolution: {integrity: sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==} - cpu: [x64] - os: [win32] - '@mswjs/interceptors@0.37.6': resolution: {integrity: sha512-wK+5pLK5XFmgtH3aQ2YVvA3HohS3xqV/OxuVOdNx9Wpnz7VE/fnC+e1A7ln6LFYeck7gOJ/dsZV6OLplOtAJ2w==} engines: {node: '>=18'} @@ -3775,1691 +3552,1271 @@ packages: '@oxc-project/types@0.61.2': resolution: {integrity: sha512-rfuwJwvwn9MRthHNXlSo9Eka/u7gC0MhnWAoX3BhE1+rwPOl22nq0K0Y997Hof0tHCOuD7H3/Z8HTfCVhB4c5Q==} - '@parcel/bundler-default@2.15.4': - resolution: {integrity: sha512-4vkaZuwGqL8L7NqEgjRznz9/QoeVKk0Z6z2nzfpdnSWA4xX3moUj+JeoqGUbyFGuPzfCma4SA4+txnQbKu0edQ==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} - '@parcel/cache@2.15.4': - resolution: {integrity: sha512-x/QgMuVvXQV6uNhIF+6kz6SzhVVkwf6WPSVG/xQvGMEiBabForDVYIhIEuN3RzUXCU352CGM6d8TtLLg61W1fw==} - engines: {node: '>= 16.0.0'} - peerDependencies: - '@parcel/core': ^2.15.4 + '@playwright/test@1.49.1': + resolution: {integrity: sha512-Ky+BVzPz8pL6PQxHqNRW1k3mIyv933LML7HktS8uik0bUXNCdPhoS/kLihiO1tMf/egaJb4IutXd7UywvXEW+g==} + engines: {node: '>=18'} + hasBin: true - '@parcel/codeframe@2.15.0': - resolution: {integrity: sha512-zpZCf5W+npiSkdCUC7izjdUUoWM2M++XWRwbqgwWBUCKrXC4vVJoOYMzLbyfaF/zkVo5iQenSGlsD0olBd7V1w==} - engines: {node: '>= 16.0.0'} + '@remix-run/changelog-github@0.0.5': + resolution: {integrity: sha512-43tqwUqWqirbv6D9uzo55ASPsCJ61Ein1k/M8qn+Qpros0MmbmuzjLVPmtaxfxfe2ANX0LefLvCD0pAgr1tp4g==} - '@parcel/codeframe@2.15.4': - resolution: {integrity: sha512-ErAPEQaJIpB+ocNZ3rl8AEK6piA7JBInwZLNU0eHMthm01Ssb10JkpAadyn1w9IVfCey+kqQcEeWv47Yh6mL1Q==} - engines: {node: '>= 16.0.0'} + '@remix-run/node-fetch-server@0.12.0': + resolution: {integrity: sha512-oeg8w8aJJSuq1fCx85jCkcgTfI6On7sKwWVSO4/OW5AvTBuosAIwnuBd/LYeU/I7lYPOTW2NXhUfyfpyeexs4w==} - '@parcel/compressor-raw@2.15.4': - resolution: {integrity: sha512-gECePZxVXBwyo0DYbAq4V4SimVzHaJ3p8QOgFIfOqNmlEBbhLf3QSjArFPJNKiHZaJuclh4a+IShFBN+u6tXXw==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} + '@remix-run/node-fetch-server@0.9.0': + resolution: {integrity: sha512-SoLMv7dbH+njWzXnOY6fI08dFMI5+/dQ+vY3n8RnnbdG7MdJEgiP28Xj/xWlnRnED/aB6SFw56Zop+LbmaaKqA==} - '@parcel/config-default@2.15.4': - resolution: {integrity: sha512-chUE4NpcSXpMfTcSmgl4Q78zH+ZFe0qdgZLBtF4EH2QQakW7wAXAYRxS2/P3xFkUj0/51sExhbCFWgulrlGDPw==} - peerDependencies: - '@parcel/core': ^2.15.4 + '@remix-run/web-blob@3.1.0': + resolution: {integrity: sha512-owGzFLbqPH9PlKb8KvpNJ0NO74HWE2euAn61eEiyCXX/oteoVzTVSN8mpLgDjaxBf2btj5/nUllSUgpyd6IH6g==} - '@parcel/core@2.15.4': - resolution: {integrity: sha512-+TXxTm58lFwXXObFAEclwKX1p1AdixcD+M7T4NeFIQzQ4F20Vr+6oybCSqW1exNA3uHqVDDFLx7TT78seVjvkg==} - engines: {node: '>= 16.0.0'} + '@remix-run/web-fetch@4.4.2': + resolution: {integrity: sha512-jgKfzA713/4kAW/oZ4bC3MoLWyjModOVDjFPNseVqcJKSafgIscrYL9G50SurEYLswPuoU3HzSbO0jQCMYWHhA==} + engines: {node: ^10.17 || >=12.3} - '@parcel/diagnostic@2.15.0': - resolution: {integrity: sha512-Bzg7AJu10muQ793p2MPlZnYvbqZXOJw/YBIOCFjbwRKiYUb06+sZyfntU7e7YecV6im0IGqkIfMD0F4MT+v7Rg==} - engines: {node: '>= 16.0.0'} + '@remix-run/web-file@3.1.0': + resolution: {integrity: sha512-dW2MNGwoiEYhlspOAXFBasmLeYshyAyhIdrlXBi06Duex5tDr3ut2LFKVj7tyHLmn8nnNwFf1BjNbkQpygC2aQ==} - '@parcel/diagnostic@2.15.4': - resolution: {integrity: sha512-8MAqefwzBKceNN3364OLm+p4HRD7AfimfFW3MntLxPB6bnelc9UBg5c9zEm34zYEctbmky8gqYgAUSDjqYC5Hw==} - engines: {node: '>= 16.0.0'} + '@remix-run/web-form-data@3.1.0': + resolution: {integrity: sha512-NdeohLMdrb+pHxMQ/Geuzdp0eqPbea+Ieo8M8Jx2lGC6TBHsgHzYcBvr0LyPdPVycNRDEpWpiDdCOdCryo3f9A==} - '@parcel/error-overlay@2.15.4': - resolution: {integrity: sha512-xxeaWm8fV8Z4uGy/c09mOvmFSHBOgF1gCMQwLCwZvfMLqIWkdZaUQ2cRhWZIS6pOXaRVC7YpcXzk2DOiSUNSbQ==} - engines: {node: '>= 16.0.0'} + '@remix-run/web-stream@1.1.0': + resolution: {integrity: sha512-KRJtwrjRV5Bb+pM7zxcTJkhIqWWSy+MYsIxHK+0m5atcznsf15YwUBWHWulZerV2+vvHH1Lp1DD7pw6qKW8SgA==} - '@parcel/events@2.15.0': - resolution: {integrity: sha512-iCoFGsZTAlh3ewp6KYseUC16OHbZi2n6vAl4Rr8Uw7yxvwCC3iHT9acLwhO7bP/YKkdGri3d78+UwPl8LmbIwA==} - engines: {node: '>= 16.0.0'} + '@rolldown/binding-darwin-arm64@1.0.0-beta.7-commit.7452fa0': + resolution: {integrity: sha512-1ONRckAxd2vr6/e6KvC/m3bPFg1lzFzLd3rW5zaj7LvLhP20Fo6t+Mj7t8/N/ENR65jbMS4hXdTPRD3MvaNTjg==} + cpu: [arm64] + os: [darwin] - '@parcel/events@2.15.4': - resolution: {integrity: sha512-SBq4zstaFr7XQaXNaQmUuVh1swCUHrhtPCOSofvkJoQGhjsuhQlh4t0NmUikyKNdj7C1j40xCS1kGHuUO29b0g==} - engines: {node: '>= 16.0.0'} + '@rolldown/binding-darwin-arm64@1.0.0-beta.7-commit.e117288': + resolution: {integrity: sha512-aq6Y9OQl05bYUnzM4a7ZGF3+Du7cdrw3Ala1eCnvNqxgi2ksXKN+LHvgeaWDlyfLgX0jVQFZre4+kzgLSHEMog==} + cpu: [arm64] + os: [darwin] - '@parcel/feature-flags@2.15.0': - resolution: {integrity: sha512-gtAC30G2QlIwTlLM2tI7AB0JBKEiX4nNOL/qh+or9wD9fuk53O4QHJwPtiy49YGSPYrYnIR2EXWOOV+3Br9CCw==} - engines: {node: '>= 16.0.0'} + '@rolldown/binding-darwin-x64@1.0.0-beta.7-commit.7452fa0': + resolution: {integrity: sha512-tA3K/yj2MDIKmpMjldEKkS/1k8o8MXIm+bMdLahZmFVRE7ODfQRe3aUaaxTm7wvHG8GKgE4DcqMJTwDeCqAt/g==} + cpu: [x64] + os: [darwin] - '@parcel/feature-flags@2.15.4': - resolution: {integrity: sha512-DJqZVtbfjWJseM0gk7yyDkAuOhP7/FVwZ/YVqjozIqXBhmQm07xctiqNQyZX2vBbQsxmVbjpqyq+DOj45WPEzQ==} - engines: {node: '>= 16.0.0'} + '@rolldown/binding-darwin-x64@1.0.0-beta.7-commit.e117288': + resolution: {integrity: sha512-GRxENhaf92Blo7TZz8C8vBFSt4pCRWDP45ElGATItWqzyM+ILtzNjkE5Wj1OyWPe7y0oWxps6YMxVxEdb3/BJQ==} + cpu: [x64] + os: [darwin] - '@parcel/fs@2.15.0': - resolution: {integrity: sha512-ecWIbIhwdnvJc/PY+l3TFOcRtr8W3X6M1yfhNQLmYs/3kETIxDK8s+vTva/qPBFEiW0amMBhbkhKZEXFrxL1GQ==} - engines: {node: '>= 16.0.0'} - peerDependencies: - '@parcel/core': ^2.15.0 + '@rolldown/binding-freebsd-x64@1.0.0-beta.7-commit.7452fa0': + resolution: {integrity: sha512-Ps9e395Gmv3nR+WmOLGnN23Qc5R7GZ619QMnrsZZnrNjqts4pf2DAGoPnTY/dCT/z+rfcN3ku35hWh3HsI9XGA==} + cpu: [x64] + os: [freebsd] - '@parcel/fs@2.15.4': - resolution: {integrity: sha512-5cahD2ByQaSi+YN0aDvrMWXZvs3mP7C5ey8zcDTDn7JxJa51sMqOQcdU3VUTzQFtAPeRM2KxUkxLhBBXgQqHZA==} - engines: {node: '>= 16.0.0'} - peerDependencies: - '@parcel/core': ^2.15.4 + '@rolldown/binding-freebsd-x64@1.0.0-beta.7-commit.e117288': + resolution: {integrity: sha512-3uibg1KMHT7c149YupfXICxKoO6K7q3MaMpvOdxUjTY9mY3+v96eHTfnq+dd6qD16ppKSVij7FfpEC+sCVDRmg==} + cpu: [x64] + os: [freebsd] - '@parcel/graph@3.5.4': - resolution: {integrity: sha512-uF7kyQXWK2fQZvG5eE0N3avYGLQE5Q0vyJsyypNcFW3kXNnrkZCUtbG7urmdae9mmZ2jXIVN4q4Bhd9pefGj9A==} - engines: {node: '>= 16.0.0'} + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.7-commit.7452fa0': + resolution: {integrity: sha512-/RKVSZGQyFpDWI2ksNV7/n2M1bbFvIoS4QvcETU+sMnDfhZQB6vP00dHMFsJS9J+y05XbsMnEgHslrLywFu4Ww==} + cpu: [arm] + os: [linux] - '@parcel/logger@2.15.0': - resolution: {integrity: sha512-WCYtSweM7Iol/lE7HhU5cLsSNuGQ1T4xTIYvG16tGHCsjybWF1H9yqkL90WU2JHjhSsvNGjvwrVxWjfO304fqQ==} - engines: {node: '>= 16.0.0'} + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.7-commit.e117288': + resolution: {integrity: sha512-oDFqE2fWx2sj0E9doRUmYxi5TKc9/vmD49NP0dUN578LQO8nJBwqOMvE8bM3a/T3or4g1mlJt2ebzGiKGzjHSw==} + cpu: [arm] + os: [linux] - '@parcel/logger@2.15.4': - resolution: {integrity: sha512-rQ7F5+FMQ7t+w5NGFRT8CWHhym0aunduufCjlafvRzUSKEN/5/nwTfCe9I5QsthGlXJWs+ZTy4zQ+wLtZQRBKQ==} - engines: {node: '>= 16.0.0'} + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.7-commit.7452fa0': + resolution: {integrity: sha512-J6PeOqrX2QttacikU/CcIG2nlsnR9gDTcUQbwEbS1G/DaPrYEHXujiI4YY5Hmd+Sr1IYXI9i3z/RfzRI9XmcpQ==} + cpu: [arm64] + os: [linux] - '@parcel/markdown-ansi@2.15.0': - resolution: {integrity: sha512-TJOSg/y2P1Rp199+osSFd4jtt8M4iyBQwgC4gdAARcraIwLa/wYRt6RVnOIsN3nz1r1CPLvHHPfuIwwFjRNw9A==} - engines: {node: '>= 16.0.0'} + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.7-commit.e117288': + resolution: {integrity: sha512-0Weogg1WiFNkmwznM4YS4AmDa55miGstb/I4zKquIsv1kSBLBkxboifgWTCPUnGFK7Wy1u/beRnxCY7UVL1oPw==} + cpu: [arm64] + os: [linux] - '@parcel/markdown-ansi@2.15.4': - resolution: {integrity: sha512-u5Lwcr4ZVBSLFbKYht+mJqJ3ZMXvJdmDMU5eDtrIEKPpu9LrIDdPpDEXBoyO6pDsoV/2AqyXUUMzBRyCatkkoQ==} - engines: {node: '>= 16.0.0'} - - '@parcel/namer-default@2.15.4': - resolution: {integrity: sha512-EXsoQ1S+5ZIfy8431E7F0vVS7bfH5JpZ+vFVcUpArJDkhmMG7T/eP6Kp9CXHLJmn7ki1x7iIVytrja0XXRQWBQ==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} - - '@parcel/node-resolver-core@3.6.0': - resolution: {integrity: sha512-5WxRlrFkHrUrCa3zq1Umo/k3Da7F1Bib31yEZp3pmAgjbX/wi+ESiMllAamW6IP2SLP80jAB2D/mbuHAqPH3kg==} - engines: {node: '>= 16.0.0'} - - '@parcel/node-resolver-core@3.6.4': - resolution: {integrity: sha512-g3+usMnr7pfRqbMAksOpNA7GJk7HUNW1Wxx7Shhp4w0K9JUdVrd2LRKwZxbqL7H9NqWtVvUOT9cZbMlDR6bO1w==} - engines: {node: '>= 16.0.0'} - - '@parcel/optimizer-css@2.15.4': - resolution: {integrity: sha512-KQLuqwcvVFTNFtM+bzfvQivwunmhVAngmR4NiI8zQaykidYH28V8YkVAQmpbLbgoGad/UgG7grb0UshvnrQHpw==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} - - '@parcel/optimizer-html@2.15.4': - resolution: {integrity: sha512-gBvt6RdDVMyO1Flvdtc8DxpxLgIXhaKuVXEjHdAP7sEW0SMdSd6r/tl6Plmcszig7sDwhDf6IsQOIvbzGHYZZg==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} - - '@parcel/optimizer-image@2.15.4': - resolution: {integrity: sha512-M8fo7eEL6JRcmLhSX9pUUGU4MPrPrE9cMNcwIt3DQLnSvQ+sshhUDa6t9hKWeHHhs16BHvxrvksN2TIbkgHODQ==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} - peerDependencies: - '@parcel/core': ^2.15.4 - - '@parcel/optimizer-svg@2.15.4': - resolution: {integrity: sha512-pPdjRaLPqjAEROXIHLc6JWLLki56alhuUNbalhLqBCgktZrrq2dGCjBEVgxqRczc9D+ePCX/e/xci4tC0Tkcbg==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} - - '@parcel/optimizer-swc@2.15.4': - resolution: {integrity: sha512-2m5cYESVCq6AGx252eSTArZ1Oc1Ve4GBGL7NhvgbNqOthyXlc2qAed6rCkARrBd8pfEl5+2XHeK1ijDAZdIZ/A==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} - - '@parcel/package-manager@2.15.4': - resolution: {integrity: sha512-KZONBcEJ24moQdrpU0zJh9CYk3KKbpB5RUM70utAORem1yQKms+0Y4YED3njq6nZzbgwUN/Csc+powUHLZStvg==} - engines: {node: '>= 16.0.0'} - peerDependencies: - '@parcel/core': ^2.15.4 - - '@parcel/packager-css@2.15.4': - resolution: {integrity: sha512-bzSaNf+I5lmJFu95wSG2k7pGwjCDesZsV6Y9sozIL2LoSxqvkGhm/ABXAa3Ed7dLe3tSAEBzJcyqShQgLzSzuw==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} - - '@parcel/packager-html@2.15.4': - resolution: {integrity: sha512-Uayux6A2Anm66Kmq22QhD0TuVp9LiRCMuPUzBd6n4ekNlG0Lzm6K3/okMkPG65nKbNjq5qcPscFWlDxggvjt2g==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} - - '@parcel/packager-js@2.15.4': - resolution: {integrity: sha512-96bqhs1jyd28CfWQD+Yn8rSsd1ar7voHWyBtMLimsK+bDJIzL26Z7jWyRDwXRuLErYC01EoXRIRctxtmeRVJ2Q==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.7-commit.7452fa0': + resolution: {integrity: sha512-lMUOKYcdDxpZMvkMbznjkqikPnvo3UIpdEfzEMp2/rOlYyC/2p3Trg3kGjhF4lbfRLbbuPEjLepGf67ot0I8oQ==} + cpu: [arm64] + os: [linux] - '@parcel/packager-raw@2.15.4': - resolution: {integrity: sha512-CaSpDt5jjcO0SYCtsDhw6yfTDQuDFQ875H42W/ftvSQL7RfLRljPthnbdcy9chvKBbvRBQF+0z8Sxwehrd5hsA==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.7-commit.e117288': + resolution: {integrity: sha512-LwEN10APipzjxAHSreVTEnUAHRz3sq4/UR3IVD/AguV0s6yAbVAsIrvIoxXHKoci+RUlyY5FXICYZQKli8iU5w==} + cpu: [arm64] + os: [linux] - '@parcel/packager-react-static@2.15.0': - resolution: {integrity: sha512-Gn/Dm6uTvyn+eA3VdMZLWzig6ZkOohPPV87DMy+enIcaN3Q0RetT5nh3SjwKGairai+WarAV0wRlMbmlR3bgxw==} - engines: {node: '>= 16.0.0', parcel: ^2.15.0} + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.7-commit.7452fa0': + resolution: {integrity: sha512-ydsgeyhu3/AvB+I1/+uQ1+PSEQRmftkvJ1ewoXB0oJTozAKN6Ywx8jnmV8jA1g/IuMDzepR6/ixF0hbyYinWWQ==} + cpu: [x64] + os: [linux] - '@parcel/packager-svg@2.15.4': - resolution: {integrity: sha512-qHsyOgnzoA2XGMLIYUnX79XAaV327VTWQvIzju/OmOjcff4o3uiEcNL8w9k3p2w2oPXOLoQ0THMiivoUQSM8GQ==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.7-commit.e117288': + resolution: {integrity: sha512-tgE2J4BAQfI0rfoPzS4r1LEHSNxdNSM8l1Ab5InnzE4dXzVw92BVQ/FLFE6L+nWy81O7uwd7yz0Jo+qByOPCXg==} + cpu: [x64] + os: [linux] - '@parcel/packager-wasm@2.15.4': - resolution: {integrity: sha512-YPVij7zrBchtXr/y29P4uh3C/+19PMhhLibYF/8oMJKkFkeU3Uv00/XLm915vdBPrIPjgw0YuIfLzUKip1uGtg==} - engines: {node: '>=16.0.0', parcel: ^2.15.4} + '@rolldown/binding-linux-x64-musl@1.0.0-beta.7-commit.7452fa0': + resolution: {integrity: sha512-prSpmuIoS6M1KLRd2Fzpz9n6K6K8g8/F5bN15iEpjRZCkCOI24+bVX6fDKbI0frstIMzFVvbGSxmHxt0pyphEA==} + cpu: [x64] + os: [linux] - '@parcel/plugin@2.15.0': - resolution: {integrity: sha512-OT+W5t70+VZbcg2P30QahF4YjRu+9ywG5NSMj0SYvS6PCZa+IAYB9589KuavcAp+Tq2FV7MgYtrBKPh9b0VAtg==} - engines: {node: '>= 16.0.0'} + '@rolldown/binding-linux-x64-musl@1.0.0-beta.7-commit.e117288': + resolution: {integrity: sha512-m78svPie3D5PIBxmexztDVHjrnHO5t6h3Lwtl6sqdrio1zhGYMY9FcPcaZZ40mXXWKHFoPmbueBZZLdttvOEIQ==} + cpu: [x64] + os: [linux] - '@parcel/plugin@2.15.4': - resolution: {integrity: sha512-XVehjmzk8ZDOFf/BXo26L76ZqCGNKIQcN2ngxAnq0KRY/WFanL8yLaL0qQq+c9whlu09hkGz1CuhFBLAIjJMYQ==} - engines: {node: '>= 16.0.0'} + '@rolldown/binding-wasm32-wasi@1.0.0-beta.7-commit.7452fa0': + resolution: {integrity: sha512-kRFr1jOfL4L627d1Bw/EPst3A2BwP+DV6CH/Myxl88DFzAeOAfQ04hFfCm8lBcRxzfrJNcFAMNrdIKgdUd7ddQ==} + engines: {node: '>=14.21.3'} + cpu: [wasm32] - '@parcel/profiler@2.15.0': - resolution: {integrity: sha512-/Bw10pCISHbSzpdmuxg1GjSh+GuvqmUYA9bAmb69dkzWLIEk3uU05ba4xoju2mwoSeNb50LRcYPcirLB0Z61wA==} - engines: {node: '>= 16.0.0'} + '@rolldown/binding-wasm32-wasi@1.0.0-beta.7-commit.e117288': + resolution: {integrity: sha512-XbOcOWmdioNZ3hHBb5j96Y9S9pGyTeFZWR5ovMZggA9L7mWft2pMrbx4p5zUy2dCps3l1jaFQCjKuBXpwoCZug==} + engines: {node: '>=14.21.3'} + cpu: [wasm32] - '@parcel/profiler@2.15.4': - resolution: {integrity: sha512-ezVZlttUmQ1MQD5e8yVb07vSGYEFOB59Y/jaxL9mGSLZkVhMIIHe/7SuA+4qVAH8dlg6bslXRqlsunLMPEgPsg==} - engines: {node: '>= 16.0.0'} + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.7-commit.7452fa0': + resolution: {integrity: sha512-1l+vls3mjcKOxsrnwcwG1fX8/pL7URuZ+d+7WvKaXXIq3Id6HSdtCYuBwkUg3Bdm0mLDk7Qyv1QG3BwTcFahGQ==} + cpu: [arm64] + os: [win32] - '@parcel/reporter-cli@2.15.4': - resolution: {integrity: sha512-us0HIwuJqpSguf+yi4n8foabVs26JGvRB/eSOf0KkRldxFciYLn4NJ8rt3Xm1zvxlDiSkD4v2n77u+ouIZ+AEQ==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.7-commit.e117288': + resolution: {integrity: sha512-lnZ/wrat6UMWGbS9w5AUEH8WkPBA4EUSYp8cxlspdU16dISeD/KGpF2d0hS6Oa6ftbgZZrRLMEnQRiD8OupPsg==} + cpu: [arm64] + os: [win32] - '@parcel/reporter-dev-server@2.15.4': - resolution: {integrity: sha512-uCNeDyArNNXI9YThlxyTx7+5ZSxlewyUdyrLdDZCqvn8s1xNB9W8sUNVps7mJZQSc+2ZRk3wyDemURD67uJk/A==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.7-commit.7452fa0': + resolution: {integrity: sha512-YJxvaPtH4sl5reLZCvNuqFHCgdsIRGG77LET+xng9CEWGaA1Epx2qcbeAAX8czU82tYrorx5Taxioo3GqvF53w==} + cpu: [ia32] + os: [win32] - '@parcel/reporter-tracer@2.15.4': - resolution: {integrity: sha512-9W1xsb/FtobCQ4z847nI6hFDaTZHLeThv/z05EF77R30RX2k+unG9ac5NQB1v4KLx09Bhfre32+sjYNReWxWlg==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.7-commit.e117288': + resolution: {integrity: sha512-F0N/6kAnCl9dOgqR09T60UjQSxKvRtlbImhiYxIdKBFxgYDDGsh8XzlSbMRUVQmMtNwKC8xi+i+SnamSqY6q8Q==} + cpu: [ia32] + os: [win32] - '@parcel/resolver-default@2.15.4': - resolution: {integrity: sha512-4uKo3FFnubtIc4rM9jZiQQXpa1slawyRy5btJEfTFvbcnz0dm3WThLrsPDMfmPwNr9F/n5x8yzDLI6/fZ/elgA==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.7-commit.7452fa0': + resolution: {integrity: sha512-OZok4v+44zYlSqo5pVyt5xPgruYcaPig9T0ieOh+O7f3BWqlkLI3ZFalznq2zFp4mJS7GtrqOAm6h7sgd+LTOw==} + cpu: [x64] + os: [win32] - '@parcel/runtime-browser-hmr@2.15.4': - resolution: {integrity: sha512-KRGzbxDUOQUkrJKxxY0WyU7oVaa9TvWTRlpuGJXzQJs/hw8vkAAoAm8+ptpypvBC8LnxFHzGbSyHPfL8C8MQOw==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.7-commit.e117288': + resolution: {integrity: sha512-T3qKMkSVemlVLLd5V7dCXnjt4Zda1UnUi45AQnmxIf3jH0/VP0J4aYAJiEEaRbhMoHc82j01+6MuZFZUVMeqng==} + cpu: [x64] + os: [win32] - '@parcel/runtime-js@2.15.4': - resolution: {integrity: sha512-zNRK+693CMkYiA0ckjPOmz+JVHD9bVzp27itcMyuDH6l/Or8m09RgCC4DIdIxBqiplsDSe39DwEc5X7b0vvcjw==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} + '@rolldown/pluginutils@1.0.0-beta.11': + resolution: {integrity: sha512-L/gAA/hyCSuzTF1ftlzUSI/IKr2POHsv1Dd78GfqkR83KMNuswWD61JxGV2L7nRwBBBSDr6R1gCkdTmoN7W4ag==} - '@parcel/runtime-rsc@2.15.0': - resolution: {integrity: sha512-bs0miqQ/fqQU+6iAjXBG65/t5/r/JTYAg3YEo7WPPA9cbgSE8aL2rk+6d5HnRkUstzXKJEgzAQJLObOAb3s/HA==} - engines: {node: '>= 12.0.0', parcel: ^2.15.0} + '@rollup/plugin-replace@6.0.2': + resolution: {integrity: sha512-7QaYCf8bqF04dOy7w/eHmJeNExxTYwvKAmlSAH/EaWWUzbT0h5sbF6bktFoX/0F/0qwng5/dWFMyf3gzaM8DsQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true - '@parcel/runtime-rsc@2.15.4': - resolution: {integrity: sha512-yHc4HEwzCQYLqa6Q1WtZ8xJeaDAk0p2i0b3ABq2I+izmRjer4jertlsEwh9mf9Z1eUGtJobdGYzl8Ai1VfhC3g==} - engines: {node: '>= 12.0.0', parcel: ^2.15.4} + '@rollup/pluginutils@5.1.0': + resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true - '@parcel/runtime-service-worker@2.15.4': - resolution: {integrity: sha512-NGq/wS34GIVzo2ZURBjCqgHV+PU7eTcngCzmmk/wrCEeWnr13ld+CAIxVZoqyNJwYsF6VQanrjSM2/LhCXEdyA==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} + '@rollup/rollup-android-arm-eabi@4.43.0': + resolution: {integrity: sha512-Krjy9awJl6rKbruhQDgivNbD1WuLb8xAclM4IR4cN5pHGAs2oIMMQJEiC3IC/9TZJ+QZkmZhlMO/6MBGxPidpw==} + cpu: [arm] + os: [android] - '@parcel/rust-darwin-arm64@2.15.0': - resolution: {integrity: sha512-bdlLA/l7h7TPGc6lnHNrLW6uwUMJ7bqyHa4StYFViwXffDnEeA+hdpixDfc9qTlMJlKgQyYj7BNP1NO6OxJiRg==} - engines: {node: '>= 10'} + '@rollup/rollup-android-arm64@4.43.0': + resolution: {integrity: sha512-ss4YJwRt5I63454Rpj+mXCXicakdFmKnUNxr1dLK+5rv5FJgAxnN7s31a5VchRYxCFWdmnDWKd0wbAdTr0J5EA==} cpu: [arm64] - os: [darwin] + os: [android] - '@parcel/rust-darwin-arm64@2.15.4': - resolution: {integrity: sha512-cEpNDeEtvM5Nhj0QLN95QbcZ9yY6Z5W3+2OeHvnojEAP8Rp1XGzqVTTZdlyKyN1KTiyfzIOiQJCiEcr+kMc5Nw==} - engines: {node: '>= 10'} + '@rollup/rollup-darwin-arm64@4.43.0': + resolution: {integrity: sha512-eKoL8ykZ7zz8MjgBenEF2OoTNFAPFz1/lyJ5UmmFSz5jW+7XbH1+MAgCVHy72aG59rbuQLcJeiMrP8qP5d/N0A==} cpu: [arm64] os: [darwin] - '@parcel/rust-darwin-x64@2.15.0': - resolution: {integrity: sha512-l6tD0nNvmtpwuNSCP9Q5jPpPeY45NwmRNiuDoYMzfNT3iFKs/i48/3JM1vZvYO3HiW6V0xGfWa1b+HQsSKQRYg==} - engines: {node: '>= 10'} + '@rollup/rollup-darwin-x64@4.43.0': + resolution: {integrity: sha512-SYwXJgaBYW33Wi/q4ubN+ldWC4DzQY62S4Ll2dgfr/dbPoF50dlQwEaEHSKrQdSjC6oIe1WgzosoaNoHCdNuMg==} cpu: [x64] os: [darwin] - '@parcel/rust-darwin-x64@2.15.4': - resolution: {integrity: sha512-jL9i13sXKeBXXz8Z3BNYoScPOi+ljBA0ubAE3PN5DCoAA6wS4/FsAiRSIUw+3uxqASBD7+JvaT5sDUga1Xft5g==} - engines: {node: '>= 10'} + '@rollup/rollup-freebsd-arm64@4.43.0': + resolution: {integrity: sha512-SV+U5sSo0yujrjzBF7/YidieK2iF6E7MdF6EbYxNz94lA+R0wKl3SiixGyG/9Klab6uNBIqsN7j4Y/Fya7wAjQ==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.43.0': + resolution: {integrity: sha512-J7uCsiV13L/VOeHJBo5SjasKiGxJ0g+nQTrBkAsmQBIdil3KhPnSE9GnRon4ejX1XDdsmK/l30IYLiAaQEO0Cg==} cpu: [x64] - os: [darwin] + os: [freebsd] - '@parcel/rust-linux-arm-gnueabihf@2.15.0': - resolution: {integrity: sha512-MZNL/UV20kBaTYMos/IcJPZvzYzlYWjuBZh2EI3OHYBGMR9QdpeJuwgTAy2WUYbevXm7nemdGHGccGcdiNf/Xg==} - engines: {node: '>= 10'} + '@rollup/rollup-linux-arm-gnueabihf@4.43.0': + resolution: {integrity: sha512-gTJ/JnnjCMc15uwB10TTATBEhK9meBIY+gXP4s0sHD1zHOaIh4Dmy1X9wup18IiY9tTNk5gJc4yx9ctj/fjrIw==} cpu: [arm] os: [linux] - '@parcel/rust-linux-arm-gnueabihf@2.15.4': - resolution: {integrity: sha512-c8HpVdDugCutlMILoOlkTioih9HGJpQrzS2G3cg/O1a5ZTacooGf3eGJGoh6dUBEv9WEaEb6zsTRwFv2BgtZcA==} - engines: {node: '>= 10'} + '@rollup/rollup-linux-arm-musleabihf@4.43.0': + resolution: {integrity: sha512-ZJ3gZynL1LDSIvRfz0qXtTNs56n5DI2Mq+WACWZ7yGHFUEirHBRt7fyIk0NsCKhmRhn7WAcjgSkSVVxKlPNFFw==} cpu: [arm] os: [linux] - '@parcel/rust-linux-arm64-gnu@2.15.0': - resolution: {integrity: sha512-u/rndCWjmQgFJi/2NFVWV1snlF/souO8UYZR+ZG6goo/sik5WgrACtCucgOrskogE50WU1+JGmP0TBNqOX27Uw==} - engines: {node: '>= 10'} + '@rollup/rollup-linux-arm64-gnu@4.43.0': + resolution: {integrity: sha512-8FnkipasmOOSSlfucGYEu58U8cxEdhziKjPD2FIa0ONVMxvl/hmONtX/7y4vGjdUhjcTHlKlDhw3H9t98fPvyA==} cpu: [arm64] os: [linux] - '@parcel/rust-linux-arm64-gnu@2.15.4': - resolution: {integrity: sha512-Wcfs/JY4FnuLxQaU+VX2rI4j376Qo2LkZmq4zp9frnsajaAqmloVQfnbUkdnQPEL4I38eHXerzBX3LoXSxnZKA==} - engines: {node: '>= 10'} + '@rollup/rollup-linux-arm64-musl@4.43.0': + resolution: {integrity: sha512-KPPyAdlcIZ6S9C3S2cndXDkV0Bb1OSMsX0Eelr2Bay4EsF9yi9u9uzc9RniK3mcUGCLhWY9oLr6er80P5DE6XA==} cpu: [arm64] os: [linux] - '@parcel/rust-linux-arm64-musl@2.15.0': - resolution: {integrity: sha512-uTSOZJkZKh/x/IfaGkbmqqdUaK1S61Kw3ZW8yj+EtteHvfZgk1SQMgI51Gg5hwaZ5wuZx0nOJGLuOxPMGx7z6w==} - engines: {node: '>= 10'} - cpu: [arm64] + '@rollup/rollup-linux-loongarch64-gnu@4.43.0': + resolution: {integrity: sha512-HPGDIH0/ZzAZjvtlXj6g+KDQ9ZMHfSP553za7o2Odegb/BEfwJcR0Sw0RLNpQ9nC6Gy8s+3mSS9xjZ0n3rhcYg==} + cpu: [loong64] os: [linux] - '@parcel/rust-linux-arm64-musl@2.15.4': - resolution: {integrity: sha512-xf9HxosEn3dU5M0zDSXqBaG8rEjLThRdTYqpkxHW/qQGzy0Se+/ntg8PeDHsSG5E9OK8xrcKH46Lhaw0QBF/Zw==} - engines: {node: '>= 10'} - cpu: [arm64] + '@rollup/rollup-linux-powerpc64le-gnu@4.43.0': + resolution: {integrity: sha512-gEmwbOws4U4GLAJDhhtSPWPXUzDfMRedT3hFMyRAvM9Mrnj+dJIFIeL7otsv2WF3D7GrV0GIewW0y28dOYWkmw==} + cpu: [ppc64] os: [linux] - '@parcel/rust-linux-x64-gnu@2.15.0': - resolution: {integrity: sha512-8SIwgM+bpiodJemNaEuUgZQk4hV/3pgJnPBRjGse1F7SHeTp9UoABLSF3V5Sc79Hi8fzECoRimk44krzSCaynw==} - engines: {node: '>= 10'} - cpu: [x64] + '@rollup/rollup-linux-riscv64-gnu@4.43.0': + resolution: {integrity: sha512-XXKvo2e+wFtXZF/9xoWohHg+MuRnvO29TI5Hqe9xwN5uN8NKUYy7tXUG3EZAlfchufNCTHNGjEx7uN78KsBo0g==} + cpu: [riscv64] os: [linux] - '@parcel/rust-linux-x64-gnu@2.15.4': - resolution: {integrity: sha512-RigXVCFj6h0AXmkuxU61rfgYuW+PXBR6qSkR2I20yKnAXoMfxLaZy9YJ3sAPMEjT9zXgzGAX+3syItMF+bRjaw==} - engines: {node: '>= 10'} - cpu: [x64] + '@rollup/rollup-linux-riscv64-musl@4.43.0': + resolution: {integrity: sha512-ruf3hPWhjw6uDFsOAzmbNIvlXFXlBQ4nk57Sec8E8rUxs/AI4HD6xmiiasOOx/3QxS2f5eQMKTAwk7KHwpzr/Q==} + cpu: [riscv64] os: [linux] - '@parcel/rust-linux-x64-musl@2.15.0': - resolution: {integrity: sha512-pMFQ7bdaBeFY+qfHE8Oor8yZLkXDl5PmnKICuFiGETnbClV9xfWmZdTnqjEw2XU9gGQ49DkWJcGW975d3IlksA==} - engines: {node: '>= 10'} - cpu: [x64] + '@rollup/rollup-linux-s390x-gnu@4.43.0': + resolution: {integrity: sha512-QmNIAqDiEMEvFV15rsSnjoSmO0+eJLoKRD9EAa9rrYNwO/XRCtOGM3A5A0X+wmG+XRrw9Fxdsw+LnyYiZWWcVw==} + cpu: [s390x] os: [linux] - '@parcel/rust-linux-x64-musl@2.15.4': - resolution: {integrity: sha512-tHlRgonSr5ca8OvhbGzZUggCgCOirRz5dHhPSCm4ajMxeDMamwprq6lKy0sCNTXht4TXIEyugBcfEuRKEeVIBw==} - engines: {node: '>= 10'} + '@rollup/rollup-linux-x64-gnu@4.43.0': + resolution: {integrity: sha512-jAHr/S0iiBtFyzjhOkAics/2SrXE092qyqEg96e90L3t9Op8OTzS6+IX0Fy5wCt2+KqeHAkti+eitV0wvblEoQ==} cpu: [x64] os: [linux] - '@parcel/rust-win32-x64-msvc@2.15.0': - resolution: {integrity: sha512-UXjPkWbavwGIHi/R1uPd4CZDhAUUfOGpvIMRdq0ImihoRUnUxyTCIsqRhwh8flOO2RCuU6rteeGOeT9undSX7Q==} - engines: {node: '>= 10'} + '@rollup/rollup-linux-x64-musl@4.43.0': + resolution: {integrity: sha512-3yATWgdeXyuHtBhrLt98w+5fKurdqvs8B53LaoKD7P7H7FKOONLsBVMNl9ghPQZQuYcceV5CDyPfyfGpMWD9mQ==} cpu: [x64] - os: [win32] + os: [linux] - '@parcel/rust-win32-x64-msvc@2.15.4': - resolution: {integrity: sha512-YsX6vMl/bfyxqZSN7yiaZQKLoJKELSZYcvg8gIv4CF1xkaTdmfr6gvq2iCyoV+bwrodNohN4Xfl8r7Wniu1/UA==} - engines: {node: '>= 10'} - cpu: [x64] + '@rollup/rollup-win32-arm64-msvc@4.43.0': + resolution: {integrity: sha512-wVzXp2qDSCOpcBCT5WRWLmpJRIzv23valvcTwMHEobkjippNf+C3ys/+wf07poPkeNix0paTNemB2XrHr2TnGw==} + cpu: [arm64] os: [win32] - '@parcel/rust@2.15.0': - resolution: {integrity: sha512-ERRO4q14g6nD5mr1S/kEDSsmis/mll9JLxzyub0vTgobywrUq/azJ6Un7XwhCXCaU7lO7ihD+HJvjmNLVULCXg==} - engines: {node: '>= 16.0.0'} - peerDependencies: - napi-wasm: ^1.1.2 - peerDependenciesMeta: - napi-wasm: - optional: true - - '@parcel/rust@2.15.4': - resolution: {integrity: sha512-OxOux8z8YEYg23+15uMmYaloFp3x1RwcliBay6HqxUW7RTmtI1/z+xd8AtienCckACD60gvDGy04LjgbEGdJVg==} - engines: {node: '>= 16.0.0'} - peerDependencies: - napi-wasm: ^1.1.2 - peerDependenciesMeta: - napi-wasm: - optional: true - - '@parcel/source-map@2.1.1': - resolution: {integrity: sha512-Ejx1P/mj+kMjQb8/y5XxDUn4reGdr+WyKYloBljpppUy8gs42T+BNoEOuRYqDVdgPc6NxduzIDoJS9pOFfV5Ew==} - engines: {node: ^12.18.3 || >=14} - - '@parcel/transformer-babel@2.15.4': - resolution: {integrity: sha512-rb4nqZcTLkLD3nvuYJ9wwNb8x6cajBK2l6csdYMLEI4516SkIzkO/gs2cZ9M5q+CMhxAqpdEnrwektbOtQQasg==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} - - '@parcel/transformer-css@2.15.4': - resolution: {integrity: sha512-6tVwSJsOssXgcB5XMAQGsexAffoBEi8GVql3YQqzI1EwVYs9zr+B5mfbesb4aWcegR02w99NHJYFP9CrOr3SWw==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} - - '@parcel/transformer-html@2.15.4': - resolution: {integrity: sha512-gzYPbbyEuV8nzPojw86eD5Kf93AYUWcY8lu33gu0XHROJH7mq5MAwPwtb/U+EfpeCd0/oKbLzA2mkQksM1NncQ==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} - - '@parcel/transformer-image@2.15.4': - resolution: {integrity: sha512-KOVwj2gKjUybuzHwarC/YVqRf3r2BD4/2ysckozj6DIji/bq3fd2rE9yqxWXO+zt918PsOSTzMKwRnaseaXLKQ==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} - peerDependencies: - '@parcel/core': ^2.15.4 - - '@parcel/transformer-js@2.15.4': - resolution: {integrity: sha512-HX76PalPjqCLmXJnuSeMr2km8WlnUsW8oaRZ6FuZtSo9QD8BqIcwKGxSbIy9JHkObBgmrMOVpGtYrJM4/BlYbg==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} - peerDependencies: - '@parcel/core': ^2.15.4 + '@rollup/rollup-win32-ia32-msvc@4.43.0': + resolution: {integrity: sha512-fYCTEyzf8d+7diCw8b+asvWDCLMjsCEA8alvtAutqJOJp/wL5hs1rWSqJ1vkjgW0L2NB4bsYJrpKkiIPRR9dvw==} + cpu: [ia32] + os: [win32] - '@parcel/transformer-json@2.15.4': - resolution: {integrity: sha512-1ASeOSH3gPeaXyy/TZ7ce2TOfJ3ZeK5SBnDs+MM8LFcQsTwdRJKjX/4Qq9RgtMRryYAGHgMa09Gvp9FuFRyd+w==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} + '@rollup/rollup-win32-x64-msvc@4.43.0': + resolution: {integrity: sha512-SnGhLiE5rlK0ofq8kzuDkM0g7FN1s5VYY+YSMTibP7CqShxCQvqtNxTARS4xX4PFJfHjG0ZQYX9iGzI3FQh5Aw==} + cpu: [x64] + os: [win32] - '@parcel/transformer-node@2.15.4': - resolution: {integrity: sha512-zV5jvZA971eQMcFtaWZkW1UfAH/G6XVM/87oJ2B4ip9o9aKUWIl296rrfg2xWxUQyPhy11B17CJ6b8NgieqqrQ==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} + '@rushstack/eslint-patch@1.10.1': + resolution: {integrity: sha512-S3Kq8e7LqxkA9s7HKLqXGTGck1uwis5vAXan3FnU5yw1Ec5hsSGnq4s/UCaSqABPOnOTg7zASLyst7+ohgWexg==} - '@parcel/transformer-postcss@2.15.4': - resolution: {integrity: sha512-cNueSpOj3ulmMX85xr9clh/t0+mzVE+Q3H7Cf/OammqUkG/xjmilq4q7ZTgQFyUtUdWpE9LWWHojbJuz6k2Ulw==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} + '@sec-ant/readable-stream@0.4.1': + resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} - '@parcel/transformer-posthtml@2.15.4': - resolution: {integrity: sha512-dETI+CeKMwu5Dpvu8BrQtex6nwzbNWKQkXseiM5x6+Wf3j9RD2NVpAMBRMjLkw1XlC9Whz1egxLSgKlMKbjg0w==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} + '@shikijs/engine-oniguruma@3.8.1': + resolution: {integrity: sha512-KGQJZHlNY7c656qPFEQpIoqOuC4LrxjyNndRdzk5WKB/Ie87+NJCF1xo9KkOUxwxylk7rT6nhlZyTGTC4fCe1g==} - '@parcel/transformer-raw@2.15.4': - resolution: {integrity: sha512-pY2j09UCW2v1fwQtVLlCztSdPOxhq0YcWmTHCk/mRp8zuUR+eyHgsz48FrUxRF7cr/EBjc0zlFcregRMRcaTMg==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} + '@shikijs/langs@3.8.1': + resolution: {integrity: sha512-TjOFg2Wp1w07oKnXjs0AUMb4kJvujML+fJ1C5cmEj45lhjbUXtziT1x2bPQb9Db6kmPhkG5NI2tgYW1/DzhUuQ==} - '@parcel/transformer-react-refresh-wrap@2.15.4': - resolution: {integrity: sha512-MgoQrV8+BVjrczAns5ZZbTERGB3/U4MaCBmbg3CuiTiIyS8IJQnGi+OhYRdKAB4NlsgpMZ5T2JrRbQUIm9MM8Q==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} + '@shikijs/themes@3.8.1': + resolution: {integrity: sha512-Vu3t3BBLifc0GB0UPg2Pox1naTemrrvyZv2lkiSw3QayVV60me1ujFQwPZGgUTmwXl1yhCPW8Lieesm0CYruLQ==} - '@parcel/transformer-react-static@2.15.0': - resolution: {integrity: sha512-OYqnAtjOZS2o0M/vKl9gfvEpjMnvcAnLwtPzVtK/OFyqtps6gvu99P/UIfxKi2sPngW+HbsmuCvY8rNbpbPsQA==} - engines: {node: '>= 16.0.0', parcel: ^2.15.0} + '@shikijs/types@3.8.1': + resolution: {integrity: sha512-5C39Q8/8r1I26suLh+5TPk1DTrbY/kn3IdWA5HdizR0FhlhD05zx5nKCqhzSfDHH3p4S0ZefxWd77DLV+8FhGg==} - '@parcel/transformer-svg@2.15.4': - resolution: {integrity: sha512-Q22e0VRbx62VXFlvJWIlc8ihlLaPQgtnAZz5E1/+ojiNb+k0PmIRjNJclVWPF6IdCsLO5tnGfUOaXe2OnZz28Q==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} - '@parcel/types-internal@2.15.0': - resolution: {integrity: sha512-N0p622dZx84OPoxSoz5YfnVJMXAoQfcHI+qp535J/Uv6UAbcsimKl9NPKefrLOHgSKlTTJPiDbWSMOVrPvyr6w==} + '@sideway/address@4.1.5': + resolution: {integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==} - '@parcel/types-internal@2.15.4': - resolution: {integrity: sha512-kl5QEZ8PTWRvMkwmk7IG3VpP/5/MSGwt9Nrj9ctXLdZkDdXZpK7IbXAthLQ4zrByMaqZULL2IyDuBqBgfuAqlQ==} + '@sideway/formula@3.0.1': + resolution: {integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==} - '@parcel/types@2.15.0': - resolution: {integrity: sha512-BtAeK/mTQMjbgyo8r1jM1d+dcnEowErHH/Eb/95Agxi7YHpfnNP2oR8cC2yZbevU9FCXnSJ2f6vZc4NGT+nqlA==} + '@sideway/pinpoint@2.0.0': + resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} - '@parcel/types@2.15.4': - resolution: {integrity: sha512-fS3UMMinLtzn/NTSx/qx38saBgRniylldh0XZEUcGeME4D2Llu/QlLv+YZ/LJqrFci3fPRM+YAn2K+JT/u+/0w==} + '@sinclair/typebox@0.27.8': + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - '@parcel/utils@2.15.0': - resolution: {integrity: sha512-Xir0/9UvUvMF8iRnARDdzzlEokDAcrsxj6aQUbYP3ZXV/l6/6eMRuSXZ32x6lUzOTHxukKMJA42imWUg6x38qg==} - engines: {node: '>= 16.0.0'} + '@sindresorhus/merge-streams@4.0.0': + resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} + engines: {node: '>=18'} - '@parcel/utils@2.15.4': - resolution: {integrity: sha512-29m09sfPx0GHnmy1kkZ5XezprepdFGKKKUEJkyiYA4ERf55jjdnU2/GP4sWlZXxjh2Y+JFoCAFlCamEClq/8eA==} - engines: {node: '>= 16.0.0'} + '@sinonjs/commons@2.0.0': + resolution: {integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==} - '@parcel/watcher-android-arm64@2.5.1': - resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [android] + '@sinonjs/fake-timers@10.0.2': + resolution: {integrity: sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==} - '@parcel/watcher-darwin-arm64@2.5.1': - resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==} - engines: {node: '>= 10.0.0'} + '@swc/core-darwin-arm64@1.11.24': + resolution: {integrity: sha512-dhtVj0PC1APOF4fl5qT2neGjRLgHAAYfiVP8poJelhzhB/318bO+QCFWAiimcDoyMgpCXOhTp757gnoJJrheWA==} + engines: {node: '>=10'} cpu: [arm64] os: [darwin] - '@parcel/watcher-darwin-x64@2.5.1': - resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==} - engines: {node: '>= 10.0.0'} + '@swc/core-darwin-x64@1.11.24': + resolution: {integrity: sha512-H/3cPs8uxcj2Fe3SoLlofN5JG6Ny5bl8DuZ6Yc2wr7gQFBmyBkbZEz+sPVgsID7IXuz7vTP95kMm1VL74SO5AQ==} + engines: {node: '>=10'} cpu: [x64] os: [darwin] - '@parcel/watcher-freebsd-x64@2.5.1': - resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [freebsd] - - '@parcel/watcher-linux-arm-glibc@2.5.1': - resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==} - engines: {node: '>= 10.0.0'} - cpu: [arm] - os: [linux] - - '@parcel/watcher-linux-arm-musl@2.5.1': - resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} - engines: {node: '>= 10.0.0'} + '@swc/core-linux-arm-gnueabihf@1.11.24': + resolution: {integrity: sha512-PHJgWEpCsLo/NGj+A2lXZ2mgGjsr96ULNW3+T3Bj2KTc8XtMUkE8tmY2Da20ItZOvPNC/69KroU7edyo1Flfbw==} + engines: {node: '>=10'} cpu: [arm] os: [linux] - '@parcel/watcher-linux-arm64-glibc@2.5.1': - resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} - engines: {node: '>= 10.0.0'} + '@swc/core-linux-arm64-gnu@1.11.24': + resolution: {integrity: sha512-C2FJb08+n5SD4CYWCTZx1uR88BN41ZieoHvI8A55hfVf2woT8+6ZiBzt74qW2g+ntZ535Jts5VwXAKdu41HpBg==} + engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@parcel/watcher-linux-arm64-musl@2.5.1': - resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} - engines: {node: '>= 10.0.0'} + '@swc/core-linux-arm64-musl@1.11.24': + resolution: {integrity: sha512-ypXLIdszRo0re7PNNaXN0+2lD454G8l9LPK/rbfRXnhLWDBPURxzKlLlU/YGd2zP98wPcVooMmegRSNOKfvErw==} + engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@parcel/watcher-linux-x64-glibc@2.5.1': - resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} - engines: {node: '>= 10.0.0'} + '@swc/core-linux-x64-gnu@1.11.24': + resolution: {integrity: sha512-IM7d+STVZD48zxcgo69L0yYptfhaaE9cMZ+9OoMxirNafhKKXwoZuufol1+alEFKc+Wbwp+aUPe/DeWC/Lh3dg==} + engines: {node: '>=10'} cpu: [x64] os: [linux] - '@parcel/watcher-linux-x64-musl@2.5.1': - resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} - engines: {node: '>= 10.0.0'} + '@swc/core-linux-x64-musl@1.11.24': + resolution: {integrity: sha512-DZByJaMVzSfjQKKQn3cqSeqwy6lpMaQDQQ4HPlch9FWtDx/dLcpdIhxssqZXcR2rhaQVIaRQsCqwV6orSDGAGw==} + engines: {node: '>=10'} cpu: [x64] os: [linux] - '@parcel/watcher-win32-arm64@2.5.1': - resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] + '@swc/core-win32-arm64-msvc@1.11.24': + resolution: {integrity: sha512-Q64Ytn23y9aVDKN5iryFi8mRgyHw3/kyjTjT4qFCa8AEb5sGUuSj//AUZ6c0J7hQKMHlg9do5Etvoe61V98/JQ==} + engines: {node: '>=10'} + cpu: [arm64] os: [win32] - '@parcel/watcher-win32-ia32@2.5.1': - resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==} - engines: {node: '>= 10.0.0'} + '@swc/core-win32-ia32-msvc@1.11.24': + resolution: {integrity: sha512-9pKLIisE/Hh2vJhGIPvSoTK4uBSPxNVyXHmOrtdDot4E1FUUI74Vi8tFdlwNbaj8/vusVnb8xPXsxF1uB0VgiQ==} + engines: {node: '>=10'} cpu: [ia32] os: [win32] - '@parcel/watcher-win32-x64@2.5.1': - resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==} - engines: {node: '>= 10.0.0'} + '@swc/core-win32-x64-msvc@1.11.24': + resolution: {integrity: sha512-sybnXtOsdB+XvzVFlBVGgRHLqp3yRpHK7CrmpuDKszhj/QhmsaZzY/GHSeALlMtLup13M0gqbcQvsTNlAHTg3w==} + engines: {node: '>=10'} cpu: [x64] os: [win32] - '@parcel/watcher@2.5.1': - resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} - engines: {node: '>= 10.0.0'} - - '@parcel/workers@2.15.0': - resolution: {integrity: sha512-OAtL9bvDzvIS+9uNMjnf0b6Ri2m2r8Wa3Bxr8SVnjX6J5SWdOPdVR1MqwCsFF+ZeOngaSEFFbe/czHLfgc0Vnw==} - engines: {node: '>= 16.0.0'} + '@swc/core@1.11.24': + resolution: {integrity: sha512-MaQEIpfcEMzx3VWWopbofKJvaraqmL6HbLlw2bFZ7qYqYw3rkhM0cQVEgyzbHtTWwCwPMFZSC2DUbhlZgrMfLg==} + engines: {node: '>=10'} peerDependencies: - '@parcel/core': ^2.15.0 + '@swc/helpers': '>=0.5.17' + peerDependenciesMeta: + '@swc/helpers': + optional: true - '@parcel/workers@2.15.4': - resolution: {integrity: sha512-wZ/5/mfjs5aeqhXY0c6fwuaBFeNpOXoOq2CKPSMDXt+GX2u/9/1bpVxN9XeGTAJO+ZD++CLq0hyzTnIHy58nyw==} - engines: {node: '>= 16.0.0'} - peerDependencies: - '@parcel/core': ^2.15.4 + '@swc/counter@0.1.3': + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} + '@swc/types@0.1.21': + resolution: {integrity: sha512-2YEtj5HJVbKivud9N4bpPBAyZhj4S2Ipe5LkUG94alTpr7in/GU/EARgPAd3BwU+YOmFVJC2+kjqhGRi3r0ZpQ==} - '@playwright/test@1.49.1': - resolution: {integrity: sha512-Ky+BVzPz8pL6PQxHqNRW1k3mIyv933LML7HktS8uik0bUXNCdPhoS/kLihiO1tMf/egaJb4IutXd7UywvXEW+g==} + '@testing-library/dom@10.4.0': + resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==} engines: {node: '>=18'} - hasBin: true - '@remix-run/changelog-github@0.0.5': - resolution: {integrity: sha512-43tqwUqWqirbv6D9uzo55ASPsCJ61Ein1k/M8qn+Qpros0MmbmuzjLVPmtaxfxfe2ANX0LefLvCD0pAgr1tp4g==} + '@testing-library/jest-dom@6.6.3': + resolution: {integrity: sha512-IteBhl4XqYNkM54f4ejhLRJiZNqcSCoXUOG2CPK7qbD322KjQozM4kHQOfkG2oln9b9HTYqs+Sae8vBATubxxA==} + engines: {node: '>=14', npm: '>=6', yarn: '>=1'} - '@remix-run/node-fetch-server@0.8.1': - resolution: {integrity: sha512-J1dev372wtJqmqn9U/qbpbZxbJSQrogNN2+Qv1lKlpATpe/WQ9aCZfl/xSb9d2Rgh1IyLSvNxZAXPZxruO6Xig==} + '@testing-library/react@16.3.0': + resolution: {integrity: sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw==} + engines: {node: '>=18'} + peerDependencies: + '@testing-library/dom': ^10.0.0 + '@types/react': ^18.0.27 + '@types/react-dom': ^18.0.10 + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true - '@remix-run/node-fetch-server@0.9.0': - resolution: {integrity: sha512-SoLMv7dbH+njWzXnOY6fI08dFMI5+/dQ+vY3n8RnnbdG7MdJEgiP28Xj/xWlnRnED/aB6SFw56Zop+LbmaaKqA==} + '@testing-library/user-event@14.6.1': + resolution: {integrity: sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==} + engines: {node: '>=12', npm: '>=6'} + peerDependencies: + '@testing-library/dom': '>=7.21.4' - '@remix-run/web-blob@3.1.0': - resolution: {integrity: sha512-owGzFLbqPH9PlKb8KvpNJ0NO74HWE2euAn61eEiyCXX/oteoVzTVSN8mpLgDjaxBf2btj5/nUllSUgpyd6IH6g==} + '@tootallnate/once@2.0.0': + resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} + engines: {node: '>= 10'} - '@remix-run/web-fetch@4.4.2': - resolution: {integrity: sha512-jgKfzA713/4kAW/oZ4bC3MoLWyjModOVDjFPNseVqcJKSafgIscrYL9G50SurEYLswPuoU3HzSbO0jQCMYWHhA==} - engines: {node: ^10.17 || >=12.3} + '@tootallnate/quickjs-emscripten@0.23.0': + resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} - '@remix-run/web-file@3.1.0': - resolution: {integrity: sha512-dW2MNGwoiEYhlspOAXFBasmLeYshyAyhIdrlXBi06Duex5tDr3ut2LFKVj7tyHLmn8nnNwFf1BjNbkQpygC2aQ==} + '@tybys/wasm-util@0.9.0': + resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} - '@remix-run/web-form-data@3.1.0': - resolution: {integrity: sha512-NdeohLMdrb+pHxMQ/Geuzdp0eqPbea+Ieo8M8Jx2lGC6TBHsgHzYcBvr0LyPdPVycNRDEpWpiDdCOdCryo3f9A==} + '@types/acorn@4.0.6': + resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} - '@remix-run/web-stream@1.1.0': - resolution: {integrity: sha512-KRJtwrjRV5Bb+pM7zxcTJkhIqWWSy+MYsIxHK+0m5atcznsf15YwUBWHWulZerV2+vvHH1Lp1DD7pw6qKW8SgA==} + '@types/aria-query@5.0.4': + resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} - '@rolldown/binding-darwin-arm64@1.0.0-beta.7-commit.7452fa0': - resolution: {integrity: sha512-1ONRckAxd2vr6/e6KvC/m3bPFg1lzFzLd3rW5zaj7LvLhP20Fo6t+Mj7t8/N/ENR65jbMS4hXdTPRD3MvaNTjg==} - cpu: [arm64] - os: [darwin] + '@types/aws-lambda@8.10.141': + resolution: {integrity: sha512-SMWlRBukG9KV8ZNjwemp2AzDibp/czIAeKKTw09nCPbWxVskIxactCJCGOp4y6I1hCMY7T7UGfySvBLXNeUbEw==} - '@rolldown/binding-darwin-arm64@1.0.0-beta.7-commit.e117288': - resolution: {integrity: sha512-aq6Y9OQl05bYUnzM4a7ZGF3+Du7cdrw3Ala1eCnvNqxgi2ksXKN+LHvgeaWDlyfLgX0jVQFZre4+kzgLSHEMog==} - cpu: [arm64] - os: [darwin] + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} - '@rolldown/binding-darwin-x64@1.0.0-beta.7-commit.7452fa0': - resolution: {integrity: sha512-tA3K/yj2MDIKmpMjldEKkS/1k8o8MXIm+bMdLahZmFVRE7ODfQRe3aUaaxTm7wvHG8GKgE4DcqMJTwDeCqAt/g==} - cpu: [x64] - os: [darwin] + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} - '@rolldown/binding-darwin-x64@1.0.0-beta.7-commit.e117288': - resolution: {integrity: sha512-GRxENhaf92Blo7TZz8C8vBFSt4pCRWDP45ElGATItWqzyM+ILtzNjkE5Wj1OyWPe7y0oWxps6YMxVxEdb3/BJQ==} - cpu: [x64] - os: [darwin] + '@types/babel__template@7.4.1': + resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} - '@rolldown/binding-freebsd-x64@1.0.0-beta.7-commit.7452fa0': - resolution: {integrity: sha512-Ps9e395Gmv3nR+WmOLGnN23Qc5R7GZ619QMnrsZZnrNjqts4pf2DAGoPnTY/dCT/z+rfcN3ku35hWh3HsI9XGA==} - cpu: [x64] - os: [freebsd] + '@types/babel__traverse@7.20.7': + resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} - '@rolldown/binding-freebsd-x64@1.0.0-beta.7-commit.e117288': - resolution: {integrity: sha512-3uibg1KMHT7c149YupfXICxKoO6K7q3MaMpvOdxUjTY9mY3+v96eHTfnq+dd6qD16ppKSVij7FfpEC+sCVDRmg==} - cpu: [x64] - os: [freebsd] + '@types/body-parser@1.19.5': + resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.7-commit.7452fa0': - resolution: {integrity: sha512-/RKVSZGQyFpDWI2ksNV7/n2M1bbFvIoS4QvcETU+sMnDfhZQB6vP00dHMFsJS9J+y05XbsMnEgHslrLywFu4Ww==} - cpu: [arm] - os: [linux] + '@types/compression@1.8.1': + resolution: {integrity: sha512-kCFuWS0ebDbmxs0AXYn6e2r2nrGAb5KwQhknjSPSPgJcGd8+HVSILlUyFhGqML2gk39HcG7D1ydW9/qpYkN00Q==} - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.7-commit.e117288': - resolution: {integrity: sha512-oDFqE2fWx2sj0E9doRUmYxi5TKc9/vmD49NP0dUN578LQO8nJBwqOMvE8bM3a/T3or4g1mlJt2ebzGiKGzjHSw==} - cpu: [arm] - os: [linux] + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.7-commit.7452fa0': - resolution: {integrity: sha512-J6PeOqrX2QttacikU/CcIG2nlsnR9gDTcUQbwEbS1G/DaPrYEHXujiI4YY5Hmd+Sr1IYXI9i3z/RfzRI9XmcpQ==} - cpu: [arm64] - os: [linux] + '@types/cookie@0.6.0': + resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.7-commit.e117288': - resolution: {integrity: sha512-0Weogg1WiFNkmwznM4YS4AmDa55miGstb/I4zKquIsv1kSBLBkxboifgWTCPUnGFK7Wy1u/beRnxCY7UVL1oPw==} - cpu: [arm64] - os: [linux] + '@types/cookiejar@2.1.5': + resolution: {integrity: sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==} - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.7-commit.7452fa0': - resolution: {integrity: sha512-lMUOKYcdDxpZMvkMbznjkqikPnvo3UIpdEfzEMp2/rOlYyC/2p3Trg3kGjhF4lbfRLbbuPEjLepGf67ot0I8oQ==} - cpu: [arm64] - os: [linux] + '@types/cross-spawn@6.0.6': + resolution: {integrity: sha512-fXRhhUkG4H3TQk5dBhQ7m/JDdSNHKwR2BBia62lhwEIq9xGiQKLxd6LymNhn47SjXhsUEPmxi+PKw2OkW4LLjA==} - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.7-commit.e117288': - resolution: {integrity: sha512-LwEN10APipzjxAHSreVTEnUAHRz3sq4/UR3IVD/AguV0s6yAbVAsIrvIoxXHKoci+RUlyY5FXICYZQKli8iU5w==} - cpu: [arm64] - os: [linux] + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.7-commit.7452fa0': - resolution: {integrity: sha512-ydsgeyhu3/AvB+I1/+uQ1+PSEQRmftkvJ1ewoXB0oJTozAKN6Ywx8jnmV8jA1g/IuMDzepR6/ixF0hbyYinWWQ==} - cpu: [x64] - os: [linux] + '@types/dedent@0.7.2': + resolution: {integrity: sha512-kRiitIeUg1mPV9yH4VUJ/1uk2XjyANfeL8/7rH1tsjvHeO9PJLBHJIYsFWmAvmGj5u8rj+1TZx7PZzW2qLw3Lw==} - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.7-commit.e117288': - resolution: {integrity: sha512-tgE2J4BAQfI0rfoPzS4r1LEHSNxdNSM8l1Ab5InnzE4dXzVw92BVQ/FLFE6L+nWy81O7uwd7yz0Jo+qByOPCXg==} - cpu: [x64] - os: [linux] + '@types/eslint-scope@3.7.7': + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} - '@rolldown/binding-linux-x64-musl@1.0.0-beta.7-commit.7452fa0': - resolution: {integrity: sha512-prSpmuIoS6M1KLRd2Fzpz9n6K6K8g8/F5bN15iEpjRZCkCOI24+bVX6fDKbI0frstIMzFVvbGSxmHxt0pyphEA==} - cpu: [x64] - os: [linux] + '@types/eslint@9.6.1': + resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} - '@rolldown/binding-linux-x64-musl@1.0.0-beta.7-commit.e117288': - resolution: {integrity: sha512-m78svPie3D5PIBxmexztDVHjrnHO5t6h3Lwtl6sqdrio1zhGYMY9FcPcaZZ40mXXWKHFoPmbueBZZLdttvOEIQ==} - cpu: [x64] - os: [linux] + '@types/estree-jsx@1.0.5': + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} - '@rolldown/binding-wasm32-wasi@1.0.0-beta.7-commit.7452fa0': - resolution: {integrity: sha512-kRFr1jOfL4L627d1Bw/EPst3A2BwP+DV6CH/Myxl88DFzAeOAfQ04hFfCm8lBcRxzfrJNcFAMNrdIKgdUd7ddQ==} - engines: {node: '>=14.21.3'} - cpu: [wasm32] + '@types/estree@1.0.7': + resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} - '@rolldown/binding-wasm32-wasi@1.0.0-beta.7-commit.e117288': - resolution: {integrity: sha512-XbOcOWmdioNZ3hHBb5j96Y9S9pGyTeFZWR5ovMZggA9L7mWft2pMrbx4p5zUy2dCps3l1jaFQCjKuBXpwoCZug==} - engines: {node: '>=14.21.3'} - cpu: [wasm32] + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.7-commit.7452fa0': - resolution: {integrity: sha512-1l+vls3mjcKOxsrnwcwG1fX8/pL7URuZ+d+7WvKaXXIq3Id6HSdtCYuBwkUg3Bdm0mLDk7Qyv1QG3BwTcFahGQ==} - cpu: [arm64] - os: [win32] + '@types/express-serve-static-core@4.17.43': + resolution: {integrity: sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==} - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.7-commit.e117288': - resolution: {integrity: sha512-lnZ/wrat6UMWGbS9w5AUEH8WkPBA4EUSYp8cxlspdU16dISeD/KGpF2d0hS6Oa6ftbgZZrRLMEnQRiD8OupPsg==} - cpu: [arm64] - os: [win32] + '@types/express-serve-static-core@5.0.6': + resolution: {integrity: sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==} - '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.7-commit.7452fa0': - resolution: {integrity: sha512-YJxvaPtH4sl5reLZCvNuqFHCgdsIRGG77LET+xng9CEWGaA1Epx2qcbeAAX8czU82tYrorx5Taxioo3GqvF53w==} - cpu: [ia32] - os: [win32] + '@types/express@4.17.21': + resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} - '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.7-commit.e117288': - resolution: {integrity: sha512-F0N/6kAnCl9dOgqR09T60UjQSxKvRtlbImhiYxIdKBFxgYDDGsh8XzlSbMRUVQmMtNwKC8xi+i+SnamSqY6q8Q==} - cpu: [ia32] - os: [win32] + '@types/express@5.0.1': + resolution: {integrity: sha512-UZUw8vjpWFXuDnjFTh7/5c2TWDlQqeXHi6hcN7F2XSVT5P+WmUnnbFS3KA6Jnc6IsEqI2qCVu2bK0R0J4A8ZQQ==} - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.7-commit.7452fa0': - resolution: {integrity: sha512-OZok4v+44zYlSqo5pVyt5xPgruYcaPig9T0ieOh+O7f3BWqlkLI3ZFalznq2zFp4mJS7GtrqOAm6h7sgd+LTOw==} - cpu: [x64] - os: [win32] + '@types/glob@7.2.0': + resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.7-commit.e117288': - resolution: {integrity: sha512-T3qKMkSVemlVLLd5V7dCXnjt4Zda1UnUi45AQnmxIf3jH0/VP0J4aYAJiEEaRbhMoHc82j01+6MuZFZUVMeqng==} - cpu: [x64] - os: [win32] + '@types/glob@8.1.0': + resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} - '@rolldown/pluginutils@1.0.0-beta.11': - resolution: {integrity: sha512-L/gAA/hyCSuzTF1ftlzUSI/IKr2POHsv1Dd78GfqkR83KMNuswWD61JxGV2L7nRwBBBSDr6R1gCkdTmoN7W4ag==} + '@types/graceful-fs@4.1.6': + resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} - '@rollup/plugin-replace@6.0.2': - resolution: {integrity: sha512-7QaYCf8bqF04dOy7w/eHmJeNExxTYwvKAmlSAH/EaWWUzbT0h5sbF6bktFoX/0F/0qwng5/dWFMyf3gzaM8DsQ==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true + '@types/gunzip-maybe@1.4.2': + resolution: {integrity: sha512-2uqXZg1jTCKE1Pjbab8qb74+f2+i9h/jz8rQ+jRR+zaNJF75zWwrpbX8/TjF4m56m3KFOg9umHdCJ074KwiVxg==} - '@rollup/pluginutils@5.1.0': - resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} - '@rollup/rollup-android-arm-eabi@4.43.0': - resolution: {integrity: sha512-Krjy9awJl6rKbruhQDgivNbD1WuLb8xAclM4IR4cN5pHGAs2oIMMQJEiC3IC/9TZJ+QZkmZhlMO/6MBGxPidpw==} - cpu: [arm] - os: [android] + '@types/http-errors@2.0.4': + resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} - '@rollup/rollup-android-arm64@4.43.0': - resolution: {integrity: sha512-ss4YJwRt5I63454Rpj+mXCXicakdFmKnUNxr1dLK+5rv5FJgAxnN7s31a5VchRYxCFWdmnDWKd0wbAdTr0J5EA==} - cpu: [arm64] - os: [android] + '@types/is-ci@3.0.0': + resolution: {integrity: sha512-Q0Op0hdWbYd1iahB+IFNQcWXFq4O0Q5MwQP7uN0souuQ4rPg1vEYcnIOfr1gY+M+6rc8FGoRaBO1mOOvL29sEQ==} - '@rollup/rollup-darwin-arm64@4.43.0': - resolution: {integrity: sha512-eKoL8ykZ7zz8MjgBenEF2OoTNFAPFz1/lyJ5UmmFSz5jW+7XbH1+MAgCVHy72aG59rbuQLcJeiMrP8qP5d/N0A==} - cpu: [arm64] - os: [darwin] + '@types/istanbul-lib-coverage@2.0.4': + resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} - '@rollup/rollup-darwin-x64@4.43.0': - resolution: {integrity: sha512-SYwXJgaBYW33Wi/q4ubN+ldWC4DzQY62S4Ll2dgfr/dbPoF50dlQwEaEHSKrQdSjC6oIe1WgzosoaNoHCdNuMg==} - cpu: [x64] - os: [darwin] + '@types/istanbul-lib-report@3.0.0': + resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} - '@rollup/rollup-freebsd-arm64@4.43.0': - resolution: {integrity: sha512-SV+U5sSo0yujrjzBF7/YidieK2iF6E7MdF6EbYxNz94lA+R0wKl3SiixGyG/9Klab6uNBIqsN7j4Y/Fya7wAjQ==} - cpu: [arm64] - os: [freebsd] + '@types/istanbul-reports@3.0.1': + resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} - '@rollup/rollup-freebsd-x64@4.43.0': - resolution: {integrity: sha512-J7uCsiV13L/VOeHJBo5SjasKiGxJ0g+nQTrBkAsmQBIdil3KhPnSE9GnRon4ejX1XDdsmK/l30IYLiAaQEO0Cg==} - cpu: [x64] - os: [freebsd] + '@types/jest@29.5.12': + resolution: {integrity: sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==} - '@rollup/rollup-linux-arm-gnueabihf@4.43.0': - resolution: {integrity: sha512-gTJ/JnnjCMc15uwB10TTATBEhK9meBIY+gXP4s0sHD1zHOaIh4Dmy1X9wup18IiY9tTNk5gJc4yx9ctj/fjrIw==} - cpu: [arm] - os: [linux] + '@types/jsdom@20.0.1': + resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} - '@rollup/rollup-linux-arm-musleabihf@4.43.0': - resolution: {integrity: sha512-ZJ3gZynL1LDSIvRfz0qXtTNs56n5DI2Mq+WACWZ7yGHFUEirHBRt7fyIk0NsCKhmRhn7WAcjgSkSVVxKlPNFFw==} - cpu: [arm] - os: [linux] + '@types/jsdom@21.1.1': + resolution: {integrity: sha512-cZFuoVLtzKP3gmq9eNosUL1R50U+USkbLtUQ1bYVgl/lKp0FZM7Cq4aIHAL8oIvQ17uSHi7jXPtfDOdjPwBE7A==} - '@rollup/rollup-linux-arm64-gnu@4.43.0': - resolution: {integrity: sha512-8FnkipasmOOSSlfucGYEu58U8cxEdhziKjPD2FIa0ONVMxvl/hmONtX/7y4vGjdUhjcTHlKlDhw3H9t98fPvyA==} - cpu: [arm64] - os: [linux] + '@types/jsesc@3.0.3': + resolution: {integrity: sha512-YZZ9ZOAiiSVC6KApWd/fTCDTdTOOMiRU4Lq3/VSmXNPse8IvCVOn5kYRRLu900Ub1lTPurVZFI5unEqLDJR7wg==} - '@rollup/rollup-linux-arm64-musl@4.43.0': - resolution: {integrity: sha512-KPPyAdlcIZ6S9C3S2cndXDkV0Bb1OSMsX0Eelr2Bay4EsF9yi9u9uzc9RniK3mcUGCLhWY9oLr6er80P5DE6XA==} - cpu: [arm64] - os: [linux] + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@rollup/rollup-linux-loongarch64-gnu@4.43.0': - resolution: {integrity: sha512-HPGDIH0/ZzAZjvtlXj6g+KDQ9ZMHfSP553za7o2Odegb/BEfwJcR0Sw0RLNpQ9nC6Gy8s+3mSS9xjZ0n3rhcYg==} - cpu: [loong64] - os: [linux] + '@types/json5@0.0.29': + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - '@rollup/rollup-linux-powerpc64le-gnu@4.43.0': - resolution: {integrity: sha512-gEmwbOws4U4GLAJDhhtSPWPXUzDfMRedT3hFMyRAvM9Mrnj+dJIFIeL7otsv2WF3D7GrV0GIewW0y28dOYWkmw==} - cpu: [ppc64] - os: [linux] + '@types/lambda-tester@3.6.2': + resolution: {integrity: sha512-nQRUx0AuvTq5KOz1SaxMOOFJvnybo1oAzvSy/p9bVGthZVvg1Dar/051mhMuzdN1DWg++bs+eGq1MdCbm6wjSQ==} - '@rollup/rollup-linux-riscv64-gnu@4.43.0': - resolution: {integrity: sha512-XXKvo2e+wFtXZF/9xoWohHg+MuRnvO29TI5Hqe9xwN5uN8NKUYy7tXUG3EZAlfchufNCTHNGjEx7uN78KsBo0g==} - cpu: [riscv64] - os: [linux] + '@types/lodash@4.17.0': + resolution: {integrity: sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==} - '@rollup/rollup-linux-riscv64-musl@4.43.0': - resolution: {integrity: sha512-ruf3hPWhjw6uDFsOAzmbNIvlXFXlBQ4nk57Sec8E8rUxs/AI4HD6xmiiasOOx/3QxS2f5eQMKTAwk7KHwpzr/Q==} - cpu: [riscv64] - os: [linux] + '@types/mdast@3.0.15': + resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} - '@rollup/rollup-linux-s390x-gnu@4.43.0': - resolution: {integrity: sha512-QmNIAqDiEMEvFV15rsSnjoSmO0+eJLoKRD9EAa9rrYNwO/XRCtOGM3A5A0X+wmG+XRrw9Fxdsw+LnyYiZWWcVw==} - cpu: [s390x] - os: [linux] + '@types/mdast@4.0.3': + resolution: {integrity: sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==} - '@rollup/rollup-linux-x64-gnu@4.43.0': - resolution: {integrity: sha512-jAHr/S0iiBtFyzjhOkAics/2SrXE092qyqEg96e90L3t9Op8OTzS6+IX0Fy5wCt2+KqeHAkti+eitV0wvblEoQ==} - cpu: [x64] - os: [linux] + '@types/mdx@2.0.12': + resolution: {integrity: sha512-H9VZ9YqE+H28FQVchC83RCs5xQ2J7mAAv6qdDEaWmXEVl3OpdH+xfrSUzQ1lp7U7oSTRZ0RvW08ASPJsYBi7Cw==} - '@rollup/rollup-linux-x64-musl@4.43.0': - resolution: {integrity: sha512-3yATWgdeXyuHtBhrLt98w+5fKurdqvs8B53LaoKD7P7H7FKOONLsBVMNl9ghPQZQuYcceV5CDyPfyfGpMWD9mQ==} - cpu: [x64] - os: [linux] + '@types/methods@1.1.4': + resolution: {integrity: sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==} - '@rollup/rollup-win32-arm64-msvc@4.43.0': - resolution: {integrity: sha512-wVzXp2qDSCOpcBCT5WRWLmpJRIzv23valvcTwMHEobkjippNf+C3ys/+wf07poPkeNix0paTNemB2XrHr2TnGw==} - cpu: [arm64] - os: [win32] + '@types/mime@1.3.5': + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} - '@rollup/rollup-win32-ia32-msvc@4.43.0': - resolution: {integrity: sha512-fYCTEyzf8d+7diCw8b+asvWDCLMjsCEA8alvtAutqJOJp/wL5hs1rWSqJ1vkjgW0L2NB4bsYJrpKkiIPRR9dvw==} - cpu: [ia32] - os: [win32] + '@types/mime@3.0.4': + resolution: {integrity: sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw==} - '@rollup/rollup-win32-x64-msvc@4.43.0': - resolution: {integrity: sha512-SnGhLiE5rlK0ofq8kzuDkM0g7FN1s5VYY+YSMTibP7CqShxCQvqtNxTARS4xX4PFJfHjG0ZQYX9iGzI3FQh5Aw==} - cpu: [x64] - os: [win32] + '@types/minimatch@5.1.2': + resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} - '@rushstack/eslint-patch@1.10.1': - resolution: {integrity: sha512-S3Kq8e7LqxkA9s7HKLqXGTGck1uwis5vAXan3FnU5yw1Ec5hsSGnq4s/UCaSqABPOnOTg7zASLyst7+ohgWexg==} + '@types/minimist@1.2.2': + resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} - '@sec-ant/readable-stream@0.4.1': - resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + '@types/morgan@1.9.10': + resolution: {integrity: sha512-sS4A1zheMvsADRVfT0lYbJ4S9lmsey8Zo2F7cnbYjWHP67Q0AwMYuuzLlkIM2N8gAbb9cubhIVFwcIN2XyYCkA==} - '@shikijs/engine-oniguruma@3.8.1': - resolution: {integrity: sha512-KGQJZHlNY7c656qPFEQpIoqOuC4LrxjyNndRdzk5WKB/Ie87+NJCF1xo9KkOUxwxylk7rT6nhlZyTGTC4fCe1g==} + '@types/ms@0.7.34': + resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} - '@shikijs/langs@3.8.1': - resolution: {integrity: sha512-TjOFg2Wp1w07oKnXjs0AUMb4kJvujML+fJ1C5cmEj45lhjbUXtziT1x2bPQb9Db6kmPhkG5NI2tgYW1/DzhUuQ==} + '@types/node@12.20.55': + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@shikijs/themes@3.8.1': - resolution: {integrity: sha512-Vu3t3BBLifc0GB0UPg2Pox1naTemrrvyZv2lkiSw3QayVV60me1ujFQwPZGgUTmwXl1yhCPW8Lieesm0CYruLQ==} + '@types/node@20.11.30': + resolution: {integrity: sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==} - '@shikijs/types@3.8.1': - resolution: {integrity: sha512-5C39Q8/8r1I26suLh+5TPk1DTrbY/kn3IdWA5HdizR0FhlhD05zx5nKCqhzSfDHH3p4S0ZefxWd77DLV+8FhGg==} + '@types/node@22.14.0': + resolution: {integrity: sha512-Kmpl+z84ILoG+3T/zQFyAJsU6EPTmOCj8/2+83fSN6djd6I4o7uOuGIH6vq3PrjY5BGitSbFuMN18j3iknubbA==} - '@shikijs/vscode-textmate@10.0.2': - resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + '@types/normalize-package-data@2.4.1': + resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} - '@sideway/address@4.1.5': - resolution: {integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==} + '@types/npmcli__package-json@4.0.4': + resolution: {integrity: sha512-6QjlFUSHBmZJWuC08bz1ZCx6tm4t+7+OJXAdvM6tL2pI7n6Bh5SIp/YxQvnOLFf8MzCXs2ijyFgrzaiu1UFBGA==} - '@sideway/formula@3.0.1': - resolution: {integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==} + '@types/parse-json@4.0.2': + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} - '@sideway/pinpoint@2.0.0': - resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} + '@types/prop-types@15.7.5': + resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} - '@sinclair/typebox@0.27.8': - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + '@types/qs@6.9.14': + resolution: {integrity: sha512-5khscbd3SwWMhFqylJBLQ0zIu7c1K6Vz0uBIt915BI3zV0q1nfjRQD3RqSBcPaO6PHEF4ov/t9y89fSiyThlPA==} - '@sindresorhus/merge-streams@4.0.0': - resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} - engines: {node: '>=18'} + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} - '@sinonjs/commons@2.0.0': - resolution: {integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==} + '@types/react-dom@18.2.7': + resolution: {integrity: sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==} - '@sinonjs/fake-timers@10.0.2': - resolution: {integrity: sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==} + '@types/react-test-renderer@18.3.1': + resolution: {integrity: sha512-vAhnk0tG2eGa37lkU9+s5SoroCsRI08xnsWFiAXOuPH2jqzMbcXvKExXViPi1P5fIklDeCvXqyrdmipFaSkZrA==} - '@swc/core-darwin-arm64@1.11.24': - resolution: {integrity: sha512-dhtVj0PC1APOF4fl5qT2neGjRLgHAAYfiVP8poJelhzhB/318bO+QCFWAiimcDoyMgpCXOhTp757gnoJJrheWA==} - engines: {node: '>=10'} - cpu: [arm64] - os: [darwin] + '@types/react@18.2.18': + resolution: {integrity: sha512-da4NTSeBv/P34xoZPhtcLkmZuJ+oYaCxHmyHzwaDQo9RQPBeXV+06gEk2FpqEcsX9XrnNLvRpVh6bdavDSjtiQ==} - '@swc/core-darwin-x64@1.11.24': - resolution: {integrity: sha512-H/3cPs8uxcj2Fe3SoLlofN5JG6Ny5bl8DuZ6Yc2wr7gQFBmyBkbZEz+sPVgsID7IXuz7vTP95kMm1VL74SO5AQ==} - engines: {node: '>=10'} - cpu: [x64] - os: [darwin] + '@types/recursive-readdir@2.2.4': + resolution: {integrity: sha512-84REEGT3lcgopvpkmGApzmU5UEG0valme5rQS/KGiguTkJ70/Au8UYZTyrzoZnY9svuX9351+1uvrRPzWDD/uw==} - '@swc/core-linux-arm-gnueabihf@1.11.24': - resolution: {integrity: sha512-PHJgWEpCsLo/NGj+A2lXZ2mgGjsr96ULNW3+T3Bj2KTc8XtMUkE8tmY2Da20ItZOvPNC/69KroU7edyo1Flfbw==} - engines: {node: '>=10'} - cpu: [arm] - os: [linux] + '@types/scheduler@0.16.2': + resolution: {integrity: sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==} - '@swc/core-linux-arm64-gnu@1.11.24': - resolution: {integrity: sha512-C2FJb08+n5SD4CYWCTZx1uR88BN41ZieoHvI8A55hfVf2woT8+6ZiBzt74qW2g+ntZ535Jts5VwXAKdu41HpBg==} - engines: {node: '>=10'} - cpu: [arm64] - os: [linux] + '@types/semver@7.7.0': + resolution: {integrity: sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==} - '@swc/core-linux-arm64-musl@1.11.24': - resolution: {integrity: sha512-ypXLIdszRo0re7PNNaXN0+2lD454G8l9LPK/rbfRXnhLWDBPURxzKlLlU/YGd2zP98wPcVooMmegRSNOKfvErw==} - engines: {node: '>=10'} - cpu: [arm64] - os: [linux] + '@types/send@0.17.4': + resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} - '@swc/core-linux-x64-gnu@1.11.24': - resolution: {integrity: sha512-IM7d+STVZD48zxcgo69L0yYptfhaaE9cMZ+9OoMxirNafhKKXwoZuufol1+alEFKc+Wbwp+aUPe/DeWC/Lh3dg==} - engines: {node: '>=10'} - cpu: [x64] - os: [linux] + '@types/serve-static@1.15.5': + resolution: {integrity: sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==} - '@swc/core-linux-x64-musl@1.11.24': - resolution: {integrity: sha512-DZByJaMVzSfjQKKQn3cqSeqwy6lpMaQDQQ4HPlch9FWtDx/dLcpdIhxssqZXcR2rhaQVIaRQsCqwV6orSDGAGw==} - engines: {node: '>=10'} - cpu: [x64] - os: [linux] + '@types/set-cookie-parser@2.4.7': + resolution: {integrity: sha512-+ge/loa0oTozxip6zmhRIk8Z/boU51wl9Q6QdLZcokIGMzY5lFXYy/x7Htj2HTC6/KZP1hUbZ1ekx8DYXICvWg==} - '@swc/core-win32-arm64-msvc@1.11.24': - resolution: {integrity: sha512-Q64Ytn23y9aVDKN5iryFi8mRgyHw3/kyjTjT4qFCa8AEb5sGUuSj//AUZ6c0J7hQKMHlg9do5Etvoe61V98/JQ==} - engines: {node: '>=10'} - cpu: [arm64] - os: [win32] + '@types/shelljs@0.8.16': + resolution: {integrity: sha512-40SUXiH0tZfAg/oKkkGF1kdHPAmE4slv2xAmbfa8VtE6ztHYwdpW2phlzHTVdJh5JOGqA3Cx1Hzp7kxFalKHYA==} - '@swc/core-win32-ia32-msvc@1.11.24': - resolution: {integrity: sha512-9pKLIisE/Hh2vJhGIPvSoTK4uBSPxNVyXHmOrtdDot4E1FUUI74Vi8tFdlwNbaj8/vusVnb8xPXsxF1uB0VgiQ==} - engines: {node: '>=10'} - cpu: [ia32] - os: [win32] + '@types/source-map-support@0.5.10': + resolution: {integrity: sha512-tgVP2H469x9zq34Z0m/fgPewGhg/MLClalNOiPIzQlXrSS2YrKu/xCdSCKnEDwkFha51VKEKB6A9wW26/ZNwzA==} - '@swc/core-win32-x64-msvc@1.11.24': - resolution: {integrity: sha512-sybnXtOsdB+XvzVFlBVGgRHLqp3yRpHK7CrmpuDKszhj/QhmsaZzY/GHSeALlMtLup13M0gqbcQvsTNlAHTg3w==} - engines: {node: '>=10'} - cpu: [x64] - os: [win32] + '@types/stack-utils@2.0.1': + resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} - '@swc/core@1.11.24': - resolution: {integrity: sha512-MaQEIpfcEMzx3VWWopbofKJvaraqmL6HbLlw2bFZ7qYqYw3rkhM0cQVEgyzbHtTWwCwPMFZSC2DUbhlZgrMfLg==} - engines: {node: '>=10'} - peerDependencies: - '@swc/helpers': '>=0.5.17' - peerDependenciesMeta: - '@swc/helpers': - optional: true + '@types/statuses@2.0.5': + resolution: {integrity: sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==} - '@swc/counter@0.1.3': - resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + '@types/superagent@8.1.6': + resolution: {integrity: sha512-yzBOv+6meEHSzV2NThYYOA6RtqvPr3Hbob9ZLp3i07SH27CrYVfm8CrF7ydTmidtelsFiKx2I4gZAiAOamGgvQ==} - '@swc/helpers@0.5.15': - resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + '@types/supertest@2.0.16': + resolution: {integrity: sha512-6c2ogktZ06tr2ENoZivgm7YnprnhYE4ZoXGMY+oA7IuAf17M8FWvujXZGmxLv8y0PTyts4x5A+erSwVUFA8XSg==} - '@swc/types@0.1.21': - resolution: {integrity: sha512-2YEtj5HJVbKivud9N4bpPBAyZhj4S2Ipe5LkUG94alTpr7in/GU/EARgPAd3BwU+YOmFVJC2+kjqhGRi3r0ZpQ==} + '@types/tar-fs@2.0.4': + resolution: {integrity: sha512-ipPec0CjTmVDWE+QKr9cTmIIoTl7dFG/yARCM5MqK8i6CNLIG1P8x4kwDsOQY1ChZOZjH0wO9nvfgBvWl4R3kA==} - '@testing-library/dom@10.4.0': - resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==} - engines: {node: '>=18'} + '@types/tar-stream@3.1.3': + resolution: {integrity: sha512-Zbnx4wpkWBMBSu5CytMbrT5ZpMiF55qgM+EpHzR4yIDu7mv52cej8hTkOc6K+LzpkOAbxwn/m7j3iO+/l42YkQ==} - '@testing-library/jest-dom@6.6.3': - resolution: {integrity: sha512-IteBhl4XqYNkM54f4ejhLRJiZNqcSCoXUOG2CPK7qbD322KjQozM4kHQOfkG2oln9b9HTYqs+Sae8vBATubxxA==} - engines: {node: '>=14', npm: '>=6', yarn: '>=1'} + '@types/tough-cookie@4.0.5': + resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} - '@testing-library/react@16.3.0': - resolution: {integrity: sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw==} - engines: {node: '>=18'} + '@types/unist@2.0.10': + resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} + + '@types/unist@3.0.2': + resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} + + '@types/wait-on@5.3.4': + resolution: {integrity: sha512-EBsPjFMrFlMbbUFf9D1Fp+PAB2TwmUn7a3YtHyD9RLuTIk1jDd8SxXVAoez2Ciy+8Jsceo2MYEYZzJ/DvorOKw==} + + '@types/yargs-parser@21.0.0': + resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} + + '@types/yargs@17.0.24': + resolution: {integrity: sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==} + + '@typescript-eslint/eslint-plugin@5.62.0': + resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: - '@testing-library/dom': ^10.0.0 - '@types/react': ^18.2.18 - '@types/react-dom': ^18.2.7 - react: ^18.0.0 || ^19.0.0 - react-dom: ^18.0.0 || ^19.0.0 + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' peerDependenciesMeta: - '@types/react': + typescript: optional: true - '@types/react-dom': + + '@typescript-eslint/eslint-plugin@7.5.0': + resolution: {integrity: sha512-HpqNTH8Du34nLxbKgVMGljZMG0rJd2O9ecvr2QLYp+7512ty1j42KnsFwspPXg1Vh8an9YImf6CokUBltisZFQ==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + '@typescript-eslint/parser': ^7.0.0 + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: optional: true - '@testing-library/user-event@14.6.1': - resolution: {integrity: sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==} - engines: {node: '>=12', npm: '>=6'} + '@typescript-eslint/experimental-utils@5.62.0': + resolution: {integrity: sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: - '@testing-library/dom': '>=7.21.4' + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - '@tootallnate/once@2.0.0': - resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} - engines: {node: '>= 10'} + '@typescript-eslint/parser@5.62.0': + resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true - '@tootallnate/quickjs-emscripten@0.23.0': - resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} + '@typescript-eslint/parser@7.5.0': + resolution: {integrity: sha512-cj+XGhNujfD2/wzR1tabNsidnYRaFfEkcULdcIyVBYcXjBvBKOes+mpMBP7hMpOyk+gBcfXsrg4NBGAStQyxjQ==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true - '@tybys/wasm-util@0.9.0': - resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} + '@typescript-eslint/scope-manager@5.62.0': + resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@types/acorn@4.0.6': - resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} + '@typescript-eslint/scope-manager@7.5.0': + resolution: {integrity: sha512-Z1r7uJY0MDeUlql9XJ6kRVgk/sP11sr3HKXn268HZyqL7i4cEfrdFuSSY/0tUqT37l5zT0tJOsuDP16kio85iA==} + engines: {node: ^18.18.0 || >=20.0.0} - '@types/aria-query@5.0.4': - resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + '@typescript-eslint/type-utils@5.62.0': + resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true - '@types/aws-lambda@8.10.141': - resolution: {integrity: sha512-SMWlRBukG9KV8ZNjwemp2AzDibp/czIAeKKTw09nCPbWxVskIxactCJCGOp4y6I1hCMY7T7UGfySvBLXNeUbEw==} + '@typescript-eslint/type-utils@7.5.0': + resolution: {integrity: sha512-A021Rj33+G8mx2Dqh0nMO9GyjjIBK3MqgVgZ2qlKf6CJy51wY/lkkFqq3TqqnH34XyAHUkq27IjlUkWlQRpLHw==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true - '@types/babel__core@7.20.5': - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + '@typescript-eslint/types@5.62.0': + resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@types/babel__generator@7.27.0': - resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + '@typescript-eslint/types@7.5.0': + resolution: {integrity: sha512-tv5B4IHeAdhR7uS4+bf8Ov3k793VEVHd45viRRkehIUZxm0WF82VPiLgHzA/Xl4TGPg1ZD49vfxBKFPecD5/mg==} + engines: {node: ^18.18.0 || >=20.0.0} - '@types/babel__template@7.4.1': - resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} + '@typescript-eslint/types@8.36.0': + resolution: {integrity: sha512-xGms6l5cTJKQPZOKM75Dl9yBfNdGeLRsIyufewnxT4vZTrjC0ImQT4fj8QmtJK84F58uSh5HVBSANwcfiXxABQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@types/babel__traverse@7.20.7': - resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} + '@typescript-eslint/typescript-estree@5.62.0': + 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 - '@types/body-parser@1.19.5': - resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + '@typescript-eslint/typescript-estree@7.5.0': + resolution: {integrity: sha512-YklQQfe0Rv2PZEueLTUffiQGKQneiIEKKnfIqPIOxgM9lKSZFCjT5Ad4VqRKj/U4+kQE3fa8YQpskViL7WjdPQ==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true - '@types/compression@1.7.5': - resolution: {integrity: sha512-AAQvK5pxMpaT+nDvhHrsBhLSYG5yQdtkaJE1WYieSNY2mVFKAgmU4ks65rkZD5oqnGCFLyQpUr1CqI4DmUMyDg==} + '@typescript-eslint/utils@5.62.0': + resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + '@typescript-eslint/utils@7.5.0': + resolution: {integrity: sha512-3vZl9u0R+/FLQcpy2EHyRGNqAS/ofJ3Ji8aebilfJe+fobK8+LbIFmrHciLVDxjDoONmufDcnVSF38KwMEOjzw==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 - '@types/cookie@0.6.0': - resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} + '@typescript-eslint/visitor-keys@5.62.0': + resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@types/cookiejar@2.1.5': - resolution: {integrity: sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==} + '@typescript-eslint/visitor-keys@7.5.0': + resolution: {integrity: sha512-mcuHM/QircmA6O7fy6nn2w/3ditQkj+SgtOc8DW3uQ10Yfj42amm2i+6F2K4YAOPNNTmE6iM1ynM6lrSwdendA==} + engines: {node: ^18.18.0 || >=20.0.0} - '@types/cross-spawn@6.0.6': - resolution: {integrity: sha512-fXRhhUkG4H3TQk5dBhQ7m/JDdSNHKwR2BBia62lhwEIq9xGiQKLxd6LymNhn47SjXhsUEPmxi+PKw2OkW4LLjA==} + '@ungap/structured-clone@1.2.0': + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - '@types/debug@4.1.12': - resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + '@valibot/to-json-schema@1.0.0': + resolution: {integrity: sha512-/9crJgPptVsGCL6X+JPDQyaJwkalSZ/52WuF8DiRUxJgcmpNdzYRfZ+gqMEP8W3CTVfuMWPqqvIgfwJ97f9Etw==} + peerDependencies: + valibot: ^1.0.0 - '@types/dedent@0.7.2': - resolution: {integrity: sha512-kRiitIeUg1mPV9yH4VUJ/1uk2XjyANfeL8/7rH1tsjvHeO9PJLBHJIYsFWmAvmGj5u8rj+1TZx7PZzW2qLw3Lw==} + '@vanilla-extract/babel-plugin-debug-ids@1.2.2': + resolution: {integrity: sha512-MeDWGICAF9zA/OZLOKwhoRlsUW+fiMwnfuOAqFVohL31Agj7Q/RBWAYweqjHLgFBCsdnr6XIfwjJnmb2znEWxw==} - '@types/estree-jsx@1.0.5': - resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + '@vanilla-extract/compiler@0.3.1': + resolution: {integrity: sha512-KZ67DZQu58dMo7Jv4PNMPG5TbMOXB68xxVYV2cRJvUdPeiOmX0FOaPgEsYBAZUgd/oLEx4IyV0AvlvsxJ1akfQ==} - '@types/estree@1.0.7': - resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + '@vanilla-extract/css@1.17.4': + resolution: {integrity: sha512-m3g9nQDWPtL+sTFdtCGRMI1Vrp86Ay4PBYq1Bo7Bnchj5ElNtAJpOqD+zg+apthVA4fB7oVpMWNjwpa6ElDWFQ==} - '@types/estree@1.0.8': - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@vanilla-extract/integration@8.0.4': + resolution: {integrity: sha512-cmOb7tR+g3ulKvFtSbmdw3YUyIS1d7MQqN+FcbwNhdieyno5xzUyfDCMjeWJhmCSMvZ6WlinkrOkgs6SHB+FRg==} - '@types/express-serve-static-core@4.17.43': - resolution: {integrity: sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==} + '@vanilla-extract/private@1.0.9': + resolution: {integrity: sha512-gT2jbfZuaaCLrAxwXbRgIhGhcXbRZCG3v4TTUnjw0EJ7ArdBRxkq4msNJkbuRkCgfIK5ATmprB5t9ljvLeFDEA==} - '@types/express-serve-static-core@5.0.6': - resolution: {integrity: sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==} + '@vanilla-extract/vite-plugin@5.1.1': + resolution: {integrity: sha512-Nd1worqkHrd8XED4ZAA7Wmkd3pCqCwpmzCBVF8v6T1BSLHGXQE5HYflVgygw0CsIAbFRMS6zQBIk4F4/r/YKIw==} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 - '@types/express@4.17.21': - resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + '@vitejs/plugin-react@4.5.2': + resolution: {integrity: sha512-QNVT3/Lxx99nMQWJWF7K4N6apUEuT0KlZA3mx/mVaoGj3smm/8rc8ezz15J1pcbcjDK0V15rpHetVfya08r76Q==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0 - '@types/express@5.0.1': - resolution: {integrity: sha512-UZUw8vjpWFXuDnjFTh7/5c2TWDlQqeXHi6hcN7F2XSVT5P+WmUnnbFS3KA6Jnc6IsEqI2qCVu2bK0R0J4A8ZQQ==} + '@vitejs/plugin-rsc@0.5.7': + resolution: {integrity: sha512-TJBMbpBqSVkRGyNNKW/bxX71XX3bJ/aQAvMP/U50C+zpxDyv71Fr5I6GgCJhyf3QHikRb8YFDqWoR0ghqeg5Lw==} + peerDependencies: + react: '*' + react-dom: '*' + react-server-dom-webpack: '*' + vite: '*' + peerDependenciesMeta: + react-server-dom-webpack: + optional: true - '@types/glob@7.2.0': - resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} + '@web3-storage/multipart-parser@1.0.0': + resolution: {integrity: sha512-BEO6al7BYqcnfX15W2cnGR+Q566ACXAT9UQykORCWW80lmkpWsnEob6zJS1ZVBKsSJC8+7vJkHwlp+lXG1UCdw==} - '@types/glob@8.1.0': - resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} + '@webassemblyjs/ast@1.14.1': + resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} - '@types/graceful-fs@4.1.6': - resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} + '@webassemblyjs/floating-point-hex-parser@1.13.2': + resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} - '@types/gunzip-maybe@1.4.2': - resolution: {integrity: sha512-2uqXZg1jTCKE1Pjbab8qb74+f2+i9h/jz8rQ+jRR+zaNJF75zWwrpbX8/TjF4m56m3KFOg9umHdCJ074KwiVxg==} + '@webassemblyjs/helper-api-error@1.13.2': + resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} - '@types/hast@3.0.4': - resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + '@webassemblyjs/helper-buffer@1.14.1': + resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} - '@types/http-errors@2.0.4': - resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + '@webassemblyjs/helper-numbers@1.13.2': + resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} - '@types/is-ci@3.0.0': - resolution: {integrity: sha512-Q0Op0hdWbYd1iahB+IFNQcWXFq4O0Q5MwQP7uN0souuQ4rPg1vEYcnIOfr1gY+M+6rc8FGoRaBO1mOOvL29sEQ==} + '@webassemblyjs/helper-wasm-bytecode@1.13.2': + resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==} - '@types/istanbul-lib-coverage@2.0.4': - resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} + '@webassemblyjs/helper-wasm-section@1.14.1': + resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==} - '@types/istanbul-lib-report@3.0.0': - resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} + '@webassemblyjs/ieee754@1.13.2': + resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==} - '@types/istanbul-reports@3.0.1': - resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} + '@webassemblyjs/leb128@1.13.2': + resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==} - '@types/jest@29.5.12': - resolution: {integrity: sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==} + '@webassemblyjs/utf8@1.13.2': + resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==} - '@types/jsdom@20.0.1': - resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} + '@webassemblyjs/wasm-edit@1.14.1': + resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==} - '@types/jsdom@21.1.1': - resolution: {integrity: sha512-cZFuoVLtzKP3gmq9eNosUL1R50U+USkbLtUQ1bYVgl/lKp0FZM7Cq4aIHAL8oIvQ17uSHi7jXPtfDOdjPwBE7A==} + '@webassemblyjs/wasm-gen@1.14.1': + resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==} - '@types/jsesc@3.0.3': - resolution: {integrity: sha512-YZZ9ZOAiiSVC6KApWd/fTCDTdTOOMiRU4Lq3/VSmXNPse8IvCVOn5kYRRLu900Ub1lTPurVZFI5unEqLDJR7wg==} + '@webassemblyjs/wasm-opt@1.14.1': + resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==} - '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@webassemblyjs/wasm-parser@1.14.1': + resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==} - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + '@webassemblyjs/wast-printer@1.14.1': + resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} - '@types/lambda-tester@3.6.2': - resolution: {integrity: sha512-nQRUx0AuvTq5KOz1SaxMOOFJvnybo1oAzvSy/p9bVGthZVvg1Dar/051mhMuzdN1DWg++bs+eGq1MdCbm6wjSQ==} + '@xtuc/ieee754@1.2.0': + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} - '@types/lodash@4.17.0': - resolution: {integrity: sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==} + '@xtuc/long@4.2.2': + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - '@types/mdast@3.0.15': - resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} + '@zxing/text-encoding@0.9.0': + resolution: {integrity: sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==} - '@types/mdast@4.0.3': - resolution: {integrity: sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==} + abab@2.0.6: + resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} + deprecated: Use your platform's native atob() and btoa() methods instead - '@types/mdx@2.0.12': - resolution: {integrity: sha512-H9VZ9YqE+H28FQVchC83RCs5xQ2J7mAAv6qdDEaWmXEVl3OpdH+xfrSUzQ1lp7U7oSTRZ0RvW08ASPJsYBi7Cw==} + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} - '@types/methods@1.1.4': - resolution: {integrity: sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==} + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} - '@types/mime@1.3.5': - resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + acorn-import-phases@1.0.4: + resolution: {integrity: sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==} + engines: {node: '>=10.13.0'} + peerDependencies: + acorn: ^8.14.0 - '@types/mime@3.0.4': - resolution: {integrity: sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw==} + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - '@types/minimatch@5.1.2': - resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + acorn-loose@8.5.2: + resolution: {integrity: sha512-PPvV6g8UGMGgjrMu+n/f9E/tCSkNQ2Y97eFvuVdJfG11+xdIeDcLyNdC8SHcrHbRqkfwLASdplyR6B6sKM1U4A==} + engines: {node: '>=0.4.0'} - '@types/minimist@1.2.2': - resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} + acorn-walk@8.3.2: + resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + engines: {node: '>=0.4.0'} - '@types/morgan@1.9.9': - resolution: {integrity: sha512-iRYSDKVaC6FkGSpEVVIvrRGw0DfJMiQzIn3qr2G5B3C//AWkulhXgaBd7tS9/J79GWSYMTHGs7PfI5b3Y8m+RQ==} + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true - '@types/ms@0.7.34': - resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} - '@types/node@20.11.30': - resolution: {integrity: sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==} + agent-base@7.1.1: + resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} + engines: {node: '>= 14'} - '@types/node@22.14.0': - resolution: {integrity: sha512-Kmpl+z84ILoG+3T/zQFyAJsU6EPTmOCj8/2+83fSN6djd6I4o7uOuGIH6vq3PrjY5BGitSbFuMN18j3iknubbA==} + ajv-formats@2.1.1: + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true - '@types/normalize-package-data@2.4.1': - resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} + ajv-keywords@5.1.0: + resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + peerDependencies: + ajv: ^8.8.2 - '@types/npmcli__package-json@4.0.4': - resolution: {integrity: sha512-6QjlFUSHBmZJWuC08bz1ZCx6tm4t+7+OJXAdvM6tL2pI7n6Bh5SIp/YxQvnOLFf8MzCXs2ijyFgrzaiu1UFBGA==} + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - '@types/parcel-env@0.0.8': - resolution: {integrity: sha512-6Sa7yWgEPn6jxv1A4AdEMUTAth909LMjJhMfQOp3icwA3fVHZo1wPY+tQTWE/tZvomSa2M82V05pdk1CW8T7Xw==} + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} - '@types/parse-json@4.0.2': - resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} - '@types/prop-types@15.7.5': - resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} - '@types/qs@6.9.14': - resolution: {integrity: sha512-5khscbd3SwWMhFqylJBLQ0zIu7c1K6Vz0uBIt915BI3zV0q1nfjRQD3RqSBcPaO6PHEF4ov/t9y89fSiyThlPA==} + ansi-escapes@5.0.0: + resolution: {integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==} + engines: {node: '>=12'} - '@types/range-parser@1.2.7': - resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} - '@types/react-dom@18.2.7': - resolution: {integrity: sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==} + ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} - '@types/react-test-renderer@18.3.1': - resolution: {integrity: sha512-vAhnk0tG2eGa37lkU9+s5SoroCsRI08xnsWFiAXOuPH2jqzMbcXvKExXViPi1P5fIklDeCvXqyrdmipFaSkZrA==} + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} - '@types/react@18.2.18': - resolution: {integrity: sha512-da4NTSeBv/P34xoZPhtcLkmZuJ+oYaCxHmyHzwaDQo9RQPBeXV+06gEk2FpqEcsX9XrnNLvRpVh6bdavDSjtiQ==} + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} - '@types/recursive-readdir@2.2.4': - resolution: {integrity: sha512-84REEGT3lcgopvpkmGApzmU5UEG0valme5rQS/KGiguTkJ70/Au8UYZTyrzoZnY9svuX9351+1uvrRPzWDD/uw==} + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} - '@types/scheduler@0.16.2': - resolution: {integrity: sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==} + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} - '@types/semver@7.7.0': - resolution: {integrity: sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==} + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - '@types/send@0.17.4': - resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} - '@types/serve-static@1.15.5': - resolution: {integrity: sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==} + app-root-path@3.1.0: + resolution: {integrity: sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==} + engines: {node: '>= 6.0.0'} - '@types/set-cookie-parser@2.4.7': - resolution: {integrity: sha512-+ge/loa0oTozxip6zmhRIk8Z/boU51wl9Q6QdLZcokIGMzY5lFXYy/x7Htj2HTC6/KZP1hUbZ1ekx8DYXICvWg==} + are-docs-informative@0.0.2: + resolution: {integrity: sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==} + engines: {node: '>=14'} - '@types/shelljs@0.8.16': - resolution: {integrity: sha512-40SUXiH0tZfAg/oKkkGF1kdHPAmE4slv2xAmbfa8VtE6ztHYwdpW2phlzHTVdJh5JOGqA3Cx1Hzp7kxFalKHYA==} + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} - '@types/source-map-support@0.5.10': - resolution: {integrity: sha512-tgVP2H469x9zq34Z0m/fgPewGhg/MLClalNOiPIzQlXrSS2YrKu/xCdSCKnEDwkFha51VKEKB6A9wW26/ZNwzA==} + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - '@types/stack-utils@2.0.1': - resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - '@types/statuses@2.0.5': - resolution: {integrity: sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==} + aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} - '@types/superagent@8.1.6': - resolution: {integrity: sha512-yzBOv+6meEHSzV2NThYYOA6RtqvPr3Hbob9ZLp3i07SH27CrYVfm8CrF7ydTmidtelsFiKx2I4gZAiAOamGgvQ==} + array-buffer-byte-length@1.0.1: + resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + engines: {node: '>= 0.4'} - '@types/supertest@2.0.16': - resolution: {integrity: sha512-6c2ogktZ06tr2ENoZivgm7YnprnhYE4ZoXGMY+oA7IuAf17M8FWvujXZGmxLv8y0PTyts4x5A+erSwVUFA8XSg==} + array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - '@types/tar-fs@2.0.4': - resolution: {integrity: sha512-ipPec0CjTmVDWE+QKr9cTmIIoTl7dFG/yARCM5MqK8i6CNLIG1P8x4kwDsOQY1ChZOZjH0wO9nvfgBvWl4R3kA==} + array-includes@3.1.8: + resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} + engines: {node: '>= 0.4'} - '@types/tar-stream@3.1.3': - resolution: {integrity: sha512-Zbnx4wpkWBMBSu5CytMbrT5ZpMiF55qgM+EpHzR4yIDu7mv52cej8hTkOc6K+LzpkOAbxwn/m7j3iO+/l42YkQ==} + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} - '@types/tough-cookie@4.0.5': - resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} + array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} - '@types/unist@2.0.10': - resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} + array.prototype.findlastindex@1.2.5: + resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} + engines: {node: '>= 0.4'} - '@types/unist@3.0.2': - resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} + array.prototype.flat@1.3.2: + resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + engines: {node: '>= 0.4'} - '@types/wait-on@5.3.4': - resolution: {integrity: sha512-EBsPjFMrFlMbbUFf9D1Fp+PAB2TwmUn7a3YtHyD9RLuTIk1jDd8SxXVAoez2Ciy+8Jsceo2MYEYZzJ/DvorOKw==} + array.prototype.flatmap@1.3.2: + resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + engines: {node: '>= 0.4'} - '@types/yargs-parser@21.0.0': - resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} + array.prototype.toreversed@1.1.2: + resolution: {integrity: sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==} - '@types/yargs@17.0.24': - resolution: {integrity: sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==} + array.prototype.tosorted@1.1.3: + resolution: {integrity: sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==} - '@typescript-eslint/eslint-plugin@5.62.0': - resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + arraybuffer.prototype.slice@1.0.3: + resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} + engines: {node: '>= 0.4'} - '@typescript-eslint/eslint-plugin@7.5.0': - resolution: {integrity: sha512-HpqNTH8Du34nLxbKgVMGljZMG0rJd2O9ecvr2QLYp+7512ty1j42KnsFwspPXg1Vh8an9YImf6CokUBltisZFQ==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - '@typescript-eslint/parser': ^7.0.0 - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} - '@typescript-eslint/experimental-utils@5.62.0': - resolution: {integrity: sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + as-table@1.0.55: + resolution: {integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==} - '@typescript-eslint/parser@5.62.0': - resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} - '@typescript-eslint/parser@7.5.0': - resolution: {integrity: sha512-cj+XGhNujfD2/wzR1tabNsidnYRaFfEkcULdcIyVBYcXjBvBKOes+mpMBP7hMpOyk+gBcfXsrg4NBGAStQyxjQ==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + ast-types-flow@0.0.8: + resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} - '@typescript-eslint/scope-manager@5.62.0': - resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + ast-types@0.13.4: + resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} + engines: {node: '>=4'} - '@typescript-eslint/scope-manager@7.5.0': - resolution: {integrity: sha512-Z1r7uJY0MDeUlql9XJ6kRVgk/sP11sr3HKXn268HZyqL7i4cEfrdFuSSY/0tUqT37l5zT0tJOsuDP16kio85iA==} - engines: {node: ^18.18.0 || >=20.0.0} + astring@1.8.6: + resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==} + hasBin: true - '@typescript-eslint/type-utils@5.62.0': - resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '*' - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - '@typescript-eslint/type-utils@7.5.0': - resolution: {integrity: sha512-A021Rj33+G8mx2Dqh0nMO9GyjjIBK3MqgVgZ2qlKf6CJy51wY/lkkFqq3TqqnH34XyAHUkq27IjlUkWlQRpLHw==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} - '@typescript-eslint/types@5.62.0': - resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + axe-core@4.7.0: + resolution: {integrity: sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==} + engines: {node: '>=4'} - '@typescript-eslint/types@7.5.0': - resolution: {integrity: sha512-tv5B4IHeAdhR7uS4+bf8Ov3k793VEVHd45viRRkehIUZxm0WF82VPiLgHzA/Xl4TGPg1ZD49vfxBKFPecD5/mg==} - engines: {node: ^18.18.0 || >=20.0.0} + axios@1.6.8: + resolution: {integrity: sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==} - '@typescript-eslint/types@8.36.0': - resolution: {integrity: sha512-xGms6l5cTJKQPZOKM75Dl9yBfNdGeLRsIyufewnxT4vZTrjC0ImQT4fj8QmtJK84F58uSh5HVBSANwcfiXxABQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + axobject-query@3.2.1: + resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} - '@typescript-eslint/typescript-estree@5.62.0': - 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 + babel-dead-code-elimination@1.0.10: + resolution: {integrity: sha512-DV5bdJZTzZ0zn0DC24v3jD7Mnidh6xhKa4GfKCbq3sfW8kaWhDdZjP3i81geA8T33tdYqWKw4D3fVv0CwEgKVA==} - '@typescript-eslint/typescript-estree@7.5.0': - resolution: {integrity: sha512-YklQQfe0Rv2PZEueLTUffiQGKQneiIEKKnfIqPIOxgM9lKSZFCjT5Ad4VqRKj/U4+kQE3fa8YQpskViL7WjdPQ==} - engines: {node: ^18.18.0 || >=20.0.0} + babel-jest@29.7.0: + resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@babel/core': ^7.8.0 - '@typescript-eslint/utils@5.62.0': - resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + babel-plugin-dev-expression@0.2.3: + resolution: {integrity: sha512-rP5LK9QQTzCW61nVVzw88En1oK8t8gTsIeC6E61oelxNsU842yMjF0G1MxhvUpCkxCEIj7sE8/e5ieTheT//uw==} peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + '@babel/core': ^7.0.0 - '@typescript-eslint/utils@7.5.0': - resolution: {integrity: sha512-3vZl9u0R+/FLQcpy2EHyRGNqAS/ofJ3Ji8aebilfJe+fobK8+LbIFmrHciLVDxjDoONmufDcnVSF38KwMEOjzw==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 + babel-plugin-istanbul@6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} - '@typescript-eslint/visitor-keys@5.62.0': - resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + babel-plugin-jest-hoist@29.6.3: + resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@typescript-eslint/visitor-keys@7.5.0': - resolution: {integrity: sha512-mcuHM/QircmA6O7fy6nn2w/3ditQkj+SgtOc8DW3uQ10Yfj42amm2i+6F2K4YAOPNNTmE6iM1ynM6lrSwdendA==} - engines: {node: ^18.18.0 || >=20.0.0} + babel-plugin-macros@3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} - '@ungap/structured-clone@1.2.0': - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + babel-plugin-polyfill-corejs2@0.3.3: + resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@valibot/to-json-schema@1.0.0': - resolution: {integrity: sha512-/9crJgPptVsGCL6X+JPDQyaJwkalSZ/52WuF8DiRUxJgcmpNdzYRfZ+gqMEP8W3CTVfuMWPqqvIgfwJ97f9Etw==} + babel-plugin-polyfill-corejs2@0.4.14: + resolution: {integrity: sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==} peerDependencies: - valibot: ^1.0.0 + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - '@vanilla-extract/babel-plugin-debug-ids@1.2.2': - resolution: {integrity: sha512-MeDWGICAF9zA/OZLOKwhoRlsUW+fiMwnfuOAqFVohL31Agj7Q/RBWAYweqjHLgFBCsdnr6XIfwjJnmb2znEWxw==} + babel-plugin-polyfill-corejs3@0.11.1: + resolution: {integrity: sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - '@vanilla-extract/compiler@0.3.1': - resolution: {integrity: sha512-KZ67DZQu58dMo7Jv4PNMPG5TbMOXB68xxVYV2cRJvUdPeiOmX0FOaPgEsYBAZUgd/oLEx4IyV0AvlvsxJ1akfQ==} + babel-plugin-polyfill-corejs3@0.5.3: + resolution: {integrity: sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw==} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@vanilla-extract/css@1.17.4': - resolution: {integrity: sha512-m3g9nQDWPtL+sTFdtCGRMI1Vrp86Ay4PBYq1Bo7Bnchj5ElNtAJpOqD+zg+apthVA4fB7oVpMWNjwpa6ElDWFQ==} + babel-plugin-polyfill-regenerator@0.4.1: + resolution: {integrity: sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@vanilla-extract/integration@8.0.4': - resolution: {integrity: sha512-cmOb7tR+g3ulKvFtSbmdw3YUyIS1d7MQqN+FcbwNhdieyno5xzUyfDCMjeWJhmCSMvZ6WlinkrOkgs6SHB+FRg==} + babel-plugin-polyfill-regenerator@0.6.5: + resolution: {integrity: sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - '@vanilla-extract/private@1.0.9': - resolution: {integrity: sha512-gT2jbfZuaaCLrAxwXbRgIhGhcXbRZCG3v4TTUnjw0EJ7ArdBRxkq4msNJkbuRkCgfIK5ATmprB5t9ljvLeFDEA==} + babel-plugin-transform-react-remove-prop-types@0.4.24: + resolution: {integrity: sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==} - '@vanilla-extract/vite-plugin@5.1.1': - resolution: {integrity: sha512-Nd1worqkHrd8XED4ZAA7Wmkd3pCqCwpmzCBVF8v6T1BSLHGXQE5HYflVgygw0CsIAbFRMS6zQBIk4F4/r/YKIw==} + babel-preset-current-node-syntax@1.0.1: + resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} peerDependencies: - vite: ^5.0.0 || ^6.0.0 || ^7.0.0 + '@babel/core': ^7.0.0 - '@vitejs/plugin-react@4.5.2': - resolution: {integrity: sha512-QNVT3/Lxx99nMQWJWF7K4N6apUEuT0KlZA3mx/mVaoGj3smm/8rc8ezz15J1pcbcjDK0V15rpHetVfya08r76Q==} - engines: {node: ^14.18.0 || >=16.0.0} + babel-preset-jest@29.6.3: + resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: - vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0 + '@babel/core': ^7.0.0 - '@vitejs/plugin-rsc@0.4.30': - resolution: {integrity: sha512-r/ztwY7JRJnq+BTxuWt+488OdbHDH50IS7dSaSOiSmvGEYYgF0arexr7LfMm+gYr0s3QHTfUl52sbDjLIyAEQg==} - peerDependencies: - react: '*' - react-dom: '*' - vite: '*' + babel-preset-react-app@10.0.1: + resolution: {integrity: sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==} - '@web3-storage/multipart-parser@1.0.0': - resolution: {integrity: sha512-BEO6al7BYqcnfX15W2cnGR+Q566ACXAT9UQykORCWW80lmkpWsnEob6zJS1ZVBKsSJC8+7vJkHwlp+lXG1UCdw==} + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} - '@zxing/text-encoding@0.9.0': - resolution: {integrity: sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==} + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - abab@2.0.6: - resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} - deprecated: Use your platform's native atob() and btoa() methods instead + balanced-match@3.0.1: + resolution: {integrity: sha512-vjtV3hiLqYDNRoiAv0zC4QaGAMPomEoq83PRmYIofPswwZurCeWR5LByXm7SyoL0Zh5+2z0+HC7jG8gSZJUh0w==} + engines: {node: '>= 16'} - abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} + baseline-browser-mapping@2.9.6: + resolution: {integrity: sha512-v9BVVpOTLB59C9E7aSnmIF8h7qRsFpx+A2nugVMTszEOMcfjlZMsXRm4LF23I3Z9AJxc8ANpIvzbzONoX9VJlg==} + hasBin: true - acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + basic-auth@2.0.1: + resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} + engines: {node: '>= 0.8'} - acorn-walk@8.3.2: - resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} - engines: {node: '>=0.4.0'} + basic-ftp@5.0.5: + resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} + engines: {node: '>=10.0.0'} - acorn@8.14.0: - resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} - engines: {node: '>=0.4.0'} - hasBin: true + better-path-resolve@1.0.0: + resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} + engines: {node: '>=4'} - acorn@8.15.0: - resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} - engines: {node: '>=0.4.0'} - hasBin: true + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} - agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - agent-base@7.1.1: - resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} - engines: {node: '>= 14'} + blake3-wasm@2.1.5: + resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} - ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + body-parser@1.20.3: + resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - ansi-escapes@5.0.0: - resolution: {integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==} - engines: {node: '>=12'} + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + brace-expansion@4.0.0: + resolution: {integrity: sha512-l/mOwLWs7BQIgOKrL46dIAbyCKvPV7YJPDspkuc88rHsZRlg3hptUGdU7Trv0VFP4d3xnSGBQrKu5ZvGB7UeIw==} + engines: {node: '>= 18'} + + braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} engines: {node: '>=8'} - ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} + breakword@1.0.5: + resolution: {integrity: sha512-ex5W9DoOQ/LUEU3PMdLs9ua/CYZl1678NUkKOdUSi8Aw5F1idieaiRURCBFJCwVcrD1J8Iy3vfWSloaMwO2qFg==} - ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} + browserify-zlib@0.1.4: + resolution: {integrity: sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==} - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - - ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - - any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - app-root-path@3.1.0: - resolution: {integrity: sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==} - engines: {node: '>= 6.0.0'} - - are-docs-informative@0.0.2: - resolution: {integrity: sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==} - engines: {node: '>=14'} - - arg@5.0.2: - resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} - - argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - aria-query@5.3.0: - resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} - - array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} - engines: {node: '>= 0.4'} - - array-flatten@1.1.1: - resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - - array-includes@3.1.8: - resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} - engines: {node: '>= 0.4'} - - array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - - array.prototype.findlast@1.2.5: - resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} - engines: {node: '>= 0.4'} - - array.prototype.findlastindex@1.2.5: - resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} - engines: {node: '>= 0.4'} - - array.prototype.flat@1.3.2: - resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} - engines: {node: '>= 0.4'} - - array.prototype.flatmap@1.3.2: - resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} - engines: {node: '>= 0.4'} - - array.prototype.toreversed@1.1.2: - resolution: {integrity: sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==} - - array.prototype.tosorted@1.1.3: - resolution: {integrity: sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==} - - arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} - engines: {node: '>= 0.4'} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - as-table@1.0.55: - resolution: {integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==} - - asap@2.0.6: - resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} - - ast-types-flow@0.0.8: - resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} - - ast-types@0.13.4: - resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} - engines: {node: '>=4'} - - astring@1.8.6: - resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==} - hasBin: true - - asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - - available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} - - axe-core@4.7.0: - resolution: {integrity: sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==} - engines: {node: '>=4'} - - axios@1.6.8: - resolution: {integrity: sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==} - - axobject-query@3.2.1: - resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} - - babel-dead-code-elimination@1.0.10: - resolution: {integrity: sha512-DV5bdJZTzZ0zn0DC24v3jD7Mnidh6xhKa4GfKCbq3sfW8kaWhDdZjP3i81geA8T33tdYqWKw4D3fVv0CwEgKVA==} - - babel-jest@29.7.0: - resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@babel/core': ^7.8.0 - - babel-plugin-dev-expression@0.2.3: - resolution: {integrity: sha512-rP5LK9QQTzCW61nVVzw88En1oK8t8gTsIeC6E61oelxNsU842yMjF0G1MxhvUpCkxCEIj7sE8/e5ieTheT//uw==} - peerDependencies: - '@babel/core': ^7.0.0 - - babel-plugin-istanbul@6.1.1: - resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} - engines: {node: '>=8'} - - babel-plugin-jest-hoist@29.6.3: - resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - babel-plugin-macros@3.1.0: - resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} - engines: {node: '>=10', npm: '>=6'} - - babel-plugin-polyfill-corejs2@0.3.3: - resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - babel-plugin-polyfill-corejs2@0.4.14: - resolution: {integrity: sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - - babel-plugin-polyfill-corejs3@0.11.1: - resolution: {integrity: sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - - babel-plugin-polyfill-corejs3@0.5.3: - resolution: {integrity: sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - babel-plugin-polyfill-regenerator@0.4.1: - resolution: {integrity: sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - babel-plugin-polyfill-regenerator@0.6.5: - resolution: {integrity: sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - - babel-plugin-transform-react-remove-prop-types@0.4.24: - resolution: {integrity: sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==} - - babel-preset-current-node-syntax@1.0.1: - resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} - peerDependencies: - '@babel/core': ^7.0.0 - - babel-preset-jest@29.6.3: - resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@babel/core': ^7.0.0 - - babel-preset-react-app@10.0.1: - resolution: {integrity: sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==} - - bail@2.0.2: - resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - balanced-match@3.0.1: - resolution: {integrity: sha512-vjtV3hiLqYDNRoiAv0zC4QaGAMPomEoq83PRmYIofPswwZurCeWR5LByXm7SyoL0Zh5+2z0+HC7jG8gSZJUh0w==} - engines: {node: '>= 16'} - - base-x@3.0.11: - resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - basic-auth@2.0.1: - resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} - engines: {node: '>= 0.8'} - - basic-ftp@5.0.5: - resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} - engines: {node: '>=10.0.0'} - - better-path-resolve@1.0.0: - resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} - engines: {node: '>=4'} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - - blake3-wasm@2.1.5: - resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} - - body-parser@1.20.3: - resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - - boolbase@1.0.0: - resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - - brace-expansion@4.0.0: - resolution: {integrity: sha512-l/mOwLWs7BQIgOKrL46dIAbyCKvPV7YJPDspkuc88rHsZRlg3hptUGdU7Trv0VFP4d3xnSGBQrKu5ZvGB7UeIw==} - engines: {node: '>= 18'} - - braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - - breakword@1.0.5: - resolution: {integrity: sha512-ex5W9DoOQ/LUEU3PMdLs9ua/CYZl1678NUkKOdUSi8Aw5F1idieaiRURCBFJCwVcrD1J8Iy3vfWSloaMwO2qFg==} - - browserify-zlib@0.1.4: - resolution: {integrity: sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==} - - browserify-zlib@0.2.0: - resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} - - browserslist@4.25.1: - resolution: {integrity: sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true + browserslist@4.28.1: + resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true bser@2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} @@ -5470,9 +4827,6 @@ packages: buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - builtin-status-codes@3.0.0: - resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==} - bundle-require@5.1.0: resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -5515,8 +4869,8 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001726: - resolution: {integrity: sha512-VQAUIUzBiZ/UnlM28fSp2CRF3ivUn1BWEvxMcVTNwpw91Py1pGbPIyIKtd+tzct9C3ouceCVdGAXxZOpZAsgdw==} + caniuse-lite@1.0.30001760: + resolution: {integrity: sha512-7AAMPcueWELt1p3mi13HR/LHH0TJLT11cnwDJEs3xA4+CK/PLKeO9Kl1oru24htkyUKtkGCvAx4ohB0Ttry8Dw==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -5604,10 +4958,6 @@ packages: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} - clone@2.1.2: - resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} - engines: {node: '>=0.8'} - co@4.6.0: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} @@ -5645,10 +4995,6 @@ packages: comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} - commander@12.1.0: - resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} - engines: {node: '>=18'} - commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} @@ -5671,8 +5017,8 @@ packages: resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} engines: {node: '>= 0.6'} - compression@1.8.0: - resolution: {integrity: sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA==} + compression@1.8.1: + resolution: {integrity: sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==} engines: {node: '>= 0.8.0'} concat-map@0.0.1: @@ -5932,11 +5278,6 @@ packages: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} - detect-libc@1.0.3: - resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} - engines: {node: '>=0.10'} - hasBin: true - detect-libc@2.0.3: resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} engines: {node: '>=8'} @@ -5995,17 +5336,9 @@ packages: domutils@3.1.0: resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} - dotenv-expand@11.0.7: - resolution: {integrity: sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==} - engines: {node: '>=12'} - dotenv-json@1.0.0: resolution: {integrity: sha512-jAssr+6r4nKhKRudQ0HOzMskOFFi9+ubXWwmrSGJFgTvpjyPXCXsCsYbjif6mXp7uxA7xY3/LGaiTQukZzSbOQ==} - dotenv@16.5.0: - resolution: {integrity: sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==} - engines: {node: '>=12'} - dotenv@8.6.0: resolution: {integrity: sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==} engines: {node: '>=10'} @@ -6027,8 +5360,8 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - electron-to-chromium@1.5.178: - resolution: {integrity: sha512-wObbz/ar3Bc6e4X5vf0iO8xTN8YAjN/tgiAOJLr7yjYFtP9wAjq8Mb5h0yn6kResir+VYx2DXBj9NNobs0ETSA==} + electron-to-chromium@1.5.267: + resolution: {integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==} emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} @@ -6054,6 +5387,10 @@ packages: end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + enhanced-resolve@5.18.3: + resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} + engines: {node: '>=10.13.0'} + enquirer@2.3.6: resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} engines: {node: '>=8.6'} @@ -6088,6 +5425,9 @@ packages: es-module-lexer@1.7.0: resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + es-module-lexer@2.0.0: + resolution: {integrity: sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==} + es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} @@ -6247,8 +5587,8 @@ packages: peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - eslint-plugin-react-hooks@7.1.0-canary-fd524fe0-20251121: - resolution: {integrity: sha512-G5we0+XjZTKpjkLL9AgdWxzmo4mqelVDIYzoR1dBlhhiN8Lf5PQ+l8frr+BmX02nU4g0AEez3eGSF/LNfHokEw==} + eslint-plugin-react-hooks@7.1.0-canary-b061b597-20251212: + resolution: {integrity: sha512-tSQTLvkBVbN4rZZZjGIDeUVFgNrY8/hqU6mteRetyCuLYCP92r0x8hetyshU1jInpMQxeJitpOox8A2uMAIrrg==} engines: {node: '>=18'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 @@ -6420,6 +5760,9 @@ packages: fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + fast-uri@3.1.0: + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + fastq@1.13.0: resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==} @@ -6564,10 +5907,6 @@ packages: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} engines: {node: '>=8.0.0'} - get-port@4.2.0: - resolution: {integrity: sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw==} - engines: {node: '>=6'} - get-port@5.1.1: resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} engines: {node: '>=8'} @@ -7213,6 +6552,10 @@ packages: resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + jest-worker@29.7.0: resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -7241,6 +6584,9 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true @@ -7281,6 +6627,9 @@ packages: json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} @@ -7422,10 +6771,6 @@ packages: linkify-it@5.0.0: resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} - lmdb@2.8.5: - resolution: {integrity: sha512-9bMdFfc80S+vSldBmG3HOuLVHnxRdNTlpzR6QDnzqCQtCzGUEAGTzBKYMeIM+I/sU4oZfgbcbS7X7F65/z/oxQ==} - hasBin: true - load-tsconfig@0.2.5: resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -7434,6 +6779,10 @@ packages: resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} engines: {node: '>=6'} + loader-runner@4.3.1: + resolution: {integrity: sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==} + engines: {node: '>=6.11.5'} + locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -7488,8 +6837,8 @@ packages: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true - magic-string@0.30.18: - resolution: {integrity: sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ==} + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} make-dir@3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} @@ -7878,8 +7227,8 @@ packages: modern-ahocorasick@1.0.1: resolution: {integrity: sha512-yoe+JbhTClckZ67b2itRtistFKf8yPYelHLc7e5xAwtNAXxM6wJTUx2C7QeVSJFDzKT7bCIFyBVybPMKvmB9AA==} - morgan@1.10.0: - resolution: {integrity: sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==} + morgan@1.10.1: + resolution: {integrity: sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A==} engines: {node: '>= 0.8.0'} mri@1.2.0: @@ -7896,13 +7245,6 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - msgpackr-extract@3.0.3: - resolution: {integrity: sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==} - hasBin: true - - msgpackr@1.11.2: - resolution: {integrity: sha512-F9UngXRlPyWCDEASDpTf6c9uNhGPTqnTeLVt7bN+bU1eajoR/8V9ys2BRaV5C/e5ihE6sJ9uPIKaYt6bFuO32g==} - msw@2.7.5: resolution: {integrity: sha512-00MyTlY3TJutBa5kiU+jWiz2z5pNJDYHn2TgPkGkh92kMmNH43RqvMXd8y/7HxNn8RjzUbvZWYZjcS36fdb6sw==} engines: {node: '>=18'} @@ -7943,16 +7285,13 @@ packages: resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} engines: {node: '>= 0.6'} + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + netmask@2.0.2: resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} engines: {node: '>= 0.4.0'} - node-addon-api@6.1.0: - resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} - - node-addon-api@7.1.1: - resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} - node-fetch@2.6.7: resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} engines: {node: 4.x || >=6.0.0} @@ -7962,14 +7301,6 @@ packages: encoding: optional: true - node-gyp-build-optional-packages@5.1.1: - resolution: {integrity: sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==} - hasBin: true - - node-gyp-build-optional-packages@5.2.2: - resolution: {integrity: sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==} - hasBin: true - node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} @@ -7977,8 +7308,8 @@ packages: resolution: {integrity: sha512-mfXuCGonz0A7uG1FEjnypjm34xegeN5+HI6xeGhYKecfgaZhjsmYoLE9LEFmT+53G1n8IuagPZmVnEL/xNsFaA==} engines: {node: '>=14'} - node-releases@2.0.19: - resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + node-releases@2.0.27: + resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} node-webtokens@1.0.4: resolution: {integrity: sha512-Sla56CeSLWvPbwud2kogqf5edQtKNXZBtXDDpmOzAgNZjwETbK/Am6PXfs54iZPLBm8K8amZ9XWaCQwGqZmKyQ==} @@ -8002,9 +7333,6 @@ packages: nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - nullthrows@1.1.1: - resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} - nwsapi@2.2.4: resolution: {integrity: sha512-NHj4rzRo0tQdijE9ZqAx6kYDcoRwYwSYzCA8MY3JzfxlrvEU0jhnhJT9BhqhJs7I/dKcrDm6TyulaRqZPIhN5g==} @@ -8055,8 +7383,8 @@ packages: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} - on-headers@1.0.2: - resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} + on-headers@1.1.0: + resolution: {integrity: sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==} engines: {node: '>= 0.8'} once@1.4.0: @@ -8070,9 +7398,6 @@ packages: resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} engines: {node: '>= 0.8.0'} - ordered-binary@1.5.3: - resolution: {integrity: sha512-oGFr3T+pYdTGJ+YFEILMpS3es+GiIbs9h/XQrclBXUtd44ey7XwfsMzM31f64I1SQOawDoDr/D823kNCADI8TA==} - os-tmpdir@1.0.2: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} @@ -8126,14 +7451,6 @@ packages: pako@0.2.9: resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} - pako@1.0.11: - resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} - - parcel@2.15.4: - resolution: {integrity: sha512-eZHQ/omuQ7yBYB9XezyzSqhc826oy/uhloCNiej1CTZ+twAqJVtp4MRvTGMcivKhE+WE8QkYD5XkJHLLQsJQcg==} - engines: {node: '>= 16.0.0'} - hasBin: true - parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -8168,9 +7485,6 @@ packages: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} - path-browserify@1.0.1: - resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} - path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -8381,9 +7695,6 @@ packages: resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} engines: {node: '>=6'} - punycode@1.4.1: - resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} - punycode@2.3.0: resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} engines: {node: '>=6'} @@ -8399,10 +7710,6 @@ packages: resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} engines: {node: '>=0.6'} - querystring-es3@0.2.1: - resolution: {integrity: sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==} - engines: {node: '>=0.4.x'} - querystringify@2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} @@ -8428,10 +7735,15 @@ packages: resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} engines: {node: '>= 0.8'} - react-dom@19.1.0: - resolution: {integrity: sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==} + react-dom@19.2.3: + resolution: {integrity: sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==} peerDependencies: - react: ^19.1.0 + react: ^19.2.3 + + react-dom@19.3.0-canary-d763f313-20251210: + resolution: {integrity: sha512-loJ3Y0TFRxwbNl+YA8ra1F0gDYIzJXXAVfe6hPwv8SKkV8eTWBP449oy5CqupcxjDy+4o730euIBTOZDTIQKvQ==} + peerDependencies: + react: 19.3.0-canary-d763f313-20251210 react-is@19.1.0: resolution: {integrity: sha512-Oe56aUPnkHyyDxxkvqtd7KkdQP5uIUfHxd5XTb3wE9d/kRnZLmKbDB0GWk919tdQ+mxxPtG6EAs6RMT6i1qtHg==} @@ -8440,28 +7752,29 @@ packages: resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} engines: {node: '>=0.10.0'} - react-refresh@0.16.0: - resolution: {integrity: sha512-FPvF2XxTSikpJxcr+bHut2H4gJ17+18Uy20D5/F+SKzFap62R3cM5wH6b8WN3LyGSYeQilLEcJcR1fjBSI2S1A==} - engines: {node: '>=0.10.0'} - react-refresh@0.17.0: resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} engines: {node: '>=0.10.0'} - react-server-dom-parcel@19.2.1: - resolution: {integrity: sha512-/pYJSIjVZy1sZLHlovmItuMqVl8z57jURTPn+sTCWotIm1orCodjFkBiBfY1zWKHa48d406Pble5mlr7tU3lfg==} + react-server-dom-webpack@19.2.3: + resolution: {integrity: sha512-ifo7aqqdNJyV6U2zuvvWX4rRQ51pbleuUFNG7ZYhIuSuWZzQPbfmYv11GNsyJm/3uGNbt8buJ9wmoISn/uOAfw==} engines: {node: '>=0.10.0'} peerDependencies: - react: ^19.2.1 - react-dom: ^19.2.1 + react: ^19.2.3 + react-dom: ^19.2.3 + webpack: ^5.59.0 react-test-renderer@19.1.0: resolution: {integrity: sha512-jXkSl3CpvPYEF+p/eGDLB4sPoDX8pKkYvRl9+rR8HxLY0X04vW7hCm1/0zHoUSjPZ3bDa+wXWNTDVIw/R8aDVw==} peerDependencies: react: ^19.1.0 - react@19.1.0: - resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} + react@19.2.3: + resolution: {integrity: sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==} + engines: {node: '>=0.10.0'} + + react@19.3.0-canary-d763f313-20251210: + resolution: {integrity: sha512-XOiCIlc4XiIkKMnnZ8O6Z7yX3Ou1/Ix5MEZG0rPduJPX6pqNZaY679pKlJVUHE4qyqPdYHuwECDerI+jkfeHAQ==} engines: {node: '>=0.10.0'} read-cache@1.0.0: @@ -8595,6 +7908,10 @@ packages: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + require-like@0.1.2: resolution: {integrity: sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==} @@ -8758,9 +8075,6 @@ packages: rrweb-cssom@0.6.0: resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==} - rsc-html-stream@0.0.6: - resolution: {integrity: sha512-oZUJ5AH0oDo9QywxD9yMY6N5Z3VwX2YfQg0FanNdCmvXmO0itTfv7BMkbMSwxg7JmBjYmefU8DTW0EcLsePPgQ==} - run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -8798,6 +8112,16 @@ packages: scheduler@0.26.0: resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + + scheduler@0.28.0-canary-d763f313-20251210: + resolution: {integrity: sha512-Wvi6OlrTVL/PVxHeZmC+pjwfP68DC99Tsnq6jQiBozXlexKz+gcPtAAe6LhJvyS2A5U1TLBO4zxfJHkIKzxtEw==} + + schema-utils@4.3.3: + resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==} + engines: {node: '>= 10.13.0'} + semver@5.7.1: resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} hasBin: true @@ -8994,9 +8318,6 @@ packages: resolution: {integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==} engines: {node: '>=4', npm: '>=6'} - stream-http@3.2.0: - resolution: {integrity: sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==} - stream-shift@1.0.3: resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} @@ -9074,6 +8395,9 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + strip-literal@3.1.0: + resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} + style-to-object@0.4.4: resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} @@ -9114,6 +8438,10 @@ packages: symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + tapable@2.3.0: + resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} + engines: {node: '>=6'} + tar-fs@2.1.3: resolution: {integrity: sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==} @@ -9125,8 +8453,24 @@ packages: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} - terser@5.15.0: - resolution: {integrity: sha512-L1BJiXVmheAQQy+as0oF3Pwtlo4s3Wi1X2zNZ2NxOB4wx9bdS9Vk67XQENLFdLYGCK/Z2di53mTj/hBafR+dTA==} + terser-webpack-plugin@5.3.15: + resolution: {integrity: sha512-PGkOdpRFK+rb1TzVz+msVhw4YMRT9txLF4kRqvJhGhCM324xuR3REBSHALN+l+sAhKUmz0aotnjp5D+P83mLhQ==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + + terser@5.44.1: + resolution: {integrity: sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==} engines: {node: '>=10'} hasBin: true @@ -9455,8 +8799,8 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} - update-browserslist-db@1.1.3: - resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + update-browserslist-db@1.2.2: + resolution: {integrity: sha512-E85pfNzMQ9jpKkA7+TJAi4TJN+tBCuWh5rUcS/sv6cFi+1q9LYDwDI5dpUL0u/73EElyQ8d3TEaeW4sPedBqYA==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -9467,20 +8811,12 @@ packages: url-parse@1.5.10: resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - url@0.11.4: - resolution: {integrity: sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==} - engines: {node: '>= 0.4'} - util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} util@0.12.5: resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} - utility-types@3.11.0: - resolution: {integrity: sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==} - engines: {node: '>= 4'} - utils-merge@1.0.1: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} @@ -9687,12 +9023,13 @@ packages: walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + watchpack@2.4.4: + resolution: {integrity: sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==} + engines: {node: '>=10.13.0'} + wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} - weak-lru-cache@1.2.2: - resolution: {integrity: sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==} - web-encoding@1.1.5: resolution: {integrity: sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA==} @@ -9710,6 +9047,20 @@ packages: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} + webpack-sources@3.3.3: + resolution: {integrity: sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==} + engines: {node: '>=10.13.0'} + + webpack@5.103.0: + resolution: {integrity: sha512-HU1JOuV1OavsZ+mfigY0j8d1TgQgbZ6M+J75zDkpEAwYeXjWSqrGJtgnPblJjd/mAyTNQ7ygw0MiKOn6etz8yw==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + whatwg-encoding@2.0.0: resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} engines: {node: '>=12'} @@ -9976,7 +9327,7 @@ snapshots: dependencies: '@babel/compat-data': 7.27.7 '@babel/helper-validator-option': 7.27.1 - browserslist: 4.25.1 + browserslist: 4.28.1 lru-cache: 5.1.1 semver: 6.3.1 @@ -10823,41 +10174,6 @@ snapshots: '@bcoe/v8-coverage@0.2.3': {} - '@biomejs/biome@1.9.4': - optionalDependencies: - '@biomejs/cli-darwin-arm64': 1.9.4 - '@biomejs/cli-darwin-x64': 1.9.4 - '@biomejs/cli-linux-arm64': 1.9.4 - '@biomejs/cli-linux-arm64-musl': 1.9.4 - '@biomejs/cli-linux-x64': 1.9.4 - '@biomejs/cli-linux-x64-musl': 1.9.4 - '@biomejs/cli-win32-arm64': 1.9.4 - '@biomejs/cli-win32-x64': 1.9.4 - - '@biomejs/cli-darwin-arm64@1.9.4': - optional: true - - '@biomejs/cli-darwin-x64@1.9.4': - optional: true - - '@biomejs/cli-linux-arm64-musl@1.9.4': - optional: true - - '@biomejs/cli-linux-arm64@1.9.4': - optional: true - - '@biomejs/cli-linux-x64-musl@1.9.4': - optional: true - - '@biomejs/cli-linux-x64@1.9.4': - optional: true - - '@biomejs/cli-win32-arm64@1.9.4': - optional: true - - '@biomejs/cli-win32-x64@1.9.4': - optional: true - '@bundled-es-modules/cookie@2.0.1': dependencies: cookie: 0.7.2 @@ -11037,7 +10353,7 @@ snapshots: optionalDependencies: workerd: 1.20250705.0 - '@cloudflare/vite-plugin@1.9.0(rollup@4.43.0)(vite@6.4.1(@types/node@20.11.30)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0))(workerd@1.20250705.0)(wrangler@4.23.0(@cloudflare/workers-types@4.20250805.0))': + '@cloudflare/vite-plugin@1.9.0(rollup@4.43.0)(vite@6.4.1(@types/node@20.11.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0))(workerd@1.20250705.0)(wrangler@4.23.0(@cloudflare/workers-types@4.20250805.0))': dependencies: '@cloudflare/unenv-preset': 2.3.3(unenv@2.0.0-rc.17)(workerd@1.20250705.0) '@mjackson/node-fetch-server': 0.6.1 @@ -11047,7 +10363,7 @@ snapshots: picocolors: 1.1.1 tinyglobby: 0.2.14 unenv: 2.0.0-rc.17 - vite: 6.4.1(@types/node@20.11.30)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0) + vite: 6.4.1(@types/node@20.11.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0) wrangler: 4.23.0(@cloudflare/workers-types@4.20250805.0) ws: 8.18.0 transitivePeerDependencies: @@ -11251,1404 +10567,541 @@ snapshots: optional: true '@esbuild/linux-x64@0.25.0': - optional: true - - '@esbuild/linux-x64@0.25.4': - optional: true - - '@esbuild/netbsd-arm64@0.25.0': - optional: true - - '@esbuild/netbsd-arm64@0.25.4': - optional: true - - '@esbuild/netbsd-x64@0.19.12': - optional: true - - '@esbuild/netbsd-x64@0.25.0': - optional: true - - '@esbuild/netbsd-x64@0.25.4': - optional: true - - '@esbuild/openbsd-arm64@0.25.0': - optional: true - - '@esbuild/openbsd-arm64@0.25.4': - optional: true - - '@esbuild/openbsd-x64@0.19.12': - optional: true - - '@esbuild/openbsd-x64@0.25.0': - optional: true - - '@esbuild/openbsd-x64@0.25.4': - optional: true - - '@esbuild/sunos-x64@0.19.12': - optional: true - - '@esbuild/sunos-x64@0.25.0': - optional: true - - '@esbuild/sunos-x64@0.25.4': - optional: true - - '@esbuild/win32-arm64@0.19.12': - optional: true - - '@esbuild/win32-arm64@0.25.0': - optional: true - - '@esbuild/win32-arm64@0.25.4': - optional: true - - '@esbuild/win32-ia32@0.19.12': - optional: true - - '@esbuild/win32-ia32@0.25.0': - optional: true - - '@esbuild/win32-ia32@0.25.4': - optional: true - - '@esbuild/win32-x64@0.19.12': - optional: true - - '@esbuild/win32-x64@0.25.0': - optional: true - - '@esbuild/win32-x64@0.25.4': - optional: true - - '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': - dependencies: - eslint: 8.57.0 - eslint-visitor-keys: 3.4.3 - - '@eslint-community/regexpp@4.10.0': {} - - '@eslint/eslintrc@2.1.4': - dependencies: - ajv: 6.12.6 - debug: 4.4.1 - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.1 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - - '@eslint/js@8.57.0': {} - - '@extra-number/significant-digits@1.3.9': {} - - '@fastify/busboy@2.1.1': {} - - '@gerrit0/mini-shiki@3.8.1': - dependencies: - '@shikijs/engine-oniguruma': 3.8.1 - '@shikijs/langs': 3.8.1 - '@shikijs/themes': 3.8.1 - '@shikijs/types': 3.8.1 - '@shikijs/vscode-textmate': 10.0.2 - - '@hapi/hoek@9.3.0': {} - - '@hapi/topo@5.1.0': - dependencies: - '@hapi/hoek': 9.3.0 - - '@humanwhocodes/config-array@0.11.14': - dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.1 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - - '@humanwhocodes/module-importer@1.0.1': {} - - '@humanwhocodes/object-schema@2.0.3': {} - - '@img/sharp-darwin-arm64@0.33.5': - optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.0.4 - optional: true - - '@img/sharp-darwin-x64@0.33.5': - optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.0.4 - optional: true - - '@img/sharp-libvips-darwin-arm64@1.0.4': - optional: true - - '@img/sharp-libvips-darwin-x64@1.0.4': - optional: true - - '@img/sharp-libvips-linux-arm64@1.0.4': - optional: true - - '@img/sharp-libvips-linux-arm@1.0.5': - optional: true - - '@img/sharp-libvips-linux-s390x@1.0.4': - optional: true - - '@img/sharp-libvips-linux-x64@1.0.4': - optional: true - - '@img/sharp-libvips-linuxmusl-arm64@1.0.4': - optional: true - - '@img/sharp-libvips-linuxmusl-x64@1.0.4': - optional: true - - '@img/sharp-linux-arm64@0.33.5': - optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.0.4 - optional: true - - '@img/sharp-linux-arm@0.33.5': - optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.0.5 - optional: true - - '@img/sharp-linux-s390x@0.33.5': - optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.0.4 - optional: true - - '@img/sharp-linux-x64@0.33.5': - optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.0.4 - optional: true - - '@img/sharp-linuxmusl-arm64@0.33.5': - optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 - optional: true - - '@img/sharp-linuxmusl-x64@0.33.5': - optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.0.4 - optional: true - - '@img/sharp-wasm32@0.33.5': - dependencies: - '@emnapi/runtime': 1.4.3 - optional: true - - '@img/sharp-win32-ia32@0.33.5': - optional: true - - '@img/sharp-win32-x64@0.33.5': - optional: true - - '@inquirer/confirm@5.1.9(@types/node@22.14.0)': - dependencies: - '@inquirer/core': 10.1.10(@types/node@22.14.0) - '@inquirer/type': 3.0.6(@types/node@22.14.0) - optionalDependencies: - '@types/node': 22.14.0 - - '@inquirer/core@10.1.10(@types/node@22.14.0)': - dependencies: - '@inquirer/figures': 1.0.11 - '@inquirer/type': 3.0.6(@types/node@22.14.0) - ansi-escapes: 4.3.2 - cli-width: 4.1.0 - mute-stream: 2.0.0 - signal-exit: 4.1.0 - wrap-ansi: 6.2.0 - yoctocolors-cjs: 2.1.2 - optionalDependencies: - '@types/node': 22.14.0 - - '@inquirer/figures@1.0.11': {} - - '@inquirer/type@3.0.6(@types/node@22.14.0)': - optionalDependencies: - '@types/node': 22.14.0 - - '@isaacs/cliui@8.0.2': - dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.0 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 - - '@istanbuljs/load-nyc-config@1.1.0': - dependencies: - camelcase: 5.3.1 - find-up: 4.1.0 - get-package-type: 0.1.0 - js-yaml: 3.14.1 - resolve-from: 5.0.0 - - '@istanbuljs/schema@0.1.3': {} - - '@jest/console@29.7.0': - dependencies: - '@jest/types': 29.6.3 - '@types/node': 22.14.0 - chalk: 4.1.2 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - slash: 3.0.0 - - '@jest/core@29.7.0(babel-plugin-macros@3.1.0)': - dependencies: - '@jest/console': 29.7.0 - '@jest/reporters': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 22.14.0 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - ci-info: 3.8.0 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@22.14.0)(babel-plugin-macros@3.1.0) - jest-haste-map: 29.7.0 - jest-message-util: 29.7.0 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-resolve-dependencies: 29.7.0 - jest-runner: 29.7.0 - jest-runtime: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - jest-watcher: 29.7.0 - micromatch: 4.0.5 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-ansi: 6.0.1 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - ts-node - - '@jest/environment@29.7.0': - dependencies: - '@jest/fake-timers': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 22.14.0 - jest-mock: 29.7.0 - - '@jest/expect-utils@29.7.0': - dependencies: - jest-get-type: 29.6.3 - - '@jest/expect@29.7.0': - dependencies: - expect: 29.7.0 - jest-snapshot: 29.7.0 - transitivePeerDependencies: - - supports-color - - '@jest/fake-timers@29.7.0': - dependencies: - '@jest/types': 29.6.3 - '@sinonjs/fake-timers': 10.0.2 - '@types/node': 22.14.0 - jest-message-util: 29.7.0 - jest-mock: 29.7.0 - jest-util: 29.7.0 - - '@jest/globals@29.7.0': - dependencies: - '@jest/environment': 29.7.0 - '@jest/expect': 29.7.0 - '@jest/types': 29.6.3 - jest-mock: 29.7.0 - transitivePeerDependencies: - - supports-color - - '@jest/reporters@29.7.0': - dependencies: - '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.25 - '@types/node': 22.14.0 - chalk: 4.1.2 - collect-v8-coverage: 1.0.1 - exit: 0.1.2 - glob: 7.2.3 - graceful-fs: 4.2.11 - istanbul-lib-coverage: 3.2.0 - istanbul-lib-instrument: 6.0.2 - istanbul-lib-report: 3.0.0 - istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.5 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - jest-worker: 29.7.0 - slash: 3.0.0 - string-length: 4.0.2 - strip-ansi: 6.0.1 - v8-to-istanbul: 9.1.0 - transitivePeerDependencies: - - supports-color - - '@jest/schemas@29.6.3': - dependencies: - '@sinclair/typebox': 0.27.8 - - '@jest/source-map@29.6.3': - dependencies: - '@jridgewell/trace-mapping': 0.3.25 - callsites: 3.1.0 - graceful-fs: 4.2.11 - - '@jest/test-result@29.7.0': - dependencies: - '@jest/console': 29.7.0 - '@jest/types': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.4 - collect-v8-coverage: 1.0.1 - - '@jest/test-sequencer@29.7.0': - dependencies: - '@jest/test-result': 29.7.0 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - slash: 3.0.0 - - '@jest/transform@29.7.0': - dependencies: - '@babel/core': 7.27.7 - '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.25 - babel-plugin-istanbul: 6.1.1 - chalk: 4.1.2 - convert-source-map: 2.0.0 - fast-json-stable-stringify: 2.1.0 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - jest-regex-util: 29.6.3 - jest-util: 29.7.0 - micromatch: 4.0.5 - pirates: 4.0.5 - slash: 3.0.0 - write-file-atomic: 4.0.2 - transitivePeerDependencies: - - supports-color - - '@jest/types@29.6.3': - dependencies: - '@jest/schemas': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.4 - '@types/istanbul-reports': 3.0.1 - '@types/node': 22.14.0 - '@types/yargs': 17.0.24 - chalk: 4.1.2 - - '@jridgewell/gen-mapping@0.3.8': - dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.5 - '@jridgewell/trace-mapping': 0.3.25 - - '@jridgewell/resolve-uri@3.1.0': {} - - '@jridgewell/set-array@1.2.1': {} - - '@jridgewell/source-map@0.3.6': - dependencies: - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 - optional: true - - '@jridgewell/sourcemap-codec@1.5.5': {} - - '@jridgewell/trace-mapping@0.3.25': - dependencies: - '@jridgewell/resolve-uri': 3.1.0 - '@jridgewell/sourcemap-codec': 1.5.5 - - '@jridgewell/trace-mapping@0.3.9': - dependencies: - '@jridgewell/resolve-uri': 3.1.0 - '@jridgewell/sourcemap-codec': 1.5.5 - - '@lezer/common@1.2.3': {} - - '@lezer/lr@1.4.2': - dependencies: - '@lezer/common': 1.2.3 - - '@lmdb/lmdb-darwin-arm64@2.8.5': - optional: true - - '@lmdb/lmdb-darwin-x64@2.8.5': - optional: true - - '@lmdb/lmdb-linux-arm64@2.8.5': - optional: true - - '@lmdb/lmdb-linux-arm@2.8.5': - optional: true - - '@lmdb/lmdb-linux-x64@2.8.5': - optional: true - - '@lmdb/lmdb-win32-x64@2.8.5': - optional: true - - '@manypkg/find-root@1.1.0': - dependencies: - '@babel/runtime': 7.24.1 - '@types/node': 12.20.55 - find-up: 4.1.0 - fs-extra: 8.1.0 - - '@manypkg/get-packages@1.1.3': - dependencies: - '@babel/runtime': 7.24.1 - '@changesets/types': 4.1.0 - '@manypkg/find-root': 1.1.0 - fs-extra: 8.1.0 - globby: 11.1.0 - read-yaml-file: 1.1.0 - - '@mdx-js/mdx@3.0.1': - dependencies: - '@types/estree': 1.0.8 - '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.4 - '@types/mdx': 2.0.12 - collapse-white-space: 2.1.0 - devlop: 1.1.0 - estree-util-build-jsx: 3.0.1 - estree-util-is-identifier-name: 3.0.0 - estree-util-to-js: 2.0.0 - estree-walker: 3.0.3 - hast-util-to-estree: 3.1.0 - hast-util-to-jsx-runtime: 2.3.0 - markdown-extensions: 2.0.0 - periscopic: 3.1.0 - remark-mdx: 3.0.1 - remark-parse: 11.0.0 - remark-rehype: 11.1.0 - source-map: 0.7.4 - unified: 11.0.4 - unist-util-position-from-estree: 2.0.0 - unist-util-stringify-position: 4.0.0 - unist-util-visit: 5.0.0 - vfile: 6.0.1 - transitivePeerDependencies: - - supports-color - - '@mdx-js/rollup@3.1.0(patch_hash=wjxfd5pqp7spa3snsugst7roxm)(rollup@4.43.0)': - dependencies: - '@mdx-js/mdx': 3.0.1 - '@rollup/pluginutils': 5.1.0(rollup@4.43.0) - rollup: 4.43.0 - source-map: 0.7.4 - vfile: 6.0.1 - transitivePeerDependencies: - - supports-color - - '@mischnic/json-sourcemap@0.1.1': - dependencies: - '@lezer/common': 1.2.3 - '@lezer/lr': 1.4.2 - json5: 2.2.3 + optional: true - '@mjackson/node-fetch-server@0.2.0': {} + '@esbuild/linux-x64@0.25.4': + optional: true - '@mjackson/node-fetch-server@0.6.1': {} + '@esbuild/netbsd-arm64@0.25.0': + optional: true - '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': + '@esbuild/netbsd-arm64@0.25.4': optional: true - '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3': + '@esbuild/netbsd-x64@0.19.12': optional: true - '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3': + '@esbuild/netbsd-x64@0.25.0': optional: true - '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3': + '@esbuild/netbsd-x64@0.25.4': optional: true - '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3': + '@esbuild/openbsd-arm64@0.25.0': optional: true - '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': + '@esbuild/openbsd-arm64@0.25.4': optional: true - '@mswjs/interceptors@0.37.6': - dependencies: - '@open-draft/deferred-promise': 2.2.0 - '@open-draft/logger': 0.3.0 - '@open-draft/until': 2.1.0 - is-node-process: 1.2.0 - outvariant: 1.4.3 - strict-event-emitter: 0.5.1 + '@esbuild/openbsd-x64@0.19.12': + optional: true - '@napi-rs/wasm-runtime@0.2.11': - dependencies: - '@emnapi/core': 1.4.3 - '@emnapi/runtime': 1.4.3 - '@tybys/wasm-util': 0.9.0 + '@esbuild/openbsd-x64@0.25.0': optional: true - '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': - dependencies: - eslint-scope: 5.1.1 + '@esbuild/openbsd-x64@0.25.4': + optional: true - '@nodelib/fs.scandir@2.1.5': - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 + '@esbuild/sunos-x64@0.19.12': + optional: true - '@nodelib/fs.stat@2.0.5': {} + '@esbuild/sunos-x64@0.25.0': + optional: true - '@nodelib/fs.walk@1.2.8': - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.13.0 + '@esbuild/sunos-x64@0.25.4': + optional: true - '@open-draft/deferred-promise@2.2.0': {} + '@esbuild/win32-arm64@0.19.12': + optional: true - '@open-draft/logger@0.3.0': - dependencies: - is-node-process: 1.2.0 - outvariant: 1.4.3 + '@esbuild/win32-arm64@0.25.0': + optional: true - '@open-draft/until@2.1.0': {} + '@esbuild/win32-arm64@0.25.4': + optional: true - '@oxc-project/runtime@0.61.2': {} + '@esbuild/win32-ia32@0.19.12': + optional: true - '@oxc-project/types@0.61.2': {} + '@esbuild/win32-ia32@0.25.0': + optional: true - '@parcel/bundler-default@2.15.4(@parcel/core@2.15.4)': - dependencies: - '@parcel/diagnostic': 2.15.4 - '@parcel/graph': 3.5.4 - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4) - '@parcel/rust': 2.15.4 - '@parcel/utils': 2.15.4 - nullthrows: 1.1.1 - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm + '@esbuild/win32-ia32@0.25.4': + optional: true - '@parcel/cache@2.15.4(@parcel/core@2.15.4)': - dependencies: - '@parcel/core': 2.15.4 - '@parcel/fs': 2.15.4(@parcel/core@2.15.4) - '@parcel/logger': 2.15.4 - '@parcel/utils': 2.15.4 - lmdb: 2.8.5 - transitivePeerDependencies: - - napi-wasm + '@esbuild/win32-x64@0.19.12': + optional: true - '@parcel/codeframe@2.15.0': - dependencies: - chalk: 4.1.2 + '@esbuild/win32-x64@0.25.0': + optional: true - '@parcel/codeframe@2.15.4': - dependencies: - chalk: 4.1.2 + '@esbuild/win32-x64@0.25.4': + optional: true - '@parcel/compressor-raw@2.15.4(@parcel/core@2.15.4)': + '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': dependencies: - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4) - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm - - '@parcel/config-default@2.15.4(@parcel/core@2.15.4)': - dependencies: - '@parcel/bundler-default': 2.15.4(@parcel/core@2.15.4) - '@parcel/compressor-raw': 2.15.4(@parcel/core@2.15.4) - '@parcel/core': 2.15.4 - '@parcel/namer-default': 2.15.4(@parcel/core@2.15.4) - '@parcel/optimizer-css': 2.15.4(@parcel/core@2.15.4) - '@parcel/optimizer-html': 2.15.4(@parcel/core@2.15.4) - '@parcel/optimizer-image': 2.15.4(@parcel/core@2.15.4) - '@parcel/optimizer-svg': 2.15.4(@parcel/core@2.15.4) - '@parcel/optimizer-swc': 2.15.4(@parcel/core@2.15.4) - '@parcel/packager-css': 2.15.4(@parcel/core@2.15.4) - '@parcel/packager-html': 2.15.4(@parcel/core@2.15.4) - '@parcel/packager-js': 2.15.4(@parcel/core@2.15.4) - '@parcel/packager-raw': 2.15.4(@parcel/core@2.15.4) - '@parcel/packager-svg': 2.15.4(@parcel/core@2.15.4) - '@parcel/packager-wasm': 2.15.4(@parcel/core@2.15.4) - '@parcel/reporter-dev-server': 2.15.4(@parcel/core@2.15.4) - '@parcel/resolver-default': 2.15.4(@parcel/core@2.15.4) - '@parcel/runtime-browser-hmr': 2.15.4(@parcel/core@2.15.4) - '@parcel/runtime-js': 2.15.4(@parcel/core@2.15.4) - '@parcel/runtime-rsc': 2.15.4(@parcel/core@2.15.4) - '@parcel/runtime-service-worker': 2.15.4(@parcel/core@2.15.4) - '@parcel/transformer-babel': 2.15.4(@parcel/core@2.15.4) - '@parcel/transformer-css': 2.15.4(@parcel/core@2.15.4) - '@parcel/transformer-html': 2.15.4(@parcel/core@2.15.4) - '@parcel/transformer-image': 2.15.4(@parcel/core@2.15.4) - '@parcel/transformer-js': 2.15.4(@parcel/core@2.15.4) - '@parcel/transformer-json': 2.15.4(@parcel/core@2.15.4) - '@parcel/transformer-node': 2.15.4(@parcel/core@2.15.4) - '@parcel/transformer-postcss': 2.15.4(@parcel/core@2.15.4) - '@parcel/transformer-posthtml': 2.15.4(@parcel/core@2.15.4) - '@parcel/transformer-raw': 2.15.4(@parcel/core@2.15.4) - '@parcel/transformer-react-refresh-wrap': 2.15.4(@parcel/core@2.15.4) - '@parcel/transformer-svg': 2.15.4(@parcel/core@2.15.4) - transitivePeerDependencies: - - '@swc/helpers' - - napi-wasm - - '@parcel/core@2.15.4': - dependencies: - '@mischnic/json-sourcemap': 0.1.1 - '@parcel/cache': 2.15.4(@parcel/core@2.15.4) - '@parcel/diagnostic': 2.15.4 - '@parcel/events': 2.15.4 - '@parcel/feature-flags': 2.15.4 - '@parcel/fs': 2.15.4(@parcel/core@2.15.4) - '@parcel/graph': 3.5.4 - '@parcel/logger': 2.15.4 - '@parcel/package-manager': 2.15.4(@parcel/core@2.15.4) - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4) - '@parcel/profiler': 2.15.4 - '@parcel/rust': 2.15.4 - '@parcel/source-map': 2.1.1 - '@parcel/types': 2.15.4(@parcel/core@2.15.4) - '@parcel/utils': 2.15.4 - '@parcel/workers': 2.15.4(@parcel/core@2.15.4) - base-x: 3.0.11 - browserslist: 4.25.1 - clone: 2.1.2 - dotenv: 16.5.0 - dotenv-expand: 11.0.7 - json5: 2.2.3 - msgpackr: 1.11.2 - nullthrows: 1.1.1 - semver: 7.7.2 - transitivePeerDependencies: - - '@swc/helpers' - - napi-wasm + eslint: 8.57.0 + eslint-visitor-keys: 3.4.3 - '@parcel/diagnostic@2.15.0': - dependencies: - '@mischnic/json-sourcemap': 0.1.1 - nullthrows: 1.1.1 + '@eslint-community/regexpp@4.10.0': {} - '@parcel/diagnostic@2.15.4': + '@eslint/eslintrc@2.1.4': dependencies: - '@mischnic/json-sourcemap': 0.1.1 - nullthrows: 1.1.1 + ajv: 6.12.6 + debug: 4.4.1 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color - '@parcel/error-overlay@2.15.4': {} + '@eslint/js@8.57.0': {} - '@parcel/events@2.15.0': {} + '@extra-number/significant-digits@1.3.9': {} - '@parcel/events@2.15.4': {} + '@fastify/busboy@2.1.1': {} - '@parcel/feature-flags@2.15.0': {} + '@gerrit0/mini-shiki@3.8.1': + dependencies: + '@shikijs/engine-oniguruma': 3.8.1 + '@shikijs/langs': 3.8.1 + '@shikijs/themes': 3.8.1 + '@shikijs/types': 3.8.1 + '@shikijs/vscode-textmate': 10.0.2 - '@parcel/feature-flags@2.15.4': {} + '@hapi/hoek@9.3.0': {} - '@parcel/fs@2.15.0(@parcel/core@2.15.4)': + '@hapi/topo@5.1.0': dependencies: - '@parcel/core': 2.15.4 - '@parcel/feature-flags': 2.15.0 - '@parcel/rust': 2.15.0 - '@parcel/types-internal': 2.15.0 - '@parcel/utils': 2.15.0 - '@parcel/watcher': 2.5.1 - '@parcel/workers': 2.15.0(@parcel/core@2.15.4) - transitivePeerDependencies: - - napi-wasm + '@hapi/hoek': 9.3.0 - '@parcel/fs@2.15.4(@parcel/core@2.15.4)': + '@humanwhocodes/config-array@0.11.14': dependencies: - '@parcel/core': 2.15.4 - '@parcel/feature-flags': 2.15.4 - '@parcel/rust': 2.15.4 - '@parcel/types-internal': 2.15.4 - '@parcel/utils': 2.15.4 - '@parcel/watcher': 2.5.1 - '@parcel/workers': 2.15.4(@parcel/core@2.15.4) + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.4.1 + minimatch: 3.1.2 transitivePeerDependencies: - - napi-wasm + - supports-color - '@parcel/graph@3.5.4': - dependencies: - '@parcel/feature-flags': 2.15.4 - nullthrows: 1.1.1 + '@humanwhocodes/module-importer@1.0.1': {} - '@parcel/logger@2.15.0': - dependencies: - '@parcel/diagnostic': 2.15.0 - '@parcel/events': 2.15.0 + '@humanwhocodes/object-schema@2.0.3': {} - '@parcel/logger@2.15.4': - dependencies: - '@parcel/diagnostic': 2.15.4 - '@parcel/events': 2.15.4 + '@img/sharp-darwin-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.0.4 + optional: true - '@parcel/markdown-ansi@2.15.0': - dependencies: - chalk: 4.1.2 + '@img/sharp-darwin-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.0.4 + optional: true - '@parcel/markdown-ansi@2.15.4': - dependencies: - chalk: 4.1.2 + '@img/sharp-libvips-darwin-arm64@1.0.4': + optional: true - '@parcel/namer-default@2.15.4(@parcel/core@2.15.4)': - dependencies: - '@parcel/diagnostic': 2.15.4 - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4) - nullthrows: 1.1.1 - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm + '@img/sharp-libvips-darwin-x64@1.0.4': + optional: true - '@parcel/node-resolver-core@3.6.0(@parcel/core@2.15.4)': - dependencies: - '@mischnic/json-sourcemap': 0.1.1 - '@parcel/diagnostic': 2.15.0 - '@parcel/fs': 2.15.0(@parcel/core@2.15.4) - '@parcel/rust': 2.15.0 - '@parcel/utils': 2.15.0 - nullthrows: 1.1.1 - semver: 7.7.2 - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm + '@img/sharp-libvips-linux-arm64@1.0.4': + optional: true - '@parcel/node-resolver-core@3.6.4(@parcel/core@2.15.4)': - dependencies: - '@mischnic/json-sourcemap': 0.1.1 - '@parcel/diagnostic': 2.15.4 - '@parcel/fs': 2.15.4(@parcel/core@2.15.4) - '@parcel/rust': 2.15.4 - '@parcel/utils': 2.15.4 - nullthrows: 1.1.1 - semver: 7.7.2 - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm + '@img/sharp-libvips-linux-arm@1.0.5': + optional: true - '@parcel/optimizer-css@2.15.4(@parcel/core@2.15.4)': - dependencies: - '@parcel/diagnostic': 2.15.4 - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4) - '@parcel/source-map': 2.1.1 - '@parcel/utils': 2.15.4 - browserslist: 4.25.1 - lightningcss: 1.30.1 - nullthrows: 1.1.1 - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm + '@img/sharp-libvips-linux-s390x@1.0.4': + optional: true - '@parcel/optimizer-html@2.15.4(@parcel/core@2.15.4)': - dependencies: - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4) - '@parcel/rust': 2.15.4 - '@parcel/utils': 2.15.4 - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm + '@img/sharp-libvips-linux-x64@1.0.4': + optional: true - '@parcel/optimizer-image@2.15.4(@parcel/core@2.15.4)': - dependencies: - '@parcel/core': 2.15.4 - '@parcel/diagnostic': 2.15.4 - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4) - '@parcel/rust': 2.15.4 - '@parcel/utils': 2.15.4 - '@parcel/workers': 2.15.4(@parcel/core@2.15.4) - transitivePeerDependencies: - - napi-wasm + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + optional: true - '@parcel/optimizer-svg@2.15.4(@parcel/core@2.15.4)': - dependencies: - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4) - '@parcel/rust': 2.15.4 - '@parcel/utils': 2.15.4 - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm + '@img/sharp-libvips-linuxmusl-x64@1.0.4': + optional: true - '@parcel/optimizer-swc@2.15.4(@parcel/core@2.15.4)': - dependencies: - '@parcel/diagnostic': 2.15.4 - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4) - '@parcel/source-map': 2.1.1 - '@parcel/utils': 2.15.4 - '@swc/core': 1.11.24 - nullthrows: 1.1.1 - transitivePeerDependencies: - - '@parcel/core' - - '@swc/helpers' - - napi-wasm - - '@parcel/package-manager@2.15.4(@parcel/core@2.15.4)': - dependencies: - '@parcel/core': 2.15.4 - '@parcel/diagnostic': 2.15.4 - '@parcel/fs': 2.15.4(@parcel/core@2.15.4) - '@parcel/logger': 2.15.4 - '@parcel/node-resolver-core': 3.6.4(@parcel/core@2.15.4) - '@parcel/types': 2.15.4(@parcel/core@2.15.4) - '@parcel/utils': 2.15.4 - '@parcel/workers': 2.15.4(@parcel/core@2.15.4) - '@swc/core': 1.11.24 - semver: 7.7.2 - transitivePeerDependencies: - - '@swc/helpers' - - napi-wasm + '@img/sharp-linux-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.0.4 + optional: true - '@parcel/packager-css@2.15.4(@parcel/core@2.15.4)': - dependencies: - '@parcel/diagnostic': 2.15.4 - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4) - '@parcel/source-map': 2.1.1 - '@parcel/utils': 2.15.4 - lightningcss: 1.30.1 - nullthrows: 1.1.1 - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm + '@img/sharp-linux-arm@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.0.5 + optional: true - '@parcel/packager-html@2.15.4(@parcel/core@2.15.4)': - dependencies: - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4) - '@parcel/rust': 2.15.4 - '@parcel/types': 2.15.4(@parcel/core@2.15.4) - '@parcel/utils': 2.15.4 - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm + '@img/sharp-linux-s390x@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.0.4 + optional: true - '@parcel/packager-js@2.15.4(@parcel/core@2.15.4)': - dependencies: - '@parcel/diagnostic': 2.15.4 - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4) - '@parcel/rust': 2.15.4 - '@parcel/source-map': 2.1.1 - '@parcel/types': 2.15.4(@parcel/core@2.15.4) - '@parcel/utils': 2.15.4 - globals: 13.24.0 - nullthrows: 1.1.1 - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm + '@img/sharp-linux-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.0.4 + optional: true - '@parcel/packager-raw@2.15.4(@parcel/core@2.15.4)': - dependencies: - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4) - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm - - '@parcel/packager-react-static@2.15.0(@parcel/core@2.15.4)': - dependencies: - '@parcel/node-resolver-core': 3.6.0(@parcel/core@2.15.4) - '@parcel/plugin': 2.15.0(@parcel/core@2.15.4) - '@parcel/rust': 2.15.0 - '@parcel/types': 2.15.0(@parcel/core@2.15.4) - '@parcel/utils': 2.15.0 - nullthrows: 1.1.1 - rsc-html-stream: 0.0.6 - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm + '@img/sharp-linuxmusl-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + optional: true + + '@img/sharp-linuxmusl-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + optional: true - '@parcel/packager-svg@2.15.4(@parcel/core@2.15.4)': + '@img/sharp-wasm32@0.33.5': dependencies: - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4) - '@parcel/rust': 2.15.4 - '@parcel/types': 2.15.4(@parcel/core@2.15.4) - '@parcel/utils': 2.15.4 - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm + '@emnapi/runtime': 1.4.3 + optional: true + + '@img/sharp-win32-ia32@0.33.5': + optional: true + + '@img/sharp-win32-x64@0.33.5': + optional: true - '@parcel/packager-wasm@2.15.4(@parcel/core@2.15.4)': + '@inquirer/confirm@5.1.9(@types/node@22.14.0)': dependencies: - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4) - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm + '@inquirer/core': 10.1.10(@types/node@22.14.0) + '@inquirer/type': 3.0.6(@types/node@22.14.0) + optionalDependencies: + '@types/node': 22.14.0 - '@parcel/plugin@2.15.0(@parcel/core@2.15.4)': + '@inquirer/core@10.1.10(@types/node@22.14.0)': dependencies: - '@parcel/types': 2.15.0(@parcel/core@2.15.4) - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm + '@inquirer/figures': 1.0.11 + '@inquirer/type': 3.0.6(@types/node@22.14.0) + ansi-escapes: 4.3.2 + cli-width: 4.1.0 + mute-stream: 2.0.0 + signal-exit: 4.1.0 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.2 + optionalDependencies: + '@types/node': 22.14.0 + + '@inquirer/figures@1.0.11': {} + + '@inquirer/type@3.0.6(@types/node@22.14.0)': + optionalDependencies: + '@types/node': 22.14.0 - '@parcel/plugin@2.15.4(@parcel/core@2.15.4)': + '@isaacs/cliui@8.0.2': dependencies: - '@parcel/types': 2.15.4(@parcel/core@2.15.4) - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 - '@parcel/profiler@2.15.0': + '@istanbuljs/load-nyc-config@1.1.0': dependencies: - '@parcel/diagnostic': 2.15.0 - '@parcel/events': 2.15.0 - '@parcel/types-internal': 2.15.0 - chrome-trace-event: 1.0.4 + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.1 + resolve-from: 5.0.0 - '@parcel/profiler@2.15.4': - dependencies: - '@parcel/diagnostic': 2.15.4 - '@parcel/events': 2.15.4 - '@parcel/types-internal': 2.15.4 - chrome-trace-event: 1.0.4 + '@istanbuljs/schema@0.1.3': {} - '@parcel/reporter-cli@2.15.4(@parcel/core@2.15.4)': + '@jest/console@29.7.0': dependencies: - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4) - '@parcel/types': 2.15.4(@parcel/core@2.15.4) - '@parcel/utils': 2.15.4 + '@jest/types': 29.6.3 + '@types/node': 22.14.0 chalk: 4.1.2 - term-size: 2.2.1 - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm - - '@parcel/reporter-dev-server@2.15.4(@parcel/core@2.15.4)': - dependencies: - '@parcel/codeframe': 2.15.4 - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4) - '@parcel/source-map': 2.1.1 - '@parcel/utils': 2.15.4 - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm + jest-message-util: 29.7.0 + jest-util: 29.7.0 + slash: 3.0.0 - '@parcel/reporter-tracer@2.15.4(@parcel/core@2.15.4)': + '@jest/core@29.7.0(babel-plugin-macros@3.1.0)': dependencies: - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4) - '@parcel/utils': 2.15.4 - chrome-trace-event: 1.0.4 - nullthrows: 1.1.1 + '@jest/console': 29.7.0 + '@jest/reporters': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 22.14.0 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.8.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@22.14.0)(babel-plugin-macros@3.1.0) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 + micromatch: 4.0.5 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-ansi: 6.0.1 transitivePeerDependencies: - - '@parcel/core' - - napi-wasm + - babel-plugin-macros + - supports-color + - ts-node - '@parcel/resolver-default@2.15.4(@parcel/core@2.15.4)': + '@jest/environment@29.7.0': dependencies: - '@parcel/node-resolver-core': 3.6.4(@parcel/core@2.15.4) - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4) - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 22.14.0 + jest-mock: 29.7.0 - '@parcel/runtime-browser-hmr@2.15.4(@parcel/core@2.15.4)': + '@jest/expect-utils@29.7.0': dependencies: - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4) - '@parcel/utils': 2.15.4 - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm + jest-get-type: 29.6.3 - '@parcel/runtime-js@2.15.4(@parcel/core@2.15.4)': + '@jest/expect@29.7.0': dependencies: - '@parcel/diagnostic': 2.15.4 - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4) - '@parcel/utils': 2.15.4 - nullthrows: 1.1.1 + expect: 29.7.0 + jest-snapshot: 29.7.0 transitivePeerDependencies: - - '@parcel/core' - - napi-wasm + - supports-color - '@parcel/runtime-rsc@2.15.0(@parcel/core@2.15.4)': + '@jest/fake-timers@29.7.0': dependencies: - '@parcel/plugin': 2.15.0(@parcel/core@2.15.4) - '@parcel/rust': 2.15.0 - '@parcel/utils': 2.15.0 - nullthrows: 1.1.1 - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm + '@jest/types': 29.6.3 + '@sinonjs/fake-timers': 10.0.2 + '@types/node': 22.14.0 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-util: 29.7.0 - '@parcel/runtime-rsc@2.15.4(@parcel/core@2.15.4)': + '@jest/globals@29.7.0': dependencies: - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4) - '@parcel/rust': 2.15.4 - '@parcel/utils': 2.15.4 - nullthrows: 1.1.1 + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/types': 29.6.3 + jest-mock: 29.7.0 transitivePeerDependencies: - - '@parcel/core' - - napi-wasm + - supports-color - '@parcel/runtime-service-worker@2.15.4(@parcel/core@2.15.4)': + '@jest/reporters@29.7.0': dependencies: - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4) - '@parcel/utils': 2.15.4 - nullthrows: 1.1.1 - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm - - '@parcel/rust-darwin-arm64@2.15.0': - optional: true - - '@parcel/rust-darwin-arm64@2.15.4': - optional: true - - '@parcel/rust-darwin-x64@2.15.0': - optional: true - - '@parcel/rust-darwin-x64@2.15.4': - optional: true - - '@parcel/rust-linux-arm-gnueabihf@2.15.0': - optional: true - - '@parcel/rust-linux-arm-gnueabihf@2.15.4': - optional: true - - '@parcel/rust-linux-arm64-gnu@2.15.0': - optional: true - - '@parcel/rust-linux-arm64-gnu@2.15.4': - optional: true - - '@parcel/rust-linux-arm64-musl@2.15.0': - optional: true - - '@parcel/rust-linux-arm64-musl@2.15.4': - optional: true - - '@parcel/rust-linux-x64-gnu@2.15.0': - optional: true - - '@parcel/rust-linux-x64-gnu@2.15.4': - optional: true - - '@parcel/rust-linux-x64-musl@2.15.0': - optional: true - - '@parcel/rust-linux-x64-musl@2.15.4': - optional: true - - '@parcel/rust-win32-x64-msvc@2.15.0': - optional: true - - '@parcel/rust-win32-x64-msvc@2.15.4': - optional: true - - '@parcel/rust@2.15.0': - optionalDependencies: - '@parcel/rust-darwin-arm64': 2.15.0 - '@parcel/rust-darwin-x64': 2.15.0 - '@parcel/rust-linux-arm-gnueabihf': 2.15.0 - '@parcel/rust-linux-arm64-gnu': 2.15.0 - '@parcel/rust-linux-arm64-musl': 2.15.0 - '@parcel/rust-linux-x64-gnu': 2.15.0 - '@parcel/rust-linux-x64-musl': 2.15.0 - '@parcel/rust-win32-x64-msvc': 2.15.0 - - '@parcel/rust@2.15.4': - optionalDependencies: - '@parcel/rust-darwin-arm64': 2.15.4 - '@parcel/rust-darwin-x64': 2.15.4 - '@parcel/rust-linux-arm-gnueabihf': 2.15.4 - '@parcel/rust-linux-arm64-gnu': 2.15.4 - '@parcel/rust-linux-arm64-musl': 2.15.4 - '@parcel/rust-linux-x64-gnu': 2.15.4 - '@parcel/rust-linux-x64-musl': 2.15.4 - '@parcel/rust-win32-x64-msvc': 2.15.4 - - '@parcel/source-map@2.1.1': - dependencies: - detect-libc: 1.0.3 - - '@parcel/transformer-babel@2.15.4(@parcel/core@2.15.4)': - dependencies: - '@parcel/diagnostic': 2.15.4 - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4) - '@parcel/source-map': 2.1.1 - '@parcel/utils': 2.15.4 - browserslist: 4.25.1 - json5: 2.2.3 - nullthrows: 1.1.1 - semver: 7.7.2 + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.25 + '@types/node': 22.14.0 + chalk: 4.1.2 + collect-v8-coverage: 1.0.1 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.0 + istanbul-lib-instrument: 6.0.2 + istanbul-lib-report: 3.0.0 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.5 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + jest-worker: 29.7.0 + slash: 3.0.0 + string-length: 4.0.2 + strip-ansi: 6.0.1 + v8-to-istanbul: 9.1.0 transitivePeerDependencies: - - '@parcel/core' - - napi-wasm + - supports-color - '@parcel/transformer-css@2.15.4(@parcel/core@2.15.4)': + '@jest/schemas@29.6.3': dependencies: - '@parcel/diagnostic': 2.15.4 - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4) - '@parcel/source-map': 2.1.1 - '@parcel/utils': 2.15.4 - browserslist: 4.25.1 - lightningcss: 1.30.1 - nullthrows: 1.1.1 - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm + '@sinclair/typebox': 0.27.8 - '@parcel/transformer-html@2.15.4(@parcel/core@2.15.4)': + '@jest/source-map@29.6.3': dependencies: - '@parcel/diagnostic': 2.15.4 - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4) - '@parcel/rust': 2.15.4 - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm + '@jridgewell/trace-mapping': 0.3.25 + callsites: 3.1.0 + graceful-fs: 4.2.11 - '@parcel/transformer-image@2.15.4(@parcel/core@2.15.4)': + '@jest/test-result@29.7.0': dependencies: - '@parcel/core': 2.15.4 - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4) - '@parcel/utils': 2.15.4 - '@parcel/workers': 2.15.4(@parcel/core@2.15.4) - nullthrows: 1.1.1 - transitivePeerDependencies: - - napi-wasm - - '@parcel/transformer-js@2.15.4(@parcel/core@2.15.4)': - dependencies: - '@parcel/core': 2.15.4 - '@parcel/diagnostic': 2.15.4 - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4) - '@parcel/rust': 2.15.4 - '@parcel/source-map': 2.1.1 - '@parcel/utils': 2.15.4 - '@parcel/workers': 2.15.4(@parcel/core@2.15.4) - '@swc/helpers': 0.5.15 - browserslist: 4.25.1 - nullthrows: 1.1.1 - regenerator-runtime: 0.14.1 - semver: 7.7.2 - transitivePeerDependencies: - - napi-wasm + '@jest/console': 29.7.0 + '@jest/types': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.4 + collect-v8-coverage: 1.0.1 - '@parcel/transformer-json@2.15.4(@parcel/core@2.15.4)': + '@jest/test-sequencer@29.7.0': dependencies: - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4) - json5: 2.2.3 - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm + '@jest/test-result': 29.7.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + slash: 3.0.0 - '@parcel/transformer-node@2.15.4(@parcel/core@2.15.4)': + '@jest/transform@29.7.0': dependencies: - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4) + '@babel/core': 7.27.7 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.25 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 2.0.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + micromatch: 4.0.5 + pirates: 4.0.5 + slash: 3.0.0 + write-file-atomic: 4.0.2 transitivePeerDependencies: - - '@parcel/core' - - napi-wasm + - supports-color - '@parcel/transformer-postcss@2.15.4(@parcel/core@2.15.4)': + '@jest/types@29.6.3': dependencies: - '@parcel/diagnostic': 2.15.4 - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4) - '@parcel/rust': 2.15.4 - '@parcel/utils': 2.15.4 - clone: 2.1.2 - nullthrows: 1.1.1 - postcss-value-parser: 4.2.0 - semver: 7.7.2 - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.4 + '@types/istanbul-reports': 3.0.1 + '@types/node': 22.14.0 + '@types/yargs': 17.0.24 + chalk: 4.1.2 - '@parcel/transformer-posthtml@2.15.4(@parcel/core@2.15.4)': + '@jridgewell/gen-mapping@0.3.8': dependencies: - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4) - '@parcel/utils': 2.15.4 - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.25 - '@parcel/transformer-raw@2.15.4(@parcel/core@2.15.4)': - dependencies: - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4) - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm + '@jridgewell/resolve-uri@3.1.0': {} - '@parcel/transformer-react-refresh-wrap@2.15.4(@parcel/core@2.15.4)': - dependencies: - '@parcel/error-overlay': 2.15.4 - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4) - '@parcel/utils': 2.15.4 - react-refresh: 0.16.0 - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm + '@jridgewell/set-array@1.2.1': {} - '@parcel/transformer-react-static@2.15.0(@parcel/core@2.15.4)': + '@jridgewell/source-map@0.3.6': dependencies: - '@parcel/plugin': 2.15.0(@parcel/core@2.15.4) - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 - '@parcel/transformer-svg@2.15.4(@parcel/core@2.15.4)': - dependencies: - '@parcel/diagnostic': 2.15.4 - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4) - '@parcel/rust': 2.15.4 - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm + '@jridgewell/sourcemap-codec@1.5.5': {} - '@parcel/types-internal@2.15.0': + '@jridgewell/trace-mapping@0.3.25': dependencies: - '@parcel/diagnostic': 2.15.0 - '@parcel/feature-flags': 2.15.0 - '@parcel/source-map': 2.1.1 - utility-types: 3.11.0 + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.5.5 - '@parcel/types-internal@2.15.4': + '@jridgewell/trace-mapping@0.3.9': dependencies: - '@parcel/diagnostic': 2.15.4 - '@parcel/feature-flags': 2.15.4 - '@parcel/source-map': 2.1.1 - utility-types: 3.11.0 + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.5.5 - '@parcel/types@2.15.0(@parcel/core@2.15.4)': + '@manypkg/find-root@1.1.0': dependencies: - '@parcel/types-internal': 2.15.0 - '@parcel/workers': 2.15.0(@parcel/core@2.15.4) - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm + '@babel/runtime': 7.24.1 + '@types/node': 12.20.55 + find-up: 4.1.0 + fs-extra: 8.1.0 - '@parcel/types@2.15.4(@parcel/core@2.15.4)': + '@manypkg/get-packages@1.1.3': dependencies: - '@parcel/types-internal': 2.15.4 - '@parcel/workers': 2.15.4(@parcel/core@2.15.4) - transitivePeerDependencies: - - '@parcel/core' - - napi-wasm + '@babel/runtime': 7.24.1 + '@changesets/types': 4.1.0 + '@manypkg/find-root': 1.1.0 + fs-extra: 8.1.0 + globby: 11.1.0 + read-yaml-file: 1.1.0 - '@parcel/utils@2.15.0': + '@mdx-js/mdx@3.0.1': dependencies: - '@parcel/codeframe': 2.15.0 - '@parcel/diagnostic': 2.15.0 - '@parcel/logger': 2.15.0 - '@parcel/markdown-ansi': 2.15.0 - '@parcel/rust': 2.15.0 - '@parcel/source-map': 2.1.1 - chalk: 4.1.2 - nullthrows: 1.1.1 + '@types/estree': 1.0.8 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdx': 2.0.12 + collapse-white-space: 2.1.0 + devlop: 1.1.0 + estree-util-build-jsx: 3.0.1 + estree-util-is-identifier-name: 3.0.0 + estree-util-to-js: 2.0.0 + estree-walker: 3.0.3 + hast-util-to-estree: 3.1.0 + hast-util-to-jsx-runtime: 2.3.0 + markdown-extensions: 2.0.0 + periscopic: 3.1.0 + remark-mdx: 3.0.1 + remark-parse: 11.0.0 + remark-rehype: 11.1.0 + source-map: 0.7.4 + unified: 11.0.4 + unist-util-position-from-estree: 2.0.0 + unist-util-stringify-position: 4.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.1 transitivePeerDependencies: - - napi-wasm + - supports-color - '@parcel/utils@2.15.4': + '@mdx-js/rollup@3.1.0(patch_hash=wjxfd5pqp7spa3snsugst7roxm)(rollup@4.43.0)': dependencies: - '@parcel/codeframe': 2.15.4 - '@parcel/diagnostic': 2.15.4 - '@parcel/logger': 2.15.4 - '@parcel/markdown-ansi': 2.15.4 - '@parcel/rust': 2.15.4 - '@parcel/source-map': 2.1.1 - chalk: 4.1.2 - nullthrows: 1.1.1 + '@mdx-js/mdx': 3.0.1 + '@rollup/pluginutils': 5.1.0(rollup@4.43.0) + rollup: 4.43.0 + source-map: 0.7.4 + vfile: 6.0.1 transitivePeerDependencies: - - napi-wasm - - '@parcel/watcher-android-arm64@2.5.1': - optional: true - - '@parcel/watcher-darwin-arm64@2.5.1': - optional: true + - supports-color - '@parcel/watcher-darwin-x64@2.5.1': - optional: true + '@mjackson/node-fetch-server@0.2.0': {} - '@parcel/watcher-freebsd-x64@2.5.1': - optional: true + '@mjackson/node-fetch-server@0.6.1': {} - '@parcel/watcher-linux-arm-glibc@2.5.1': - optional: true + '@mswjs/interceptors@0.37.6': + dependencies: + '@open-draft/deferred-promise': 2.2.0 + '@open-draft/logger': 0.3.0 + '@open-draft/until': 2.1.0 + is-node-process: 1.2.0 + outvariant: 1.4.3 + strict-event-emitter: 0.5.1 - '@parcel/watcher-linux-arm-musl@2.5.1': + '@napi-rs/wasm-runtime@0.2.11': + dependencies: + '@emnapi/core': 1.4.3 + '@emnapi/runtime': 1.4.3 + '@tybys/wasm-util': 0.9.0 optional: true - '@parcel/watcher-linux-arm64-glibc@2.5.1': - optional: true + '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': + dependencies: + eslint-scope: 5.1.1 - '@parcel/watcher-linux-arm64-musl@2.5.1': - optional: true + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 - '@parcel/watcher-linux-x64-glibc@2.5.1': - optional: true + '@nodelib/fs.stat@2.0.5': {} - '@parcel/watcher-linux-x64-musl@2.5.1': - optional: true + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.13.0 - '@parcel/watcher-win32-arm64@2.5.1': - optional: true + '@open-draft/deferred-promise@2.2.0': {} - '@parcel/watcher-win32-ia32@2.5.1': - optional: true + '@open-draft/logger@0.3.0': + dependencies: + is-node-process: 1.2.0 + outvariant: 1.4.3 - '@parcel/watcher-win32-x64@2.5.1': - optional: true + '@open-draft/until@2.1.0': {} - '@parcel/watcher@2.5.1': - dependencies: - detect-libc: 1.0.3 - is-glob: 4.0.3 - micromatch: 4.0.5 - node-addon-api: 7.1.1 - optionalDependencies: - '@parcel/watcher-android-arm64': 2.5.1 - '@parcel/watcher-darwin-arm64': 2.5.1 - '@parcel/watcher-darwin-x64': 2.5.1 - '@parcel/watcher-freebsd-x64': 2.5.1 - '@parcel/watcher-linux-arm-glibc': 2.5.1 - '@parcel/watcher-linux-arm-musl': 2.5.1 - '@parcel/watcher-linux-arm64-glibc': 2.5.1 - '@parcel/watcher-linux-arm64-musl': 2.5.1 - '@parcel/watcher-linux-x64-glibc': 2.5.1 - '@parcel/watcher-linux-x64-musl': 2.5.1 - '@parcel/watcher-win32-arm64': 2.5.1 - '@parcel/watcher-win32-ia32': 2.5.1 - '@parcel/watcher-win32-x64': 2.5.1 - - '@parcel/workers@2.15.0(@parcel/core@2.15.4)': - dependencies: - '@parcel/core': 2.15.4 - '@parcel/diagnostic': 2.15.0 - '@parcel/logger': 2.15.0 - '@parcel/profiler': 2.15.0 - '@parcel/types-internal': 2.15.0 - '@parcel/utils': 2.15.0 - nullthrows: 1.1.1 - transitivePeerDependencies: - - napi-wasm + '@oxc-project/runtime@0.61.2': {} - '@parcel/workers@2.15.4(@parcel/core@2.15.4)': - dependencies: - '@parcel/core': 2.15.4 - '@parcel/diagnostic': 2.15.4 - '@parcel/logger': 2.15.4 - '@parcel/profiler': 2.15.4 - '@parcel/types-internal': 2.15.4 - '@parcel/utils': 2.15.4 - nullthrows: 1.1.1 - transitivePeerDependencies: - - napi-wasm + '@oxc-project/types@0.61.2': {} '@pkgjs/parseargs@0.11.0': optional: true @@ -12666,7 +11119,7 @@ snapshots: transitivePeerDependencies: - encoding - '@remix-run/node-fetch-server@0.8.1': {} + '@remix-run/node-fetch-server@0.12.0': {} '@remix-run/node-fetch-server@0.9.0': {} @@ -12779,7 +11232,7 @@ snapshots: '@rollup/plugin-replace@6.0.2(rollup@4.43.0)': dependencies: '@rollup/pluginutils': 5.1.0(rollup@4.43.0) - magic-string: 0.30.18 + magic-string: 0.30.21 optionalDependencies: rollup: 4.43.0 @@ -12940,16 +11393,15 @@ snapshots: '@swc/core-win32-arm64-msvc': 1.11.24 '@swc/core-win32-ia32-msvc': 1.11.24 '@swc/core-win32-x64-msvc': 1.11.24 + optional: true - '@swc/counter@0.1.3': {} - - '@swc/helpers@0.5.15': - dependencies: - tslib: 2.8.1 + '@swc/counter@0.1.3': + optional: true '@swc/types@0.1.21': dependencies: '@swc/counter': 0.1.3 + optional: true '@testing-library/dom@10.4.0': dependencies: @@ -12972,12 +11424,12 @@ snapshots: lodash: 4.17.21 redent: 3.0.0 - '@testing-library/react@16.3.0(@testing-library/dom@10.4.0)(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@testing-library/react@16.3.0(@testing-library/dom@10.4.0)(@types/react-dom@18.2.7)(@types/react@18.2.18)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: '@babel/runtime': 7.24.1 '@testing-library/dom': 10.4.0 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) optionalDependencies: '@types/react': 18.2.18 '@types/react-dom': 18.2.7 @@ -13029,9 +11481,10 @@ snapshots: '@types/connect': 3.4.38 '@types/node': 22.14.0 - '@types/compression@1.7.5': + '@types/compression@1.8.1': dependencies: '@types/express': 4.17.21 + '@types/node': 22.14.0 '@types/connect@3.4.38': dependencies: @@ -13051,6 +11504,16 @@ snapshots: '@types/dedent@0.7.2': {} + '@types/eslint-scope@3.7.7': + dependencies: + '@types/eslint': 9.6.1 + '@types/estree': 1.0.8 + + '@types/eslint@9.6.1': + dependencies: + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 + '@types/estree-jsx@1.0.5': dependencies: '@types/estree': 1.0.8 @@ -13173,7 +11636,7 @@ snapshots: '@types/minimist@1.2.2': {} - '@types/morgan@1.9.9': + '@types/morgan@1.9.10': dependencies: '@types/node': 22.14.0 @@ -13193,8 +11656,6 @@ snapshots: '@types/npmcli__package-json@4.0.4': {} - '@types/parcel-env@0.0.8': {} - '@types/parse-json@4.0.2': {} '@types/prop-types@15.7.5': {} @@ -13480,12 +11941,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@vanilla-extract/compiler@0.3.1(@types/node@22.14.0)(babel-plugin-macros@3.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0)': + '@vanilla-extract/compiler@0.3.1(@types/node@22.14.0)(babel-plugin-macros@3.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0)': dependencies: '@vanilla-extract/css': 1.17.4(babel-plugin-macros@3.1.0) '@vanilla-extract/integration': 8.0.4(babel-plugin-macros@3.1.0) - vite: 6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0) - vite-node: 3.2.4(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0) + vite: 6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0) + vite-node: 3.2.4(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -13536,11 +11997,11 @@ snapshots: '@vanilla-extract/private@1.0.9': {} - '@vanilla-extract/vite-plugin@5.1.1(@types/node@22.14.0)(babel-plugin-macros@3.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(rolldown-vite@6.3.0-beta.5(@types/node@22.14.0)(esbuild@0.25.4)(jiti@2.4.2)(tsx@4.19.3)(typescript@5.4.5)(yaml@2.8.0))(tsx@4.19.3)(yaml@2.8.0)': + '@vanilla-extract/vite-plugin@5.1.1(@types/node@22.14.0)(babel-plugin-macros@3.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(rolldown-vite@6.3.0-beta.5(@types/node@22.14.0)(esbuild@0.25.4)(jiti@2.4.2)(terser@5.44.1)(tsx@4.19.3)(typescript@5.4.5)(yaml@2.8.0))(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0)': dependencies: - '@vanilla-extract/compiler': 0.3.1(@types/node@22.14.0)(babel-plugin-macros@3.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0) + '@vanilla-extract/compiler': 0.3.1(@types/node@22.14.0)(babel-plugin-macros@3.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0) '@vanilla-extract/integration': 8.0.4(babel-plugin-macros@3.1.0) - vite: rolldown-vite@6.3.0-beta.5(@types/node@22.14.0)(esbuild@0.25.4)(jiti@2.4.2)(tsx@4.19.3)(typescript@5.4.5)(yaml@2.8.0) + vite: rolldown-vite@6.3.0-beta.5(@types/node@22.14.0)(esbuild@0.25.4)(jiti@2.4.2)(terser@5.44.1)(tsx@4.19.3)(typescript@5.4.5)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -13556,11 +12017,11 @@ snapshots: - tsx - yaml - '@vanilla-extract/vite-plugin@5.1.1(@types/node@22.14.0)(babel-plugin-macros@3.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(vite@5.1.3(@types/node@22.14.0)(lightningcss@1.30.1))(yaml@2.8.0)': + '@vanilla-extract/vite-plugin@5.1.1(@types/node@22.14.0)(babel-plugin-macros@3.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(vite@5.1.3(@types/node@22.14.0)(lightningcss@1.30.1)(terser@5.44.1))(yaml@2.8.0)': dependencies: - '@vanilla-extract/compiler': 0.3.1(@types/node@22.14.0)(babel-plugin-macros@3.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0) + '@vanilla-extract/compiler': 0.3.1(@types/node@22.14.0)(babel-plugin-macros@3.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0) '@vanilla-extract/integration': 8.0.4(babel-plugin-macros@3.1.0) - vite: 5.1.3(@types/node@22.14.0)(lightningcss@1.30.1)(terser@5.15.0) + vite: 5.1.3(@types/node@22.14.0)(lightningcss@1.30.1)(terser@5.44.1) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -13576,11 +12037,11 @@ snapshots: - tsx - yaml - '@vanilla-extract/vite-plugin@5.1.1(@types/node@22.14.0)(babel-plugin-macros@3.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0))(yaml@2.8.0)': + '@vanilla-extract/vite-plugin@5.1.1(@types/node@22.14.0)(babel-plugin-macros@3.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0))(yaml@2.8.0)': dependencies: - '@vanilla-extract/compiler': 0.3.1(@types/node@22.14.0)(babel-plugin-macros@3.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0) + '@vanilla-extract/compiler': 0.3.1(@types/node@22.14.0)(babel-plugin-macros@3.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0) '@vanilla-extract/integration': 8.0.4(babel-plugin-macros@3.1.0) - vite: 6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0) + vite: 6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -13596,11 +12057,11 @@ snapshots: - tsx - yaml - '@vanilla-extract/vite-plugin@5.1.1(@types/node@22.14.0)(babel-plugin-macros@3.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(vite@7.0.0-beta.0(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0))(yaml@2.8.0)': + '@vanilla-extract/vite-plugin@5.1.1(@types/node@22.14.0)(babel-plugin-macros@3.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(vite@7.0.0-beta.0(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0))(yaml@2.8.0)': dependencies: - '@vanilla-extract/compiler': 0.3.1(@types/node@22.14.0)(babel-plugin-macros@3.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0) + '@vanilla-extract/compiler': 0.3.1(@types/node@22.14.0)(babel-plugin-macros@3.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0) '@vanilla-extract/integration': 8.0.4(babel-plugin-macros@3.1.0) - vite: 7.0.0-beta.0(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0) + vite: 7.0.0-beta.0(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -13616,7 +12077,7 @@ snapshots: - tsx - yaml - '@vitejs/plugin-react@4.5.2(vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0))': + '@vitejs/plugin-react@4.5.2(vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0))': dependencies: '@babel/core': 7.27.7 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.27.7) @@ -13624,38 +12085,124 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.11 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0) + vite: 6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0) transitivePeerDependencies: - supports-color - '@vitejs/plugin-rsc@0.4.30(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(vite@6.4.1(@types/node@20.11.30)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0))': + '@vitejs/plugin-rsc@0.5.7(react-dom@19.2.3(react@19.2.3))(react-server-dom-webpack@19.2.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(webpack@5.103.0))(react@19.2.3)(vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0))': dependencies: - '@remix-run/node-fetch-server': 0.8.1 - es-module-lexer: 1.7.0 + '@remix-run/node-fetch-server': 0.12.0 + es-module-lexer: 2.0.0 estree-walker: 3.0.3 - magic-string: 0.30.18 + magic-string: 0.30.21 periscopic: 4.0.2 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + strip-literal: 3.1.0 turbo-stream: 3.1.0 - vite: 6.4.1(@types/node@20.11.30)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0) - vitefu: 1.1.1(vite@6.4.1(@types/node@20.11.30)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0)) + vite: 6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0) + vitefu: 1.1.1(vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0)) + optionalDependencies: + react-server-dom-webpack: 19.2.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(webpack@5.103.0) - '@vitejs/plugin-rsc@0.4.30(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0))': + '@vitejs/plugin-rsc@0.5.7(react-dom@19.3.0-canary-d763f313-20251210(react@19.3.0-canary-d763f313-20251210))(react-server-dom-webpack@19.2.3(react-dom@19.3.0-canary-d763f313-20251210(react@19.3.0-canary-d763f313-20251210))(react@19.3.0-canary-d763f313-20251210)(webpack@5.103.0(@swc/core@1.11.24)(esbuild@0.25.4)))(react@19.3.0-canary-d763f313-20251210)(vite@6.4.1(@types/node@20.11.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0))': dependencies: - '@remix-run/node-fetch-server': 0.8.1 - es-module-lexer: 1.7.0 + '@remix-run/node-fetch-server': 0.12.0 + es-module-lexer: 2.0.0 estree-walker: 3.0.3 - magic-string: 0.30.18 + magic-string: 0.30.21 periscopic: 4.0.2 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) + react: 19.3.0-canary-d763f313-20251210 + react-dom: 19.3.0-canary-d763f313-20251210(react@19.3.0-canary-d763f313-20251210) + strip-literal: 3.1.0 turbo-stream: 3.1.0 - vite: 6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0) - vitefu: 1.1.1(vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0)) + vite: 6.4.1(@types/node@20.11.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0) + vitefu: 1.1.1(vite@6.4.1(@types/node@20.11.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0)) + optionalDependencies: + react-server-dom-webpack: 19.2.3(react-dom@19.3.0-canary-d763f313-20251210(react@19.3.0-canary-d763f313-20251210))(react@19.3.0-canary-d763f313-20251210)(webpack@5.103.0(@swc/core@1.11.24)(esbuild@0.25.4)) '@web3-storage/multipart-parser@1.0.0': {} + '@webassemblyjs/ast@1.14.1': + dependencies: + '@webassemblyjs/helper-numbers': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + + '@webassemblyjs/floating-point-hex-parser@1.13.2': {} + + '@webassemblyjs/helper-api-error@1.13.2': {} + + '@webassemblyjs/helper-buffer@1.14.1': {} + + '@webassemblyjs/helper-numbers@1.13.2': + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.13.2 + '@webassemblyjs/helper-api-error': 1.13.2 + '@xtuc/long': 4.2.2 + + '@webassemblyjs/helper-wasm-bytecode@1.13.2': {} + + '@webassemblyjs/helper-wasm-section@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/wasm-gen': 1.14.1 + + '@webassemblyjs/ieee754@1.13.2': + dependencies: + '@xtuc/ieee754': 1.2.0 + + '@webassemblyjs/leb128@1.13.2': + dependencies: + '@xtuc/long': 4.2.2 + + '@webassemblyjs/utf8@1.13.2': {} + + '@webassemblyjs/wasm-edit@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/helper-wasm-section': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-opt': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + '@webassemblyjs/wast-printer': 1.14.1 + + '@webassemblyjs/wasm-gen@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 + + '@webassemblyjs/wasm-opt@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + + '@webassemblyjs/wasm-parser@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-api-error': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 + + '@webassemblyjs/wast-printer@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@xtuc/long': 4.2.2 + + '@xtuc/ieee754@1.2.0': {} + + '@xtuc/long@4.2.2': {} + '@zxing/text-encoding@0.9.0': optional: true @@ -13670,10 +12217,18 @@ snapshots: mime-types: 2.1.35 negotiator: 0.6.3 + acorn-import-phases@1.0.4(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + acorn-jsx@5.3.2(acorn@8.15.0): dependencies: acorn: 8.15.0 + acorn-loose@8.5.2: + dependencies: + acorn: 8.15.0 + acorn-walk@8.3.2: {} acorn@8.14.0: {} @@ -13692,6 +12247,15 @@ snapshots: transitivePeerDependencies: - supports-color + ajv-formats@2.1.1(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + + ajv-keywords@5.1.0(ajv@8.17.1): + dependencies: + ajv: 8.17.1 + fast-deep-equal: 3.1.3 + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -13699,6 +12263,13 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.0 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + ansi-colors@4.1.3: {} ansi-escapes@4.3.2: @@ -14009,12 +12580,10 @@ snapshots: balanced-match@3.0.1: {} - base-x@3.0.11: - dependencies: - safe-buffer: 5.2.1 - base64-js@1.5.1: {} + baseline-browser-mapping@2.9.6: {} + basic-auth@2.0.1: dependencies: safe-buffer: 5.1.2 @@ -14079,16 +12648,13 @@ snapshots: dependencies: pako: 0.2.9 - browserify-zlib@0.2.0: + browserslist@4.28.1: dependencies: - pako: 1.0.11 - - browserslist@4.25.1: - dependencies: - caniuse-lite: 1.0.30001726 - electron-to-chromium: 1.5.178 - node-releases: 2.0.19 - update-browserslist-db: 1.1.3(browserslist@4.25.1) + baseline-browser-mapping: 2.9.6 + caniuse-lite: 1.0.30001760 + electron-to-chromium: 1.5.267 + node-releases: 2.0.27 + update-browserslist-db: 1.2.2(browserslist@4.28.1) bser@2.1.1: dependencies: @@ -14101,8 +12667,6 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 - builtin-status-codes@3.0.0: {} - bundle-require@5.1.0(esbuild@0.25.0): dependencies: esbuild: 0.25.0 @@ -14142,7 +12706,7 @@ snapshots: camelcase@6.3.0: {} - caniuse-lite@1.0.30001726: {} + caniuse-lite@1.0.30001760: {} ccount@2.0.1: {} @@ -14247,8 +12811,6 @@ snapshots: clone@1.0.4: {} - clone@2.1.2: {} - co@4.6.0: {} collapse-white-space@2.1.0: {} @@ -14283,10 +12845,7 @@ snapshots: comma-separated-tokens@2.0.3: {} - commander@12.1.0: {} - - commander@2.20.3: - optional: true + commander@2.20.3: {} commander@4.1.1: {} @@ -14300,13 +12859,13 @@ snapshots: dependencies: mime-db: 1.54.0 - compression@1.8.0: + compression@1.8.1: dependencies: bytes: 3.1.2 compressible: 2.0.18 debug: 2.6.9 negotiator: 0.6.4 - on-headers: 1.0.2 + on-headers: 1.1.0 safe-buffer: 5.2.1 vary: 1.1.2 transitivePeerDependencies: @@ -14348,7 +12907,7 @@ snapshots: core-js-compat@3.43.0: dependencies: - browserslist: 4.25.1 + browserslist: 4.28.1 core-util-is@1.0.3: {} @@ -14537,8 +13096,6 @@ snapshots: detect-indent@6.1.0: {} - detect-libc@1.0.3: {} - detect-libc@2.0.3: {} detect-newline@3.1.0: {} @@ -14594,14 +13151,8 @@ snapshots: domelementtype: 2.3.0 domhandler: 5.0.3 - dotenv-expand@11.0.7: - dependencies: - dotenv: 16.5.0 - dotenv-json@1.0.0: {} - dotenv@16.5.0: {} - dotenv@8.6.0: {} dox@1.0.0: @@ -14627,7 +13178,7 @@ snapshots: ee-first@1.1.1: {} - electron-to-chromium@1.5.178: {} + electron-to-chromium@1.5.267: {} emittery@0.13.1: {} @@ -14648,6 +13199,11 @@ snapshots: dependencies: once: 1.4.0 + enhanced-resolve@5.18.3: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.0 + enquirer@2.3.6: dependencies: ansi-colors: 4.1.3 @@ -14732,6 +13288,8 @@ snapshots: es-module-lexer@1.7.0: {} + es-module-lexer@2.0.0: {} + es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 @@ -15047,7 +13605,7 @@ snapshots: dependencies: eslint: 8.57.0 - eslint-plugin-react-hooks@7.1.0-canary-fd524fe0-20251121(eslint@8.57.0): + eslint-plugin-react-hooks@7.1.0-canary-b061b597-20251212(eslint@8.57.0): dependencies: '@babel/core': 7.27.7 '@babel/parser': 7.27.7 @@ -15328,6 +13886,8 @@ snapshots: fast-safe-stringify@2.1.1: {} + fast-uri@3.1.0: {} + fastq@1.13.0: dependencies: reusify: 1.0.4 @@ -15385,7 +13945,7 @@ snapshots: fix-dts-default-cjs-exports@1.0.1: dependencies: - magic-string: 0.30.18 + magic-string: 0.30.21 mlly: 1.7.4 rollup: 4.43.0 @@ -15484,8 +14044,6 @@ snapshots: get-package-type@0.1.0: {} - get-port@4.2.0: {} - get-port@5.1.1: {} get-port@7.1.0: {} @@ -16338,6 +14896,12 @@ snapshots: jest-util: 29.7.0 string-length: 4.0.2 + jest-worker@27.5.1: + dependencies: + '@types/node': 22.14.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + jest-worker@29.7.0: dependencies: '@types/node': 22.14.0 @@ -16372,6 +14936,8 @@ snapshots: js-tokens@4.0.0: {} + js-tokens@9.0.1: {} + js-yaml@3.14.1: dependencies: argparse: 1.0.10 @@ -16423,6 +14989,8 @@ snapshots: json-schema-traverse@0.4.1: {} + json-schema-traverse@1.0.0: {} + json-stable-stringify-without-jsonify@1.0.1: {} json5@1.0.2: @@ -16546,21 +15114,6 @@ snapshots: dependencies: uc.micro: 2.1.0 - lmdb@2.8.5: - dependencies: - msgpackr: 1.11.2 - node-addon-api: 6.1.0 - node-gyp-build-optional-packages: 5.1.1 - ordered-binary: 1.5.3 - weak-lru-cache: 1.2.2 - optionalDependencies: - '@lmdb/lmdb-darwin-arm64': 2.8.5 - '@lmdb/lmdb-darwin-x64': 2.8.5 - '@lmdb/lmdb-linux-arm': 2.8.5 - '@lmdb/lmdb-linux-arm64': 2.8.5 - '@lmdb/lmdb-linux-x64': 2.8.5 - '@lmdb/lmdb-win32-x64': 2.8.5 - load-tsconfig@0.2.5: {} load-yaml-file@0.2.0: @@ -16570,6 +15123,8 @@ snapshots: pify: 4.0.1 strip-bom: 3.0.0 + loader-runner@4.3.1: {} + locate-path@5.0.0: dependencies: p-locate: 4.1.0 @@ -16619,7 +15174,7 @@ snapshots: lz-string@1.5.0: {} - magic-string@0.30.18: + magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -17389,13 +15944,13 @@ snapshots: modern-ahocorasick@1.0.1: {} - morgan@1.10.0: + morgan@1.10.1: dependencies: basic-auth: 2.0.1 debug: 2.6.9 depd: 2.0.0 on-finished: 2.3.0 - on-headers: 1.0.2 + on-headers: 1.1.0 transitivePeerDependencies: - supports-color @@ -17407,22 +15962,6 @@ snapshots: ms@2.1.3: {} - msgpackr-extract@3.0.3: - dependencies: - node-gyp-build-optional-packages: 5.2.2 - optionalDependencies: - '@msgpackr-extract/msgpackr-extract-darwin-arm64': 3.0.3 - '@msgpackr-extract/msgpackr-extract-darwin-x64': 3.0.3 - '@msgpackr-extract/msgpackr-extract-linux-arm': 3.0.3 - '@msgpackr-extract/msgpackr-extract-linux-arm64': 3.0.3 - '@msgpackr-extract/msgpackr-extract-linux-x64': 3.0.3 - '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.3 - optional: true - - msgpackr@1.11.2: - optionalDependencies: - msgpackr-extract: 3.0.3 - msw@2.7.5(@types/node@22.14.0)(typescript@5.4.5): dependencies: '@bundled-es-modules/cookie': 2.0.1 @@ -17468,25 +16007,14 @@ snapshots: negotiator@0.6.4: {} - netmask@2.0.2: {} - - node-addon-api@6.1.0: {} + neo-async@2.6.2: {} - node-addon-api@7.1.1: {} + netmask@2.0.2: {} node-fetch@2.6.7: dependencies: whatwg-url: 5.0.0 - node-gyp-build-optional-packages@5.1.1: - dependencies: - detect-libc: 2.0.3 - - node-gyp-build-optional-packages@5.2.2: - dependencies: - detect-libc: 2.0.3 - optional: true - node-int64@0.4.0: {} node-mocks-http@1.14.1: @@ -17504,7 +16032,7 @@ snapshots: range-parser: 1.2.1 type-is: 1.6.18 - node-releases@2.0.19: {} + node-releases@2.0.27: {} node-webtokens@1.0.4: {} @@ -17530,8 +16058,6 @@ snapshots: dependencies: boolbase: 1.0.0 - nullthrows@1.1.1: {} - nwsapi@2.2.4: {} object-assign@4.1.1: {} @@ -17588,7 +16114,7 @@ snapshots: dependencies: ee-first: 1.1.1 - on-headers@1.0.2: {} + on-headers@1.1.0: {} once@1.4.0: dependencies: @@ -17607,8 +16133,6 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - ordered-binary@1.5.3: {} - os-tmpdir@1.0.2: {} outdent@0.5.0: {} @@ -17661,29 +16185,6 @@ snapshots: pako@0.2.9: {} - pako@1.0.11: {} - - parcel@2.15.4: - dependencies: - '@parcel/config-default': 2.15.4(@parcel/core@2.15.4) - '@parcel/core': 2.15.4 - '@parcel/diagnostic': 2.15.4 - '@parcel/events': 2.15.4 - '@parcel/feature-flags': 2.15.4 - '@parcel/fs': 2.15.4(@parcel/core@2.15.4) - '@parcel/logger': 2.15.4 - '@parcel/package-manager': 2.15.4(@parcel/core@2.15.4) - '@parcel/reporter-cli': 2.15.4(@parcel/core@2.15.4) - '@parcel/reporter-dev-server': 2.15.4(@parcel/core@2.15.4) - '@parcel/reporter-tracer': 2.15.4(@parcel/core@2.15.4) - '@parcel/utils': 2.15.4 - chalk: 4.1.2 - commander: 12.1.0 - get-port: 4.2.0 - transitivePeerDependencies: - - '@swc/helpers' - - napi-wasm - parent-module@1.0.1: dependencies: callsites: 3.1.0 @@ -17729,8 +16230,6 @@ snapshots: parseurl@1.3.3: {} - path-browserify@1.0.1: {} - path-exists@4.0.0: {} path-is-absolute@1.0.1: {} @@ -17932,8 +16431,6 @@ snapshots: punycode.js@2.3.1: {} - punycode@1.4.1: {} - punycode@2.3.0: {} pure-rand@6.0.2: {} @@ -17946,8 +16443,6 @@ snapshots: dependencies: side-channel: 1.1.0 - querystring-es3@0.2.1: {} - querystringify@2.2.0: {} queue-microtask@1.2.3: {} @@ -17969,31 +16464,49 @@ snapshots: iconv-lite: 0.4.24 unpipe: 1.0.0 - react-dom@19.1.0(react@19.1.0): + react-dom@19.2.3(react@19.2.3): dependencies: - react: 19.1.0 - scheduler: 0.26.0 + react: 19.2.3 + scheduler: 0.27.0 + + react-dom@19.3.0-canary-d763f313-20251210(react@19.3.0-canary-d763f313-20251210): + dependencies: + react: 19.3.0-canary-d763f313-20251210 + scheduler: 0.28.0-canary-d763f313-20251210 react-is@19.1.0: {} react-refresh@0.14.2: {} - react-refresh@0.16.0: {} - react-refresh@0.17.0: {} - react-server-dom-parcel@19.2.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + react-server-dom-webpack@19.2.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(webpack@5.103.0): dependencies: - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) + acorn-loose: 8.5.2 + neo-async: 2.6.2 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + webpack: 5.103.0 + webpack-sources: 3.3.3 - react-test-renderer@19.1.0(react@19.1.0): + react-server-dom-webpack@19.2.3(react-dom@19.3.0-canary-d763f313-20251210(react@19.3.0-canary-d763f313-20251210))(react@19.3.0-canary-d763f313-20251210)(webpack@5.103.0(@swc/core@1.11.24)(esbuild@0.25.4)): dependencies: - react: 19.1.0 + acorn-loose: 8.5.2 + neo-async: 2.6.2 + react: 19.3.0-canary-d763f313-20251210 + react-dom: 19.3.0-canary-d763f313-20251210(react@19.3.0-canary-d763f313-20251210) + webpack: 5.103.0(@swc/core@1.11.24)(esbuild@0.25.4) + webpack-sources: 3.3.3 + + react-test-renderer@19.1.0(react@19.2.3): + dependencies: + react: 19.2.3 react-is: 19.1.0 scheduler: 0.26.0 - react@19.1.0: {} + react@19.2.3: {} + + react@19.3.0-canary-d763f313-20251210: {} read-cache@1.0.0: dependencies: @@ -18155,16 +16668,18 @@ snapshots: mdast-util-to-markdown: 1.5.0 unified: 10.1.2 - remix-utils@8.7.0(react-router@packages+react-router)(react@19.1.0)(zod@3.24.2): + remix-utils@8.7.0(react-router@packages+react-router)(react@19.2.3)(zod@3.24.2): dependencies: type-fest: 4.40.1 optionalDependencies: - react: 19.1.0 + react: 19.2.3 react-router: link:packages/react-router zod: 3.24.2 require-directory@2.1.1: {} + require-from-string@2.0.2: {} + require-like@0.1.2: {} require-main-filename@2.0.0: {} @@ -18210,7 +16725,7 @@ snapshots: rndm@1.2.0: {} - rolldown-vite@6.3.0-beta.3(@types/node@22.14.0)(esbuild@0.25.4)(jiti@2.4.2)(tsx@4.19.3)(typescript@5.4.5)(yaml@2.8.0): + rolldown-vite@6.3.0-beta.3(@types/node@22.14.0)(esbuild@0.25.4)(jiti@2.4.2)(terser@5.44.1)(tsx@4.19.3)(typescript@5.4.5)(yaml@2.8.0): dependencies: '@oxc-project/runtime': 0.61.2 lightningcss: 1.30.1 @@ -18223,12 +16738,13 @@ snapshots: esbuild: 0.25.4 fsevents: 2.3.3 jiti: 2.4.2 + terser: 5.44.1 tsx: 4.19.3 yaml: 2.8.0 transitivePeerDependencies: - typescript - rolldown-vite@6.3.0-beta.5(@types/node@22.14.0)(esbuild@0.25.4)(jiti@2.4.2)(tsx@4.19.3)(typescript@5.4.5)(yaml@2.8.0): + rolldown-vite@6.3.0-beta.5(@types/node@22.14.0)(esbuild@0.25.4)(jiti@2.4.2)(terser@5.44.1)(tsx@4.19.3)(typescript@5.4.5)(yaml@2.8.0): dependencies: '@oxc-project/runtime': 0.61.2 lightningcss: 1.30.1 @@ -18241,6 +16757,7 @@ snapshots: esbuild: 0.25.4 fsevents: 2.3.3 jiti: 2.4.2 + terser: 5.44.1 tsx: 4.19.3 yaml: 2.8.0 transitivePeerDependencies: @@ -18318,8 +16835,6 @@ snapshots: rrweb-cssom@0.6.0: {} - rsc-html-stream@0.0.6: {} - run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -18359,6 +16874,17 @@ snapshots: scheduler@0.26.0: {} + scheduler@0.27.0: {} + + scheduler@0.28.0-canary-d763f313-20251210: {} + + schema-utils@4.3.3: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 8.17.1 + ajv-formats: 2.1.1(ajv@8.17.1) + ajv-keywords: 5.1.0(ajv@8.17.1) + semver@5.7.1: {} semver@6.3.1: {} @@ -18609,13 +17135,6 @@ snapshots: stoppable@1.1.0: {} - stream-http@3.2.0: - dependencies: - builtin-status-codes: 3.0.0 - inherits: 2.0.4 - readable-stream: 3.6.2 - xtend: 4.0.2 - stream-shift@1.0.3: {} stream-transform@2.1.3: @@ -18708,6 +17227,10 @@ snapshots: strip-json-comments@3.1.1: {} + strip-literal@3.1.0: + dependencies: + js-tokens: 9.0.1 + style-to-object@0.4.4: dependencies: inline-style-parser: 0.1.1 @@ -18764,6 +17287,8 @@ snapshots: symbol-tree@3.2.4: {} + tapable@2.3.0: {} + tar-fs@2.1.3: dependencies: chownr: 1.1.4 @@ -18781,13 +17306,33 @@ snapshots: term-size@2.2.1: {} - terser@5.15.0: + terser-webpack-plugin@5.3.15(@swc/core@1.11.24)(esbuild@0.25.4)(webpack@5.103.0(@swc/core@1.11.24)(esbuild@0.25.4)): + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + jest-worker: 27.5.1 + schema-utils: 4.3.3 + serialize-javascript: 6.0.2 + terser: 5.44.1 + webpack: 5.103.0(@swc/core@1.11.24)(esbuild@0.25.4) + optionalDependencies: + '@swc/core': 1.11.24 + esbuild: 0.25.4 + + terser-webpack-plugin@5.3.15(webpack@5.103.0): + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + jest-worker: 27.5.1 + schema-utils: 4.3.3 + serialize-javascript: 6.0.2 + terser: 5.44.1 + webpack: 5.103.0 + + terser@5.44.1: dependencies: '@jridgewell/source-map': 0.3.6 acorn: 8.15.0 commander: 2.20.3 source-map-support: 0.5.21 - optional: true test-exclude@6.0.0: dependencies: @@ -19145,9 +17690,9 @@ snapshots: unpipe@1.0.0: {} - update-browserslist-db@1.1.3(browserslist@4.25.1): + update-browserslist-db@1.2.2(browserslist@4.28.1): dependencies: - browserslist: 4.25.1 + browserslist: 4.28.1 escalade: 3.2.0 picocolors: 1.1.1 @@ -19160,11 +17705,6 @@ snapshots: querystringify: 2.2.0 requires-port: 1.0.0 - url@0.11.4: - dependencies: - punycode: 1.4.1 - qs: 6.14.0 - util-deprecate@1.0.2: {} util@0.12.5: @@ -19175,8 +17715,6 @@ snapshots: is-typed-array: 1.1.13 which-typed-array: 1.1.15 - utility-types@3.11.0: {} - utils-merge@1.0.1: {} uuid@3.4.0: {} @@ -19236,7 +17774,7 @@ snapshots: unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 - vite-env-only@3.0.1(rolldown-vite@6.3.0-beta.5(@types/node@22.14.0)(esbuild@0.25.4)(jiti@2.4.2)(tsx@4.19.3)(typescript@5.4.5)(yaml@2.8.0)): + vite-env-only@3.0.1(rolldown-vite@6.3.0-beta.5(@types/node@22.14.0)(esbuild@0.25.4)(jiti@2.4.2)(terser@5.44.1)(tsx@4.19.3)(typescript@5.4.5)(yaml@2.8.0)): dependencies: '@babel/core': 7.27.7 '@babel/generator': 7.27.5 @@ -19245,11 +17783,11 @@ snapshots: '@babel/types': 7.27.7 babel-dead-code-elimination: 1.0.10 micromatch: 4.0.5 - vite: rolldown-vite@6.3.0-beta.5(@types/node@22.14.0)(esbuild@0.25.4)(jiti@2.4.2)(tsx@4.19.3)(typescript@5.4.5)(yaml@2.8.0) + vite: rolldown-vite@6.3.0-beta.5(@types/node@22.14.0)(esbuild@0.25.4)(jiti@2.4.2)(terser@5.44.1)(tsx@4.19.3)(typescript@5.4.5)(yaml@2.8.0) transitivePeerDependencies: - supports-color - vite-env-only@3.0.1(vite@5.1.3(@types/node@22.14.0)(lightningcss@1.30.1)): + vite-env-only@3.0.1(vite@5.1.3(@types/node@22.14.0)(lightningcss@1.30.1)(terser@5.44.1)): dependencies: '@babel/core': 7.27.7 '@babel/generator': 7.27.5 @@ -19258,11 +17796,11 @@ snapshots: '@babel/types': 7.27.7 babel-dead-code-elimination: 1.0.10 micromatch: 4.0.5 - vite: 5.1.3(@types/node@22.14.0)(lightningcss@1.30.1)(terser@5.15.0) + vite: 5.1.3(@types/node@22.14.0)(lightningcss@1.30.1)(terser@5.44.1) transitivePeerDependencies: - supports-color - vite-env-only@3.0.1(vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0)): + vite-env-only@3.0.1(vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0)): dependencies: '@babel/core': 7.27.7 '@babel/generator': 7.27.5 @@ -19271,11 +17809,11 @@ snapshots: '@babel/types': 7.27.7 babel-dead-code-elimination: 1.0.10 micromatch: 4.0.5 - vite: 6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0) + vite: 6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0) transitivePeerDependencies: - supports-color - vite-env-only@3.0.1(vite@7.0.0-beta.0(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0)): + vite-env-only@3.0.1(vite@7.0.0-beta.0(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0)): dependencies: '@babel/core': 7.27.7 '@babel/generator': 7.27.5 @@ -19284,17 +17822,17 @@ snapshots: '@babel/types': 7.27.7 babel-dead-code-elimination: 1.0.10 micromatch: 4.0.5 - vite: 7.0.0-beta.0(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0) + vite: 7.0.0-beta.0(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0) transitivePeerDependencies: - supports-color - vite-node@3.2.4(@types/node@20.11.30)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0): + vite-node@3.2.4(@types/node@20.11.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0): dependencies: cac: 6.7.14 debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.4.1(@types/node@20.11.30)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0) + vite: 6.4.1(@types/node@20.11.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - jiti @@ -19309,13 +17847,13 @@ snapshots: - tsx - yaml - vite-node@3.2.4(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0): + vite-node@3.2.4(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0): dependencies: cac: 6.7.14 debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0) + vite: 6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - jiti @@ -19330,73 +17868,73 @@ snapshots: - tsx - yaml - vite-tsconfig-paths@4.3.2(rolldown-vite@6.3.0-beta.3(@types/node@22.14.0)(esbuild@0.25.4)(jiti@2.4.2)(tsx@4.19.3)(typescript@5.4.5)(yaml@2.8.0))(typescript@5.4.5): + vite-tsconfig-paths@4.3.2(rolldown-vite@6.3.0-beta.3(@types/node@22.14.0)(esbuild@0.25.4)(jiti@2.4.2)(terser@5.44.1)(tsx@4.19.3)(typescript@5.4.5)(yaml@2.8.0))(typescript@5.4.5): dependencies: debug: 4.4.1 globrex: 0.1.2 tsconfck: 3.0.3(typescript@5.4.5) optionalDependencies: - vite: rolldown-vite@6.3.0-beta.3(@types/node@22.14.0)(esbuild@0.25.4)(jiti@2.4.2)(tsx@4.19.3)(typescript@5.4.5)(yaml@2.8.0) + vite: rolldown-vite@6.3.0-beta.3(@types/node@22.14.0)(esbuild@0.25.4)(jiti@2.4.2)(terser@5.44.1)(tsx@4.19.3)(typescript@5.4.5)(yaml@2.8.0) transitivePeerDependencies: - supports-color - typescript - vite-tsconfig-paths@4.3.2(rolldown-vite@6.3.0-beta.5(@types/node@22.14.0)(esbuild@0.25.4)(jiti@2.4.2)(tsx@4.19.3)(typescript@5.4.5)(yaml@2.8.0))(typescript@5.4.5): + vite-tsconfig-paths@4.3.2(rolldown-vite@6.3.0-beta.5(@types/node@22.14.0)(esbuild@0.25.4)(jiti@2.4.2)(terser@5.44.1)(tsx@4.19.3)(typescript@5.4.5)(yaml@2.8.0))(typescript@5.4.5): dependencies: debug: 4.4.1 globrex: 0.1.2 tsconfck: 3.0.3(typescript@5.4.5) optionalDependencies: - vite: rolldown-vite@6.3.0-beta.5(@types/node@22.14.0)(esbuild@0.25.4)(jiti@2.4.2)(tsx@4.19.3)(typescript@5.4.5)(yaml@2.8.0) + vite: rolldown-vite@6.3.0-beta.5(@types/node@22.14.0)(esbuild@0.25.4)(jiti@2.4.2)(terser@5.44.1)(tsx@4.19.3)(typescript@5.4.5)(yaml@2.8.0) transitivePeerDependencies: - supports-color - typescript - vite-tsconfig-paths@4.3.2(typescript@5.4.5)(vite@5.1.3(@types/node@22.14.0)(lightningcss@1.30.1)(terser@5.15.0)): + vite-tsconfig-paths@4.3.2(typescript@5.4.5)(vite@5.1.3(@types/node@22.14.0)(lightningcss@1.30.1)(terser@5.44.1)): dependencies: debug: 4.4.1 globrex: 0.1.2 tsconfck: 3.0.3(typescript@5.4.5) optionalDependencies: - vite: 5.1.3(@types/node@22.14.0)(lightningcss@1.30.1)(terser@5.15.0) + vite: 5.1.3(@types/node@22.14.0)(lightningcss@1.30.1)(terser@5.44.1) transitivePeerDependencies: - supports-color - typescript - vite-tsconfig-paths@4.3.2(typescript@5.4.5)(vite@6.4.1(@types/node@20.11.30)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0)): + vite-tsconfig-paths@4.3.2(typescript@5.4.5)(vite@6.4.1(@types/node@20.11.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0)): dependencies: debug: 4.4.1 globrex: 0.1.2 tsconfck: 3.0.3(typescript@5.4.5) optionalDependencies: - vite: 6.4.1(@types/node@20.11.30)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0) + vite: 6.4.1(@types/node@20.11.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0) transitivePeerDependencies: - supports-color - typescript - vite-tsconfig-paths@4.3.2(typescript@5.4.5)(vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0)): + vite-tsconfig-paths@4.3.2(typescript@5.4.5)(vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0)): dependencies: debug: 4.4.1 globrex: 0.1.2 tsconfck: 3.0.3(typescript@5.4.5) optionalDependencies: - vite: 6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0) + vite: 6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0) transitivePeerDependencies: - supports-color - typescript - vite-tsconfig-paths@4.3.2(typescript@5.4.5)(vite@7.0.0-beta.0(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0)): + vite-tsconfig-paths@4.3.2(typescript@5.4.5)(vite@7.0.0-beta.0(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0)): dependencies: debug: 4.4.1 globrex: 0.1.2 tsconfck: 3.0.3(typescript@5.4.5) optionalDependencies: - vite: 7.0.0-beta.0(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0) + vite: 7.0.0-beta.0(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0) transitivePeerDependencies: - supports-color - typescript - vite@5.1.3(@types/node@22.14.0)(lightningcss@1.30.1)(terser@5.15.0): + vite@5.1.3(@types/node@22.14.0)(lightningcss@1.30.1)(terser@5.44.1): dependencies: esbuild: 0.19.12 postcss: 8.5.3 @@ -19405,9 +17943,9 @@ snapshots: '@types/node': 22.14.0 fsevents: 2.3.3 lightningcss: 1.30.1 - terser: 5.15.0 + terser: 5.44.1 - vite@6.4.1(@types/node@20.11.30)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0): + vite@6.4.1(@types/node@20.11.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0): dependencies: esbuild: 0.25.0 fdir: 6.4.6(picomatch@4.0.2) @@ -19420,10 +17958,11 @@ snapshots: fsevents: 2.3.3 jiti: 2.4.2 lightningcss: 1.30.1 + terser: 5.44.1 tsx: 4.19.3 yaml: 2.8.0 - vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0): + vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0): dependencies: esbuild: 0.25.0 fdir: 6.4.6(picomatch@4.0.2) @@ -19436,10 +17975,11 @@ snapshots: fsevents: 2.3.3 jiti: 2.4.2 lightningcss: 1.30.1 + terser: 5.44.1 tsx: 4.19.3 yaml: 2.8.0 - vite@7.0.0-beta.0(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0): + vite@7.0.0-beta.0(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0): dependencies: esbuild: 0.25.0 fdir: 6.4.6(picomatch@4.0.2) @@ -19452,16 +17992,17 @@ snapshots: fsevents: 2.3.3 jiti: 2.4.2 lightningcss: 1.30.1 + terser: 5.44.1 tsx: 4.19.3 yaml: 2.8.0 - vitefu@1.1.1(vite@6.4.1(@types/node@20.11.30)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0)): + vitefu@1.1.1(vite@6.4.1(@types/node@20.11.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0)): optionalDependencies: - vite: 6.4.1(@types/node@20.11.30)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0) + vite: 6.4.1(@types/node@20.11.30)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0) - vitefu@1.1.1(vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0)): + vitefu@1.1.1(vite@6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0)): optionalDependencies: - vite: 6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.3)(yaml@2.8.0) + vite: 6.4.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.19.3)(yaml@2.8.0) w3c-xmlserializer@4.0.0: dependencies: @@ -19481,12 +18022,15 @@ snapshots: dependencies: makeerror: 1.0.12 + watchpack@2.4.4: + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + wcwidth@1.0.1: dependencies: defaults: 1.0.3 - weak-lru-cache@1.2.2: {} - web-encoding@1.1.5: dependencies: util: 0.12.5 @@ -19501,6 +18045,72 @@ snapshots: webidl-conversions@7.0.0: {} + webpack-sources@3.3.3: {} + + webpack@5.103.0: + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/wasm-edit': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + acorn: 8.15.0 + acorn-import-phases: 1.0.4(acorn@8.15.0) + browserslist: 4.28.1 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.18.3 + es-module-lexer: 1.7.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.1 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 4.3.3 + tapable: 2.3.0 + terser-webpack-plugin: 5.3.15(webpack@5.103.0) + watchpack: 2.4.4 + webpack-sources: 3.3.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + + webpack@5.103.0(@swc/core@1.11.24)(esbuild@0.25.4): + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/wasm-edit': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + acorn: 8.15.0 + acorn-import-phases: 1.0.4(acorn@8.15.0) + browserslist: 4.28.1 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.18.3 + es-module-lexer: 1.7.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.1 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 4.3.3 + tapable: 2.3.0 + terser-webpack-plugin: 5.3.15(@swc/core@1.11.24)(esbuild@0.25.4)(webpack@5.103.0(@swc/core@1.11.24)(esbuild@0.25.4)) + watchpack: 2.4.4 + webpack-sources: 3.3.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + whatwg-encoding@2.0.0: dependencies: iconv-lite: 0.6.3 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 1ae1e9a316..c787b32736 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -3,3 +3,24 @@ packages: - "integration/helpers/*" - "packages/*" - "playground/*" + +catalog: + "@types/react": ^18.0.27 + "@types/react-dom": ^18.0.10 + "@vitejs/plugin-rsc": ~0.5.7 + react: ^19.2.3 + react-dom: ^19.2.3 + react-server-dom-parcel: ^19.2.3 + react-server-dom-webpack: ^19.2.3 + typescript: ^5.4.5 + tsup: ^8.3.0 + wireit: 0.14.9 + +catalogs: + react-canary: + "@types/react": ^19.2.7 + "@types/react-dom": ^19.2.3 + react: ^19.2.2 + react-dom: ^19.2.2 + react-server-dom-parcel: ^19.2.2 + react-server-dom-webpack: ^19.2.2 diff --git a/tutorials/address-book/package.json b/tutorials/address-book/package.json index 8ac7ab7797..7fdf6059ee 100644 --- a/tutorials/address-book/package.json +++ b/tutorials/address-book/package.json @@ -12,8 +12,8 @@ "@react-router/serve": "*", "isbot": "^5.1.17", "match-sorter": "^8.0.0", - "react": "^19.0.0", - "react-dom": "^19.0.0", + "react": "catalog:", + "react-dom": "catalog:", "react-router": "*", "sort-by": "^1.2.0", "tiny-invariant": "^1.3.3" @@ -21,10 +21,10 @@ "devDependencies": { "@react-router/dev": "*", "@types/node": "^20", - "@types/react": "^19.0.1", - "@types/react-dom": "^19.0.1", + "@types/react": "^19.2.7", + "@types/react-dom": "^19.2.3", "cross-env": "^7.0.3", - "typescript": "^5.7.2", + "typescript": "catalog:", "vite": "^5.4.11" }, "engines": {