From 33fe1edc5956ab94f27a4765c5b5204e2b0e55c9 Mon Sep 17 00:00:00 2001
From: goncy
Date: Fri, 11 Sep 2026 22:46:10 -0500
Subject: [PATCH 1/2] WIP
---
.../next-cache-components-adoption/SKILL.md | 250 +
.../references/dev-only-validations.md | 29 +
.../references/per-page-decisions.md | 27 +
.../next-cache-components-optimizer/SKILL.md | 482 +
.../reference/patterns.md | 357 +
.../reference/real-app-patterns.md | 88 +
.../reference/red-test-robustness.md | 156 +
.../rig-template.md | 173 +
.../test-template.md | 167 +
.agents/skills/next-dev-loop/SKILL.md | 187 +
.../next-cache-components-adoption/SKILL.md | 250 +
.../references/dev-only-validations.md | 29 +
.../references/per-page-decisions.md | 27 +
.../next-cache-components-optimizer/SKILL.md | 482 +
.../reference/patterns.md | 357 +
.../reference/real-app-patterns.md | 88 +
.../reference/red-test-robustness.md | 156 +
.../rig-template.md | 173 +
.../test-template.md | 167 +
.env.example | 2 +-
.eslintignore | 6 -
.eslintrc.cjs | 103 -
.github/workflows/nodejs.yml | 39 +-
.gitignore | 4 +
AGENTS.md | 9 +
CLAUDE.md | 1 +
README.md | 46 +
REVIEW.md | 4 +
components.json | 14 +-
cypress.json | 4 -
cypress/integration/products.spec.ts | 32 -
cypress/plugins/index.js | 22 -
cypress/support/commands.js | 25 -
cypress/support/index.js | 20 -
cypress/tsconfig.json | 25 -
eslint.config.mjs | 200 +
jest.config.js | 11 -
jest/tsconfig.json | 6 -
next-env.d.ts | 2 +
next.config.js | 10 -
next.config.ts | 8 +
package.json | 98 +-
playwright.config.ts | 44 +
pnpm-lock.yaml | 10980 +++++-----------
pnpm-workspace.yaml | 3 +
postcss.config.js | 5 +-
skills-lock.json | 24 +
src/app/[[...product]]/page.tsx | 52 +-
src/app/globals.css | 187 +-
src/app/layout.tsx | 16 +-
src/app/refresh/route.ts | 6 +-
src/components/ui/alert.tsx | 77 +-
src/components/ui/button.tsx | 60 +-
src/components/ui/input.tsx | 17 +-
src/components/ui/label.tsx | 31 +-
src/components/ui/radio-group.tsx | 31 +-
src/components/ui/sheet.tsx | 140 +-
src/components/ui/skeleton.tsx | 10 +-
src/components/ui/toggle.tsx | 41 +-
src/lib/utils.ts | 7 +-
src/modules/cart/__tests__/utils.test.ts | 10 +-
src/modules/cart/api.ts | 28 +-
.../cart/components/CartDrawer/CartDrawer.tsx | 32 +-
.../cart/components/CartDrawer/Details.tsx | 4 +-
.../cart/components/CartDrawer/Fields.tsx | 4 +-
.../CartDrawer/__tests__/CartDrawer.test.tsx | 123 +-
.../cart/components/CartItemDrawer.tsx | 34 +-
.../__tests__/CartItemDrawer.test.tsx | 50 +
src/modules/cart/context/index.tsx | 4 +-
src/modules/currency/__tests__/utils.test.ts | 2 +
src/modules/product/api.ts | 41 +-
.../product/components/ProductCard.tsx | 6 +-
.../product/components/ProductSelection.tsx | 25 +
.../components/__tests__/ProductCard.test.tsx | 67 +-
src/modules/store/api.ts | 16 +-
src/modules/store/screens/Store.tsx | 200 +-
src/modules/theme/components/ThemeToggle.tsx | 4 +-
tailwind.config.ts | 87 -
tests/e2e/instant.test.ts | 46 +
tests/e2e/store.test.ts | 75 +
tests/setup.ts | 6 +
tsconfig.json | 27 +-
vitest.config.mts | 25 +
83 files changed, 8271 insertions(+), 8712 deletions(-)
create mode 100644 .agents/skills/next-cache-components-adoption/SKILL.md
create mode 100644 .agents/skills/next-cache-components-adoption/references/dev-only-validations.md
create mode 100644 .agents/skills/next-cache-components-adoption/references/per-page-decisions.md
create mode 100644 .agents/skills/next-cache-components-optimizer/SKILL.md
create mode 100644 .agents/skills/next-cache-components-optimizer/reference/patterns.md
create mode 100644 .agents/skills/next-cache-components-optimizer/reference/real-app-patterns.md
create mode 100644 .agents/skills/next-cache-components-optimizer/reference/red-test-robustness.md
create mode 100644 .agents/skills/next-cache-components-optimizer/rig-template.md
create mode 100644 .agents/skills/next-cache-components-optimizer/test-template.md
create mode 100644 .agents/skills/next-dev-loop/SKILL.md
create mode 100644 .claude/skills/next-cache-components-adoption/SKILL.md
create mode 100644 .claude/skills/next-cache-components-adoption/references/dev-only-validations.md
create mode 100644 .claude/skills/next-cache-components-adoption/references/per-page-decisions.md
create mode 100644 .claude/skills/next-cache-components-optimizer/SKILL.md
create mode 100644 .claude/skills/next-cache-components-optimizer/reference/patterns.md
create mode 100644 .claude/skills/next-cache-components-optimizer/reference/real-app-patterns.md
create mode 100644 .claude/skills/next-cache-components-optimizer/reference/red-test-robustness.md
create mode 100644 .claude/skills/next-cache-components-optimizer/rig-template.md
create mode 100644 .claude/skills/next-cache-components-optimizer/test-template.md
delete mode 100644 .eslintignore
delete mode 100644 .eslintrc.cjs
create mode 100644 AGENTS.md
create mode 100644 CLAUDE.md
create mode 100644 REVIEW.md
delete mode 100644 cypress.json
delete mode 100644 cypress/integration/products.spec.ts
delete mode 100644 cypress/plugins/index.js
delete mode 100644 cypress/support/commands.js
delete mode 100644 cypress/support/index.js
delete mode 100644 cypress/tsconfig.json
create mode 100644 eslint.config.mjs
delete mode 100644 jest.config.js
delete mode 100644 jest/tsconfig.json
delete mode 100644 next.config.js
create mode 100644 next.config.ts
create mode 100644 playwright.config.ts
create mode 100644 pnpm-workspace.yaml
create mode 100644 skills-lock.json
create mode 100644 src/modules/cart/components/__tests__/CartItemDrawer.test.tsx
create mode 100644 src/modules/product/components/ProductSelection.tsx
delete mode 100644 tailwind.config.ts
create mode 100644 tests/e2e/instant.test.ts
create mode 100644 tests/e2e/store.test.ts
create mode 100644 tests/setup.ts
create mode 100644 vitest.config.mts
diff --git a/.agents/skills/next-cache-components-adoption/SKILL.md b/.agents/skills/next-cache-components-adoption/SKILL.md
new file mode 100644
index 0000000..07ac8aa
--- /dev/null
+++ b/.agents/skills/next-cache-components-adoption/SKILL.md
@@ -0,0 +1,250 @@
+---
+name: next-cache-components-adoption
+description: >
+ Turn on Cache Components in a Next.js app and resolve the blocking routes it
+ surfaces. Use when the user wants to enable, adopt, or migrate to Cache
+ Components, flip the `cacheComponents` flag, work through a flood of
+ blocking-prerender / instant validation errors, run the
+ `cache-components-instant-false` codemod, or decide between opting routes out
+ with `export const instant = false` and fixing them in place.
+---
+
+# next-cache-components-adoption
+
+Enable Cache Components on an app and walk it to a passing build. This skill sequences the work; per-error recipes live in the dev overlay fix cards and the build's terminal output. The [migrating to Cache Components guide](https://nextjs.org/docs/app/guides/migrating-to-cache-components) is the canonical reference for the concepts and per-API recipes this skill applies — consult it whenever the skill steps reference a pattern (`"use cache"`, `cacheLife`, `` placement, etc.) and you want the full explanation.
+
+## requires
+
+- **App Router project.** Cache Components is an App Router feature; `cacheComponents: true` does nothing for `pages/` routes. If the project has a `pages/` or `src/pages/` tree but no `app/` or `src/app/` tree, stop and tell the user — Pages → App migration is its own project, not part of this skill. A hybrid app (both `pages/` and `app/`) is fine: the flag affects the `app/` routes; `pages/` routes are unaffected and don't need opt-outs.
+
+- **A resolved app directory.** Locate `next.config.{js,ts,mjs,cjs}` first: that's the project root, and an agent invoked from a subdirectory would otherwise test for `app/` against the wrong `cwd` and find nothing. Look for `app/` and `src/app/` under it, and treat every command and glob in this skill as relative to whichever one exists. If both exist, Next.js builds `app/` and never looks at `src/app/`, so its routes are shadowed and unbuilt — tell the user that and ask which tree to migrate instead of picking one.
+
+- **A runnable app.** The whole loop verifies against `next dev` and a browser, so the app has to boot. If it reads a database or required env at import (e.g. an `env.ts` that throws on a missing `DATABASE_URL`), confirm it actually starts — with the real environment, or local data you stand up — before step 1. Adoption can't be verified against an app that won't run.
+
+- **Next.js 16.3 or later.** That release is where the pieces this skill relies on land: top-level `cacheComponents`, `export const instant`, the dev-overlay instant-navigation validation warnings, and the `cache-components-instant-false` codemod. If `next --version` reports below 16.3, upgrade first:
+ - `npx @next/codemod@latest upgrade latest` to apply the version-to-version codemods.
+ - Read the relevant [version upgrade guide](https://nextjs.org/docs/app/guides/upgrading) (e.g. [Version 16](https://nextjs.org/docs/app/guides/upgrading/version-16)) for what the codemod doesn't cover.
+
+- **No incompatible config keys.** `cacheComponents: true` errors on any file that still exports `dynamic`, `revalidate`, or `fetchCache`. Inventory these exports before running the codemod, then follow the [migration guide's per-key sections](https://nextjs.org/docs/app/guides/migrating-to-cache-components). The guide is the source of truth for translating each value. The `cache-components-instant-false` codemod does not remove these configs.
+
+- **`experimental.dynamicIO` is fatal.** It was renamed to top-level `cacheComponents` and the old key now aborts before any build can run — remove it (or replace with `cacheComponents: true`) first. `experimental.useCache` is still accepted as a deprecated alias; redundant once `cacheComponents: true` is set, so remove it for clarity.
+
+### notes
+
+- **No passing baseline before the flag.** If the app already uses `"use cache"`, the pre-flag build errors with `please enable the feature flag cacheComponents`. Enabling the flag is the first thing you do (in Incremental, before the codemod; in Direct, before fixing routes) — not a thing to do _after_ getting a passing build. Note this in your starting summary so it doesn't read as a regression.
+
+- **Existing caches can stay.** Follow the migration guide's [`fetch` and `unstable_cache` sections](https://nextjs.org/docs/app/guides/migrating-to-cache-components#fetch-cache-options). Do not rewrite them solely to enable Cache Components.
+
+- **Offline docs.** Guide links have offline copies under `node_modules/next/dist/docs/` (bundled since Next.js 16.2), with the directory layout numbered for ordering (e.g. `node_modules/next/dist/docs/01-app/02-guides/migrating-to-cache-components.md`). If you can't predict the numbered prefix, `find node_modules/next/dist/docs -name '.md'` resolves it. The `/docs/messages/*` error pages are not bundled.
+
+- **Older versions without bundled docs.** Suggest `npx @next/codemod@latest agents-md` to the user before starting: it downloads a version-matched copy to `.next-docs/` and writes an index into `AGENTS.md` / `CLAUDE.md`. It touches files in their repo, so ask first and run it only if they want it.
+
+## the shape of the work
+
+There's one loop: walk the route tree top-down, one feature at a time, adopting each route against `next dev` + a browser. The build is a final check for each feature, not the working surface.
+
+The choice in step 1 is whether to opt every route out of validation first or fix routes as you go. Either way the loop is the same:
+
+- **With a quiet pre-step (Incremental).** Run the codemod, fix what it can't, and fully migrate routes that previously required static rendering. Other routes keep their opt-outs for follow-up PRs.
+- **Without (Direct).** Enable `cacheComponents` and start the loop on whatever the build flags first. Same loop, but every fix sits on one branch until adoption is complete.
+
+In both, the per-route success bar is the same: **dev loop reports no errors AND `next build` passes**. Check in with the user after every feature, and suggest a commit but never make one without their confirmation. Expect to spend most of the time in the loop, not in the pre-step.
+
+## background
+
+`cacheComponents: true` requires every route to be prerenderable. A route that reads request-time data outside `` is "blocking" and fails the build. `export const instant = false` marks a route as allowed to block, which clears it in both dev and build; on a layout it covers the whole subtree during the build, but client navigations still validate each descendant segment on its own. Reads wrapped in a [`"use cache"`](https://nextjs.org/docs/app/api-reference/directives/use-cache) function count as cache boundaries, not blocking reads.
+
+When a fix introduces `"use cache"`, follow the Caching guide for [choosing a data-level or UI-level boundary and setting its lifetime](https://nextjs.org/docs/app/getting-started/caching#usage) and [revalidating after mutations](https://nextjs.org/docs/app/getting-started/revalidating). Use the [`use cache` cache-key reference](https://nextjs.org/docs/app/api-reference/directives/use-cache#cache-keys) when the result varies by arguments or captured values.
+
+Three classes of blocker come up, usually in this order:
+
+Whenever a fix introduces ``, follow the Streaming guide's [granular streaming pattern](https://nextjs.org/docs/app/guides/streaming#granular-streaming-with-suspense) and [guidance for preventing CLS](https://nextjs.org/docs/app/guides/streaming#cls-cumulative-layout-shift).
+
+1. **Request-time reads** (`cookies()`, `headers()`, `await params`, `await searchParams`). All four block when awaited at the top of a page or layout. `params` and `searchParams` often get missed because they're not framed as "request data" the way cookies and headers are. The fix is to push the read into a ``-wrapped child — and for `params`/`searchParams`, forward the promise into the child and await it there; don't `await` at the page top.
+2. **Sync-IO at module/render time** (`new Date()`, `Date.now()`, `Math.random()`, `crypto.randomUUID()`). These fail the build even with `instant = false` — the opt-out doesn't suppress them. If they're in a shared layout, they block every route under it. The codemod can't fix them; after running it, use each build error and its linked documentation to identify which reported calls to translate by hand (see the [incremental pre-step](#incremental)).
+3. **`"use cache"` files that read request data.** A file with a top-level `"use cache"` directive can't export `instant`; combining the two errors with `Only async functions are allowed to be exported in a "use cache" file.`, which means the directive was wrong for that route. Remove it before running the codemod.
+
+## working surfaces
+
+### finding blocking routes
+
+Prefer `next dev` over `next build` while you work.
+
+- **`next dev`** — the working surface. Visit a route; its blocking errors surface in the dev overlay with full stack traces and fix cards linking the per-error docs. Work one route at a time — errors don't accumulate in one place. The route itself still returns HTTP 200, so read the overlay (or `.next-dev.log`), not status codes. A cleared overlay is one half of calling a route clean — the other half is browser verification (see [step 2](#step-2-the-inner-loop-remove-opt-outs-one-feature-at-a-time)) and a passing build for that route.
+- **`next build`** — detection only. The build is `next dev`'s authoritative check, not its replacement. Use it as the last gate on each feature in the loop (a passing build is part of the per-route success bar) and as the final verification across the whole app. In Incremental, the build also confirms the pre-step (codemod opted every route out, no shared layout still has a sync-IO blocker) before you ship that PR. Don't reach for the build instead of the dev loop while you're working a route — a passing compile doesn't tell you what ended up in the static shell and what streamed. By default the build stops at the first blocking route, so it's also poor for sizing the work. Two flags help when iterating: `--debug-build-paths` builds only the routes you name (comma-separated glob patterns of file paths relative to the project root, e.g. `--debug-build-paths="app/admin/**/page.tsx"` — not URL paths; `--debug-build-paths="app/(marketing)/about/page.tsx"` — not `/about`; `--debug-build-paths="app/admin"` matches nothing and silently builds zero routes), and `--debug-prerender` disables the early exit so the build continues past the first prerender failure, reports every blocking route, and prints a fuller stack trace that names the originating file and line.
+
+Every blocking error has a docs page — open it. Both the dev overlay and the build terminal print a `https://nextjs.org/docs/messages/` link with each error. That page is the canonical recipe for the fix; the inline message is a summary. Fetch the link for every distinct error you encounter, even if you think you know the pattern — the recipes evolve, and the same error class can have different correct fixes depending on what the route reads. Don't improvise from the inline message alone. (`/docs/messages/*` pages aren't bundled offline; if you have no network, fall back to the per-API guides under `node_modules/next/dist/docs/` and note the limitation when you report back.)
+
+### verifying each fix at runtime
+
+A passing build or a cleared overlay isn't proof the route actually behaves — Cache Components is a runtime concern (a static shell with streamed data). Verify after every fix, not only at the end.
+
+In preference order:
+
+1. **[`next-dev-loop`](https://github.com/vercel/next.js/tree/canary/skills/next-dev-loop) — strongly preferred.** Cross-checks `/_next/mcp` against the live browser via `agent-browser` and surfaces both compile and runtime issues in one pass. The diagnostics (React tree, suspense boundaries, console + network) are richer than poking at `next dev` by hand.
+
+ Install it before starting the loop. Don't wait until you hit something `next dev` alone can't explain. It ships alongside this skill, so check whether it is already available first, and install it only if it is not:
+
+ ```bash
+ npx skills add https://github.com/vercel/next.js/tree/canary/skills/next-dev-loop
+ ```
+
+ The skill states its required `agent-browser` version and walks you through it.
+
+ **Requires Turbopack.** If `package.json`'s `dev` script passes `--webpack`, flag it to the user and ask whether there's a reason to stay on webpack. If not, switch to Turbopack (the Next.js 16.3+ default). If they want to keep webpack, skip this install and use the [build-only loop](#the-loop-build-only-fallback) instead.
+
+ You don't need permission to install `next-dev-loop` itself. It's a tool, like installing a dev dependency. If a user is present, briefly tell them you're installing it for verification. In a non-interactive run (CI, dashboard, sandbox), install it without asking — "can't prompt the user" is not a reason to skip. The only legitimate skip is a real technical blocker: no network, no npm, read-only filesystem, a stated no-new-deps policy, or a webpack-only dev script. If you skip, name the specific blocker in your final report.
+
+2. **A browser you can drive yourself.** Playwright, `agent-browser` directly, any browser-automation tool. Use only when `next-dev-loop` is genuinely blocked. You'll miss the framework-side checks (`/_next/mcp`), so DOM assertions alone don't catch every regression — be more cautious about what you call "verified."
+
+3. **Build-only.** If you can't run a dev server at all, the build is your only signal. `○ (Static)` routes with no `` are fully verified by the build (nothing streamed to test). `◐ (Partial Prerender)` routes are only shell-verified — flag them when you report back.
+
+4. **No tooling at all.** Ask the user to run the dev server (or build) and report what they see, or hand off the milestone you've reached.
+
+## step 1: choose a strategy
+
+Ask the user, in terms of the PRs they want, not the size of the job. Never use the internal labels (Incremental, Direct) when talking to the user — those are your own scaffolding. Ask in terms of PRs and features, e.g.: _"Do you want me to first open a PR that turns on Cache Components and opts every route out of validation, then handle the actual route adoptions feature-by-feature in follow-up PRs? Or do everything on one branch?"_ Even on a tiny app, the incremental path still has value (review-sized PR, revertible, the `// TODO: Cache Components adoption` markers double as your work queue for next session). Don't pick on their behalf.
+
+If there's no user to ask, default to **Incremental** and document the choice.
+
+Honor an explicit choice in the request. If the user asks to migrate incrementally and also asks you to complete the migration, establish and verify the incremental checkpoint before continuing to the remaining routes in the same task. “Complete” sets the stopping point; it does not change the chosen strategy.
+
+- **Incremental** — quiet pre-step + the loop. Run the codemod to opt every page and layout out of validation, get the build passing, stop and check in with the user (see [end of the pre-step](#end-of-the-pre-step-check-in)), then enter [step 2's loop](#step-2-the-inner-loop-remove-opt-outs-one-feature-at-a-time) and ship each feature as a follow-up PR.
+- **Direct** — skip the pre-step. Enable `cacheComponents` and go straight to [step 2's loop](#step-2-the-inner-loop-remove-opt-outs-one-feature-at-a-time); the build's blocking routes are the work queue.
+
+### incremental
+
+Before invoking the codemod, grep for `^export const (revalidate|dynamic|fetchCache)` across the app directory and follow the migration guide for every match. Mark routes that use `dynamic = 'force-static'` or `dynamic = 'error'` for full migration in this PR. The codemod does not remove incompatible configs.
+
+The codemod refuses to run on a dirty working tree. Commit or stash unrelated work first, or pass `--force` to let its edits land alongside your WIP. Common false positive: if you recently upgraded Next.js, `package.json` and the lockfile will already be dirty — commit those first.
+
+```bash
+npx @next/codemod@latest cache-components-instant-false ./app
+```
+
+Pass the app directory you resolved in [requires](#requires). A wrong path is not an error: it reports `0 ok` and exits `0`, so read the file count and treat zero as a failed run, not an adopted app.
+
+Inserts `export const instant = false` (with a `// TODO: Cache Components adoption` comment) into every `{page,layout,default}` file under that directory, skipping files that already declare `instant` and any module marked `"use client"` or `"use server"`. Then set `cacheComponents: true`. The TODO comments are the work queue for the loop.
+
+If the codemod isn't available (older `@next/codemod`, sandboxed environment, offline run), reproduce it by hand: for every `{page,layout,default}.{js,jsx,ts,tsx}` in the app directory that isn't `"use client"` or `"use server"` and doesn't already declare `instant`, insert this after the imports:
+
+```ts
+// TODO: Cache Components adoption. Refactor this route so this opt-out can be removed.
+// See: https://nextjs.org/docs/app/guides/migrating-to-cache-components
+export const instant = false
+```
+
+The codemod opts every segment out, not only the root, on purpose. Resolution is top-down, first-explicit-config-wins: the highest `instant = false` decides the whole subtree. With an opt-out on every segment, removing one segment's opt-out validates only that segment; descendants keep their own opt-outs and stay passing. If only the root were opted out, removing it would re-arm validation for the entire app at once.
+
+Because the highest opt-out wins, remove them top-down (root layout first, then descend). Removing a leaf's opt-out does nothing while an ancestor still holds one.
+
+Remove the opt-outs from the previously static routes and any shared segments that mask their validation. Resolve their errors and confirm they still prerender. A cached data call alone does not prove the route remains static.
+
+Next, run `next build` to surface blockers the codemod could not handle. The build is the proof, not the codemod run — a shared layout that calls `new Date()` / `Math.random()` directly still fails regardless of the opt-out (see [background](#background)). If the normal build reports a sync-IO error without locating the call, rerun that route with `next build --debug-prerender --debug-build-paths="app/path/to/page.tsx"`. For each sync-IO error it reports:
+
+1. **Sync-IO at module/render time.** Use the route, originating file and line, and `/docs/messages/` link in the build output to locate the error. If needed, grep the whole repo for `new Date()`, `Date.now()`, `Math.random()`, and `crypto.randomUUID()` (not only `app/**/layout.{js,jsx,ts,tsx}` — the read might live in any component imported by a layout). Do not change unreported matches. Apply the appropriate option from the linked error page, then add this comment above a temporary boundary introduced only to unblock the build:
+
+ ```tsx
+ // TODO: Cache Components adoption. Added to unblock the build: remove this boundary to re-trigger the error and review the documented options.
+ ```
+
+ It shares the `TODO: Cache Components adoption` prefix with the comments the codemod writes, so the check-in grep finds both. Removing the boundary makes the error fire again with its fix cards — the same motion as removing an opt-out in the loop.
+
+After each fix, rerun the scoped build when available, then run `next build` again to find the next blocker. Repeat until the normal build passes.
+
+After the build passes, confirm every deferred route is still covered by an opt-out and no shared opt-out covers a previously static route. If the app has no previously static routes and the root layout remains deferred, confirm it got an opt-out (`grep -n "export const instant" /layout.*`). The root layout renders every route, including framework routes like `/_not-found`, so if it was missed, add `export const instant = false` to it by hand.
+
+Synthetic routes like `/_not-found` have no user file — when they block, fix the root layout's opt-out, not the synthetic route. Client Components (`"use client"`) get no opt-out (it's a build error to export `instant` from them), but they are not a rare blocker. The high-frequency case is a client component in the root layout's nav or header calling `usePathname()`/`useSearchParams()`: it blocks _every_ dynamic route with `blocking-prerender-client-hook`, and static routes pass (the pathname is known at prerender), which masks it until you reach a dynamic segment. It's not an ancestor-data fix — follow the [error's docs page](https://nextjs.org/docs/messages/blocking-prerender-client-hook) for the `` recipe. Only when a client route blocks on _server_ data do you fix that data in its ancestor.
+
+### end of the pre-step: check in
+
+Incremental only. The pre-step is the shippable PR. Record the passing checkpoint before starting step 2. Unless the user already asked you to continue through the full migration in the same task, stop and check in. Talk to the user in their language; don't say "Incremental" or other internal labels; talk about adoption, PRs, and what the app does now. Tell them:
+
+- What you did: turned on Cache Components, ran the codemod, migrated the previously static routes, fixed the remaining blockers, and confirmed the build passes.
+- What changed: the previously static routes still prerender. Other pages and layouts keep a `// TODO: Cache Components adoption` opt-out.
+- What to sanity-check: the previously static routes stay fully prerendered and prefetchable, and request-specific data on the deferred routes remains request-specific.
+- The question: "Want to open this as its own PR before we start adopting Cache Components route by route? Or keep going on this branch?" Wait for the answer.
+
+If the user already asked you to complete the migration, continue after recording this checkpoint instead of asking the same question again.
+
+### direct
+
+Set `cacheComponents: true` and move to [step 2](#step-2-the-inner-loop-remove-opt-outs-one-feature-at-a-time). The build's blocking routes are the work queue.
+
+## step 2: the inner loop, remove opt-outs one feature at a time
+
+A "feature" is a single product surface — `app/settings/profile/**`, `app/posts/[slug]/**` — not a whole top-level app like `app/dashboard/**`. Finish one end-to-end before starting the next.
+
+Within a feature, walk top-down (layouts before pages, root layout first). Removing a layout's opt-out before its descendants exposes the layout's own blocking reads. (Direct: there are no opt-outs to remove — fix each failing route; if a hand-written opt-out on an ancestor shadows it, remove that first.)
+
+A passing build mid-walk doesn't mean the layout is clean. Removing a layout's opt-out while its descendant pages still have theirs keeps the build passing — each page shadows the inherited validation. The layout's actual blocking reads only surface once nothing below it shadows them. Don't call a feature done at the layout boundary.
+
+Use the **with-a-browser** loop unless a browser is genuinely unreachable. The [`next-dev-loop`](#verifying-each-fix-at-runtime) skill is the source of truth for what counts as "browser available" and how to install it.
+
+### the loop, with a browser (preferred)
+
+Per route:
+
+- Remove the opt-out (Incremental) or target the failing route (Direct).
+- Reload in dev. Overlay clean? Skip to verify. Overlay still red? Fix.
+- Fix — fetch the docs page linked from the error (`https://nextjs.org/docs/messages/`), apply the recipe from there. The inline overlay text is a summary; the docs page is the source of truth.
+- Verify in the browser. Confirm the visible content on first paint is what you intended in the shell — not stuck on a fallback, not silently streaming everything out of an empty shell.
+- Re-check siblings if the fix touched shared code (a layout, a sidebar component). A shared-shell change can fix the route you're on and break a sibling.
+
+### the loop, build-only (fallback)
+
+Used when there's no way to drive a browser — CI, sandbox, the user has no `next dev` running and you can't start one. Weaker signal: confirms the build passes and the route prerenders, but not what ended up in the static shell vs streamed.
+
+Per route:
+
+- Remove the opt-out (Incremental) or target the failing route (Direct).
+- Rebuild with `--debug-build-paths app//**` (only that route) or `--debug-prerender` (full build, but past the first failure). Route passing? Move on. Still blocking? Fix.
+- Fix — fetch the docs page linked from the error (`https://nextjs.org/docs/messages/`), apply the recipe from there.
+- Re-check siblings if the fix touched shared code.
+- Flag the route as build-only-verified when you hand the feature off. Each `◐` route still needs a browser pass before the feature is done.
+
+### loop notes
+
+- The [three blocker classes from background](#background) often get missed when fixing in place. Caching a downstream fetch (`getThing(id)`) doesn't clear an `await params` at the top of the page body — push the param promise into the ``-wrapped child.
+- Ambiguous calls are user check-ins, not agent judgment. When you're not sure which fix fits, the blocking code looks security-sensitive, or the user might want to keep the route blocking on purpose — read [references/per-page-decisions.md](./references/per-page-decisions.md) before editing. Show the route while you ask: the `next-dev-loop` session runs the browser headed, so drive to the page and leave it on screen so the user is looking at the thing they're deciding about, with a screenshot as the fallback when a headed browser isn't possible. "Should this stay blocking?" is much easier to answer while looking at the page than at a file path.
+- Don't narrate the refactor with comments. The only comment the codemod (or you) should leave is `// TODO: Cache Components adoption` on opt-outs, and the user's existing comments. Don't annotate every `` boundary or `"use cache"` call with what it does — the code says that. Drop a comment only when the _why_ isn't clear from the code (e.g. a deliberate Block with a reason).
+- For many routes with the same mechanical fix, verify one representative route first. Then batch disjoint route groups using the same recipe, and run the shared build and browser checks together.
+
+Keep a todo list of the feature's routes. When every route in the feature is clean, move to step 3.
+
+## step 3: verify the feature
+
+Checklist before checking in with the user:
+
+- `next build` completes without blocking-route errors.
+- No bare TODOs in the feature: `grep -rn "TODO: Cache Components adoption"` finds both the codemod's opt-out comments and the sync-IO unblocks from the pre-step. Any `instant = false` left behind is a deliberate, documented Block — comment rewritten to a reason (see [references/per-page-decisions.md](./references/per-page-decisions.md) → "when to leave a Block in place"). Any `await io()` or `await connection()` left behind has been reviewed and kept on purpose, not left over from the pre-step.
+- Each route visited in the browser: confirm the static shell renders first and every `` fallback resolves to its real content. Capture both states if you can — the fallback (mid-stream) and the final paint — so you have a streaming-experience demo to show the user. Throttle the network in the browser if streaming is too fast to observe.
+- After populating any new cache whose data can be updated, a mutation check confirms the next read returns the expected data.
+- If runtime verification fails, reproduce the same route on the pre-adoption branch or with its opt-out restored. A failure that already exists is an environment or data problem, not an adoption regression.
+
+Then check in with the user. Same rule as the pre-step: speak their language. Don't say "feature-by-feature loop" or other internal labels; talk about the feature you adopted and what the user will see.
+
+- What you did: which routes you touched, and the user-visible result per route (e.g. "the post page now streams the article body behind a skeleton while the layout stays static").
+- What changed: opt-outs removed, fallbacks added, caching boundaries introduced.
+- Show, don't tell. The `next-dev-loop` session runs the browser headed, so drive the route live for the user so they see the static shell → fallback → final content sequence in real time. If you can't drive a live browser, attach the before/after screenshots you captured instead.
+- Give them the click-through: a short table of the feature's routes — the URL to open and what to look for (what renders instantly, which fallbacks appear, what streams in) — so they can verify each one themselves.
+- The question: "Want to open this feature as a PR and move on to the next, or stop here?" Wait for the answer.
+
+**Trivial features can skip the check-in.** If adopting a feature only meant removing its `// TODO: Cache Components adoption` opt-out (no `` added, no `'use cache'` introduced, no render order change), the user sees nothing different. Move on to the next feature without stopping; mention it in passing the next time you do check in.
+
+When the loop has run on every feature — every remaining `instant = false` sits under a reason comment, `grep -rln "TODO: Cache Components adoption" app` returns nothing — point the user at [further reading](#further-reading) if they want to push the experience further, or stop and ship.
+
+### route table glyphs
+
+`ƒ` → `◐` is where adoption usually lands. `◐ (Partial Prerender)` means a static shell prerenders and the request-time content streams in — the goal state for any route that reads `cookies()`, `headers()`, `params`, or `searchParams`. Some routes legitimately stay `ƒ` when they do request-time work through a documented escape hatch (e.g. a layout that uses `await connection()`); the page is no longer _opted out_, it's genuinely dynamic. Don't remove the escape hatch only to chase a `◐`. The inverse holds: `instant = false` does not force a route to be `ƒ`. The glyph reflects what the route does at prerender time, not which validation knobs it exports.
+
+`◐` tells you a shell exists, not what's in it. A `` boundary placed too high (e.g. wrapping the entire page body, or `` around the article content) pushes the visible content out of the static shell into the streamed payload; the build still reports `◐` because _some_ shell prerendered (often only `` with framework markup). The route table can't tell you what's in the shell; a browser can. If the shell is empty and everything streams, pull the `` boundary down closer to the actual dynamic read.
+
+## further reading
+
+The work below is optional and lives in the docs — link the user to them and let them decide which to take on next. Don't walk these through inside this skill.
+
+- [Sweep for more instant navigations](./references/dev-only-validations.md) — an optional follow-up once adoption is done, never required. A passing build is not the last word, because dev validates every route on each page load (simulating both page loads and client navigations) and catches what the build's first-error exit and descendant shadowing skipped. Offer it as the smaller path to instant navigation for a user who doesn't want to adopt Partial Prefetching. Adopting Partial Prefetching (below) runs the same kind of loop and meets these insights anyway, so recommend both and let the user pick which, or whether. The reference is the loop to execute.
+- [`next-partial-prefetching-adoption`](https://github.com/vercel/next.js/tree/canary/skills/next-partial-prefetching-adoption) — the follow-up skill that adopts Partial Prefetching: it enables `partialPrefetching` and audits every ` ` against a decision table (or adopts incrementally with the flag off, driven by the `instant-link-prefetch-partial` insight). It sequences this the same way this skill sequences Cache Components, but the insights are dev-only, so it's a browser click-through, not a build loop. Recommended after instant navigation, since those fixes feed directly into how much of each route the shell can prefetch. Concepts live in the [Adopting Partial Prefetching guide](https://nextjs.org/docs/app/guides/adopting-partial-prefetching).
+- [Prevent regressions with e2e tests](https://nextjs.org/docs/app/guides/instant-navigation#prevent-regressions-with-e2e-tests) — the `@next/playwright` [`instant()`](https://nextjs.org/docs/app/api-reference/file-conventions/route-segment-config/instant#testing-instant-navigation) helper asserts on the UI that's available immediately on navigation, so regressions surface in CI. Recommend it once a route is instant: `next-dev-loop` confirms it _now_; an `instant()` test keeps it that way.
+- [`next-cache-components-optimizer`](https://github.com/vercel/next.js/tree/canary/skills/next-cache-components-optimizer) — a separate skill that grows each route's static shell so more of the page prerenders and less streams in. Pure optimization, not part of adoption.
diff --git a/.agents/skills/next-cache-components-adoption/references/dev-only-validations.md b/.agents/skills/next-cache-components-adoption/references/dev-only-validations.md
new file mode 100644
index 0000000..7c83fab
--- /dev/null
+++ b/.agents/skills/next-cache-components-adoption/references/dev-only-validations.md
@@ -0,0 +1,29 @@
+# dev-only validation sweep
+
+How to surface and fix the instant-navigation insights that a clean `next build` does not show. The [Instant navigation guide](https://nextjs.org/docs/app/guides/instant-navigation) is the canonical reference for the validation model this exercises.
+
+## what the build misses
+
+By default (`validationLevel: 'warning'`) Cache Components validates every Page and Default segment in `next dev`, and the insights land in the dev overlay's Insights tab, not the build. Validation runs on every page load using the real request, and for each route it independently checks the initial page load and client navigations at different points in the hierarchy. So a `` boundary that covers the page load can still leave a client navigation blocking, and a layout stays clean at build time while a descendant keeps its `instant = false`. The build stops at the first blocking route and does not raise this family by default. Loading each route in dev is what surfaces it.
+
+## when to run it
+
+After the Cache Components build is clean, not before. While the app is mid-adoption the build redboxes mask this, so a full clean build (every route `◐`, no errors) is the precondition. A quiet sweep is the expected result of a clean adoption, not a missing signal.
+
+## the loop
+
+Reuse the [`next-dev-loop`](https://github.com/vercel/next.js/tree/canary/skills/next-dev-loop) preflight (Turbopack), then add one job. On a webpack app, drive a browser directly with `agent-browser` or Playwright instead. You lose the `/_next/mcp` cross-checks, not the insights, which still show in the overlay and the dev log.
+
+1. Build a route queue from the last build's route table or the app directory.
+2. Load each route in `next dev` with a browser. A refresh or a link click both work, and validation simulates both the page-load and client-navigation cases on that load, so you do not need to click through every link by hand. Dynamic params are checked against the real values you visit, so hit a concrete `[slug]`, not the pattern.
+3. Watch the dev log and the Insights tab. The dev log is the greppable record, one `Error: Route "...": Next.js encountered ...` line per insight with its `docs/messages/` link, and it reads the same on Turbopack and webpack. The Insights tab is amber and appears only once an insight fires, so a route with no tab is clean. Through `next-dev-loop`'s `/_next/mcp`, these come from `get_errors` and the overlay, not `get_request_insights`, which is the performance recorder and reports nothing here.
+4. Open the linked page for each distinct insight and apply its fix (usually pull a `` boundary down to the read). Reload to confirm it clears.
+
+## gotchas
+
+- The overlay renders inside a shadow root (`nextjs-portal`), so accessibility-tree snapshots miss it. Read it through `shadowRoot`.
+- No browser, no sweep. There is no build-only fallback for this family. Apply the static fix you can from the docs page (gate on type-check) and hand off the live confirmation.
+
+## when this shrinks
+
+Build-time instant validation is opt-in today (`experimental.instantInsights.validationLevel: 'experimental-error'`); the default `'warning'` surfaces in the overlay only. Once the build raises these reliably, the sweep collapses into reading `next build` output and this reference can shrink to that.
diff --git a/.agents/skills/next-cache-components-adoption/references/per-page-decisions.md b/.agents/skills/next-cache-components-adoption/references/per-page-decisions.md
new file mode 100644
index 0000000..4e57a73
--- /dev/null
+++ b/.agents/skills/next-cache-components-adoption/references/per-page-decisions.md
@@ -0,0 +1,27 @@
+# per-page decisions: removing `instant = false`
+
+Read this when a route still blocks after you remove its `instant = false` and the dev overlay's fix card isn't enough on its own. Each section here covers a judgment call the agent shouldn't make alone.
+
+## deciding what to do with a blocking read
+
+Read the full linked page behind the fix card — not only the inline snippet — before editing. The card unblocks the build, but the page covers the details that make the route's navigation actually instant (e.g. where to place a `` boundary). Don't improvise.
+
+If you're unsure which fix fits, the right call usually depends on what this part of the page is _for_, which the code doesn't capture. Ask the user about their goal for it rather than guessing. Frame it as a product/UX question: should this content be there instantly on load, or is it fine for it to stream in a moment later? Should everyone see the same thing (cacheable) or is it per-user / per-request? Tie the technical fix to that answer (cache it, wrap it in ``, or keep it request-time), so they're deciding the experience, not the API.
+
+## security gates and other code you can't infer
+
+If the blocking code looks like it's there for a _reason you can't infer_ — a security gate at the page top (`await verifyAccess()`, an auth redirect, a feature-flag check) where moving it inside `` would change what the code guarantees — stop and ask the user before refactoring. The build error wants ``, but wrapping a gate in `` defeats the gate. Only the person who wrote it knows whether to keep the route blocking (`instant = false` as a documented Block), restructure the page so the gate runs differently, move the check to [Proxy](https://nextjs.org/docs/app/api-reference/file-conventions/proxy), or — if the gate duplicates protection the app already relies on elsewhere (platform auth such as Vercel Deployment Protection, a Proxy check, a Data Access Layer) — remove it.
+
+Relocating a read (`await connection()`, Proxy) only changes _where_ it runs, never _whether it should run at all_ — so a gate that's redundant or broken looks identical to a correctly-placed one through the fix card's lens. If a gate looks strange, redundant, or out of place, say so plainly — "this looks like it might be unnecessary here — are you sure it belongs?" — instead of quietly relocating it. Surfacing the doubt is the agent's job; deciding is the user's.
+
+If _every_ route under a layout is gated this way, a documented Block on the layout is the correct end state. Moving the gate to [Proxy](https://nextjs.org/docs/app/api-reference/file-conventions/proxy) is the architectural fix, not a Cache Components one, and that's a follow-up rather than something to hold the migration on.
+
+For the broader picture, read the [Authentication guide](https://nextjs.org/docs/app/guides/authentication) (where auth checks belong: Proxy for routing, Data Access Layer for data) and the [Data Access Layer section of Data Security](https://nextjs.org/docs/app/guides/data-security#data-access-layer) (centralized auth checks that compose with `'use cache'`).
+
+If you don't know how to make a piece of code Cache Components–correct without changing what it does, ask.
+
+## when to leave a Block in place
+
+If a route is genuinely meant to block — it's inherently per-request with no useful static shell — or the refactor would be large and the user would rather not take it on now, that's a legitimate outcome. Keep `instant = false`, but confirm it with the user first and turn its `// TODO: Cache Components adoption` comment into a reason, e.g. `// instant = false: kept on purpose — fully request-time dashboard` or `// instant = false: deferred, refactor too large for now`.
+
+A documented, deliberate Block is fine to leave after the migration; an undocumented leftover opt-out is not.
diff --git a/.agents/skills/next-cache-components-optimizer/SKILL.md b/.agents/skills/next-cache-components-optimizer/SKILL.md
new file mode 100644
index 0000000..a487db5
--- /dev/null
+++ b/.agents/skills/next-cache-components-optimizer/SKILL.md
@@ -0,0 +1,482 @@
+---
+name: next-cache-components-optimizer
+description: >
+ Drive a Next.js route to instant navigation by setting up an agentic loop,
+ under Cache Components / PPR, on initial load (hard navigation) and
+ client-side navigation (soft navigation). Encode the goal as a failing
+ @next/playwright instant() e2e and work it to green, one verified route at a
+ time; the shipped test then guards against regression. Use when asked to make
+ a route's navigation instant (its static shell commits immediately), fix a
+ route whose static shell isn't prerendered/served/prefetched, grow a route's
+ static shell or fix its slow first paint, diagnose which Suspense boundary
+ keeps a route out of its static shell, or write the instant() e2e guard for
+ one. Requires Next.js 16.3+ with cacheComponents; directs an upgrade if older.
+---
+
+# next-cache-components-optimizer
+
+Set up an agentic optimization loop that drives a Next.js route from "not
+instant" to "instant" and keeps it there. The loop is test-driven: encode the
+goal as a failing `@next/playwright` `instant()` test, work it to green, and
+ship the test as the regression guard. Run it once per target route. Work the
+phases P → G in order; each ends in a gate. Fix recipes live in two lazily-read
+references — `reference/patterns.md` (before→after for each blocker type) and
+`reference/real-app-patterns.md` (parallel routes, auth gates, the empty-shell
+and responsive-skeleton failure modes). Read one only when its phase points
+there.
+
+## What is invariant, and what is yours
+
+One thing here is fixed. The rest is yours. Read this before treating any
+command, platform, or env var below as a requirement.
+
+- **Invariant: the verification loop.** Maximizing the shell is worthless
+ unless you can prove it. The proof is an automated check: under a lock that
+ gates dynamic data, the static shell still commits. RED shows the gap, GREEN
+ shows it closed, the test ships as the regression guard. It must run on a
+ production-like build and must not be able to pass vacuously. Stand the loop
+ up once; every later optimization is then verifiable by construction. The
+ loop is the deliverable, not any one route.
+- **The mechanism: `@next/playwright` `instant()`.** This skill uses
+ [`instant()`](https://nextjs.org/docs/app/guides/instant-navigation#prevent-regressions-with-e2e-tests)
+ as a ruler, not a stopwatch (phase A). It comes from
+ `@next/playwright` (installed alongside `@playwright/test`, on the same
+ release line as `next`), so it isn't tied to any host. Keep it. Timing a
+ navigation by hand is too flaky to trust, and is the failure mode this skill
+ exists to prevent.
+- **Yours: the rig.** How you build, deploy, authenticate, configure
+ Playwright, and loop belongs to your stack, not to this skill. A local
+ `next build && next start`, a CI/staging container, and a per-push preview
+ deploy are equally valid rigs; the verdict comes from the build, never the
+ platform. Phase 0 maps the invariant onto your repo. Read every platform
+ name, env-var spelling, and command below as an example to translate, not a
+ requirement.
+
+## Two navigations, two loading states
+
+A route reaches the user two ways, and both must be instant:
+
+- **Initial load (hard navigation)** commits the route's prerendered static
+ shell; deferred parts stream in behind their loading skeletons (Suspense
+ fallbacks, `loading.tsx`).
+- **Client-side navigation (soft navigation)** commits the destination's
+ prefetched App Shell — the ` ` default under Partial Prefetching —
+ re-rendering only the segments that change.
+
+The fix patterns are identical for both; the test differs only in how the
+navigation is driven ("Driving the navigation in tests" below). The two shells
+can differ; guard the one you ship, both when both matter
+(`reference/real-app-patterns.md`).
+
+## Goal
+
+Maximizing the static shell is the optimization objective: the most meaningful
+prerendered content commits immediately, and only genuinely per-request data
+streams in afterward. The shipped test deterministically encodes **present ∧
+instant**; **non-blank** is the additional bar the workflow enforces by
+judgment (D1/D2/E), because an `instant()` pass alone is satisfied by a blank
+`fallback={null}` shell (the empty-shell failure mode,
+`reference/real-app-patterns.md`).
+
+`instant()` is a ruler, not a stopwatch: assert that the shell appears under
+the lock; do not time it. A trustworthy verdict requires a production build
+(phase A).
+
+The GREEN under the lock is the deterministic verdict; each gate keeps it
+trustworthy.
+
+## Reporting to the user
+
+This loop is meant to run unattended, so it doesn't stop to ask between steps.
+Work the navigation the user named, finish it, and stop. What matters is how you
+word and present the results, not how often you interrupt. The mechanics below —
+the rig, RED, GREEN, the gates — are your scaffolding; the user never needs to
+hear those words.
+
+- **Speak their language.** Describe the gap and the result in terms of what the
+ user sees: "navigating to the dashboard waited on the charts query before
+ anything painted; now the layout and skeletons paint instantly and the charts
+ stream in" — not RED/GREEN, the lock, or the phase letters.
+- **Show, don't tell.** When you report a route, drive the browser (or attach
+ before/after screenshots) so the user watches the shell commit immediately and
+ the data stream in, rather than reading a claim. Identical before and after
+ means the fix did nothing — roll it back.
+- **Present a run as a list of results the user can click through** — one line
+ per navigation: the route, what commits instantly, and what streams in — not a
+ transcript of the loop.
+- **Only surface a question for a genuine fork:** a fix that would change
+ behavior, a security-sensitive read, or a route that's dynamic by design (a
+ per-link-prefetch candidate, not a shell to grow). A clean instant fix is not
+ a fork — keep going. With no one to ask (an unattended run), don't block: take
+ the safe default and note the assumption — for a cache-freshness choice,
+ defer the read behind `` (always fresh, still instant) rather than
+ guess a `cacheLife`.
+
+## The workflow
+
+```
+- [ ] P PREREQS Next.js 16.3+ with cacheComponents: true; upgrade first → below
+- [ ] 0 SETUP once per repo: discover + write instant-nav.rig.md → rig-template.md
+- [ ] A RIG production build with the testing API exposed → below
+- [ ] B BASELINE unlocked: the marker renders for the test user → test-template.md
+- [ ] C RED locked instant(): the shell does not commit → test-template.md
+- [ ] C-gate VERIFY-RED: stop until the RED is trustworthy → reference/red-test-robustness.md
+- [ ] D FIX push each Suspense boundary down to the data it guards → reference/patterns.md
+- [ ] D1 reuse the route's existing loading UI; do not hand-build skeletons
+- [ ] D2 the shell matches the real render at every breakpoint → reference/real-app-patterns.md
+- [ ] E PARITY the refactor changed only whether the route is instant
+- [ ] F DIFFERENTIAL revert only the fix → RED; re-apply → GREEN → reference/red-test-robustness.md
+- [ ] G REVIEW PR checklist (below)
+```
+
+Phases B and C build the test; only the locked test from C ships.
+
+---
+
+## P. PREREQUISITES: current Next.js with Cache Components
+
+The workflow depends on framework capabilities that ship with current Next.js:
+
+- **Next.js 16.3+ with `cacheComponents: true`** in `next.config.ts`. Without
+ Cache Components there is no static shell to optimize.
+- **`@next/playwright`** on the same release line as the project's `next`; it
+ provides `instant()`. Verify with `npm ls next @next/playwright` (or the
+ project's package manager) and align them if they differ. The matching
+ testing API is in the `next` runtime, gated by the
+ `experimental.exposeTestingApiInProductionBuild` config flag (phase A).
+
+If the project does not meet these, upgrade first (`npx @next/codemod upgrade`
+automates most of it), then enable Cache Components in `next.config.ts`:
+
+```ts
+export default { cacheComponents: true }
+```
+
+Enabling the flag surfaces the blocking routes to resolve first; the
+[`next-cache-components-adoption`](https://github.com/vercel/next.js/tree/canary/skills/next-cache-components-adoption)
+skill drives that adoption. Reach for this optimizer once the app builds under
+Cache Components.
+
+This gate is deliberate: the skill targets current Next.js, and none of the
+verdicts below are meaningful on older versions.
+
+## 0. SETUP: discover this project's rig, once per repo
+
+The principles in this skill are fixed; the infrastructure they run on is
+yours. On first use in a repository, discover how the project builds, deploys,
+authenticates, and tests (inspect the repository first, and ask the user only
+what it cannot answer), then write the answers to a committed
+`instant-nav.rig.md`. Every later run reads that file instead of
+rediscovering. The required build, test context, navigation contracts,
+iteration loop, and file template are in **`rig-template.md`**.
+
+If the repo has no Playwright e2e harness yet, standing up a minimal one
+(`@next/playwright`, a config with `baseURL`, one authenticated path) is part
+of this step; the loop does not assume a pre-existing suite.
+
+## A. RIG: a production build with the testing API exposed
+
+Stand up the rig described by `instant-nav.rig.md`. Two invariants hold on
+every platform:
+
+1. **Never measure on `next dev`.** It does not prefetch, and its lock is
+ unreliable for blocking routes, so a dev `instant()` result is not a valid
+ RED or GREEN.
+2. **The measured build must expose the testing API.** Otherwise `instant()`
+ silently no-ops and the test passes vacuously (see
+ `reference/red-test-robustness.md`). The lock-engagement proof is the phase-C
+ RED itself: the unfixed target route is the known-blocking route, and its
+ RED under the lock shows the lock engages on this build (C-gate); the
+ self-validating variant in `test-template.md` is the in-band guarantee. Wire
+ `experimental.exposeTestingApiInProductionBuild` to a condition that is
+ true for every build you measure and never true in production:
+
+ ```ts
+ experimental: {
+ // Use the condition your platform provides, and record it in the rig file:
+ // local: an explicit opt-in, as below
+ // generic CI: process.env.DEPLOY_ENV === 'staging'
+ // Vercel: process.env.VERCEL_ENV === 'preview'
+ exposeTestingApiInProductionBuild:
+ process.env.EXPOSE_TESTING_API === '1',
+ }
+ ```
+
+The rig is any production-like build that exposes the testing API: a local
+`next build && next start`, a CI/staging container, and a preview deploy are
+all equally valid; the verdict comes from the build, not the platform. See
+`rig-template.md` for the setup requirements.
+
+For any deployed or remote build, poll the rig's LIVENESS probe to confirm the
+artifact contains `HEAD` before trusting a verdict (a stale deploy reads as a
+false RED or GREEN); a local `next build && next start` needs none. The probe
+mechanism is in `rig-template.md`.
+
+## B. BASELINE (unlocked): development scaffold, do not ship
+
+Drive the real navigation with no `instant()` lock and assert that the
+destination's `SHELL_MARKER` renders **as the test user**: the account the
+e2e suite authenticates as (in CI, the CI account; locally, your e2e login
+fixture), with its flags, plan, role, and data. This establishes that the
+marker is real and reachable: not flag-gated, not redirected away, not a
+guessed selector. The suite runs as the test account, not the author's session;
+that environment drift (the rig DRIFT list) is a common source of
+untrustworthy REDs. Scaffold and run command: **`test-template.md`**.
+**Delete this baseline before the PR.**
+
+## C. RED (locked) + the VERIFY-RED gate
+
+Wrap the same navigation in `instant()`; assert the shell commits under the
+lock. A RED here is the gap. **This is the test that ships**
+(`test-template.md`).
+
+Prefer the self-validating variant when the route has deferred content. If the
+route cannot build while blocked, or a cookie/session read stays GREEN, use the
+RED recipes in `reference/red-test-robustness.md`.
+
+> **C-gate: do not start optimizing until the RED is verified trustworthy.** A
+> RED that is red for the wrong reason sends you optimizing a route that was
+> never broken.
+
+The question that settles it: **does `SHELL_MARKER` render without the lock,
+as the test user?** Answer it by re-running phase B as the test user, not by
+adding assertions to the shipped test. The two-branch resolution (No → marker
+or environment bug; Yes → genuine gap, proceed to D), the full taxonomy of
+untrustworthy REDs, the checklist, and worked cases are in
+**`reference/red-test-robustness.md`**. Read it now.
+
+---
+
+## D. FIX: push each boundary down to the data it guards
+
+**The anti-pattern: one coarse boundary.** A single `` high in the
+tree with a page-level fallback has three costs:
+
+- The layout UI stays out of the static shell: only a throwaway copy of it is
+ prerendered.
+- The entire subtree is replaced when the boundary resolves, which discards
+ client state and shifts layout.
+- The hand-built fallback drifts out of sync as the UI changes, because it
+ duplicates structure that also exists in the resolved tree.
+
+**The fix: hoist the static, push the Suspense down.** Render the layout UI
+once, synchronously, in the shell, and wrap each await in a boundary scoped to
+the single read it guards. Only that leaf streams; the stable ancestors are
+reused as-is.
+
+**Rule:** if an element renders in both the fallback and the resolved tree,
+hoist it above the boundary.
+
+### The most common blocker: a top-level `await` in a layout on a fallback route
+
+```
+app/[locale]/(app)/[tenant]/dashboard/...
+ │ generateStaticParams ✅ │ no generateStaticParams → fallback route
+```
+
+When any dynamic segment in the route lacks `generateStaticParams`, the route
+is a fallback route, and **all** params defer to request time, including the
+enumerated ones. A top-level `await` in a layout (`await params`, a
+request-time session read, an auth gate) then blocks the whole subtree out of
+the static shell, even when it reads a statically known param. Minimal shape: a
+dynamic-segment route with one segment lacking `generateStaticParams`, plus a
+top-level `await` in the layout above it.
+
+### The fix: defer the gate, render children
+
+Render `children` unconditionally; move the top-level `await` into a
+``-wrapped child. Mechanism and before→after:
+`reference/real-app-patterns.md`, "Deferring an auth gate".
+
+**Fix the page below the shell too, not only the layout.** A page-level
+top-level `await` (commonly `await params`) blocks the same way the layout's
+does, so make the page sync and push its dynamic reads into a
+``-wrapped leaf as well. `fallback={null}` is correct only when a gate renders nothing on
+success; for data, the fallback must be a real loading skeleton (see D1).
+
+Every other blocker shape — `cookies()`/`headers()`, uncached fetch or database
+reads, `searchParams`, metadata, viewport, non-deterministic values (`Date.now()`,
+`Math.random()`, `crypto.randomUUID()`) — surfaces its own insight when you hit
+it: the build prints a `https://nextjs.org/docs/messages/` link. The
+default build output is often abbreviated and may carry no usable stack trace;
+add `--debug-prerender` for the full failing frame and to report every blocker
+past the first. Scope the build to the route you're on with
+`next build --debug-build-paths "app//**"` rather than rebuilding the app.
+Open that page and apply its recipe; don't improvise from the inline message.
+
+The before→after recipe for each shape is in `reference/patterns.md`, which maps it to the insight
+that explains it.
+
+A few things those per-error pages don't stress for the instant-navigation goal:
+
+- **A boundary in the root layout isn't enough for client navigations.** It
+ passes a page-load check but leaves sibling client navigations blocking; put
+ the boundary below the lowest layout the source and destination routes share.
+- **Keep the LCP element** (usually the main heading) out of any boundary, so it
+ paints in the shell instead of waiting on a stream.
+- **A green check isn't always instant.** `export const instant = false` opts
+ the segment out of validation while the navigation still blocks, and a
+ `` above the document `` prerenders an empty shell — neither
+ makes the route instant.
+
+### D1: reuse the route's existing loading UI; do not hand-build skeletons
+
+Before writing any skeleton, search the repository for the loading UI that
+already exists for this route, in order:
+
+1. the route's `loading.tsx`;
+2. an exported `*Skeleton` colocated with the component;
+3. the fallback already inside the component's own ``.
+
+The **divergence point** is the lowest layout shared by the source and
+destination routes: a soft navigation re-renders only the segments below it,
+while an initial load re-runs every layout from the root. (Also called the
+shared boundary.) A `loading.tsx` above the divergence point fills only
+the initial-load shell; it sits above the soft-nav re-render scope. A
+`loading.tsx` at the destination segment is itself the in-tree boundary for a
+soft navigation into that segment and serves both. Reuse whichever boundary
+actually covers the navigation you are shipping; below the divergence point,
+`loading.tsx` and colocated skeletons are interchangeable for that purpose.
+
+If a component has no skeleton, extract its loading markup into a colocated
+skeleton beside it. Do not author a fresh skeleton that mirrors the page
+layout: it duplicates structure, drifts as the page changes, and pulls the
+design back toward a single coarse boundary. Reusing the component's own
+skeleton also keeps the prefetched shell consistent with the loaded UI.
+
+See: [Streaming](https://nextjs.org/docs/app/guides/streaming#push-dynamic-access-down)
+and [loading states](https://nextjs.org/docs/app/guides/instant-navigation#iterate-on-loading-states).
+
+Exception: if the deferred component renders `null` for some users (for
+example, a flag-gated control), `fallback={null}` is correct, since a skeleton
+would flash and then collapse.
+
+### D2: the shell must match the real render at every breakpoint
+
+A skeleton frozen to one breakpoint misaligns on the others. Fix it the same
+way: one responsive component renders both the live UI and the shell (D1
+skeleton in its data slots), so the breakpoint switch happens once. Verify by
+re-asserting the shell marker at two widths
+(`await page.setViewportSize({ width: 1280, height: 800 })`, then
+`{ width: 390, height: 844 }`), or by adding a mobile Playwright project, so
+this gate is as machine-checkable as the others. Detail:
+`reference/real-app-patterns.md`.
+
+> **D-gate: phase D is complete when the locked test from phase C passes GREEN
+> under the lock on the production-build rig**, not when the code compiles. That
+> GREEN is the deterministic stop for the fix loop; proceed to E.
+
+If the optimization adds or expands a cache boundary, follow
+[Revalidating](https://nextjs.org/docs/app/getting-started/revalidating).
+A passing `instant()` test proves shell readiness, not mutation freshness.
+
+**When URL data can't be pushed down** (for example, the whole page depends on
+`params`, `searchParams`, or the full URL), there may be no meaningful static
+shell to grow. Don't force one. Per-link prefetching can make the soft
+navigation instant, but it is outside this optimizer loop: it requires Partial
+Prefetching, a ` `, and cached URL-dependent content. See
+[Optimizing prefetching](https://nextjs.org/docs/app/guides/optimizing-prefetching)
+and pattern 10 in `reference/patterns.md` for the requirements, cost trade-offs,
+manual prefetch caveat, and `instant()` test gotchas.
+
+## E. PARITY: the refactor changed only whether the route is instant
+
+The push-down is a mechanical transform, not a redesign. Afterward the route
+must render the same tree, data, ordering, empty and error states, redirects,
+and interactions as before; the only observable difference is that the shell
+now commits instantly. Verify:
+
+- **Same render output.** The moved `await`s compute and return the same
+ values; after the stream, the route shows the same content as the base
+ branch for the test user.
+- **Side effects still fire.** A deferred `redirect()` or `notFound()` still
+ happens, at request time rather than during prerender. Confirm an
+ unauthorized user is still redirected and a missing record still returns 404.
+- **Both viewports reach the real UI** after the stream (D2).
+- **Client state survives.** Because the layout UI is hoisted into the stable
+ shell rather than swapped on resolve, open menus, scroll position, focus,
+ and input state persist across the stream.
+- **Pre-existing failures stay separate.** If the route errors after the
+ change, reproduce it on the base branch. The same failure there is an
+ environment or data problem, not an optimizer regression.
+
+If anything other than whether the route is instant changed, reduce the refactor.
+
+## F. DIFFERENTIAL
+
+Revert only the fix → RED; re-apply → GREEN; link both runs
+(`reference/red-test-robustness.md`). On a deployed rig, confirm each run is live
+(LIVENESS, phase A) before trusting its color.
+
+## G. REVIEW (PR checklist)
+
+A green final state means nothing if the RED was never trustworthy. The
+test-trustworthiness items are the robustness checklist
+(`reference/red-test-robustness.md`); confirm them, then require these
+PR-specific items:
+
+- [ ] **Differential shown**: RED without the fix, GREEN with it, runs linked.
+- [ ] **Parity confirmed (E)**: same content, redirects, and state.
+- [ ] **Mutations verified when applicable**: after populating any cache whose
+ data can be updated, a mutation test confirms the next read returns the
+ expected data.
+- [ ] **Existing loading UI reused (D1)**: no new page-mirroring skeleton.
+- [ ] **Shell matches the real render at desktop and mobile widths (D2)**.
+- [ ] **Baseline removed**: only the locked test from C remains.
+
+**Stop condition for the whole workflow:** the locked test from C is GREEN on
+the rig, the differential (F) holds, and every item above is checked. Until all
+three hold, you are not done.
+
+## Driving the navigation in tests
+
+- **Soft navigation** → drive a real ` ` click. **Initial load** → use
+ `page.goto()` inside `instant()` with the `baseURL` option. Do not substitute
+ `goto` for a soft-nav verdict; the two shells can differ
+ (`test-template.md`, `reference/real-app-patterns.md`).
+- With parallel routes, only the slots that change re-render on a soft
+ navigation; client-rendered navigation UI does not re-render at all. Do not
+ chase a slot the navigation never touches
+ (`reference/real-app-patterns.md`).
+
+## Files
+
+- `rig-template.md`: phase 0 production build, test context, navigation
+ contract, and unattended loop discovery.
+- `test-template.md`: the shipped `instant()` specs for both navigation
+ types (phase C), and the delete-before-PR baseline scaffold (phase B).
+- `reference/red-test-robustness.md`: the C-gate and phase F. The taxonomy of
+ untrustworthy REDs, the checklist, the differential recipe, the vacuous-pass
+ failure mode, and worked cases.
+- `reference/real-app-patterns.md`: parallel routes, deferring an auth gate,
+ initial-load vs soft-navigation shells, the empty-shell failure mode, the
+ responsive-skeleton mismatch, edge cases.
+
+## After optimization
+
+Once the target routes are instant, check whether the app has already adopted
+Partial Prefetching (`partialPrefetching: true`, or the relevant destination
+still uses `prefetch = 'partial'` during an incremental rollout).
+
+Make that check mechanically:
+
+```bash
+rg -n "partialPrefetching|prefetch\s*=\s*['\"]partial['\"]" --glob 'next.config.*' --glob 'app/**' --glob 'src/app/**'
+```
+
+If `partialPrefetching: true` is in config, the app is globally adopted. If only
+`prefetch = 'partial'` matches, treat those destination segments as adopted
+during an incremental rollout and keep checking any other target routes.
+
+- **Already adopted:** for any URL-data route that stopped at the limitation
+ above, consider a targeted ` ` on the links where having
+ that URL-specific content ready before the click is worth the per-link server
+ work. Keep the default link behavior everywhere else so the shared App Shell
+ remains the low-cost baseline.
+- **Not adopted yet:** recommend
+ [`next-partial-prefetching-adoption`](https://github.com/vercel/next.js/tree/canary/skills/next-partial-prefetching-adoption).
+ That skill moves the app onto the better prefetching model: shared App Shell
+ prefetches by default, fewer duplicated full-prefetch requests for visible
+ links, a link audit for existing ` ` usage, and optional
+ per-link prefetching only where URL-specific content is worth the
+ extra server work.
diff --git a/.agents/skills/next-cache-components-optimizer/reference/patterns.md b/.agents/skills/next-cache-components-optimizer/reference/patterns.md
new file mode 100644
index 0000000..9ec0cc0
--- /dev/null
+++ b/.agents/skills/next-cache-components-optimizer/reference/patterns.md
@@ -0,0 +1,357 @@
+# Refactor patterns — push dynamic down into the shell
+
+Each pattern is **before → after**: keep as much as possible in the prerendered shell, and wrap only genuinely per-request work in a tight `` (or hoist it into `use cache`). Production shapes — parallel-route slots, deferring an auth gate, client slot-routers — are in `real-app-patterns.md`.
+
+---
+
+## 1. Awaiting at the top → move the await into a Suspense child
+
+The most common blocking shape. Awaiting request-time data at the top of a page/layout makes **everything below it** dynamic.
+
+```tsx
+// ❌ before — top-level await of a non-static param + uncached data
+export default async function Page(props: PageProps<'/store/[slug]'>) {
+ const { slug } = await props.params
+ const product = await db.products.findBySlug(slug)
+ return (
+
+ {product.name}
+
+ )
+}
+```
+
+```tsx
+// ✅ after — pass the params promise down; await inside a Suspense-wrapped child
+import { Suspense } from 'react'
+
+export default function Page(props: PageProps<'/store/[slug]'>) {
+ return (
+ Loading product…
}>
+
+
+ )
+}
+
+async function Product({ params }: { params: Promise<{ slug: string }> }) {
+ const { slug } = await params
+ const product = await db.products.findBySlug(slug)
+ return (
+
+ {product.name}
+
+ )
+}
+```
+
+Inline variant when you don't want a separate component — unwrap the promise without awaiting at the top:
+
+```tsx
+export default function Page(props: PageProps<'/store/[category]'>) {
+ return (
+ }>
+ {props.params.then(({ category }) => (
+
+ ))}
+
+ )
+}
+```
+
+**Insight:** [runtime data during prerendering](https://nextjs.org/docs/messages/blocking-prerender-runtime).
+
+---
+
+## 2. `cookies()` / `headers()` in a layout → start, don't await; pass down
+
+A layout that awaits request data blocks the layout **and every page under it**.
+
+```tsx
+// ❌ before — whole layout (and all children) becomes dynamic
+export default async function Layout({ children }) {
+ const cookieStore = await cookies()
+ const theme = cookieStore.get('theme')?.value
+ return {children}
+}
+```
+
+```tsx
+// ✅ after — start the read without awaiting, pass the promise to a Suspense child
+import { Suspense } from 'react'
+import { cookies } from 'next/headers'
+
+export default function Layout({ children }: { children: React.ReactNode }) {
+ const cookieStore = cookies() // not awaited → does not block the shell
+ return (
+
+
+ }>
+
+
+
+ {children}
+
+ )
+}
+
+async function UserMenu({
+ cookiePromise,
+}: {
+ cookiePromise: ReturnType
+}) {
+ const theme = (await cookiePromise).get('theme')?.value
+ return …
+}
+```
+
+`{children}` and `` stay in the shell; only `` streams.
+
+**Insight:** [runtime data during prerendering](https://nextjs.org/docs/messages/blocking-prerender-runtime).
+
+---
+
+## 3. Uncached fetch / DB read → choose `use cache` _or_ ``
+
+Decide per data source. Same-for-everyone & rarely-changing → cache it (it joins the shell). Per-request & must-be-fresh → leave it uncached behind a boundary.
+
+```tsx
+// ❌ before — both block the shell
+const product = await db.products.findBySlug(slug) // rarely changes
+const inventory = await db.inventory.findBySlug(slug) // must be fresh
+```
+
+```tsx
+// ✅ after — cache the stable one (shell), defer the fresh one (streams)
+async function getProduct(slug: string) {
+ 'use cache' // → resolved at prerender, lands in the shell
+ return db.products.findBySlug(slug)
+}
+
+;Checking availability…}>
+ {/* uncached read stays here, streams in */}
+
+```
+
+> A bare `'use cache'` applies the `default` `cacheLife` profile. Choose freshness explicitly with `cacheLife('')` (`default` / `seconds` / `minutes` / `hours` / `days` / `weeks` / `max`) rather than shipping the default lifetime by omission.
+>
+> Serverless note: `use cache` is in-memory and does not persist across instances — use [`use cache: remote`](https://nextjs.org/docs/app/api-reference/directives/use-cache-remote) for a durable shell.
+
+**Insight:** [uncached data during prerendering](https://nextjs.org/docs/messages/blocking-prerender-dynamic).
+
+---
+
+## 4. Dynamic params → `generateStaticParams` (shell) or `` (stream)
+
+If the set of params is enumerable, prerender them so `await params` resolves into the shell. Otherwise treat params as request-time and wrap consumers in ``.
+
+```tsx
+// ✅ option A — enumerate → params resolve into the shell, no Suspense needed for params
+export function generateStaticParams() {
+ return [{ slug: 'shoes' }, { slug: 'hats' }]
+}
+export default async function Page({ params }: PageProps<'/store/[slug]'>) {
+ const { slug } = await params // known at build → shell-safe
+ // ...
+}
+```
+
+```tsx
+// ✅ option B — not enumerable → params is request-time; await it inside a boundary (pattern #1)
+```
+
+Root params (the dynamic segments the root layout sits inside, e.g. `app/[lang]/layout.tsx`) are readable from any Server Component via `next/root-params` without prop-drilling — but under Cache Components they must still be enumerated by `generateStaticParams` (at least one value per root param) to land in the shell, the same as any other dynamic param.
+
+**Insight:** [runtime data during prerendering](https://nextjs.org/docs/messages/blocking-prerender-runtime).
+
+---
+
+## 5. `searchParams` → always behind `` (on page load)
+
+Search params are never known at build, so awaiting them (or `useSearchParams()`) suspends on a page load. Keep the rest of the page in the shell by isolating the consumer.
+
+```tsx
+// ✅ static content stays in the shell; the search-dependent part streams
+export default function Page(props: PageProps<'/search'>) {
+ return (
+ <>
+ Search {/* shell */}
+ }>
+
+
+ >
+ )
+}
+async function Results({
+ searchParams,
+}: {
+ searchParams: Promise<{ q?: string }>
+}) {
+ const { q } = await searchParams
+ return
+}
+```
+
+On a **client navigation** the router already has the URL, so a `useSearchParams()` consumer resolves synchronously and can appear in the prefetched shell — but you still need the boundary for the page-load path.
+
+**Insight:** [runtime data during prerendering](https://nextjs.org/docs/messages/blocking-prerender-runtime) (or, via `useSearchParams` in a Client Component, [URL data in a Client Component](https://nextjs.org/docs/messages/blocking-prerender-client-hook)).
+
+---
+
+## 6. Non-deterministic values → `connection()` + ``, or cache
+
+`Math.random()`, `Date.now()`, `crypto.randomUUID()` produce different output each run, so Cache Components makes you choose: per-request (defer) or fixed (cache).
+
+```tsx
+// ✅ per-request value: gate on connection() and wrap in Suspense
+import { connection } from 'next/server'
+async function RequestId() {
+ await connection()
+ return {crypto.randomUUID()}
+}
+//
+```
+
+```tsx
+// ✅ same value for everyone: cache it so it joins the shell
+async function buildId() {
+ 'use cache'
+ return Date.now()
+}
+```
+
+**Insight:** [`Date.now()`](https://nextjs.org/docs/messages/blocking-prerender-current-time), [`Math.random()`](https://nextjs.org/docs/messages/blocking-prerender-random), or [`crypto`](https://nextjs.org/docs/messages/blocking-prerender-crypto) while prerendering.
+
+---
+
+## 7. Dynamic `generateMetadata` → static export, `use cache`, or a dynamic-marker for runtime data
+
+```tsx
+// ❌ before — reading request data blocks the route's metadata
+export async function generateMetadata() {
+ const c = await cookies()
+ return { title: c.get('title')?.value }
+}
+```
+
+```tsx
+// ✅ option A — static
+export const metadata = { title: 'Store' }
+
+// ✅ option B — cache the metadata (depends on external data, not runtime data)
+export async function generateMetadata() {
+ 'use cache'
+ return { title: await getTitle() }
+}
+```
+
+```tsx
+// ✅ option C — metadata genuinely needs runtime data (cookies/headers):
+// keep generateMetadata dynamic, and add a dynamic-marker component to the
+// page so the rest of the page still prerenders into the shell.
+import { Suspense } from 'react'
+import { connection } from 'next/server'
+import { cookies } from 'next/headers'
+
+export async function generateMetadata() {
+ const token = (await cookies()).get('token')?.value
+ return { title: token ? 'Personalized' : 'Store' }
+}
+
+async function DynamicMarker() {
+ await connection() // signals intentional dynamic content
+ return null
+}
+
+export default function Page() {
+ return (
+ <>
+ {/* static content — stays in the shell */}
+
+
+
+ >
+ )
+}
+```
+
+`generateViewport` is the same, except dynamic viewport blocks the **whole page**. Genuine instant fixes: a static `viewport` export, or `use cache`. The other two are dynamic-acceptance opt-outs, not instant fixes — do not treat them as a way to reach GREEN: `export const instant = false` opts the segment out of validation while the navigation still blocks, and a `` above the document `` makes the whole route dynamic.
+
+**Insight:** [runtime data in `generateMetadata()`](https://nextjs.org/docs/messages/blocking-prerender-metadata-runtime).
+
+---
+
+## 8. Keep the LCP element in the shell
+
+Don't bury the main heading (the LCP element) inside a boundary — it can't paint until the boundary resolves.
+
+```tsx
+// ✅ LCP outside the boundary → paints in the shell
+{product.name} {/* shell (cache the name if needed) */}
+ }>
+ {/* streams */}
+
+```
+
+---
+
+## 9. Granularity below shared layouts (client-nav correctness)
+
+A single boundary in the **root** layout passes a page-load check but leaves sibling client navigations blocking. Put a boundary **below the shared layout**.
+
+```tsx
+// app/store/layout.tsx — boundary below the /store shared layout covers
+// client navs like /store/shoes → /store/hats (the root boundary does not)
+export default function StoreLayout({
+ children,
+}: {
+ children: React.ReactNode
+}) {
+ return (
+
+ {/* shell */}
+ }>{children}
+
+ )
+}
+```
+
+Prefer per-component boundaries inside the page (patterns #1–#5) over one big layout boundary — they keep more real content in the shell and stream independently.
+
+**Insight:** the read's own insight surfaces on the client navigation when the boundary is too high — see [where to place the boundary](https://nextjs.org/docs/messages/blocking-prerender-dynamic#choosing-where-to-place-the-boundary).
+
+## 10. URL data that can't move
+
+Patterns 1–9 grow a **static shell** by moving dynamic reads behind boundaries. Session data from `cookies()` and `headers()` is handled by the earlier patterns. URL data is different: `params`, `searchParams`, and the full URL belong to one link, while the App Shell is shared by every link to the route.
+
+If the whole route depends on URL data, pushing the read lower may leave no meaningful shared shell to commit. That is the optimizer's stop point, not another shell refactor. Return to `SKILL.md` after the optimization loop for the optional per-link-prefetch follow-up.
+
+Per-link prefetching is the only way for this soft navigation to commit the
+URL-specific content before the click. It has **three requirements**:
+
+```tsx
+// 1. The destination has adopted Partial Prefetching, either app-wide with
+// partialPrefetching: true or route-by-route with prefetch = 'partial'.
+
+// 2. The navigation asks for a full prefetch — normally .
+// A default/auto prefetch only warms the static shell.
+
+ …
+
+
+// 3. The URL-dependent content is behind `use cache`, keyed by the resolved
+// params/searchParams/full URL value.
+```
+
+Under `instant()` the runtime entry is what commits, so the real content, not a skeleton, shows under the lock.
+
+Gotchas (each cost real debugging time):
+
+- **The full prefetch is mandatory.** With App Shells enabled an auto/PPR prefetch bails before the runtime spawn (`subtreeHasSpeculativePrefetch`); use ` ` for normal links, or keep an existing manual full-prefetch abstraction if the app already owns one. If the route is still RED after caching the URL-dependent content, the navigation may still be doing an auto prefetch.
+- **Partial Prefetching must be adopted for the destination.** Per-link prefetching uses the Partial Prefetching path. If the route is still RED after caching the URL-dependent content, check whether the link is still doing an auto prefetch or whether the destination never adopted Partial Prefetching.
+- **Prefetch the canonical URL.** A link whose href 307-redirects (a `/foo` that canonicalizes to `/`) can't be prefetched — the prefetch receives the redirect, not the tree. Point the link and the prefetch at the final URL.
+- **Don't blanket the full prefetch.** It fetches _all_ the target's dynamic data; enabling it for every visible link is wasteful. Scope `prefetch={true}` to the per-link-prefetch targets only, using the [trade-offs](https://nextjs.org/docs/app/guides/optimizing-prefetching#trade-offs) and [hover-triggered prefetch](https://nextjs.org/docs/app/guides/prefetching#hover-triggered-prefetch) when many links are visible.
+- **Marker must be a committed node, not RSC bytes.** The content is often a client component, so its text isn't in the prefetch response — assert a `data-testid` that renders when the client subtree commits, not a substring of the stream.
+
+Prefer a static shell (patterns 1–9) whenever the URL-data read can move: it's cheaper than a per-link prefetch and also covers hard load. Per-link prefetching is only for URL-data reads that genuinely can't move, or routes whose useful content is all URL-specific.
+
+**Insight:** [dynamic data during prefetching](https://nextjs.org/docs/messages/instant-link-prefetch-partial).
diff --git a/.agents/skills/next-cache-components-optimizer/reference/real-app-patterns.md b/.agents/skills/next-cache-components-optimizer/reference/real-app-patterns.md
new file mode 100644
index 0000000..31fa2e0
--- /dev/null
+++ b/.agents/skills/next-cache-components-optimizer/reference/real-app-patterns.md
@@ -0,0 +1,88 @@
+# Real-app patterns
+
+The rest of this skill models a single linear `layout → page` tree. Production App Router routes add **parallel routes, shared layout UI, and auth gates**, which is where most of the real static-shell work happens. These patterns bridge that gap. Read the skill's `SKILL.md` first.
+
+## Parallel routes: each slot is its own boundary
+
+Instant validation treats every parallel-route slot below the shared layout as an **independent** navigation boundary. Consequences:
+
+- **Each `@slot` needs its own ``** around its dynamic reads; a boundary in one slot does not cover another.
+- **An uncovered dynamic read in any slot blocks the whole navigation.** A perfect `@content` does not help if `@sidebar` awaits a session at the top.
+- **A slot that renders `null` (e.g. `default.tsx`) is shell-safe**: it is static and performs no reads. Slots that do not re-render for this navigation cost nothing.
+
+```
+[tenant]/layout.tsx (shared: already mounted on a soft navigation; not re-rendered)
+ ├ @content → settings/layout → billing/page ← guard each slot's dynamic reads…
+ ├ @sidebar → side nav ← …here too (independent boundary)
+ └ @header → default.tsx → null ← free
+```
+
+## Client-rendered slot routing is not part of the soft-navigation re-render
+
+A common pattern: a stable shared layout renders `@header`/`@sidebar` through a **client** component that swaps slot content based on `usePathname()`. On a soft navigation, Next.js only re-renders the **server** segments that changed below the shared layout; a client-component subtree is not part of that re-render. So that navigation UI neither blocks the navigation nor needs a server `` for it; only the server segments that actually change (e.g. `@content`) matter. It does participate in an initial load (see the caveat below).
+
+## "Instant" is not "useful shell": the empty-shell failure mode
+
+Validation checks that a dynamic read is **guarded by a boundary**, not that the fallback is non-empty. A `` with no `fallback` (or `fallback={null}`) passes validation and commits instantly, but renders a **blank** shell. If a layout and its page both `await getSession()` (your auth library's request-time read) at the top under one empty-fallback boundary, the whole frame collapses to nothing while the user waits. "Validates as instant" and "good loading experience" are different goals.
+
+> Give every boundary a real loading skeleton, and place it low so the most real content stays in the shell. A `fallback={null}` directly above `` is a deliberate empty-shell opt-out; an empty fallback lower in the tree is almost always a bug.
+
+## The responsive-skeleton mismatch: the shell must match every breakpoint
+
+A loading skeleton that misaligns with the loaded UI is its own bug, and it usually appears on mobile. A hand-built skeleton encodes one layout; the real component is responsive and changes shape at breakpoints, so a desktop-shaped skeleton no longer lines up once the viewport is small.
+
+A concrete shape: a list-detail view renders a list or tree in a side panel on desktop, but collapses that panel into a single dropdown or drawer on mobile (with its own loading state). A row skeleton built for the desktop panel has nothing to align with on mobile.
+
+The fix is the same push-down as everywhere else: **share the real responsive layout between the live render and the shell render.** One responsive component renders both (its data slots show the reused `*Skeleton` in the shell and real data after the stream), so the breakpoint switch happens once, for both renders, and there is no second desktop-only skeleton to drift.
+
+(Same hoist rule, responsive layout included.) Verify the shell at both desktop and mobile widths against the real render at the same width.
+
+## Deferring an auth gate / top-level `await` in a layout
+
+A top-level `await` in a layout blocks everything below it (the most common blocker; see [Runtime data during prerendering](https://nextjs.org/docs/messages/blocking-prerender-runtime)). Auth gates are the most common real instance:
+
+```tsx
+// ❌ Before: the await + redirect at the top blocks the whole settings frame
+export default async function SettingsLayout({ children }) {
+ const session = await getSession() // your auth library's request-time read; suspends during prerender → frame can't build
+ if (!session?.user) redirect(getLoginUrl())
+ return {children}
+}
+```
+
+```tsx
+// ✅ After: render children unconditionally; move the gate into a Suspense child
+import { Suspense } from 'react'
+
+export default function SettingsLayout({ children }) {
+ return (
+
+
+
+
+ {children}
+
+ )
+}
+
+async function AuthGate() {
+ const session = await getSession() // the session read suspends during prerender…
+ if (!session?.user) redirect(getLoginUrl()) // …so redirect() never runs at build time
+ return null
+}
+```
+
+The shell prerenders as if authorized (the session read suspends before `redirect()` is reached, so the redirect only happens at request time), and `{children}` is now in the shell instead of behind the gate. (`fallback={null}` is correct here: `AuthGate` renders nothing on success.)
+
+## Initial-load shell vs soft-navigation shell
+
+The `../test-template.md` specs drive a ` ` click for soft navigations and `page.goto()` for initial loads. The two shells can differ for the same route:
+
+> **The initial-load shell can show less than the soft-navigation shell when a layout above the shared boundary awaits un-enumerated `params`/`searchParams`.** An initial load re-runs every layout from the root; if a parent layout does `await props.params` and that segment has no `generateStaticParams`, the param suspends on the initial load and its whole subtree drops out of the shell. A soft navigation does not re-render that parent and already has the params. Symptom: an element present after a ` ` click is missing after `goto`.
+
+To assert the soft-navigation shell, drive a real ` ` click (through menus if necessary). Use `page.goto()` inside `instant()` to assert the initial-load shell, or when no parent above the shared boundary awaits un-enumerated params, in which case the two coincide.
+
+## Edge cases
+
+- **A `React.cache` (or custom memoization) wrapper around `cookies()`/`headers()` still suspends.** Memoizing the call does not make it shell-safe: the underlying request read still returns a pending promise during prerender. Only the **`use cache`** directive, keyed on static or param inputs, puts data in the shell.
+- **Playwright cannot see a `display: contents` or fragment fallback.** Such a fallback reads as hidden, so `instant()` assertions cannot `toBeVisible()` it. Give fallbacks a real wrapper element with a `data-testid`.
diff --git a/.agents/skills/next-cache-components-optimizer/reference/red-test-robustness.md b/.agents/skills/next-cache-components-optimizer/reference/red-test-robustness.md
new file mode 100644
index 0000000..bf106fa
--- /dev/null
+++ b/.agents/skills/next-cache-components-optimizer/reference/red-test-robustness.md
@@ -0,0 +1,156 @@
+# RED-test robustness: verify the RED before optimizing
+
+The C-gate of the workflow. A RED that is red for the wrong reason sends you optimizing a route that
+was never broken: the route becomes instant, the test stays red (or the code is contorted to
+satisfy a broken assertion), and the effort lands on the wrong problem. The prevention is cheap:
+spend a few minutes verifying the RED is trustworthy first.
+
+## The deciding question
+
+> **Does the marker render WITHOUT the lock, as the test user?**
+
+- **No**: the test is red because the marker or page is not there for that user or environment. A
+ marker bug, not an instant-navigation bug. Fix the marker. (This is the most common case.)
+- **Yes**: the marker exists and is reachable; a red under the lock is a genuine "not instant".
+ Optimize the route.
+
+Everything below serves answering that question honestly.
+
+## When the blocked route will not build
+
+With Cache Components, a top-level blocking read can fail the build before the
+test can produce a RED. Add `export const instant = false` to the target route
+as part of the temporary RED scaffold. It lets the known blocker build without
+making the navigation instant. Remove the opt-out with the fix, and include it
+when reverting the fix for the differential.
+
+## Cookie and session reads are not lock probes
+
+Do not manufacture a RED with `cookies()` or a session read alone. The testing
+lock restricts the navigation to its shell; it does not make request cookies
+unavailable. Use the route's real blocking uncached data, and prefer the
+self-validating test variant when deferred content exists.
+
+## The robustness checklist (all must hold)
+
+1. **Red on baseline**: fails on the unfixed route.
+2. **Right reason**: without the lock, the marker is visible on the production-build rig (never
+ `next dev`), running as the test user, not only in the author's own logged-in session.
+3. **Differential**: reverting only the fix → RED; re-applying → GREEN; nothing else moves it.
+4. **Non-gameable marker**: a sync element of the static shell, never streamed data.
+5. **Deterministic on a production build**: stable across N runs; never `next dev`.
+6. **Discriminating both ways**: present under the lock on an instant route, absent under the
+ lock on a blocking one.
+7. **Renders for the test user**: under that user's flags, plan, role, and data.
+8. **Conditional redirects accounted for**: assert at the route's real destination for that user.
+9. **Real selector**: a `data-testid` on a known static-shell node, not a guessed `role`/`name`.
+10. **Visible marker**: not `display:none`, off-screen, or inside a hover overlay; for lists,
+ target `.filter({ visible: true }).first()`.
+11. **Fresh build under test**: the deployment being measured contains the latest commit, not a
+ build URL still serving the previous deploy.
+
+## Taxonomy: red for the wrong reason
+
+Any of these makes a RED untrustworthy. None of them is "the navigation isn't instant."
+
+| Wrong reason | How it occurs | How to rule it out |
+| ---------------------------- | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------- |
+| **Selector matches nothing** | a guessed `getByRole('button', { name: 'Folder' })` | grep the component for the real accessible name; add a `data-testid` |
+| **Conditional redirect** | the route `redirect()`s for the test user (flag/role), so the marker page is never reached | check the page's top-level branches; assert at the real destination, or pin the flag |
+| **Flag / plan / role gate** | the author has the flag or plan; the test user does not | run the unlocked baseline as the test user; pin flags via the project's override mechanism |
+| **Empty state** | the marker only exists when data does; the CI account is empty | pick a marker present in the empty state (a layout element such as the page header), or seed data |
+| **Timeout / flake** | a slow API or transient infrastructure error | re-run; separate infrastructure flake from a real signal |
+| **Streamed marker** | the marker is behind ``, so it is never in the shell | choose a sync shell element; verify it sits outside every `` |
+| **Auth redirect** | unauthenticated → `/login` | confirm login succeeded before the navigation |
+| **Stale deployment** | the test ran against the previous build (the URL under test still serves the prior deploy) | poll the deployment for a marker from the latest commit before trusting any verdict |
+| **Hidden / off-screen** | the testid is on a hover-overlay or off-screen list item | put the marker on an always-visible node; `.filter({ visible: true }).first()` for lists |
+
+## Worked cases
+
+These are illustrative failures from real optimization runs; each was red for a wrong reason, and
+none was an instant-navigation problem. One app's drift surface might be dominated by feature flags and
+plans; another's by auth state, an empty database, or locale. The taxonomy lists every wrong
+reason; the rig file's DRIFT list says which rows apply to your app.
+
+- **Guessed selector + empty state**: the marker was a button picked by a guessed accessible name
+ that no element actually had, on a list page whose CI account had no rows. → checks 7, 9. Fix: a
+ `data-testid` on a real static-shell node.
+- **Hidden marker**: the testid sat first on a `hidden sm:block` hover-overlay link, then on an
+ off-screen carousel card; Playwright resolved the element but reported it hidden. → check 10.
+ Fix: an always-visible node; for lists, `.filter({ visible: true }).first()`.
+
+## Differential check (capture in the PR)
+
+The strongest evidence that the RED measured the property:
+
+```
+1. on the fixed branch → GREEN
+2. revert ONLY the fix (the push-down) → RED
+3. re-apply → GREEN
+4. confirm no other change moves it
+```
+
+Link the two runs (or include the toggle diff and results) in the PR description. A reviewer who
+sees the differential knows the test measures the property.
+
+## `instant()` is not a stopwatch
+
+See: [`instant()`](https://nextjs.org/docs/app/guides/instant-navigation#prevent-regressions-with-e2e-tests).
+
+The test does not measure how fast a navigation is. `instant()` gates dynamic data so the content
+of the static shell can be asserted; the signal is presence, not speed. Under the lock, an instant
+route's shell is present, and a blocking route's content never commits, regardless of wait time.
+Therefore:
+
+- The shipped assertion is `await expect(SHELL_MARKER).toBeVisible()` under the lock. Do not add a
+ custom timeout or a `painted` boolean.
+- A custom short timeout (e.g. `3000`) implies a race against a clock that does not exist. It adds
+ nothing to the verdict and invites false REDs on an instant route whose commit lands a microtask
+ late.
+- Do not use `locator.isVisible({ timeout })` as a soft wait: Playwright deprecated and ignores
+ that timeout; the call returns immediately.
+- "Renders for the test user" (checks 7-9) is established at authoring time with the unlocked
+ baseline scaffold, not by a timed assertion in the shipped test.
+
+## `instant()` guards need no retries and no prefetch warming
+
+An `instant()` guard is deterministic. Do not configure retries on one, and do not hover-warm to
+help a prefetch land in time. Under the lock, the router initiates the route prefetch and awaits it
+before committing (even for a `prefetch={false}` link, even for a route already in the prefetch
+cache), so the committed shell does not depend on any prior render, hover, or menu-open prefetch.
+A flaky guard has a real cause: a marker that is not a sync node of the destination's shell, a
+flag/role/empty-state gap for the test user, or a genuinely blocking route. The fix is in the page or
+the marker; a retry masks the regression the guard exists to catch. The only legitimate
+`.hover()`/menu-open is when the trigger element itself is not in the DOM until hovered or opened.
+
+## Silent no-op: the testing API must be exposed in the measured build
+
+`instant()` works by setting a cookie (`next-instant-navigation-testing`) that lock code inside the
+build reads. It does not throw when that lock code is absent; it only throws on nested calls or an
+unknown base URL. If the build was produced without the testing API
+(`experimental.exposeTestingApiInProductionBuild`), the cookie is ignored, the navigation runs
+normally, and the `instant()` test passes vacuously. A green `instant()` test is only meaningful if
+the lock engaged.
+
+Two defenses; use both:
+
+1. **Confirm the API is exposed on the target.** Wire the flag to the platform's preview/staging
+ condition or an explicit environment variable; the rig file records the project's spelling
+ (SKILL.md phases 0 and A). Do not trust a pass from a build where it is not set.
+2. **Make the test self-validating**: for any route with deferred content, also assert that the
+ deferred content is gated under the lock, not only that the shell is present
+ (`../test-template.md`, self-validating variant). If the lock did not engage, the content is
+ already present and `toHaveCount(0)` fails.
+
+ The gated half holds under the lock for both navigation types regardless of warm state: the
+ soft-nav client lock gates dynamic-data writes, and on an initial load the server honors the
+ cookie on the document request and suspends dynamic data. A vacuous pass is only possible with
+ a build produced WITHOUT the testing API, which defense #1 above covers.
+
+## Determinism and the rig
+
+- Always measure on a production build, never `next dev`; SKILL.md phase A owns this invariant and
+ its rationale.
+- Run the RED several times; an intermittently red gate is not a gate. If it flakes, determine
+ whether the cause is infrastructure (transient errors) or a real race before trusting either
+ color.
diff --git a/.agents/skills/next-cache-components-optimizer/rig-template.md b/.agents/skills/next-cache-components-optimizer/rig-template.md
new file mode 100644
index 0000000..e2a6ff4
--- /dev/null
+++ b/.agents/skills/next-cache-components-optimizer/rig-template.md
@@ -0,0 +1,173 @@
+# Production `instant()` rig
+
+The optimizer suite needs a production build that exposes the Next.js testing
+API, a stable URL for that build, and a Playwright command that can drive the
+initial loads or client navigations being optimized. Discover this setup once,
+record it in `instant-nav.rig.md`, and reuse it across optimization runs.
+
+Read an existing `instant-nav.rig.md` before creating one. Inspect the
+repository before asking the user:
+
+- `package.json` scripts for build, start, and end-to-end tests
+- `playwright.config.*` for `baseURL`, `webServer`, projects, and authentication
+- `next.config.*` for existing `experimental` options
+- CI, preview deployment, container, and hosting configuration
+- test helpers for login, `storageState`, fixtures, flags, and seeded data
+
+Ask only for details the repository cannot answer, such as unavailable
+credentials or which remote environment may expose the testing API.
+
+## What the rig must define
+
+### Production build and server
+
+Use `next build` followed by `next start`, or a remote artifact produced by the
+same production build. Development can help diagnose a route, but the final
+RED and GREEN must come from a production build.
+
+Record separate build and start commands. For a local rig, record the port,
+stop any previous server before starting, fail on `EADDRINUSE`, and confirm the
+new process owns the port before running Playwright. `next start` can fork a
+`next-server` child, so the launcher process ID may not own the port. Start the
+server in a process group that the rig can stop as a unit, or discover and stop
+the process listening on the recorded port before the next build.
+
+### Testing API
+
+An `instant()` test against a production build requires
+`experimental.exposeTestingApiInProductionBuild`. Gate it so real production
+builds do not expose the API:
+
+```ts filename="next.config.ts" highlight={3,8-10}
+import type { NextConfig } from 'next'
+
+const exposeTestingApi = process.env.EXPOSE_TESTING_API === '1'
+
+const nextConfig: NextConfig = {
+ cacheComponents: true,
+ experimental: {
+ exposeTestingApiInProductionBuild: exposeTestingApi,
+ },
+}
+
+export default nextConfig
+```
+
+Merge the option into an existing `experimental` object instead of replacing
+the project's other experimental options.
+
+Set the condition while running `next build`. Setting it only for `next start`
+is too late because the testing API is compiled into the production artifact.
+When the artifact was built without it, Next.js does not activate the
+navigation lock, so the test cannot distinguish shell content from streamed
+dynamic content. Rebuild with the condition enabled before interpreting the
+results. Use the project's existing environment naming when it already
+distinguishes test, staging, preview, and production builds.
+
+### Test command and base URL
+
+Record the exact Playwright command and how it receives the measured build's
+URL. Reuse the project's package manager, Playwright configuration, projects,
+and reporters. The suite must import `instant()` from `@next/playwright`. If
+the dependencies are absent, install `@next/playwright` on the same release
+line as the project's `next`, alongside `@playwright/test`.
+
+For a local rig, a typical sequence is:
+
+```bash filename="Terminal"
+EXPOSE_TESTING_API=1 pnpm build
+pnpm start --port 3000
+BASE_URL=http://localhost:3000 pnpm playwright test tests/static-shell.spec.ts
+```
+
+Adapt the script names and port to the project. Keep the production server
+running while the test command executes. Follow the public
+[`instant()` testing pattern](https://nextjs.org/docs/app/guides/instant-navigation#prevent-regressions-with-e2e-tests): use `page.goto()` for an initial-load
+contract and click the real ` ` for a client-navigation contract.
+
+### Test context
+
+Record the state required to reach the target route and shell marker:
+
+- Use `public; no authentication` when the route is public.
+- Otherwise record the test account and login mechanism, including a fixture,
+ `storageState`, API login, or seeded session.
+- Record flags, plan, role, locale, seeded data, and other state that can change
+ which shell the test sees.
+
+A test user is not required. The field exists to make authenticated and
+state-dependent tests reproducible when the app needs one.
+
+### Drift
+
+List differences between the state used to choose the shell contract and the
+state used by Playwright. Feature flags, permissions, empty test data, and
+locale differences can make an assertion fail because the target is
+unreachable, not because its shell blocks. Write `none known`
+only after checking the test context.
+
+### Iteration loop
+
+Record the complete loop the agent can repeat without rediscovering commands:
+
+- Local: build with the testing API, start the new artifact, run the focused
+ suite, stop the server, edit, and repeat.
+- Remote: push, wait for the measured artifact, verify it matches `HEAD`, run
+ the focused suite against its URL, edit, and repeat.
+
+Note any step the agent cannot perform without the user, including deployment
+approval, protected branches, secrets, or multi-factor authentication.
+
+### Artifact liveness
+
+For a remote rig, record how the test proves the deployment matches `HEAD`.
+Prefer an endpoint or response header that exposes the deployed commit SHA. If
+the app has neither, use the deployment provider's API to select the artifact
+whose commit SHA matches `HEAD`.
+
+A freshly completed local `build` followed by `start` does not need a SHA
+probe. Record `n/a; local build and start`.
+
+### Walls
+
+Record build and run obstacles with their working resolution, such as required
+environment variables, server-only imports that fail during prerendering,
+unavailable credentials, or a process that keeps reclaiming the test port.
+Reuse these notes on the next iteration.
+
+## Write `instant-nav.rig.md`
+
+Place this file at the repository root or next to the end-to-end configuration:
+
+```md
+# instant-nav rig:
+
+- BUILD:
+- EXPOSE:
+- RUN:
+- TEST USER: ; state:
+- DRIFT:
+- CONTRACTS:
+- LOOP: ; agent limits: <...>
+- LIVENESS:
+- WALLS:
+```
+
+`CONTRACTS` may list more than one focused navigation, but each route and
+navigation type needs its own test. Every field needs a concrete value. `n/a`
+is valid only with a reason, such as `TEST USER: public; no authentication` or
+`LIVENESS: n/a; local build and start`.
+
+## Check the rig before writing the baseline
+
+Before recording the static-shell contract:
+
+1. Build with the testing API condition enabled.
+2. Start or locate that exact artifact and confirm the base URL responds.
+3. Run one focused `instant()` smoke test using the intended navigation type.
+4. Confirm the test can reach the route and eventual destination UI in the
+ recorded test context.
+
+Fix the rig before interpreting an optimizer failure. A missing testing API,
+stale deployment, unreachable target, or wrong test state is an environment
+failure rather than evidence that the shell blocks.
diff --git a/.agents/skills/next-cache-components-optimizer/test-template.md b/.agents/skills/next-cache-components-optimizer/test-template.md
new file mode 100644
index 0000000..efd4444
--- /dev/null
+++ b/.agents/skills/next-cache-components-optimizer/test-template.md
@@ -0,0 +1,167 @@
+# Test template: the instant() guard
+
+See: [`@next/playwright` `instant()`](https://nextjs.org/docs/app/guides/instant-navigation#prevent-regressions-with-e2e-tests).
+
+Ship one test per navigation type you are guarding: under `instant()`, assert that the
+destination's static shell appears. `instant()` gates dynamic data, so a correctly instant route
+commits its shell under the lock and a blocking route does not. `instant()` is a ruler, not a
+stopwatch: do not add custom timeouts or timing races (see `reference/red-test-robustness.md`).
+Whether the marker is the right one (rendering for the test user, not flag-gated, not redirected
+away, not guessed) is established at authoring time with the unlocked baseline scaffold below
+(phase B, the C-gate), not by additional assertions in the shipped test.
+
+All identifiers in angle brackets (``, ``) and the `../helpers` import are placeholders;
+substitute your project's e2e auth helper, URL helper, and real testids/trigger before running.
+
+## Soft navigation (client-side navigation)
+
+Drive a real ` ` click. The committed shell is the destination's prefetched App Shell.
+Under the lock the router initiates and awaits the route prefetch itself, so no manual warming is
+needed; if the shell is intermittently absent, treat it as a real blocker or marker bug (C-gate),
+never as a warming race. Do not add waits or hovers.
+
+```ts
+import { test, expect } from '@playwright/test'
+import { instant } from '@next/playwright'
+// Use the auth/setup helpers your e2e suite already has. Run as the test user
+// (defined in SKILL.md phase B).
+import { logIntoTestAccount, testUrl } from '../helpers'
+
+// A SYNC element of the destination's static shell (header, action button,
+// column header), not data that streams in, and one that renders for the
+// test user (not gated by a flag, plan, role, or empty state). Prefer a
+// data-testid on a known static node over a guessed role/name.
+const SHELL_MARKER = '[data-testid="-shell-marker"]'
+
+test.describe('instant nav: A -> B', () => {
+ test.beforeEach(async ({ page, browser }) => {
+ await logIntoTestAccount(page, browser)
+ })
+
+ test('B shell commits under instant()', async ({ page }) => {
+ await page.goto(testUrl('/'))
+ const trigger = page.getByRole('link', { name: '', exact: true })
+ await expect(trigger).toBeVisible({ timeout: 20000 })
+
+ await instant(page, async () => {
+ await trigger.click()
+ // static shell asserted under the lock; no timeout
+ await expect(page.locator(SHELL_MARKER)).toBeVisible()
+ })
+ })
+})
+```
+
+The trigger selector follows the same rule as `SHELL_MARKER`: prefer a `data-testid` on the real
+` ` (`page.getByTestId('-link')`) over a guessed accessible name. `getByRole({ name })`
+is shown only for brevity; like the marker, the trigger must reliably resolve for the test user.
+
+## Initial load (hard navigation)
+
+Drive `page.goto()` inside `instant()` with the `baseURL` option. The served document is the
+route's prerendered static shell. `baseURL` is required because `page` is still `about:blank` when
+`instant()` runs (`resolveURL` falls back to `page.url()` only when no `baseURL` is passed).
+Establish the session WITHOUT navigating `page` (inject `storageState`, or log in on a separate
+context/page). A login helper that navigates `page` itself defeats the measurement for a different
+reason: that navigation completes before `instant()` acquires the lock, so it runs unmeasured. The
+session must be pre-established either way; otherwise an authenticated route redirects to login
+and the RED is false.
+
+If the project's only login helper navigates `page`, the agent must use a
+storageState/separate-context path here instead, a session-injection call that
+does NOT call `page.goto`:
+
+```ts
+test.describe('instant initial load: B', () => {
+ test.beforeEach(async ({ page }) => {
+ await injectTestUserSession(page) // storageState only; must NOT call page.goto
+ })
+
+ test('B shell is served', async ({ page }) => {
+ const url = testUrl('/')
+ await instant(
+ page,
+ async () => {
+ await page.goto(url)
+ await expect(page.locator(SHELL_MARKER)).toBeVisible()
+ },
+ { baseURL: new URL(url).origin }
+ )
+ })
+})
+```
+
+## Self-validating variant (recommended for routes with deferred content)
+
+Also assert that the deferred content is gated under the lock and streams after release. This
+makes a vacuous pass impossible: if the lock did not engage (testing API missing from the build),
+the content is already present and `toHaveCount(0)` fails (see `reference/red-test-robustness.md`).
+
+`SHELL_MARKER` is the shell node; `[data-testid="-content"]` is the deferred data it guards.
+
+```ts
+// soft navigation
+await instant(page, async () => {
+ await trigger.click()
+ await expect(page.locator(SHELL_MARKER)).toBeVisible() // shell present
+ await expect(page.getByTestId('-content')).toHaveCount(0) // deferred data gated
+})
+await expect(page.getByTestId('-content')).toBeVisible() // streams after release
+```
+
+The two **gated-half** assertions (shell visible, deferred content `toHaveCount(0)`) apply to the
+initial-load `page.goto()` form too. The cookie gates the deferred content identically for both:
+on a soft navigation the client lock gates dynamic-data writes; on an initial load the server
+honors the cookie on the document request (set via `addCookies()` before navigation, scoped by
+`baseURL`) and suspends dynamic data, independent of whether the route was previously rendered or
+cached. So the initial-load `toHaveCount(0)` gated half is as valid as the soft-nav one; it needs
+no fresh browser context and no cache-busting query param.
+
+The **post-release** assertion (`getByTestId('-content').toBeVisible()` after the `instant()`
+block) is soft-nav only. On an initial load the document was already emitted under the lock, so
+nothing streams in after release; drop that assertion from the initial-load test, or
+`page.reload()` first to fetch an unlocked document. The mechanism is in
+`reference/red-test-robustness.md`.
+
+## Baseline scaffold: do not ship
+
+Before optimizing, confirm the target exists with an unlocked check (no `instant()`). It
+disambiguates "not instant" from "marker absent for this user or environment". Run it as the test
+user; mismatch against the rig DRIFT list is what the C-gate catches
+(`reference/red-test-robustness.md`). Confirm the marker is real and reachable, then delete the
+scaffold before the PR.
+
+**The baseline must mirror the navigation type of the test you are shipping.** Drive a ` `
+click when guarding the soft-nav shell; drive `page.goto()` when guarding the initial-load shell.
+The two shells can differ (`reference/real-app-patterns.md`): a click-driven baseline run against a
+shipped `goto` test would confirm a marker that the `goto` path never shows, which produces exactly
+the false RED the C-gate exists to prevent.
+
+```ts
+// soft-nav baseline: mirror the soft-nav instant() test
+test('dev-only: navigating to renders its shell (no lock)', async ({
+ page,
+}) => {
+ await page.goto(testUrl('/'))
+ const trigger = page.getByRole('link', { name: '', exact: true })
+ await expect(trigger).toBeVisible({ timeout: 20000 })
+ await trigger.click()
+ await expect(page).toHaveURL(/\/(\?|$)/) // confirm the real destination (no redirect away)
+ await expect(page.locator(SHELL_MARKER)).toBeVisible({ timeout: 15000 })
+})
+```
+
+```ts
+// initial-load baseline: mirror the initial-load instant() test (session pre-established)
+test('dev-only: shell is served (no lock)', async ({ page }) => {
+ await page.goto(testUrl('/'))
+ await expect(page.locator(SHELL_MARKER)).toBeVisible({ timeout: 15000 })
+})
+```
+
+Notes:
+
+- Pick `SHELL_MARKER` as a sync element of the destination's static shell, never streamed data.
+ Use a `data-testid` on a known static node rather than a guessed role/name.
+- Do not put a custom timeout, a `painted` boolean, or `isVisible({ timeout })` in the shipped
+ assertion, and do not add retries or hover-warming; see `reference/red-test-robustness.md`.
diff --git a/.agents/skills/next-dev-loop/SKILL.md b/.agents/skills/next-dev-loop/SKILL.md
new file mode 100644
index 0000000..d6973df
--- /dev/null
+++ b/.agents/skills/next-dev-loop/SKILL.md
@@ -0,0 +1,187 @@
+---
+name: next-dev-loop
+description: >
+ Verify Next.js runtime behavior after editing app code. Use this
+ skill to confirm a change actually works in a running app — not
+ just that it compiles or type-checks. Combines /_next/mcp
+ (Next.js's view) with agent-browser (the browser's view).
+ Requires a running `next dev`.
+---
+
+# next-dev-loop
+
+The edit/verify rhythm during `next dev` — make a change, then
+confirm it actually works at runtime, not only that the types or
+the build are happy.
+
+You verify through two views of the same running app:
+
+- **`/_next/mcp`** — an HTTP endpoint Next.js exposes about itself.
+ Knows framework-specific things: routes, segments, RSC, server
+ actions, server logs, and errors as Next.js saw them. Call
+ `tools/list` for the current surface.
+- **`agent-browser`** — a CLI that drives a real Chrome. Knows
+ framework-agnostic browser things: DOM, console, network, React
+ fiber, vitals. Before driving it, run `agent-browser skills get core`
+ once for the version-matched usage guide — don't guess subcommands
+ from memory.
+
+The two views cross-check each other.
+
+## requires
+
+- Next.js **16.3+** with **Turbopack** — `/_next/mcp` plus the
+ proactive compile check via `get_compilation_issues`.
+- `agent-browser` **>= 0.31.1** — React introspection, worktree-scoped
+ `session id`, idempotent `--restore`, and launch flag reconciliation.
+
+These are hard floors, not soft preferences. If anything is missing,
+tell the user how to upgrade and stop. Don't fall back to grepping
+source or to a weaker probe — this skill assumes both views are live
+at the versions above.
+
+- Upgrade Next.js: `pnpm next upgrade` (or `npx next upgrade`).
+ Docs: https://nextjs.org/docs/app/getting-started/upgrading
+ (version-16 guide:
+ https://nextjs.org/docs/app/guides/upgrading/version-16)
+- Install or upgrade `agent-browser`: `npm i -g agent-browser@latest`.
+ If the CLI isn't on `PATH`, install it before continuing — preflight
+ expects to invoke it directly.
+
+## preflight
+
+Once per session, confirm both views are live.
+
+1. **Open `agent-browser` at the target URL, restoring saved
+ login state when present.** First derive one stable session id for
+ this checkout and use it for every `agent-browser` command:
+
+ ```bash
+ SESSION="$(agent-browser session id --scope worktree --prefix next-dev-loop)"
+ export AGENT_BROWSER_SESSION="$SESSION"
+ export AGENT_BROWSER_RESTORE="$SESSION"
+ ```
+
+ Then open the target URL:
+
+ ```bash
+ agent-browser --session "$SESSION" --restore --headed --enable react-devtools open
+ ```
+
+ `--scope worktree` keeps parallel worktrees and copied checkouts
+ from colliding. Bare `--restore` uses the session id as the
+ persistence key, loads saved cookies/localStorage before navigation
+ when present, and auto-saves state on close. Always pass the desired
+ launch flags on `open`; agent-browser will reuse, relaunch, or restart
+ its scoped background state as needed.
+
+ The browser is the user's. If state was not restored (first run,
+ expired session) and the page is gated, the user drives the login —
+ pause until they confirm. After login, continue using the same session
+ and restore context; `agent-browser close` saves the cookie state so
+ the next `open` restores it.
+
+2. Probe `/_next/mcp` (`tools/list`) — confirm it's reachable and
+ lists `get_compilation_issues`. First read the port off the
+ `next dev` banner; if it isn't 3000, set
+ `NEXT_MCP_URL=http://localhost:/_next/mcp` before probing:
+ - Unreachable → either `next dev` isn't running, or Next.js is
+ below 16.3. Check `package.json` to disambiguate, then refuse.
+ - `get_compilation_issues` not in the list → Next.js below 16.3.
+ Refuse and tell the user to upgrade.
+3. `get_compilation_issues` doubles as a Turbopack probe. An error
+ response of `"Turbopack project is not available..."` means the
+ user is on webpack. Refuse — Turbopack is required.
+4. `get_routes` → your route map for the rest of the session.
+
+## loop
+
+### before the edit — narrow the scope
+
+Ask the running app, not the codebase. `/_next/mcp` knows which
+files rendered the current route; use those as your search scope.
+Runtime introspection stays cheap as the codebase grows; agentic
+search doesn't.
+
+### after the edit — verify
+
+Four failure modes. Check each:
+
+- **Compiles** — `get_compilation_issues`.
+- **Runs without errors** — `/_next/mcp` (server and bubbled-up
+ browser errors both surface here).
+- **Behaves as intended** — `agent-browser` drives the page; assert
+ what the user actually sees.
+- **React-level behavior** — `agent-browser` with react-devtools
+ enabled exposes the component tree, props, state, and render
+ counts. Anchor framework-level checks here (extra renders,
+ server/client boundary shifts, suspense fallbacks) — DOM asserts
+ alone miss them.
+
+Pick the specific tool from `tools/list` or the agent-browser
+manual rather than from memory.
+
+## gotchas
+
+- **Preserve `.next` while the development server is running.** Moving or
+ deleting it disconnects the server from its generated state and discards
+ incremental caches. Moving it to a backup is still a reset. If a production
+ build needs isolated output, configure a separate `distDir`.
+- **Every `agent-browser` command must know your session and restore
+ key, or it may use an empty default browser or fail to save login
+ state.** Easiest: export both `AGENT_BROWSER_SESSION="$SESSION"` and
+ `AGENT_BROWSER_RESTORE="$SESSION"` at the top of each shell you run
+ agent-browser in. If you do not export them, pass
+ `--session "$SESSION" --restore` on every command.
+- **When the two views disagree, suspect the tooling first.** If
+ `agent-browser` says a route is broken but `/_next/mcp` and the
+ server say it rendered cleanly, a stale or misdirected browser
+ session is the likelier cause than a real bug — reconcile the views
+ before debugging the app.
+- Confirming a click or navigation: the page settles a beat later, so
+ wait with `wait --load networkidle` (no path to get wrong), then
+ snapshot/read to confirm the page. Avoid `wait --url` unless you pass
+ the link's exact href — a guessed or placeholder path won't match the
+ real URL and times out after 25s.
+- A blank read, empty snapshot, `about:blank`, or a "no browser
+ session" error — right after `open` or after a click (even if `open`
+ reported the page) — is the browser dropping the page (a stale
+ session), not a broken route. Reopen your session at the URL with
+ `--session "$SESSION" --restore` and re-snapshot; if still blank,
+ run `agent-browser --session "$SESSION" --restore close`, then open
+ again. Don't fall back to `curl`; it bypasses the browser you're
+ testing.
+- React introspection output is stale after navigation. Re-run.
+- `/_next/mcp` replies are SSE — read the JSON off the `data:` line
+ with `sed -n 's/^data: //p'` (a plain `sed 's/^data: //'` leaves the
+ `event:` line and the parse fails).
+- `get_errors` and `get_page_metadata` need at least one navigation
+ to populate.
+
+## reference
+
+All tools below are present once preflight passes. If `tools/list`
+is missing any of them, preflight should have refused — re-check.
+
+```
+# /_next/mcp notes
+get_project_metadata projectPath, devServerUrl, bundler
+get_routes fs-scan; no browser session needed
+get_errors runtime + build; needs a browser session;
+ includes browser-side errors caught by the
+ dev server
+get_page_metadata segment trie + routerType; needs a browser
+ session; use as a discovery shortcut for
+ which files power a route
+get_logs returns logFilePath
+get_server_action_by_id hashed id → file + functionName
+get_compilation_issues Turbopack only; errors on webpack
+ ("Turbopack project is not available")
+```
+
+## teardown
+
+Close the session with the same session and restore context:
+`agent-browser --session "$SESSION" --restore close`. `close` saves
+that session's cookies and storage so the next loop's `--restore` open
+keeps the user logged in. Leave `next dev` up for the next loop.
diff --git a/.claude/skills/next-cache-components-adoption/SKILL.md b/.claude/skills/next-cache-components-adoption/SKILL.md
new file mode 100644
index 0000000..07ac8aa
--- /dev/null
+++ b/.claude/skills/next-cache-components-adoption/SKILL.md
@@ -0,0 +1,250 @@
+---
+name: next-cache-components-adoption
+description: >
+ Turn on Cache Components in a Next.js app and resolve the blocking routes it
+ surfaces. Use when the user wants to enable, adopt, or migrate to Cache
+ Components, flip the `cacheComponents` flag, work through a flood of
+ blocking-prerender / instant validation errors, run the
+ `cache-components-instant-false` codemod, or decide between opting routes out
+ with `export const instant = false` and fixing them in place.
+---
+
+# next-cache-components-adoption
+
+Enable Cache Components on an app and walk it to a passing build. This skill sequences the work; per-error recipes live in the dev overlay fix cards and the build's terminal output. The [migrating to Cache Components guide](https://nextjs.org/docs/app/guides/migrating-to-cache-components) is the canonical reference for the concepts and per-API recipes this skill applies — consult it whenever the skill steps reference a pattern (`"use cache"`, `cacheLife`, `` placement, etc.) and you want the full explanation.
+
+## requires
+
+- **App Router project.** Cache Components is an App Router feature; `cacheComponents: true` does nothing for `pages/` routes. If the project has a `pages/` or `src/pages/` tree but no `app/` or `src/app/` tree, stop and tell the user — Pages → App migration is its own project, not part of this skill. A hybrid app (both `pages/` and `app/`) is fine: the flag affects the `app/` routes; `pages/` routes are unaffected and don't need opt-outs.
+
+- **A resolved app directory.** Locate `next.config.{js,ts,mjs,cjs}` first: that's the project root, and an agent invoked from a subdirectory would otherwise test for `app/` against the wrong `cwd` and find nothing. Look for `app/` and `src/app/` under it, and treat every command and glob in this skill as relative to whichever one exists. If both exist, Next.js builds `app/` and never looks at `src/app/`, so its routes are shadowed and unbuilt — tell the user that and ask which tree to migrate instead of picking one.
+
+- **A runnable app.** The whole loop verifies against `next dev` and a browser, so the app has to boot. If it reads a database or required env at import (e.g. an `env.ts` that throws on a missing `DATABASE_URL`), confirm it actually starts — with the real environment, or local data you stand up — before step 1. Adoption can't be verified against an app that won't run.
+
+- **Next.js 16.3 or later.** That release is where the pieces this skill relies on land: top-level `cacheComponents`, `export const instant`, the dev-overlay instant-navigation validation warnings, and the `cache-components-instant-false` codemod. If `next --version` reports below 16.3, upgrade first:
+ - `npx @next/codemod@latest upgrade latest` to apply the version-to-version codemods.
+ - Read the relevant [version upgrade guide](https://nextjs.org/docs/app/guides/upgrading) (e.g. [Version 16](https://nextjs.org/docs/app/guides/upgrading/version-16)) for what the codemod doesn't cover.
+
+- **No incompatible config keys.** `cacheComponents: true` errors on any file that still exports `dynamic`, `revalidate`, or `fetchCache`. Inventory these exports before running the codemod, then follow the [migration guide's per-key sections](https://nextjs.org/docs/app/guides/migrating-to-cache-components). The guide is the source of truth for translating each value. The `cache-components-instant-false` codemod does not remove these configs.
+
+- **`experimental.dynamicIO` is fatal.** It was renamed to top-level `cacheComponents` and the old key now aborts before any build can run — remove it (or replace with `cacheComponents: true`) first. `experimental.useCache` is still accepted as a deprecated alias; redundant once `cacheComponents: true` is set, so remove it for clarity.
+
+### notes
+
+- **No passing baseline before the flag.** If the app already uses `"use cache"`, the pre-flag build errors with `please enable the feature flag cacheComponents`. Enabling the flag is the first thing you do (in Incremental, before the codemod; in Direct, before fixing routes) — not a thing to do _after_ getting a passing build. Note this in your starting summary so it doesn't read as a regression.
+
+- **Existing caches can stay.** Follow the migration guide's [`fetch` and `unstable_cache` sections](https://nextjs.org/docs/app/guides/migrating-to-cache-components#fetch-cache-options). Do not rewrite them solely to enable Cache Components.
+
+- **Offline docs.** Guide links have offline copies under `node_modules/next/dist/docs/` (bundled since Next.js 16.2), with the directory layout numbered for ordering (e.g. `node_modules/next/dist/docs/01-app/02-guides/migrating-to-cache-components.md`). If you can't predict the numbered prefix, `find node_modules/next/dist/docs -name '.md'` resolves it. The `/docs/messages/*` error pages are not bundled.
+
+- **Older versions without bundled docs.** Suggest `npx @next/codemod@latest agents-md` to the user before starting: it downloads a version-matched copy to `.next-docs/` and writes an index into `AGENTS.md` / `CLAUDE.md`. It touches files in their repo, so ask first and run it only if they want it.
+
+## the shape of the work
+
+There's one loop: walk the route tree top-down, one feature at a time, adopting each route against `next dev` + a browser. The build is a final check for each feature, not the working surface.
+
+The choice in step 1 is whether to opt every route out of validation first or fix routes as you go. Either way the loop is the same:
+
+- **With a quiet pre-step (Incremental).** Run the codemod, fix what it can't, and fully migrate routes that previously required static rendering. Other routes keep their opt-outs for follow-up PRs.
+- **Without (Direct).** Enable `cacheComponents` and start the loop on whatever the build flags first. Same loop, but every fix sits on one branch until adoption is complete.
+
+In both, the per-route success bar is the same: **dev loop reports no errors AND `next build` passes**. Check in with the user after every feature, and suggest a commit but never make one without their confirmation. Expect to spend most of the time in the loop, not in the pre-step.
+
+## background
+
+`cacheComponents: true` requires every route to be prerenderable. A route that reads request-time data outside `` is "blocking" and fails the build. `export const instant = false` marks a route as allowed to block, which clears it in both dev and build; on a layout it covers the whole subtree during the build, but client navigations still validate each descendant segment on its own. Reads wrapped in a [`"use cache"`](https://nextjs.org/docs/app/api-reference/directives/use-cache) function count as cache boundaries, not blocking reads.
+
+When a fix introduces `"use cache"`, follow the Caching guide for [choosing a data-level or UI-level boundary and setting its lifetime](https://nextjs.org/docs/app/getting-started/caching#usage) and [revalidating after mutations](https://nextjs.org/docs/app/getting-started/revalidating). Use the [`use cache` cache-key reference](https://nextjs.org/docs/app/api-reference/directives/use-cache#cache-keys) when the result varies by arguments or captured values.
+
+Three classes of blocker come up, usually in this order:
+
+Whenever a fix introduces ``, follow the Streaming guide's [granular streaming pattern](https://nextjs.org/docs/app/guides/streaming#granular-streaming-with-suspense) and [guidance for preventing CLS](https://nextjs.org/docs/app/guides/streaming#cls-cumulative-layout-shift).
+
+1. **Request-time reads** (`cookies()`, `headers()`, `await params`, `await searchParams`). All four block when awaited at the top of a page or layout. `params` and `searchParams` often get missed because they're not framed as "request data" the way cookies and headers are. The fix is to push the read into a ``-wrapped child — and for `params`/`searchParams`, forward the promise into the child and await it there; don't `await` at the page top.
+2. **Sync-IO at module/render time** (`new Date()`, `Date.now()`, `Math.random()`, `crypto.randomUUID()`). These fail the build even with `instant = false` — the opt-out doesn't suppress them. If they're in a shared layout, they block every route under it. The codemod can't fix them; after running it, use each build error and its linked documentation to identify which reported calls to translate by hand (see the [incremental pre-step](#incremental)).
+3. **`"use cache"` files that read request data.** A file with a top-level `"use cache"` directive can't export `instant`; combining the two errors with `Only async functions are allowed to be exported in a "use cache" file.`, which means the directive was wrong for that route. Remove it before running the codemod.
+
+## working surfaces
+
+### finding blocking routes
+
+Prefer `next dev` over `next build` while you work.
+
+- **`next dev`** — the working surface. Visit a route; its blocking errors surface in the dev overlay with full stack traces and fix cards linking the per-error docs. Work one route at a time — errors don't accumulate in one place. The route itself still returns HTTP 200, so read the overlay (or `.next-dev.log`), not status codes. A cleared overlay is one half of calling a route clean — the other half is browser verification (see [step 2](#step-2-the-inner-loop-remove-opt-outs-one-feature-at-a-time)) and a passing build for that route.
+- **`next build`** — detection only. The build is `next dev`'s authoritative check, not its replacement. Use it as the last gate on each feature in the loop (a passing build is part of the per-route success bar) and as the final verification across the whole app. In Incremental, the build also confirms the pre-step (codemod opted every route out, no shared layout still has a sync-IO blocker) before you ship that PR. Don't reach for the build instead of the dev loop while you're working a route — a passing compile doesn't tell you what ended up in the static shell and what streamed. By default the build stops at the first blocking route, so it's also poor for sizing the work. Two flags help when iterating: `--debug-build-paths` builds only the routes you name (comma-separated glob patterns of file paths relative to the project root, e.g. `--debug-build-paths="app/admin/**/page.tsx"` — not URL paths; `--debug-build-paths="app/(marketing)/about/page.tsx"` — not `/about`; `--debug-build-paths="app/admin"` matches nothing and silently builds zero routes), and `--debug-prerender` disables the early exit so the build continues past the first prerender failure, reports every blocking route, and prints a fuller stack trace that names the originating file and line.
+
+Every blocking error has a docs page — open it. Both the dev overlay and the build terminal print a `https://nextjs.org/docs/messages/` link with each error. That page is the canonical recipe for the fix; the inline message is a summary. Fetch the link for every distinct error you encounter, even if you think you know the pattern — the recipes evolve, and the same error class can have different correct fixes depending on what the route reads. Don't improvise from the inline message alone. (`/docs/messages/*` pages aren't bundled offline; if you have no network, fall back to the per-API guides under `node_modules/next/dist/docs/` and note the limitation when you report back.)
+
+### verifying each fix at runtime
+
+A passing build or a cleared overlay isn't proof the route actually behaves — Cache Components is a runtime concern (a static shell with streamed data). Verify after every fix, not only at the end.
+
+In preference order:
+
+1. **[`next-dev-loop`](https://github.com/vercel/next.js/tree/canary/skills/next-dev-loop) — strongly preferred.** Cross-checks `/_next/mcp` against the live browser via `agent-browser` and surfaces both compile and runtime issues in one pass. The diagnostics (React tree, suspense boundaries, console + network) are richer than poking at `next dev` by hand.
+
+ Install it before starting the loop. Don't wait until you hit something `next dev` alone can't explain. It ships alongside this skill, so check whether it is already available first, and install it only if it is not:
+
+ ```bash
+ npx skills add https://github.com/vercel/next.js/tree/canary/skills/next-dev-loop
+ ```
+
+ The skill states its required `agent-browser` version and walks you through it.
+
+ **Requires Turbopack.** If `package.json`'s `dev` script passes `--webpack`, flag it to the user and ask whether there's a reason to stay on webpack. If not, switch to Turbopack (the Next.js 16.3+ default). If they want to keep webpack, skip this install and use the [build-only loop](#the-loop-build-only-fallback) instead.
+
+ You don't need permission to install `next-dev-loop` itself. It's a tool, like installing a dev dependency. If a user is present, briefly tell them you're installing it for verification. In a non-interactive run (CI, dashboard, sandbox), install it without asking — "can't prompt the user" is not a reason to skip. The only legitimate skip is a real technical blocker: no network, no npm, read-only filesystem, a stated no-new-deps policy, or a webpack-only dev script. If you skip, name the specific blocker in your final report.
+
+2. **A browser you can drive yourself.** Playwright, `agent-browser` directly, any browser-automation tool. Use only when `next-dev-loop` is genuinely blocked. You'll miss the framework-side checks (`/_next/mcp`), so DOM assertions alone don't catch every regression — be more cautious about what you call "verified."
+
+3. **Build-only.** If you can't run a dev server at all, the build is your only signal. `○ (Static)` routes with no `` are fully verified by the build (nothing streamed to test). `◐ (Partial Prerender)` routes are only shell-verified — flag them when you report back.
+
+4. **No tooling at all.** Ask the user to run the dev server (or build) and report what they see, or hand off the milestone you've reached.
+
+## step 1: choose a strategy
+
+Ask the user, in terms of the PRs they want, not the size of the job. Never use the internal labels (Incremental, Direct) when talking to the user — those are your own scaffolding. Ask in terms of PRs and features, e.g.: _"Do you want me to first open a PR that turns on Cache Components and opts every route out of validation, then handle the actual route adoptions feature-by-feature in follow-up PRs? Or do everything on one branch?"_ Even on a tiny app, the incremental path still has value (review-sized PR, revertible, the `// TODO: Cache Components adoption` markers double as your work queue for next session). Don't pick on their behalf.
+
+If there's no user to ask, default to **Incremental** and document the choice.
+
+Honor an explicit choice in the request. If the user asks to migrate incrementally and also asks you to complete the migration, establish and verify the incremental checkpoint before continuing to the remaining routes in the same task. “Complete” sets the stopping point; it does not change the chosen strategy.
+
+- **Incremental** — quiet pre-step + the loop. Run the codemod to opt every page and layout out of validation, get the build passing, stop and check in with the user (see [end of the pre-step](#end-of-the-pre-step-check-in)), then enter [step 2's loop](#step-2-the-inner-loop-remove-opt-outs-one-feature-at-a-time) and ship each feature as a follow-up PR.
+- **Direct** — skip the pre-step. Enable `cacheComponents` and go straight to [step 2's loop](#step-2-the-inner-loop-remove-opt-outs-one-feature-at-a-time); the build's blocking routes are the work queue.
+
+### incremental
+
+Before invoking the codemod, grep for `^export const (revalidate|dynamic|fetchCache)` across the app directory and follow the migration guide for every match. Mark routes that use `dynamic = 'force-static'` or `dynamic = 'error'` for full migration in this PR. The codemod does not remove incompatible configs.
+
+The codemod refuses to run on a dirty working tree. Commit or stash unrelated work first, or pass `--force` to let its edits land alongside your WIP. Common false positive: if you recently upgraded Next.js, `package.json` and the lockfile will already be dirty — commit those first.
+
+```bash
+npx @next/codemod@latest cache-components-instant-false ./app
+```
+
+Pass the app directory you resolved in [requires](#requires). A wrong path is not an error: it reports `0 ok` and exits `0`, so read the file count and treat zero as a failed run, not an adopted app.
+
+Inserts `export const instant = false` (with a `// TODO: Cache Components adoption` comment) into every `{page,layout,default}` file under that directory, skipping files that already declare `instant` and any module marked `"use client"` or `"use server"`. Then set `cacheComponents: true`. The TODO comments are the work queue for the loop.
+
+If the codemod isn't available (older `@next/codemod`, sandboxed environment, offline run), reproduce it by hand: for every `{page,layout,default}.{js,jsx,ts,tsx}` in the app directory that isn't `"use client"` or `"use server"` and doesn't already declare `instant`, insert this after the imports:
+
+```ts
+// TODO: Cache Components adoption. Refactor this route so this opt-out can be removed.
+// See: https://nextjs.org/docs/app/guides/migrating-to-cache-components
+export const instant = false
+```
+
+The codemod opts every segment out, not only the root, on purpose. Resolution is top-down, first-explicit-config-wins: the highest `instant = false` decides the whole subtree. With an opt-out on every segment, removing one segment's opt-out validates only that segment; descendants keep their own opt-outs and stay passing. If only the root were opted out, removing it would re-arm validation for the entire app at once.
+
+Because the highest opt-out wins, remove them top-down (root layout first, then descend). Removing a leaf's opt-out does nothing while an ancestor still holds one.
+
+Remove the opt-outs from the previously static routes and any shared segments that mask their validation. Resolve their errors and confirm they still prerender. A cached data call alone does not prove the route remains static.
+
+Next, run `next build` to surface blockers the codemod could not handle. The build is the proof, not the codemod run — a shared layout that calls `new Date()` / `Math.random()` directly still fails regardless of the opt-out (see [background](#background)). If the normal build reports a sync-IO error without locating the call, rerun that route with `next build --debug-prerender --debug-build-paths="app/path/to/page.tsx"`. For each sync-IO error it reports:
+
+1. **Sync-IO at module/render time.** Use the route, originating file and line, and `/docs/messages/` link in the build output to locate the error. If needed, grep the whole repo for `new Date()`, `Date.now()`, `Math.random()`, and `crypto.randomUUID()` (not only `app/**/layout.{js,jsx,ts,tsx}` — the read might live in any component imported by a layout). Do not change unreported matches. Apply the appropriate option from the linked error page, then add this comment above a temporary boundary introduced only to unblock the build:
+
+ ```tsx
+ // TODO: Cache Components adoption. Added to unblock the build: remove this boundary to re-trigger the error and review the documented options.
+ ```
+
+ It shares the `TODO: Cache Components adoption` prefix with the comments the codemod writes, so the check-in grep finds both. Removing the boundary makes the error fire again with its fix cards — the same motion as removing an opt-out in the loop.
+
+After each fix, rerun the scoped build when available, then run `next build` again to find the next blocker. Repeat until the normal build passes.
+
+After the build passes, confirm every deferred route is still covered by an opt-out and no shared opt-out covers a previously static route. If the app has no previously static routes and the root layout remains deferred, confirm it got an opt-out (`grep -n "export const instant" /layout.*`). The root layout renders every route, including framework routes like `/_not-found`, so if it was missed, add `export const instant = false` to it by hand.
+
+Synthetic routes like `/_not-found` have no user file — when they block, fix the root layout's opt-out, not the synthetic route. Client Components (`"use client"`) get no opt-out (it's a build error to export `instant` from them), but they are not a rare blocker. The high-frequency case is a client component in the root layout's nav or header calling `usePathname()`/`useSearchParams()`: it blocks _every_ dynamic route with `blocking-prerender-client-hook`, and static routes pass (the pathname is known at prerender), which masks it until you reach a dynamic segment. It's not an ancestor-data fix — follow the [error's docs page](https://nextjs.org/docs/messages/blocking-prerender-client-hook) for the `` recipe. Only when a client route blocks on _server_ data do you fix that data in its ancestor.
+
+### end of the pre-step: check in
+
+Incremental only. The pre-step is the shippable PR. Record the passing checkpoint before starting step 2. Unless the user already asked you to continue through the full migration in the same task, stop and check in. Talk to the user in their language; don't say "Incremental" or other internal labels; talk about adoption, PRs, and what the app does now. Tell them:
+
+- What you did: turned on Cache Components, ran the codemod, migrated the previously static routes, fixed the remaining blockers, and confirmed the build passes.
+- What changed: the previously static routes still prerender. Other pages and layouts keep a `// TODO: Cache Components adoption` opt-out.
+- What to sanity-check: the previously static routes stay fully prerendered and prefetchable, and request-specific data on the deferred routes remains request-specific.
+- The question: "Want to open this as its own PR before we start adopting Cache Components route by route? Or keep going on this branch?" Wait for the answer.
+
+If the user already asked you to complete the migration, continue after recording this checkpoint instead of asking the same question again.
+
+### direct
+
+Set `cacheComponents: true` and move to [step 2](#step-2-the-inner-loop-remove-opt-outs-one-feature-at-a-time). The build's blocking routes are the work queue.
+
+## step 2: the inner loop, remove opt-outs one feature at a time
+
+A "feature" is a single product surface — `app/settings/profile/**`, `app/posts/[slug]/**` — not a whole top-level app like `app/dashboard/**`. Finish one end-to-end before starting the next.
+
+Within a feature, walk top-down (layouts before pages, root layout first). Removing a layout's opt-out before its descendants exposes the layout's own blocking reads. (Direct: there are no opt-outs to remove — fix each failing route; if a hand-written opt-out on an ancestor shadows it, remove that first.)
+
+A passing build mid-walk doesn't mean the layout is clean. Removing a layout's opt-out while its descendant pages still have theirs keeps the build passing — each page shadows the inherited validation. The layout's actual blocking reads only surface once nothing below it shadows them. Don't call a feature done at the layout boundary.
+
+Use the **with-a-browser** loop unless a browser is genuinely unreachable. The [`next-dev-loop`](#verifying-each-fix-at-runtime) skill is the source of truth for what counts as "browser available" and how to install it.
+
+### the loop, with a browser (preferred)
+
+Per route:
+
+- Remove the opt-out (Incremental) or target the failing route (Direct).
+- Reload in dev. Overlay clean? Skip to verify. Overlay still red? Fix.
+- Fix — fetch the docs page linked from the error (`https://nextjs.org/docs/messages/`), apply the recipe from there. The inline overlay text is a summary; the docs page is the source of truth.
+- Verify in the browser. Confirm the visible content on first paint is what you intended in the shell — not stuck on a fallback, not silently streaming everything out of an empty shell.
+- Re-check siblings if the fix touched shared code (a layout, a sidebar component). A shared-shell change can fix the route you're on and break a sibling.
+
+### the loop, build-only (fallback)
+
+Used when there's no way to drive a browser — CI, sandbox, the user has no `next dev` running and you can't start one. Weaker signal: confirms the build passes and the route prerenders, but not what ended up in the static shell vs streamed.
+
+Per route:
+
+- Remove the opt-out (Incremental) or target the failing route (Direct).
+- Rebuild with `--debug-build-paths app//**` (only that route) or `--debug-prerender` (full build, but past the first failure). Route passing? Move on. Still blocking? Fix.
+- Fix — fetch the docs page linked from the error (`https://nextjs.org/docs/messages/`), apply the recipe from there.
+- Re-check siblings if the fix touched shared code.
+- Flag the route as build-only-verified when you hand the feature off. Each `◐` route still needs a browser pass before the feature is done.
+
+### loop notes
+
+- The [three blocker classes from background](#background) often get missed when fixing in place. Caching a downstream fetch (`getThing(id)`) doesn't clear an `await params` at the top of the page body — push the param promise into the ``-wrapped child.
+- Ambiguous calls are user check-ins, not agent judgment. When you're not sure which fix fits, the blocking code looks security-sensitive, or the user might want to keep the route blocking on purpose — read [references/per-page-decisions.md](./references/per-page-decisions.md) before editing. Show the route while you ask: the `next-dev-loop` session runs the browser headed, so drive to the page and leave it on screen so the user is looking at the thing they're deciding about, with a screenshot as the fallback when a headed browser isn't possible. "Should this stay blocking?" is much easier to answer while looking at the page than at a file path.
+- Don't narrate the refactor with comments. The only comment the codemod (or you) should leave is `// TODO: Cache Components adoption` on opt-outs, and the user's existing comments. Don't annotate every `` boundary or `"use cache"` call with what it does — the code says that. Drop a comment only when the _why_ isn't clear from the code (e.g. a deliberate Block with a reason).
+- For many routes with the same mechanical fix, verify one representative route first. Then batch disjoint route groups using the same recipe, and run the shared build and browser checks together.
+
+Keep a todo list of the feature's routes. When every route in the feature is clean, move to step 3.
+
+## step 3: verify the feature
+
+Checklist before checking in with the user:
+
+- `next build` completes without blocking-route errors.
+- No bare TODOs in the feature: `grep -rn "TODO: Cache Components adoption"` finds both the codemod's opt-out comments and the sync-IO unblocks from the pre-step. Any `instant = false` left behind is a deliberate, documented Block — comment rewritten to a reason (see [references/per-page-decisions.md](./references/per-page-decisions.md) → "when to leave a Block in place"). Any `await io()` or `await connection()` left behind has been reviewed and kept on purpose, not left over from the pre-step.
+- Each route visited in the browser: confirm the static shell renders first and every `` fallback resolves to its real content. Capture both states if you can — the fallback (mid-stream) and the final paint — so you have a streaming-experience demo to show the user. Throttle the network in the browser if streaming is too fast to observe.
+- After populating any new cache whose data can be updated, a mutation check confirms the next read returns the expected data.
+- If runtime verification fails, reproduce the same route on the pre-adoption branch or with its opt-out restored. A failure that already exists is an environment or data problem, not an adoption regression.
+
+Then check in with the user. Same rule as the pre-step: speak their language. Don't say "feature-by-feature loop" or other internal labels; talk about the feature you adopted and what the user will see.
+
+- What you did: which routes you touched, and the user-visible result per route (e.g. "the post page now streams the article body behind a skeleton while the layout stays static").
+- What changed: opt-outs removed, fallbacks added, caching boundaries introduced.
+- Show, don't tell. The `next-dev-loop` session runs the browser headed, so drive the route live for the user so they see the static shell → fallback → final content sequence in real time. If you can't drive a live browser, attach the before/after screenshots you captured instead.
+- Give them the click-through: a short table of the feature's routes — the URL to open and what to look for (what renders instantly, which fallbacks appear, what streams in) — so they can verify each one themselves.
+- The question: "Want to open this feature as a PR and move on to the next, or stop here?" Wait for the answer.
+
+**Trivial features can skip the check-in.** If adopting a feature only meant removing its `// TODO: Cache Components adoption` opt-out (no `` added, no `'use cache'` introduced, no render order change), the user sees nothing different. Move on to the next feature without stopping; mention it in passing the next time you do check in.
+
+When the loop has run on every feature — every remaining `instant = false` sits under a reason comment, `grep -rln "TODO: Cache Components adoption" app` returns nothing — point the user at [further reading](#further-reading) if they want to push the experience further, or stop and ship.
+
+### route table glyphs
+
+`ƒ` → `◐` is where adoption usually lands. `◐ (Partial Prerender)` means a static shell prerenders and the request-time content streams in — the goal state for any route that reads `cookies()`, `headers()`, `params`, or `searchParams`. Some routes legitimately stay `ƒ` when they do request-time work through a documented escape hatch (e.g. a layout that uses `await connection()`); the page is no longer _opted out_, it's genuinely dynamic. Don't remove the escape hatch only to chase a `◐`. The inverse holds: `instant = false` does not force a route to be `ƒ`. The glyph reflects what the route does at prerender time, not which validation knobs it exports.
+
+`◐` tells you a shell exists, not what's in it. A `` boundary placed too high (e.g. wrapping the entire page body, or `` around the article content) pushes the visible content out of the static shell into the streamed payload; the build still reports `◐` because _some_ shell prerendered (often only `` with framework markup). The route table can't tell you what's in the shell; a browser can. If the shell is empty and everything streams, pull the `` boundary down closer to the actual dynamic read.
+
+## further reading
+
+The work below is optional and lives in the docs — link the user to them and let them decide which to take on next. Don't walk these through inside this skill.
+
+- [Sweep for more instant navigations](./references/dev-only-validations.md) — an optional follow-up once adoption is done, never required. A passing build is not the last word, because dev validates every route on each page load (simulating both page loads and client navigations) and catches what the build's first-error exit and descendant shadowing skipped. Offer it as the smaller path to instant navigation for a user who doesn't want to adopt Partial Prefetching. Adopting Partial Prefetching (below) runs the same kind of loop and meets these insights anyway, so recommend both and let the user pick which, or whether. The reference is the loop to execute.
+- [`next-partial-prefetching-adoption`](https://github.com/vercel/next.js/tree/canary/skills/next-partial-prefetching-adoption) — the follow-up skill that adopts Partial Prefetching: it enables `partialPrefetching` and audits every ` ` against a decision table (or adopts incrementally with the flag off, driven by the `instant-link-prefetch-partial` insight). It sequences this the same way this skill sequences Cache Components, but the insights are dev-only, so it's a browser click-through, not a build loop. Recommended after instant navigation, since those fixes feed directly into how much of each route the shell can prefetch. Concepts live in the [Adopting Partial Prefetching guide](https://nextjs.org/docs/app/guides/adopting-partial-prefetching).
+- [Prevent regressions with e2e tests](https://nextjs.org/docs/app/guides/instant-navigation#prevent-regressions-with-e2e-tests) — the `@next/playwright` [`instant()`](https://nextjs.org/docs/app/api-reference/file-conventions/route-segment-config/instant#testing-instant-navigation) helper asserts on the UI that's available immediately on navigation, so regressions surface in CI. Recommend it once a route is instant: `next-dev-loop` confirms it _now_; an `instant()` test keeps it that way.
+- [`next-cache-components-optimizer`](https://github.com/vercel/next.js/tree/canary/skills/next-cache-components-optimizer) — a separate skill that grows each route's static shell so more of the page prerenders and less streams in. Pure optimization, not part of adoption.
diff --git a/.claude/skills/next-cache-components-adoption/references/dev-only-validations.md b/.claude/skills/next-cache-components-adoption/references/dev-only-validations.md
new file mode 100644
index 0000000..7c83fab
--- /dev/null
+++ b/.claude/skills/next-cache-components-adoption/references/dev-only-validations.md
@@ -0,0 +1,29 @@
+# dev-only validation sweep
+
+How to surface and fix the instant-navigation insights that a clean `next build` does not show. The [Instant navigation guide](https://nextjs.org/docs/app/guides/instant-navigation) is the canonical reference for the validation model this exercises.
+
+## what the build misses
+
+By default (`validationLevel: 'warning'`) Cache Components validates every Page and Default segment in `next dev`, and the insights land in the dev overlay's Insights tab, not the build. Validation runs on every page load using the real request, and for each route it independently checks the initial page load and client navigations at different points in the hierarchy. So a `` boundary that covers the page load can still leave a client navigation blocking, and a layout stays clean at build time while a descendant keeps its `instant = false`. The build stops at the first blocking route and does not raise this family by default. Loading each route in dev is what surfaces it.
+
+## when to run it
+
+After the Cache Components build is clean, not before. While the app is mid-adoption the build redboxes mask this, so a full clean build (every route `◐`, no errors) is the precondition. A quiet sweep is the expected result of a clean adoption, not a missing signal.
+
+## the loop
+
+Reuse the [`next-dev-loop`](https://github.com/vercel/next.js/tree/canary/skills/next-dev-loop) preflight (Turbopack), then add one job. On a webpack app, drive a browser directly with `agent-browser` or Playwright instead. You lose the `/_next/mcp` cross-checks, not the insights, which still show in the overlay and the dev log.
+
+1. Build a route queue from the last build's route table or the app directory.
+2. Load each route in `next dev` with a browser. A refresh or a link click both work, and validation simulates both the page-load and client-navigation cases on that load, so you do not need to click through every link by hand. Dynamic params are checked against the real values you visit, so hit a concrete `[slug]`, not the pattern.
+3. Watch the dev log and the Insights tab. The dev log is the greppable record, one `Error: Route "...": Next.js encountered ...` line per insight with its `docs/messages/` link, and it reads the same on Turbopack and webpack. The Insights tab is amber and appears only once an insight fires, so a route with no tab is clean. Through `next-dev-loop`'s `/_next/mcp`, these come from `get_errors` and the overlay, not `get_request_insights`, which is the performance recorder and reports nothing here.
+4. Open the linked page for each distinct insight and apply its fix (usually pull a `` boundary down to the read). Reload to confirm it clears.
+
+## gotchas
+
+- The overlay renders inside a shadow root (`nextjs-portal`), so accessibility-tree snapshots miss it. Read it through `shadowRoot`.
+- No browser, no sweep. There is no build-only fallback for this family. Apply the static fix you can from the docs page (gate on type-check) and hand off the live confirmation.
+
+## when this shrinks
+
+Build-time instant validation is opt-in today (`experimental.instantInsights.validationLevel: 'experimental-error'`); the default `'warning'` surfaces in the overlay only. Once the build raises these reliably, the sweep collapses into reading `next build` output and this reference can shrink to that.
diff --git a/.claude/skills/next-cache-components-adoption/references/per-page-decisions.md b/.claude/skills/next-cache-components-adoption/references/per-page-decisions.md
new file mode 100644
index 0000000..4e57a73
--- /dev/null
+++ b/.claude/skills/next-cache-components-adoption/references/per-page-decisions.md
@@ -0,0 +1,27 @@
+# per-page decisions: removing `instant = false`
+
+Read this when a route still blocks after you remove its `instant = false` and the dev overlay's fix card isn't enough on its own. Each section here covers a judgment call the agent shouldn't make alone.
+
+## deciding what to do with a blocking read
+
+Read the full linked page behind the fix card — not only the inline snippet — before editing. The card unblocks the build, but the page covers the details that make the route's navigation actually instant (e.g. where to place a `` boundary). Don't improvise.
+
+If you're unsure which fix fits, the right call usually depends on what this part of the page is _for_, which the code doesn't capture. Ask the user about their goal for it rather than guessing. Frame it as a product/UX question: should this content be there instantly on load, or is it fine for it to stream in a moment later? Should everyone see the same thing (cacheable) or is it per-user / per-request? Tie the technical fix to that answer (cache it, wrap it in ``, or keep it request-time), so they're deciding the experience, not the API.
+
+## security gates and other code you can't infer
+
+If the blocking code looks like it's there for a _reason you can't infer_ — a security gate at the page top (`await verifyAccess()`, an auth redirect, a feature-flag check) where moving it inside `` would change what the code guarantees — stop and ask the user before refactoring. The build error wants ``, but wrapping a gate in `` defeats the gate. Only the person who wrote it knows whether to keep the route blocking (`instant = false` as a documented Block), restructure the page so the gate runs differently, move the check to [Proxy](https://nextjs.org/docs/app/api-reference/file-conventions/proxy), or — if the gate duplicates protection the app already relies on elsewhere (platform auth such as Vercel Deployment Protection, a Proxy check, a Data Access Layer) — remove it.
+
+Relocating a read (`await connection()`, Proxy) only changes _where_ it runs, never _whether it should run at all_ — so a gate that's redundant or broken looks identical to a correctly-placed one through the fix card's lens. If a gate looks strange, redundant, or out of place, say so plainly — "this looks like it might be unnecessary here — are you sure it belongs?" — instead of quietly relocating it. Surfacing the doubt is the agent's job; deciding is the user's.
+
+If _every_ route under a layout is gated this way, a documented Block on the layout is the correct end state. Moving the gate to [Proxy](https://nextjs.org/docs/app/api-reference/file-conventions/proxy) is the architectural fix, not a Cache Components one, and that's a follow-up rather than something to hold the migration on.
+
+For the broader picture, read the [Authentication guide](https://nextjs.org/docs/app/guides/authentication) (where auth checks belong: Proxy for routing, Data Access Layer for data) and the [Data Access Layer section of Data Security](https://nextjs.org/docs/app/guides/data-security#data-access-layer) (centralized auth checks that compose with `'use cache'`).
+
+If you don't know how to make a piece of code Cache Components–correct without changing what it does, ask.
+
+## when to leave a Block in place
+
+If a route is genuinely meant to block — it's inherently per-request with no useful static shell — or the refactor would be large and the user would rather not take it on now, that's a legitimate outcome. Keep `instant = false`, but confirm it with the user first and turn its `// TODO: Cache Components adoption` comment into a reason, e.g. `// instant = false: kept on purpose — fully request-time dashboard` or `// instant = false: deferred, refactor too large for now`.
+
+A documented, deliberate Block is fine to leave after the migration; an undocumented leftover opt-out is not.
diff --git a/.claude/skills/next-cache-components-optimizer/SKILL.md b/.claude/skills/next-cache-components-optimizer/SKILL.md
new file mode 100644
index 0000000..a487db5
--- /dev/null
+++ b/.claude/skills/next-cache-components-optimizer/SKILL.md
@@ -0,0 +1,482 @@
+---
+name: next-cache-components-optimizer
+description: >
+ Drive a Next.js route to instant navigation by setting up an agentic loop,
+ under Cache Components / PPR, on initial load (hard navigation) and
+ client-side navigation (soft navigation). Encode the goal as a failing
+ @next/playwright instant() e2e and work it to green, one verified route at a
+ time; the shipped test then guards against regression. Use when asked to make
+ a route's navigation instant (its static shell commits immediately), fix a
+ route whose static shell isn't prerendered/served/prefetched, grow a route's
+ static shell or fix its slow first paint, diagnose which Suspense boundary
+ keeps a route out of its static shell, or write the instant() e2e guard for
+ one. Requires Next.js 16.3+ with cacheComponents; directs an upgrade if older.
+---
+
+# next-cache-components-optimizer
+
+Set up an agentic optimization loop that drives a Next.js route from "not
+instant" to "instant" and keeps it there. The loop is test-driven: encode the
+goal as a failing `@next/playwright` `instant()` test, work it to green, and
+ship the test as the regression guard. Run it once per target route. Work the
+phases P → G in order; each ends in a gate. Fix recipes live in two lazily-read
+references — `reference/patterns.md` (before→after for each blocker type) and
+`reference/real-app-patterns.md` (parallel routes, auth gates, the empty-shell
+and responsive-skeleton failure modes). Read one only when its phase points
+there.
+
+## What is invariant, and what is yours
+
+One thing here is fixed. The rest is yours. Read this before treating any
+command, platform, or env var below as a requirement.
+
+- **Invariant: the verification loop.** Maximizing the shell is worthless
+ unless you can prove it. The proof is an automated check: under a lock that
+ gates dynamic data, the static shell still commits. RED shows the gap, GREEN
+ shows it closed, the test ships as the regression guard. It must run on a
+ production-like build and must not be able to pass vacuously. Stand the loop
+ up once; every later optimization is then verifiable by construction. The
+ loop is the deliverable, not any one route.
+- **The mechanism: `@next/playwright` `instant()`.** This skill uses
+ [`instant()`](https://nextjs.org/docs/app/guides/instant-navigation#prevent-regressions-with-e2e-tests)
+ as a ruler, not a stopwatch (phase A). It comes from
+ `@next/playwright` (installed alongside `@playwright/test`, on the same
+ release line as `next`), so it isn't tied to any host. Keep it. Timing a
+ navigation by hand is too flaky to trust, and is the failure mode this skill
+ exists to prevent.
+- **Yours: the rig.** How you build, deploy, authenticate, configure
+ Playwright, and loop belongs to your stack, not to this skill. A local
+ `next build && next start`, a CI/staging container, and a per-push preview
+ deploy are equally valid rigs; the verdict comes from the build, never the
+ platform. Phase 0 maps the invariant onto your repo. Read every platform
+ name, env-var spelling, and command below as an example to translate, not a
+ requirement.
+
+## Two navigations, two loading states
+
+A route reaches the user two ways, and both must be instant:
+
+- **Initial load (hard navigation)** commits the route's prerendered static
+ shell; deferred parts stream in behind their loading skeletons (Suspense
+ fallbacks, `loading.tsx`).
+- **Client-side navigation (soft navigation)** commits the destination's
+ prefetched App Shell — the ` ` default under Partial Prefetching —
+ re-rendering only the segments that change.
+
+The fix patterns are identical for both; the test differs only in how the
+navigation is driven ("Driving the navigation in tests" below). The two shells
+can differ; guard the one you ship, both when both matter
+(`reference/real-app-patterns.md`).
+
+## Goal
+
+Maximizing the static shell is the optimization objective: the most meaningful
+prerendered content commits immediately, and only genuinely per-request data
+streams in afterward. The shipped test deterministically encodes **present ∧
+instant**; **non-blank** is the additional bar the workflow enforces by
+judgment (D1/D2/E), because an `instant()` pass alone is satisfied by a blank
+`fallback={null}` shell (the empty-shell failure mode,
+`reference/real-app-patterns.md`).
+
+`instant()` is a ruler, not a stopwatch: assert that the shell appears under
+the lock; do not time it. A trustworthy verdict requires a production build
+(phase A).
+
+The GREEN under the lock is the deterministic verdict; each gate keeps it
+trustworthy.
+
+## Reporting to the user
+
+This loop is meant to run unattended, so it doesn't stop to ask between steps.
+Work the navigation the user named, finish it, and stop. What matters is how you
+word and present the results, not how often you interrupt. The mechanics below —
+the rig, RED, GREEN, the gates — are your scaffolding; the user never needs to
+hear those words.
+
+- **Speak their language.** Describe the gap and the result in terms of what the
+ user sees: "navigating to the dashboard waited on the charts query before
+ anything painted; now the layout and skeletons paint instantly and the charts
+ stream in" — not RED/GREEN, the lock, or the phase letters.
+- **Show, don't tell.** When you report a route, drive the browser (or attach
+ before/after screenshots) so the user watches the shell commit immediately and
+ the data stream in, rather than reading a claim. Identical before and after
+ means the fix did nothing — roll it back.
+- **Present a run as a list of results the user can click through** — one line
+ per navigation: the route, what commits instantly, and what streams in — not a
+ transcript of the loop.
+- **Only surface a question for a genuine fork:** a fix that would change
+ behavior, a security-sensitive read, or a route that's dynamic by design (a
+ per-link-prefetch candidate, not a shell to grow). A clean instant fix is not
+ a fork — keep going. With no one to ask (an unattended run), don't block: take
+ the safe default and note the assumption — for a cache-freshness choice,
+ defer the read behind `` (always fresh, still instant) rather than
+ guess a `cacheLife`.
+
+## The workflow
+
+```
+- [ ] P PREREQS Next.js 16.3+ with cacheComponents: true; upgrade first → below
+- [ ] 0 SETUP once per repo: discover + write instant-nav.rig.md → rig-template.md
+- [ ] A RIG production build with the testing API exposed → below
+- [ ] B BASELINE unlocked: the marker renders for the test user → test-template.md
+- [ ] C RED locked instant(): the shell does not commit → test-template.md
+- [ ] C-gate VERIFY-RED: stop until the RED is trustworthy → reference/red-test-robustness.md
+- [ ] D FIX push each Suspense boundary down to the data it guards → reference/patterns.md
+- [ ] D1 reuse the route's existing loading UI; do not hand-build skeletons
+- [ ] D2 the shell matches the real render at every breakpoint → reference/real-app-patterns.md
+- [ ] E PARITY the refactor changed only whether the route is instant
+- [ ] F DIFFERENTIAL revert only the fix → RED; re-apply → GREEN → reference/red-test-robustness.md
+- [ ] G REVIEW PR checklist (below)
+```
+
+Phases B and C build the test; only the locked test from C ships.
+
+---
+
+## P. PREREQUISITES: current Next.js with Cache Components
+
+The workflow depends on framework capabilities that ship with current Next.js:
+
+- **Next.js 16.3+ with `cacheComponents: true`** in `next.config.ts`. Without
+ Cache Components there is no static shell to optimize.
+- **`@next/playwright`** on the same release line as the project's `next`; it
+ provides `instant()`. Verify with `npm ls next @next/playwright` (or the
+ project's package manager) and align them if they differ. The matching
+ testing API is in the `next` runtime, gated by the
+ `experimental.exposeTestingApiInProductionBuild` config flag (phase A).
+
+If the project does not meet these, upgrade first (`npx @next/codemod upgrade`
+automates most of it), then enable Cache Components in `next.config.ts`:
+
+```ts
+export default { cacheComponents: true }
+```
+
+Enabling the flag surfaces the blocking routes to resolve first; the
+[`next-cache-components-adoption`](https://github.com/vercel/next.js/tree/canary/skills/next-cache-components-adoption)
+skill drives that adoption. Reach for this optimizer once the app builds under
+Cache Components.
+
+This gate is deliberate: the skill targets current Next.js, and none of the
+verdicts below are meaningful on older versions.
+
+## 0. SETUP: discover this project's rig, once per repo
+
+The principles in this skill are fixed; the infrastructure they run on is
+yours. On first use in a repository, discover how the project builds, deploys,
+authenticates, and tests (inspect the repository first, and ask the user only
+what it cannot answer), then write the answers to a committed
+`instant-nav.rig.md`. Every later run reads that file instead of
+rediscovering. The required build, test context, navigation contracts,
+iteration loop, and file template are in **`rig-template.md`**.
+
+If the repo has no Playwright e2e harness yet, standing up a minimal one
+(`@next/playwright`, a config with `baseURL`, one authenticated path) is part
+of this step; the loop does not assume a pre-existing suite.
+
+## A. RIG: a production build with the testing API exposed
+
+Stand up the rig described by `instant-nav.rig.md`. Two invariants hold on
+every platform:
+
+1. **Never measure on `next dev`.** It does not prefetch, and its lock is
+ unreliable for blocking routes, so a dev `instant()` result is not a valid
+ RED or GREEN.
+2. **The measured build must expose the testing API.** Otherwise `instant()`
+ silently no-ops and the test passes vacuously (see
+ `reference/red-test-robustness.md`). The lock-engagement proof is the phase-C
+ RED itself: the unfixed target route is the known-blocking route, and its
+ RED under the lock shows the lock engages on this build (C-gate); the
+ self-validating variant in `test-template.md` is the in-band guarantee. Wire
+ `experimental.exposeTestingApiInProductionBuild` to a condition that is
+ true for every build you measure and never true in production:
+
+ ```ts
+ experimental: {
+ // Use the condition your platform provides, and record it in the rig file:
+ // local: an explicit opt-in, as below
+ // generic CI: process.env.DEPLOY_ENV === 'staging'
+ // Vercel: process.env.VERCEL_ENV === 'preview'
+ exposeTestingApiInProductionBuild:
+ process.env.EXPOSE_TESTING_API === '1',
+ }
+ ```
+
+The rig is any production-like build that exposes the testing API: a local
+`next build && next start`, a CI/staging container, and a preview deploy are
+all equally valid; the verdict comes from the build, not the platform. See
+`rig-template.md` for the setup requirements.
+
+For any deployed or remote build, poll the rig's LIVENESS probe to confirm the
+artifact contains `HEAD` before trusting a verdict (a stale deploy reads as a
+false RED or GREEN); a local `next build && next start` needs none. The probe
+mechanism is in `rig-template.md`.
+
+## B. BASELINE (unlocked): development scaffold, do not ship
+
+Drive the real navigation with no `instant()` lock and assert that the
+destination's `SHELL_MARKER` renders **as the test user**: the account the
+e2e suite authenticates as (in CI, the CI account; locally, your e2e login
+fixture), with its flags, plan, role, and data. This establishes that the
+marker is real and reachable: not flag-gated, not redirected away, not a
+guessed selector. The suite runs as the test account, not the author's session;
+that environment drift (the rig DRIFT list) is a common source of
+untrustworthy REDs. Scaffold and run command: **`test-template.md`**.
+**Delete this baseline before the PR.**
+
+## C. RED (locked) + the VERIFY-RED gate
+
+Wrap the same navigation in `instant()`; assert the shell commits under the
+lock. A RED here is the gap. **This is the test that ships**
+(`test-template.md`).
+
+Prefer the self-validating variant when the route has deferred content. If the
+route cannot build while blocked, or a cookie/session read stays GREEN, use the
+RED recipes in `reference/red-test-robustness.md`.
+
+> **C-gate: do not start optimizing until the RED is verified trustworthy.** A
+> RED that is red for the wrong reason sends you optimizing a route that was
+> never broken.
+
+The question that settles it: **does `SHELL_MARKER` render without the lock,
+as the test user?** Answer it by re-running phase B as the test user, not by
+adding assertions to the shipped test. The two-branch resolution (No → marker
+or environment bug; Yes → genuine gap, proceed to D), the full taxonomy of
+untrustworthy REDs, the checklist, and worked cases are in
+**`reference/red-test-robustness.md`**. Read it now.
+
+---
+
+## D. FIX: push each boundary down to the data it guards
+
+**The anti-pattern: one coarse boundary.** A single `` high in the
+tree with a page-level fallback has three costs:
+
+- The layout UI stays out of the static shell: only a throwaway copy of it is
+ prerendered.
+- The entire subtree is replaced when the boundary resolves, which discards
+ client state and shifts layout.
+- The hand-built fallback drifts out of sync as the UI changes, because it
+ duplicates structure that also exists in the resolved tree.
+
+**The fix: hoist the static, push the Suspense down.** Render the layout UI
+once, synchronously, in the shell, and wrap each await in a boundary scoped to
+the single read it guards. Only that leaf streams; the stable ancestors are
+reused as-is.
+
+**Rule:** if an element renders in both the fallback and the resolved tree,
+hoist it above the boundary.
+
+### The most common blocker: a top-level `await` in a layout on a fallback route
+
+```
+app/[locale]/(app)/[tenant]/dashboard/...
+ │ generateStaticParams ✅ │ no generateStaticParams → fallback route
+```
+
+When any dynamic segment in the route lacks `generateStaticParams`, the route
+is a fallback route, and **all** params defer to request time, including the
+enumerated ones. A top-level `await` in a layout (`await params`, a
+request-time session read, an auth gate) then blocks the whole subtree out of
+the static shell, even when it reads a statically known param. Minimal shape: a
+dynamic-segment route with one segment lacking `generateStaticParams`, plus a
+top-level `await` in the layout above it.
+
+### The fix: defer the gate, render children
+
+Render `children` unconditionally; move the top-level `await` into a
+``-wrapped child. Mechanism and before→after:
+`reference/real-app-patterns.md`, "Deferring an auth gate".
+
+**Fix the page below the shell too, not only the layout.** A page-level
+top-level `await` (commonly `await params`) blocks the same way the layout's
+does, so make the page sync and push its dynamic reads into a
+``-wrapped leaf as well. `fallback={null}` is correct only when a gate renders nothing on
+success; for data, the fallback must be a real loading skeleton (see D1).
+
+Every other blocker shape — `cookies()`/`headers()`, uncached fetch or database
+reads, `searchParams`, metadata, viewport, non-deterministic values (`Date.now()`,
+`Math.random()`, `crypto.randomUUID()`) — surfaces its own insight when you hit
+it: the build prints a `https://nextjs.org/docs/messages/` link. The
+default build output is often abbreviated and may carry no usable stack trace;
+add `--debug-prerender` for the full failing frame and to report every blocker
+past the first. Scope the build to the route you're on with
+`next build --debug-build-paths "app//**"` rather than rebuilding the app.
+Open that page and apply its recipe; don't improvise from the inline message.
+
+The before→after recipe for each shape is in `reference/patterns.md`, which maps it to the insight
+that explains it.
+
+A few things those per-error pages don't stress for the instant-navigation goal:
+
+- **A boundary in the root layout isn't enough for client navigations.** It
+ passes a page-load check but leaves sibling client navigations blocking; put
+ the boundary below the lowest layout the source and destination routes share.
+- **Keep the LCP element** (usually the main heading) out of any boundary, so it
+ paints in the shell instead of waiting on a stream.
+- **A green check isn't always instant.** `export const instant = false` opts
+ the segment out of validation while the navigation still blocks, and a
+ `` above the document `` prerenders an empty shell — neither
+ makes the route instant.
+
+### D1: reuse the route's existing loading UI; do not hand-build skeletons
+
+Before writing any skeleton, search the repository for the loading UI that
+already exists for this route, in order:
+
+1. the route's `loading.tsx`;
+2. an exported `*Skeleton` colocated with the component;
+3. the fallback already inside the component's own ``.
+
+The **divergence point** is the lowest layout shared by the source and
+destination routes: a soft navigation re-renders only the segments below it,
+while an initial load re-runs every layout from the root. (Also called the
+shared boundary.) A `loading.tsx` above the divergence point fills only
+the initial-load shell; it sits above the soft-nav re-render scope. A
+`loading.tsx` at the destination segment is itself the in-tree boundary for a
+soft navigation into that segment and serves both. Reuse whichever boundary
+actually covers the navigation you are shipping; below the divergence point,
+`loading.tsx` and colocated skeletons are interchangeable for that purpose.
+
+If a component has no skeleton, extract its loading markup into a colocated
+skeleton beside it. Do not author a fresh skeleton that mirrors the page
+layout: it duplicates structure, drifts as the page changes, and pulls the
+design back toward a single coarse boundary. Reusing the component's own
+skeleton also keeps the prefetched shell consistent with the loaded UI.
+
+See: [Streaming](https://nextjs.org/docs/app/guides/streaming#push-dynamic-access-down)
+and [loading states](https://nextjs.org/docs/app/guides/instant-navigation#iterate-on-loading-states).
+
+Exception: if the deferred component renders `null` for some users (for
+example, a flag-gated control), `fallback={null}` is correct, since a skeleton
+would flash and then collapse.
+
+### D2: the shell must match the real render at every breakpoint
+
+A skeleton frozen to one breakpoint misaligns on the others. Fix it the same
+way: one responsive component renders both the live UI and the shell (D1
+skeleton in its data slots), so the breakpoint switch happens once. Verify by
+re-asserting the shell marker at two widths
+(`await page.setViewportSize({ width: 1280, height: 800 })`, then
+`{ width: 390, height: 844 }`), or by adding a mobile Playwright project, so
+this gate is as machine-checkable as the others. Detail:
+`reference/real-app-patterns.md`.
+
+> **D-gate: phase D is complete when the locked test from phase C passes GREEN
+> under the lock on the production-build rig**, not when the code compiles. That
+> GREEN is the deterministic stop for the fix loop; proceed to E.
+
+If the optimization adds or expands a cache boundary, follow
+[Revalidating](https://nextjs.org/docs/app/getting-started/revalidating).
+A passing `instant()` test proves shell readiness, not mutation freshness.
+
+**When URL data can't be pushed down** (for example, the whole page depends on
+`params`, `searchParams`, or the full URL), there may be no meaningful static
+shell to grow. Don't force one. Per-link prefetching can make the soft
+navigation instant, but it is outside this optimizer loop: it requires Partial
+Prefetching, a ` `, and cached URL-dependent content. See
+[Optimizing prefetching](https://nextjs.org/docs/app/guides/optimizing-prefetching)
+and pattern 10 in `reference/patterns.md` for the requirements, cost trade-offs,
+manual prefetch caveat, and `instant()` test gotchas.
+
+## E. PARITY: the refactor changed only whether the route is instant
+
+The push-down is a mechanical transform, not a redesign. Afterward the route
+must render the same tree, data, ordering, empty and error states, redirects,
+and interactions as before; the only observable difference is that the shell
+now commits instantly. Verify:
+
+- **Same render output.** The moved `await`s compute and return the same
+ values; after the stream, the route shows the same content as the base
+ branch for the test user.
+- **Side effects still fire.** A deferred `redirect()` or `notFound()` still
+ happens, at request time rather than during prerender. Confirm an
+ unauthorized user is still redirected and a missing record still returns 404.
+- **Both viewports reach the real UI** after the stream (D2).
+- **Client state survives.** Because the layout UI is hoisted into the stable
+ shell rather than swapped on resolve, open menus, scroll position, focus,
+ and input state persist across the stream.
+- **Pre-existing failures stay separate.** If the route errors after the
+ change, reproduce it on the base branch. The same failure there is an
+ environment or data problem, not an optimizer regression.
+
+If anything other than whether the route is instant changed, reduce the refactor.
+
+## F. DIFFERENTIAL
+
+Revert only the fix → RED; re-apply → GREEN; link both runs
+(`reference/red-test-robustness.md`). On a deployed rig, confirm each run is live
+(LIVENESS, phase A) before trusting its color.
+
+## G. REVIEW (PR checklist)
+
+A green final state means nothing if the RED was never trustworthy. The
+test-trustworthiness items are the robustness checklist
+(`reference/red-test-robustness.md`); confirm them, then require these
+PR-specific items:
+
+- [ ] **Differential shown**: RED without the fix, GREEN with it, runs linked.
+- [ ] **Parity confirmed (E)**: same content, redirects, and state.
+- [ ] **Mutations verified when applicable**: after populating any cache whose
+ data can be updated, a mutation test confirms the next read returns the
+ expected data.
+- [ ] **Existing loading UI reused (D1)**: no new page-mirroring skeleton.
+- [ ] **Shell matches the real render at desktop and mobile widths (D2)**.
+- [ ] **Baseline removed**: only the locked test from C remains.
+
+**Stop condition for the whole workflow:** the locked test from C is GREEN on
+the rig, the differential (F) holds, and every item above is checked. Until all
+three hold, you are not done.
+
+## Driving the navigation in tests
+
+- **Soft navigation** → drive a real ` ` click. **Initial load** → use
+ `page.goto()` inside `instant()` with the `baseURL` option. Do not substitute
+ `goto` for a soft-nav verdict; the two shells can differ
+ (`test-template.md`, `reference/real-app-patterns.md`).
+- With parallel routes, only the slots that change re-render on a soft
+ navigation; client-rendered navigation UI does not re-render at all. Do not
+ chase a slot the navigation never touches
+ (`reference/real-app-patterns.md`).
+
+## Files
+
+- `rig-template.md`: phase 0 production build, test context, navigation
+ contract, and unattended loop discovery.
+- `test-template.md`: the shipped `instant()` specs for both navigation
+ types (phase C), and the delete-before-PR baseline scaffold (phase B).
+- `reference/red-test-robustness.md`: the C-gate and phase F. The taxonomy of
+ untrustworthy REDs, the checklist, the differential recipe, the vacuous-pass
+ failure mode, and worked cases.
+- `reference/real-app-patterns.md`: parallel routes, deferring an auth gate,
+ initial-load vs soft-navigation shells, the empty-shell failure mode, the
+ responsive-skeleton mismatch, edge cases.
+
+## After optimization
+
+Once the target routes are instant, check whether the app has already adopted
+Partial Prefetching (`partialPrefetching: true`, or the relevant destination
+still uses `prefetch = 'partial'` during an incremental rollout).
+
+Make that check mechanically:
+
+```bash
+rg -n "partialPrefetching|prefetch\s*=\s*['\"]partial['\"]" --glob 'next.config.*' --glob 'app/**' --glob 'src/app/**'
+```
+
+If `partialPrefetching: true` is in config, the app is globally adopted. If only
+`prefetch = 'partial'` matches, treat those destination segments as adopted
+during an incremental rollout and keep checking any other target routes.
+
+- **Already adopted:** for any URL-data route that stopped at the limitation
+ above, consider a targeted ` ` on the links where having
+ that URL-specific content ready before the click is worth the per-link server
+ work. Keep the default link behavior everywhere else so the shared App Shell
+ remains the low-cost baseline.
+- **Not adopted yet:** recommend
+ [`next-partial-prefetching-adoption`](https://github.com/vercel/next.js/tree/canary/skills/next-partial-prefetching-adoption).
+ That skill moves the app onto the better prefetching model: shared App Shell
+ prefetches by default, fewer duplicated full-prefetch requests for visible
+ links, a link audit for existing ` ` usage, and optional
+ per-link prefetching only where URL-specific content is worth the
+ extra server work.
diff --git a/.claude/skills/next-cache-components-optimizer/reference/patterns.md b/.claude/skills/next-cache-components-optimizer/reference/patterns.md
new file mode 100644
index 0000000..9ec0cc0
--- /dev/null
+++ b/.claude/skills/next-cache-components-optimizer/reference/patterns.md
@@ -0,0 +1,357 @@
+# Refactor patterns — push dynamic down into the shell
+
+Each pattern is **before → after**: keep as much as possible in the prerendered shell, and wrap only genuinely per-request work in a tight `` (or hoist it into `use cache`). Production shapes — parallel-route slots, deferring an auth gate, client slot-routers — are in `real-app-patterns.md`.
+
+---
+
+## 1. Awaiting at the top → move the await into a Suspense child
+
+The most common blocking shape. Awaiting request-time data at the top of a page/layout makes **everything below it** dynamic.
+
+```tsx
+// ❌ before — top-level await of a non-static param + uncached data
+export default async function Page(props: PageProps<'/store/[slug]'>) {
+ const { slug } = await props.params
+ const product = await db.products.findBySlug(slug)
+ return (
+
+ {product.name}
+
+ )
+}
+```
+
+```tsx
+// ✅ after — pass the params promise down; await inside a Suspense-wrapped child
+import { Suspense } from 'react'
+
+export default function Page(props: PageProps<'/store/[slug]'>) {
+ return (
+ Loading product…}>
+
+
+ )
+}
+
+async function Product({ params }: { params: Promise<{ slug: string }> }) {
+ const { slug } = await params
+ const product = await db.products.findBySlug(slug)
+ return (
+
+ {product.name}
+
+ )
+}
+```
+
+Inline variant when you don't want a separate component — unwrap the promise without awaiting at the top:
+
+```tsx
+export default function Page(props: PageProps<'/store/[category]'>) {
+ return (
+ }>
+ {props.params.then(({ category }) => (
+
+ ))}
+
+ )
+}
+```
+
+**Insight:** [runtime data during prerendering](https://nextjs.org/docs/messages/blocking-prerender-runtime).
+
+---
+
+## 2. `cookies()` / `headers()` in a layout → start, don't await; pass down
+
+A layout that awaits request data blocks the layout **and every page under it**.
+
+```tsx
+// ❌ before — whole layout (and all children) becomes dynamic
+export default async function Layout({ children }) {
+ const cookieStore = await cookies()
+ const theme = cookieStore.get('theme')?.value
+ return {children}
+}
+```
+
+```tsx
+// ✅ after — start the read without awaiting, pass the promise to a Suspense child
+import { Suspense } from 'react'
+import { cookies } from 'next/headers'
+
+export default function Layout({ children }: { children: React.ReactNode }) {
+ const cookieStore = cookies() // not awaited → does not block the shell
+ return (
+
+
+ }>
+
+
+
+ {children}
+
+ )
+}
+
+async function UserMenu({
+ cookiePromise,
+}: {
+ cookiePromise: ReturnType
+}) {
+ const theme = (await cookiePromise).get('theme')?.value
+ return …
+}
+```
+
+`{children}` and `` stay in the shell; only `` streams.
+
+**Insight:** [runtime data during prerendering](https://nextjs.org/docs/messages/blocking-prerender-runtime).
+
+---
+
+## 3. Uncached fetch / DB read → choose `use cache` _or_ ``
+
+Decide per data source. Same-for-everyone & rarely-changing → cache it (it joins the shell). Per-request & must-be-fresh → leave it uncached behind a boundary.
+
+```tsx
+// ❌ before — both block the shell
+const product = await db.products.findBySlug(slug) // rarely changes
+const inventory = await db.inventory.findBySlug(slug) // must be fresh
+```
+
+```tsx
+// ✅ after — cache the stable one (shell), defer the fresh one (streams)
+async function getProduct(slug: string) {
+ 'use cache' // → resolved at prerender, lands in the shell
+ return db.products.findBySlug(slug)
+}
+
+;Checking availability…}>
+ {/* uncached read stays here, streams in */}
+
+```
+
+> A bare `'use cache'` applies the `default` `cacheLife` profile. Choose freshness explicitly with `cacheLife('')` (`default` / `seconds` / `minutes` / `hours` / `days` / `weeks` / `max`) rather than shipping the default lifetime by omission.
+>
+> Serverless note: `use cache` is in-memory and does not persist across instances — use [`use cache: remote`](https://nextjs.org/docs/app/api-reference/directives/use-cache-remote) for a durable shell.
+
+**Insight:** [uncached data during prerendering](https://nextjs.org/docs/messages/blocking-prerender-dynamic).
+
+---
+
+## 4. Dynamic params → `generateStaticParams` (shell) or `` (stream)
+
+If the set of params is enumerable, prerender them so `await params` resolves into the shell. Otherwise treat params as request-time and wrap consumers in ``.
+
+```tsx
+// ✅ option A — enumerate → params resolve into the shell, no Suspense needed for params
+export function generateStaticParams() {
+ return [{ slug: 'shoes' }, { slug: 'hats' }]
+}
+export default async function Page({ params }: PageProps<'/store/[slug]'>) {
+ const { slug } = await params // known at build → shell-safe
+ // ...
+}
+```
+
+```tsx
+// ✅ option B — not enumerable → params is request-time; await it inside a boundary (pattern #1)
+```
+
+Root params (the dynamic segments the root layout sits inside, e.g. `app/[lang]/layout.tsx`) are readable from any Server Component via `next/root-params` without prop-drilling — but under Cache Components they must still be enumerated by `generateStaticParams` (at least one value per root param) to land in the shell, the same as any other dynamic param.
+
+**Insight:** [runtime data during prerendering](https://nextjs.org/docs/messages/blocking-prerender-runtime).
+
+---
+
+## 5. `searchParams` → always behind `` (on page load)
+
+Search params are never known at build, so awaiting them (or `useSearchParams()`) suspends on a page load. Keep the rest of the page in the shell by isolating the consumer.
+
+```tsx
+// ✅ static content stays in the shell; the search-dependent part streams
+export default function Page(props: PageProps<'/search'>) {
+ return (
+ <>
+ Search {/* shell */}
+ }>
+
+
+ >
+ )
+}
+async function Results({
+ searchParams,
+}: {
+ searchParams: Promise<{ q?: string }>
+}) {
+ const { q } = await searchParams
+ return
+}
+```
+
+On a **client navigation** the router already has the URL, so a `useSearchParams()` consumer resolves synchronously and can appear in the prefetched shell — but you still need the boundary for the page-load path.
+
+**Insight:** [runtime data during prerendering](https://nextjs.org/docs/messages/blocking-prerender-runtime) (or, via `useSearchParams` in a Client Component, [URL data in a Client Component](https://nextjs.org/docs/messages/blocking-prerender-client-hook)).
+
+---
+
+## 6. Non-deterministic values → `connection()` + ``, or cache
+
+`Math.random()`, `Date.now()`, `crypto.randomUUID()` produce different output each run, so Cache Components makes you choose: per-request (defer) or fixed (cache).
+
+```tsx
+// ✅ per-request value: gate on connection() and wrap in Suspense
+import { connection } from 'next/server'
+async function RequestId() {
+ await connection()
+ return {crypto.randomUUID()}
+}
+//
+```
+
+```tsx
+// ✅ same value for everyone: cache it so it joins the shell
+async function buildId() {
+ 'use cache'
+ return Date.now()
+}
+```
+
+**Insight:** [`Date.now()`](https://nextjs.org/docs/messages/blocking-prerender-current-time), [`Math.random()`](https://nextjs.org/docs/messages/blocking-prerender-random), or [`crypto`](https://nextjs.org/docs/messages/blocking-prerender-crypto) while prerendering.
+
+---
+
+## 7. Dynamic `generateMetadata` → static export, `use cache`, or a dynamic-marker for runtime data
+
+```tsx
+// ❌ before — reading request data blocks the route's metadata
+export async function generateMetadata() {
+ const c = await cookies()
+ return { title: c.get('title')?.value }
+}
+```
+
+```tsx
+// ✅ option A — static
+export const metadata = { title: 'Store' }
+
+// ✅ option B — cache the metadata (depends on external data, not runtime data)
+export async function generateMetadata() {
+ 'use cache'
+ return { title: await getTitle() }
+}
+```
+
+```tsx
+// ✅ option C — metadata genuinely needs runtime data (cookies/headers):
+// keep generateMetadata dynamic, and add a dynamic-marker component to the
+// page so the rest of the page still prerenders into the shell.
+import { Suspense } from 'react'
+import { connection } from 'next/server'
+import { cookies } from 'next/headers'
+
+export async function generateMetadata() {
+ const token = (await cookies()).get('token')?.value
+ return { title: token ? 'Personalized' : 'Store' }
+}
+
+async function DynamicMarker() {
+ await connection() // signals intentional dynamic content
+ return null
+}
+
+export default function Page() {
+ return (
+ <>
+ {/* static content — stays in the shell */}
+
+
+
+ >
+ )
+}
+```
+
+`generateViewport` is the same, except dynamic viewport blocks the **whole page**. Genuine instant fixes: a static `viewport` export, or `use cache`. The other two are dynamic-acceptance opt-outs, not instant fixes — do not treat them as a way to reach GREEN: `export const instant = false` opts the segment out of validation while the navigation still blocks, and a `` above the document `` makes the whole route dynamic.
+
+**Insight:** [runtime data in `generateMetadata()`](https://nextjs.org/docs/messages/blocking-prerender-metadata-runtime).
+
+---
+
+## 8. Keep the LCP element in the shell
+
+Don't bury the main heading (the LCP element) inside a boundary — it can't paint until the boundary resolves.
+
+```tsx
+// ✅ LCP outside the boundary → paints in the shell
+{product.name} {/* shell (cache the name if needed) */}
+ }>
+ {/* streams */}
+
+```
+
+---
+
+## 9. Granularity below shared layouts (client-nav correctness)
+
+A single boundary in the **root** layout passes a page-load check but leaves sibling client navigations blocking. Put a boundary **below the shared layout**.
+
+```tsx
+// app/store/layout.tsx — boundary below the /store shared layout covers
+// client navs like /store/shoes → /store/hats (the root boundary does not)
+export default function StoreLayout({
+ children,
+}: {
+ children: React.ReactNode
+}) {
+ return (
+
+ {/* shell */}
+ }>{children}
+
+ )
+}
+```
+
+Prefer per-component boundaries inside the page (patterns #1–#5) over one big layout boundary — they keep more real content in the shell and stream independently.
+
+**Insight:** the read's own insight surfaces on the client navigation when the boundary is too high — see [where to place the boundary](https://nextjs.org/docs/messages/blocking-prerender-dynamic#choosing-where-to-place-the-boundary).
+
+## 10. URL data that can't move
+
+Patterns 1–9 grow a **static shell** by moving dynamic reads behind boundaries. Session data from `cookies()` and `headers()` is handled by the earlier patterns. URL data is different: `params`, `searchParams`, and the full URL belong to one link, while the App Shell is shared by every link to the route.
+
+If the whole route depends on URL data, pushing the read lower may leave no meaningful shared shell to commit. That is the optimizer's stop point, not another shell refactor. Return to `SKILL.md` after the optimization loop for the optional per-link-prefetch follow-up.
+
+Per-link prefetching is the only way for this soft navigation to commit the
+URL-specific content before the click. It has **three requirements**:
+
+```tsx
+// 1. The destination has adopted Partial Prefetching, either app-wide with
+// partialPrefetching: true or route-by-route with prefetch = 'partial'.
+
+// 2. The navigation asks for a full prefetch — normally .
+// A default/auto prefetch only warms the static shell.
+
+ …
+
+
+// 3. The URL-dependent content is behind `use cache`, keyed by the resolved
+// params/searchParams/full URL value.
+```
+
+Under `instant()` the runtime entry is what commits, so the real content, not a skeleton, shows under the lock.
+
+Gotchas (each cost real debugging time):
+
+- **The full prefetch is mandatory.** With App Shells enabled an auto/PPR prefetch bails before the runtime spawn (`subtreeHasSpeculativePrefetch`); use ` ` for normal links, or keep an existing manual full-prefetch abstraction if the app already owns one. If the route is still RED after caching the URL-dependent content, the navigation may still be doing an auto prefetch.
+- **Partial Prefetching must be adopted for the destination.** Per-link prefetching uses the Partial Prefetching path. If the route is still RED after caching the URL-dependent content, check whether the link is still doing an auto prefetch or whether the destination never adopted Partial Prefetching.
+- **Prefetch the canonical URL.** A link whose href 307-redirects (a `/foo` that canonicalizes to `/`) can't be prefetched — the prefetch receives the redirect, not the tree. Point the link and the prefetch at the final URL.
+- **Don't blanket the full prefetch.** It fetches _all_ the target's dynamic data; enabling it for every visible link is wasteful. Scope `prefetch={true}` to the per-link-prefetch targets only, using the [trade-offs](https://nextjs.org/docs/app/guides/optimizing-prefetching#trade-offs) and [hover-triggered prefetch](https://nextjs.org/docs/app/guides/prefetching#hover-triggered-prefetch) when many links are visible.
+- **Marker must be a committed node, not RSC bytes.** The content is often a client component, so its text isn't in the prefetch response — assert a `data-testid` that renders when the client subtree commits, not a substring of the stream.
+
+Prefer a static shell (patterns 1–9) whenever the URL-data read can move: it's cheaper than a per-link prefetch and also covers hard load. Per-link prefetching is only for URL-data reads that genuinely can't move, or routes whose useful content is all URL-specific.
+
+**Insight:** [dynamic data during prefetching](https://nextjs.org/docs/messages/instant-link-prefetch-partial).
diff --git a/.claude/skills/next-cache-components-optimizer/reference/real-app-patterns.md b/.claude/skills/next-cache-components-optimizer/reference/real-app-patterns.md
new file mode 100644
index 0000000..31fa2e0
--- /dev/null
+++ b/.claude/skills/next-cache-components-optimizer/reference/real-app-patterns.md
@@ -0,0 +1,88 @@
+# Real-app patterns
+
+The rest of this skill models a single linear `layout → page` tree. Production App Router routes add **parallel routes, shared layout UI, and auth gates**, which is where most of the real static-shell work happens. These patterns bridge that gap. Read the skill's `SKILL.md` first.
+
+## Parallel routes: each slot is its own boundary
+
+Instant validation treats every parallel-route slot below the shared layout as an **independent** navigation boundary. Consequences:
+
+- **Each `@slot` needs its own ``** around its dynamic reads; a boundary in one slot does not cover another.
+- **An uncovered dynamic read in any slot blocks the whole navigation.** A perfect `@content` does not help if `@sidebar` awaits a session at the top.
+- **A slot that renders `null` (e.g. `default.tsx`) is shell-safe**: it is static and performs no reads. Slots that do not re-render for this navigation cost nothing.
+
+```
+[tenant]/layout.tsx (shared: already mounted on a soft navigation; not re-rendered)
+ ├ @content → settings/layout → billing/page ← guard each slot's dynamic reads…
+ ├ @sidebar → side nav ← …here too (independent boundary)
+ └ @header → default.tsx → null ← free
+```
+
+## Client-rendered slot routing is not part of the soft-navigation re-render
+
+A common pattern: a stable shared layout renders `@header`/`@sidebar` through a **client** component that swaps slot content based on `usePathname()`. On a soft navigation, Next.js only re-renders the **server** segments that changed below the shared layout; a client-component subtree is not part of that re-render. So that navigation UI neither blocks the navigation nor needs a server `` for it; only the server segments that actually change (e.g. `@content`) matter. It does participate in an initial load (see the caveat below).
+
+## "Instant" is not "useful shell": the empty-shell failure mode
+
+Validation checks that a dynamic read is **guarded by a boundary**, not that the fallback is non-empty. A `` with no `fallback` (or `fallback={null}`) passes validation and commits instantly, but renders a **blank** shell. If a layout and its page both `await getSession()` (your auth library's request-time read) at the top under one empty-fallback boundary, the whole frame collapses to nothing while the user waits. "Validates as instant" and "good loading experience" are different goals.
+
+> Give every boundary a real loading skeleton, and place it low so the most real content stays in the shell. A `fallback={null}` directly above `` is a deliberate empty-shell opt-out; an empty fallback lower in the tree is almost always a bug.
+
+## The responsive-skeleton mismatch: the shell must match every breakpoint
+
+A loading skeleton that misaligns with the loaded UI is its own bug, and it usually appears on mobile. A hand-built skeleton encodes one layout; the real component is responsive and changes shape at breakpoints, so a desktop-shaped skeleton no longer lines up once the viewport is small.
+
+A concrete shape: a list-detail view renders a list or tree in a side panel on desktop, but collapses that panel into a single dropdown or drawer on mobile (with its own loading state). A row skeleton built for the desktop panel has nothing to align with on mobile.
+
+The fix is the same push-down as everywhere else: **share the real responsive layout between the live render and the shell render.** One responsive component renders both (its data slots show the reused `*Skeleton` in the shell and real data after the stream), so the breakpoint switch happens once, for both renders, and there is no second desktop-only skeleton to drift.
+
+(Same hoist rule, responsive layout included.) Verify the shell at both desktop and mobile widths against the real render at the same width.
+
+## Deferring an auth gate / top-level `await` in a layout
+
+A top-level `await` in a layout blocks everything below it (the most common blocker; see [Runtime data during prerendering](https://nextjs.org/docs/messages/blocking-prerender-runtime)). Auth gates are the most common real instance:
+
+```tsx
+// ❌ Before: the await + redirect at the top blocks the whole settings frame
+export default async function SettingsLayout({ children }) {
+ const session = await getSession() // your auth library's request-time read; suspends during prerender → frame can't build
+ if (!session?.user) redirect(getLoginUrl())
+ return {children}
+}
+```
+
+```tsx
+// ✅ After: render children unconditionally; move the gate into a Suspense child
+import { Suspense } from 'react'
+
+export default function SettingsLayout({ children }) {
+ return (
+
+
+
+
+ {children}
+
+ )
+}
+
+async function AuthGate() {
+ const session = await getSession() // the session read suspends during prerender…
+ if (!session?.user) redirect(getLoginUrl()) // …so redirect() never runs at build time
+ return null
+}
+```
+
+The shell prerenders as if authorized (the session read suspends before `redirect()` is reached, so the redirect only happens at request time), and `{children}` is now in the shell instead of behind the gate. (`fallback={null}` is correct here: `AuthGate` renders nothing on success.)
+
+## Initial-load shell vs soft-navigation shell
+
+The `../test-template.md` specs drive a ` ` click for soft navigations and `page.goto()` for initial loads. The two shells can differ for the same route:
+
+> **The initial-load shell can show less than the soft-navigation shell when a layout above the shared boundary awaits un-enumerated `params`/`searchParams`.** An initial load re-runs every layout from the root; if a parent layout does `await props.params` and that segment has no `generateStaticParams`, the param suspends on the initial load and its whole subtree drops out of the shell. A soft navigation does not re-render that parent and already has the params. Symptom: an element present after a ` ` click is missing after `goto`.
+
+To assert the soft-navigation shell, drive a real ` ` click (through menus if necessary). Use `page.goto()` inside `instant()` to assert the initial-load shell, or when no parent above the shared boundary awaits un-enumerated params, in which case the two coincide.
+
+## Edge cases
+
+- **A `React.cache` (or custom memoization) wrapper around `cookies()`/`headers()` still suspends.** Memoizing the call does not make it shell-safe: the underlying request read still returns a pending promise during prerender. Only the **`use cache`** directive, keyed on static or param inputs, puts data in the shell.
+- **Playwright cannot see a `display: contents` or fragment fallback.** Such a fallback reads as hidden, so `instant()` assertions cannot `toBeVisible()` it. Give fallbacks a real wrapper element with a `data-testid`.
diff --git a/.claude/skills/next-cache-components-optimizer/reference/red-test-robustness.md b/.claude/skills/next-cache-components-optimizer/reference/red-test-robustness.md
new file mode 100644
index 0000000..bf106fa
--- /dev/null
+++ b/.claude/skills/next-cache-components-optimizer/reference/red-test-robustness.md
@@ -0,0 +1,156 @@
+# RED-test robustness: verify the RED before optimizing
+
+The C-gate of the workflow. A RED that is red for the wrong reason sends you optimizing a route that
+was never broken: the route becomes instant, the test stays red (or the code is contorted to
+satisfy a broken assertion), and the effort lands on the wrong problem. The prevention is cheap:
+spend a few minutes verifying the RED is trustworthy first.
+
+## The deciding question
+
+> **Does the marker render WITHOUT the lock, as the test user?**
+
+- **No**: the test is red because the marker or page is not there for that user or environment. A
+ marker bug, not an instant-navigation bug. Fix the marker. (This is the most common case.)
+- **Yes**: the marker exists and is reachable; a red under the lock is a genuine "not instant".
+ Optimize the route.
+
+Everything below serves answering that question honestly.
+
+## When the blocked route will not build
+
+With Cache Components, a top-level blocking read can fail the build before the
+test can produce a RED. Add `export const instant = false` to the target route
+as part of the temporary RED scaffold. It lets the known blocker build without
+making the navigation instant. Remove the opt-out with the fix, and include it
+when reverting the fix for the differential.
+
+## Cookie and session reads are not lock probes
+
+Do not manufacture a RED with `cookies()` or a session read alone. The testing
+lock restricts the navigation to its shell; it does not make request cookies
+unavailable. Use the route's real blocking uncached data, and prefer the
+self-validating test variant when deferred content exists.
+
+## The robustness checklist (all must hold)
+
+1. **Red on baseline**: fails on the unfixed route.
+2. **Right reason**: without the lock, the marker is visible on the production-build rig (never
+ `next dev`), running as the test user, not only in the author's own logged-in session.
+3. **Differential**: reverting only the fix → RED; re-applying → GREEN; nothing else moves it.
+4. **Non-gameable marker**: a sync element of the static shell, never streamed data.
+5. **Deterministic on a production build**: stable across N runs; never `next dev`.
+6. **Discriminating both ways**: present under the lock on an instant route, absent under the
+ lock on a blocking one.
+7. **Renders for the test user**: under that user's flags, plan, role, and data.
+8. **Conditional redirects accounted for**: assert at the route's real destination for that user.
+9. **Real selector**: a `data-testid` on a known static-shell node, not a guessed `role`/`name`.
+10. **Visible marker**: not `display:none`, off-screen, or inside a hover overlay; for lists,
+ target `.filter({ visible: true }).first()`.
+11. **Fresh build under test**: the deployment being measured contains the latest commit, not a
+ build URL still serving the previous deploy.
+
+## Taxonomy: red for the wrong reason
+
+Any of these makes a RED untrustworthy. None of them is "the navigation isn't instant."
+
+| Wrong reason | How it occurs | How to rule it out |
+| ---------------------------- | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------- |
+| **Selector matches nothing** | a guessed `getByRole('button', { name: 'Folder' })` | grep the component for the real accessible name; add a `data-testid` |
+| **Conditional redirect** | the route `redirect()`s for the test user (flag/role), so the marker page is never reached | check the page's top-level branches; assert at the real destination, or pin the flag |
+| **Flag / plan / role gate** | the author has the flag or plan; the test user does not | run the unlocked baseline as the test user; pin flags via the project's override mechanism |
+| **Empty state** | the marker only exists when data does; the CI account is empty | pick a marker present in the empty state (a layout element such as the page header), or seed data |
+| **Timeout / flake** | a slow API or transient infrastructure error | re-run; separate infrastructure flake from a real signal |
+| **Streamed marker** | the marker is behind ``, so it is never in the shell | choose a sync shell element; verify it sits outside every `` |
+| **Auth redirect** | unauthenticated → `/login` | confirm login succeeded before the navigation |
+| **Stale deployment** | the test ran against the previous build (the URL under test still serves the prior deploy) | poll the deployment for a marker from the latest commit before trusting any verdict |
+| **Hidden / off-screen** | the testid is on a hover-overlay or off-screen list item | put the marker on an always-visible node; `.filter({ visible: true }).first()` for lists |
+
+## Worked cases
+
+These are illustrative failures from real optimization runs; each was red for a wrong reason, and
+none was an instant-navigation problem. One app's drift surface might be dominated by feature flags and
+plans; another's by auth state, an empty database, or locale. The taxonomy lists every wrong
+reason; the rig file's DRIFT list says which rows apply to your app.
+
+- **Guessed selector + empty state**: the marker was a button picked by a guessed accessible name
+ that no element actually had, on a list page whose CI account had no rows. → checks 7, 9. Fix: a
+ `data-testid` on a real static-shell node.
+- **Hidden marker**: the testid sat first on a `hidden sm:block` hover-overlay link, then on an
+ off-screen carousel card; Playwright resolved the element but reported it hidden. → check 10.
+ Fix: an always-visible node; for lists, `.filter({ visible: true }).first()`.
+
+## Differential check (capture in the PR)
+
+The strongest evidence that the RED measured the property:
+
+```
+1. on the fixed branch → GREEN
+2. revert ONLY the fix (the push-down) → RED
+3. re-apply → GREEN
+4. confirm no other change moves it
+```
+
+Link the two runs (or include the toggle diff and results) in the PR description. A reviewer who
+sees the differential knows the test measures the property.
+
+## `instant()` is not a stopwatch
+
+See: [`instant()`](https://nextjs.org/docs/app/guides/instant-navigation#prevent-regressions-with-e2e-tests).
+
+The test does not measure how fast a navigation is. `instant()` gates dynamic data so the content
+of the static shell can be asserted; the signal is presence, not speed. Under the lock, an instant
+route's shell is present, and a blocking route's content never commits, regardless of wait time.
+Therefore:
+
+- The shipped assertion is `await expect(SHELL_MARKER).toBeVisible()` under the lock. Do not add a
+ custom timeout or a `painted` boolean.
+- A custom short timeout (e.g. `3000`) implies a race against a clock that does not exist. It adds
+ nothing to the verdict and invites false REDs on an instant route whose commit lands a microtask
+ late.
+- Do not use `locator.isVisible({ timeout })` as a soft wait: Playwright deprecated and ignores
+ that timeout; the call returns immediately.
+- "Renders for the test user" (checks 7-9) is established at authoring time with the unlocked
+ baseline scaffold, not by a timed assertion in the shipped test.
+
+## `instant()` guards need no retries and no prefetch warming
+
+An `instant()` guard is deterministic. Do not configure retries on one, and do not hover-warm to
+help a prefetch land in time. Under the lock, the router initiates the route prefetch and awaits it
+before committing (even for a `prefetch={false}` link, even for a route already in the prefetch
+cache), so the committed shell does not depend on any prior render, hover, or menu-open prefetch.
+A flaky guard has a real cause: a marker that is not a sync node of the destination's shell, a
+flag/role/empty-state gap for the test user, or a genuinely blocking route. The fix is in the page or
+the marker; a retry masks the regression the guard exists to catch. The only legitimate
+`.hover()`/menu-open is when the trigger element itself is not in the DOM until hovered or opened.
+
+## Silent no-op: the testing API must be exposed in the measured build
+
+`instant()` works by setting a cookie (`next-instant-navigation-testing`) that lock code inside the
+build reads. It does not throw when that lock code is absent; it only throws on nested calls or an
+unknown base URL. If the build was produced without the testing API
+(`experimental.exposeTestingApiInProductionBuild`), the cookie is ignored, the navigation runs
+normally, and the `instant()` test passes vacuously. A green `instant()` test is only meaningful if
+the lock engaged.
+
+Two defenses; use both:
+
+1. **Confirm the API is exposed on the target.** Wire the flag to the platform's preview/staging
+ condition or an explicit environment variable; the rig file records the project's spelling
+ (SKILL.md phases 0 and A). Do not trust a pass from a build where it is not set.
+2. **Make the test self-validating**: for any route with deferred content, also assert that the
+ deferred content is gated under the lock, not only that the shell is present
+ (`../test-template.md`, self-validating variant). If the lock did not engage, the content is
+ already present and `toHaveCount(0)` fails.
+
+ The gated half holds under the lock for both navigation types regardless of warm state: the
+ soft-nav client lock gates dynamic-data writes, and on an initial load the server honors the
+ cookie on the document request and suspends dynamic data. A vacuous pass is only possible with
+ a build produced WITHOUT the testing API, which defense #1 above covers.
+
+## Determinism and the rig
+
+- Always measure on a production build, never `next dev`; SKILL.md phase A owns this invariant and
+ its rationale.
+- Run the RED several times; an intermittently red gate is not a gate. If it flakes, determine
+ whether the cause is infrastructure (transient errors) or a real race before trusting either
+ color.
diff --git a/.claude/skills/next-cache-components-optimizer/rig-template.md b/.claude/skills/next-cache-components-optimizer/rig-template.md
new file mode 100644
index 0000000..e2a6ff4
--- /dev/null
+++ b/.claude/skills/next-cache-components-optimizer/rig-template.md
@@ -0,0 +1,173 @@
+# Production `instant()` rig
+
+The optimizer suite needs a production build that exposes the Next.js testing
+API, a stable URL for that build, and a Playwright command that can drive the
+initial loads or client navigations being optimized. Discover this setup once,
+record it in `instant-nav.rig.md`, and reuse it across optimization runs.
+
+Read an existing `instant-nav.rig.md` before creating one. Inspect the
+repository before asking the user:
+
+- `package.json` scripts for build, start, and end-to-end tests
+- `playwright.config.*` for `baseURL`, `webServer`, projects, and authentication
+- `next.config.*` for existing `experimental` options
+- CI, preview deployment, container, and hosting configuration
+- test helpers for login, `storageState`, fixtures, flags, and seeded data
+
+Ask only for details the repository cannot answer, such as unavailable
+credentials or which remote environment may expose the testing API.
+
+## What the rig must define
+
+### Production build and server
+
+Use `next build` followed by `next start`, or a remote artifact produced by the
+same production build. Development can help diagnose a route, but the final
+RED and GREEN must come from a production build.
+
+Record separate build and start commands. For a local rig, record the port,
+stop any previous server before starting, fail on `EADDRINUSE`, and confirm the
+new process owns the port before running Playwright. `next start` can fork a
+`next-server` child, so the launcher process ID may not own the port. Start the
+server in a process group that the rig can stop as a unit, or discover and stop
+the process listening on the recorded port before the next build.
+
+### Testing API
+
+An `instant()` test against a production build requires
+`experimental.exposeTestingApiInProductionBuild`. Gate it so real production
+builds do not expose the API:
+
+```ts filename="next.config.ts" highlight={3,8-10}
+import type { NextConfig } from 'next'
+
+const exposeTestingApi = process.env.EXPOSE_TESTING_API === '1'
+
+const nextConfig: NextConfig = {
+ cacheComponents: true,
+ experimental: {
+ exposeTestingApiInProductionBuild: exposeTestingApi,
+ },
+}
+
+export default nextConfig
+```
+
+Merge the option into an existing `experimental` object instead of replacing
+the project's other experimental options.
+
+Set the condition while running `next build`. Setting it only for `next start`
+is too late because the testing API is compiled into the production artifact.
+When the artifact was built without it, Next.js does not activate the
+navigation lock, so the test cannot distinguish shell content from streamed
+dynamic content. Rebuild with the condition enabled before interpreting the
+results. Use the project's existing environment naming when it already
+distinguishes test, staging, preview, and production builds.
+
+### Test command and base URL
+
+Record the exact Playwright command and how it receives the measured build's
+URL. Reuse the project's package manager, Playwright configuration, projects,
+and reporters. The suite must import `instant()` from `@next/playwright`. If
+the dependencies are absent, install `@next/playwright` on the same release
+line as the project's `next`, alongside `@playwright/test`.
+
+For a local rig, a typical sequence is:
+
+```bash filename="Terminal"
+EXPOSE_TESTING_API=1 pnpm build
+pnpm start --port 3000
+BASE_URL=http://localhost:3000 pnpm playwright test tests/static-shell.spec.ts
+```
+
+Adapt the script names and port to the project. Keep the production server
+running while the test command executes. Follow the public
+[`instant()` testing pattern](https://nextjs.org/docs/app/guides/instant-navigation#prevent-regressions-with-e2e-tests): use `page.goto()` for an initial-load
+contract and click the real ` ` for a client-navigation contract.
+
+### Test context
+
+Record the state required to reach the target route and shell marker:
+
+- Use `public; no authentication` when the route is public.
+- Otherwise record the test account and login mechanism, including a fixture,
+ `storageState`, API login, or seeded session.
+- Record flags, plan, role, locale, seeded data, and other state that can change
+ which shell the test sees.
+
+A test user is not required. The field exists to make authenticated and
+state-dependent tests reproducible when the app needs one.
+
+### Drift
+
+List differences between the state used to choose the shell contract and the
+state used by Playwright. Feature flags, permissions, empty test data, and
+locale differences can make an assertion fail because the target is
+unreachable, not because its shell blocks. Write `none known`
+only after checking the test context.
+
+### Iteration loop
+
+Record the complete loop the agent can repeat without rediscovering commands:
+
+- Local: build with the testing API, start the new artifact, run the focused
+ suite, stop the server, edit, and repeat.
+- Remote: push, wait for the measured artifact, verify it matches `HEAD`, run
+ the focused suite against its URL, edit, and repeat.
+
+Note any step the agent cannot perform without the user, including deployment
+approval, protected branches, secrets, or multi-factor authentication.
+
+### Artifact liveness
+
+For a remote rig, record how the test proves the deployment matches `HEAD`.
+Prefer an endpoint or response header that exposes the deployed commit SHA. If
+the app has neither, use the deployment provider's API to select the artifact
+whose commit SHA matches `HEAD`.
+
+A freshly completed local `build` followed by `start` does not need a SHA
+probe. Record `n/a; local build and start`.
+
+### Walls
+
+Record build and run obstacles with their working resolution, such as required
+environment variables, server-only imports that fail during prerendering,
+unavailable credentials, or a process that keeps reclaiming the test port.
+Reuse these notes on the next iteration.
+
+## Write `instant-nav.rig.md`
+
+Place this file at the repository root or next to the end-to-end configuration:
+
+```md
+# instant-nav rig:
+
+- BUILD:
+- EXPOSE:
+- RUN:
+- TEST USER: ; state:
+- DRIFT:
+- CONTRACTS:
+- LOOP: ; agent limits: <...>
+- LIVENESS:
+- WALLS:
+```
+
+`CONTRACTS` may list more than one focused navigation, but each route and
+navigation type needs its own test. Every field needs a concrete value. `n/a`
+is valid only with a reason, such as `TEST USER: public; no authentication` or
+`LIVENESS: n/a; local build and start`.
+
+## Check the rig before writing the baseline
+
+Before recording the static-shell contract:
+
+1. Build with the testing API condition enabled.
+2. Start or locate that exact artifact and confirm the base URL responds.
+3. Run one focused `instant()` smoke test using the intended navigation type.
+4. Confirm the test can reach the route and eventual destination UI in the
+ recorded test context.
+
+Fix the rig before interpreting an optimizer failure. A missing testing API,
+stale deployment, unreachable target, or wrong test state is an environment
+failure rather than evidence that the shell blocks.
diff --git a/.claude/skills/next-cache-components-optimizer/test-template.md b/.claude/skills/next-cache-components-optimizer/test-template.md
new file mode 100644
index 0000000..efd4444
--- /dev/null
+++ b/.claude/skills/next-cache-components-optimizer/test-template.md
@@ -0,0 +1,167 @@
+# Test template: the instant() guard
+
+See: [`@next/playwright` `instant()`](https://nextjs.org/docs/app/guides/instant-navigation#prevent-regressions-with-e2e-tests).
+
+Ship one test per navigation type you are guarding: under `instant()`, assert that the
+destination's static shell appears. `instant()` gates dynamic data, so a correctly instant route
+commits its shell under the lock and a blocking route does not. `instant()` is a ruler, not a
+stopwatch: do not add custom timeouts or timing races (see `reference/red-test-robustness.md`).
+Whether the marker is the right one (rendering for the test user, not flag-gated, not redirected
+away, not guessed) is established at authoring time with the unlocked baseline scaffold below
+(phase B, the C-gate), not by additional assertions in the shipped test.
+
+All identifiers in angle brackets (``, ``) and the `../helpers` import are placeholders;
+substitute your project's e2e auth helper, URL helper, and real testids/trigger before running.
+
+## Soft navigation (client-side navigation)
+
+Drive a real ` ` click. The committed shell is the destination's prefetched App Shell.
+Under the lock the router initiates and awaits the route prefetch itself, so no manual warming is
+needed; if the shell is intermittently absent, treat it as a real blocker or marker bug (C-gate),
+never as a warming race. Do not add waits or hovers.
+
+```ts
+import { test, expect } from '@playwright/test'
+import { instant } from '@next/playwright'
+// Use the auth/setup helpers your e2e suite already has. Run as the test user
+// (defined in SKILL.md phase B).
+import { logIntoTestAccount, testUrl } from '../helpers'
+
+// A SYNC element of the destination's static shell (header, action button,
+// column header), not data that streams in, and one that renders for the
+// test user (not gated by a flag, plan, role, or empty state). Prefer a
+// data-testid on a known static node over a guessed role/name.
+const SHELL_MARKER = '[data-testid="-shell-marker"]'
+
+test.describe('instant nav: A -> B', () => {
+ test.beforeEach(async ({ page, browser }) => {
+ await logIntoTestAccount(page, browser)
+ })
+
+ test('B shell commits under instant()', async ({ page }) => {
+ await page.goto(testUrl('/'))
+ const trigger = page.getByRole('link', { name: '', exact: true })
+ await expect(trigger).toBeVisible({ timeout: 20000 })
+
+ await instant(page, async () => {
+ await trigger.click()
+ // static shell asserted under the lock; no timeout
+ await expect(page.locator(SHELL_MARKER)).toBeVisible()
+ })
+ })
+})
+```
+
+The trigger selector follows the same rule as `SHELL_MARKER`: prefer a `data-testid` on the real
+` ` (`page.getByTestId('-link')`) over a guessed accessible name. `getByRole({ name })`
+is shown only for brevity; like the marker, the trigger must reliably resolve for the test user.
+
+## Initial load (hard navigation)
+
+Drive `page.goto()` inside `instant()` with the `baseURL` option. The served document is the
+route's prerendered static shell. `baseURL` is required because `page` is still `about:blank` when
+`instant()` runs (`resolveURL` falls back to `page.url()` only when no `baseURL` is passed).
+Establish the session WITHOUT navigating `page` (inject `storageState`, or log in on a separate
+context/page). A login helper that navigates `page` itself defeats the measurement for a different
+reason: that navigation completes before `instant()` acquires the lock, so it runs unmeasured. The
+session must be pre-established either way; otherwise an authenticated route redirects to login
+and the RED is false.
+
+If the project's only login helper navigates `page`, the agent must use a
+storageState/separate-context path here instead, a session-injection call that
+does NOT call `page.goto`:
+
+```ts
+test.describe('instant initial load: B', () => {
+ test.beforeEach(async ({ page }) => {
+ await injectTestUserSession(page) // storageState only; must NOT call page.goto
+ })
+
+ test('B shell is served', async ({ page }) => {
+ const url = testUrl('/')
+ await instant(
+ page,
+ async () => {
+ await page.goto(url)
+ await expect(page.locator(SHELL_MARKER)).toBeVisible()
+ },
+ { baseURL: new URL(url).origin }
+ )
+ })
+})
+```
+
+## Self-validating variant (recommended for routes with deferred content)
+
+Also assert that the deferred content is gated under the lock and streams after release. This
+makes a vacuous pass impossible: if the lock did not engage (testing API missing from the build),
+the content is already present and `toHaveCount(0)` fails (see `reference/red-test-robustness.md`).
+
+`SHELL_MARKER` is the shell node; `[data-testid="-content"]` is the deferred data it guards.
+
+```ts
+// soft navigation
+await instant(page, async () => {
+ await trigger.click()
+ await expect(page.locator(SHELL_MARKER)).toBeVisible() // shell present
+ await expect(page.getByTestId('-content')).toHaveCount(0) // deferred data gated
+})
+await expect(page.getByTestId('-content')).toBeVisible() // streams after release
+```
+
+The two **gated-half** assertions (shell visible, deferred content `toHaveCount(0)`) apply to the
+initial-load `page.goto()` form too. The cookie gates the deferred content identically for both:
+on a soft navigation the client lock gates dynamic-data writes; on an initial load the server
+honors the cookie on the document request (set via `addCookies()` before navigation, scoped by
+`baseURL`) and suspends dynamic data, independent of whether the route was previously rendered or
+cached. So the initial-load `toHaveCount(0)` gated half is as valid as the soft-nav one; it needs
+no fresh browser context and no cache-busting query param.
+
+The **post-release** assertion (`getByTestId('-content').toBeVisible()` after the `instant()`
+block) is soft-nav only. On an initial load the document was already emitted under the lock, so
+nothing streams in after release; drop that assertion from the initial-load test, or
+`page.reload()` first to fetch an unlocked document. The mechanism is in
+`reference/red-test-robustness.md`.
+
+## Baseline scaffold: do not ship
+
+Before optimizing, confirm the target exists with an unlocked check (no `instant()`). It
+disambiguates "not instant" from "marker absent for this user or environment". Run it as the test
+user; mismatch against the rig DRIFT list is what the C-gate catches
+(`reference/red-test-robustness.md`). Confirm the marker is real and reachable, then delete the
+scaffold before the PR.
+
+**The baseline must mirror the navigation type of the test you are shipping.** Drive a ` `
+click when guarding the soft-nav shell; drive `page.goto()` when guarding the initial-load shell.
+The two shells can differ (`reference/real-app-patterns.md`): a click-driven baseline run against a
+shipped `goto` test would confirm a marker that the `goto` path never shows, which produces exactly
+the false RED the C-gate exists to prevent.
+
+```ts
+// soft-nav baseline: mirror the soft-nav instant() test
+test('dev-only: navigating to renders its shell (no lock)', async ({
+ page,
+}) => {
+ await page.goto(testUrl('/'))
+ const trigger = page.getByRole('link', { name: '', exact: true })
+ await expect(trigger).toBeVisible({ timeout: 20000 })
+ await trigger.click()
+ await expect(page).toHaveURL(/\/(\?|$)/) // confirm the real destination (no redirect away)
+ await expect(page.locator(SHELL_MARKER)).toBeVisible({ timeout: 15000 })
+})
+```
+
+```ts
+// initial-load baseline: mirror the initial-load instant() test (session pre-established)
+test('dev-only: shell is served (no lock)', async ({ page }) => {
+ await page.goto(testUrl('/'))
+ await expect(page.locator(SHELL_MARKER)).toBeVisible({ timeout: 15000 })
+})
+```
+
+Notes:
+
+- Pick `SHELL_MARKER` as a sync element of the destination's static shell, never streamed data.
+ Use a `data-testid` on a known static node rather than a guessed role/name.
+- Do not put a custom timeout, a `painted` boolean, or `isVisible({ timeout })` in the shipped
+ assertion, and do not add retries or hover-warming; see `reference/red-test-robustness.md`.
diff --git a/.env.example b/.env.example
index e720428..20b26b8 100644
--- a/.env.example
+++ b/.env.example
@@ -2,4 +2,4 @@ PRODUCTS=
FIELDS=
STORE=
SECRET=
-COLOR="teal"
+USE_MOCKS=false
diff --git a/.eslintignore b/.eslintignore
deleted file mode 100644
index 30b7744..0000000
--- a/.eslintignore
+++ /dev/null
@@ -1,6 +0,0 @@
-node_modules/
-coverage/
-.idea/
-.next/
-.vscode/
-build/
diff --git a/.eslintrc.cjs b/.eslintrc.cjs
deleted file mode 100644
index 821065e..0000000
--- a/.eslintrc.cjs
+++ /dev/null
@@ -1,103 +0,0 @@
-const {resolve} = require("node:path");
-
-const project = resolve(__dirname, "tsconfig.json");
-
-module.exports = {
- root: true,
- plugins: ["prettier", "import"],
- extends: [
- require.resolve("@vercel/style-guide/eslint/typescript"),
- require.resolve("@vercel/style-guide/eslint/react"),
- require.resolve("@vercel/style-guide/eslint/next"),
- "plugin:prettier/recommended",
- ],
- parserOptions: {
- ecmaVersion: "latest",
- sourceType: "module",
- project,
- },
- settings: {
- "import/resolver": {
- typescript: {
- project,
- },
- },
- },
- rules: {
- "prettier/prettier": [
- "warn",
- {
- printWidth: 100,
- trailingComma: "all",
- tabWidth: 2,
- semi: true,
- singleQuote: false,
- bracketSpacing: false,
- arrowParens: "always",
- endOfLine: "auto",
- plugins: ["prettier-plugin-tailwindcss"],
- },
- ],
- "react/no-array-index-key": "off",
- "@typescript-eslint/no-shadow": "off",
- "import/order": [
- "warn",
- {
- groups: ["type", "builtin", "object", "external", "internal", "parent", "sibling", "index"],
- pathGroups: [
- {
- pattern: "~/**/types",
- group: "type",
- position: "before",
- },
- {
- pattern: "~/**",
- group: "external",
- position: "after",
- },
- ],
- "newlines-between": "always",
- },
- ],
- "padding-line-between-statements": [
- "warn",
- {blankLine: "always", prev: "*", next: ["return", "export"]},
- {blankLine: "always", prev: ["const", "let", "var"], next: "*"},
- {blankLine: "any", prev: ["const", "let", "var"], next: ["const", "let", "var"]},
- ],
- "no-console": "warn",
- "jsx-a11y/heading-has-content": "off",
- "jsx-a11y/no-static-element-interactions": "off",
- "jsx-a11y/click-events-have-key-events": "off",
- "react/prop-types": "off",
- "react/jsx-uses-react": "off",
- "react/react-in-jsx-scope": "off",
- "react/self-closing-comp": "warn",
- "react/jsx-sort-props": [
- "warn",
- {
- callbacksLast: true,
- shorthandFirst: true,
- noSortAlphabetically: false,
- reservedFirst: true,
- },
- ],
- "@next/next/no-img-element": "off",
- "@typescript-eslint/no-unsafe-return": "off",
- "@typescript-eslint/no-confusing-void-expression": "off",
- "@typescript-eslint/no-non-null-assertion": "off",
- "@typescript-eslint/no-unsafe-assignment": "off",
- "@typescript-eslint/explicit-function-return-type": "off",
- "@typescript-eslint/prefer-promise-reject-errors": "off",
- "@typescript-eslint/no-explicit-any": "off",
- "@typescript-eslint/no-unsafe-call": "off",
- "@typescript-eslint/no-unused-vars": [
- "warn",
- {
- args: "after-used",
- ignoreRestSiblings: false,
- argsIgnorePattern: "^_.*?$",
- },
- ],
- },
-};
diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml
index 7fc9df3..4954406 100644
--- a/.github/workflows/nodejs.yml
+++ b/.github/workflows/nodejs.yml
@@ -2,30 +2,27 @@ name: Node.js CI
on:
push:
- branches: [ main ]
+ branches: [main]
pull_request:
- branches: [ main ]
+ branches: [main]
jobs:
build:
-
runs-on: ubuntu-latest
-
- strategy:
- matrix:
- node-version: [14.x]
-
steps:
- - uses: actions/checkout@v2
- - name: Use Node.js ${{ matrix.node-version }}
- uses: actions/setup-node@v1
- with:
- node-version: ${{ matrix.node-version }}
-
- - run: npm install
- - run: npm test -- --ci
- - run: npm run dev & npx wait-on http://localhost:3000
- - run: npm run integration
-
- - name: Codecov
- uses: codecov/codecov-action@v1.3.2
+ - uses: actions/checkout@v4
+ - uses: pnpm/action-setup@v4
+ - uses: actions/setup-node@v4
+ with:
+ node-version: 24
+ cache: pnpm
+ - run: pnpm install --frozen-lockfile
+ - run: pnpm typecheck
+ - run: pnpm lint
+ - run: pnpm test -- --coverage
+ - run: pnpm exec playwright install --with-deps chromium
+ - run: pnpm integration
+ - name: Codecov
+ uses: codecov/codecov-action@v5
+ with:
+ files: ./coverage/lcov.info
diff --git a/.gitignore b/.gitignore
index c8015e4..445e5aa 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,6 +7,10 @@
# testing
/coverage
+/playwright-report/
+/test-results/
+/.next-e2e/
+*.tsbuildinfo
# next.js
/.next/
diff --git a/AGENTS.md b/AGENTS.md
new file mode 100644
index 0000000..643577d
--- /dev/null
+++ b/AGENTS.md
@@ -0,0 +1,9 @@
+
+
+# This is NOT the Next.js you know
+
+This version has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in `node_modules/next/dist/docs/` (resolved from this file's directory; in monorepos the `next` package may not be visible from the repo root) before writing any code. Heed deprecation notices.
+
+This block is written and re-added by `next dev` — verify at `node_modules/next/dist/server/lib/generate-agent-files.js`. Removing it from a diff only re-creates the uncommitted change; committing it with your work keeps the tree clean.
+
+
diff --git a/CLAUDE.md b/CLAUDE.md
new file mode 100644
index 0000000..43c994c
--- /dev/null
+++ b/CLAUDE.md
@@ -0,0 +1 @@
+@AGENTS.md
diff --git a/README.md b/README.md
index 40c7e30..ab14175 100644
--- a/README.md
+++ b/README.md
@@ -5,6 +5,43 @@
# Commercency
Ecommerce, simple.
+## Desarrollo
+
+Requiere Node.js 24 o superior y pnpm 12. Ejecutá `pnpm install` y `pnpm dev`.
+`pnpm typecheck` genera los tipos de Next.js y ejecuta TypeScript 7. El alias
+`typescript` conserva la API de TypeScript 6 para las herramientas que la necesitan.
+
+Para usar datos de ejemplo, configurá `USE_MOCKS=true` en `.env.local`. Los métodos
+habituales de las APIs cargan los archivos `mocks/default.json` de productos,
+tienda y campos del carrito, sin necesitar las URLs de las planillas. Si la variable
+no está definida o vale `false`, usan `PRODUCTS`, `STORE` y `FIELDS`.
+Reiniciá `pnpm dev` al cambiarla; en producción, volvé a ejecutar `pnpm build`
+con el valor deseado para regenerar los datos prerenderizados.
+
+## Validación
+
+- `pnpm test`: Vitest y React Testing Library. Cobertura con `pnpm test -- --coverage`.
+- `pnpm integration`: Playwright en escritorio y móvil. Los flujos de tienda usan
+ el build de producción; las pruebas con `instant()` usan `next dev`.
+ Instalar Chromium una vez con `pnpm exec playwright install chromium`.
+ Usa `USE_MOCKS=true` para cargar los mismos JSON de ejemplo de la aplicación,
+ sin configurar planillas ni levantar un servidor de fixtures.
+ La suite usa datos estáticos: no cubre cambios de precio ni productos agregados
+ después del build.
+- `pnpm lint` y `pnpm typecheck`.
+
+## Caché
+
+Cache Components está habilitado. Productos, tienda y campos usan `use cache`,
+`cacheLife("max")` y etiquetas. `/refresh?secret=...` invalida las etiquetas
+con revalidación en segundo plano. El catálogo y los productos conocidos se
+prerenderizan; los productos inexistentes muestran 404.
+Para productos agregados después de compilar, el catálogo se muestra antes de que
+termine de cargar el detalle del producto.
+
+La configuración y los comandos de las pruebas de navegación están en
+[instant-nav.rig.md](./instant-nav.rig.md).
+
## Como la uso?
1. Crea una copia de [esta planilla de calculo](https://docs.google.com/spreadsheets/d/1Q_mDN1w88zE1vDasru-f3D6kxZAynUC1s253yLmjE7M/edit?usp=sharing).
2. Una vez copiada, toca en `Archivo > Publicar en la web`, selecciona `Valores separados por comas (.csv)` del desplegable y clickea en `publicar`.
@@ -12,6 +49,15 @@ Ecommerce, simple.
4. Llena [este archivo](./.env.example) y completa los datos de tu tienda y renombralo a `.env.local`.
5. Publica el sitio en [algun hosting que soporte NextJS](https://vercel.com)
+## Estilos
+
+El proyecto usa Tailwind CSS 4 con `@tailwindcss/postcss`. Los colores, fuentes,
+radios, animaciones y el contenedor se configuran en `src/app/globals.css`.
+La paleta `brand` usa los tonos `teal` de Tailwind. Para cambiarla, editá las
+variables `--color-brand-*` en ese CSS; la variable de entorno `COLOR` ya no se usa.
+Las animaciones de los diálogos usan `tw-animate-css`.
+Los componentes de shadcn usan Base UI, con el estilo `base-nova` y `cn` para combinar clases.
+
# TODO
* Revisar si deberia traer los fields como un Record o como un array.
* Revisar si CartDrawer deberia ser un solo componente o dividirlo mas
diff --git a/REVIEW.md b/REVIEW.md
new file mode 100644
index 0000000..751e73b
--- /dev/null
+++ b/REVIEW.md
@@ -0,0 +1,4 @@
+- CartDrawer usa buttonVariants y no me gusta
+- CartItemDrawer tiene muchas cosas inline y pareceria ser controlled cuando antes era uncontrolled
+- StoreScreen perdió el modal y hay cosas inline y las cosas del modal se fueron a ProductSelection
+- El server de mocks no me gusta, se solucionaria con lo de arriba, lo mismo lo de playwright config
diff --git a/components.json b/components.json
index 8c574b7..3d9be2f 100644
--- a/components.json
+++ b/components.json
@@ -1,10 +1,10 @@
{
"$schema": "https://ui.shadcn.com/schema.json",
- "style": "default",
+ "style": "base-nova",
"rsc": true,
"tsx": true,
"tailwind": {
- "config": "tailwind.config.ts",
+ "config": "",
"css": "src/app/globals.css",
"baseColor": "slate",
"cssVariables": true,
@@ -12,6 +12,10 @@
},
"aliases": {
"components": "@/components",
- "utils": "@/lib/utils"
- }
-}
\ No newline at end of file
+ "utils": "@/lib/utils",
+ "ui": "@/components/ui",
+ "lib": "@/lib",
+ "hooks": "@/hooks"
+ },
+ "iconLibrary": "lucide"
+}
diff --git a/cypress.json b/cypress.json
deleted file mode 100644
index ba9bc7b..0000000
--- a/cypress.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "baseUrl": "http://localhost:3000",
- "video": false
-}
diff --git a/cypress/integration/products.spec.ts b/cypress/integration/products.spec.ts
deleted file mode 100644
index 6578166..0000000
--- a/cypress/integration/products.spec.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-import mock from "../../product/mocks/default.json";
-
-describe("Products", () => {
- it("deberia mostrar todos los productos", () => {
- cy.visit("/default");
-
- cy.get('[data-testid="product"]').should(
- "have.length",
- mock.filter((item) => item.type === "product").length,
- );
- });
-
- it("muestra un mensaje cuando no hay productos", () => {
- cy.visit("/empty");
-
- cy.get('[data-testid="product"]').should("have.length", 0);
-
- cy.contains("No hay productos");
- });
-
- it("muestra el drawer del carrito y lo cierra correctamente, asegurandose de que el link es valido", () => {
- cy.visit("/default");
-
- cy.get('[data-testid="cart"]').should("not.exist");
- cy.get('[data-testid="product"] button').first().click();
- cy.get('[data-testid="show-cart"]').click();
- cy.get('[data-testid="cart"]').should("be.visible");
- cy.get('[data-testid="complete-order"]').should("have.attr", "href").and("contain", "wa.me");
- cy.get('[aria-label="Close"]').click();
- cy.get('[data-testid="cart"]').should("not.exist");
- });
-});
diff --git a/cypress/plugins/index.js b/cypress/plugins/index.js
deleted file mode 100644
index 59b2bab..0000000
--- a/cypress/plugins/index.js
+++ /dev/null
@@ -1,22 +0,0 @@
-///
-// ***********************************************************
-// This example plugins/index.js can be used to load plugins
-//
-// You can change the location of this file or turn off loading
-// the plugins file with the 'pluginsFile' configuration option.
-//
-// You can read more here:
-// https://on.cypress.io/plugins-guide
-// ***********************************************************
-
-// This function is called when a project is opened or re-opened (e.g. due to
-// the project's config changing)
-
-/**
- * @type {Cypress.PluginConfig}
- */
-// eslint-disable-next-line no-unused-vars
-module.exports = (on, config) => {
- // `on` is used to hook into various events Cypress emits
- // `config` is the resolved Cypress config
-}
diff --git a/cypress/support/commands.js b/cypress/support/commands.js
deleted file mode 100644
index 119ab03..0000000
--- a/cypress/support/commands.js
+++ /dev/null
@@ -1,25 +0,0 @@
-// ***********************************************
-// This example commands.js shows you how to
-// create various custom commands and overwrite
-// existing commands.
-//
-// For more comprehensive examples of custom
-// commands please read more here:
-// https://on.cypress.io/custom-commands
-// ***********************************************
-//
-//
-// -- This is a parent command --
-// Cypress.Commands.add('login', (email, password) => { ... })
-//
-//
-// -- This is a child command --
-// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
-//
-//
-// -- This is a dual command --
-// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
-//
-//
-// -- This will overwrite an existing command --
-// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
diff --git a/cypress/support/index.js b/cypress/support/index.js
deleted file mode 100644
index d68db96..0000000
--- a/cypress/support/index.js
+++ /dev/null
@@ -1,20 +0,0 @@
-// ***********************************************************
-// This example support/index.js is processed and
-// loaded automatically before your test files.
-//
-// This is a great place to put global configuration and
-// behavior that modifies Cypress.
-//
-// You can change the location of this file or turn off
-// automatically serving support files with the
-// 'supportFile' configuration option.
-//
-// You can read more here:
-// https://on.cypress.io/configuration
-// ***********************************************************
-
-// Import commands.js using ES2015 syntax:
-import './commands'
-
-// Alternatively you can use CommonJS syntax:
-// require('./commands')
diff --git a/cypress/tsconfig.json b/cypress/tsconfig.json
deleted file mode 100644
index fdfa0de..0000000
--- a/cypress/tsconfig.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
- "compilerOptions": {
- "target": "es5",
- "lib": [
- "dom",
- "dom.iterable",
- "esnext"
- ],
- "allowJs": true,
- "skipLibCheck": true,
- "strict": false,
- "forceConsistentCasingInFileNames": true,
- "noEmit": true,
- "esModuleInterop": true,
- "module": "esnext",
- "moduleResolution": "node",
- "resolveJsonModule": true,
- "isolatedModules": false,
- "jsx": "preserve",
- "types": ["cypress"]
- },
- "include": [
- "./"
- ],
-}
diff --git a/eslint.config.mjs b/eslint.config.mjs
new file mode 100644
index 0000000..9462302
--- /dev/null
+++ b/eslint.config.mjs
@@ -0,0 +1,200 @@
+import js from "@eslint/js";
+import next from "@next/eslint-plugin-next";
+import stylistic from "@stylistic/eslint-plugin";
+import {defineConfig, globalIgnores} from "eslint/config";
+import importPlugin from "eslint-plugin-import";
+import jsxA11y from "eslint-plugin-jsx-a11y";
+import prettier from "eslint-plugin-prettier/recommended";
+import react from "eslint-plugin-react";
+import reactHooks from "eslint-plugin-react-hooks";
+import globals from "globals";
+import tseslint from "typescript-eslint";
+
+export default defineConfig([
+ globalIgnores([
+ "**/coverage/**",
+ "**/.idea/**",
+ "**/.next/**",
+ "**/.next-e2e/**",
+ "playwright-report/**",
+ "test-results/**",
+ "**/.vscode/**",
+ "**/build/**",
+ "out/**",
+ "scripts/**",
+ ".agents/**",
+ ".claude/**",
+ "next-env.d.ts",
+ ]),
+ {
+ files: ["**/*.{js,cjs,mjs,ts,mts,tsx}"],
+ extends: [js.configs.recommended],
+ linterOptions: {
+ reportUnusedDisableDirectives: "error",
+ },
+ plugins: importPlugin.flatConfigs.typescript.plugins,
+ settings: {
+ "import/resolver": {
+ typescript: {
+ project: `${import.meta.dirname}/tsconfig.json`,
+ },
+ },
+ },
+ rules: {
+ "no-console": "warn",
+ "import/order": [
+ "warn",
+ {
+ groups: [
+ "type",
+ "builtin",
+ "object",
+ "external",
+ "internal",
+ "parent",
+ "sibling",
+ "index",
+ ],
+ pathGroups: [
+ {pattern: "~/**/types", group: "type", position: "before"},
+ {pattern: "~/**", group: "external", position: "after"},
+ ],
+ "newlines-between": "always",
+ },
+ ],
+ },
+ },
+ {
+ files: ["*.{js,cjs,mjs,ts,mts}", "tests/**/*.{ts,mjs}"],
+ languageOptions: {
+ globals: globals.node,
+ },
+ },
+ {
+ files: ["*.config.js"],
+ languageOptions: {
+ sourceType: "commonjs",
+ },
+ },
+ {
+ files: ["**/*.{ts,mts,tsx}"],
+ extends: [
+ tseslint.configs.strictTypeChecked,
+ tseslint.configs.stylisticTypeChecked,
+ importPlugin.flatConfigs.typescript,
+ ],
+ languageOptions: {
+ parserOptions: {
+ projectService: true,
+ tsconfigRootDir: import.meta.dirname,
+ },
+ },
+ rules: {
+ // Preserve the project's type-safety exceptions and style-guide customizations.
+ "@typescript-eslint/no-unsafe-return": "off",
+ "@typescript-eslint/no-confusing-void-expression": "off",
+ "@typescript-eslint/no-non-null-assertion": "off",
+ "@typescript-eslint/no-unsafe-assignment": "off",
+ "@typescript-eslint/prefer-promise-reject-errors": "off",
+ "@typescript-eslint/no-explicit-any": "off",
+ "@typescript-eslint/no-unsafe-call": "off",
+ "@typescript-eslint/prefer-nullish-coalescing": "off",
+ "@typescript-eslint/no-unused-vars": ["warn", {argsIgnorePattern: "^_"}],
+ "@typescript-eslint/consistent-type-exports": [
+ "warn",
+ {fixMixedExportsWithInlineTypeSpecifier: true},
+ ],
+ "@typescript-eslint/consistent-type-imports": "warn",
+ "@typescript-eslint/method-signature-style": "warn",
+ "@typescript-eslint/naming-convention": [
+ "error",
+ {format: ["PascalCase"], selector: ["typeLike", "enumMember"]},
+ {
+ custom: {match: false, regex: "^I[A-Z]|^(Interface|Props|State)$"},
+ format: ["PascalCase"],
+ selector: "interface",
+ },
+ ],
+ "@typescript-eslint/no-redundant-type-constituents": "warn",
+ "@typescript-eslint/no-unnecessary-qualifier": "warn",
+ "@typescript-eslint/prefer-regexp-exec": "warn",
+ "@typescript-eslint/require-array-sort-compare": ["error", {ignoreStringArrays: true}],
+ "@typescript-eslint/switch-exhaustiveness-check": "error",
+ "@typescript-eslint/default-param-last": "error",
+ "no-loop-func": "error",
+ },
+ },
+ {
+ files: ["src/**/*.{ts,tsx}"],
+ extends: [
+ react.configs.flat.recommended,
+ react.configs.flat["jsx-runtime"],
+ reactHooks.configs.flat.recommended,
+ jsxA11y.flatConfigs.recommended,
+ next.configs.recommended,
+ ],
+ languageOptions: {
+ globals: {...globals.browser, ...globals.node},
+ },
+ settings: {
+ react: {version: "detect"},
+ },
+ rules: {
+ "react/prop-types": "off",
+ "react/button-has-type": "warn",
+ "react/function-component-definition": "warn",
+ "react/hook-use-state": "warn",
+ "react/jsx-boolean-value": "warn",
+ "react/jsx-curly-brace-presence": "warn",
+ "react/jsx-fragments": "warn",
+ "react/jsx-no-leaked-render": ["warn", {validStrategies: ["coerce"]}],
+ "react/jsx-no-target-blank": ["error", {allowReferrer: true}],
+ "react/jsx-no-useless-fragment": ["warn", {allowExpressions: true}],
+ "react/jsx-pascal-case": "warn",
+ "react/no-unstable-nested-components": "error",
+ "react/self-closing-comp": "warn",
+ "react/jsx-sort-props": [
+ "warn",
+ {
+ callbacksLast: true,
+ shorthandFirst: true,
+ reservedFirst: true,
+ },
+ ],
+ // Product images use external URLs supplied by the store's spreadsheet.
+ "@next/next/no-img-element": "off",
+ },
+ },
+ {
+ files: ["src/components/ui/alert.tsx"],
+ rules: {
+ // AlertTitle forwards its children through a props spread to the heading.
+ "jsx-a11y/heading-has-content": "off",
+ },
+ },
+ // Prettier owns formatting; keep the intentional blank-line policy below it.
+ {
+ extends: [prettier],
+ plugins: {
+ "@stylistic": stylistic,
+ },
+ rules: {
+ "prettier/prettier": [
+ "warn",
+ {
+ printWidth: 100,
+ bracketSpacing: false,
+ endOfLine: "auto",
+ plugins: ["prettier-plugin-tailwindcss"],
+ tailwindStylesheet: "./src/app/globals.css",
+ },
+ ],
+ "@stylistic/padding-line-between-statements": [
+ "warn",
+ {blankLine: "always", prev: "*", next: ["return", "export"]},
+ {blankLine: "always", prev: ["const", "let", "var"], next: "*"},
+ {blankLine: "any", prev: ["const", "let", "var"], next: ["const", "let", "var"]},
+ ],
+ },
+ },
+]);
diff --git a/jest.config.js b/jest.config.js
deleted file mode 100644
index 49c3661..0000000
--- a/jest.config.js
+++ /dev/null
@@ -1,11 +0,0 @@
-module.exports = {
- preset: "ts-jest",
- testPathIgnorePatterns: ["/cypress/", "/.next/", "/node_modules/"],
- setupFilesAfterEnv: ["@testing-library/jest-dom"],
- collectCoverage: true,
- globals: {
- "ts-jest": {
- tsconfig: "./jest/tsconfig.json",
- },
- },
-};
diff --git a/jest/tsconfig.json b/jest/tsconfig.json
deleted file mode 100644
index b6256cb..0000000
--- a/jest/tsconfig.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "extends": "../tsconfig.json",
- "compilerOptions": {
- "jsx": "react"
- }
-}
diff --git a/next-env.d.ts b/next-env.d.ts
index 1b3be08..a419cbe 100644
--- a/next-env.d.ts
+++ b/next-env.d.ts
@@ -1,5 +1,7 @@
///
///
+import "./.next/dev/types/routes.d.ts";
+import "./.next/dev/types/root-params.d.ts";
// NOTE: This file should not be edited
// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
diff --git a/next.config.js b/next.config.js
deleted file mode 100644
index e7f711a..0000000
--- a/next.config.js
+++ /dev/null
@@ -1,10 +0,0 @@
-/** @type {import('next').NextConfig} */
-module.exports = {
- reactStrictMode: true,
- experimental: {
- staleTimes: {
- static: 900,
- dynamic: 0,
- },
- },
-};
diff --git a/next.config.ts b/next.config.ts
new file mode 100644
index 0000000..919bd11
--- /dev/null
+++ b/next.config.ts
@@ -0,0 +1,8 @@
+import type {NextConfig} from "next";
+
+const nextConfig: NextConfig = {
+ reactStrictMode: true,
+ cacheComponents: true,
+};
+
+export default nextConfig;
diff --git a/package.json b/package.json
index b6ab117..8b89df0 100644
--- a/package.json
+++ b/package.json
@@ -2,62 +2,64 @@
"name": "store",
"version": "0.1.0",
"private": true,
+ "engines": {
+ "node": ">=24.0.0"
+ },
"scripts": {
- "dev": "next dev --turbopack",
+ "dev": "next dev",
"build": "next build",
"start": "next start",
- "test": "jest",
- "integration": "cypress run"
+ "lint": "eslint .",
+ "typecheck": "next typegen && tsc --noEmit",
+ "test": "vitest run",
+ "integration": "playwright test"
},
"dependencies": {
- "@radix-ui/react-dialog": "^1.1.14",
- "@radix-ui/react-label": "^2.1.7",
- "@radix-ui/react-radio-group": "^1.3.7",
- "@radix-ui/react-slot": "^1.2.3",
- "@radix-ui/react-toggle": "^1.1.9",
+ "@base-ui/react": "^1.8.0",
"class-variance-authority": "^0.7.1",
- "clsx": "^2.1.1",
- "lucide-react": "^0.511.0",
- "next": "15.4.0-canary.62",
+ "cn": "^0.2.6",
+ "lucide-react": "1.43.0",
+ "next": "16.3.4",
"next-themes": "^0.4.6",
- "papaparse": "^5.4.1",
- "react": "19.0.0-rc-d1afcb43-20240903",
- "react-dom": "19.0.0-rc-d1afcb43-20240903",
- "tailwind-merge": "^2.6.0",
- "tailwindcss-animate": "^1.0.7"
+ "papaparse": "^5.7.0",
+ "react": "^19.3.0",
+ "react-dom": "^19.3.0"
},
"devDependencies": {
- "@next/eslint-plugin-next": "15.3.3",
- "@testing-library/jest-dom": "^6.4.2",
- "@testing-library/react": "^14.2.1",
- "@types/jest": "^29.5.12",
- "@types/node": "^22.15.29",
- "@types/papaparse": "^5.3.16",
- "@types/react": "^18.3.23",
- "@types/react-dom": "^18.3.7",
- "@typescript-eslint/eslint-plugin": "^7.18.0",
- "@typescript-eslint/parser": "^7.18.0",
- "@vercel/style-guide": "^6.0.0",
- "autoprefixer": "^10.4.17",
- "cypress": "^13.6.4",
- "eslint": "^8.56.0",
- "eslint-config-prettier": "^9.1.0",
- "eslint-plugin-cypress": "^2.15.1",
- "eslint-plugin-import": "^2.29.1",
+ "@eslint/js": "^9.39.5",
+ "@next/eslint-plugin-next": "16.3.4",
+ "@next/playwright": "16.3.4",
+ "@playwright/test": "^1.63.0",
+ "@stylistic/eslint-plugin": "^5.10.0",
+ "@tailwindcss/postcss": "^4.3.3",
+ "@testing-library/jest-dom": "^7.0.1",
+ "@testing-library/react": "^16.3.3",
+ "@testing-library/user-event": "^14.6.7",
+ "@types/node": "^24.13.4",
+ "@types/papaparse": "^5.5.2",
+ "@types/react": "^19.3.0",
+ "@types/react-dom": "^19.3.0",
+ "@typescript/native": "npm:typescript@^7.0.2",
+ "@vitejs/plugin-react": "^6.1.1",
+ "@vitest/coverage-v8": "^5.0.0",
+ "eslint": "^9.39.5",
+ "eslint-config-prettier": "^10.1.8",
+ "eslint-import-resolver-typescript": "^4.4.5",
+ "eslint-plugin-import": "^2.32.0",
"eslint-plugin-jsx-a11y": "^6.10.2",
- "eslint-plugin-prettier": "^5.1.3",
- "eslint-plugin-react": "^7.33.2",
- "eslint-plugin-react-hooks": "^4.6.0",
- "eslint-plugin-tailwindcss": "^3.14.2",
- "eslint-plugin-tsdoc": "^0.4.0",
- "jest": "^29.7.0",
- "postcss": "^8.4.35",
- "prettier": "^3.2.5",
- "prettier-plugin-tailwindcss": "^0.5.11",
- "tailwindcss": "^3.4.1",
- "ts-jest": "^29.1.2",
- "ts-standard": "^12.0.2",
- "typescript": "^5.3.3",
- "wait-on": "^7.2.0"
- }
+ "eslint-plugin-prettier": "^5.5.6",
+ "eslint-plugin-react": "^7.37.5",
+ "eslint-plugin-react-hooks": "^7.1.1",
+ "globals": "^17.12.0",
+ "jsdom": "^30.0.1",
+ "postcss": "^8.5.28",
+ "prettier": "^3.9.6",
+ "prettier-plugin-tailwindcss": "^0.8.1",
+ "tailwindcss": "^4.3.3",
+ "typescript": "npm:@typescript/typescript6@^6.0.2",
+ "typescript-eslint": "^8.70.0",
+ "vite": "^8.2.2",
+ "vitest": "^5.0.0"
+ },
+ "packageManager": "pnpm@12.0.0"
}
diff --git a/playwright.config.ts b/playwright.config.ts
new file mode 100644
index 0000000..7f1d859
--- /dev/null
+++ b/playwright.config.ts
@@ -0,0 +1,44 @@
+import {defineConfig, devices} from "@playwright/test";
+
+const testEnv = {
+ USE_MOCKS: "true",
+ SECRET: "local-test-secret",
+};
+
+export default defineConfig({
+ testDir: "./tests/e2e",
+ fullyParallel: false,
+ workers: 1,
+ retries: 0,
+ use: {baseURL: "http://127.0.0.1:4318", trace: "retain-on-failure"},
+ projects: [
+ {name: "desktop", testMatch: "store.test.ts", use: {...devices["Desktop Chrome"]}},
+ {name: "mobile", testMatch: "store.test.ts", use: {...devices["Pixel 7"]}},
+ {
+ name: "instant-desktop",
+ testMatch: "instant.test.ts",
+ use: {...devices["Desktop Chrome"], baseURL: "http://127.0.0.1:4320"},
+ },
+ {
+ name: "instant-mobile",
+ testMatch: "instant.test.ts",
+ use: {...devices["Pixel 7"], baseURL: "http://127.0.0.1:4320"},
+ },
+ ],
+ webServer: [
+ {
+ command: "pnpm build && pnpm start --port 4318",
+ url: "http://127.0.0.1:4318",
+ timeout: 180_000,
+ reuseExistingServer: false,
+ env: testEnv,
+ },
+ {
+ command: "pnpm dev --hostname 127.0.0.1 --port 4320",
+ url: "http://127.0.0.1:4320",
+ timeout: 180_000,
+ reuseExistingServer: false,
+ env: testEnv,
+ },
+ ],
+});
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index f6d39e2..10bbe98 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -1,3 +1,104 @@
+---
+lockfileVersion: '9.0'
+
+importers:
+
+ .:
+ configDependencies: {}
+ packageManagerDependencies:
+ pnpm:
+ specifier: 12.0.0
+ version: 12.0.0
+
+packages:
+
+ '@pnpm/exe.darwin-arm64@12.0.0':
+ resolution: {integrity: sha512-sqeoPfVMIfQhbwzDrKraXY2ynyuWClFqzvfImzAS/yczEru1m5SGvQ9kgFPDvQzJZ9AetedgJeDZC6qYvH8/tQ==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@pnpm/exe.darwin-x64@12.0.0':
+ resolution: {integrity: sha512-Quc3J6c9cGTy+LDgz1cLVgCNOU9IERuyAlDoEj0DCilKqvo50Jx1GV8k74iwn4J9fFSKkm8JrwNvtTDj3uWnUA==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@pnpm/exe.linux-arm64-musl@12.0.0':
+ resolution: {integrity: sha512-EVWd3OTmgsMFhXx69b5JxIzoabG9Ma7m4OeTaf0ZKBzMnfYi8u21NDQo92ToMrdYL5dYDDCHsyYIjXzk+d0HhA==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
+ '@pnpm/exe.linux-arm64@12.0.0':
+ resolution: {integrity: sha512-cXHHW8M4rAPsYNkKZO9WVcpLLK55i9EaIsZPfIqUuY2eopd5LqnFyBge54HCh1GC0yCX8ySn0hYIi+4OyAEoDg==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
+ '@pnpm/exe.linux-x64-musl@12.0.0':
+ resolution: {integrity: sha512-UcXwMdFjly0mpddkGigHKTxe27IMv2fUK4IWW/MHmJ3yMguxXmkwNlEI4aE+G1HO2TLo20uNEUWD4ymLe/DaCQ==}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
+ '@pnpm/exe.linux-x64@12.0.0':
+ resolution: {integrity: sha512-6Rsl+zEWMOmus7v7/9J3OE8EMvHyNAfxYmDfmhQG4J0985OuT3G3Ho9NSGHjkBn4aU4bgklWifRhe1HX8dUSyw==}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
+ '@pnpm/exe.win32-arm64@12.0.0':
+ resolution: {integrity: sha512-O5F76A4oVFrpDGdFxEszRIThOSBfjHdH5c006gR+7UTCfiXrukr1XfqPungUI1DXcSR5gb9jBsPQqQZOAoOOxw==}
+ cpu: [arm64]
+ os: [win32]
+
+ '@pnpm/exe.win32-x64@12.0.0':
+ resolution: {integrity: sha512-5dKFajIEWJ1ai+KHXFJvskY6vchbunmLwSUV2ywbLymcmJjfY5XJVpgzPCyIoVCMVG0zHorr66+hM8h8b3aRfQ==}
+ cpu: [x64]
+ os: [win32]
+
+ pnpm@12.0.0:
+ resolution: {integrity: sha512-ni49w5EZlYaNyUuBdcIXwn6VQI+gO0oidJd48rNPdzt3zdOznt6BcbIvzVO+ajU0Lp+smUimjvWN9kiM6Jp+Zw==}
+ engines: {node: '>=18.*'}
+ hasBin: true
+
+snapshots:
+
+ '@pnpm/exe.darwin-arm64@12.0.0':
+ optional: true
+
+ '@pnpm/exe.darwin-x64@12.0.0':
+ optional: true
+
+ '@pnpm/exe.linux-arm64-musl@12.0.0':
+ optional: true
+
+ '@pnpm/exe.linux-arm64@12.0.0':
+ optional: true
+
+ '@pnpm/exe.linux-x64-musl@12.0.0':
+ optional: true
+
+ '@pnpm/exe.linux-x64@12.0.0':
+ optional: true
+
+ '@pnpm/exe.win32-arm64@12.0.0':
+ optional: true
+
+ '@pnpm/exe.win32-x64@12.0.0':
+ optional: true
+
+ pnpm@12.0.0:
+ optionalDependencies:
+ '@pnpm/exe.darwin-arm64': 12.0.0
+ '@pnpm/exe.darwin-x64': 12.0.0
+ '@pnpm/exe.linux-arm64': 12.0.0
+ '@pnpm/exe.linux-arm64-musl': 12.0.0
+ '@pnpm/exe.linux-x64': 12.0.0
+ '@pnpm/exe.linux-x64-musl': 12.0.0
+ '@pnpm/exe.win32-arm64': 12.0.0
+ '@pnpm/exe.win32-x64': 12.0.0
+
+---
lockfileVersion: '9.0'
settings:
@@ -8,767 +109,647 @@ importers:
.:
dependencies:
- '@radix-ui/react-dialog':
- specifier: ^1.1.14
- version: 1.1.14(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.0.0-rc-d1afcb43-20240903(react@19.0.0-rc-d1afcb43-20240903))(react@19.0.0-rc-d1afcb43-20240903)
- '@radix-ui/react-label':
- specifier: ^2.1.7
- version: 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.0.0-rc-d1afcb43-20240903(react@19.0.0-rc-d1afcb43-20240903))(react@19.0.0-rc-d1afcb43-20240903)
- '@radix-ui/react-radio-group':
- specifier: ^1.3.7
- version: 1.3.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.0.0-rc-d1afcb43-20240903(react@19.0.0-rc-d1afcb43-20240903))(react@19.0.0-rc-d1afcb43-20240903)
- '@radix-ui/react-slot':
- specifier: ^1.2.3
- version: 1.2.3(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)
- '@radix-ui/react-toggle':
- specifier: ^1.1.9
- version: 1.1.9(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.0.0-rc-d1afcb43-20240903(react@19.0.0-rc-d1afcb43-20240903))(react@19.0.0-rc-d1afcb43-20240903)
+ '@base-ui/react':
+ specifier: ^1.8.0
+ version: 1.8.0(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
class-variance-authority:
specifier: ^0.7.1
version: 0.7.1
- clsx:
- specifier: ^2.1.1
- version: 2.1.1
+ cn:
+ specifier: ^0.2.6
+ version: 0.2.6
lucide-react:
- specifier: ^0.511.0
- version: 0.511.0(react@19.0.0-rc-d1afcb43-20240903)
+ specifier: 1.43.0
+ version: 1.43.0(react@19.3.0)
next:
- specifier: 15.4.0-canary.62
- version: 15.4.0-canary.62(@babel/core@7.20.12)(react-dom@19.0.0-rc-d1afcb43-20240903(react@19.0.0-rc-d1afcb43-20240903))(react@19.0.0-rc-d1afcb43-20240903)
+ specifier: 16.3.4
+ version: 16.3.4(@babel/core@7.29.7(supports-color@7.2.0))(@playwright/test@1.63.0)(@types/node@24.13.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
next-themes:
specifier: ^0.4.6
- version: 0.4.6(react-dom@19.0.0-rc-d1afcb43-20240903(react@19.0.0-rc-d1afcb43-20240903))(react@19.0.0-rc-d1afcb43-20240903)
+ version: 0.4.6(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
papaparse:
- specifier: ^5.4.1
- version: 5.4.1
+ specifier: ^5.7.0
+ version: 5.7.0
react:
- specifier: 19.0.0-rc-d1afcb43-20240903
- version: 19.0.0-rc-d1afcb43-20240903
+ specifier: ^19.3.0
+ version: 19.3.0
react-dom:
- specifier: 19.0.0-rc-d1afcb43-20240903
- version: 19.0.0-rc-d1afcb43-20240903(react@19.0.0-rc-d1afcb43-20240903)
- tailwind-merge:
- specifier: ^2.6.0
- version: 2.6.0
- tailwindcss-animate:
- specifier: ^1.0.7
- version: 1.0.7(tailwindcss@3.4.1)
+ specifier: ^19.3.0
+ version: 19.3.0(react@19.3.0)
devDependencies:
+ '@eslint/js':
+ specifier: ^9.39.5
+ version: 9.39.5
'@next/eslint-plugin-next':
- specifier: 15.3.3
- version: 15.3.3
+ specifier: 16.3.4
+ version: 16.3.4(eslint@9.39.5(jiti@2.7.0)(supports-color@7.2.0))
+ '@next/playwright':
+ specifier: 16.3.4
+ version: 16.3.4(@playwright/test@1.63.0)
+ '@playwright/test':
+ specifier: ^1.63.0
+ version: 1.63.0
+ '@stylistic/eslint-plugin':
+ specifier: ^5.10.0
+ version: 5.10.0(eslint@9.39.5(jiti@2.7.0)(supports-color@7.2.0))
+ '@tailwindcss/postcss':
+ specifier: ^4.3.3
+ version: 4.3.3
'@testing-library/jest-dom':
- specifier: ^6.4.2
- version: 6.4.2(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@22.15.29))
+ specifier: ^7.0.1
+ version: 7.0.1(@testing-library/dom@10.4.1)(vitest@5.0.0)
'@testing-library/react':
- specifier: ^14.2.1
- version: 14.2.1(@types/react@18.3.23)(react-dom@19.0.0-rc-d1afcb43-20240903(react@19.0.0-rc-d1afcb43-20240903))(react@19.0.0-rc-d1afcb43-20240903)
- '@types/jest':
- specifier: ^29.5.12
- version: 29.5.12
+ specifier: ^16.3.3
+ version: 16.3.3(@testing-library/dom@10.4.1)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
+ '@testing-library/user-event':
+ specifier: ^14.6.7
+ version: 14.6.7(@testing-library/dom@10.4.1)
'@types/node':
- specifier: ^22.15.29
- version: 22.15.29
+ specifier: ^24.13.4
+ version: 24.13.4
'@types/papaparse':
- specifier: ^5.3.16
- version: 5.3.16
+ specifier: ^5.5.2
+ version: 5.5.2
'@types/react':
- specifier: ^18.3.23
- version: 18.3.23
+ specifier: ^19.3.0
+ version: 19.3.0
'@types/react-dom':
- specifier: ^18.3.7
- version: 18.3.7(@types/react@18.3.23)
- '@typescript-eslint/eslint-plugin':
- specifier: ^7.18.0
- version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0)(typescript@5.3.3)
- '@typescript-eslint/parser':
- specifier: ^7.18.0
- version: 7.18.0(eslint@8.56.0)(typescript@5.3.3)
- '@vercel/style-guide':
- specifier: ^6.0.0
- version: 6.0.0(@next/eslint-plugin-next@15.3.3)(eslint@8.56.0)(jest@29.7.0(@types/node@22.15.29))(prettier@3.2.5)(typescript@5.3.3)
- autoprefixer:
- specifier: ^10.4.17
- version: 10.4.17(postcss@8.4.35)
- cypress:
- specifier: ^13.6.4
- version: 13.6.4
+ specifier: ^19.3.0
+ version: 19.3.0(@types/react@19.3.0)
+ '@typescript/native':
+ specifier: npm:typescript@^7.0.2
+ version: typescript@7.0.2
+ '@vitejs/plugin-react':
+ specifier: ^6.1.1
+ version: 6.1.1(vite@8.3.0(@types/node@24.13.4)(jiti@2.7.0))
+ '@vitest/coverage-v8':
+ specifier: ^5.0.0
+ version: 5.0.0(vitest@5.0.0)
eslint:
- specifier: ^8.56.0
- version: 8.56.0
+ specifier: ^9.39.5
+ version: 9.39.5(jiti@2.7.0)(supports-color@7.2.0)
eslint-config-prettier:
- specifier: ^9.1.0
- version: 9.1.0(eslint@8.56.0)
- eslint-plugin-cypress:
- specifier: ^2.15.1
- version: 2.15.1(eslint@8.56.0)
+ specifier: ^10.1.8
+ version: 10.1.8(eslint@9.39.5(jiti@2.7.0)(supports-color@7.2.0))
+ eslint-import-resolver-typescript:
+ specifier: ^4.4.5
+ version: 4.4.5(eslint-plugin-import@2.32.0)(eslint@9.39.5(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)
eslint-plugin-import:
- specifier: ^2.29.1
- version: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0)
+ specifier: ^2.32.0
+ version: 2.32.0(@typescript-eslint/parser@8.70.0(@typescript/typescript6@6.0.2)(eslint@9.39.5(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0))(eslint-import-resolver-typescript@4.4.5)(eslint@9.39.5(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)
eslint-plugin-jsx-a11y:
specifier: ^6.10.2
- version: 6.10.2(eslint@8.56.0)
+ version: 6.10.2(eslint@9.39.5(jiti@2.7.0)(supports-color@7.2.0))
eslint-plugin-prettier:
- specifier: ^5.1.3
- version: 5.1.3(eslint-config-prettier@9.1.0(eslint@8.56.0))(eslint@8.56.0)(prettier@3.2.5)
+ specifier: ^5.5.6
+ version: 5.5.6(eslint-config-prettier@10.1.8(eslint@9.39.5(jiti@2.7.0)(supports-color@7.2.0)))(eslint@9.39.5(jiti@2.7.0)(supports-color@7.2.0))(prettier@3.9.6)
eslint-plugin-react:
- specifier: ^7.33.2
- version: 7.33.2(eslint@8.56.0)
+ specifier: ^7.37.5
+ version: 7.37.5(eslint@9.39.5(jiti@2.7.0)(supports-color@7.2.0))
eslint-plugin-react-hooks:
- specifier: ^4.6.0
- version: 4.6.0(eslint@8.56.0)
- eslint-plugin-tailwindcss:
- specifier: ^3.14.2
- version: 3.14.2(tailwindcss@3.4.1)
- eslint-plugin-tsdoc:
- specifier: ^0.4.0
- version: 0.4.0
- jest:
- specifier: ^29.7.0
- version: 29.7.0(@types/node@22.15.29)
+ specifier: ^7.1.1
+ version: 7.1.1(eslint@9.39.5(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)
+ globals:
+ specifier: ^17.12.0
+ version: 17.12.0
+ jsdom:
+ specifier: ^30.0.1
+ version: 30.0.1
postcss:
- specifier: ^8.4.35
- version: 8.4.35
+ specifier: ^8.5.28
+ version: 8.5.28
prettier:
- specifier: ^3.2.5
- version: 3.2.5
+ specifier: ^3.9.6
+ version: 3.9.6
prettier-plugin-tailwindcss:
- specifier: ^0.5.11
- version: 0.5.11(prettier@3.2.5)
+ specifier: ^0.8.1
+ version: 0.8.1(prettier@3.9.6)
tailwindcss:
- specifier: ^3.4.1
- version: 3.4.1
- ts-jest:
- specifier: ^29.1.2
- version: 29.1.2(@babel/core@7.20.12)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.20.12))(jest@29.7.0(@types/node@22.15.29))(typescript@5.3.3)
- ts-standard:
- specifier: ^12.0.2
- version: 12.0.2(typescript@5.3.3)
+ specifier: ^4.3.3
+ version: 4.3.3
typescript:
- specifier: ^5.3.3
- version: 5.3.3
- wait-on:
- specifier: ^7.2.0
- version: 7.2.0
+ specifier: npm:@typescript/typescript6@^6.0.2
+ version: '@typescript/typescript6@6.0.2'
+ typescript-eslint:
+ specifier: ^8.70.0
+ version: 8.70.0(@typescript/typescript6@6.0.2)(eslint@9.39.5(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)
+ vite:
+ specifier: ^8.2.2
+ version: 8.3.0(@types/node@24.13.4)(jiti@2.7.0)
+ vitest:
+ specifier: ^5.0.0
+ version: 5.0.0(@types/node@24.13.4)(@vitest/coverage-v8@5.0.0)(jsdom@30.0.1)(vite@8.3.0(@types/node@24.13.4)(jiti@2.7.0))
packages:
- '@aashutoshrathi/word-wrap@1.2.6':
- resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==}
- engines: {node: '>=0.10.0'}
-
- '@adobe/css-tools@4.3.3':
- resolution: {integrity: sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==}
+ '@adobe/css-tools@4.5.0':
+ resolution: {integrity: sha512-6OzddxPio9UiWTCemp4N8cYLV2ZN1ncRnV1cVGtve7dhPOtRkleRyx32GQCYSwDYgaHU3USMm84tNsvKzRCa1Q==}
- '@alloc/quick-lru@5.2.0':
- resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
+ '@alloc/quick-lru@5.3.0':
+ resolution: {integrity: sha512-U4+70Pc5ZS9osnCBCE5Jha/ciHM+Yp+CNMNC/7HvYbNRk1Ldd+f7qO65W5qfhu/TCv+/ozljlXXe9Nj8419DMA==}
engines: {node: '>=10'}
- '@ampproject/remapping@2.2.0':
- resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==}
- engines: {node: '>=6.0.0'}
-
- '@babel/code-frame@7.18.6':
- resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==}
- engines: {node: '>=6.9.0'}
-
- '@babel/code-frame@7.27.1':
- resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==}
- engines: {node: '>=6.9.0'}
-
- '@babel/compat-data@7.20.14':
- resolution: {integrity: sha512-0YpKHD6ImkWMEINCyDAD0HLLUH/lPCefG8ld9it8DJB2wnApraKuhgYTvTY1z7UFIfBTGy5LwncZ+5HWWGbhFw==}
- engines: {node: '>=6.9.0'}
-
- '@babel/compat-data@7.27.5':
- resolution: {integrity: sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==}
- engines: {node: '>=6.9.0'}
-
- '@babel/core@7.20.12':
- resolution: {integrity: sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==}
- engines: {node: '>=6.9.0'}
-
- '@babel/core@7.27.4':
- resolution: {integrity: sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==}
- engines: {node: '>=6.9.0'}
-
- '@babel/eslint-parser@7.23.10':
- resolution: {integrity: sha512-3wSYDPZVnhseRnxRJH6ZVTNknBz76AEnyC+AYYhasjP3Yy23qz0ERR7Fcd2SHmYuSFJ2kY9gaaDd3vyqU09eSw==}
- engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0}
- peerDependencies:
- '@babel/core': ^7.11.0
- eslint: ^7.5.0 || ^8.0.0
-
- '@babel/generator@7.20.14':
- resolution: {integrity: sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg==}
- engines: {node: '>=6.9.0'}
-
- '@babel/generator@7.27.5':
- resolution: {integrity: sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==}
- engines: {node: '>=6.9.0'}
+ '@asamuzakjp/css-color@6.0.7':
+ resolution: {integrity: sha512-vC/bk1Lz7Tn/EfU9/apOTBk80/8dyGyWMowPoV1tJ52muDGsDqt2HPT2klrFUiY60MQmQv9q8yIht15JnBgDGw==}
+ engines: {node: ^22.13.0 || >=24.0.0}
- '@babel/helper-compilation-targets@7.20.7':
- resolution: {integrity: sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0
+ '@asamuzakjp/dom-selector@8.3.2':
+ resolution: {integrity: sha512-93Z1N+BQNXysodoicpOIyNh2drHfz/CTf9nnT0FEx72GJcIiwgydD7tGAr78j41LsYn3hlRn+LdGPuBLn1Bl8Q==}
+ engines: {node: ^22.13.0 || >=24.0.0}
- '@babel/helper-compilation-targets@7.27.2':
- resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==}
+ '@babel/code-frame@7.29.7':
+ resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==}
engines: {node: '>=6.9.0'}
- '@babel/helper-environment-visitor@7.18.9':
- resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==}
+ '@babel/compat-data@7.29.7':
+ resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==}
engines: {node: '>=6.9.0'}
- '@babel/helper-function-name@7.19.0':
- resolution: {integrity: sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==}
+ '@babel/core@7.29.7':
+ resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==}
engines: {node: '>=6.9.0'}
- '@babel/helper-hoist-variables@7.18.6':
- resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==}
+ '@babel/generator@7.29.8':
+ resolution: {integrity: sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==}
engines: {node: '>=6.9.0'}
- '@babel/helper-module-imports@7.18.6':
- resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==}
+ '@babel/helper-compilation-targets@7.29.7':
+ resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==}
engines: {node: '>=6.9.0'}
- '@babel/helper-module-imports@7.27.1':
- resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==}
+ '@babel/helper-globals@7.29.7':
+ resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==}
engines: {node: '>=6.9.0'}
- '@babel/helper-module-transforms@7.20.11':
- resolution: {integrity: sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==}
+ '@babel/helper-module-imports@7.29.7':
+ resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==}
engines: {node: '>=6.9.0'}
- '@babel/helper-module-transforms@7.27.3':
- resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==}
+ '@babel/helper-module-transforms@7.29.7':
+ resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0
- '@babel/helper-plugin-utils@7.20.2':
- resolution: {integrity: sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-simple-access@7.20.2':
- resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-split-export-declaration@7.18.6':
- resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==}
+ '@babel/helper-string-parser@7.29.7':
+ resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==}
engines: {node: '>=6.9.0'}
- '@babel/helper-string-parser@7.19.4':
- resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==}
+ '@babel/helper-validator-identifier@7.29.7':
+ resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==}
engines: {node: '>=6.9.0'}
- '@babel/helper-string-parser@7.27.1':
- resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==}
+ '@babel/helper-validator-option@7.29.7':
+ resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==}
engines: {node: '>=6.9.0'}
- '@babel/helper-validator-identifier@7.19.1':
- resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==}
+ '@babel/helpers@7.29.7':
+ resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==}
engines: {node: '>=6.9.0'}
- '@babel/helper-validator-identifier@7.22.20':
- resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==}
- engines: {node: '>=6.9.0'}
+ '@babel/parser@7.29.8':
+ resolution: {integrity: sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
- '@babel/helper-validator-identifier@7.27.1':
- resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==}
+ '@babel/runtime@7.29.7':
+ resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==}
engines: {node: '>=6.9.0'}
- '@babel/helper-validator-option@7.18.6':
- resolution: {integrity: sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==}
+ '@babel/template@7.29.7':
+ resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==}
engines: {node: '>=6.9.0'}
- '@babel/helper-validator-option@7.27.1':
- resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==}
+ '@babel/traverse@7.29.8':
+ resolution: {integrity: sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==}
engines: {node: '>=6.9.0'}
- '@babel/helpers@7.20.13':
- resolution: {integrity: sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg==}
+ '@babel/types@7.29.8':
+ resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==}
engines: {node: '>=6.9.0'}
- '@babel/helpers@7.27.4':
- resolution: {integrity: sha512-Y+bO6U+I7ZKaM5G5rDUZiYfUvQPUibYmAFe7EnKdnKBbVXDZxvp+MWOH5gYciY0EPk4EScsuFMQBbEfpdRKSCQ==}
- engines: {node: '>=6.9.0'}
+ '@base-ui/react@1.8.0':
+ resolution: {integrity: sha512-P0/1sxo6SBVZOklKMIedvTWqw2s2IQzi9x5bIVsXu980cuSOD4NeuRSs+/L7LZQfDkZP/uRZyGPyfFl/B1oH+Q==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ '@date-fns/tz': ^1.2.0
+ '@types/react': ^17 || ^18 || ^19
+ date-fns: ^4.0.0
+ react: ^17 || ^18 || ^19
+ react-dom: ^17 || ^18 || ^19
+ peerDependenciesMeta:
+ '@date-fns/tz':
+ optional: true
+ '@types/react':
+ optional: true
+ date-fns:
+ optional: true
- '@babel/highlight@7.18.6':
- resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==}
- engines: {node: '>=6.9.0'}
+ '@base-ui/utils@0.4.0':
+ resolution: {integrity: sha512-bO9fz25kKtPf+aZVyfQrC0PDmJdmVni31W2hCS5/Owb+inwdIL3XU26pCPRPlt4LSxZrBgLwubXQXQlKaFEZzw==}
+ peerDependencies:
+ '@types/react': ^17 || ^18 || ^19
+ react: ^17 || ^18 || ^19
+ react-dom: ^17 || ^18 || ^19
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
- '@babel/parser@7.20.15':
- resolution: {integrity: sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg==}
- engines: {node: '>=6.0.0'}
- hasBin: true
+ '@bcoe/v8-coverage@1.0.2':
+ resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==}
+ engines: {node: '>=18'}
- '@babel/parser@7.27.5':
- resolution: {integrity: sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==}
- engines: {node: '>=6.0.0'}
+ '@bramus/specificity@2.4.2':
+ resolution: {integrity: sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==}
hasBin: true
- '@babel/plugin-syntax-async-generators@7.8.4':
- resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-syntax-bigint@7.8.3':
- resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-syntax-class-properties@7.12.13':
- resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
+ '@csstools/color-helpers@6.1.1':
+ resolution: {integrity: sha512-gLNsunvwf3mCi5u5o46/Z/JcJMnhbHSaZ69rkgPzNM3J4s8hWwpPUQB6/tt0EDFyCiWzxANlx+2LJwpYj4zS1w==}
+ engines: {node: '>=20.19.0'}
- '@babel/plugin-syntax-import-meta@7.10.4':
- resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==}
+ '@csstools/css-calc@3.3.0':
+ resolution: {integrity: sha512-c5ihYsPkdG6JCkU2zTMm4+k6r7RXuGxtWYhu5DHMIiF1FHzrfmHL5so11AoFpUv/tu61xfcmT4AmKoFfMPoqdQ==}
+ engines: {node: '>=20.19.0'}
peerDependencies:
- '@babel/core': ^7.0.0-0
+ '@csstools/css-parser-algorithms': ^4.0.0
+ '@csstools/css-tokenizer': ^4.0.0
- '@babel/plugin-syntax-json-strings@7.8.3':
- resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==}
+ '@csstools/css-color-parser@4.2.2':
+ resolution: {integrity: sha512-3QKjR/vxyjcSXBLgb6lP0S3MGdvwbmqSsvLPbYdVORqPDc8FX1HAJ0Spk38bxaRXgvENTA47tlhhbb5Z2e8hEg==}
+ engines: {node: '>=20.19.0'}
peerDependencies:
- '@babel/core': ^7.0.0-0
+ '@csstools/css-parser-algorithms': ^4.0.0
+ '@csstools/css-tokenizer': ^4.0.0
- '@babel/plugin-syntax-jsx@7.18.6':
- resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==}
- engines: {node: '>=6.9.0'}
+ '@csstools/css-parser-algorithms@4.0.0':
+ resolution: {integrity: sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==}
+ engines: {node: '>=20.19.0'}
peerDependencies:
- '@babel/core': ^7.0.0-0
+ '@csstools/css-tokenizer': ^4.0.0
- '@babel/plugin-syntax-logical-assignment-operators@7.10.4':
- resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==}
+ '@csstools/css-syntax-patches-for-csstree@1.1.13':
+ resolution: {integrity: sha512-i9ZylF5QNhmNfPA9l0vHAWK4kPrbIp6g9lKgaiIFsIBz2F/WNB7OLrzlNNcCOm+h42bkaSD2v1PG+IBPHhc3ZA==}
peerDependencies:
- '@babel/core': ^7.0.0-0
+ css-tree: ^3.2.1
+ peerDependenciesMeta:
+ css-tree:
+ optional: true
- '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3':
- resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
+ '@csstools/css-tokenizer@4.0.0':
+ resolution: {integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==}
+ engines: {node: '>=20.19.0'}
- '@babel/plugin-syntax-numeric-separator@7.10.4':
- resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
+ '@emnapi/core@1.10.0':
+ resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==}
- '@babel/plugin-syntax-object-rest-spread@7.8.3':
- resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
+ '@emnapi/runtime@1.10.0':
+ resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==}
- '@babel/plugin-syntax-optional-catch-binding@7.8.3':
- resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
+ '@emnapi/runtime@1.11.3':
+ resolution: {integrity: sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==}
- '@babel/plugin-syntax-optional-chaining@7.8.3':
- resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
+ '@emnapi/wasi-threads@1.2.1':
+ resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==}
- '@babel/plugin-syntax-top-level-await@7.14.5':
- resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==}
- engines: {node: '>=6.9.0'}
+ '@eslint-community/eslint-utils@4.10.1':
+ resolution: {integrity: sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
- '@babel/core': ^7.0.0-0
+ eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
- '@babel/plugin-syntax-typescript@7.20.0':
- resolution: {integrity: sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==}
- engines: {node: '>=6.9.0'}
+ '@eslint-community/eslint-utils@4.9.1':
+ resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/runtime@7.20.13':
- resolution: {integrity: sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==}
- engines: {node: '>=6.9.0'}
+ eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
- '@babel/template@7.20.7':
- resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==}
- engines: {node: '>=6.9.0'}
+ '@eslint-community/regexpp@4.12.2':
+ resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==}
+ engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
- '@babel/template@7.27.2':
- resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==}
- engines: {node: '>=6.9.0'}
+ '@eslint/config-array@0.21.2':
+ resolution: {integrity: sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@babel/traverse@7.20.13':
- resolution: {integrity: sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ==}
- engines: {node: '>=6.9.0'}
+ '@eslint/config-helpers@0.4.2':
+ resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@babel/traverse@7.27.4':
- resolution: {integrity: sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==}
- engines: {node: '>=6.9.0'}
+ '@eslint/core@0.17.0':
+ resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@babel/types@7.20.7':
- resolution: {integrity: sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==}
- engines: {node: '>=6.9.0'}
+ '@eslint/eslintrc@3.3.7':
+ resolution: {integrity: sha512-F42g89Qd5oAWtp0k0nnSrjziAKza7w8SVT4mStc18LZMaRb4J1HQAHLCalEtDCxrTuksx7NU9qsmeLwpOfPqWw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@babel/types@7.27.3':
- resolution: {integrity: sha512-Y1GkI4ktrtvmawoSq+4FCVHNryea6uR+qUQy0AGxLSsjCX0nVmkYQMBLHDkXZuo5hGx7eYdnIaslsdBFm7zbUw==}
- engines: {node: '>=6.9.0'}
+ '@eslint/js@9.39.5':
+ resolution: {integrity: sha512-QywQuszQh77pIXCsq998c8hbhSTI/azTty1Z6N53dmAudKHhy573j3yvRLsX2BSp8YpLtoCEG8E9DJe+8zUh4A==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@bcoe/v8-coverage@0.2.3':
- resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==}
+ '@eslint/object-schema@2.1.7':
+ resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@colors/colors@1.5.0':
- resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==}
- engines: {node: '>=0.1.90'}
+ '@eslint/plugin-kit@0.4.1':
+ resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@cypress/request@3.0.1':
- resolution: {integrity: sha512-TWivJlJi8ZDx2wGOw1dbLuHJKUYX7bWySw377nlnGOW3hP9/MUKIsEdXT/YngWxVdgNCHRBmFlBipE+5/2ZZlQ==}
- engines: {node: '>= 6'}
+ '@exodus/bytes@1.15.1':
+ resolution: {integrity: sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q==}
+ engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0}
+ peerDependencies:
+ '@noble/hashes': ^1.8.0 || ^2.0.0
+ peerDependenciesMeta:
+ '@noble/hashes':
+ optional: true
- '@cypress/xvfb@1.2.4':
- resolution: {integrity: sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==}
+ '@floating-ui/core@1.8.0':
+ resolution: {integrity: sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==}
- '@emnapi/runtime@1.4.3':
- resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==}
+ '@floating-ui/dom@1.8.0':
+ resolution: {integrity: sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==}
- '@eslint-community/eslint-utils@4.4.0':
- resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ '@floating-ui/react-dom@2.1.9':
+ resolution: {integrity: sha512-JDjEFGCpImxDCA7JJKviA0M9+RtmJdj0m/NVU5IMgBK+AmZouAQQ7/+2GLH0GXXY0YMw9oXPB8hKdbPYg5QLYg==}
peerDependencies:
- eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
-
- '@eslint-community/regexpp@4.10.0':
- resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==}
- engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
+ react: '>=16.8.0'
+ react-dom: '>=16.8.0'
- '@eslint/eslintrc@2.1.4':
- resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
-
- '@eslint/js@8.56.0':
- resolution: {integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ '@floating-ui/utils@0.2.12':
+ resolution: {integrity: sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==}
- '@hapi/hoek@9.3.0':
- resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==}
+ '@humanfs/core@0.19.2':
+ resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==}
+ engines: {node: '>=18.18.0'}
- '@hapi/topo@5.1.0':
- resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==}
+ '@humanfs/node@0.16.8':
+ resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==}
+ engines: {node: '>=18.18.0'}
- '@humanwhocodes/config-array@0.11.14':
- resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==}
- engines: {node: '>=10.10.0'}
+ '@humanfs/types@0.15.0':
+ resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==}
+ engines: {node: '>=18.18.0'}
'@humanwhocodes/module-importer@1.0.1':
resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
engines: {node: '>=12.22'}
- '@humanwhocodes/object-schema@2.0.2':
- resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==}
+ '@humanwhocodes/retry@0.4.3':
+ resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==}
+ engines: {node: '>=18.18'}
+
+ '@img/colour@1.1.0':
+ resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==}
+ engines: {node: '>=18'}
- '@img/sharp-darwin-arm64@0.34.2':
- resolution: {integrity: sha512-OfXHZPppddivUJnqyKoi5YVeHRkkNE2zUFT2gbpKxp/JZCFYEYubnMg+gOp6lWfasPrTS+KPosKqdI+ELYVDtg==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ '@img/sharp-darwin-arm64@0.35.4':
+ resolution: {integrity: sha512-Uhfl4V4lhP2nbUVF9+hyH1+luj86f1gUFeo8ALYxFoULoU+G87D43BfeMP8XHsk9boxAnCY/bf2EHwhA7MuGsA==}
+ engines: {node: '>=20.9.0'}
cpu: [arm64]
os: [darwin]
- '@img/sharp-darwin-x64@0.34.2':
- resolution: {integrity: sha512-dYvWqmjU9VxqXmjEtjmvHnGqF8GrVjM2Epj9rJ6BUIXvk8slvNDJbhGFvIoXzkDhrJC2jUxNLz/GUjjvSzfw+g==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ '@img/sharp-darwin-x64@0.35.4':
+ resolution: {integrity: sha512-hWniXY3bG5qKpkKrAwPe4y+VTPmf086YQAnkxWh7uA1YrlRouWGa0M0Mxj3ZjnXFkv7/TD1bTy9lGUK26vRvWw==}
+ engines: {node: '>=20.9.0'}
cpu: [x64]
os: [darwin]
- '@img/sharp-libvips-darwin-arm64@1.1.0':
- resolution: {integrity: sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA==}
+ '@img/sharp-freebsd-wasm32@0.35.4':
+ resolution: {integrity: sha512-lIsKw/BU+kjB4eZjxrYrZmwOJYi3Ajrv66iAlBmUPyKc3HpnloevB1g3wxGD9P/5BbQ1brBGl65VRRrCvQDEqA==}
+ engines: {node: '>=20.9.0'}
+ os: [freebsd]
+
+ '@img/sharp-libvips-darwin-arm64@1.3.3':
+ resolution: {integrity: sha512-suTBPTDGrI9WodccaDdwZItTSaBYASlBk1NSfElSHrUfzu3szG6lvIF58+WiFvnfzuK8ZBFS5zE00PxqxnRiPg==}
cpu: [arm64]
os: [darwin]
- '@img/sharp-libvips-darwin-x64@1.1.0':
- resolution: {integrity: sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ==}
+ '@img/sharp-libvips-darwin-x64@1.3.3':
+ resolution: {integrity: sha512-FVJZ5mITMobmXIz/hPDTw0EintTW5H3WfrxwLqEqjiIihlu+hVRyGrFQ60xl0Lxn7Bt3zdpevPaQi0HEzqz9fw==}
cpu: [x64]
os: [darwin]
- '@img/sharp-libvips-linux-arm64@1.1.0':
- resolution: {integrity: sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew==}
+ '@img/sharp-libvips-linux-arm64@1.3.3':
+ resolution: {integrity: sha512-0DaL0A6Xu6sQSQFwe4iVCrKWU2cCTItnRsYsCdxAMm9NF6twAA9BKnoqy4hqz4+azQ0JHuA26qiUKsf1XJ/v5A==}
cpu: [arm64]
os: [linux]
+ libc: [glibc]
- '@img/sharp-libvips-linux-arm@1.1.0':
- resolution: {integrity: sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA==}
+ '@img/sharp-libvips-linux-arm@1.3.3':
+ resolution: {integrity: sha512-3rbU4vqXXc3hY/OiXdl52xZvT0F1yEngWfvqudtPJg/KkyiaQw2DRsFrNzpmLvfavbwOq3qXn36GP8obHRULQA==}
cpu: [arm]
os: [linux]
+ libc: [glibc]
- '@img/sharp-libvips-linux-ppc64@1.1.0':
- resolution: {integrity: sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ==}
+ '@img/sharp-libvips-linux-ppc64@1.3.3':
+ resolution: {integrity: sha512-cdn1OvUBwsXhbC0zSzJnNzf5MZ/mTrobawDvNXBTxe8VtqKAm0sRuEY2Evzovb/w9JMk4TvRxqt1mekSuJz64w==}
cpu: [ppc64]
os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-libvips-linux-riscv64@1.3.3':
+ resolution: {integrity: sha512-HjPVx7yKz+0lqdhDlTw1tt90wamBoxhiXpvl1XZpJLiHH4RCJ5yDTqH+VlYPv2fwFs89JFw4c1IexYOcQUi4IQ==}
+ cpu: [riscv64]
+ os: [linux]
+ libc: [glibc]
- '@img/sharp-libvips-linux-s390x@1.1.0':
- resolution: {integrity: sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA==}
+ '@img/sharp-libvips-linux-s390x@1.3.3':
+ resolution: {integrity: sha512-neWLh+3yCNThxnfy3c4BbVBeGgt9aftno+XbT56iK28RgeDs3UOFWviLWlUu0bArYVYJaFDK+RRohbicUNCm8Q==}
cpu: [s390x]
os: [linux]
+ libc: [glibc]
- '@img/sharp-libvips-linux-x64@1.1.0':
- resolution: {integrity: sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q==}
+ '@img/sharp-libvips-linux-x64@1.3.3':
+ resolution: {integrity: sha512-4vKmvAst9nrowcqquKFAyZJUDolUaIp8uRiN0mWFguJ1IplC9/pitXtlnnlU4aa/eJw3J7i67V+pwUL+wZGdsA==}
cpu: [x64]
os: [linux]
+ libc: [glibc]
- '@img/sharp-libvips-linuxmusl-arm64@1.1.0':
- resolution: {integrity: sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w==}
+ '@img/sharp-libvips-linuxmusl-arm64@1.3.3':
+ resolution: {integrity: sha512-Y9kQaLMuNoB0bPYOOdcZMaseNrFpPodIWWMrx+CZyydf2xn68j9WYc6sWWRrDwNkzCQjKYfc68L7jKjGlHMibw==}
cpu: [arm64]
os: [linux]
+ libc: [musl]
- '@img/sharp-libvips-linuxmusl-x64@1.1.0':
- resolution: {integrity: sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A==}
+ '@img/sharp-libvips-linuxmusl-x64@1.3.3':
+ resolution: {integrity: sha512-fj8Mv0HHfD1Rr+4I68+3agJynxDWtBFgicTbSOb9Bke6pIwzGcJ+RX/yHjmiEGFMCavY/dxvem7MyNaJF+wDiw==}
cpu: [x64]
os: [linux]
+ libc: [musl]
- '@img/sharp-linux-arm64@0.34.2':
- resolution: {integrity: sha512-D8n8wgWmPDakc83LORcfJepdOSN6MvWNzzz2ux0MnIbOqdieRZwVYY32zxVx+IFUT8er5KPcyU3XXsn+GzG/0Q==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ '@img/sharp-linux-arm64@0.35.4':
+ resolution: {integrity: sha512-De4jpEnAU8Hd5oT0j1G3uL4ZvTuipVMn7YC6vPaJhy6/7EwEae0SVAoBrUMYQbkLGDm85taVWwuPc1a44LTzCQ==}
+ engines: {node: '>=20.9.0'}
cpu: [arm64]
os: [linux]
+ libc: [glibc]
- '@img/sharp-linux-arm@0.34.2':
- resolution: {integrity: sha512-0DZzkvuEOqQUP9mo2kjjKNok5AmnOr1jB2XYjkaoNRwpAYMDzRmAqUIa1nRi58S2WswqSfPOWLNOr0FDT3H5RQ==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ '@img/sharp-linux-arm@0.35.4':
+ resolution: {integrity: sha512-7OAS8gI0EReKGVN2HssHlM6umJgxF5VI3xN0p9FA91p/YO+ou5hiNghLdZ5BEHztwaaK5+bLKRf8x/o2L2nk9A==}
+ engines: {node: '>=20.9.0'}
cpu: [arm]
os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-linux-ppc64@0.35.4':
+ resolution: {integrity: sha512-2oYZJeIl4kCcMGk4ouZVjnkCtFrpQFlNEtJ6GbxzhHQchwH0NH/qEb9ykmOl29dqwMq+JhFdZn+1ak2FKhI9fQ==}
+ engines: {node: '>=20.9.0'}
+ cpu: [ppc64]
+ os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-linux-riscv64@0.35.4':
+ resolution: {integrity: sha512-cPbNChoRURAWdebDIHSenxRpgEdy7JkPydSnUxRm9VvKD7m0/xVaR/8Fzlu81pk5nHEvHH87UZUA7cTtwnbJSA==}
+ engines: {node: '>=20.9.0'}
+ cpu: [riscv64]
+ os: [linux]
+ libc: [glibc]
- '@img/sharp-linux-s390x@0.34.2':
- resolution: {integrity: sha512-EGZ1xwhBI7dNISwxjChqBGELCWMGDvmxZXKjQRuqMrakhO8QoMgqCrdjnAqJq/CScxfRn+Bb7suXBElKQpPDiw==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ '@img/sharp-linux-s390x@0.35.4':
+ resolution: {integrity: sha512-RY0JFY8Fd6RonCBtHz+DvadaPkXDSI1AUn6yWL9TipqkZ1vY8w8evqdgyDFnkm4/K1ve1TvZiaePP5oSd4+WVQ==}
+ engines: {node: '>=20.9.0'}
cpu: [s390x]
os: [linux]
+ libc: [glibc]
- '@img/sharp-linux-x64@0.34.2':
- resolution: {integrity: sha512-sD7J+h5nFLMMmOXYH4DD9UtSNBD05tWSSdWAcEyzqW8Cn5UxXvsHAxmxSesYUsTOBmUnjtxghKDl15EvfqLFbQ==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ '@img/sharp-linux-x64@0.35.4':
+ resolution: {integrity: sha512-9qvvEAuk8k89TfWUoX2htWjbAMX8p+NxCppjpcg5k6xMsjhBQPTsoIh36h9Qde4WRuGpJeYnOjdosDn/cnv+OA==}
+ engines: {node: '>=20.9.0'}
cpu: [x64]
os: [linux]
+ libc: [glibc]
- '@img/sharp-linuxmusl-arm64@0.34.2':
- resolution: {integrity: sha512-NEE2vQ6wcxYav1/A22OOxoSOGiKnNmDzCYFOZ949xFmrWZOVII1Bp3NqVVpvj+3UeHMFyN5eP/V5hzViQ5CZNA==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ '@img/sharp-linuxmusl-arm64@0.35.4':
+ resolution: {integrity: sha512-KB5jxpfWQTr0nc3xdHtWChdbifHrBGsd2SM62Eyxrl8afikm+f5qGBU75SJIZBT/S1MC8XyacdlXBMSWq6OURA==}
+ engines: {node: '>=20.9.0'}
cpu: [arm64]
os: [linux]
+ libc: [musl]
- '@img/sharp-linuxmusl-x64@0.34.2':
- resolution: {integrity: sha512-DOYMrDm5E6/8bm/yQLCWyuDJwUnlevR8xtF8bs+gjZ7cyUNYXiSf/E8Kp0Ss5xasIaXSHzb888V1BE4i1hFhAA==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ '@img/sharp-linuxmusl-x64@0.35.4':
+ resolution: {integrity: sha512-f+eZJZIQNEEd26RPSW+76chwOf1XtA2Y/O+5ocVyLliHkeih3e+jhLVBdNTd2rS3IbNXK8+ug93Vf5ZXtF5Lxg==}
+ engines: {node: '>=20.9.0'}
cpu: [x64]
os: [linux]
+ libc: [musl]
+
+ '@img/sharp-wasm32@0.35.4':
+ resolution: {integrity: sha512-zQnl4Kwp7Q6NHsENtU2T/00Zi+w3AQNwz3+UaTyVBy2FpXrzXzGjndpK61onhZjRtRpQXxCTeqw19bVyXOh7jA==}
+ engines: {node: '>=20.9.0'}
- '@img/sharp-wasm32@0.34.2':
- resolution: {integrity: sha512-/VI4mdlJ9zkaq53MbIG6rZY+QRN3MLbR6usYlgITEzi4Rpx5S6LFKsycOQjkOGmqTNmkIdLjEvooFKwww6OpdQ==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ '@img/sharp-webcontainers-wasm32@0.35.4':
+ resolution: {integrity: sha512-ESfNkywmCfPNyaZjxooddJQiQ+l/nTpGEOGthxiLnIHXC/CmcBixnfwUleX9mCz9ovrUUvKMap/pm8RYbzfwaA==}
+ engines: {node: '>=20.9.0'}
cpu: [wasm32]
- '@img/sharp-win32-arm64@0.34.2':
- resolution: {integrity: sha512-cfP/r9FdS63VA5k0xiqaNaEoGxBg9k7uE+RQGzuK9fHt7jib4zAVVseR9LsE4gJcNWgT6APKMNnCcnyOtmSEUQ==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ '@img/sharp-win32-arm64@0.35.4':
+ resolution: {integrity: sha512-iNdlBX9gLVvqe2I3uIJSIKTq6wckP/DYxZtcqxm09x5Gi24DnFBmPAWZmr60ZyYMG0xlzo6goG3670ar+RXvRw==}
+ engines: {node: '>=20.9.0'}
cpu: [arm64]
os: [win32]
- '@img/sharp-win32-ia32@0.34.2':
- resolution: {integrity: sha512-QLjGGvAbj0X/FXl8n1WbtQ6iVBpWU7JO94u/P2M4a8CFYsvQi4GW2mRy/JqkRx0qpBzaOdKJKw8uc930EX2AHw==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ '@img/sharp-win32-ia32@0.35.4':
+ resolution: {integrity: sha512-kqRsbaa5CS6KHlpxnN7WhE6vAAugXyZButpRdvDWetlv6Qv4N9WTcrWzF7tXfB9T7MsoadqdI8hmwLq6UlLvtw==}
+ engines: {node: ^20.9.0}
cpu: [ia32]
os: [win32]
- '@img/sharp-win32-x64@0.34.2':
- resolution: {integrity: sha512-aUdT6zEYtDKCaxkofmmJDJYGCf0+pJg3eU9/oBuqvEeoB9dKI6ZLc/1iLJCTuJQDO4ptntAlkUmHgGjyuobZbw==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ '@img/sharp-win32-x64@0.35.4':
+ resolution: {integrity: sha512-XtmnYhBcrORsJ4XJngyzr/EWP0hRZLAZRFaApdKuviyqF78+ylxh2y06ZmtULAMOnObJ3ucpN0AcwSWnMowTRg==}
+ engines: {node: '>=20.9.0'}
cpu: [x64]
os: [win32]
- '@istanbuljs/load-nyc-config@1.1.0':
- resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==}
- engines: {node: '>=8'}
-
- '@istanbuljs/schema@0.1.3':
- resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==}
- engines: {node: '>=8'}
-
- '@jest/console@29.7.0':
- resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ '@jridgewell/gen-mapping@0.3.13':
+ resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
- '@jest/core@29.7.0':
- resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- peerDependencies:
- node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
- peerDependenciesMeta:
- node-notifier:
- optional: true
+ '@jridgewell/remapping@2.3.5':
+ resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==}
- '@jest/environment@29.7.0':
- resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ '@jridgewell/resolve-uri@3.1.2':
+ resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
+ engines: {node: '>=6.0.0'}
- '@jest/expect-utils@29.4.2':
- resolution: {integrity: sha512-Dd3ilDJpBnqa0GiPN7QrudVs0cczMMHtehSo2CSTjm3zdHx0RcpmhFNVEltuEFeqfLIyWKFI224FsMSQ/nsJQA==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ '@jridgewell/sourcemap-codec@1.6.0':
+ resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==}
- '@jest/expect-utils@29.7.0':
- resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ '@jridgewell/trace-mapping@0.3.31':
+ resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
- '@jest/expect@29.7.0':
- resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ '@napi-rs/wasm-runtime@1.2.4':
+ resolution: {integrity: sha512-AJxoUD2/15ESHbvpcyjU274nsAPLuOtPHCk0vKJM5pj//Fg/B1FXNWjPnXTT9PymCYYiHo4zPj0ZomXBKhoy7g==}
+ engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0}
+ peerDependencies:
+ '@emnapi/core': ^1.7.1 || ^2.0.0-alpha.4
+ '@emnapi/runtime': ^1.7.1 || ^2.0.0-alpha.4
- '@jest/fake-timers@29.7.0':
- resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ '@next/env@16.3.4':
+ resolution: {integrity: sha512-cjWZnUUa6jZq2kFaNe/ZyJdZonOZ/QoN0Zka2nz/FLOrfx14pQuM9c5RaSVkWMqgdt4ksgPAMWPyHSs/CyV48Q==}
- '@jest/globals@29.7.0':
- resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ '@next/eslint-plugin-next@16.3.4':
+ resolution: {integrity: sha512-szW9y2Aumu4z88YXfTzcFsgUAg2k64uzbtcO5L9f1AKS4w/GUKJcbFllRflROVyNPgJtGOnvNxiyp3v6b+prIA==}
- '@jest/reporters@29.7.0':
- resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ '@next/playwright@16.3.4':
+ resolution: {integrity: sha512-3kY/r//YJutrG1JTV7bAe1RNraRmwDjI19lzPrNPmq0mdYvEVTASXPyAqhRW6auQiyWS8FG75TyMHXUkn78tVw==}
peerDependencies:
- node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
+ '@playwright/test': '>=1.0.0'
peerDependenciesMeta:
- node-notifier:
+ '@playwright/test':
optional: true
- '@jest/schemas@29.4.2':
- resolution: {integrity: sha512-ZrGzGfh31NtdVH8tn0mgJw4khQuNHiKqdzJAFbCaERbyCP9tHlxWuL/mnMu8P7e/+k4puWjI1NOzi/sFsjce/g==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- '@jest/schemas@29.6.3':
- resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- '@jest/source-map@29.6.3':
- resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- '@jest/test-result@29.7.0':
- resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- '@jest/test-sequencer@29.7.0':
- resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- '@jest/transform@29.7.0':
- resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- '@jest/types@29.4.2':
- resolution: {integrity: sha512-CKlngyGP0fwlgC1BRUtPZSiWLBhyS9dKwKmyGxk8Z6M82LBEGB2aLQSg+U1MyLsU+M7UjnlLllBM2BLWKVm/Uw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- '@jest/types@29.6.3':
- resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- '@jridgewell/gen-mapping@0.1.1':
- resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==}
- engines: {node: '>=6.0.0'}
-
- '@jridgewell/gen-mapping@0.3.2':
- resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==}
- engines: {node: '>=6.0.0'}
-
- '@jridgewell/gen-mapping@0.3.8':
- resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==}
- engines: {node: '>=6.0.0'}
-
- '@jridgewell/resolve-uri@3.1.0':
- resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==}
- engines: {node: '>=6.0.0'}
-
- '@jridgewell/set-array@1.1.2':
- resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==}
- engines: {node: '>=6.0.0'}
-
- '@jridgewell/set-array@1.2.1':
- resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==}
- engines: {node: '>=6.0.0'}
-
- '@jridgewell/sourcemap-codec@1.4.14':
- resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==}
-
- '@jridgewell/trace-mapping@0.3.17':
- resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==}
-
- '@jridgewell/trace-mapping@0.3.22':
- resolution: {integrity: sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==}
-
- '@jridgewell/trace-mapping@0.3.25':
- resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
-
- '@microsoft/tsdoc-config@0.16.2':
- resolution: {integrity: sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==}
-
- '@microsoft/tsdoc-config@0.17.1':
- resolution: {integrity: sha512-UtjIFe0C6oYgTnad4q1QP4qXwLhe6tIpNTRStJ2RZEPIkqQPREAwE5spzVxsdn9UaEMUqhh0AqSx3X4nWAKXWw==}
-
- '@microsoft/tsdoc@0.14.2':
- resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==}
-
- '@microsoft/tsdoc@0.15.1':
- resolution: {integrity: sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==}
-
- '@next/env@15.4.0-canary.62':
- resolution: {integrity: sha512-Z4l1oiEV0aVkNL4bKUI9Sbmkr0qltVGZ2T2s/4jblRrsY+yh/DETUXQ2j9J5p33lklN+HU/CiWY7u+Pw/8MCRQ==}
-
- '@next/eslint-plugin-next@15.3.3':
- resolution: {integrity: sha512-VKZJEiEdpKkfBmcokGjHu0vGDG+8CehGs90tBEy/IDoDDKGngeyIStt2MmE5FYNyU9BhgR7tybNWTAJY/30u+Q==}
-
- '@next/swc-darwin-arm64@15.4.0-canary.62':
- resolution: {integrity: sha512-cHQayz/PSbkeMmIiJbCjFQ+e1G4Mk04ASsfjL40VikYFY/6E9/jgO93oHXgTEaIS7gFYuPl4HPqMSFYagJ0i/w==}
+ '@next/swc-darwin-arm64@16.3.4':
+ resolution: {integrity: sha512-iBr3I5LZNk5/bgl5//iTgD2tcym14MX0Xo7fD//u9dYAEgGzza1y9oywluPtf74YnOswVdH1908aK9xVz7zQTw==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [darwin]
- '@next/swc-darwin-x64@15.4.0-canary.62':
- resolution: {integrity: sha512-4ys2UBDOFd3T1ChzWOijxWDXfwK2C65aUHxj6mPzfcMP9TLV+Tl0BGTpEHArGo358rUYy0colAfRYTzG3sScFA==}
+ '@next/swc-darwin-x64@16.3.4':
+ resolution: {integrity: sha512-2dpiSyl2Jw/NrBPaU2MAKGSa+2MR82pJIn4Sm5Rjr+gxAeuh0z158Su3Z2O8zn7UNNq+ej4bToed6RcRN/Lydg==}
engines: {node: '>= 10'}
cpu: [x64]
os: [darwin]
- '@next/swc-linux-arm64-gnu@15.4.0-canary.62':
- resolution: {integrity: sha512-Hlq+Vsvr3UEP+WUSjK2Cnbn3wosgUcR08o7k8tf+RtQJW3akgnpFEy0+TVuDiVAfDqhv942y7l7GimNT4Lp3jQ==}
+ '@next/swc-linux-arm64-gnu@16.3.4':
+ resolution: {integrity: sha512-+t+U8HZT+fApePCS5h89CSH3datz29MkzyfCn+6fpsZBG/oiEOhINcb9rtkv6sdpToLGFn2e6146NzaKCXkqrA==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
+ libc: [glibc]
- '@next/swc-linux-arm64-musl@15.4.0-canary.62':
- resolution: {integrity: sha512-i/d8GRg7s4LYyA30OMliK19coIbk5Xz/wnQSpN1uZ6tUOgTT4jIRo40ssi+ahifcCB9ovQEmNs8xsM58hQ7aFw==}
+ '@next/swc-linux-arm64-musl@16.3.4':
+ resolution: {integrity: sha512-mx03GNs1ocQA5JQ4FxDMmIsNkdrZh8cuezKCrId28e5/gIPU/l7Kcy2+vmCCzdjnnmXJy+iOAu+7K0QppO6Urg==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
+ libc: [musl]
- '@next/swc-linux-x64-gnu@15.4.0-canary.62':
- resolution: {integrity: sha512-7qX9XCcLpHvLPRAyBvQLNd7dk1ROqJGoMUp2Cph2QL0l2FUIfU1pMvhh0BiBer/G3I0SaZcPNlMJ/d8CCBD8xg==}
+ '@next/swc-linux-x64-gnu@16.3.4':
+ resolution: {integrity: sha512-YIhGY6fSMfha52bnVxnzc9zaVBzJg+cqQTOD8tXIBSx4fuv0pVMxQTE0PaS59YhnMOiYiG09IMwxJAf/CFm/Dw==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
+ libc: [glibc]
- '@next/swc-linux-x64-musl@15.4.0-canary.62':
- resolution: {integrity: sha512-QdwV09oa+I+bUGiXqRMvO7jVbv71ij/fCAd8vx+AcfayJmOpkIsZ4H2mklpBofZ+au9cK0b0Hpf87VaZNvCo5w==}
+ '@next/swc-linux-x64-musl@16.3.4':
+ resolution: {integrity: sha512-+eaaX6axpDb0yF1GCpiERe6njplvdC+nks/fKfcHu3XPGRrald8P3/X7yv7QLdjA51knnxwl9pxdIJsg+w1L+Q==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
+ libc: [musl]
- '@next/swc-win32-arm64-msvc@15.4.0-canary.62':
- resolution: {integrity: sha512-yTGqOFAXoL21iYfFHQjH99820krOxMYjA1A1X/HvsdsIbQrQgUKXw4E5+VnAuUdv4yov0ncp5pMkB7ftGM0lbg==}
+ '@next/swc-win32-arm64-msvc@16.3.4':
+ resolution: {integrity: sha512-0jcXW7Xs/uzICrmgV3MhDYDeRy++1CqnpDIerlPIqYO4bhzB4WNbX/aRnQclustsAyTkFKB0z6rbcjmNg5tR8A==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [win32]
- '@next/swc-win32-x64-msvc@15.4.0-canary.62':
- resolution: {integrity: sha512-SJBj6+sjSYXeSar+yC4UeB1OZi9Q3VcYpsxTUJ3SgV0NjhPY5NnluWtvnpjx/7BdoDV/7L2UCZI9feLkBKQmGg==}
+ '@next/swc-win32-x64-msvc@16.3.4':
+ resolution: {integrity: sha512-vvBzwu1pYQCp92maZCFCIw/XgOTMR5tur9GjakwIo2cmwRTMKajRZZDS9+e4KsUZWKu1E007WUeAFXRRjZeuzw==}
engines: {node: '>= 10'}
cpu: [x64]
os: [win32]
- '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1':
- resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==}
-
'@nodelib/fs.scandir@2.1.5':
resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
engines: {node: '>= 8'}
@@ -781,619 +762,658 @@ packages:
resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
engines: {node: '>= 8'}
- '@pkgr/core@0.1.1':
- resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==}
- engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
+ '@oxc-project/types@0.149.0':
+ resolution: {integrity: sha512-Efcc+iF0j3Bf67YjEqIqWXbX5XddXoK/Mw4K1/JuXwRCZ8N16VR7iT23nlCc9XrveFVh/E5Rqs2StT0V8v9LdA==}
- '@pkgr/core@0.2.7':
- resolution: {integrity: sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg==}
- engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
+ '@pkgr/core@0.3.6':
+ resolution: {integrity: sha512-SEeaJLb3qBNF/OaXnaR1NmmBbFYk1zC0ZH/52fATcRPLFg/p791YrcyFFy44Bo9sLaGuSuLp5Q6axbb/O+v/RA==}
+ engines: {node: ^14.18.0 || >=16.0.0}
- '@radix-ui/primitive@1.1.2':
- resolution: {integrity: sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==}
+ '@playwright/test@1.63.0':
+ resolution: {integrity: sha512-oxMK4vllB9RK5NQ2l1pq1IfOf2AvnEuj/vYGDj0H2nMtmtZpKtCwt/l00GEO6xjGfpBNAvjovvYdCm50dRQkpQ==}
+ engines: {node: '>=20'}
+ hasBin: true
- '@radix-ui/react-collection@1.1.7':
- resolution: {integrity: sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
+ '@rolldown/binding-android-arm-eabi@1.2.8':
+ resolution: {integrity: sha512-tN5aztYkKCte4i5SIrrz5yK/HMjEuCqCSCJa418jOV8tZ1cBY3YF2otxB1ktPxzsLA1BeTqwapK0bfjxNvHJVw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm]
+ os: [android]
- '@radix-ui/react-compose-refs@1.1.2':
- resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
+ '@rolldown/binding-android-arm64@1.2.8':
+ resolution: {integrity: sha512-dIYTWl9XprMUiQFoc55KUyk/oS8SKYH3zFl0LTR7RT0Xj4hgSVyuJcroH8JUu8RcpF8fTB6E0aOwCkZoYPcDSQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [android]
- '@radix-ui/react-context@1.1.2':
- resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
+ '@rolldown/binding-darwin-arm64@1.2.8':
+ resolution: {integrity: sha512-PCSDQGXD2IyTEFrcgPyBM8jJuGmrbCMuoIOXdbEGVemruKACXoLQJrb+A45Z0L5t1RQkdfJprAYPkikbh7dzdA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [darwin]
- '@radix-ui/react-dialog@1.1.14':
- resolution: {integrity: sha512-+CpweKjqpzTmwRwcYECQcNYbI8V9VSQt0SNFKeEBLgfucbsLssU6Ppq7wUdNXEGb573bMjFhVjKVll8rmV6zMw==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
+ '@rolldown/binding-darwin-x64@1.2.8':
+ resolution: {integrity: sha512-Uk7lRsGhPFHVX/sAUC6D5H9Ol30dFHd6iquokll2th3LpdJ3F5CzQB+7DHn0Ri2mG+U7k2zXiPHDrwZenXhwSA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [darwin]
- '@radix-ui/react-direction@1.1.1':
- resolution: {integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
+ '@rolldown/binding-freebsd-x64@1.2.8':
+ resolution: {integrity: sha512-DjszaTEVogPqA5bYzsEeqDCQxbcp2fexQwKcRspYji2yzR68fCf+e4fx6kBSRDwX5/brZaHw/hWS9+A/+/w9sQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [freebsd]
- '@radix-ui/react-dismissable-layer@1.1.10':
- resolution: {integrity: sha512-IM1zzRV4W3HtVgftdQiiOmA0AdJlCtMLe00FXaHwgt3rAnNsIyDqshvkIW3hj/iu5hu8ERP7KIYki6NkqDxAwQ==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
+ '@rolldown/binding-linux-arm-gnueabihf@1.2.8':
+ resolution: {integrity: sha512-zmwa7FTmdzB6aaEEuuls18H6Ap5JmJPSoPTuXixeJZV6tG40SyLkApQtz1g8ptZtiEKqj9OM0oNLPh1AgvE31Q==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm]
+ os: [linux]
- '@radix-ui/react-focus-guards@1.1.2':
- resolution: {integrity: sha512-fyjAACV62oPV925xFCrH8DR5xWhg9KYtJT4s3u54jxp+L/hbpTY2kIeEFFbFe+a/HCE94zGQMZLIpVTPVZDhaA==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
+ '@rolldown/binding-linux-arm64-gnu@1.2.8':
+ resolution: {integrity: sha512-KdYQDPHwJVnbFwdTGMgxsI9SqblBlz6STGM+w1We/d5B8OWWidYH0MwkU/uA1wM5fIpO2MkOVxXrNzzuZhw9ew==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
- '@radix-ui/react-focus-scope@1.1.7':
- resolution: {integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
+ '@rolldown/binding-linux-arm64-musl@1.2.8':
+ resolution: {integrity: sha512-jFJTifHnNPY+yzOoNZQfSIysrVyXzEQPhPnOUjmD1bcQGHH6s7c8cViKWar8YplQImE5N9JRqMCLrM2CdxOrZA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
- '@radix-ui/react-id@1.1.1':
- resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
+ '@rolldown/binding-linux-ppc64-gnu@1.2.8':
+ resolution: {integrity: sha512-FhiOziBDWPBjbcmRzfLyIJnaP7AVMFXT7YCXPjXxj7wKU3vx24RjrCNN/zjvVa+N2vVoHJwCoUBvsrN/DG3zIA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [ppc64]
+ os: [linux]
+ libc: [glibc]
- '@radix-ui/react-label@2.1.7':
- resolution: {integrity: sha512-YT1GqPSL8kJn20djelMX7/cTRp/Y9w5IZHvfxQTVHrOqa2yMl7i/UfMqKRU5V7mEyKTrUVgJXhNQPVCG8PBLoQ==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
+ '@rolldown/binding-linux-s390x-gnu@1.2.8':
+ resolution: {integrity: sha512-WnHfADMzOV2Y55wlx1hzzQnar/wDt/VdvWSD99r18Mz9ylNieIGOkRx3UV21h7m/eJvjySYJkO26VvGNFkwsIQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [s390x]
+ os: [linux]
+ libc: [glibc]
- '@radix-ui/react-portal@1.1.9':
- resolution: {integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
+ '@rolldown/binding-linux-x64-gnu@1.2.8':
+ resolution: {integrity: sha512-H9tRr5ibfXFVLxbPOseVewewFpl28zcEdjRDt2FTUZU7odxP0gEv1ki4/kGmcGOh78oRwZuuQllGLZ9zTJp84g==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
- '@radix-ui/react-presence@1.1.4':
- resolution: {integrity: sha512-ueDqRbdc4/bkaQT3GIpLQssRlFgWaL/U2z/S31qRwwLWoxHLgry3SIfCwhxeQNbirEUXFa+lq3RL3oBYXtcmIA==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
+ '@rolldown/binding-linux-x64-musl@1.2.8':
+ resolution: {integrity: sha512-UefiqfM3D6IVNlZ8tSGs9+Ejjud2T+oxO0IHADU45Y+lyEjD2dVFyZHbkfX0LUb5Zugo/oIv1eCO/KVYhgYJYA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
- '@radix-ui/react-primitive@2.1.3':
- resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
+ '@rolldown/binding-openharmony-arm64@1.2.8':
+ resolution: {integrity: sha512-637Ke4kWSy6rp9cxQ9gMOXlxPgIw/c1beASV4M//3+9I4uwBVOOl74G+e3zyU3u19U7RkRl/HuewixZ/Z6+Rjg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [openharmony]
- '@radix-ui/react-radio-group@1.3.7':
- resolution: {integrity: sha512-9w5XhD0KPOrm92OTTE0SysH3sYzHsSTHNvZgUBo/VZ80VdYyB5RneDbc0dKpURS24IxkoFRu/hI0i4XyfFwY6g==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
+ '@rolldown/binding-win32-arm64-msvc@1.2.8':
+ resolution: {integrity: sha512-xWBkPOF1Q9k/Gv1nQXnVdLxKu74jXppuOM4Z3mnypVUJJJwLsMl7hNJGRAUJoG8A5MgOI1ACKM+wBFxSJzKy4A==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [win32]
+
+ '@rolldown/binding-win32-x64-msvc@1.2.8':
+ resolution: {integrity: sha512-uz2ZvfgXbxqNwijjjbxrnvALwpyODDcgc1T1N8N3rf/DXKQmaFwmB4LX4yyjggpwN2obdQLb2rgirX5ffCWYng==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [win32]
- '@radix-ui/react-roving-focus@1.1.10':
- resolution: {integrity: sha512-dT9aOXUen9JSsxnMPv/0VqySQf5eDQ6LCk5Sw28kamz8wSOW2bJdlX2Bg5VUIIcV+6XlHpWTIuTPCf/UNIyq8Q==}
+ '@rolldown/pluginutils@1.0.1':
+ resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==}
+
+ '@rtsao/scc@1.1.0':
+ resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==}
+
+ '@stylistic/eslint-plugin@5.10.0':
+ resolution: {integrity: sha512-nPK52ZHvot8Ju/0A4ucSX1dcPV2/1clx0kLcH5wDmrE4naKso7TUC/voUyU1O9OTKTrR6MYip6LP0ogEMQ9jPQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
+ eslint: ^9.0.0 || ^10.0.0
+
+ '@swc/helpers@0.5.23':
+ resolution: {integrity: sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==}
+
+ '@tailwindcss/node@4.3.3':
+ resolution: {integrity: sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==}
+
+ '@tailwindcss/oxide-android-arm64@4.3.3':
+ resolution: {integrity: sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==}
+ engines: {node: '>= 20'}
+ cpu: [arm64]
+ os: [android]
+
+ '@tailwindcss/oxide-darwin-arm64@4.3.3':
+ resolution: {integrity: sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==}
+ engines: {node: '>= 20'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@tailwindcss/oxide-darwin-x64@4.3.3':
+ resolution: {integrity: sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw==}
+ engines: {node: '>= 20'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@tailwindcss/oxide-freebsd-x64@4.3.3':
+ resolution: {integrity: sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw==}
+ engines: {node: '>= 20'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3':
+ resolution: {integrity: sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ==}
+ engines: {node: '>= 20'}
+ cpu: [arm]
+ os: [linux]
+
+ '@tailwindcss/oxide-linux-arm64-gnu@4.3.3':
+ resolution: {integrity: sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w==}
+ engines: {node: '>= 20'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
+ '@tailwindcss/oxide-linux-arm64-musl@4.3.3':
+ resolution: {integrity: sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==}
+ engines: {node: '>= 20'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
+ '@tailwindcss/oxide-linux-x64-gnu@4.3.3':
+ resolution: {integrity: sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==}
+ engines: {node: '>= 20'}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
+ '@tailwindcss/oxide-linux-x64-musl@4.3.3':
+ resolution: {integrity: sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==}
+ engines: {node: '>= 20'}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
+ '@tailwindcss/oxide-wasm32-wasi@4.3.3':
+ resolution: {integrity: sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==}
+ engines: {node: '>=14.0.0'}
+ cpu: [wasm32]
+ bundledDependencies:
+ - '@napi-rs/wasm-runtime'
+ - '@emnapi/core'
+ - '@emnapi/runtime'
+ - '@tybys/wasm-util'
+ - '@emnapi/wasi-threads'
+ - tslib
+
+ '@tailwindcss/oxide-win32-arm64-msvc@4.3.3':
+ resolution: {integrity: sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ==}
+ engines: {node: '>= 20'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@tailwindcss/oxide-win32-x64-msvc@4.3.3':
+ resolution: {integrity: sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw==}
+ engines: {node: '>= 20'}
+ cpu: [x64]
+ os: [win32]
+
+ '@tailwindcss/oxide@4.3.3':
+ resolution: {integrity: sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==}
+ engines: {node: '>= 20'}
+
+ '@tailwindcss/postcss@4.3.3':
+ resolution: {integrity: sha512-JTSZZGQi1AyKirbLN3azmjVzef92tcX7h+iSqPdaeStyFpGpDlKvvpxeOE8njhbUanbRwr3z8DyzhICWnMtQeg==}
- '@radix-ui/react-slot@1.2.3':
- resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==}
+ '@testing-library/dom@10.4.1':
+ resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==}
+ engines: {node: '>=18'}
+
+ '@testing-library/jest-dom@7.0.1':
+ resolution: {integrity: sha512-oMDTC3oA+6CXSO2JZnvOI7CA6oVub6kij5ggk9ohwye5slmkwxYDXcPOVxgMw/RQlticjtO0C1RZkR97HgrWMw==}
+ engines: {node: '>=22', npm: '>=6', yarn: '>=1'}
peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ '@testing-library/dom': '>=10 <11'
+ vitest: '>= 0.32'
peerDependenciesMeta:
- '@types/react':
+ vitest:
optional: true
- '@radix-ui/react-toggle@1.1.9':
- resolution: {integrity: sha512-ZoFkBBz9zv9GWer7wIjvdRxmh2wyc2oKWw6C6CseWd6/yq1DK/l5lJ+wnsmFwJZbBYqr02mrf8A2q/CVCuM3ZA==}
+ '@testing-library/react@16.3.3':
+ resolution: {integrity: sha512-Uo193NgQbPMz6lrrhtRQQFcMC6Re/ELLFbbuVL30WDlZxlpZf9/lMHTAVxPRLw1q1iu9OJmR1c2BLiENRstdBg==}
+ engines: {node: '>=18'}
peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ '@testing-library/dom': ^10.0.0
+ '@types/react': ^18.0.0 || ^19.0.0
+ '@types/react-dom': ^18.0.0 || ^19.0.0
+ 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
- '@radix-ui/react-use-callback-ref@1.1.1':
- resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==}
+ '@testing-library/user-event@14.6.7':
+ resolution: {integrity: sha512-MPCpX8bxe8zS+JmmTwLp8jd0dy1rAm60Te/SL8JrQM3qvQJcBOs1d7IefJMyZzqM3EWBrDn/LWDt1BCGu4ASfg==}
+ engines: {node: '>=12', npm: '>=6'}
peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
+ '@testing-library/dom': '>=7.21.4'
+
+ '@tybys/wasm-util@0.10.3':
+ resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==}
- '@radix-ui/react-use-controllable-state@1.2.2':
- resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==}
+ '@types/aria-query@5.0.4':
+ resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==}
+
+ '@types/chai@5.2.3':
+ resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==}
+
+ '@types/deep-eql@4.0.2':
+ resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==}
+
+ '@types/estree@1.0.9':
+ resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==}
+
+ '@types/json-schema@7.0.15':
+ resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
+
+ '@types/json5@0.0.29':
+ resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
+
+ '@types/node@24.13.4':
+ resolution: {integrity: sha512-YJ7EqCstVTzIr0fMr7qul/977en+pQHrfmuKIo6Zr9i75Be21dr3MovcfvGtyvi2HAUrRerWps5sMO9I7WaxDw==}
+
+ '@types/papaparse@5.5.2':
+ resolution: {integrity: sha512-gFnFp/JMzLHCwRf7tQHrNnfhN4eYBVYYI897CGX4MY1tzY9l2aLkVyx2IlKZ/SAqDbB3I1AOZW5gTMGGsqWliA==}
+
+ '@types/react-dom@19.3.0':
+ resolution: {integrity: sha512-ZI7bU42mZXXKHn/qNLEw2IrbiINU7X5+vfgdixBHkCNpYWXjKgfQ/P+uyGb5CjOLB9UcnTeg3rylQtV2hym44Q==}
peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
+ '@types/react': ^19.3.0
+
+ '@types/react@19.3.0':
+ resolution: {integrity: sha512-N0rFCuH9YoxG9/m61l9MfpJKfmLOVU0em7ipIz6TRgSSkvReLB9vL85GB+yr8Bs5leqpvg96JSwF4ZS1s4viQg==}
- '@radix-ui/react-use-effect-event@0.0.2':
- resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==}
+ '@typescript-eslint/eslint-plugin@8.70.0':
+ resolution: {integrity: sha512-/v8HZt6RlyIZxB3ntehELOcUcfxKPVGWXnQdJuHRmzrqgF8nQypcC/oxGW+Ot4VGKDq81XugPKxx0n5PBtf9PA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
+ '@typescript-eslint/parser': ^8.70.0
+ eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
+ typescript: '>=4.8.4 <6.1.0'
- '@radix-ui/react-use-escape-keydown@1.1.1':
- resolution: {integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==}
+ '@typescript-eslint/parser@8.70.0':
+ resolution: {integrity: sha512-zYvrmj9Yxd63UGaXw+kdt6A0F0s0qveJyuatIM77bYC2DE4pgmg7a50u8LR7PRtXd0x+h+Tl3eXabGm06SWd3Q==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
+ eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
+ typescript: '>=4.8.4 <6.1.0'
- '@radix-ui/react-use-layout-effect@1.1.1':
- resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==}
+ '@typescript-eslint/project-service@8.70.0':
+ resolution: {integrity: sha512-hFHbTNqhU9G+2eKFXCBVb1tjFT/LceiJ4+HfLO4pTpDI0KHi6iajpcFFkaSQ9gXmCh7n82A0PthaayEdN6mspQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
+ typescript: '>=4.8.4 <6.1.0'
+
+ '@typescript-eslint/scope-manager@8.70.0':
+ resolution: {integrity: sha512-8nP3Kwh5hlgZ4FicGvmznAmJe8UL4sdU8tLukrPaMuQmDuk4Y8xYfzu/aYZW4xT2JCgc7H/TpDI5cGlxcWJSqQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@radix-ui/react-use-previous@1.1.1':
- resolution: {integrity: sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==}
+ '@typescript-eslint/tsconfig-utils@8.70.0':
+ resolution: {integrity: sha512-adnkeeNq9Sq1sUf4+FRVc0KdgYghzsgFpZSQVZVvY0LCuUuN0FnQgyGzCJeC4fW1cdXseBAjU2EOqUIjbNcZUw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
+ typescript: '>=4.8.4 <6.1.0'
- '@radix-ui/react-use-size@1.1.1':
- resolution: {integrity: sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==}
+ '@typescript-eslint/type-utils@8.70.0':
+ resolution: {integrity: sha512-NUMKIhYVaVIVLnRL9CRt+VVcuLgSHUCpXn4/+K8wql+vdInUzvx8BjUO1oJ7cG9shjFJKtF8F8Hh2kCh3/KBVw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
+ eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
+ typescript: '>=4.8.4 <6.1.0'
- '@rushstack/eslint-patch@1.7.2':
- resolution: {integrity: sha512-RbhOOTCNoCrbfkRyoXODZp75MlpiHMgbE5MEBZAnnnLyQNgrigEj4p0lzsMDyc1zVsJDLrivB58tgg3emX0eEA==}
+ '@typescript-eslint/types@8.70.0':
+ resolution: {integrity: sha512-asTOIYhDg4zdzOScCyaytrsV3cR6B4ecPQlXw/dJIm7J/MZTtCtfVII9JD8Geh4jTCrK/Xe6cg5UevoleMcoJQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@sideway/address@4.1.5':
- resolution: {integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==}
+ '@typescript-eslint/typescript-estree@8.70.0':
+ resolution: {integrity: sha512-d9NmHMPEKQ7QCLLm1jI3zmoQBwT5KwFYjXBJ9ymZfKCUU+5rmTRykKAFvH5Qn/ZCds3CEAFS9OC9M/jkl0X2bA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ typescript: '>=4.8.4 <6.1.0'
- '@sideway/formula@3.0.1':
- resolution: {integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==}
+ '@typescript-eslint/utils@8.70.0':
+ resolution: {integrity: sha512-oZmtKJz/4fufZ2p3+Cn3ijEojcdfR+1zYDH2xKYrEly0dR/Q/1xUPRCOlKGxod78nWlU2UnDe09GZ3TaknBFGA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
+ typescript: '>=4.8.4 <6.1.0'
- '@sideway/pinpoint@2.0.0':
- resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==}
+ '@typescript-eslint/visitor-keys@8.70.0':
+ resolution: {integrity: sha512-BoC8PiO4Hkdo0TVJh9Ntxr5MxPDI7/oFsrygN5ADelFSeXG/qgNuucIGA+L5Z6JpPTE/uRfcTWtscjbUaufepQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@sinclair/typebox@0.25.21':
- resolution: {integrity: sha512-gFukHN4t8K4+wVC+ECqeqwzBDeFeTzBXroBTqE6vcWrQGbEUpHO7LYdG0f4xnvYq4VOEwITSlHlp0JBAIFMS/g==}
+ '@typescript/typescript-aix-ppc64@7.0.2':
+ resolution: {integrity: sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==}
+ engines: {node: '>=16.20.0'}
+ cpu: [ppc64]
+ os: [aix]
- '@sinclair/typebox@0.27.8':
- resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==}
+ '@typescript/typescript-darwin-arm64@7.0.2':
+ resolution: {integrity: sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA==}
+ engines: {node: '>=16.20.0'}
+ cpu: [arm64]
+ os: [darwin]
- '@sinonjs/commons@2.0.0':
- resolution: {integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==}
+ '@typescript/typescript-darwin-x64@7.0.2':
+ resolution: {integrity: sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA==}
+ engines: {node: '>=16.20.0'}
+ cpu: [x64]
+ os: [darwin]
- '@sinonjs/fake-timers@10.0.2':
- resolution: {integrity: sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==}
+ '@typescript/typescript-freebsd-arm64@7.0.2':
+ resolution: {integrity: sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ==}
+ engines: {node: '>=16.20.0'}
+ cpu: [arm64]
+ os: [freebsd]
- '@swc/helpers@0.5.15':
- resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==}
+ '@typescript/typescript-freebsd-x64@7.0.2':
+ resolution: {integrity: sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw==}
+ engines: {node: '>=16.20.0'}
+ cpu: [x64]
+ os: [freebsd]
- '@testing-library/dom@9.3.4':
- resolution: {integrity: sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==}
- engines: {node: '>=14'}
+ '@typescript/typescript-linux-arm64@7.0.2':
+ resolution: {integrity: sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ==}
+ engines: {node: '>=16.20.0'}
+ cpu: [arm64]
+ os: [linux]
- '@testing-library/jest-dom@6.4.2':
- resolution: {integrity: sha512-CzqH0AFymEMG48CpzXFriYYkOjk6ZGPCLMhW9e9jg3KMCn5OfJecF8GtGW7yGfR/IgCe3SX8BSwjdzI6BBbZLw==}
- engines: {node: '>=14', npm: '>=6', yarn: '>=1'}
- peerDependencies:
- '@jest/globals': '>= 28'
- '@types/bun': latest
- '@types/jest': '>= 28'
- jest: '>= 28'
- vitest: '>= 0.32'
- peerDependenciesMeta:
- '@jest/globals':
- optional: true
- '@types/bun':
- optional: true
- '@types/jest':
- optional: true
- jest:
- optional: true
- vitest:
- optional: true
+ '@typescript/typescript-linux-arm@7.0.2':
+ resolution: {integrity: sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ==}
+ engines: {node: '>=16.20.0'}
+ cpu: [arm]
+ os: [linux]
- '@testing-library/react@14.2.1':
- resolution: {integrity: sha512-sGdjws32ai5TLerhvzThYFbpnF9XtL65Cjf+gB0Dhr29BGqK+mAeN7SURSdu+eqgET4ANcWoC7FQpkaiGvBr+A==}
- engines: {node: '>=14'}
- peerDependencies:
- react: ^18.0.0
- react-dom: ^18.0.0
+ '@typescript/typescript-linux-loong64@7.0.2':
+ resolution: {integrity: sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ==}
+ engines: {node: '>=16.20.0'}
+ cpu: [loong64]
+ os: [linux]
+
+ '@typescript/typescript-linux-mips64el@7.0.2':
+ resolution: {integrity: sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA==}
+ engines: {node: '>=16.20.0'}
+ cpu: [mips64el]
+ os: [linux]
- '@types/aria-query@5.0.1':
- resolution: {integrity: sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q==}
+ '@typescript/typescript-linux-ppc64@7.0.2':
+ resolution: {integrity: sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA==}
+ engines: {node: '>=16.20.0'}
+ cpu: [ppc64]
+ os: [linux]
- '@types/babel__core@7.20.0':
- resolution: {integrity: sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==}
+ '@typescript/typescript-linux-riscv64@7.0.2':
+ resolution: {integrity: sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ==}
+ engines: {node: '>=16.20.0'}
+ cpu: [riscv64]
+ os: [linux]
- '@types/babel__generator@7.6.4':
- resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==}
+ '@typescript/typescript-linux-s390x@7.0.2':
+ resolution: {integrity: sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw==}
+ engines: {node: '>=16.20.0'}
+ cpu: [s390x]
+ os: [linux]
- '@types/babel__template@7.4.1':
- resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==}
+ '@typescript/typescript-linux-x64@7.0.2':
+ resolution: {integrity: sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A==}
+ engines: {node: '>=16.20.0'}
+ cpu: [x64]
+ os: [linux]
- '@types/babel__traverse@7.18.3':
- resolution: {integrity: sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==}
+ '@typescript/typescript-netbsd-arm64@7.0.2':
+ resolution: {integrity: sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA==}
+ engines: {node: '>=16.20.0'}
+ cpu: [arm64]
+ os: [netbsd]
- '@types/graceful-fs@4.1.6':
- resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==}
+ '@typescript/typescript-netbsd-x64@7.0.2':
+ resolution: {integrity: sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA==}
+ engines: {node: '>=16.20.0'}
+ cpu: [x64]
+ os: [netbsd]
- '@types/istanbul-lib-coverage@2.0.4':
- resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==}
+ '@typescript/typescript-openbsd-arm64@7.0.2':
+ resolution: {integrity: sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ==}
+ engines: {node: '>=16.20.0'}
+ cpu: [arm64]
+ os: [openbsd]
- '@types/istanbul-lib-report@3.0.0':
- resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==}
+ '@typescript/typescript-openbsd-x64@7.0.2':
+ resolution: {integrity: sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg==}
+ engines: {node: '>=16.20.0'}
+ cpu: [x64]
+ os: [openbsd]
- '@types/istanbul-reports@3.0.1':
- resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==}
+ '@typescript/typescript-sunos-x64@7.0.2':
+ resolution: {integrity: sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g==}
+ engines: {node: '>=16.20.0'}
+ cpu: [x64]
+ os: [sunos]
- '@types/jest@29.5.12':
- resolution: {integrity: sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==}
+ '@typescript/typescript-win32-arm64@7.0.2':
+ resolution: {integrity: sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ==}
+ engines: {node: '>=16.20.0'}
+ cpu: [arm64]
+ os: [win32]
- '@types/json-schema@7.0.11':
- resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==}
+ '@typescript/typescript-win32-x64@7.0.2':
+ resolution: {integrity: sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g==}
+ engines: {node: '>=16.20.0'}
+ cpu: [x64]
+ os: [win32]
- '@types/json-schema@7.0.15':
- resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
+ '@typescript/typescript6@6.0.2':
+ resolution: {integrity: sha512-mbCddXd+jm7hfx7w2YU64/Av4/NqqeG3GoRZgxPcgoTxYjhrcfJRw9ULch71SS4G+Q3bOXFhRvPqjguN0Hyp5w==}
+ hasBin: true
- '@types/json5@0.0.29':
- resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
+ '@unrs/resolver-binding-android-arm-eabi@1.12.2':
+ resolution: {integrity: sha512-g5T90pqg1bo/7mytQx6F4iBNC0Wsh9cu+z9veDbFjc7HjpesJFWD7QMS0NGStXM075+7dJPPVvBbpZlnrdpi/w==}
+ cpu: [arm]
+ os: [android]
- '@types/node@22.15.29':
- resolution: {integrity: sha512-LNdjOkUDlU1RZb8e1kOIUpN1qQUlzGkEtbVNo53vbrwDg5om6oduhm4SiUaPW5ASTXhAiP0jInWG8Qx9fVlOeQ==}
+ '@unrs/resolver-binding-android-arm64@1.12.2':
+ resolution: {integrity: sha512-YGCRZv/9GLhwmz6mYDeTsm/92BAyR28l6c2ReweVW5pWgfsitWLY8upvfRlGdoyD8HjeTHSYJWyZGD4KJA/nFQ==}
+ cpu: [arm64]
+ os: [android]
- '@types/normalize-package-data@2.4.1':
- resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==}
+ '@unrs/resolver-binding-darwin-arm64@1.12.2':
+ resolution: {integrity: sha512-u9DiNT1auQMO20A9SyTuG3wUgQWB9Z7KjAg0uFuCDR1FsAY8A0CG2S6JpHS1xwm/w1G08bjXZDcyOCjv1WAm2w==}
+ cpu: [arm64]
+ os: [darwin]
- '@types/papaparse@5.3.16':
- resolution: {integrity: sha512-T3VuKMC2H0lgsjI9buTB3uuKj3EMD2eap1MOuEQuBQ44EnDx/IkGhU6EwiTf9zG3za4SKlmwKAImdDKdNnCsXg==}
+ '@unrs/resolver-binding-darwin-x64@1.12.2':
+ resolution: {integrity: sha512-f7rPLi/T1HVKZu/u6t87lroib16n8vrSzcyxI7lg4BGO9UF26KhQL44sd9eOUgrTYhvRXtWOIZT5PejdPyJfUA==}
+ cpu: [x64]
+ os: [darwin]
- '@types/prop-types@15.7.5':
- resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==}
+ '@unrs/resolver-binding-freebsd-x64@1.12.2':
+ resolution: {integrity: sha512-BpcOjWCJub6nRZUS2zA20pmLvjtqAtGejETaIyRLiZiQf++cbrjltLA5NN/xaXfqeOBOSlMFbemIl5/S5tljmg==}
+ cpu: [x64]
+ os: [freebsd]
- '@types/react-dom@18.3.7':
- resolution: {integrity: sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==}
- peerDependencies:
- '@types/react': ^18.0.0
+ '@unrs/resolver-binding-linux-arm-gnueabihf@1.12.2':
+ resolution: {integrity: sha512-vZTDvdSISZjJx66OzJqtsOhzifbqRjbmI1Mnu49fQDwog5GtDI4QidRiEAYbZCRj9C8YZEW+3ZjqsyS9GR4k2A==}
+ cpu: [arm]
+ os: [linux]
- '@types/react@18.3.23':
- resolution: {integrity: sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==}
+ '@unrs/resolver-binding-linux-arm-musleabihf@1.12.2':
+ resolution: {integrity: sha512-BiPI+IrIlwcW4nLLMM21+B1dFPzd55yAVgVGrdgDjNef+ch03GdxrcyaIz8X9SsQirh/kCQ7mviyWlMxdh2D7g==}
+ cpu: [arm]
+ os: [linux]
- '@types/semver@7.3.13':
- resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==}
+ '@unrs/resolver-binding-linux-arm64-gnu@1.12.2':
+ resolution: {integrity: sha512-zJc0H99FEPoFfSrNpa91HYfxzfAJCr502oxNK1cfdC9hlaFI43RT+JFCann9JUgZmLzzntChHyn13Sgn9ljHNg==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
- '@types/semver@7.5.7':
- resolution: {integrity: sha512-/wdoPq1QqkSj9/QOeKkFquEuPzQbHTWAMPH/PaUMB+JuR31lXhlWXRZ52IpfDYVlDOUBvX09uBrPwxGT1hjNBg==}
+ '@unrs/resolver-binding-linux-arm64-musl@1.12.2':
+ resolution: {integrity: sha512-KQ3Lki6l+Pz1k/eBipN41ES+YUK30beLGb9YqcB1O542cyLCNE6GaxrfcY3T6EezmGGk84wb5XyO9loTM9tkcA==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
- '@types/sinonjs__fake-timers@8.1.1':
- resolution: {integrity: sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==}
+ '@unrs/resolver-binding-linux-loong64-gnu@1.12.2':
+ resolution: {integrity: sha512-3SJGEh1DborhG6pyxvhPzCT4bbSIVihsvgJc13P1bHG7KLdNDaF9T3gsTwFc7Jw/5Y5/iWOjkEx7Zy0NvCGX3Q==}
+ cpu: [loong64]
+ os: [linux]
+ libc: [glibc]
- '@types/sizzle@2.3.3':
- resolution: {integrity: sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==}
+ '@unrs/resolver-binding-linux-loong64-musl@1.12.2':
+ resolution: {integrity: sha512-jiuG/Obbel7uw1PwHNFfrkiKhLAF6mnyZ6aWlOAVN9WqKm8v0OFGnciJIHu8+CMvXLQ8AD51LPzAoUfT21D5Ew==}
+ cpu: [loong64]
+ os: [linux]
+ libc: [musl]
- '@types/stack-utils@2.0.1':
- resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==}
+ '@unrs/resolver-binding-linux-ppc64-gnu@1.12.2':
+ resolution: {integrity: sha512-q7xRvVpmcfeL+LlZg8Pbbo6QaTZwDU5BaGZbwfhkEsXJn3Was8xYfE0RBH266xZt0rM6B7i8xAYIvjthuUIWHg==}
+ cpu: [ppc64]
+ os: [linux]
+ libc: [glibc]
- '@types/yargs-parser@21.0.0':
- resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==}
+ '@unrs/resolver-binding-linux-riscv64-gnu@1.12.2':
+ resolution: {integrity: sha512-0CVdx6lcnT3Q9inOH8tsMIOJ6ImndllMjqJHg8RLVdB7Vq4SfkEXl9mCSsVNuNA4MCYycRicCUxPCabVHJRr6A==}
+ cpu: [riscv64]
+ os: [linux]
+ libc: [glibc]
- '@types/yargs@17.0.22':
- resolution: {integrity: sha512-pet5WJ9U8yPVRhkwuEIp5ktAeAqRZOq4UdAyWLWzxbtpyXnzbtLdKiXAjJzi/KLmPGS9wk86lUFWZFN6sISo4g==}
+ '@unrs/resolver-binding-linux-riscv64-musl@1.12.2':
+ resolution: {integrity: sha512-iOwlRo9vnp6R6ohHQS11n0NnfdXx/omhkocmIfaPRpQhKZ+3BDMkkdRVh53qjkFkpPddf+FETA28NwGN7l5l+w==}
+ cpu: [riscv64]
+ os: [linux]
+ libc: [musl]
- '@types/yauzl@2.10.0':
- resolution: {integrity: sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==}
+ '@unrs/resolver-binding-linux-s390x-gnu@1.12.2':
+ resolution: {integrity: sha512-HYJtLfXq94q8iZNFT1lknx258wlkkWhZeUXJRqzKBBUJ00CvZ+N33zgbCqimLjsyw5Va6uUxhVa12mI+kaveEw==}
+ cpu: [s390x]
+ os: [linux]
+ libc: [glibc]
- '@typescript-eslint/eslint-plugin@5.51.0':
- resolution: {integrity: sha512-wcAwhEWm1RgNd7dxD/o+nnLW8oH+6RK1OGnmbmkj/GGoDPV1WWMVP0FXYQBivKHdwM1pwii3bt//RC62EriIUQ==}
- 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
+ '@unrs/resolver-binding-linux-x64-gnu@1.12.2':
+ resolution: {integrity: sha512-mPsUhunKKDih5O96Y6enDQyHc1SqBPlY1E/SfMWDM3EdJ95Z9CArPeCVwCCqbP45ljvivdEk8Fxn+SIb1rDAJQ==}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
- '@typescript-eslint/eslint-plugin@7.18.0':
- resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==}
- engines: {node: ^18.18.0 || >=20.0.0}
- peerDependencies:
- '@typescript-eslint/parser': ^7.0.0
- eslint: ^8.56.0
- typescript: '*'
- peerDependenciesMeta:
- typescript:
- optional: true
+ '@unrs/resolver-binding-linux-x64-musl@1.12.2':
+ resolution: {integrity: sha512-azrt6+5ydLd8Vt210AAFis/lZevSfPw93EJRIJG+xPu4WCJ8K0kppCTpMyLPcKT7H15M4Jnt2tMp5bOvCkRC6A==}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
- '@typescript-eslint/parser@5.51.0':
- resolution: {integrity: sha512-fEV0R9gGmfpDeRzJXn+fGQKcl0inIeYobmmUWijZh9zA7bxJ8clPhV9up2ZQzATxAiFAECqPQyMDB4o4B81AaA==}
- 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
+ '@unrs/resolver-binding-openharmony-arm64@1.12.2':
+ resolution: {integrity: sha512-YZ9hP4O0X9PQb8eO980qmLNGH4zT3I9+SZTdt0Pr0YyuGQhYKoOZkV02VzrzyOZJ5xIJ3UFIenKkUkGg8GjgWQ==}
+ cpu: [arm64]
+ os: [openharmony]
- '@typescript-eslint/parser@7.18.0':
- resolution: {integrity: sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==}
- engines: {node: ^18.18.0 || >=20.0.0}
- peerDependencies:
- eslint: ^8.56.0
- typescript: '*'
- peerDependenciesMeta:
- typescript:
- optional: true
+ '@unrs/resolver-binding-wasm32-wasi@1.12.2':
+ resolution: {integrity: sha512-tYFDIkMxSflfEc/h92ZWNsZlHSwgimbNHSO3PL2JWQHfCuC2q316jMyYU9TIWZsFK2bQwyK5VAdYgn8ygPj69A==}
+ engines: {node: '>=14.0.0'}
+ cpu: [wasm32]
- '@typescript-eslint/scope-manager@5.51.0':
- resolution: {integrity: sha512-gNpxRdlx5qw3yaHA0SFuTjW4rxeYhpHxt491PEcKF8Z6zpq0kMhe0Tolxt0qjlojS+/wArSDlj/LtE69xUJphQ==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ '@unrs/resolver-binding-win32-arm64-msvc@1.12.2':
+ resolution: {integrity: sha512-qzNyg3xL0VPQmCaUh+N5jSitce6k+uCBfMDesWRnlULOZaqUkaJ0ybdT+UqlAWJoQjuqfIU/0Ptx9bteN4D82g==}
+ cpu: [arm64]
+ os: [win32]
- '@typescript-eslint/scope-manager@5.59.1':
- resolution: {integrity: sha512-mau0waO5frJctPuAzcxiNWqJR5Z8V0190FTSqRw1Q4Euop6+zTwHAf8YIXNwDOT29tyUDrQ65jSg9aTU/H0omA==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ '@unrs/resolver-binding-win32-ia32-msvc@1.12.2':
+ resolution: {integrity: sha512-WD9sY00OfpHVGfsnHZoA8jVT+esS/Bg8z8jzxp5BnDCjjwsuKsPQrzswwpFy4J1AUJbXPRfkpcX0mXrzeXW79g==}
+ cpu: [ia32]
+ os: [win32]
- '@typescript-eslint/scope-manager@7.18.0':
- resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==}
- engines: {node: ^18.18.0 || >=20.0.0}
+ '@unrs/resolver-binding-win32-x64-msvc@1.12.2':
+ resolution: {integrity: sha512-nAB74NfSNKknqQ1RrYj6uz8FcXEomu/MATJZxh/x+BArzN2U3JbOYC0APYzUIGhVY3m5hRxA8VPNdPBoG8txlA==}
+ cpu: [x64]
+ os: [win32]
- '@typescript-eslint/type-utils@5.51.0':
- resolution: {integrity: sha512-QHC5KKyfV8sNSyHqfNa0UbTbJ6caB8uhcx2hYcWVvJAZYJRBo5HyyZfzMdRx8nvS+GyMg56fugMzzWnojREuQQ==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ '@vitejs/plugin-react@6.1.1':
+ resolution: {integrity: sha512-yxLaQV9gkhS8ezJqCM6+ndU7mDY6gqAg75NQ+0IjwEI8IYOmQCgkRwHKVSfWXW076DsqMo0Dk+0FK1U+M5RgFw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
peerDependencies:
- eslint: '*'
- typescript: '*'
+ '@rolldown/plugin-babel': ^0.1.7 || ^0.2.0
+ babel-plugin-react-compiler: ^1.0.0
+ oxc-transform-react: ^0.145.0
+ vite: ^8.0.0
peerDependenciesMeta:
- typescript:
+ '@rolldown/plugin-babel':
+ optional: true
+ babel-plugin-react-compiler:
+ optional: true
+ oxc-transform-react:
optional: true
- '@typescript-eslint/type-utils@7.18.0':
- resolution: {integrity: sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==}
- engines: {node: ^18.18.0 || >=20.0.0}
+ '@vitest/coverage-v8@5.0.0':
+ resolution: {integrity: sha512-toMg6PZGCIa/lQNCDoASrfb1ly4hsUKXFtFYC9kD4t78o5Y6LyNJU7AENt8eHPr3quYdxaxK7hj2mnbFfUk9NA==}
peerDependencies:
- eslint: ^8.56.0
- typescript: '*'
+ '@vitest/browser': 5.0.0
+ vitest: 5.0.0
peerDependenciesMeta:
- typescript:
+ '@vitest/browser':
optional: true
- '@typescript-eslint/types@5.51.0':
- resolution: {integrity: sha512-SqOn0ANn/v6hFn0kjvLwiDi4AzR++CBZz0NV5AnusT2/3y32jdc0G4woXPWHCumWtUXZKPAS27/9vziSsC9jnw==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
-
- '@typescript-eslint/types@5.59.1':
- resolution: {integrity: sha512-dg0ICB+RZwHlysIy/Dh1SP+gnXNzwd/KS0JprD3Lmgmdq+dJAJnUPe1gNG34p0U19HvRlGX733d/KqscrGC1Pg==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ '@vitest/istanbul-lib-coverage@1.0.1':
+ resolution: {integrity: sha512-k3DJZ8LhMBK9NS4SclF1ASD3OgXEWDorbIcPTRDK0/Zae6fRvu+fJRxtFdLfHsa9Y24beCdPnoNZ4LviTNstfA==}
+ engines: {node: '>=22'}
- '@typescript-eslint/types@7.18.0':
- resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==}
- engines: {node: ^18.18.0 || >=20.0.0}
+ '@vitest/istanbul-lib-report@1.0.1':
+ resolution: {integrity: sha512-1EOLRfsTMnyAr3+kEAsP4o9dhaDlGPpD7H5iLBBeq//YpNB1VIahkPhB+eRp9N2Dkfw8oySROjE3yf9XDeaIkQ==}
+ engines: {node: '>=22'}
- '@typescript-eslint/typescript-estree@5.51.0':
- resolution: {integrity: sha512-TSkNupHvNRkoH9FMA3w7TazVFcBPveAAmb7Sz+kArY6sLT86PA5Vx80cKlYmd8m3Ha2SwofM1KwraF24lM9FvA==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ '@vitest/mocker@5.0.0':
+ resolution: {integrity: sha512-66PGTMIiVJP3t4a5yxU9qPtf7MdTBs8jmToMvy+HVflB3Yy13WJZTtPePdvU+wjRV02SKK5doLbSA6o9pwOmiA==}
peerDependencies:
- typescript: '*'
+ msw: ^2.4.9
+ vite: ^6.0.0 || ^7.0.0 || ^8.0.0
peerDependenciesMeta:
- typescript:
+ msw:
optional: true
-
- '@typescript-eslint/typescript-estree@5.59.1':
- resolution: {integrity: sha512-lYLBBOCsFltFy7XVqzX0Ju+Lh3WPIAWxYpmH/Q7ZoqzbscLiCW00LeYCdsUnnfnj29/s1WovXKh2gwCoinHNGA==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- peerDependencies:
- typescript: '*'
- peerDependenciesMeta:
- typescript:
+ vite:
optional: true
- '@typescript-eslint/typescript-estree@7.18.0':
- resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==}
- engines: {node: ^18.18.0 || >=20.0.0}
- peerDependencies:
- typescript: '*'
- peerDependenciesMeta:
- typescript:
- optional: true
-
- '@typescript-eslint/utils@5.51.0':
- resolution: {integrity: sha512-76qs+5KWcaatmwtwsDJvBk4H76RJQBFe+Gext0EfJdC3Vd2kpY2Pf//OHHzHp84Ciw0/rYoGTDnIAr3uWhhJYw==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- peerDependencies:
- eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
-
- '@typescript-eslint/utils@5.59.1':
- resolution: {integrity: sha512-MkTe7FE+K1/GxZkP5gRj3rCztg45bEhsd8HYjczBuYm+qFHP5vtZmjx3B0yUCDotceQ4sHgTyz60Ycl225njmA==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- peerDependencies:
- eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
-
- '@typescript-eslint/utils@7.18.0':
- resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==}
- engines: {node: ^18.18.0 || >=20.0.0}
- peerDependencies:
- eslint: ^8.56.0
-
- '@typescript-eslint/visitor-keys@5.51.0':
- resolution: {integrity: sha512-Oh2+eTdjHjOFjKA27sxESlA87YPSOJafGCR0md5oeMdh1ZcCfAGCIOL216uTBAkAIptvLIfKQhl7lHxMJet4GQ==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
-
- '@typescript-eslint/visitor-keys@5.59.1':
- resolution: {integrity: sha512-6waEYwBTCWryx0VJmP7JaM4FpipLsFl9CvYf2foAE8Qh/Y0s+bxWysciwOs0LTBED4JCaNxTZ5rGadB14M6dwA==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
-
- '@typescript-eslint/visitor-keys@7.18.0':
- resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==}
- engines: {node: ^18.18.0 || >=20.0.0}
-
- '@ungap/structured-clone@1.2.0':
- resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==}
-
- '@vercel/style-guide@6.0.0':
- resolution: {integrity: sha512-tu0wFINGz91EPwaT5VjSqUwbvCY9pvLach7SPG4XyfJKPU9Vku2TFa6+AyzJ4oroGbo9fK+TQhIFHrnFl0nCdg==}
- engines: {node: '>=18.18'}
- peerDependencies:
- '@next/eslint-plugin-next': '>=12.3.0 <15.0.0-0'
- eslint: '>=8.48.0 <9'
- prettier: '>=3.0.0 <4'
- typescript: '>=4.8.0 <6'
- peerDependenciesMeta:
- '@next/eslint-plugin-next':
- optional: true
- eslint:
- optional: true
- prettier:
- optional: true
- typescript:
- optional: true
+ '@vitest/spy@5.0.0':
+ resolution: {integrity: sha512-uy+luWBAPw9XfthoHi5AkfHUnuPYEESjl0p/r+meoBnU8bxg5GDQ3Ey8MjcJ6sqahkL4PFyrvfMJJBw7LbU06g==}
acorn-jsx@5.3.2:
resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
peerDependencies:
acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
- acorn@8.11.3:
- resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==}
+ acorn@8.18.0:
+ resolution: {integrity: sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==}
engines: {node: '>=0.4.0'}
hasBin: true
- aggregate-error@3.1.0:
- resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==}
- engines: {node: '>=8'}
-
- ajv@6.12.6:
- resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
-
- ajv@8.12.0:
- resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==}
-
- ansi-colors@4.1.3:
- resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==}
- engines: {node: '>=6'}
-
- ansi-escapes@4.3.2:
- resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==}
- engines: {node: '>=8'}
+ ajv@6.15.0:
+ resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==}
ansi-regex@5.0.1:
resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
engines: {node: '>=8'}
- ansi-styles@3.2.1:
- resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
- engines: {node: '>=4'}
-
ansi-styles@4.3.0:
resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
engines: {node: '>=8'}
@@ -1402,275 +1422,111 @@ packages:
resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==}
engines: {node: '>=10'}
- 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'}
-
- arch@2.2.0:
- resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==}
-
- 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-hidden@1.2.6:
- resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==}
- engines: {node: '>=10'}
-
- aria-query@5.1.3:
- resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==}
+ aria-query@5.3.0:
+ resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==}
aria-query@5.3.2:
resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==}
engines: {node: '>= 0.4'}
- array-buffer-byte-length@1.0.1:
- resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==}
- engines: {node: '>= 0.4'}
-
array-buffer-byte-length@1.0.2:
resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==}
engines: {node: '>= 0.4'}
- array-includes@3.1.6:
- resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==}
- engines: {node: '>= 0.4'}
-
- array-includes@3.1.7:
- resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==}
- engines: {node: '>= 0.4'}
-
- array-includes@3.1.9:
- resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==}
- engines: {node: '>= 0.4'}
-
- array-union@2.1.0:
- resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
- engines: {node: '>=8'}
-
- array.prototype.filter@1.0.3:
- resolution: {integrity: sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==}
+ array-includes@3.2.0:
+ resolution: {integrity: sha512-VXY5eFRarnXcYxwBjJzPmEhH55+rmP79/+ueDhi0F+TuqfHCItagIHqxeUZrmgrOPa31QTh9H85DjX3FfJ0FTg==}
engines: {node: '>= 0.4'}
array.prototype.findlast@1.2.5:
resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==}
engines: {node: '>= 0.4'}
- array.prototype.findlastindex@1.2.4:
- resolution: {integrity: sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ==}
- 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.1:
- resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==}
+ array.prototype.findlastindex@1.2.6:
+ resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==}
engines: {node: '>= 0.4'}
- array.prototype.flatmap@1.3.2:
- resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==}
+ array.prototype.flat@1.3.3:
+ resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==}
engines: {node: '>= 0.4'}
array.prototype.flatmap@1.3.3:
resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==}
engines: {node: '>= 0.4'}
- array.prototype.tosorted@1.1.1:
- resolution: {integrity: sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==}
-
array.prototype.tosorted@1.1.4:
resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==}
engines: {node: '>= 0.4'}
- arraybuffer.prototype.slice@1.0.3:
- resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==}
- engines: {node: '>= 0.4'}
-
arraybuffer.prototype.slice@1.0.4:
resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==}
engines: {node: '>= 0.4'}
- asn1@0.2.6:
- resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==}
-
- assert-plus@1.0.0:
- resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==}
- engines: {node: '>=0.8'}
+ assertion-error@2.0.1:
+ resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==}
+ engines: {node: '>=12'}
ast-types-flow@0.0.8:
resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==}
- astral-regex@2.0.0:
- resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==}
- engines: {node: '>=8'}
-
- async@3.2.4:
- resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==}
-
- asynciterator.prototype@1.0.0:
- resolution: {integrity: sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==}
+ ast-v8-to-istanbul@1.0.6:
+ resolution: {integrity: sha512-fvpl29helSO2w/z7utIbrkNXILdrLwDwAMH2I/zPKlGf5244+gf+B4cyS1sANcrPY2h+hWCGSgC8N61s/+AF9A==}
- asynckit@0.4.0:
- resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
-
- at-least-node@1.0.0:
- resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==}
- engines: {node: '>= 4.0.0'}
-
- autoprefixer@10.4.17:
- resolution: {integrity: sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg==}
- engines: {node: ^10 || ^12 || >=14}
- hasBin: true
- peerDependencies:
- postcss: ^8.1.0
-
- available-typed-arrays@1.0.5:
- resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==}
- engines: {node: '>= 0.4'}
-
- available-typed-arrays@1.0.6:
- resolution: {integrity: sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg==}
+ async-function@1.0.0:
+ resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==}
engines: {node: '>= 0.4'}
available-typed-arrays@1.0.7:
resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
engines: {node: '>= 0.4'}
- aws-sign2@0.7.0:
- resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==}
-
- aws4@1.12.0:
- resolution: {integrity: sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==}
-
- axe-core@4.10.3:
- resolution: {integrity: sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==}
+ axe-core@4.13.0:
+ resolution: {integrity: sha512-UzGt8zg7Ny8djbYMhxl2zuEevVa7r2gJjYY5Lwr1xM7+XU2nd6CkIWFTVcCIbAP63vSz71NaVyyuSk9lHKcy0A==}
engines: {node: '>=4'}
- axios@1.6.7:
- resolution: {integrity: sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==}
-
axobject-query@4.1.0:
resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==}
engines: {node: '>= 0.4'}
- 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-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-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
-
balanced-match@1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
- base64-js@1.5.1:
- resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
-
- bcrypt-pbkdf@1.0.2:
- resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==}
-
- binary-extensions@2.2.0:
- resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
- engines: {node: '>=8'}
+ balanced-match@4.0.4:
+ resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==}
+ engines: {node: 18 || 20 || >=22}
- blob-util@2.0.2:
- resolution: {integrity: sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==}
+ baseline-browser-mapping@2.11.22:
+ resolution: {integrity: sha512-pWc4w51fBFd7mav43/zKRC+RI6f4yfzQoVlfvE8dECePyfkn1bzLp01Fj0QACcyCZyFhiEMyD2qScfKRWgWibA==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
- bluebird@3.7.2:
- resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==}
+ bidi-js@1.1.0:
+ resolution: {integrity: sha512-fX1Onk0tdVPC7obPWB5EbJ1z7NVhLq4m2xZLq2YXBkxzMXIGRpNMU88n0EPgWseKl12J7zXs7qrDxPK4sRs2fg==}
- brace-expansion@1.1.11:
- resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
+ brace-expansion@1.1.18:
+ resolution: {integrity: sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==}
- brace-expansion@2.0.1:
- resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
+ brace-expansion@5.0.9:
+ resolution: {integrity: sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==}
+ engines: {node: 20 || >=22}
- braces@3.0.2:
- resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
+ braces@3.0.3:
+ resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
engines: {node: '>=8'}
- browserslist@4.21.5:
- resolution: {integrity: sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==}
- engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
- hasBin: true
-
- browserslist@4.23.0:
- resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==}
- engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
- hasBin: true
-
- browserslist@4.25.0:
- resolution: {integrity: sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==}
+ browserslist@4.28.9:
+ resolution: {integrity: sha512-EWazOblFYUvlGZcfGhPUPmYh3nikUxBVb+y9MJun5f3hBi812X+8MSQTujLBtgK3cf51fJWbWfOjyeO954d+Eg==}
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
hasBin: true
- bs-logger@0.2.6:
- resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==}
- engines: {node: '>= 6'}
-
- bser@2.1.1:
- resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==}
-
- buffer-crc32@0.2.13:
- resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==}
-
- buffer-from@1.1.2:
- resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
-
- buffer@5.7.1:
- resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
-
- builtin-modules@3.3.0:
- resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==}
- engines: {node: '>=6'}
-
- builtins@5.0.1:
- resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==}
-
- cachedir@2.3.0:
- resolution: {integrity: sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==}
- engines: {node: '>=6'}
-
call-bind-apply-helpers@1.0.2:
resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
engines: {node: '>= 0.4'}
- call-bind@1.0.2:
- resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==}
-
- call-bind@1.0.7:
- resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==}
- engines: {node: '>= 0.4'}
-
- call-bind@1.0.8:
- resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==}
+ call-bind@1.0.9:
+ resolution: {integrity: sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==}
engines: {node: '>= 0.4'}
call-bound@1.0.4:
@@ -1681,188 +1537,65 @@ packages:
resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
engines: {node: '>=6'}
- camelcase-css@2.0.1:
- resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==}
- engines: {node: '>= 6'}
-
- camelcase@5.3.1:
- resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==}
- engines: {node: '>=6'}
-
- camelcase@6.3.0:
- resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
- engines: {node: '>=10'}
-
- caniuse-lite@1.0.30001587:
- resolution: {integrity: sha512-HMFNotUmLXn71BQxg8cijvqxnIAofforZOwGsxyXJ0qugTdspUF4sPSJ2vhgprHCB996tIDzEq1ubumPDV8ULA==}
-
- caniuse-lite@1.0.30001720:
- resolution: {integrity: sha512-Ec/2yV2nNPwb4DnTANEV99ZWwm3ZWfdlfkQbWSDDt+PsXEVYwlhPH8tdMaPunYTKKmz7AnHi2oNEi1GcmKCD8g==}
-
- caseless@0.12.0:
- resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==}
-
- chalk@2.4.2:
- resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
- engines: {node: '>=4'}
+ caniuse-lite@1.0.30001810:
+ resolution: {integrity: sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==}
- chalk@3.0.0:
- resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==}
- engines: {node: '>=8'}
+ chai@6.2.2:
+ resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==}
+ engines: {node: '>=18'}
chalk@4.1.2:
resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
engines: {node: '>=10'}
- char-regex@1.0.2:
- resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==}
- engines: {node: '>=10'}
-
- check-more-types@2.24.0:
- resolution: {integrity: sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==}
- engines: {node: '>= 0.8.0'}
-
- chokidar@3.5.3:
- resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
- engines: {node: '>= 8.10.0'}
-
- ci-info@3.7.1:
- resolution: {integrity: sha512-4jYS4MOAaCIStSRwiuxc4B8MYhIe676yO1sYGzARnjXkWpmzZMMYxY6zu8WYWDhSuth5zhrQ1rhNSibyyvv4/w==}
- engines: {node: '>=8'}
-
- ci-info@4.2.0:
- resolution: {integrity: sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==}
- engines: {node: '>=8'}
-
- cjs-module-lexer@1.2.2:
- resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==}
-
class-variance-authority@0.7.1:
resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==}
- clean-regexp@1.0.0:
- resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==}
- engines: {node: '>=4'}
-
- clean-stack@2.2.0:
- resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==}
- engines: {node: '>=6'}
-
- cli-cursor@3.1.0:
- resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==}
- engines: {node: '>=8'}
-
- cli-table3@0.6.3:
- resolution: {integrity: sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==}
- engines: {node: 10.* || >= 12.*}
-
- cli-truncate@2.1.0:
- resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==}
- engines: {node: '>=8'}
-
client-only@0.0.1:
resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==}
- cliui@8.0.1:
- resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
- engines: {node: '>=12'}
-
clsx@2.1.1:
resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
engines: {node: '>=6'}
- co@4.6.0:
- resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==}
- engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'}
-
- collect-v8-coverage@1.0.1:
- resolution: {integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==}
-
- color-convert@1.9.3:
- resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
+ cn@0.2.6:
+ resolution: {integrity: sha512-+i4L0zUGgRcEnhsxueVrP7iBGxBx5iD0WOTYg1MwFEu2ZyCmH5Ov2V1cul2Ht5UchRQQgftCf4be/RxspuW6QQ==}
+ engines: {node: '>=20'}
+ hasBin: true
color-convert@2.0.1:
resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
engines: {node: '>=7.0.0'}
- color-name@1.1.3:
- resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==}
-
color-name@1.1.4:
resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
- color-string@1.9.1:
- resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==}
-
- color@4.2.3:
- resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==}
- engines: {node: '>=12.5.0'}
-
- colorette@2.0.19:
- resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==}
-
- combined-stream@1.0.8:
- resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
- engines: {node: '>= 0.8'}
-
- commander@4.1.1:
- resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
- engines: {node: '>= 6'}
-
- commander@6.2.1:
- resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==}
- engines: {node: '>= 6'}
-
- common-tags@1.8.2:
- resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==}
- engines: {node: '>=4.0.0'}
-
concat-map@0.0.1:
resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
- convert-source-map@1.9.0:
- resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==}
-
convert-source-map@2.0.0:
resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
- core-js-compat@3.42.0:
- resolution: {integrity: sha512-bQasjMfyDGyaeWKBIu33lHh9qlSR0MFE/Nmc6nMjf/iU9b3rSMdAYz1Baxrv4lPdGUsTqZudHA4jIGSJy0SWZQ==}
-
- core-util-is@1.0.2:
- resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==}
-
- create-jest@29.7.0:
- resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- hasBin: true
-
- cross-spawn@7.0.3:
- resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
+ cross-spawn@7.0.6:
+ resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
engines: {node: '>= 8'}
+ css-tree@3.2.1:
+ resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==}
+ engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0}
+
css.escape@1.5.1:
resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==}
- cssesc@3.0.0:
- resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
- engines: {node: '>=4'}
- hasBin: true
-
- csstype@3.1.1:
- resolution: {integrity: sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==}
-
- cypress@13.6.4:
- resolution: {integrity: sha512-pYJjCfDYB+hoOoZuhysbbYhEmNW7DEDsqn+ToCLwuVowxUXppIWRr7qk4TVRIU471ksfzyZcH+mkoF0CQUKnpw==}
- engines: {node: ^16.0.0 || ^18.0.0 || >=20.0.0}
- hasBin: true
+ csstype@3.2.3:
+ resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==}
damerau-levenshtein@1.0.8:
resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==}
- dashdash@1.14.1:
- resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==}
- engines: {node: '>=0.10'}
+ data-urls@7.0.0:
+ resolution: {integrity: sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==}
+ engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0}
data-view-buffer@1.0.2:
resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==}
@@ -1876,9 +1609,6 @@ packages:
resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==}
engines: {node: '>= 0.4'}
- dayjs@1.11.7:
- resolution: {integrity: sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==}
-
debug@3.2.7:
resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
peerDependencies:
@@ -1887,8 +1617,8 @@ packages:
supports-color:
optional: true
- debug@4.3.4:
- resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
+ debug@4.4.3:
+ resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
engines: {node: '>=6.0'}
peerDependencies:
supports-color: '*'
@@ -1896,85 +1626,32 @@ packages:
supports-color:
optional: true
- dedent@1.5.1:
- resolution: {integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==}
- peerDependencies:
- babel-plugin-macros: ^3.1.0
- peerDependenciesMeta:
- babel-plugin-macros:
- optional: true
-
- deep-equal@2.2.0:
- resolution: {integrity: sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==}
+ decimal.js@10.6.0:
+ resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==}
deep-is@0.1.4:
resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
- deepmerge@4.3.0:
- resolution: {integrity: sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==}
- engines: {node: '>=0.10.0'}
-
define-data-property@1.1.4:
resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
engines: {node: '>= 0.4'}
- define-properties@1.2.0:
- resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==}
- engines: {node: '>= 0.4'}
-
define-properties@1.2.1:
resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
engines: {node: '>= 0.4'}
- delayed-stream@1.0.0:
- resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
- engines: {node: '>=0.4.0'}
-
- detect-indent@7.0.1:
- resolution: {integrity: sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g==}
- engines: {node: '>=12.20'}
-
- detect-libc@2.0.4:
- resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==}
- engines: {node: '>=8'}
-
- detect-newline@3.1.0:
- resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==}
- engines: {node: '>=8'}
-
- detect-newline@4.0.1:
- resolution: {integrity: sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==}
- engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
-
- detect-node-es@1.1.0:
- resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==}
-
- didyoumean@1.2.2:
- resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
-
- diff-sequences@29.4.2:
- resolution: {integrity: sha512-R6P0Y6PrsH3n4hUXxL3nns0rbRk6Q33js3ygJBeEpbzLzgcNuJ61+u0RXasFpTKISw99TxUzFnumSnRLsjhLaw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- diff-sequences@29.6.3:
- resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dequal@2.0.3:
+ resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
+ engines: {node: '>=6'}
- dir-glob@3.0.1:
- resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
+ detect-libc@2.1.2:
+ resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
engines: {node: '>=8'}
- dlv@1.1.3:
- resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
-
doctrine@2.1.0:
resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==}
engines: {node: '>=0.10.0'}
- doctrine@3.0.0:
- resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
- engines: {node: '>=6.0.0'}
-
dom-accessibility-api@0.5.16:
resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==}
@@ -1985,59 +1662,26 @@ packages:
resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
engines: {node: '>= 0.4'}
- ecc-jsbn@0.1.2:
- resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==}
-
- electron-to-chromium@1.4.295:
- resolution: {integrity: sha512-lEO94zqf1bDA3aepxwnWoHUjA8sZ+2owgcSZjYQy0+uOSEclJX0VieZC+r+wLpSxUHRd6gG32znTWmr+5iGzFw==}
-
- electron-to-chromium@1.4.673:
- resolution: {integrity: sha512-zjqzx4N7xGdl5468G+vcgzDhaHkaYgVcf9MqgexcTqsl2UHSCmOj/Bi3HAprg4BZCpC7HyD8a6nZl6QAZf72gw==}
-
- electron-to-chromium@1.5.162:
- resolution: {integrity: sha512-hQA+Zb5QQwoSaXJWEAGEw1zhk//O7qDzib05Z4qTqZfNju/FAkrm5ZInp0JbTp4Z18A6bilopdZWEYrFSsfllA==}
-
- emittery@0.13.1:
- resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==}
- engines: {node: '>=12'}
-
- emoji-regex@8.0.0:
- resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+ electron-to-chromium@1.5.427:
+ resolution: {integrity: sha512-n14zb3FdsChZ2BNobqNHAJMcP3ifFv4paox2LvCrfVAQcqGiSURgbJl+PfMpHVCNFkStnNc+RRVtPBTVW5PDgw==}
emoji-regex@9.2.2:
resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
- end-of-stream@1.4.4:
- resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==}
-
- enhanced-resolve@5.13.0:
- resolution: {integrity: sha512-eyV8f0y1+bzyfh8xAwW/WTSZpLbjhqc4ne9eGSH4Zo2ejdyiNG9pU6mf9DG8a7+Auk6MFTlNOT4Y2y/9k8GKVg==}
+ enhanced-resolve@5.24.5:
+ resolution: {integrity: sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==}
engines: {node: '>=10.13.0'}
- enquirer@2.3.6:
- resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==}
- engines: {node: '>=8.6'}
-
- error-ex@1.3.2:
- resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==}
-
- es-abstract@1.21.1:
- resolution: {integrity: sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==}
- engines: {node: '>= 0.4'}
+ entities@8.1.0:
+ resolution: {integrity: sha512-kxL7msIffSuh9aaFAMD7rxAIuTRMAHMeBtgHW2yUdWw732ZNh4MehkF2gdjvtdmikkaIP9bFDDJOPlsvm7avrA==}
+ engines: {node: '>=20.19.0'}
- es-abstract@1.22.4:
- resolution: {integrity: sha512-vZYJlk2u6qHYxBOTjAeg7qUxHdNfih64Uu2J8QqWgXZ2cri0ZpJAkzDUK/q593+mvKwlxyaxr6F1Q+3LKoQRgg==}
+ es-abstract-get@1.0.0:
+ resolution: {integrity: sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==}
engines: {node: '>= 0.4'}
- es-abstract@1.24.0:
- resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==}
- engines: {node: '>= 0.4'}
-
- es-array-method-boxes-properly@1.0.0:
- resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==}
-
- es-define-property@1.0.0:
- resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==}
+ es-abstract@1.24.2:
+ resolution: {integrity: sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==}
engines: {node: '>= 0.4'}
es-define-property@1.0.1:
@@ -2048,115 +1692,70 @@ packages:
resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
engines: {node: '>= 0.4'}
- es-get-iterator@1.1.3:
- resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==}
-
- es-iterator-helpers@1.0.17:
- resolution: {integrity: sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ==}
- engines: {node: '>= 0.4'}
-
- es-iterator-helpers@1.2.1:
- resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==}
- engines: {node: '>= 0.4'}
-
- es-object-atoms@1.1.1:
- resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
+ es-iterator-helpers@1.4.0:
+ resolution: {integrity: sha512-c/A0P0oxkACDc+cKWw8evLXK83oBKgn0qPOqCYT4x9uolpCIJAcYvJC9QYKNDRPsTeGyCrQ326jrvgZWdCdK5Q==}
engines: {node: '>= 0.4'}
- es-set-tostringtag@2.0.1:
- resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==}
- engines: {node: '>= 0.4'}
+ es-module-lexer@2.3.2:
+ resolution: {integrity: sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==}
- es-set-tostringtag@2.0.2:
- resolution: {integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==}
+ es-object-atoms@1.1.2:
+ resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==}
engines: {node: '>= 0.4'}
es-set-tostringtag@2.1.0:
resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==}
engines: {node: '>= 0.4'}
- es-shim-unscopables@1.0.0:
- resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==}
-
- es-shim-unscopables@1.0.2:
- resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==}
-
- es-to-primitive@1.2.1:
- resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==}
+ es-shim-unscopables@1.1.0:
+ resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==}
engines: {node: '>= 0.4'}
- es-to-primitive@1.3.0:
- resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==}
+ es-to-primitive@1.3.4:
+ resolution: {integrity: sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw==}
engines: {node: '>= 0.4'}
- escalade@3.1.1:
- resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
- engines: {node: '>=6'}
-
escalade@3.2.0:
resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
engines: {node: '>=6'}
- escape-string-regexp@1.0.5:
- resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
- engines: {node: '>=0.8.0'}
-
- escape-string-regexp@2.0.0:
- resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==}
- engines: {node: '>=8'}
-
escape-string-regexp@4.0.0:
resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
engines: {node: '>=10'}
- eslint-config-prettier@9.1.0:
- resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==}
+ eslint-config-prettier@10.1.8:
+ resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==}
hasBin: true
peerDependencies:
eslint: '>=7.0.0'
- eslint-config-standard-jsx@11.0.0:
- resolution: {integrity: sha512-+1EV/R0JxEK1L0NGolAr8Iktm3Rgotx3BKwgaX+eAuSX8D952LULKtjgZD3F+e6SvibONnhLwoTi9DPxN5LvvQ==}
- peerDependencies:
- eslint: ^8.8.0
- eslint-plugin-react: ^7.28.0
-
- eslint-config-standard-with-typescript@23.0.0:
- resolution: {integrity: sha512-iaaWifImn37Z1OXbNW1es7KI+S7D408F9ys0bpaQf2temeBWlvb0Nc5qHkOgYaRb5QxTZT32GGeN1gtswASOXA==}
- peerDependencies:
- '@typescript-eslint/eslint-plugin': ^5.0.0
- eslint: ^8.0.1
- eslint-plugin-import: ^2.25.2
- eslint-plugin-n: ^15.0.0
- eslint-plugin-promise: ^6.0.0
- typescript: '*'
-
- eslint-config-standard@17.0.0:
- resolution: {integrity: sha512-/2ks1GKyqSOkH7JFvXJicu0iMpoojkwB+f5Du/1SC0PtBL+s8v30k9njRZ21pm2drKYm2342jFnGWzttxPmZVg==}
- peerDependencies:
- eslint: ^8.0.1
- eslint-plugin-import: ^2.25.2
- eslint-plugin-n: ^15.0.0
- eslint-plugin-promise: ^6.0.0
-
- eslint-import-resolver-alias@1.1.2:
- resolution: {integrity: sha512-WdviM1Eu834zsfjHtcGHtGfcu+F30Od3V7I9Fi57uhBEwPkjDcii7/yW8jAT+gOhn4P/vOxxNAXbFAKsrrc15w==}
- engines: {node: '>= 4'}
+ eslint-import-context@0.1.9:
+ resolution: {integrity: sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg==}
+ engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
peerDependencies:
- eslint-plugin-import: '>=1.4.0'
+ unrs-resolver: ^1.0.0
+ peerDependenciesMeta:
+ unrs-resolver:
+ optional: true
- eslint-import-resolver-node@0.3.9:
- resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==}
+ eslint-import-resolver-node@0.3.10:
+ resolution: {integrity: sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==}
- eslint-import-resolver-typescript@3.6.1:
- resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==}
- engines: {node: ^14.18.0 || >=16.0.0}
+ eslint-import-resolver-typescript@4.4.5:
+ resolution: {integrity: sha512-nbE5XLph6TLtGYcu/U6e6ZVXyKBhbDWK5cLGk76eJ7NdZpwf1P9EFkpt1Z01mNZNrrilsAYWKH6zUkL4reoXbw==}
+ engines: {node: ^16.17.0 || >=18.6.0}
peerDependencies:
eslint: '*'
eslint-plugin-import: '*'
+ eslint-plugin-import-x: '*'
+ peerDependenciesMeta:
+ eslint-plugin-import:
+ optional: true
+ eslint-plugin-import-x:
+ optional: true
- eslint-module-utils@2.8.0:
- resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==}
+ eslint-module-utils@2.14.0:
+ resolution: {integrity: sha512-W2WCRZ9Dqntd+2u8jJcVMV2PKulc6RdLgUUoh/yQr3uB6lo/ZOeGx11sv60/8S4QFFKNslAlWhr9u0Ef7ZW6Ig==}
engines: {node: '>=4'}
peerDependencies:
'@typescript-eslint/parser': '*'
@@ -2176,75 +1775,29 @@ packages:
eslint-import-resolver-webpack:
optional: true
- eslint-plugin-cypress@2.15.1:
- resolution: {integrity: sha512-eLHLWP5Q+I4j2AWepYq0PgFEei9/s5LvjuSqWrxurkg1YZ8ltxdvMNmdSf0drnsNo57CTgYY/NIHHLRSWejR7w==}
- peerDependencies:
- eslint: '>= 3.2.1'
-
- eslint-plugin-es@4.1.0:
- resolution: {integrity: sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==}
- engines: {node: '>=8.10.0'}
- peerDependencies:
- eslint: '>=4.19.1'
-
- eslint-plugin-eslint-comments@3.2.0:
- resolution: {integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==}
- engines: {node: '>=6.5.0'}
- peerDependencies:
- eslint: '>=4.19.1'
-
- eslint-plugin-import@2.29.1:
- resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==}
+ eslint-plugin-import@2.32.0:
+ resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==}
engines: {node: '>=4'}
peerDependencies:
'@typescript-eslint/parser': '*'
- eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8
+ eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9
peerDependenciesMeta:
'@typescript-eslint/parser':
optional: true
- eslint-plugin-jest@27.9.0:
- resolution: {integrity: sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- peerDependencies:
- '@typescript-eslint/eslint-plugin': ^5.0.0 || ^6.0.0 || ^7.0.0
- eslint: ^7.0.0 || ^8.0.0
- jest: '*'
- peerDependenciesMeta:
- '@typescript-eslint/eslint-plugin':
- optional: true
- jest:
- optional: true
-
eslint-plugin-jsx-a11y@6.10.2:
resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==}
engines: {node: '>=4.0'}
peerDependencies:
eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9
- eslint-plugin-n@15.7.0:
- resolution: {integrity: sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==}
- engines: {node: '>=12.22.0'}
- peerDependencies:
- eslint: '>=7.0.0'
-
- eslint-plugin-playwright@1.8.3:
- resolution: {integrity: sha512-h87JPFHkz8a6oPhn8GRGGhSQoAJjx0AkOv1jME6NoMk2FpEsfvfJJNaQDxLSqSALkCr0IJXPGTnp6SIRVu5Nqg==}
- engines: {node: '>=16.6.0'}
- peerDependencies:
- eslint: '>=8.40.0'
- eslint-plugin-jest: '>=25'
- peerDependenciesMeta:
- eslint-plugin-jest:
- optional: true
-
- eslint-plugin-prettier@5.1.3:
- resolution: {integrity: sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==}
+ eslint-plugin-prettier@5.5.6:
+ resolution: {integrity: sha512-ifetmTcxWfz+4qRW3pH/ujdTq2jQIj59AxJMIN26K5avYgU8dxycUETQonWiW+wPrYXA0j3Try0l1CnwVQtDqQ==}
engines: {node: ^14.18.0 || >=16.0.0}
peerDependencies:
'@types/eslint': '>=8.0.0'
eslint: '>=8.0.0'
- eslint-config-prettier: '*'
+ eslint-config-prettier: '>= 7.0.0 <10.0.0 || >=10.1.0'
prettier: '>=3.0.0'
peerDependenciesMeta:
'@types/eslint':
@@ -2252,23 +1805,11 @@ packages:
eslint-config-prettier:
optional: true
- eslint-plugin-promise@6.1.1:
- resolution: {integrity: sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- peerDependencies:
- eslint: ^7.0.0 || ^8.0.0
-
- eslint-plugin-react-hooks@4.6.0:
- resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==}
- engines: {node: '>=10'}
+ eslint-plugin-react-hooks@7.1.1:
+ resolution: {integrity: sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==}
+ engines: {node: '>=18'}
peerDependencies:
- eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0
-
- eslint-plugin-react@7.33.2:
- resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==}
- engines: {node: '>=4'}
- peerDependencies:
- eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8
+ eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0
eslint-plugin-react@7.37.5:
resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==}
@@ -2276,355 +1817,148 @@ packages:
peerDependencies:
eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7
- eslint-plugin-tailwindcss@3.14.2:
- resolution: {integrity: sha512-fNzdf4poZP2yQC0xC2prQxMuArMSb5mnellLQvwb9HC3NcLzxs+0IVKWIg1BqUqyui0c+bbjMmhWcKUWK67SLQ==}
- engines: {node: '>=12.13.0'}
- peerDependencies:
- tailwindcss: ^3.4.0
-
- eslint-plugin-testing-library@6.2.0:
- resolution: {integrity: sha512-+LCYJU81WF2yQ+Xu4A135CgK8IszcFcyMF4sWkbiu6Oj+Nel0TrkZq/HvDw0/1WuO3dhDQsZA/OpEMGd0NfcUw==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6'}
- peerDependencies:
- eslint: ^7.5.0 || ^8.0.0
-
- eslint-plugin-tsdoc@0.2.17:
- resolution: {integrity: sha512-xRmVi7Zx44lOBuYqG8vzTXuL6IdGOeF9nHX17bjJ8+VE6fsxpdGem0/SBTmAwgYMKYB1WBkqRJVQ+n8GK041pA==}
-
- eslint-plugin-tsdoc@0.4.0:
- resolution: {integrity: sha512-MT/8b4aKLdDClnS8mP3R/JNjg29i0Oyqd/0ym6NnQf+gfKbJJ4ZcSh2Bs1H0YiUMTBwww5JwXGTWot/RwyJ7aQ==}
-
- eslint-plugin-unicorn@51.0.1:
- resolution: {integrity: sha512-MuR/+9VuB0fydoI0nIn2RDA5WISRn4AsJyNSaNKLVwie9/ONvQhxOBbkfSICBPnzKrB77Fh6CZZXjgTt/4Latw==}
- engines: {node: '>=16'}
- peerDependencies:
- eslint: '>=8.56.0'
-
- eslint-plugin-vitest@0.3.26:
- resolution: {integrity: sha512-oxe5JSPgRjco8caVLTh7Ti8PxpwJdhSV0hTQAmkFcNcmy/9DnqLB/oNVRA11RmVRP//2+jIIT6JuBEcpW3obYg==}
- engines: {node: ^18.0.0 || >= 20.0.0}
- peerDependencies:
- '@typescript-eslint/eslint-plugin': '*'
- eslint: '>=8.0.0'
- vitest: '*'
- peerDependenciesMeta:
- '@typescript-eslint/eslint-plugin':
- optional: true
- vitest:
- optional: true
-
- eslint-scope@5.1.1:
- resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==}
- engines: {node: '>=8.0.0'}
-
- eslint-scope@7.2.2:
- resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
-
- eslint-utils@2.1.0:
- resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==}
- engines: {node: '>=6'}
-
- eslint-utils@3.0.0:
- resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==}
- engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0}
- peerDependencies:
- eslint: '>=5'
-
- eslint-visitor-keys@1.3.0:
- resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==}
- engines: {node: '>=4'}
-
- eslint-visitor-keys@2.1.0:
- resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==}
- engines: {node: '>=10'}
-
- eslint-visitor-keys@3.3.0:
- resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ eslint-scope@8.4.0:
+ resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
eslint-visitor-keys@3.4.3:
resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- eslint@8.56.0:
- resolution: {integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- hasBin: true
+ eslint-visitor-keys@4.2.1:
+ resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- espree@9.6.1:
- resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ eslint-visitor-keys@5.0.1:
+ resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==}
+ engines: {node: ^20.19.0 || ^22.13.0 || >=24}
- esprima@4.0.1:
- resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
- engines: {node: '>=4'}
+ eslint@9.39.5:
+ resolution: {integrity: sha512-DgZS62aPLXKlnxILS/AYCoRvHaZeXceIzlXPkkGGzJWSow1aEk0lbTlxUSlyjC8jcaKxAdOnTDz+o1JFSBsyjw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options.
hasBin: true
+ peerDependencies:
+ jiti: '*'
+ peerDependenciesMeta:
+ jiti:
+ optional: true
- esquery@1.5.0:
- resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==}
+ espree@10.4.0:
+ resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ esquery@1.7.0:
+ resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==}
engines: {node: '>=0.10'}
esrecurse@4.3.0:
resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
engines: {node: '>=4.0'}
- estraverse@4.3.0:
- resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==}
- engines: {node: '>=4.0'}
-
estraverse@5.3.0:
resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
engines: {node: '>=4.0'}
+ estree-walker@3.0.3:
+ resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
+
esutils@2.0.3:
resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
engines: {node: '>=0.10.0'}
- eventemitter2@6.4.7:
- resolution: {integrity: sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==}
-
- execa@4.1.0:
- resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==}
- engines: {node: '>=10'}
-
- execa@5.1.1:
- resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
- engines: {node: '>=10'}
-
- executable@4.1.1:
- resolution: {integrity: sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==}
- engines: {node: '>=4'}
-
- exit@0.1.2:
- resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==}
- engines: {node: '>= 0.8.0'}
-
- expect@29.4.2:
- resolution: {integrity: sha512-+JHYg9O3hd3RlICG90OPVjRkPBoiUH7PxvDVMnRiaq1g6JUgZStX514erMl0v2Dc5SkfVbm7ztqbd6qHHPn+mQ==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- expect@29.7.0:
- resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- extend@3.0.2:
- resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
-
- extract-zip@2.0.1:
- resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==}
- engines: {node: '>= 10.17.0'}
- hasBin: true
-
- extsprintf@1.3.0:
- resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==}
- engines: {'0': node >=0.6.0}
+ expect-type@1.4.0:
+ resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==}
+ engines: {node: '>=12.0.0'}
fast-deep-equal@3.1.3:
resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
- fast-diff@1.2.0:
- resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==}
-
- fast-glob@3.2.12:
- resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==}
- engines: {node: '>=8.6.0'}
+ fast-diff@1.3.0:
+ resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==}
fast-glob@3.3.1:
resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==}
engines: {node: '>=8.6.0'}
- fast-glob@3.3.2:
- resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==}
- engines: {node: '>=8.6.0'}
-
fast-json-stable-stringify@2.1.0:
resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
fast-levenshtein@2.0.6:
resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
- fastq@1.15.0:
- resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==}
-
- fb-watchman@2.0.2:
- resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==}
+ fastq@1.20.3:
+ resolution: {integrity: sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw==}
- fd-slicer@1.1.0:
- resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==}
-
- fdir@6.4.5:
- resolution: {integrity: sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw==}
+ fdir@6.5.0:
+ resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
+ engines: {node: '>=12.0.0'}
peerDependencies:
picomatch: ^3 || ^4
peerDependenciesMeta:
picomatch:
optional: true
- figures@3.2.0:
- resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==}
- engines: {node: '>=8'}
-
- file-entry-cache@6.0.1:
- resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
- engines: {node: ^10.12.0 || >=12.0.0}
-
- fill-range@7.0.1:
- resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
- engines: {node: '>=8'}
+ file-entry-cache@8.0.0:
+ resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
+ engines: {node: '>=16.0.0'}
- find-up@3.0.0:
- resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==}
- engines: {node: '>=6'}
-
- find-up@4.1.0:
- resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==}
+ fill-range@7.1.1:
+ resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
engines: {node: '>=8'}
find-up@5.0.0:
resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
engines: {node: '>=10'}
- find-up@6.3.0:
- resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==}
- engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
-
- flat-cache@3.0.4:
- resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==}
- engines: {node: ^10.12.0 || >=12.0.0}
-
- flatted@3.2.7:
- resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==}
-
- follow-redirects@1.15.5:
- resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==}
- engines: {node: '>=4.0'}
- peerDependencies:
- debug: '*'
- peerDependenciesMeta:
- debug:
- optional: true
+ flat-cache@4.0.1:
+ resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==}
+ engines: {node: '>=16'}
- for-each@0.3.3:
- resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==}
+ flatted@3.4.4:
+ resolution: {integrity: sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==}
for-each@0.3.5:
resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==}
engines: {node: '>= 0.4'}
- forever-agent@0.6.1:
- resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==}
-
- form-data@2.3.3:
- resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==}
- engines: {node: '>= 0.12'}
-
- form-data@4.0.0:
- resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==}
- engines: {node: '>= 6'}
-
- fraction.js@4.3.7:
- resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==}
-
- fs-extra@9.1.0:
- resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==}
- engines: {node: '>=10'}
-
- fs.realpath@1.0.0:
- resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
-
- fsevents@2.3.2:
- resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
+ fsevents@2.3.3:
+ resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
os: [darwin]
- function-bind@1.1.1:
- resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
-
function-bind@1.1.2:
resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
- function.prototype.name@1.1.5:
- resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==}
- engines: {node: '>= 0.4'}
-
- function.prototype.name@1.1.6:
- resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==}
- engines: {node: '>= 0.4'}
-
- function.prototype.name@1.1.8:
- resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==}
+ function.prototype.name@1.2.0:
+ resolution: {integrity: sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==}
engines: {node: '>= 0.4'}
functions-have-names@1.2.3:
resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
+ generator-function@2.0.1:
+ resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==}
+ engines: {node: '>= 0.4'}
+
gensync@1.0.0-beta.2:
resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
engines: {node: '>=6.9.0'}
- get-caller-file@2.0.5:
- resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
- engines: {node: 6.* || 8.* || >= 10.*}
-
- get-intrinsic@1.2.0:
- resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==}
-
- get-intrinsic@1.2.4:
- resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==}
- engines: {node: '>= 0.4'}
-
get-intrinsic@1.3.0:
resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}
engines: {node: '>= 0.4'}
- get-nonce@1.0.1:
- resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==}
- engines: {node: '>=6'}
-
- get-package-type@0.1.0:
- resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==}
- engines: {node: '>=8.0.0'}
-
get-proto@1.0.1:
resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
engines: {node: '>= 0.4'}
- get-stdin@8.0.0:
- resolution: {integrity: sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==}
- engines: {node: '>=10'}
-
- get-stream@5.2.0:
- resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==}
- engines: {node: '>=8'}
-
- get-stream@6.0.1:
- resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
- engines: {node: '>=10'}
-
- get-symbol-description@1.0.0:
- resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==}
- engines: {node: '>= 0.4'}
-
- get-symbol-description@1.0.2:
- resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==}
- engines: {node: '>= 0.4'}
-
get-symbol-description@1.1.0:
resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==}
engines: {node: '>= 0.4'}
- get-tsconfig@4.5.0:
- resolution: {integrity: sha512-MjhiaIWCJ1sAU4pIQ5i5OfOuHHxVo1oYeNsWTON7jxYkod8pHocXeh+SSbmu5OZZZK73B6cbJ2XADzXehLyovQ==}
-
- getos@3.2.1:
- resolution: {integrity: sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==}
-
- getpass@0.1.7:
- resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==}
-
- git-hooks-list@4.1.1:
- resolution: {integrity: sha512-cmP497iLq54AZnv4YRAEMnEyQ1eIn4tGKbmswqwmFV4GBnAqE8NLtWxxdXa++AalfgL5EBH4IxTPyquEuGY/jA==}
+ get-tsconfig@4.14.3:
+ resolution: {integrity: sha512-++QEw4DIY7WGoukz+/+A/8dGYPT9l9yIadnmSgZ8Rjr3YVSVDipQSO9CdnJo9ePqFqUUqh+wk9uIaoiAwsiPkA==}
glob-parent@5.1.2:
resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
@@ -2634,45 +1968,18 @@ packages:
resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
engines: {node: '>=10.13.0'}
- glob@7.1.6:
- resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==}
- deprecated: Glob versions prior to v9 are no longer supported
-
- glob@7.2.3:
- resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
- deprecated: Glob versions prior to v9 are no longer supported
-
- global-dirs@3.0.1:
- resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==}
- engines: {node: '>=10'}
-
- globals@11.12.0:
- resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
- engines: {node: '>=4'}
-
- globals@13.20.0:
- resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==}
- engines: {node: '>=8'}
-
- globals@13.24.0:
- resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==}
- engines: {node: '>=8'}
+ globals@14.0.0:
+ resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==}
+ engines: {node: '>=18'}
- globalthis@1.0.3:
- resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==}
- engines: {node: '>= 0.4'}
+ globals@17.12.0:
+ resolution: {integrity: sha512-cezEd/DTyyht9cvSSURyygXPfy04GtWO/5e6ZPvH7fCtjKz9PYOmuawphw1Ctd1f6C+5JypXfGD7ahNMXvevBA==}
+ engines: {node: '>=18'}
globalthis@1.0.4:
resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==}
engines: {node: '>= 0.4'}
- globby@11.1.0:
- resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
- engines: {node: '>=10'}
-
- gopd@1.0.1:
- resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==}
-
gopd@1.2.0:
resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
engines: {node: '>= 0.4'}
@@ -2680,102 +1987,54 @@ packages:
graceful-fs@4.2.11:
resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
- grapheme-splitter@1.0.4:
- resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==}
-
- graphemer@1.4.0:
- resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
-
- has-bigints@1.0.2:
- resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==}
-
- has-flag@3.0.0:
- resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
- engines: {node: '>=4'}
+ has-bigints@1.1.0:
+ resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==}
+ engines: {node: '>= 0.4'}
has-flag@4.0.0:
resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
engines: {node: '>=8'}
- has-property-descriptors@1.0.0:
- resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==}
-
has-property-descriptors@1.0.2:
resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==}
- has-proto@1.0.1:
- resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==}
- engines: {node: '>= 0.4'}
-
has-proto@1.2.0:
resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==}
engines: {node: '>= 0.4'}
- has-symbols@1.0.3:
- resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==}
- engines: {node: '>= 0.4'}
-
has-symbols@1.1.0:
resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
engines: {node: '>= 0.4'}
- has-tostringtag@1.0.0:
- resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==}
- engines: {node: '>= 0.4'}
-
has-tostringtag@1.0.2:
resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}
engines: {node: '>= 0.4'}
- has@1.0.3:
- resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==}
- engines: {node: '>= 0.4.0'}
-
- hasown@2.0.1:
- resolution: {integrity: sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==}
- engines: {node: '>= 0.4'}
-
- hasown@2.0.2:
- resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
+ hasown@2.0.4:
+ resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==}
engines: {node: '>= 0.4'}
- hosted-git-info@2.8.9:
- resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==}
-
- html-escaper@2.0.2:
- resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==}
-
- http-signature@1.3.6:
- resolution: {integrity: sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==}
- engines: {node: '>=0.10'}
-
- human-signals@1.1.1:
- resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==}
- engines: {node: '>=8.12.0'}
-
- human-signals@2.1.0:
- resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
- engines: {node: '>=10.17.0'}
+ hermes-estree@0.25.1:
+ resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==}
- ieee754@1.2.1:
- resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
+ hermes-parser@0.25.1:
+ resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==}
- ignore@5.2.4:
- resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==}
- engines: {node: '>= 4'}
+ html-encoding-sniffer@6.0.0:
+ resolution: {integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==}
+ engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0}
ignore@5.3.2:
resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
engines: {node: '>= 4'}
- import-fresh@3.3.0:
- resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
- engines: {node: '>=6'}
+ ignore@7.0.9:
+ resolution: {integrity: sha512-brTTsvFRt5C1gGHtPst/281UjPD5t9fBqbgoMPlVWy11ZLTPfu7HxK4ZYqO9H7o/yC9rSTCI85EaQ4OoY12qYw==}
+ engines: {node: '>= 4'}
- import-local@3.1.0:
- resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==}
- engines: {node: '>=8'}
- hasBin: true
+ import-fresh@3.3.1:
+ resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==}
+ engines: {node: '>=6'}
imurmurhash@0.1.4:
resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
@@ -2785,152 +2044,73 @@ packages:
resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==}
engines: {node: '>=8'}
- inflight@1.0.6:
- resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
-
- inherits@2.0.4:
- resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
-
- ini@2.0.0:
- resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==}
- engines: {node: '>=10'}
-
- internal-slot@1.0.5:
- resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==}
- engines: {node: '>= 0.4'}
-
- internal-slot@1.0.7:
- resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==}
- engines: {node: '>= 0.4'}
-
internal-slot@1.1.0:
resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==}
engines: {node: '>= 0.4'}
- is-arguments@1.1.1:
- resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==}
- engines: {node: '>= 0.4'}
-
- is-array-buffer@3.0.1:
- resolution: {integrity: sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==}
-
- is-array-buffer@3.0.4:
- resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==}
- engines: {node: '>= 0.4'}
-
is-array-buffer@3.0.5:
resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==}
engines: {node: '>= 0.4'}
- is-arrayish@0.2.1:
- resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
-
- is-arrayish@0.3.2:
- resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==}
-
- is-async-function@2.0.0:
- resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==}
+ is-async-function@2.1.1:
+ resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==}
engines: {node: '>= 0.4'}
- is-bigint@1.0.4:
- resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==}
-
is-bigint@1.1.0:
resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==}
engines: {node: '>= 0.4'}
- is-binary-path@2.1.0:
- resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
- engines: {node: '>=8'}
-
- is-boolean-object@1.1.2:
- resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==}
- engines: {node: '>= 0.4'}
-
is-boolean-object@1.2.2:
resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==}
engines: {node: '>= 0.4'}
- is-builtin-module@3.2.1:
- resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==}
- engines: {node: '>=6'}
+ is-bun-module@2.0.0:
+ resolution: {integrity: sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==}
is-callable@1.2.7:
resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
engines: {node: '>= 0.4'}
- is-ci@3.0.1:
- resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==}
- hasBin: true
-
- is-core-module@2.11.0:
- resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==}
-
- is-core-module@2.13.1:
- resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==}
+ is-core-module@2.16.2:
+ resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==}
+ engines: {node: '>= 0.4'}
is-data-view@1.0.2:
resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==}
engines: {node: '>= 0.4'}
- is-date-object@1.0.5:
- resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==}
- engines: {node: '>= 0.4'}
-
is-date-object@1.1.0:
resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==}
engines: {node: '>= 0.4'}
+ is-document.all@1.0.0:
+ resolution: {integrity: sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==}
+ engines: {node: '>= 0.4'}
+
is-extglob@2.1.1:
resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
engines: {node: '>=0.10.0'}
- is-finalizationregistry@1.0.2:
- resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==}
-
is-finalizationregistry@1.1.1:
resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==}
engines: {node: '>= 0.4'}
- is-fullwidth-code-point@3.0.0:
- resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
- engines: {node: '>=8'}
-
- is-generator-fn@2.1.0:
- resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==}
- engines: {node: '>=6'}
-
- is-generator-function@1.0.10:
- resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==}
+ is-generator-function@1.1.2:
+ resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==}
engines: {node: '>= 0.4'}
is-glob@4.0.3:
resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
engines: {node: '>=0.10.0'}
- is-installed-globally@0.4.0:
- resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==}
- engines: {node: '>=10'}
-
- is-map@2.0.2:
- resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==}
-
is-map@2.0.3:
resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==}
engines: {node: '>= 0.4'}
- is-negative-zero@2.0.2:
- resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==}
- engines: {node: '>= 0.4'}
-
is-negative-zero@2.0.3:
resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==}
engines: {node: '>= 0.4'}
- is-number-object@1.0.7:
- resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==}
- engines: {node: '>= 0.4'}
-
is-number-object@1.1.1:
resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==}
engines: {node: '>= 0.4'}
@@ -2939,92 +2119,41 @@ packages:
resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
engines: {node: '>=0.12.0'}
- is-path-inside@3.0.3:
- resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==}
- engines: {node: '>=8'}
-
- is-plain-obj@4.1.0:
- resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==}
- engines: {node: '>=12'}
-
- is-regex@1.1.4:
- resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==}
- engines: {node: '>= 0.4'}
+ is-potential-custom-element-name@1.0.1:
+ resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==}
is-regex@1.2.1:
resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==}
engines: {node: '>= 0.4'}
- is-set@2.0.2:
- resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==}
-
is-set@2.0.3:
resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==}
engines: {node: '>= 0.4'}
- is-shared-array-buffer@1.0.2:
- resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==}
-
is-shared-array-buffer@1.0.4:
resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==}
engines: {node: '>= 0.4'}
- is-stream@2.0.1:
- resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
- engines: {node: '>=8'}
-
- is-string@1.0.7:
- resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==}
- engines: {node: '>= 0.4'}
-
is-string@1.1.1:
resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==}
engines: {node: '>= 0.4'}
- is-symbol@1.0.4:
- resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==}
- engines: {node: '>= 0.4'}
-
is-symbol@1.1.1:
resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==}
engines: {node: '>= 0.4'}
- is-typed-array@1.1.10:
- resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==}
- engines: {node: '>= 0.4'}
-
- is-typed-array@1.1.13:
- resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==}
- engines: {node: '>= 0.4'}
-
is-typed-array@1.1.15:
resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==}
engines: {node: '>= 0.4'}
- is-typedarray@1.0.0:
- resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==}
-
- is-unicode-supported@0.1.0:
- resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==}
- engines: {node: '>=10'}
-
- is-weakmap@2.0.1:
- resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==}
-
is-weakmap@2.0.2:
resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==}
engines: {node: '>= 0.4'}
- is-weakref@1.0.2:
- resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==}
-
is-weakref@1.1.1:
resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==}
engines: {node: '>= 0.4'}
- is-weakset@2.0.2:
- resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==}
-
is-weakset@2.0.4:
resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==}
engines: {node: '>= 0.4'}
@@ -3035,368 +2164,242 @@ packages:
isexe@2.0.0:
resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
- isstream@0.1.2:
- resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==}
-
- istanbul-lib-coverage@3.2.0:
- resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==}
- engines: {node: '>=8'}
-
- istanbul-lib-instrument@5.2.1:
- resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==}
- engines: {node: '>=8'}
-
- istanbul-lib-instrument@6.0.1:
- resolution: {integrity: sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==}
- engines: {node: '>=10'}
-
- istanbul-lib-report@3.0.0:
- resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==}
- engines: {node: '>=8'}
-
- istanbul-lib-source-maps@4.0.1:
- resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==}
- engines: {node: '>=10'}
-
- istanbul-reports@3.1.5:
- resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==}
- engines: {node: '>=8'}
-
- iterator.prototype@1.1.2:
- resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==}
-
iterator.prototype@1.1.5:
resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==}
engines: {node: '>= 0.4'}
- jest-changed-files@29.7.0:
- resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ jiti@2.7.0:
+ resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==}
+ hasBin: true
+
+ js-tokens@10.0.0:
+ resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==}
- jest-circus@29.7.0:
- resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ js-tokens@4.0.0:
+ resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
- jest-cli@29.7.0:
- resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ js-yaml@4.3.2:
+ resolution: {integrity: sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==}
hasBin: true
- peerDependencies:
- node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
- peerDependenciesMeta:
- node-notifier:
- optional: true
- jest-config@29.7.0:
- resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ jsdom@30.0.1:
+ resolution: {integrity: sha512-52v7mUVUfNQVYYqE1lcdaymWL0njO7lTLUog6ZvW2U5KsbiLk/GnZlVJ+qx0xfNJZ6Gn+KSpPNE52vurbxZwrA==}
+ engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0}
peerDependencies:
- '@types/node': '*'
- ts-node: '>=9.0.0'
+ canvas: ^3.2.3
peerDependenciesMeta:
- '@types/node':
- optional: true
- ts-node:
+ canvas:
optional: true
- jest-diff@29.4.2:
- resolution: {integrity: sha512-EK8DSajVtnjx9sa1BkjZq3mqChm2Cd8rIzdXkQMA8e0wuXq53ypz6s5o5V8HRZkoEt2ywJ3eeNWFKWeYr8HK4g==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ jsesc@3.1.0:
+ resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==}
+ engines: {node: '>=6'}
+ hasBin: true
- jest-diff@29.7.0:
- resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ json-buffer@3.0.1:
+ resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
- jest-docblock@29.7.0:
- resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ json-schema-traverse@0.4.1:
+ resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
- jest-each@29.7.0:
- resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ json-stable-stringify-without-jsonify@1.0.1:
+ resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
- jest-environment-node@29.7.0:
- resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ json5@1.0.2:
+ resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==}
+ hasBin: true
- jest-get-type@29.4.2:
- resolution: {integrity: sha512-vERN30V5i2N6lqlFu4ljdTqQAgrkTFMC9xaIIfOPYBw04pufjXRty5RuXBiB1d72tGbURa/UgoiHB90ruOSivg==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ json5@2.2.3:
+ resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
+ engines: {node: '>=6'}
+ hasBin: true
- jest-get-type@29.6.3:
- resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ jsx-ast-utils@3.3.5:
+ resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==}
+ engines: {node: '>=4.0'}
- jest-haste-map@29.7.0:
- resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ keyv@4.5.4:
+ resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
- jest-leak-detector@29.7.0:
- resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ language-subtag-registry@0.3.23:
+ resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==}
- jest-matcher-utils@29.4.2:
- resolution: {integrity: sha512-EZaAQy2je6Uqkrm6frnxBIdaWtSYFoR8SVb2sNLAtldswlR/29JAgx+hy67llT3+hXBaLB0zAm5UfeqerioZyg==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- jest-matcher-utils@29.7.0:
- resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- jest-message-util@29.4.2:
- resolution: {integrity: sha512-SElcuN4s6PNKpOEtTInjOAA8QvItu0iugkXqhYyguRvQoXapg5gN+9RQxLAkakChZA7Y26j6yUCsFWN+hlKD6g==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- jest-message-util@29.7.0:
- resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- jest-mock@29.7.0:
- resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- jest-pnp-resolver@1.2.3:
- resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==}
- engines: {node: '>=6'}
- peerDependencies:
- jest-resolve: '*'
- peerDependenciesMeta:
- jest-resolve:
- optional: true
-
- jest-regex-util@29.6.3:
- resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- jest-resolve-dependencies@29.7.0:
- resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- jest-resolve@29.7.0:
- resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- jest-runner@29.7.0:
- resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- jest-runtime@29.7.0:
- resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- jest-snapshot@29.7.0:
- resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- jest-util@29.4.2:
- resolution: {integrity: sha512-wKnm6XpJgzMUSRFB7YF48CuwdzuDIHenVuoIb1PLuJ6F+uErZsuDkU+EiExkChf6473XcawBrSfDSnXl+/YG4g==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- jest-util@29.7.0:
- resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- jest-validate@29.7.0:
- resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- jest-watcher@29.7.0:
- resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- jest-worker@29.7.0:
- resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- jest@29.7.0:
- resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- hasBin: true
- peerDependencies:
- node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
- peerDependenciesMeta:
- node-notifier:
- optional: true
-
- jiti@1.21.0:
- resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==}
- hasBin: true
-
- jju@1.4.0:
- resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==}
-
- joi@17.12.1:
- resolution: {integrity: sha512-vtxmq+Lsc5SlfqotnfVjlViWfOL9nt/avKNbKYizwf6gsCfq9NYY/ceYRMFD8XDdrjJ9abJyScWmhmIiy+XRtQ==}
-
- js-tokens@4.0.0:
- resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
-
- js-yaml@3.14.1:
- resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==}
- hasBin: true
-
- js-yaml@4.1.0:
- resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
- hasBin: true
-
- jsbn@0.1.1:
- resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==}
-
- jsesc@0.5.0:
- resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==}
- hasBin: true
-
- jsesc@2.5.2:
- resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==}
- engines: {node: '>=4'}
- hasBin: true
-
- jsesc@3.0.2:
- resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==}
- engines: {node: '>=6'}
- hasBin: true
-
- json-parse-better-errors@1.0.2:
- resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==}
+ language-tags@1.0.9:
+ resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==}
+ engines: {node: '>=0.10'}
- json-parse-even-better-errors@2.3.1:
- resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
+ levn@0.4.1:
+ resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
+ engines: {node: '>= 0.8.0'}
- json-schema-traverse@0.4.1:
- resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
+ lightningcss-android-arm64@1.32.0:
+ resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [android]
- json-schema-traverse@1.0.0:
- resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
+ lightningcss-android-arm64@1.33.0:
+ resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [android]
- json-schema@0.4.0:
- resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==}
+ lightningcss-darwin-arm64@1.32.0:
+ resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [darwin]
- json-stable-stringify-without-jsonify@1.0.1:
- resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
+ lightningcss-darwin-arm64@1.33.0:
+ resolution: {integrity: sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [darwin]
- json-stringify-safe@5.0.1:
- resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==}
+ lightningcss-darwin-x64@1.32.0:
+ resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [darwin]
- json5@1.0.2:
- resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==}
- hasBin: true
+ lightningcss-darwin-x64@1.33.0:
+ resolution: {integrity: sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [darwin]
- json5@2.2.3:
- resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
- engines: {node: '>=6'}
- hasBin: true
+ lightningcss-freebsd-x64@1.32.0:
+ resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [freebsd]
- jsonfile@6.1.0:
- resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
+ lightningcss-freebsd-x64@1.33.0:
+ resolution: {integrity: sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [freebsd]
- jsprim@2.0.2:
- resolution: {integrity: sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==}
- engines: {'0': node >=0.6.0}
+ lightningcss-linux-arm-gnueabihf@1.32.0:
+ resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm]
+ os: [linux]
- jsx-ast-utils@3.3.3:
- resolution: {integrity: sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==}
- engines: {node: '>=4.0'}
+ lightningcss-linux-arm-gnueabihf@1.33.0:
+ resolution: {integrity: sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm]
+ os: [linux]
- jsx-ast-utils@3.3.5:
- resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==}
- engines: {node: '>=4.0'}
+ lightningcss-linux-arm64-gnu@1.32.0:
+ resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
- kleur@3.0.3:
- resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==}
- engines: {node: '>=6'}
+ lightningcss-linux-arm64-gnu@1.33.0:
+ resolution: {integrity: sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
- language-subtag-registry@0.3.22:
- resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==}
+ lightningcss-linux-arm64-musl@1.32.0:
+ resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
- language-tags@1.0.9:
- resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==}
- engines: {node: '>=0.10'}
+ lightningcss-linux-arm64-musl@1.33.0:
+ resolution: {integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
- lazy-ass@1.6.0:
- resolution: {integrity: sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==}
- engines: {node: '> 0.8'}
+ lightningcss-linux-x64-gnu@1.32.0:
+ resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
- leven@3.1.0:
- resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==}
- engines: {node: '>=6'}
+ lightningcss-linux-x64-gnu@1.33.0:
+ resolution: {integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
- levn@0.4.1:
- resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
- engines: {node: '>= 0.8.0'}
+ lightningcss-linux-x64-musl@1.32.0:
+ resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
- lilconfig@2.1.0:
- resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==}
- engines: {node: '>=10'}
+ lightningcss-linux-x64-musl@1.33.0:
+ resolution: {integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
- lines-and-columns@1.2.4:
- resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
+ lightningcss-win32-arm64-msvc@1.32.0:
+ resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [win32]
- listr2@3.14.0:
- resolution: {integrity: sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==}
- engines: {node: '>=10.0.0'}
- peerDependencies:
- enquirer: '>= 2.3.0 < 3'
- peerDependenciesMeta:
- enquirer:
- optional: true
+ lightningcss-win32-arm64-msvc@1.33.0:
+ resolution: {integrity: sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [win32]
- load-json-file@5.3.0:
- resolution: {integrity: sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==}
- engines: {node: '>=6'}
+ lightningcss-win32-x64-msvc@1.32.0:
+ resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [win32]
- load-json-file@7.0.1:
- resolution: {integrity: sha512-Gnxj3ev3mB5TkVBGad0JM6dmLiQL+o0t23JPBZ9sd+yvSLk05mFoqKBw5N8gbbkU4TNXyqCgIrl/VM17OgUIgQ==}
- engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ lightningcss-win32-x64-msvc@1.33.0:
+ resolution: {integrity: sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [win32]
- locate-path@3.0.0:
- resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==}
- engines: {node: '>=6'}
+ lightningcss@1.32.0:
+ resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==}
+ engines: {node: '>= 12.0.0'}
- locate-path@5.0.0:
- resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==}
- engines: {node: '>=8'}
+ lightningcss@1.33.0:
+ resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==}
+ engines: {node: '>= 12.0.0'}
locate-path@6.0.0:
resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
engines: {node: '>=10'}
- locate-path@7.2.0:
- resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==}
- engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
-
- lodash.memoize@4.1.2:
- resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==}
-
lodash.merge@4.6.2:
resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
- lodash.once@4.1.1:
- resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==}
-
- lodash@4.17.21:
- resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
-
- log-symbols@4.1.0:
- resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==}
- engines: {node: '>=10'}
-
- log-update@4.0.0:
- resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==}
- engines: {node: '>=10'}
-
loose-envify@1.4.0:
resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
hasBin: true
+ lru-cache@11.5.2:
+ resolution: {integrity: sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==}
+ engines: {node: 20 || >=22}
+
lru-cache@5.1.1:
resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
- lru-cache@6.0.0:
- resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
- engines: {node: '>=10'}
-
- lucide-react@0.511.0:
- resolution: {integrity: sha512-VK5a2ydJ7xm8GvBeKLS9mu1pVK6ucef9780JVUjw6bAjJL/QXnd4Y0p7SPeOUMC27YhzNCZvm5d/QX0Tp3rc0w==}
+ lucide-react@1.43.0:
+ resolution: {integrity: sha512-ubtnda1fVK5ky0PNEpOmB0wiwhpZUyJiol4K14KCm+QKvuCkfUu54Et/rIjyupJpwiJ5Hg+BLQE86/GEsS+IgQ==}
peerDependencies:
react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0
@@ -3404,79 +2407,57 @@ packages:
resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==}
hasBin: true
- make-dir@3.1.0:
- resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==}
- engines: {node: '>=8'}
+ magic-string@0.30.21:
+ resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
- make-error@1.3.6:
- resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==}
+ magic-string@1.3.1:
+ resolution: {integrity: sha512-rm91zr2Ou+XueDTohjQQjdQEcYM6zVi8KVUCG8Ec3vHwUEKrhSdCNyfuIywkA6hcCAteIn0ZOtAHA6eGpiX+Pg==}
- makeerror@1.0.12:
- resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==}
+ magicast@0.5.5:
+ resolution: {integrity: sha512-UicdXN8zQ3JHlxVq+28afMXPr1z7WNY6+7EJnzTdQWkTAlMLF5fNCCKxJHBQwGaNGR11581EiQmQzx73+MvszA==}
math-intrinsics@1.1.0:
resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
engines: {node: '>= 0.4'}
- merge-stream@2.0.0:
- resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
+ mdn-data@2.27.1:
+ resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==}
merge2@1.4.1:
resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
engines: {node: '>= 8'}
- micromatch@4.0.5:
- resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==}
+ micromatch@4.0.8:
+ resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
engines: {node: '>=8.6'}
- mime-db@1.52.0:
- resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
- engines: {node: '>= 0.6'}
-
- mime-types@2.1.35:
- resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
- engines: {node: '>= 0.6'}
-
- mimic-fn@2.1.0:
- resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
- engines: {node: '>=6'}
-
min-indent@1.0.1:
resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
engines: {node: '>=4'}
- minimatch@3.1.2:
- resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
+ minimatch@10.2.6:
+ resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==}
+ engines: {node: 18 || 20 || >=22}
- minimatch@9.0.5:
- resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
- engines: {node: '>=16 || 14 >=14.17'}
+ minimatch@3.1.5:
+ resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==}
minimist@1.2.8:
resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
- ms@2.1.2:
- resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
-
ms@2.1.3:
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
- mz@2.7.0:
- resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
-
- nanoid@3.3.11:
- resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
+ nanoid@3.3.19:
+ resolution: {integrity: sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
- nanoid@3.3.7:
- resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==}
- engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ napi-postinstall@0.3.4:
+ resolution: {integrity: sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==}
+ engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
hasBin: true
- natural-compare-lite@1.4.0:
- resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==}
-
natural-compare@1.4.0:
resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
@@ -3486,13 +2467,13 @@ packages:
react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc
react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc
- next@15.4.0-canary.62:
- resolution: {integrity: sha512-yC9q18Nha14vDDLHpus1YHmdInHzl4FhuIX7gH51Rq1X1Wfbld+ZLB+kFjr208bhKopIHt6OuwH/2p7yXj7xyg==}
- engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0}
+ next@16.3.4:
+ resolution: {integrity: sha512-/Ztf6CeRH+ejEXUrYtqI4gkS66eFIHuSwqi60RgcpWKodxFZx2/dqVCMKBwILfAHXQ+F1b1vAudgj3mnxqtoIA==}
+ engines: {node: '>=20.9.0'}
hasBin: true
peerDependencies:
'@opentelemetry/api': ^1.1.0
- '@playwright/test': ^1.41.2
+ '@playwright/test': ^1.51.1
babel-plugin-react-compiler: '*'
react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0
react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0
@@ -3507,194 +2488,80 @@ packages:
sass:
optional: true
- node-int64@0.4.0:
- resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==}
-
- node-releases@2.0.10:
- resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==}
-
- node-releases@2.0.14:
- resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==}
-
- node-releases@2.0.19:
- resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==}
-
- normalize-package-data@2.5.0:
- resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==}
-
- normalize-path@3.0.0:
- resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
- engines: {node: '>=0.10.0'}
-
- normalize-range@0.1.2:
- resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==}
- engines: {node: '>=0.10.0'}
+ node-exports-info@1.6.2:
+ resolution: {integrity: sha512-kXs9Go0cah0qHVV2v389IXQLdLCeE1xfFtjOAF+iobu0OIoG1pje8At2vMHyaPMiPMnG/LWP50twML21eMcAag==}
+ engines: {node: '>= 0.4'}
- npm-run-path@4.0.1:
- resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
- engines: {node: '>=8'}
+ node-releases@2.0.55:
+ resolution: {integrity: sha512-mIrE/Cw9y+9Au6dS5vDKDhQza9YvG6w+ZrS6X+ZzA7yFW/soAeaups4Qzn1bL6g5FVy8WtP79+0j82oPIbqRjQ==}
+ engines: {node: '>=18'}
object-assign@4.1.1:
resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
engines: {node: '>=0.10.0'}
- object-hash@3.0.0:
- resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==}
- engines: {node: '>= 6'}
-
- object-inspect@1.12.3:
- resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==}
-
- object-inspect@1.13.1:
- resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==}
-
object-inspect@1.13.4:
resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==}
engines: {node: '>= 0.4'}
- object-is@1.1.5:
- resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==}
- engines: {node: '>= 0.4'}
-
object-keys@1.1.1:
resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
engines: {node: '>= 0.4'}
- object.assign@4.1.4:
- resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==}
- engines: {node: '>= 0.4'}
-
- object.assign@4.1.5:
- resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==}
- engines: {node: '>= 0.4'}
-
object.assign@4.1.7:
resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==}
engines: {node: '>= 0.4'}
- object.entries@1.1.6:
- resolution: {integrity: sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==}
- engines: {node: '>= 0.4'}
-
object.entries@1.1.9:
resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==}
engines: {node: '>= 0.4'}
- object.fromentries@2.0.6:
- resolution: {integrity: sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==}
- engines: {node: '>= 0.4'}
-
- object.fromentries@2.0.7:
- resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==}
- engines: {node: '>= 0.4'}
-
object.fromentries@2.0.8:
resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==}
engines: {node: '>= 0.4'}
- object.groupby@1.0.2:
- resolution: {integrity: sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw==}
-
- object.hasown@1.1.2:
- resolution: {integrity: sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==}
-
- object.values@1.1.6:
- resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==}
- engines: {node: '>= 0.4'}
-
- object.values@1.1.7:
- resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==}
+ object.groupby@1.0.3:
+ resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==}
engines: {node: '>= 0.4'}
object.values@1.2.1:
resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==}
engines: {node: '>= 0.4'}
- once@1.4.0:
- resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
-
- onetime@5.1.2:
- resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
- engines: {node: '>=6'}
+ obug@2.2.1:
+ resolution: {integrity: sha512-XrsrhT5sybtKI6wakr2SPOlGZWWYbUXZ7a0jT8/QOeAPau+1X/bSegNe5YR75oJmEZQbKningirmGOEJCIk61Q==}
+ engines: {node: '>=12.20.0'}
- optionator@0.9.3:
- resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==}
+ optionator@0.9.4:
+ resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
engines: {node: '>= 0.8.0'}
- ospath@1.2.2:
- resolution: {integrity: sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==}
-
- own-keys@1.0.1:
- resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==}
+ own-keys@1.0.2:
+ resolution: {integrity: sha512-19YVAg7T+WTrxggPukVq7DjTv6+PJ867TmhCvBsYwmbFCsZd344rq2Ld1p0wo8f8Qrrhgp82c6FJRqdXWtSEhg==}
engines: {node: '>= 0.4'}
- p-limit@2.3.0:
- resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==}
- engines: {node: '>=6'}
-
p-limit@3.1.0:
resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
engines: {node: '>=10'}
- p-limit@4.0.0:
- resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==}
- engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
-
- p-locate@3.0.0:
- resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==}
- engines: {node: '>=6'}
-
- p-locate@4.1.0:
- resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==}
- engines: {node: '>=8'}
-
p-locate@5.0.0:
resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
engines: {node: '>=10'}
- p-locate@6.0.0:
- resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==}
- engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
-
- p-map@4.0.0:
- resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==}
- engines: {node: '>=10'}
-
- p-try@2.2.0:
- resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
- engines: {node: '>=6'}
-
- papaparse@5.4.1:
- resolution: {integrity: sha512-HipMsgJkZu8br23pW15uvo6sib6wne/4woLZPlFf3rpDyMe9ywEXUsuD7+6K9PRkJlVT51j/sCOYDKGGS3ZJrw==}
+ papaparse@5.7.0:
+ resolution: {integrity: sha512-qBGxg/7Q3Kl9Wfhrz2Z74UnvnHTXLNG6jmKJFeBvP2+y4lV7So+7SR62+Zd47JvdrCkX+nDcnr0ObPzek/+6RA==}
parent-module@1.0.1:
resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
engines: {node: '>=6'}
- parse-json@4.0.0:
- resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==}
- engines: {node: '>=4'}
-
- parse-json@5.2.0:
- resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
- engines: {node: '>=8'}
-
- path-exists@3.0.0:
- resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==}
- engines: {node: '>=4'}
+ parse5@8.0.1:
+ resolution: {integrity: sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==}
path-exists@4.0.0:
resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
engines: {node: '>=8'}
- path-exists@5.0.0:
- resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==}
- engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
-
- path-is-absolute@1.0.1:
- resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
- engines: {node: '>=0.10.0'}
-
path-key@3.1.1:
resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
engines: {node: '>=8'}
@@ -3702,237 +2569,125 @@ packages:
path-parse@1.0.7:
resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
- path-type@4.0.0:
- resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
- engines: {node: '>=8'}
-
- pend@1.2.0:
- resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==}
-
- performance-now@2.1.0:
- resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==}
-
- picocolors@1.0.0:
- resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
-
picocolors@1.1.1:
resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
- picomatch@2.3.1:
- resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
+ picomatch@2.3.2:
+ resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==}
engines: {node: '>=8.6'}
- picomatch@4.0.2:
- resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==}
+ picomatch@4.0.7:
+ resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==}
engines: {node: '>=12'}
- pify@2.3.0:
- resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
- engines: {node: '>=0.10.0'}
-
- pify@4.0.1:
- resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==}
- engines: {node: '>=6'}
-
- pirates@4.0.5:
- resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==}
- engines: {node: '>= 6'}
-
- pkg-conf@3.1.0:
- resolution: {integrity: sha512-m0OTbR/5VPNPqO1ph6Fqbj7Hv6QU7gR/tQW40ZqrL1rjgCU85W6C1bJn0BItuJqnR98PWzw7Z8hHeChD1WrgdQ==}
- engines: {node: '>=6'}
-
- pkg-conf@4.0.0:
- resolution: {integrity: sha512-7dmgi4UY4qk+4mj5Cd8v/GExPo0K+SlY+hulOSdfZ/T6jVH6//y7NtzZo5WrfhDBxuQ0jCa7fLZmNaNh7EWL/w==}
- engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
-
- pkg-dir@4.2.0:
- resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==}
- engines: {node: '>=8'}
+ playwright-core@1.63.0:
+ resolution: {integrity: sha512-rYCsBF/M5HjUch52bbtVONEFjv6Xu8sm8h72dNlR5bzIE1fvC/bxgspzkjSfU+MweEMmPM8KJebG6nnyxo5mCg==}
+ engines: {node: '>=20'}
+ hasBin: true
- pluralize@8.0.0:
- resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==}
- engines: {node: '>=4'}
+ playwright@1.63.0:
+ resolution: {integrity: sha512-+7ziBLidS4NaNCdt57SUDT+wYmmd5fmiQejUic/kb+YsYSCPyOOE9sebzMjNmQrsnNpDJqd4WHvV/8lfKfUDUg==}
+ engines: {node: '>=20'}
+ hasBin: true
possible-typed-array-names@1.1.0:
resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==}
engines: {node: '>= 0.4'}
- postcss-import@15.1.0:
- resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==}
- engines: {node: '>=14.0.0'}
- peerDependencies:
- postcss: ^8.0.0
-
- postcss-js@4.0.1:
- resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==}
- engines: {node: ^12 || ^14 || >= 16}
- peerDependencies:
- postcss: ^8.4.21
-
- postcss-load-config@4.0.1:
- resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==}
- engines: {node: '>= 14'}
- peerDependencies:
- postcss: '>=8.0.9'
- ts-node: '>=9.0.0'
- peerDependenciesMeta:
- postcss:
- optional: true
- ts-node:
- optional: true
-
- postcss-nested@6.0.1:
- resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==}
- engines: {node: '>=12.0'}
- peerDependencies:
- postcss: ^8.2.14
-
- postcss-selector-parser@6.0.11:
- resolution: {integrity: sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==}
- engines: {node: '>=4'}
-
- postcss-value-parser@4.2.0:
- resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
-
- postcss@8.4.31:
- resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==}
+ postcss@8.5.23:
+ resolution: {integrity: sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg==}
engines: {node: ^10 || ^12 || >=14}
- postcss@8.4.35:
- resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==}
+ postcss@8.5.28:
+ resolution: {integrity: sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==}
engines: {node: ^10 || ^12 || >=14}
prelude-ls@1.2.1:
resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
engines: {node: '>= 0.8.0'}
- prettier-linter-helpers@1.0.0:
- resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==}
+ prettier-linter-helpers@1.0.1:
+ resolution: {integrity: sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==}
engines: {node: '>=6.0.0'}
- prettier-plugin-packagejson@2.5.15:
- resolution: {integrity: sha512-2QSx6y4IT6LTwXtCvXAopENW5IP/aujC8fobEM2pDbs0IGkiVjW/ipPuYAHuXigbNe64aGWF7vIetukuzM3CBw==}
- peerDependencies:
- prettier: '>= 1.16.0'
- peerDependenciesMeta:
- prettier:
- optional: true
-
- prettier-plugin-tailwindcss@0.5.11:
- resolution: {integrity: sha512-AvI/DNyMctyyxGOjyePgi/gqj5hJYClZ1avtQvLlqMT3uDZkRbi4HhGUpok3DRzv9z7Lti85Kdj3s3/1CeNI0w==}
- engines: {node: '>=14.21.3'}
+ prettier-plugin-tailwindcss@0.8.1:
+ resolution: {integrity: sha512-iaFMYqDsE4ffdDkn5qup0j5f2aCEBFZrdrZnvu9QKTlWx/iGPeQ4HHu7b7fCPMxeo9nwQBiOAh2nSypdFYWJkw==}
+ engines: {node: '>=20.19'}
peerDependencies:
'@ianvs/prettier-plugin-sort-imports': '*'
+ '@prettier/plugin-hermes': '*'
+ '@prettier/plugin-oxc': '*'
'@prettier/plugin-pug': '*'
'@shopify/prettier-plugin-liquid': '*'
'@trivago/prettier-plugin-sort-imports': '*'
+ '@zackad/prettier-plugin-twig': '*'
prettier: ^3.0
prettier-plugin-astro: '*'
prettier-plugin-css-order: '*'
- prettier-plugin-import-sort: '*'
prettier-plugin-jsdoc: '*'
prettier-plugin-marko: '*'
+ prettier-plugin-multiline-arrays: '*'
prettier-plugin-organize-attributes: '*'
prettier-plugin-organize-imports: '*'
- prettier-plugin-style-order: '*'
+ prettier-plugin-sort-imports: '*'
prettier-plugin-svelte: '*'
- prettier-plugin-twig-melody: '*'
peerDependenciesMeta:
'@ianvs/prettier-plugin-sort-imports':
optional: true
+ '@prettier/plugin-hermes':
+ optional: true
+ '@prettier/plugin-oxc':
+ optional: true
'@prettier/plugin-pug':
optional: true
'@shopify/prettier-plugin-liquid':
optional: true
'@trivago/prettier-plugin-sort-imports':
optional: true
+ '@zackad/prettier-plugin-twig':
+ optional: true
prettier-plugin-astro:
optional: true
prettier-plugin-css-order:
optional: true
- prettier-plugin-import-sort:
- optional: true
prettier-plugin-jsdoc:
optional: true
prettier-plugin-marko:
optional: true
+ prettier-plugin-multiline-arrays:
+ optional: true
prettier-plugin-organize-attributes:
optional: true
prettier-plugin-organize-imports:
optional: true
- prettier-plugin-style-order:
+ prettier-plugin-sort-imports:
optional: true
prettier-plugin-svelte:
optional: true
- prettier-plugin-twig-melody:
- optional: true
- prettier@3.2.5:
- resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==}
+ prettier@3.9.6:
+ resolution: {integrity: sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==}
engines: {node: '>=14'}
hasBin: true
- pretty-bytes@5.6.0:
- resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==}
- engines: {node: '>=6'}
-
pretty-format@27.5.1:
resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==}
engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
- pretty-format@29.4.2:
- resolution: {integrity: sha512-qKlHR8yFVCbcEWba0H0TOC8dnLlO4vPlyEjRPw31FZ2Rupy9nLa8ZLbYny8gWEl8CkEhJqAE6IzdNELTBVcBEg==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- pretty-format@29.7.0:
- resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- process@0.11.10:
- resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==}
- engines: {node: '>= 0.6.0'}
-
- prompts@2.4.2:
- resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==}
- engines: {node: '>= 6'}
-
prop-types@15.8.1:
resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
- proxy-from-env@1.0.0:
- resolution: {integrity: sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==}
-
- proxy-from-env@1.1.0:
- resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
-
- psl@1.9.0:
- resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==}
-
- pump@3.0.0:
- resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==}
-
- punycode@2.3.0:
- resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==}
+ punycode@2.3.1:
+ resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
engines: {node: '>=6'}
- pure-rand@6.0.4:
- resolution: {integrity: sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==}
-
- qs@6.10.4:
- resolution: {integrity: sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==}
- engines: {node: '>=0.6'}
-
- querystringify@2.2.0:
- resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==}
-
queue-microtask@1.2.3:
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
- react-dom@19.0.0-rc-d1afcb43-20240903:
- resolution: {integrity: sha512-2c1WEFLt4iODSlnuQv+H2U0GvglEKn21hWboP489758A/1olwMKUwC8IOox6Hgh1g+Zu92fUgsWU+wJGIK6Tzg==}
+ react-dom@19.3.0:
+ resolution: {integrity: sha512-JDk8dgif51OjFoDE70+OT9ICyYr+69HlmihNwp1+Nsfbna3t5sIiCa9ZJktDmQ4/1b/rn26hIAR2uYXDMr5r0Q==}
peerDependencies:
- react: 19.0.0-rc-d1afcb43-20240903
+ react: ^19.3.0
react-is@16.13.1:
resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
@@ -3940,58 +2695,10 @@ packages:
react-is@17.0.2:
resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==}
- react-is@18.2.0:
- resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==}
-
- react-remove-scroll-bar@2.3.8:
- resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==}
- engines: {node: '>=10'}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
- react-remove-scroll@2.7.1:
- resolution: {integrity: sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA==}
- engines: {node: '>=10'}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
- react-style-singleton@2.2.3:
- resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==}
- engines: {node: '>=10'}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
- react@19.0.0-rc-d1afcb43-20240903:
- resolution: {integrity: sha512-fCQZwZOveZEXThFJDK164B7L4++upA9x3SuJYEt9aVbFgTVIguo4ku01G/kQcxlymGUR3AnpZ/jWGNf77d0h2Q==}
+ react@19.3.0:
+ resolution: {integrity: sha512-E8LUcbtBWt20bbl2YoHfx4ZDBdxVTfOKtCZn9cDSJ4l6/nuoApcpIBcj47t2wZoVX8g2ZHuMHbiShgCR1T5Sog==}
engines: {node: '>=0.10.0'}
- read-cache@1.0.0:
- resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==}
-
- read-pkg-up@7.0.1:
- resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==}
- engines: {node: '>=8'}
-
- read-pkg@5.2.0:
- resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==}
- engines: {node: '>=8'}
-
- readdirp@3.6.0:
- resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
- engines: {node: '>=8.10.0'}
-
redent@3.0.0:
resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==}
engines: {node: '>=8'}
@@ -4000,172 +2707,73 @@ packages:
resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==}
engines: {node: '>= 0.4'}
- reflect.getprototypeof@1.0.5:
- resolution: {integrity: sha512-62wgfC8dJWrmxv44CA36pLDnP6KKl3Vhxb7PL+8+qrrFMMoJij4vgiMP8zV4O8+CBMXY1mHxI5fITGHXFHVmQQ==}
- engines: {node: '>= 0.4'}
-
- regenerator-runtime@0.13.11:
- resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==}
-
- regexp-tree@0.1.27:
- resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==}
- hasBin: true
-
- regexp.prototype.flags@1.4.3:
- resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==}
- engines: {node: '>= 0.4'}
-
- regexp.prototype.flags@1.5.2:
- resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==}
- engines: {node: '>= 0.4'}
-
regexp.prototype.flags@1.5.4:
resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==}
engines: {node: '>= 0.4'}
- regexpp@3.2.0:
- resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==}
- engines: {node: '>=8'}
-
- regjsparser@0.10.0:
- resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==}
- hasBin: true
-
- request-progress@3.0.0:
- resolution: {integrity: sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==}
-
- require-directory@2.1.1:
- 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'}
- requires-port@1.0.0:
- resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==}
-
- resolve-cwd@3.0.0:
- resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==}
- engines: {node: '>=8'}
+ reselect@5.3.0:
+ resolution: {integrity: sha512-XGoLeRAVzUTcJ1qkxPQhDJyIZ5d6zzZD9nT7AEZOaaU9UbWclhycElmhO+VD5bFeLuzhPBaOV2oXC8uG35ZSpg==}
resolve-from@4.0.0:
resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
engines: {node: '>=4'}
- resolve-from@5.0.0:
- resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==}
- engines: {node: '>=8'}
-
- resolve.exports@2.0.0:
- resolution: {integrity: sha512-6K/gDlqgQscOlg9fSRpWstA8sYe8rbELsSTNpx+3kTrsVCzvSl0zIvRErM7fdl9ERWDsKnrLnwB+Ne89918XOg==}
- engines: {node: '>=10'}
-
- resolve@1.19.0:
- resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==}
-
- resolve@1.22.2:
- resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==}
- hasBin: true
-
- resolve@1.22.8:
- resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==}
- hasBin: true
-
- resolve@2.0.0-next.4:
- resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==}
- hasBin: true
+ resolve-pkg-maps@1.0.0:
+ resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
- resolve@2.0.0-next.5:
- resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==}
+ resolve@2.0.0-next.7:
+ resolution: {integrity: sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==}
+ engines: {node: '>= 0.4'}
hasBin: true
- restore-cursor@3.1.0:
- resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==}
- engines: {node: '>=8'}
-
- reusify@1.0.4:
- resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
+ reusify@1.1.0:
+ resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
- rfdc@1.3.0:
- resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==}
-
- rimraf@3.0.2:
- resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
+ rolldown@1.2.8:
+ resolution: {integrity: sha512-Z67nTmhZe7anqnM/EjI392w5i/ANUinjip7QYsOyN37oayduxt3ksdX0hf5OOamkAd53BiIHfbfSzfUmzKFQqQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true
run-parallel@1.2.0:
resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
- rxjs@7.8.0:
- resolution: {integrity: sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==}
-
- rxjs@7.8.1:
- resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==}
-
- safe-array-concat@1.1.0:
- resolution: {integrity: sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==}
- engines: {node: '>=0.4'}
-
- safe-array-concat@1.1.3:
- resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==}
+ safe-array-concat@1.1.4:
+ resolution: {integrity: sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==}
engines: {node: '>=0.4'}
- safe-buffer@5.2.1:
- resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
-
safe-push-apply@1.0.0:
resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==}
engines: {node: '>= 0.4'}
- safe-regex-test@1.0.0:
- resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==}
-
- safe-regex-test@1.0.3:
- resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==}
- engines: {node: '>= 0.4'}
-
safe-regex-test@1.1.0:
resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==}
engines: {node: '>= 0.4'}
- safer-buffer@2.1.2:
- resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
-
- scheduler@0.25.0-rc-d1afcb43-20240903:
- resolution: {integrity: sha512-yAxUDr230qpOdxSDPCDgl6/S9OwK2Hb5IG751dt1gsPQGsElbrPu5jPgkw6cH5u/pvJVTFDvTHVvjPTepQuryA==}
+ saxes@6.0.0:
+ resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==}
+ engines: {node: '>=v12.22.7'}
- semver@5.7.2:
- resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==}
- hasBin: true
+ scheduler@0.28.0:
+ resolution: {integrity: sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw==}
semver@6.3.1:
resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
hasBin: true
- semver@7.6.0:
- resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==}
- engines: {node: '>=10'}
- hasBin: true
-
- semver@7.7.2:
- resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==}
+ semver@7.8.5:
+ resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==}
engines: {node: '>=10'}
hasBin: true
- set-function-length@1.2.1:
- resolution: {integrity: sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==}
- engines: {node: '>= 0.4'}
-
set-function-length@1.2.2:
resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
engines: {node: '>= 0.4'}
- set-function-name@2.0.1:
- resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==}
- engines: {node: '>= 0.4'}
-
set-function-name@2.0.2:
resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==}
engines: {node: '>= 0.4'}
@@ -4174,9 +2782,14 @@ packages:
resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==}
engines: {node: '>= 0.4'}
- sharp@0.34.2:
- resolution: {integrity: sha512-lszvBmB9QURERtyKT2bNmsgxXK0ShJrL/fvqlonCo7e6xBF8nT8xU6pW+PMIbLsz0RxQk3rgH9kd8UmvOzlMJg==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ sharp@0.35.4:
+ resolution: {integrity: sha512-n++8XWcj+jCOr2IOl7h8LbKnGBDY4aPbmprMONBNFdn0ImXqpGVv5zliDs0V9HbmbCQLpbuo2ej9rAoOQTvMDA==}
+ engines: {node: '>=20.9.0'}
+ peerDependencies:
+ '@types/node': '*'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
shebang-command@2.0.0:
resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
@@ -4186,8 +2799,8 @@ packages:
resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
engines: {node: '>=8'}
- side-channel-list@1.0.0:
- resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==}
+ side-channel-list@1.0.1:
+ resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==}
engines: {node: '>= 0.4'}
side-channel-map@1.0.1:
@@ -4198,158 +2811,58 @@ packages:
resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==}
engines: {node: '>= 0.4'}
- side-channel@1.0.4:
- resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==}
-
- side-channel@1.1.0:
- resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==}
+ side-channel@1.1.1:
+ resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==}
engines: {node: '>= 0.4'}
- signal-exit@3.0.7:
- resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
-
- simple-swizzle@0.2.2:
- resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==}
-
- sisteransi@1.0.5:
- resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==}
-
- slash@3.0.0:
- resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
- engines: {node: '>=8'}
-
- slice-ansi@3.0.0:
- resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==}
- engines: {node: '>=8'}
-
- slice-ansi@4.0.0:
- resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==}
- engines: {node: '>=10'}
-
- sort-object-keys@1.1.3:
- resolution: {integrity: sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==}
-
- sort-package-json@3.2.1:
- resolution: {integrity: sha512-rTfRdb20vuoAn7LDlEtCqOkYfl2X+Qze6cLbNOzcDpbmKEhJI30tTN44d5shbKJnXsvz24QQhlCm81Bag7EOKg==}
- hasBin: true
-
- source-map-js@1.0.2:
- resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
- engines: {node: '>=0.10.0'}
+ siginfo@2.0.0:
+ resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
source-map-js@1.2.1:
resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
engines: {node: '>=0.10.0'}
- source-map-support@0.5.13:
- resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==}
-
- source-map@0.6.1:
- resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
- engines: {node: '>=0.10.0'}
-
- spdx-correct@3.2.0:
- resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==}
-
- spdx-exceptions@2.3.0:
- resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==}
-
- spdx-expression-parse@3.0.1:
- resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==}
-
- spdx-license-ids@3.0.13:
- resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==}
-
- sprintf-js@1.0.3:
- resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
-
- sshpk@1.17.0:
- resolution: {integrity: sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==}
- engines: {node: '>=0.10.0'}
- hasBin: true
-
- stack-utils@2.0.6:
- resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==}
- engines: {node: '>=10'}
+ stable-hash-x@0.2.0:
+ resolution: {integrity: sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==}
+ engines: {node: '>=12.0.0'}
- standard-engine@15.0.0:
- resolution: {integrity: sha512-4xwUhJNo1g/L2cleysUqUv7/btn7GEbYJvmgKrQ2vd/8pkTmN8cpqAZg+BT8Z1hNeEH787iWUdOpL8fmApLtxA==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ stackback@0.0.2:
+ resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
- stop-iteration-iterator@1.0.0:
- resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==}
- engines: {node: '>= 0.4'}
+ std-env@4.2.0:
+ resolution: {integrity: sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==}
stop-iteration-iterator@1.1.0:
resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==}
engines: {node: '>= 0.4'}
- string-length@4.0.2:
- resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==}
- engines: {node: '>=10'}
-
- string-width@4.2.3:
- resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
- engines: {node: '>=8'}
-
string.prototype.includes@2.0.1:
resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==}
engines: {node: '>= 0.4'}
- string.prototype.matchall@4.0.12:
- resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==}
+ string.prototype.matchall@4.1.0:
+ resolution: {integrity: sha512-tHNHTxInrYLCga9O9YGxWA3G9/nnzQw8UGAyqGx3Ar1pSTTzIuM4woFSq4SowkXCjJIwq5sIiQvEfRI9tCH1qQ==}
engines: {node: '>= 0.4'}
- string.prototype.matchall@4.0.8:
- resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==}
-
string.prototype.repeat@1.0.0:
resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==}
- string.prototype.trim@1.2.10:
- resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==}
- engines: {node: '>= 0.4'}
-
- string.prototype.trim@1.2.8:
- resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==}
+ string.prototype.trim@1.2.11:
+ resolution: {integrity: sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==}
engines: {node: '>= 0.4'}
- string.prototype.trimend@1.0.6:
- resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==}
-
- string.prototype.trimend@1.0.7:
- resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==}
-
- string.prototype.trimend@1.0.9:
- resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==}
+ string.prototype.trimend@1.0.10:
+ resolution: {integrity: sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==}
engines: {node: '>= 0.4'}
- string.prototype.trimstart@1.0.6:
- resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==}
-
- string.prototype.trimstart@1.0.7:
- resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==}
-
string.prototype.trimstart@1.0.8:
resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==}
engines: {node: '>= 0.4'}
- strip-ansi@6.0.1:
- resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
- engines: {node: '>=8'}
-
strip-bom@3.0.0:
resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
engines: {node: '>=4'}
- strip-bom@4.0.0:
- resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==}
- engines: {node: '>=8'}
-
- strip-final-newline@2.0.0:
- resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
- engines: {node: '>=6'}
-
strip-indent@3.0.0:
resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==}
engines: {node: '>=8'}
@@ -4371,256 +2884,128 @@ packages:
babel-plugin-macros:
optional: true
- sucrase@3.32.0:
- resolution: {integrity: sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==}
- engines: {node: '>=8'}
- hasBin: true
-
- supports-color@5.5.0:
- resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
- engines: {node: '>=4'}
-
supports-color@7.2.0:
resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
engines: {node: '>=8'}
- supports-color@8.1.1:
- resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==}
- engines: {node: '>=10'}
-
supports-preserve-symlinks-flag@1.0.0:
resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
engines: {node: '>= 0.4'}
- synckit@0.11.8:
- resolution: {integrity: sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==}
- engines: {node: ^14.18.0 || >=16.0.0}
+ symbol-tree@3.2.4:
+ resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==}
- synckit@0.8.8:
- resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==}
+ synckit@0.11.13:
+ resolution: {integrity: sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg==}
engines: {node: ^14.18.0 || >=16.0.0}
- tailwind-merge@2.6.0:
- resolution: {integrity: sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==}
-
- tailwindcss-animate@1.0.7:
- resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==}
- peerDependencies:
- tailwindcss: '>=3.0.0 || insiders'
-
- tailwindcss@3.4.1:
- resolution: {integrity: sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==}
- engines: {node: '>=14.0.0'}
- hasBin: true
+ tailwindcss@4.3.3:
+ resolution: {integrity: sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==}
- tapable@2.2.1:
- resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==}
+ tapable@2.3.3:
+ resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==}
engines: {node: '>=6'}
- test-exclude@6.0.0:
- resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==}
- engines: {node: '>=8'}
-
- text-table@0.2.0:
- resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
+ tinybench@6.1.4:
+ resolution: {integrity: sha512-9APumHG7r4yOk4X4WlkmE71aZcv1gvin1czO3OQ1U9iJcFA5Ja/ygyb0vPOVHTthFozUYs8CLoLUlM8grb2lTQ==}
+ engines: {node: '>=20.0.0'}
- thenify-all@1.6.0:
- resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==}
- engines: {node: '>=0.8'}
+ tinyexec@1.3.0:
+ resolution: {integrity: sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==}
+ engines: {node: '>=18'}
- thenify@3.3.1:
- resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==}
-
- throttleit@1.0.0:
- resolution: {integrity: sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g==}
-
- through@2.3.8:
- resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
-
- tinyglobby@0.2.14:
- resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==}
+ tinyglobby@0.2.17:
+ resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==}
engines: {node: '>=12.0.0'}
- tmp@0.2.1:
- resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==}
- engines: {node: '>=8.17.0'}
+ tinyrainbow@3.1.1:
+ resolution: {integrity: sha512-yau8yJdTt989Mm0Bd/236QnzEiPf2xLLTqUZRUJOo/3CB078LSwzei343DgtJVmfJKJE3TMINY1u42SQsP6mXw==}
+ engines: {node: '>=14.0.0'}
- tmpl@1.0.5:
- resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==}
+ tldts-core@7.4.12:
+ resolution: {integrity: sha512-nYNzS2WRf4QJmjzFFgAxLOBjyBxAGRbCy9PVBPaglcYyYajh40VBn+v5Ngr96ZMc7oM0+aCJdtQnNejvdBnXMQ==}
- to-fast-properties@2.0.0:
- resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
- engines: {node: '>=4'}
+ tldts@7.4.12:
+ resolution: {integrity: sha512-WylhSDKVeYnWXL3a+vKTaOxjnOeEGw938hImY8zoRWJjRRK/Jp1K+IihBzIONpUmW4e3WmXT6q5FW6vlESVZCA==}
+ hasBin: true
to-regex-range@5.0.1:
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
engines: {node: '>=8.0'}
- tough-cookie@4.1.3:
- resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==}
- engines: {node: '>=6'}
-
- ts-api-utils@1.4.3:
- resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==}
+ tough-cookie@6.0.2:
+ resolution: {integrity: sha512-exgYmnmL/sJpR3upZfXG5PoatXQii55xAiXGXzY+sROLZ/Y+SLcp9PgJNI9Vz37HpQ74WvDcLT8eqm+kV3FzrA==}
engines: {node: '>=16'}
- peerDependencies:
- typescript: '>=4.2.0'
-
- ts-interface-checker@0.1.13:
- resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
- ts-jest@29.1.2:
- resolution: {integrity: sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==}
- engines: {node: ^16.10.0 || ^18.0.0 || >=20.0.0}
- hasBin: true
- peerDependencies:
- '@babel/core': '>=7.0.0-beta.0 <8'
- '@jest/types': ^29.0.0
- babel-jest: ^29.0.0
- esbuild: '*'
- jest: ^29.0.0
- typescript: '>=4.3 <6'
- peerDependenciesMeta:
- '@babel/core':
- optional: true
- '@jest/types':
- optional: true
- babel-jest:
- optional: true
- esbuild:
- optional: true
+ tr46@6.0.0:
+ resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==}
+ engines: {node: '>=20'}
- ts-standard@12.0.2:
- resolution: {integrity: sha512-XX2wrB9fKKTfBj4yD3ABm9iShzZcS2iWcPK8XzlBvuL20+wMiLgiz/k5tXgZwTaYq5wRhbks1Y9PelhujF/9ag==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- hasBin: true
+ ts-api-utils@2.5.0:
+ resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==}
+ engines: {node: '>=18.12'}
peerDependencies:
- typescript: '*'
+ typescript: '>=4.8.4'
tsconfig-paths@3.15.0:
resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==}
- tslib@1.14.1:
- resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
-
- tslib@2.6.2:
- resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==}
-
tslib@2.8.1:
resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
- tsutils@3.21.0:
- resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==}
- engines: {node: '>= 6'}
- peerDependencies:
- typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta'
-
- tunnel-agent@0.6.0:
- resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==}
-
- tweetnacl@0.14.5:
- resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==}
-
type-check@0.4.0:
resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
engines: {node: '>= 0.8.0'}
- type-detect@4.0.8:
- resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==}
- engines: {node: '>=4'}
-
- type-fest@0.20.2:
- resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
- engines: {node: '>=10'}
-
- type-fest@0.21.3:
- resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==}
- engines: {node: '>=10'}
-
- type-fest@0.3.1:
- resolution: {integrity: sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==}
- engines: {node: '>=6'}
-
- type-fest@0.6.0:
- resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==}
- engines: {node: '>=8'}
-
- type-fest@0.8.1:
- resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==}
- engines: {node: '>=8'}
-
- typed-array-buffer@1.0.1:
- resolution: {integrity: sha512-RSqu1UEuSlrBhHTWC8O9FnPjOduNs4M7rJ4pRKoEjtx1zUNOPN2sSXHLDX+Y2WPbHIxbvg4JFo2DNAEfPIKWoQ==}
- engines: {node: '>= 0.4'}
-
typed-array-buffer@1.0.3:
resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==}
engines: {node: '>= 0.4'}
- typed-array-byte-length@1.0.0:
- resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==}
- engines: {node: '>= 0.4'}
-
typed-array-byte-length@1.0.3:
resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==}
engines: {node: '>= 0.4'}
- typed-array-byte-offset@1.0.0:
- resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==}
- engines: {node: '>= 0.4'}
-
typed-array-byte-offset@1.0.4:
resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==}
engines: {node: '>= 0.4'}
- typed-array-length@1.0.4:
- resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==}
-
- typed-array-length@1.0.7:
- resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==}
+ typed-array-length@1.0.8:
+ resolution: {integrity: sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==}
engines: {node: '>= 0.4'}
- typescript@5.3.3:
- resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==}
+ typescript-eslint@8.70.0:
+ resolution: {integrity: sha512-P/W5cz70/cQAuKfY3xwQMWWTV7BvJ0mAQmi+9mBcsVPaBUpd6Ohpa+fECv9rBFrQcig86jAiNBFNWUqnTjr4pw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
+ typescript: '>=4.8.4 <6.1.0'
+
+ typescript@6.0.3:
+ resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==}
engines: {node: '>=14.17'}
hasBin: true
- unbox-primitive@1.0.2:
- resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==}
+ typescript@7.0.2:
+ resolution: {integrity: sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==}
+ engines: {node: '>=16.20.0'}
+ hasBin: true
unbox-primitive@1.1.0:
resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==}
engines: {node: '>= 0.4'}
- undici-types@6.21.0:
- resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
-
- universalify@0.2.0:
- resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==}
- engines: {node: '>= 4.0.0'}
-
- universalify@2.0.0:
- resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==}
- engines: {node: '>= 10.0.0'}
+ undici-types@7.18.2:
+ resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==}
- untildify@4.0.0:
- resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==}
- engines: {node: '>=8'}
-
- update-browserslist-db@1.0.10:
- resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==}
- hasBin: true
- peerDependencies:
- browserslist: '>= 4.21.0'
+ undici@8.10.2:
+ resolution: {integrity: sha512-/y4/bH9YNU5hi9NIrpOuvGXFcxrj3CMrV+/AYpowAYTpHn8gX/XPFjNy766FPoYY0miQhdW977JFWKGNhBdwyQ==}
+ engines: {node: '>=22.19.0'}
- update-browserslist-db@1.0.13:
- resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==}
- hasBin: true
- peerDependencies:
- browserslist: '>= 4.21.0'
+ unrs-resolver@1.12.2:
+ resolution: {integrity: sha512-dmlRxBJJayXjqTwC+JtF1HhJmgf3ftQ3YejFcZrf4+KKtJv0qDsK1pjqaaVjG7wJ5NJ6UVP1OqRMQ71Z4C3rxQ==}
- update-browserslist-db@1.1.3:
- resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==}
+ update-browserslist-db@1.3.3:
+ resolution: {integrity: sha512-pJ2sYawQS0R/WI928Gj5GlPhTGzbMelq0+4INtSYNDV9ErKJcX6xjGWkoG/VnB3dpUm00zALaqkrUD77pO5TDQ==}
hasBin: true
peerDependencies:
browserslist: '>= 4.21.0'
@@ -4628,87 +3013,129 @@ packages:
uri-js@4.4.1:
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
- url-parse@1.5.10:
- resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==}
+ use-sync-external-store@1.7.0:
+ resolution: {integrity: sha512-6L+EeigHMQhdaIPNIFUKwfWJSwWFQ8gJbJ2DLOs5sDIegTwR9fRxvnM3uciHKjIZhFz+KAv2emhWMRvDmMcY8A==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
- use-callback-ref@1.3.3:
- resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==}
- engines: {node: '>=10'}
+ vite@8.3.0:
+ resolution: {integrity: sha512-lhZBVvEHefgE+HQZC9O7EBJgCU/nVzFNl7vkS4RE0APtWLP02/8QVIkQtzBxPquh7lq5/78NHipTj7ODQ6XuyQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ hasBin: true
peerDependencies:
- '@types/react': '*'
- react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
+ '@types/node': ^20.19.0 || >=22.12.0
+ '@vitejs/devtools': ^0.7.1
+ esbuild: ^0.27.0 || ^0.28.0
+ jiti: '>=1.21.0'
+ less: ^4.0.0
+ sass: ^1.70.0
+ sass-embedded: ^1.70.0
+ stylus: '>=0.54.8'
+ sugarss: ^5.0.0
+ terser: ^5.16.0
+ tsx: ^4.8.1
+ yaml: ^2.4.2
peerDependenciesMeta:
- '@types/react':
+ '@types/node':
+ optional: true
+ '@vitejs/devtools':
+ optional: true
+ esbuild:
+ optional: true
+ jiti:
+ optional: true
+ less:
+ optional: true
+ sass:
+ optional: true
+ sass-embedded:
+ optional: true
+ stylus:
+ optional: true
+ sugarss:
+ optional: true
+ terser:
+ optional: true
+ tsx:
+ optional: true
+ yaml:
optional: true
- use-sidecar@1.1.3:
- resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==}
- engines: {node: '>=10'}
+ vitest@5.0.0:
+ resolution: {integrity: sha512-gpsMNoRhMjMktVxPtstOH4/PJuPyovVaMDr4oDilXaGH1EcqM2OE96SoHT2VIQ6fTGtTjqmHDrEu2X9RQiXf8Q==}
+ engines: {node: ^22.12.0 || ^24.0.0 || >=26.0.0}
+ hasBin: true
peerDependencies:
- '@types/react': '*'
- react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
+ '@edge-runtime/vm': '*'
+ '@opentelemetry/api': ^1.9.0
+ '@types/node': ^22.0.0 || >=24.0.0
+ '@vitest/browser-playwright': 5.0.0
+ '@vitest/browser-preview': 5.0.0
+ '@vitest/browser-webdriverio': ^5.0.0-beta.5 || >=5.0.0
+ '@vitest/coverage-istanbul': 5.0.0
+ '@vitest/coverage-v8': 5.0.0
+ '@vitest/ui': 5.0.0
+ happy-dom: '*'
+ jsdom: '*'
+ vite: ^6.4.0 || ^7.0.0 || ^8.0.0
peerDependenciesMeta:
- '@types/react':
+ '@edge-runtime/vm':
optional: true
+ '@opentelemetry/api':
+ optional: true
+ '@types/node':
+ optional: true
+ '@vitest/browser-playwright':
+ optional: true
+ '@vitest/browser-preview':
+ optional: true
+ '@vitest/browser-webdriverio':
+ optional: true
+ '@vitest/coverage-istanbul':
+ optional: true
+ '@vitest/coverage-v8':
+ optional: true
+ '@vitest/ui':
+ optional: true
+ happy-dom:
+ optional: true
+ jsdom:
+ optional: true
+
+ w3c-xmlserializer@5.0.0:
+ resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==}
+ engines: {node: '>=18'}
+
+ webidl-conversions@8.0.1:
+ resolution: {integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==}
+ engines: {node: '>=20'}
+
+ whatwg-mimetype@5.0.0:
+ resolution: {integrity: sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==}
+ engines: {node: '>=20'}
+
+ whatwg-url@16.0.1:
+ resolution: {integrity: sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==}
+ engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0}
- util-deprecate@1.0.2:
- resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
-
- uuid@8.3.2:
- resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==}
- hasBin: true
-
- v8-to-istanbul@9.0.1:
- resolution: {integrity: sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==}
- engines: {node: '>=10.12.0'}
-
- validate-npm-package-license@3.0.4:
- resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==}
-
- verror@1.10.0:
- resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==}
- engines: {'0': node >=0.6.0}
-
- wait-on@7.2.0:
- resolution: {integrity: sha512-wCQcHkRazgjG5XoAq9jbTMLpNIjoSlZslrJ2+N9MxDsGEv1HnFoVjOCexL0ESva7Y9cu350j+DWADdk54s4AFQ==}
- engines: {node: '>=12.0.0'}
- hasBin: true
-
- walker@1.0.8:
- resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==}
-
- which-boxed-primitive@1.0.2:
- resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==}
+ whatwg-url@17.1.1:
+ resolution: {integrity: sha512-ohjk1mdUebJVadRt3bAhQhx8lSnISq+GDttK79LFl8EHQkAPvzwctoasC4hs8tBt6kLAncBWWyq1N52qEfKvDw==}
+ engines: {node: ^22.14.0 || >=24.0.0}
which-boxed-primitive@1.1.1:
resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==}
engines: {node: '>= 0.4'}
- which-builtin-type@1.1.3:
- resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==}
- engines: {node: '>= 0.4'}
-
which-builtin-type@1.2.1:
resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==}
engines: {node: '>= 0.4'}
- which-collection@1.0.1:
- resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==}
-
which-collection@1.0.2:
resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==}
engines: {node: '>= 0.4'}
- which-typed-array@1.1.14:
- resolution: {integrity: sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==}
- engines: {node: '>= 0.4'}
-
- which-typed-array@1.1.19:
- resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==}
- engines: {node: '>= 0.4'}
-
- which-typed-array@1.1.9:
- resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==}
+ which-typed-array@1.1.22:
+ resolution: {integrity: sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==}
engines: {node: '>= 0.4'}
which@2.0.2:
@@ -4716,2087 +3143,1193 @@ packages:
engines: {node: '>= 8'}
hasBin: true
- wrap-ansi@6.2.0:
- resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==}
+ why-is-node-running@2.3.0:
+ resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==}
engines: {node: '>=8'}
+ hasBin: true
- wrap-ansi@7.0.0:
- resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
- engines: {node: '>=10'}
-
- wrappy@1.0.2:
- resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
-
- write-file-atomic@4.0.2:
- resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==}
- engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
+ word-wrap@1.2.5:
+ resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
+ engines: {node: '>=0.10.0'}
- xdg-basedir@4.0.0:
- resolution: {integrity: sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==}
- engines: {node: '>=8'}
+ xml-name-validator@5.0.0:
+ resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==}
+ engines: {node: '>=18'}
- y18n@5.0.8:
- resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
- engines: {node: '>=10'}
+ xmlchars@2.2.0:
+ resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==}
yallist@3.1.1:
resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
- yallist@4.0.0:
- resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
-
- yaml@2.2.2:
- resolution: {integrity: sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==}
- engines: {node: '>= 14'}
-
- yargs-parser@21.1.1:
- resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
- engines: {node: '>=12'}
-
- yargs@17.6.2:
- resolution: {integrity: sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==}
- engines: {node: '>=12'}
-
- yauzl@2.10.0:
- resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==}
-
yocto-queue@0.1.0:
resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
engines: {node: '>=10'}
- yocto-queue@1.0.0:
- resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==}
- engines: {node: '>=12.20'}
+ zod-validation-error@4.0.2:
+ resolution: {integrity: sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==}
+ engines: {node: '>=18.0.0'}
+ peerDependencies:
+ zod: ^3.25.0 || ^4.0.0
+
+ zod@4.6.2:
+ resolution: {integrity: sha512-lh5RCAGFa1Cm2hjtNwLQhSs/AsqdWnTQaBER9fEwN/88pSh7KOtJavtBx/0VlkN/uFd61SwYmljLMDAsHlvzBQ==}
snapshots:
- '@aashutoshrathi/word-wrap@1.2.6': {}
-
- '@adobe/css-tools@4.3.3': {}
+ '@adobe/css-tools@4.5.0': {}
- '@alloc/quick-lru@5.2.0': {}
+ '@alloc/quick-lru@5.3.0': {}
- '@ampproject/remapping@2.2.0':
+ '@asamuzakjp/css-color@6.0.7':
dependencies:
- '@jridgewell/gen-mapping': 0.1.1
- '@jridgewell/trace-mapping': 0.3.17
+ '@csstools/css-calc': 3.3.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)
+ '@csstools/css-color-parser': 4.2.2(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)
+ '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0)
+ '@csstools/css-tokenizer': 4.0.0
+ lru-cache: 11.5.2
- '@babel/code-frame@7.18.6':
+ '@asamuzakjp/dom-selector@8.3.2':
dependencies:
- '@babel/highlight': 7.18.6
+ bidi-js: 1.1.0
+ css-tree: 3.2.1
+ is-potential-custom-element-name: 1.0.1
+ lru-cache: 11.5.2
- '@babel/code-frame@7.27.1':
+ '@babel/code-frame@7.29.7':
dependencies:
- '@babel/helper-validator-identifier': 7.27.1
+ '@babel/helper-validator-identifier': 7.29.7
js-tokens: 4.0.0
picocolors: 1.1.1
- '@babel/compat-data@7.20.14': {}
+ '@babel/compat-data@7.29.7': {}
- '@babel/compat-data@7.27.5': {}
-
- '@babel/core@7.20.12':
+ '@babel/core@7.29.7(supports-color@7.2.0)':
dependencies:
- '@ampproject/remapping': 2.2.0
- '@babel/code-frame': 7.18.6
- '@babel/generator': 7.20.14
- '@babel/helper-compilation-targets': 7.20.7(@babel/core@7.20.12)
- '@babel/helper-module-transforms': 7.20.11
- '@babel/helpers': 7.20.13
- '@babel/parser': 7.20.15
- '@babel/template': 7.20.7
- '@babel/traverse': 7.20.13
- '@babel/types': 7.20.7
- convert-source-map: 1.9.0
- debug: 4.3.4(supports-color@8.1.1)
- gensync: 1.0.0-beta.2
- json5: 2.2.3
- semver: 6.3.1
- transitivePeerDependencies:
- - supports-color
-
- '@babel/core@7.27.4':
- dependencies:
- '@ampproject/remapping': 2.2.0
- '@babel/code-frame': 7.27.1
- '@babel/generator': 7.27.5
- '@babel/helper-compilation-targets': 7.27.2
- '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4)
- '@babel/helpers': 7.27.4
- '@babel/parser': 7.27.5
- '@babel/template': 7.27.2
- '@babel/traverse': 7.27.4
- '@babel/types': 7.27.3
+ '@babel/code-frame': 7.29.7
+ '@babel/generator': 7.29.8
+ '@babel/helper-compilation-targets': 7.29.7
+ '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0)
+ '@babel/helpers': 7.29.7
+ '@babel/parser': 7.29.8
+ '@babel/template': 7.29.7
+ '@babel/traverse': 7.29.8(supports-color@7.2.0)
+ '@babel/types': 7.29.8
+ '@jridgewell/remapping': 2.3.5
convert-source-map: 2.0.0
- debug: 4.3.4(supports-color@8.1.1)
+ debug: 4.4.3(supports-color@7.2.0)
gensync: 1.0.0-beta.2
json5: 2.2.3
semver: 6.3.1
transitivePeerDependencies:
- supports-color
- '@babel/eslint-parser@7.23.10(@babel/core@7.27.4)(eslint@8.56.0)':
- dependencies:
- '@babel/core': 7.27.4
- '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1
- eslint: 8.56.0
- eslint-visitor-keys: 2.1.0
- semver: 6.3.1
-
- '@babel/generator@7.20.14':
- dependencies:
- '@babel/types': 7.20.7
- '@jridgewell/gen-mapping': 0.3.2
- jsesc: 2.5.2
-
- '@babel/generator@7.27.5':
+ '@babel/generator@7.29.8':
dependencies:
- '@babel/parser': 7.27.5
- '@babel/types': 7.27.3
- '@jridgewell/gen-mapping': 0.3.8
- '@jridgewell/trace-mapping': 0.3.25
- jsesc: 3.0.2
-
- '@babel/helper-compilation-targets@7.20.7(@babel/core@7.20.12)':
- dependencies:
- '@babel/compat-data': 7.20.14
- '@babel/core': 7.20.12
- '@babel/helper-validator-option': 7.18.6
- browserslist: 4.21.5
- lru-cache: 5.1.1
- semver: 6.3.1
+ '@babel/parser': 7.29.8
+ '@babel/types': 7.29.8
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
+ jsesc: 3.1.0
- '@babel/helper-compilation-targets@7.27.2':
+ '@babel/helper-compilation-targets@7.29.7':
dependencies:
- '@babel/compat-data': 7.27.5
- '@babel/helper-validator-option': 7.27.1
- browserslist: 4.25.0
+ '@babel/compat-data': 7.29.7
+ '@babel/helper-validator-option': 7.29.7
+ browserslist: 4.28.9
lru-cache: 5.1.1
semver: 6.3.1
- '@babel/helper-environment-visitor@7.18.9': {}
+ '@babel/helper-globals@7.29.7': {}
- '@babel/helper-function-name@7.19.0':
+ '@babel/helper-module-imports@7.29.7(supports-color@7.2.0)':
dependencies:
- '@babel/template': 7.20.7
- '@babel/types': 7.20.7
-
- '@babel/helper-hoist-variables@7.18.6':
- dependencies:
- '@babel/types': 7.20.7
-
- '@babel/helper-module-imports@7.18.6':
- dependencies:
- '@babel/types': 7.20.7
-
- '@babel/helper-module-imports@7.27.1':
- dependencies:
- '@babel/traverse': 7.27.4
- '@babel/types': 7.27.3
+ '@babel/traverse': 7.29.8(supports-color@7.2.0)
+ '@babel/types': 7.29.8
transitivePeerDependencies:
- supports-color
- '@babel/helper-module-transforms@7.20.11':
+ '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0)':
dependencies:
- '@babel/helper-environment-visitor': 7.18.9
- '@babel/helper-module-imports': 7.18.6
- '@babel/helper-simple-access': 7.20.2
- '@babel/helper-split-export-declaration': 7.18.6
- '@babel/helper-validator-identifier': 7.19.1
- '@babel/template': 7.20.7
- '@babel/traverse': 7.20.13
- '@babel/types': 7.20.7
+ '@babel/core': 7.29.7(supports-color@7.2.0)
+ '@babel/helper-module-imports': 7.29.7(supports-color@7.2.0)
+ '@babel/helper-validator-identifier': 7.29.7
+ '@babel/traverse': 7.29.8(supports-color@7.2.0)
transitivePeerDependencies:
- supports-color
- '@babel/helper-module-transforms@7.27.3(@babel/core@7.27.4)':
- dependencies:
- '@babel/core': 7.27.4
- '@babel/helper-module-imports': 7.27.1
- '@babel/helper-validator-identifier': 7.27.1
- '@babel/traverse': 7.27.4
- transitivePeerDependencies:
- - supports-color
+ '@babel/helper-string-parser@7.29.7': {}
- '@babel/helper-plugin-utils@7.20.2': {}
+ '@babel/helper-validator-identifier@7.29.7': {}
- '@babel/helper-simple-access@7.20.2':
- dependencies:
- '@babel/types': 7.20.7
+ '@babel/helper-validator-option@7.29.7': {}
- '@babel/helper-split-export-declaration@7.18.6':
+ '@babel/helpers@7.29.7':
dependencies:
- '@babel/types': 7.20.7
-
- '@babel/helper-string-parser@7.19.4': {}
-
- '@babel/helper-string-parser@7.27.1': {}
+ '@babel/template': 7.29.7
+ '@babel/types': 7.29.8
- '@babel/helper-validator-identifier@7.19.1': {}
-
- '@babel/helper-validator-identifier@7.22.20': {}
-
- '@babel/helper-validator-identifier@7.27.1': {}
+ '@babel/parser@7.29.8':
+ dependencies:
+ '@babel/types': 7.29.8
- '@babel/helper-validator-option@7.18.6': {}
+ '@babel/runtime@7.29.7': {}
- '@babel/helper-validator-option@7.27.1': {}
+ '@babel/template@7.29.7':
+ dependencies:
+ '@babel/code-frame': 7.29.7
+ '@babel/parser': 7.29.8
+ '@babel/types': 7.29.8
- '@babel/helpers@7.20.13':
+ '@babel/traverse@7.29.8(supports-color@7.2.0)':
dependencies:
- '@babel/template': 7.20.7
- '@babel/traverse': 7.20.13
- '@babel/types': 7.20.7
+ '@babel/code-frame': 7.29.7
+ '@babel/generator': 7.29.8
+ '@babel/helper-globals': 7.29.7
+ '@babel/parser': 7.29.8
+ '@babel/template': 7.29.7
+ '@babel/types': 7.29.8
+ debug: 4.4.3(supports-color@7.2.0)
transitivePeerDependencies:
- supports-color
- '@babel/helpers@7.27.4':
+ '@babel/types@7.29.8':
dependencies:
- '@babel/template': 7.27.2
- '@babel/types': 7.27.3
+ '@babel/helper-string-parser': 7.29.7
+ '@babel/helper-validator-identifier': 7.29.7
- '@babel/highlight@7.18.6':
+ '@base-ui/react@1.8.0(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)':
dependencies:
- '@babel/helper-validator-identifier': 7.19.1
- chalk: 2.4.2
- js-tokens: 4.0.0
+ '@babel/runtime': 7.29.7
+ '@base-ui/utils': 0.4.0(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
+ '@floating-ui/react-dom': 2.1.9(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
+ '@floating-ui/utils': 0.2.12
+ react: 19.3.0
+ react-dom: 19.3.0(react@19.3.0)
+ use-sync-external-store: 1.7.0(react@19.3.0)
+ optionalDependencies:
+ '@types/react': 19.3.0
- '@babel/parser@7.20.15':
+ '@base-ui/utils@0.4.0(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)':
dependencies:
- '@babel/types': 7.20.7
+ '@babel/runtime': 7.29.7
+ '@floating-ui/utils': 0.2.12
+ react: 19.3.0
+ react-dom: 19.3.0(react@19.3.0)
+ reselect: 5.3.0
+ use-sync-external-store: 1.7.0(react@19.3.0)
+ optionalDependencies:
+ '@types/react': 19.3.0
- '@babel/parser@7.27.5':
- dependencies:
- '@babel/types': 7.27.3
+ '@bcoe/v8-coverage@1.0.2': {}
- '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.20.12)':
+ '@bramus/specificity@2.4.2':
dependencies:
- '@babel/core': 7.20.12
- '@babel/helper-plugin-utils': 7.20.2
+ css-tree: 3.2.1
- '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.20.12)':
- dependencies:
- '@babel/core': 7.20.12
- '@babel/helper-plugin-utils': 7.20.2
+ '@csstools/color-helpers@6.1.1': {}
- '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.20.12)':
+ '@csstools/css-calc@3.3.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)':
dependencies:
- '@babel/core': 7.20.12
- '@babel/helper-plugin-utils': 7.20.2
+ '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0)
+ '@csstools/css-tokenizer': 4.0.0
- '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.20.12)':
+ '@csstools/css-color-parser@4.2.2(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)':
dependencies:
- '@babel/core': 7.20.12
- '@babel/helper-plugin-utils': 7.20.2
+ '@csstools/color-helpers': 6.1.1
+ '@csstools/css-calc': 3.3.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)
+ '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0)
+ '@csstools/css-tokenizer': 4.0.0
- '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.20.12)':
+ '@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0)':
dependencies:
- '@babel/core': 7.20.12
- '@babel/helper-plugin-utils': 7.20.2
+ '@csstools/css-tokenizer': 4.0.0
- '@babel/plugin-syntax-jsx@7.18.6(@babel/core@7.20.12)':
- dependencies:
- '@babel/core': 7.20.12
- '@babel/helper-plugin-utils': 7.20.2
+ '@csstools/css-syntax-patches-for-csstree@1.1.13(css-tree@3.2.1)':
+ optionalDependencies:
+ css-tree: 3.2.1
- '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.20.12)':
- dependencies:
- '@babel/core': 7.20.12
- '@babel/helper-plugin-utils': 7.20.2
+ '@csstools/css-tokenizer@4.0.0': {}
- '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.20.12)':
+ '@emnapi/core@1.10.0':
dependencies:
- '@babel/core': 7.20.12
- '@babel/helper-plugin-utils': 7.20.2
+ '@emnapi/wasi-threads': 1.2.1
+ tslib: 2.8.1
+ optional: true
- '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.20.12)':
+ '@emnapi/runtime@1.10.0':
dependencies:
- '@babel/core': 7.20.12
- '@babel/helper-plugin-utils': 7.20.2
+ tslib: 2.8.1
+ optional: true
- '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.20.12)':
+ '@emnapi/runtime@1.11.3':
dependencies:
- '@babel/core': 7.20.12
- '@babel/helper-plugin-utils': 7.20.2
+ tslib: 2.8.1
+ optional: true
- '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.20.12)':
+ '@emnapi/wasi-threads@1.2.1':
dependencies:
- '@babel/core': 7.20.12
- '@babel/helper-plugin-utils': 7.20.2
+ tslib: 2.8.1
+ optional: true
- '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.20.12)':
+ '@eslint-community/eslint-utils@4.10.1(eslint@9.39.5(jiti@2.7.0)(supports-color@7.2.0))':
dependencies:
- '@babel/core': 7.20.12
- '@babel/helper-plugin-utils': 7.20.2
+ eslint: 9.39.5(jiti@2.7.0)(supports-color@7.2.0)
+ eslint-visitor-keys: 3.4.3
- '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.20.12)':
+ '@eslint-community/eslint-utils@4.9.1(eslint@9.39.5(jiti@2.7.0)(supports-color@7.2.0))':
dependencies:
- '@babel/core': 7.20.12
- '@babel/helper-plugin-utils': 7.20.2
+ eslint: 9.39.5(jiti@2.7.0)(supports-color@7.2.0)
+ eslint-visitor-keys: 3.4.3
- '@babel/plugin-syntax-typescript@7.20.0(@babel/core@7.20.12)':
- dependencies:
- '@babel/core': 7.20.12
- '@babel/helper-plugin-utils': 7.20.2
+ '@eslint-community/regexpp@4.12.2': {}
- '@babel/runtime@7.20.13':
+ '@eslint/config-array@0.21.2(supports-color@7.2.0)':
dependencies:
- regenerator-runtime: 0.13.11
+ '@eslint/object-schema': 2.1.7
+ debug: 4.4.3(supports-color@7.2.0)
+ minimatch: 3.1.5
+ transitivePeerDependencies:
+ - supports-color
- '@babel/template@7.20.7':
+ '@eslint/config-helpers@0.4.2':
dependencies:
- '@babel/code-frame': 7.18.6
- '@babel/parser': 7.20.15
- '@babel/types': 7.20.7
+ '@eslint/core': 0.17.0
- '@babel/template@7.27.2':
+ '@eslint/core@0.17.0':
dependencies:
- '@babel/code-frame': 7.27.1
- '@babel/parser': 7.27.5
- '@babel/types': 7.27.3
+ '@types/json-schema': 7.0.15
- '@babel/traverse@7.20.13':
+ '@eslint/eslintrc@3.3.7(supports-color@7.2.0)':
dependencies:
- '@babel/code-frame': 7.18.6
- '@babel/generator': 7.20.14
- '@babel/helper-environment-visitor': 7.18.9
- '@babel/helper-function-name': 7.19.0
- '@babel/helper-hoist-variables': 7.18.6
- '@babel/helper-split-export-declaration': 7.18.6
- '@babel/parser': 7.20.15
- '@babel/types': 7.20.7
- debug: 4.3.4(supports-color@8.1.1)
- globals: 11.12.0
+ ajv: 6.15.0
+ debug: 4.4.3(supports-color@7.2.0)
+ espree: 10.4.0
+ globals: 14.0.0
+ ignore: 5.3.2
+ import-fresh: 3.3.1
+ js-yaml: 4.3.2
+ minimatch: 3.1.5
+ strip-json-comments: 3.1.1
transitivePeerDependencies:
- supports-color
- '@babel/traverse@7.27.4':
- dependencies:
- '@babel/code-frame': 7.27.1
- '@babel/generator': 7.27.5
- '@babel/parser': 7.27.5
- '@babel/template': 7.27.2
- '@babel/types': 7.27.3
- debug: 4.3.4(supports-color@8.1.1)
- globals: 11.12.0
- transitivePeerDependencies:
- - supports-color
+ '@eslint/js@9.39.5': {}
- '@babel/types@7.20.7':
- dependencies:
- '@babel/helper-string-parser': 7.19.4
- '@babel/helper-validator-identifier': 7.19.1
- to-fast-properties: 2.0.0
+ '@eslint/object-schema@2.1.7': {}
- '@babel/types@7.27.3':
+ '@eslint/plugin-kit@0.4.1':
dependencies:
- '@babel/helper-string-parser': 7.27.1
- '@babel/helper-validator-identifier': 7.27.1
-
- '@bcoe/v8-coverage@0.2.3': {}
-
- '@colors/colors@1.5.0':
- optional: true
+ '@eslint/core': 0.17.0
+ levn: 0.4.1
- '@cypress/request@3.0.1':
- dependencies:
- aws-sign2: 0.7.0
- aws4: 1.12.0
- caseless: 0.12.0
- combined-stream: 1.0.8
- extend: 3.0.2
- forever-agent: 0.6.1
- form-data: 2.3.3
- http-signature: 1.3.6
- is-typedarray: 1.0.0
- isstream: 0.1.2
- json-stringify-safe: 5.0.1
- mime-types: 2.1.35
- performance-now: 2.1.0
- qs: 6.10.4
- safe-buffer: 5.2.1
- tough-cookie: 4.1.3
- tunnel-agent: 0.6.0
- uuid: 8.3.2
+ '@exodus/bytes@1.15.1': {}
- '@cypress/xvfb@1.2.4(supports-color@8.1.1)':
+ '@floating-ui/core@1.8.0':
dependencies:
- debug: 3.2.7(supports-color@8.1.1)
- lodash.once: 4.1.1
- transitivePeerDependencies:
- - supports-color
+ '@floating-ui/utils': 0.2.12
- '@emnapi/runtime@1.4.3':
+ '@floating-ui/dom@1.8.0':
dependencies:
- tslib: 2.8.1
- optional: true
+ '@floating-ui/core': 1.8.0
+ '@floating-ui/utils': 0.2.12
- '@eslint-community/eslint-utils@4.4.0(eslint@8.56.0)':
+ '@floating-ui/react-dom@2.1.9(react-dom@19.3.0(react@19.3.0))(react@19.3.0)':
dependencies:
- eslint: 8.56.0
- eslint-visitor-keys: 3.4.3
+ '@floating-ui/dom': 1.8.0
+ react: 19.3.0
+ react-dom: 19.3.0(react@19.3.0)
- '@eslint-community/regexpp@4.10.0': {}
+ '@floating-ui/utils@0.2.12': {}
- '@eslint/eslintrc@2.1.4':
+ '@humanfs/core@0.19.2':
dependencies:
- ajv: 6.12.6
- debug: 4.3.4(supports-color@8.1.1)
- espree: 9.6.1
- globals: 13.20.0
- ignore: 5.2.4
- 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.56.0': {}
+ '@humanfs/types': 0.15.0
- '@hapi/hoek@9.3.0': {}
-
- '@hapi/topo@5.1.0':
+ '@humanfs/node@0.16.8':
dependencies:
- '@hapi/hoek': 9.3.0
+ '@humanfs/core': 0.19.2
+ '@humanfs/types': 0.15.0
+ '@humanwhocodes/retry': 0.4.3
- '@humanwhocodes/config-array@0.11.14':
- dependencies:
- '@humanwhocodes/object-schema': 2.0.2
- debug: 4.3.4(supports-color@8.1.1)
- minimatch: 3.1.2
- transitivePeerDependencies:
- - supports-color
+ '@humanfs/types@0.15.0': {}
'@humanwhocodes/module-importer@1.0.1': {}
- '@humanwhocodes/object-schema@2.0.2': {}
+ '@humanwhocodes/retry@0.4.3': {}
+
+ '@img/colour@1.1.0':
+ optional: true
- '@img/sharp-darwin-arm64@0.34.2':
+ '@img/sharp-darwin-arm64@0.35.4':
optionalDependencies:
- '@img/sharp-libvips-darwin-arm64': 1.1.0
+ '@img/sharp-libvips-darwin-arm64': 1.3.3
optional: true
- '@img/sharp-darwin-x64@0.34.2':
+ '@img/sharp-darwin-x64@0.35.4':
optionalDependencies:
- '@img/sharp-libvips-darwin-x64': 1.1.0
+ '@img/sharp-libvips-darwin-x64': 1.3.3
optional: true
- '@img/sharp-libvips-darwin-arm64@1.1.0':
+ '@img/sharp-freebsd-wasm32@0.35.4':
+ dependencies:
+ '@img/sharp-wasm32': 0.35.4
optional: true
- '@img/sharp-libvips-darwin-x64@1.1.0':
+ '@img/sharp-libvips-darwin-arm64@1.3.3':
optional: true
- '@img/sharp-libvips-linux-arm64@1.1.0':
+ '@img/sharp-libvips-darwin-x64@1.3.3':
optional: true
- '@img/sharp-libvips-linux-arm@1.1.0':
+ '@img/sharp-libvips-linux-arm64@1.3.3':
optional: true
- '@img/sharp-libvips-linux-ppc64@1.1.0':
+ '@img/sharp-libvips-linux-arm@1.3.3':
optional: true
- '@img/sharp-libvips-linux-s390x@1.1.0':
+ '@img/sharp-libvips-linux-ppc64@1.3.3':
optional: true
- '@img/sharp-libvips-linux-x64@1.1.0':
+ '@img/sharp-libvips-linux-riscv64@1.3.3':
optional: true
- '@img/sharp-libvips-linuxmusl-arm64@1.1.0':
+ '@img/sharp-libvips-linux-s390x@1.3.3':
optional: true
- '@img/sharp-libvips-linuxmusl-x64@1.1.0':
+ '@img/sharp-libvips-linux-x64@1.3.3':
optional: true
- '@img/sharp-linux-arm64@0.34.2':
- optionalDependencies:
- '@img/sharp-libvips-linux-arm64': 1.1.0
+ '@img/sharp-libvips-linuxmusl-arm64@1.3.3':
optional: true
- '@img/sharp-linux-arm@0.34.2':
- optionalDependencies:
- '@img/sharp-libvips-linux-arm': 1.1.0
+ '@img/sharp-libvips-linuxmusl-x64@1.3.3':
optional: true
- '@img/sharp-linux-s390x@0.34.2':
+ '@img/sharp-linux-arm64@0.35.4':
optionalDependencies:
- '@img/sharp-libvips-linux-s390x': 1.1.0
+ '@img/sharp-libvips-linux-arm64': 1.3.3
optional: true
- '@img/sharp-linux-x64@0.34.2':
+ '@img/sharp-linux-arm@0.35.4':
optionalDependencies:
- '@img/sharp-libvips-linux-x64': 1.1.0
+ '@img/sharp-libvips-linux-arm': 1.3.3
optional: true
- '@img/sharp-linuxmusl-arm64@0.34.2':
+ '@img/sharp-linux-ppc64@0.35.4':
optionalDependencies:
- '@img/sharp-libvips-linuxmusl-arm64': 1.1.0
+ '@img/sharp-libvips-linux-ppc64': 1.3.3
optional: true
- '@img/sharp-linuxmusl-x64@0.34.2':
+ '@img/sharp-linux-riscv64@0.35.4':
optionalDependencies:
- '@img/sharp-libvips-linuxmusl-x64': 1.1.0
+ '@img/sharp-libvips-linux-riscv64': 1.3.3
optional: true
- '@img/sharp-wasm32@0.34.2':
- dependencies:
- '@emnapi/runtime': 1.4.3
+ '@img/sharp-linux-s390x@0.35.4':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-s390x': 1.3.3
optional: true
- '@img/sharp-win32-arm64@0.34.2':
+ '@img/sharp-linux-x64@0.35.4':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-x64': 1.3.3
optional: true
- '@img/sharp-win32-ia32@0.34.2':
+ '@img/sharp-linuxmusl-arm64@0.35.4':
+ optionalDependencies:
+ '@img/sharp-libvips-linuxmusl-arm64': 1.3.3
optional: true
- '@img/sharp-win32-x64@0.34.2':
+ '@img/sharp-linuxmusl-x64@0.35.4':
+ optionalDependencies:
+ '@img/sharp-libvips-linuxmusl-x64': 1.3.3
optional: true
- '@istanbuljs/load-nyc-config@1.1.0':
+ '@img/sharp-wasm32@0.35.4':
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.15.29
- chalk: 4.1.2
- jest-message-util: 29.7.0
- jest-util: 29.7.0
- slash: 3.0.0
-
- '@jest/core@29.7.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.15.29
- ansi-escapes: 4.3.2
- chalk: 4.1.2
- ci-info: 3.7.1
- exit: 0.1.2
- graceful-fs: 4.2.11
- jest-changed-files: 29.7.0
- jest-config: 29.7.0(@types/node@22.15.29)
- 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.15.29
- jest-mock: 29.7.0
+ '@emnapi/runtime': 1.11.3
+ optional: true
- '@jest/expect-utils@29.4.2':
+ '@img/sharp-webcontainers-wasm32@0.35.4':
dependencies:
- jest-get-type: 29.4.2
+ '@img/sharp-wasm32': 0.35.4
+ optional: true
- '@jest/expect-utils@29.7.0':
- dependencies:
- jest-get-type: 29.6.3
+ '@img/sharp-win32-arm64@0.35.4':
+ optional: true
- '@jest/expect@29.7.0':
- dependencies:
- expect: 29.7.0
- jest-snapshot: 29.7.0
- transitivePeerDependencies:
- - supports-color
+ '@img/sharp-win32-ia32@0.35.4':
+ optional: true
- '@jest/fake-timers@29.7.0':
- dependencies:
- '@jest/types': 29.6.3
- '@sinonjs/fake-timers': 10.0.2
- '@types/node': 22.15.29
- jest-message-util: 29.7.0
- jest-mock: 29.7.0
- jest-util: 29.7.0
+ '@img/sharp-win32-x64@0.35.4':
+ optional: true
- '@jest/globals@29.7.0':
+ '@jridgewell/gen-mapping@0.3.13':
dependencies:
- '@jest/environment': 29.7.0
- '@jest/expect': 29.7.0
- '@jest/types': 29.6.3
- jest-mock: 29.7.0
- transitivePeerDependencies:
- - supports-color
+ '@jridgewell/sourcemap-codec': 1.6.0
+ '@jridgewell/trace-mapping': 0.3.31
- '@jest/reporters@29.7.0':
+ '@jridgewell/remapping@2.3.5':
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.22
- '@types/node': 22.15.29
- 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.1
- 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.0.1
- transitivePeerDependencies:
- - supports-color
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
- '@jest/schemas@29.4.2':
- dependencies:
- '@sinclair/typebox': 0.25.21
+ '@jridgewell/resolve-uri@3.1.2': {}
- '@jest/schemas@29.6.3':
- dependencies:
- '@sinclair/typebox': 0.27.8
+ '@jridgewell/sourcemap-codec@1.6.0': {}
- '@jest/source-map@29.6.3':
+ '@jridgewell/trace-mapping@0.3.31':
dependencies:
- '@jridgewell/trace-mapping': 0.3.22
- callsites: 3.1.0
- graceful-fs: 4.2.11
+ '@jridgewell/resolve-uri': 3.1.2
+ '@jridgewell/sourcemap-codec': 1.6.0
- '@jest/test-result@29.7.0':
+ '@napi-rs/wasm-runtime@1.2.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.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
+ '@emnapi/core': 1.10.0
+ '@emnapi/runtime': 1.10.0
+ '@tybys/wasm-util': 0.10.3
+ optional: true
- '@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
+ '@next/env@16.3.4': {}
- '@jest/transform@29.7.0':
+ '@next/eslint-plugin-next@16.3.4(eslint@9.39.5(jiti@2.7.0)(supports-color@7.2.0))':
dependencies:
- '@babel/core': 7.20.12
- '@jest/types': 29.6.3
- '@jridgewell/trace-mapping': 0.3.22
- 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
+ '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.5(jiti@2.7.0)(supports-color@7.2.0))
+ fast-glob: 3.3.1
transitivePeerDependencies:
- - supports-color
+ - eslint
- '@jest/types@29.4.2':
- dependencies:
- '@jest/schemas': 29.4.2
- '@types/istanbul-lib-coverage': 2.0.4
- '@types/istanbul-reports': 3.0.1
- '@types/node': 22.15.29
- '@types/yargs': 17.0.22
- chalk: 4.1.2
+ '@next/playwright@16.3.4(@playwright/test@1.63.0)':
+ optionalDependencies:
+ '@playwright/test': 1.63.0
- '@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.15.29
- '@types/yargs': 17.0.22
- chalk: 4.1.2
+ '@next/swc-darwin-arm64@16.3.4':
+ optional: true
- '@jridgewell/gen-mapping@0.1.1':
- dependencies:
- '@jridgewell/set-array': 1.1.2
- '@jridgewell/sourcemap-codec': 1.4.14
+ '@next/swc-darwin-x64@16.3.4':
+ optional: true
- '@jridgewell/gen-mapping@0.3.2':
- dependencies:
- '@jridgewell/set-array': 1.1.2
- '@jridgewell/sourcemap-codec': 1.4.14
- '@jridgewell/trace-mapping': 0.3.17
+ '@next/swc-linux-arm64-gnu@16.3.4':
+ optional: true
- '@jridgewell/gen-mapping@0.3.8':
- dependencies:
- '@jridgewell/set-array': 1.2.1
- '@jridgewell/sourcemap-codec': 1.4.14
- '@jridgewell/trace-mapping': 0.3.25
+ '@next/swc-linux-arm64-musl@16.3.4':
+ optional: true
- '@jridgewell/resolve-uri@3.1.0': {}
+ '@next/swc-linux-x64-gnu@16.3.4':
+ optional: true
- '@jridgewell/set-array@1.1.2': {}
+ '@next/swc-linux-x64-musl@16.3.4':
+ optional: true
- '@jridgewell/set-array@1.2.1': {}
+ '@next/swc-win32-arm64-msvc@16.3.4':
+ optional: true
- '@jridgewell/sourcemap-codec@1.4.14': {}
+ '@next/swc-win32-x64-msvc@16.3.4':
+ optional: true
- '@jridgewell/trace-mapping@0.3.17':
+ '@nodelib/fs.scandir@2.1.5':
dependencies:
- '@jridgewell/resolve-uri': 3.1.0
- '@jridgewell/sourcemap-codec': 1.4.14
+ '@nodelib/fs.stat': 2.0.5
+ run-parallel: 1.2.0
- '@jridgewell/trace-mapping@0.3.22':
- dependencies:
- '@jridgewell/resolve-uri': 3.1.0
- '@jridgewell/sourcemap-codec': 1.4.14
+ '@nodelib/fs.stat@2.0.5': {}
- '@jridgewell/trace-mapping@0.3.25':
+ '@nodelib/fs.walk@1.2.8':
dependencies:
- '@jridgewell/resolve-uri': 3.1.0
- '@jridgewell/sourcemap-codec': 1.4.14
+ '@nodelib/fs.scandir': 2.1.5
+ fastq: 1.20.3
- '@microsoft/tsdoc-config@0.16.2':
- dependencies:
- '@microsoft/tsdoc': 0.14.2
- ajv: 6.12.6
- jju: 1.4.0
- resolve: 1.19.0
+ '@oxc-project/types@0.149.0': {}
- '@microsoft/tsdoc-config@0.17.1':
+ '@pkgr/core@0.3.6': {}
+
+ '@playwright/test@1.63.0':
dependencies:
- '@microsoft/tsdoc': 0.15.1
- ajv: 8.12.0
- jju: 1.4.0
- resolve: 1.22.8
+ playwright: 1.63.0
- '@microsoft/tsdoc@0.14.2': {}
+ '@rolldown/binding-android-arm-eabi@1.2.8':
+ optional: true
- '@microsoft/tsdoc@0.15.1': {}
+ '@rolldown/binding-android-arm64@1.2.8':
+ optional: true
- '@next/env@15.4.0-canary.62': {}
+ '@rolldown/binding-darwin-arm64@1.2.8':
+ optional: true
- '@next/eslint-plugin-next@15.3.3':
- dependencies:
- fast-glob: 3.3.1
+ '@rolldown/binding-darwin-x64@1.2.8':
+ optional: true
- '@next/swc-darwin-arm64@15.4.0-canary.62':
+ '@rolldown/binding-freebsd-x64@1.2.8':
optional: true
- '@next/swc-darwin-x64@15.4.0-canary.62':
+ '@rolldown/binding-linux-arm-gnueabihf@1.2.8':
optional: true
- '@next/swc-linux-arm64-gnu@15.4.0-canary.62':
+ '@rolldown/binding-linux-arm64-gnu@1.2.8':
optional: true
- '@next/swc-linux-arm64-musl@15.4.0-canary.62':
+ '@rolldown/binding-linux-arm64-musl@1.2.8':
optional: true
- '@next/swc-linux-x64-gnu@15.4.0-canary.62':
+ '@rolldown/binding-linux-ppc64-gnu@1.2.8':
optional: true
- '@next/swc-linux-x64-musl@15.4.0-canary.62':
+ '@rolldown/binding-linux-s390x-gnu@1.2.8':
optional: true
- '@next/swc-win32-arm64-msvc@15.4.0-canary.62':
+ '@rolldown/binding-linux-x64-gnu@1.2.8':
optional: true
- '@next/swc-win32-x64-msvc@15.4.0-canary.62':
+ '@rolldown/binding-linux-x64-musl@1.2.8':
optional: true
- '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1':
- dependencies:
- eslint-scope: 5.1.1
+ '@rolldown/binding-openharmony-arm64@1.2.8':
+ optional: true
- '@nodelib/fs.scandir@2.1.5':
+ '@rolldown/binding-win32-arm64-msvc@1.2.8':
+ optional: true
+
+ '@rolldown/binding-win32-x64-msvc@1.2.8':
+ optional: true
+
+ '@rolldown/pluginutils@1.0.1': {}
+
+ '@rtsao/scc@1.1.0': {}
+
+ '@stylistic/eslint-plugin@5.10.0(eslint@9.39.5(jiti@2.7.0)(supports-color@7.2.0))':
dependencies:
- '@nodelib/fs.stat': 2.0.5
- run-parallel: 1.2.0
+ '@eslint-community/eslint-utils': 4.10.1(eslint@9.39.5(jiti@2.7.0)(supports-color@7.2.0))
+ '@typescript-eslint/types': 8.70.0
+ eslint: 9.39.5(jiti@2.7.0)(supports-color@7.2.0)
+ eslint-visitor-keys: 4.2.1
+ espree: 10.4.0
+ estraverse: 5.3.0
+ picomatch: 4.0.7
- '@nodelib/fs.stat@2.0.5': {}
+ '@swc/helpers@0.5.23':
+ dependencies:
+ tslib: 2.8.1
- '@nodelib/fs.walk@1.2.8':
+ '@tailwindcss/node@4.3.3':
dependencies:
- '@nodelib/fs.scandir': 2.1.5
- fastq: 1.15.0
+ '@jridgewell/remapping': 2.3.5
+ enhanced-resolve: 5.24.5
+ jiti: 2.7.0
+ lightningcss: 1.32.0
+ magic-string: 0.30.21
+ source-map-js: 1.2.1
+ tailwindcss: 4.3.3
- '@pkgr/core@0.1.1': {}
+ '@tailwindcss/oxide-android-arm64@4.3.3':
+ optional: true
- '@pkgr/core@0.2.7': {}
+ '@tailwindcss/oxide-darwin-arm64@4.3.3':
+ optional: true
- '@radix-ui/primitive@1.1.2': {}
+ '@tailwindcss/oxide-darwin-x64@4.3.3':
+ optional: true
- '@radix-ui/react-collection@1.1.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.0.0-rc-d1afcb43-20240903(react@19.0.0-rc-d1afcb43-20240903))(react@19.0.0-rc-d1afcb43-20240903)':
- dependencies:
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)
- '@radix-ui/react-context': 1.1.2(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.0.0-rc-d1afcb43-20240903(react@19.0.0-rc-d1afcb43-20240903))(react@19.0.0-rc-d1afcb43-20240903)
- '@radix-ui/react-slot': 1.2.3(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)
- react: 19.0.0-rc-d1afcb43-20240903
- react-dom: 19.0.0-rc-d1afcb43-20240903(react@19.0.0-rc-d1afcb43-20240903)
- optionalDependencies:
- '@types/react': 18.3.23
- '@types/react-dom': 18.3.7(@types/react@18.3.23)
+ '@tailwindcss/oxide-freebsd-x64@4.3.3':
+ optional: true
- '@radix-ui/react-compose-refs@1.1.2(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)':
- dependencies:
- react: 19.0.0-rc-d1afcb43-20240903
- optionalDependencies:
- '@types/react': 18.3.23
+ '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3':
+ optional: true
- '@radix-ui/react-context@1.1.2(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)':
- dependencies:
- react: 19.0.0-rc-d1afcb43-20240903
- optionalDependencies:
- '@types/react': 18.3.23
-
- '@radix-ui/react-dialog@1.1.14(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.0.0-rc-d1afcb43-20240903(react@19.0.0-rc-d1afcb43-20240903))(react@19.0.0-rc-d1afcb43-20240903)':
- dependencies:
- '@radix-ui/primitive': 1.1.2
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)
- '@radix-ui/react-context': 1.1.2(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)
- '@radix-ui/react-dismissable-layer': 1.1.10(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.0.0-rc-d1afcb43-20240903(react@19.0.0-rc-d1afcb43-20240903))(react@19.0.0-rc-d1afcb43-20240903)
- '@radix-ui/react-focus-guards': 1.1.2(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)
- '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.0.0-rc-d1afcb43-20240903(react@19.0.0-rc-d1afcb43-20240903))(react@19.0.0-rc-d1afcb43-20240903)
- '@radix-ui/react-id': 1.1.1(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)
- '@radix-ui/react-portal': 1.1.9(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.0.0-rc-d1afcb43-20240903(react@19.0.0-rc-d1afcb43-20240903))(react@19.0.0-rc-d1afcb43-20240903)
- '@radix-ui/react-presence': 1.1.4(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.0.0-rc-d1afcb43-20240903(react@19.0.0-rc-d1afcb43-20240903))(react@19.0.0-rc-d1afcb43-20240903)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.0.0-rc-d1afcb43-20240903(react@19.0.0-rc-d1afcb43-20240903))(react@19.0.0-rc-d1afcb43-20240903)
- '@radix-ui/react-slot': 1.2.3(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)
- aria-hidden: 1.2.6
- react: 19.0.0-rc-d1afcb43-20240903
- react-dom: 19.0.0-rc-d1afcb43-20240903(react@19.0.0-rc-d1afcb43-20240903)
- react-remove-scroll: 2.7.1(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)
- optionalDependencies:
- '@types/react': 18.3.23
- '@types/react-dom': 18.3.7(@types/react@18.3.23)
+ '@tailwindcss/oxide-linux-arm64-gnu@4.3.3':
+ optional: true
- '@radix-ui/react-direction@1.1.1(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)':
- dependencies:
- react: 19.0.0-rc-d1afcb43-20240903
- optionalDependencies:
- '@types/react': 18.3.23
+ '@tailwindcss/oxide-linux-arm64-musl@4.3.3':
+ optional: true
- '@radix-ui/react-dismissable-layer@1.1.10(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.0.0-rc-d1afcb43-20240903(react@19.0.0-rc-d1afcb43-20240903))(react@19.0.0-rc-d1afcb43-20240903)':
- dependencies:
- '@radix-ui/primitive': 1.1.2
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.0.0-rc-d1afcb43-20240903(react@19.0.0-rc-d1afcb43-20240903))(react@19.0.0-rc-d1afcb43-20240903)
- '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)
- '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)
- react: 19.0.0-rc-d1afcb43-20240903
- react-dom: 19.0.0-rc-d1afcb43-20240903(react@19.0.0-rc-d1afcb43-20240903)
- optionalDependencies:
- '@types/react': 18.3.23
- '@types/react-dom': 18.3.7(@types/react@18.3.23)
+ '@tailwindcss/oxide-linux-x64-gnu@4.3.3':
+ optional: true
- '@radix-ui/react-focus-guards@1.1.2(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)':
- dependencies:
- react: 19.0.0-rc-d1afcb43-20240903
- optionalDependencies:
- '@types/react': 18.3.23
+ '@tailwindcss/oxide-linux-x64-musl@4.3.3':
+ optional: true
- '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.0.0-rc-d1afcb43-20240903(react@19.0.0-rc-d1afcb43-20240903))(react@19.0.0-rc-d1afcb43-20240903)':
- dependencies:
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.0.0-rc-d1afcb43-20240903(react@19.0.0-rc-d1afcb43-20240903))(react@19.0.0-rc-d1afcb43-20240903)
- '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)
- react: 19.0.0-rc-d1afcb43-20240903
- react-dom: 19.0.0-rc-d1afcb43-20240903(react@19.0.0-rc-d1afcb43-20240903)
+ '@tailwindcss/oxide-wasm32-wasi@4.3.3':
+ optional: true
+
+ '@tailwindcss/oxide-win32-arm64-msvc@4.3.3':
+ optional: true
+
+ '@tailwindcss/oxide-win32-x64-msvc@4.3.3':
+ optional: true
+
+ '@tailwindcss/oxide@4.3.3':
optionalDependencies:
- '@types/react': 18.3.23
- '@types/react-dom': 18.3.7(@types/react@18.3.23)
+ '@tailwindcss/oxide-android-arm64': 4.3.3
+ '@tailwindcss/oxide-darwin-arm64': 4.3.3
+ '@tailwindcss/oxide-darwin-x64': 4.3.3
+ '@tailwindcss/oxide-freebsd-x64': 4.3.3
+ '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.3
+ '@tailwindcss/oxide-linux-arm64-gnu': 4.3.3
+ '@tailwindcss/oxide-linux-arm64-musl': 4.3.3
+ '@tailwindcss/oxide-linux-x64-gnu': 4.3.3
+ '@tailwindcss/oxide-linux-x64-musl': 4.3.3
+ '@tailwindcss/oxide-wasm32-wasi': 4.3.3
+ '@tailwindcss/oxide-win32-arm64-msvc': 4.3.3
+ '@tailwindcss/oxide-win32-x64-msvc': 4.3.3
+
+ '@tailwindcss/postcss@4.3.3':
+ dependencies:
+ '@alloc/quick-lru': 5.3.0
+ '@tailwindcss/node': 4.3.3
+ '@tailwindcss/oxide': 4.3.3
+ postcss: 8.5.28
+ tailwindcss: 4.3.3
+
+ '@testing-library/dom@10.4.1':
+ dependencies:
+ '@babel/code-frame': 7.29.7
+ '@babel/runtime': 7.29.7
+ '@types/aria-query': 5.0.4
+ aria-query: 5.3.0
+ dom-accessibility-api: 0.5.16
+ lz-string: 1.5.0
+ picocolors: 1.1.1
+ pretty-format: 27.5.1
- '@radix-ui/react-id@1.1.1(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)':
+ '@testing-library/jest-dom@7.0.1(@testing-library/dom@10.4.1)(vitest@5.0.0)':
dependencies:
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)
- react: 19.0.0-rc-d1afcb43-20240903
+ '@adobe/css-tools': 4.5.0
+ '@testing-library/dom': 10.4.1
+ aria-query: 5.3.2
+ css.escape: 1.5.1
+ dom-accessibility-api: 0.6.3
+ picocolors: 1.1.1
+ redent: 3.0.0
optionalDependencies:
- '@types/react': 18.3.23
+ vitest: 5.0.0(@types/node@24.13.4)(@vitest/coverage-v8@5.0.0)(jsdom@30.0.1)(vite@8.3.0(@types/node@24.13.4)(jiti@2.7.0))
- '@radix-ui/react-label@2.1.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.0.0-rc-d1afcb43-20240903(react@19.0.0-rc-d1afcb43-20240903))(react@19.0.0-rc-d1afcb43-20240903)':
+ '@testing-library/react@16.3.3(@testing-library/dom@10.4.1)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)':
dependencies:
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.0.0-rc-d1afcb43-20240903(react@19.0.0-rc-d1afcb43-20240903))(react@19.0.0-rc-d1afcb43-20240903)
- react: 19.0.0-rc-d1afcb43-20240903
- react-dom: 19.0.0-rc-d1afcb43-20240903(react@19.0.0-rc-d1afcb43-20240903)
+ '@babel/runtime': 7.29.7
+ '@testing-library/dom': 10.4.1
+ react: 19.3.0
+ react-dom: 19.3.0(react@19.3.0)
optionalDependencies:
- '@types/react': 18.3.23
- '@types/react-dom': 18.3.7(@types/react@18.3.23)
+ '@types/react': 19.3.0
+ '@types/react-dom': 19.3.0(@types/react@19.3.0)
- '@radix-ui/react-portal@1.1.9(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.0.0-rc-d1afcb43-20240903(react@19.0.0-rc-d1afcb43-20240903))(react@19.0.0-rc-d1afcb43-20240903)':
+ '@testing-library/user-event@14.6.7(@testing-library/dom@10.4.1)':
dependencies:
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.0.0-rc-d1afcb43-20240903(react@19.0.0-rc-d1afcb43-20240903))(react@19.0.0-rc-d1afcb43-20240903)
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)
- react: 19.0.0-rc-d1afcb43-20240903
- react-dom: 19.0.0-rc-d1afcb43-20240903(react@19.0.0-rc-d1afcb43-20240903)
- optionalDependencies:
- '@types/react': 18.3.23
- '@types/react-dom': 18.3.7(@types/react@18.3.23)
+ '@testing-library/dom': 10.4.1
- '@radix-ui/react-presence@1.1.4(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.0.0-rc-d1afcb43-20240903(react@19.0.0-rc-d1afcb43-20240903))(react@19.0.0-rc-d1afcb43-20240903)':
+ '@tybys/wasm-util@0.10.3':
dependencies:
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)
- react: 19.0.0-rc-d1afcb43-20240903
- react-dom: 19.0.0-rc-d1afcb43-20240903(react@19.0.0-rc-d1afcb43-20240903)
- optionalDependencies:
- '@types/react': 18.3.23
- '@types/react-dom': 18.3.7(@types/react@18.3.23)
-
- '@radix-ui/react-primitive@2.1.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.0.0-rc-d1afcb43-20240903(react@19.0.0-rc-d1afcb43-20240903))(react@19.0.0-rc-d1afcb43-20240903)':
- dependencies:
- '@radix-ui/react-slot': 1.2.3(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)
- react: 19.0.0-rc-d1afcb43-20240903
- react-dom: 19.0.0-rc-d1afcb43-20240903(react@19.0.0-rc-d1afcb43-20240903)
- optionalDependencies:
- '@types/react': 18.3.23
- '@types/react-dom': 18.3.7(@types/react@18.3.23)
-
- '@radix-ui/react-radio-group@1.3.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.0.0-rc-d1afcb43-20240903(react@19.0.0-rc-d1afcb43-20240903))(react@19.0.0-rc-d1afcb43-20240903)':
- dependencies:
- '@radix-ui/primitive': 1.1.2
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)
- '@radix-ui/react-context': 1.1.2(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)
- '@radix-ui/react-direction': 1.1.1(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)
- '@radix-ui/react-presence': 1.1.4(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.0.0-rc-d1afcb43-20240903(react@19.0.0-rc-d1afcb43-20240903))(react@19.0.0-rc-d1afcb43-20240903)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.0.0-rc-d1afcb43-20240903(react@19.0.0-rc-d1afcb43-20240903))(react@19.0.0-rc-d1afcb43-20240903)
- '@radix-ui/react-roving-focus': 1.1.10(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.0.0-rc-d1afcb43-20240903(react@19.0.0-rc-d1afcb43-20240903))(react@19.0.0-rc-d1afcb43-20240903)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)
- '@radix-ui/react-use-previous': 1.1.1(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)
- '@radix-ui/react-use-size': 1.1.1(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)
- react: 19.0.0-rc-d1afcb43-20240903
- react-dom: 19.0.0-rc-d1afcb43-20240903(react@19.0.0-rc-d1afcb43-20240903)
- optionalDependencies:
- '@types/react': 18.3.23
- '@types/react-dom': 18.3.7(@types/react@18.3.23)
-
- '@radix-ui/react-roving-focus@1.1.10(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.0.0-rc-d1afcb43-20240903(react@19.0.0-rc-d1afcb43-20240903))(react@19.0.0-rc-d1afcb43-20240903)':
- dependencies:
- '@radix-ui/primitive': 1.1.2
- '@radix-ui/react-collection': 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.0.0-rc-d1afcb43-20240903(react@19.0.0-rc-d1afcb43-20240903))(react@19.0.0-rc-d1afcb43-20240903)
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)
- '@radix-ui/react-context': 1.1.2(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)
- '@radix-ui/react-direction': 1.1.1(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)
- '@radix-ui/react-id': 1.1.1(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.0.0-rc-d1afcb43-20240903(react@19.0.0-rc-d1afcb43-20240903))(react@19.0.0-rc-d1afcb43-20240903)
- '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)
- react: 19.0.0-rc-d1afcb43-20240903
- react-dom: 19.0.0-rc-d1afcb43-20240903(react@19.0.0-rc-d1afcb43-20240903)
- optionalDependencies:
- '@types/react': 18.3.23
- '@types/react-dom': 18.3.7(@types/react@18.3.23)
+ tslib: 2.8.1
+ optional: true
- '@radix-ui/react-slot@1.2.3(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)':
- dependencies:
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)
- react: 19.0.0-rc-d1afcb43-20240903
- optionalDependencies:
- '@types/react': 18.3.23
+ '@types/aria-query@5.0.4': {}
- '@radix-ui/react-toggle@1.1.9(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.0.0-rc-d1afcb43-20240903(react@19.0.0-rc-d1afcb43-20240903))(react@19.0.0-rc-d1afcb43-20240903)':
+ '@types/chai@5.2.3':
dependencies:
- '@radix-ui/primitive': 1.1.2
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@19.0.0-rc-d1afcb43-20240903(react@19.0.0-rc-d1afcb43-20240903))(react@19.0.0-rc-d1afcb43-20240903)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)
- react: 19.0.0-rc-d1afcb43-20240903
- react-dom: 19.0.0-rc-d1afcb43-20240903(react@19.0.0-rc-d1afcb43-20240903)
- optionalDependencies:
- '@types/react': 18.3.23
- '@types/react-dom': 18.3.7(@types/react@18.3.23)
+ '@types/deep-eql': 4.0.2
+ assertion-error: 2.0.1
- '@radix-ui/react-use-callback-ref@1.1.1(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)':
- dependencies:
- react: 19.0.0-rc-d1afcb43-20240903
- optionalDependencies:
- '@types/react': 18.3.23
+ '@types/deep-eql@4.0.2': {}
- '@radix-ui/react-use-controllable-state@1.2.2(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)':
- dependencies:
- '@radix-ui/react-use-effect-event': 0.0.2(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)
- react: 19.0.0-rc-d1afcb43-20240903
- optionalDependencies:
- '@types/react': 18.3.23
+ '@types/estree@1.0.9': {}
- '@radix-ui/react-use-effect-event@0.0.2(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)':
- dependencies:
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)
- react: 19.0.0-rc-d1afcb43-20240903
- optionalDependencies:
- '@types/react': 18.3.23
+ '@types/json-schema@7.0.15': {}
- '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)':
- dependencies:
- '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)
- react: 19.0.0-rc-d1afcb43-20240903
- optionalDependencies:
- '@types/react': 18.3.23
+ '@types/json5@0.0.29': {}
- '@radix-ui/react-use-layout-effect@1.1.1(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)':
+ '@types/node@24.13.4':
dependencies:
- react: 19.0.0-rc-d1afcb43-20240903
- optionalDependencies:
- '@types/react': 18.3.23
+ undici-types: 7.18.2
- '@radix-ui/react-use-previous@1.1.1(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)':
+ '@types/papaparse@5.5.2':
dependencies:
- react: 19.0.0-rc-d1afcb43-20240903
- optionalDependencies:
- '@types/react': 18.3.23
+ '@types/node': 24.13.4
- '@radix-ui/react-use-size@1.1.1(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)':
+ '@types/react-dom@19.3.0(@types/react@19.3.0)':
dependencies:
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)
- react: 19.0.0-rc-d1afcb43-20240903
- optionalDependencies:
- '@types/react': 18.3.23
+ '@types/react': 19.3.0
- '@rushstack/eslint-patch@1.7.2': {}
-
- '@sideway/address@4.1.5':
+ '@types/react@19.3.0':
dependencies:
- '@hapi/hoek': 9.3.0
-
- '@sideway/formula@3.0.1': {}
-
- '@sideway/pinpoint@2.0.0': {}
-
- '@sinclair/typebox@0.25.21': {}
+ csstype: 3.2.3
- '@sinclair/typebox@0.27.8': {}
-
- '@sinonjs/commons@2.0.0':
+ '@typescript-eslint/eslint-plugin@8.70.0(@typescript-eslint/parser@8.70.0(@typescript/typescript6@6.0.2)(eslint@9.39.5(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0))(@typescript/typescript6@6.0.2)(eslint@9.39.5(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)':
dependencies:
- type-detect: 4.0.8
+ '@eslint-community/regexpp': 4.12.2
+ '@typescript-eslint/parser': 8.70.0(@typescript/typescript6@6.0.2)(eslint@9.39.5(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)
+ '@typescript-eslint/scope-manager': 8.70.0
+ '@typescript-eslint/type-utils': 8.70.0(@typescript/typescript6@6.0.2)(eslint@9.39.5(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)
+ '@typescript-eslint/utils': 8.70.0(@typescript/typescript6@6.0.2)(eslint@9.39.5(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)
+ '@typescript-eslint/visitor-keys': 8.70.0
+ eslint: 9.39.5(jiti@2.7.0)(supports-color@7.2.0)
+ ignore: 7.0.9
+ natural-compare: 1.4.0
+ ts-api-utils: 2.5.0(@typescript/typescript6@6.0.2)
+ typescript: '@typescript/typescript6@6.0.2'
+ transitivePeerDependencies:
+ - supports-color
- '@sinonjs/fake-timers@10.0.2':
+ '@typescript-eslint/parser@8.70.0(@typescript/typescript6@6.0.2)(eslint@9.39.5(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)':
dependencies:
- '@sinonjs/commons': 2.0.0
+ '@typescript-eslint/scope-manager': 8.70.0
+ '@typescript-eslint/types': 8.70.0
+ '@typescript-eslint/typescript-estree': 8.70.0(@typescript/typescript6@6.0.2)(supports-color@7.2.0)
+ '@typescript-eslint/visitor-keys': 8.70.0
+ debug: 4.4.3(supports-color@7.2.0)
+ eslint: 9.39.5(jiti@2.7.0)(supports-color@7.2.0)
+ typescript: '@typescript/typescript6@6.0.2'
+ transitivePeerDependencies:
+ - supports-color
- '@swc/helpers@0.5.15':
+ '@typescript-eslint/project-service@8.70.0(@typescript/typescript6@6.0.2)(supports-color@7.2.0)':
dependencies:
- tslib: 2.8.1
+ '@typescript-eslint/tsconfig-utils': 8.70.0(@typescript/typescript6@6.0.2)
+ '@typescript-eslint/types': 8.70.0
+ debug: 4.4.3(supports-color@7.2.0)
+ typescript: '@typescript/typescript6@6.0.2'
+ transitivePeerDependencies:
+ - supports-color
- '@testing-library/dom@9.3.4':
+ '@typescript-eslint/scope-manager@8.70.0':
dependencies:
- '@babel/code-frame': 7.18.6
- '@babel/runtime': 7.20.13
- '@types/aria-query': 5.0.1
- aria-query: 5.1.3
- chalk: 4.1.2
- dom-accessibility-api: 0.5.16
- lz-string: 1.5.0
- pretty-format: 27.5.1
+ '@typescript-eslint/types': 8.70.0
+ '@typescript-eslint/visitor-keys': 8.70.0
- '@testing-library/jest-dom@6.4.2(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@22.15.29))':
+ '@typescript-eslint/tsconfig-utils@8.70.0(@typescript/typescript6@6.0.2)':
dependencies:
- '@adobe/css-tools': 4.3.3
- '@babel/runtime': 7.20.13
- aria-query: 5.1.3
- chalk: 3.0.0
- css.escape: 1.5.1
- dom-accessibility-api: 0.6.3
- lodash: 4.17.21
- redent: 3.0.0
- optionalDependencies:
- '@jest/globals': 29.7.0
- '@types/jest': 29.5.12
- jest: 29.7.0(@types/node@22.15.29)
+ typescript: '@typescript/typescript6@6.0.2'
- '@testing-library/react@14.2.1(@types/react@18.3.23)(react-dom@19.0.0-rc-d1afcb43-20240903(react@19.0.0-rc-d1afcb43-20240903))(react@19.0.0-rc-d1afcb43-20240903)':
+ '@typescript-eslint/type-utils@8.70.0(@typescript/typescript6@6.0.2)(eslint@9.39.5(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)':
dependencies:
- '@babel/runtime': 7.20.13
- '@testing-library/dom': 9.3.4
- '@types/react-dom': 18.3.7(@types/react@18.3.23)
- react: 19.0.0-rc-d1afcb43-20240903
- react-dom: 19.0.0-rc-d1afcb43-20240903(react@19.0.0-rc-d1afcb43-20240903)
+ '@typescript-eslint/types': 8.70.0
+ '@typescript-eslint/typescript-estree': 8.70.0(@typescript/typescript6@6.0.2)(supports-color@7.2.0)
+ '@typescript-eslint/utils': 8.70.0(@typescript/typescript6@6.0.2)(eslint@9.39.5(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)
+ debug: 4.4.3(supports-color@7.2.0)
+ eslint: 9.39.5(jiti@2.7.0)(supports-color@7.2.0)
+ ts-api-utils: 2.5.0(@typescript/typescript6@6.0.2)
+ typescript: '@typescript/typescript6@6.0.2'
transitivePeerDependencies:
- - '@types/react'
-
- '@types/aria-query@5.0.1': {}
+ - supports-color
- '@types/babel__core@7.20.0':
- dependencies:
- '@babel/parser': 7.20.15
- '@babel/types': 7.20.7
- '@types/babel__generator': 7.6.4
- '@types/babel__template': 7.4.1
- '@types/babel__traverse': 7.18.3
+ '@typescript-eslint/types@8.70.0': {}
- '@types/babel__generator@7.6.4':
+ '@typescript-eslint/typescript-estree@8.70.0(@typescript/typescript6@6.0.2)(supports-color@7.2.0)':
dependencies:
- '@babel/types': 7.20.7
+ '@typescript-eslint/project-service': 8.70.0(@typescript/typescript6@6.0.2)(supports-color@7.2.0)
+ '@typescript-eslint/tsconfig-utils': 8.70.0(@typescript/typescript6@6.0.2)
+ '@typescript-eslint/types': 8.70.0
+ '@typescript-eslint/visitor-keys': 8.70.0
+ debug: 4.4.3(supports-color@7.2.0)
+ minimatch: 10.2.6
+ semver: 7.8.5
+ tinyglobby: 0.2.17
+ ts-api-utils: 2.5.0(@typescript/typescript6@6.0.2)
+ typescript: '@typescript/typescript6@6.0.2'
+ transitivePeerDependencies:
+ - supports-color
- '@types/babel__template@7.4.1':
+ '@typescript-eslint/utils@8.70.0(@typescript/typescript6@6.0.2)(eslint@9.39.5(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)':
dependencies:
- '@babel/parser': 7.20.15
- '@babel/types': 7.20.7
+ '@eslint-community/eslint-utils': 4.10.1(eslint@9.39.5(jiti@2.7.0)(supports-color@7.2.0))
+ '@typescript-eslint/scope-manager': 8.70.0
+ '@typescript-eslint/types': 8.70.0
+ '@typescript-eslint/typescript-estree': 8.70.0(@typescript/typescript6@6.0.2)(supports-color@7.2.0)
+ eslint: 9.39.5(jiti@2.7.0)(supports-color@7.2.0)
+ typescript: '@typescript/typescript6@6.0.2'
+ transitivePeerDependencies:
+ - supports-color
- '@types/babel__traverse@7.18.3':
+ '@typescript-eslint/visitor-keys@8.70.0':
dependencies:
- '@babel/types': 7.20.7
+ '@typescript-eslint/types': 8.70.0
+ eslint-visitor-keys: 5.0.1
- '@types/graceful-fs@4.1.6':
- dependencies:
- '@types/node': 22.15.29
+ '@typescript/typescript-aix-ppc64@7.0.2':
+ optional: true
- '@types/istanbul-lib-coverage@2.0.4': {}
+ '@typescript/typescript-darwin-arm64@7.0.2':
+ optional: true
- '@types/istanbul-lib-report@3.0.0':
- dependencies:
- '@types/istanbul-lib-coverage': 2.0.4
+ '@typescript/typescript-darwin-x64@7.0.2':
+ optional: true
- '@types/istanbul-reports@3.0.1':
- dependencies:
- '@types/istanbul-lib-report': 3.0.0
+ '@typescript/typescript-freebsd-arm64@7.0.2':
+ optional: true
- '@types/jest@29.5.12':
- dependencies:
- expect: 29.4.2
- pretty-format: 29.4.2
+ '@typescript/typescript-freebsd-x64@7.0.2':
+ optional: true
- '@types/json-schema@7.0.11': {}
+ '@typescript/typescript-linux-arm64@7.0.2':
+ optional: true
- '@types/json-schema@7.0.15': {}
+ '@typescript/typescript-linux-arm@7.0.2':
+ optional: true
- '@types/json5@0.0.29': {}
+ '@typescript/typescript-linux-loong64@7.0.2':
+ optional: true
- '@types/node@22.15.29':
- dependencies:
- undici-types: 6.21.0
+ '@typescript/typescript-linux-mips64el@7.0.2':
+ optional: true
- '@types/normalize-package-data@2.4.1': {}
+ '@typescript/typescript-linux-ppc64@7.0.2':
+ optional: true
- '@types/papaparse@5.3.16':
- dependencies:
- '@types/node': 22.15.29
+ '@typescript/typescript-linux-riscv64@7.0.2':
+ optional: true
- '@types/prop-types@15.7.5': {}
+ '@typescript/typescript-linux-s390x@7.0.2':
+ optional: true
- '@types/react-dom@18.3.7(@types/react@18.3.23)':
- dependencies:
- '@types/react': 18.3.23
+ '@typescript/typescript-linux-x64@7.0.2':
+ optional: true
- '@types/react@18.3.23':
- dependencies:
- '@types/prop-types': 15.7.5
- csstype: 3.1.1
+ '@typescript/typescript-netbsd-arm64@7.0.2':
+ optional: true
- '@types/semver@7.3.13': {}
+ '@typescript/typescript-netbsd-x64@7.0.2':
+ optional: true
- '@types/semver@7.5.7': {}
+ '@typescript/typescript-openbsd-arm64@7.0.2':
+ optional: true
- '@types/sinonjs__fake-timers@8.1.1': {}
+ '@typescript/typescript-openbsd-x64@7.0.2':
+ optional: true
- '@types/sizzle@2.3.3': {}
+ '@typescript/typescript-sunos-x64@7.0.2':
+ optional: true
- '@types/stack-utils@2.0.1': {}
+ '@typescript/typescript-win32-arm64@7.0.2':
+ optional: true
- '@types/yargs-parser@21.0.0': {}
+ '@typescript/typescript-win32-x64@7.0.2':
+ optional: true
- '@types/yargs@17.0.22':
+ '@typescript/typescript6@6.0.2':
dependencies:
- '@types/yargs-parser': 21.0.0
+ '@typescript/old': typescript@6.0.3
- '@types/yauzl@2.10.0':
- dependencies:
- '@types/node': 22.15.29
+ '@unrs/resolver-binding-android-arm-eabi@1.12.2':
optional: true
- '@typescript-eslint/eslint-plugin@5.51.0(@typescript-eslint/parser@5.51.0(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0)(typescript@5.3.3)':
- dependencies:
- '@typescript-eslint/parser': 5.51.0(eslint@8.56.0)(typescript@5.3.3)
- '@typescript-eslint/scope-manager': 5.51.0
- '@typescript-eslint/type-utils': 5.51.0(eslint@8.56.0)(typescript@5.3.3)
- '@typescript-eslint/utils': 5.51.0(eslint@8.56.0)(typescript@5.3.3)
- debug: 4.3.4(supports-color@8.1.1)
- eslint: 8.56.0
- grapheme-splitter: 1.0.4
- ignore: 5.2.4
- natural-compare-lite: 1.4.0
- regexpp: 3.2.0
- semver: 7.7.2
- tsutils: 3.21.0(typescript@5.3.3)
- optionalDependencies:
- typescript: 5.3.3
- transitivePeerDependencies:
- - supports-color
+ '@unrs/resolver-binding-android-arm64@1.12.2':
+ optional: true
- '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0)(typescript@5.3.3)':
- dependencies:
- '@eslint-community/regexpp': 4.10.0
- '@typescript-eslint/parser': 7.18.0(eslint@8.56.0)(typescript@5.3.3)
- '@typescript-eslint/scope-manager': 7.18.0
- '@typescript-eslint/type-utils': 7.18.0(eslint@8.56.0)(typescript@5.3.3)
- '@typescript-eslint/utils': 7.18.0(eslint@8.56.0)(typescript@5.3.3)
- '@typescript-eslint/visitor-keys': 7.18.0
- eslint: 8.56.0
- graphemer: 1.4.0
- ignore: 5.3.2
- natural-compare: 1.4.0
- ts-api-utils: 1.4.3(typescript@5.3.3)
- optionalDependencies:
- typescript: 5.3.3
- transitivePeerDependencies:
- - supports-color
+ '@unrs/resolver-binding-darwin-arm64@1.12.2':
+ optional: true
- '@typescript-eslint/parser@5.51.0(eslint@8.56.0)(typescript@5.3.3)':
- dependencies:
- '@typescript-eslint/scope-manager': 5.51.0
- '@typescript-eslint/types': 5.51.0
- '@typescript-eslint/typescript-estree': 5.51.0(typescript@5.3.3)
- debug: 4.3.4(supports-color@8.1.1)
- eslint: 8.56.0
- optionalDependencies:
- typescript: 5.3.3
- transitivePeerDependencies:
- - supports-color
+ '@unrs/resolver-binding-darwin-x64@1.12.2':
+ optional: true
- '@typescript-eslint/parser@7.18.0(eslint@8.56.0)(typescript@5.3.3)':
- dependencies:
- '@typescript-eslint/scope-manager': 7.18.0
- '@typescript-eslint/types': 7.18.0
- '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.3.3)
- '@typescript-eslint/visitor-keys': 7.18.0
- debug: 4.3.4(supports-color@8.1.1)
- eslint: 8.56.0
- optionalDependencies:
- typescript: 5.3.3
- transitivePeerDependencies:
- - supports-color
+ '@unrs/resolver-binding-freebsd-x64@1.12.2':
+ optional: true
- '@typescript-eslint/scope-manager@5.51.0':
- dependencies:
- '@typescript-eslint/types': 5.51.0
- '@typescript-eslint/visitor-keys': 5.51.0
+ '@unrs/resolver-binding-linux-arm-gnueabihf@1.12.2':
+ optional: true
- '@typescript-eslint/scope-manager@5.59.1':
- dependencies:
- '@typescript-eslint/types': 5.59.1
- '@typescript-eslint/visitor-keys': 5.59.1
+ '@unrs/resolver-binding-linux-arm-musleabihf@1.12.2':
+ optional: true
- '@typescript-eslint/scope-manager@7.18.0':
- dependencies:
- '@typescript-eslint/types': 7.18.0
- '@typescript-eslint/visitor-keys': 7.18.0
+ '@unrs/resolver-binding-linux-arm64-gnu@1.12.2':
+ optional: true
- '@typescript-eslint/type-utils@5.51.0(eslint@8.56.0)(typescript@5.3.3)':
- dependencies:
- '@typescript-eslint/typescript-estree': 5.51.0(typescript@5.3.3)
- '@typescript-eslint/utils': 5.51.0(eslint@8.56.0)(typescript@5.3.3)
- debug: 4.3.4(supports-color@8.1.1)
- eslint: 8.56.0
- tsutils: 3.21.0(typescript@5.3.3)
- optionalDependencies:
- typescript: 5.3.3
- transitivePeerDependencies:
- - supports-color
+ '@unrs/resolver-binding-linux-arm64-musl@1.12.2':
+ optional: true
- '@typescript-eslint/type-utils@7.18.0(eslint@8.56.0)(typescript@5.3.3)':
- dependencies:
- '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.3.3)
- '@typescript-eslint/utils': 7.18.0(eslint@8.56.0)(typescript@5.3.3)
- debug: 4.3.4(supports-color@8.1.1)
- eslint: 8.56.0
- ts-api-utils: 1.4.3(typescript@5.3.3)
- optionalDependencies:
- typescript: 5.3.3
- transitivePeerDependencies:
- - supports-color
+ '@unrs/resolver-binding-linux-loong64-gnu@1.12.2':
+ optional: true
- '@typescript-eslint/types@5.51.0': {}
+ '@unrs/resolver-binding-linux-loong64-musl@1.12.2':
+ optional: true
- '@typescript-eslint/types@5.59.1': {}
+ '@unrs/resolver-binding-linux-ppc64-gnu@1.12.2':
+ optional: true
- '@typescript-eslint/types@7.18.0': {}
+ '@unrs/resolver-binding-linux-riscv64-gnu@1.12.2':
+ optional: true
- '@typescript-eslint/typescript-estree@5.51.0(typescript@5.3.3)':
- dependencies:
- '@typescript-eslint/types': 5.51.0
- '@typescript-eslint/visitor-keys': 5.51.0
- debug: 4.3.4(supports-color@8.1.1)
- globby: 11.1.0
- is-glob: 4.0.3
- semver: 7.7.2
- tsutils: 3.21.0(typescript@5.3.3)
- optionalDependencies:
- typescript: 5.3.3
- transitivePeerDependencies:
- - supports-color
+ '@unrs/resolver-binding-linux-riscv64-musl@1.12.2':
+ optional: true
- '@typescript-eslint/typescript-estree@5.59.1(typescript@5.3.3)':
- dependencies:
- '@typescript-eslint/types': 5.59.1
- '@typescript-eslint/visitor-keys': 5.59.1
- debug: 4.3.4(supports-color@8.1.1)
- globby: 11.1.0
- is-glob: 4.0.3
- semver: 7.7.2
- tsutils: 3.21.0(typescript@5.3.3)
- optionalDependencies:
- typescript: 5.3.3
- transitivePeerDependencies:
- - supports-color
+ '@unrs/resolver-binding-linux-s390x-gnu@1.12.2':
+ optional: true
- '@typescript-eslint/typescript-estree@7.18.0(typescript@5.3.3)':
- dependencies:
- '@typescript-eslint/types': 7.18.0
- '@typescript-eslint/visitor-keys': 7.18.0
- debug: 4.3.4(supports-color@8.1.1)
- globby: 11.1.0
- is-glob: 4.0.3
- minimatch: 9.0.5
- semver: 7.7.2
- ts-api-utils: 1.4.3(typescript@5.3.3)
- optionalDependencies:
- typescript: 5.3.3
- transitivePeerDependencies:
- - supports-color
+ '@unrs/resolver-binding-linux-x64-gnu@1.12.2':
+ optional: true
- '@typescript-eslint/utils@5.51.0(eslint@8.56.0)(typescript@5.3.3)':
- dependencies:
- '@types/json-schema': 7.0.11
- '@types/semver': 7.3.13
- '@typescript-eslint/scope-manager': 5.51.0
- '@typescript-eslint/types': 5.51.0
- '@typescript-eslint/typescript-estree': 5.51.0(typescript@5.3.3)
- eslint: 8.56.0
- eslint-scope: 5.1.1
- eslint-utils: 3.0.0(eslint@8.56.0)
- semver: 7.7.2
- transitivePeerDependencies:
- - supports-color
- - typescript
+ '@unrs/resolver-binding-linux-x64-musl@1.12.2':
+ optional: true
- '@typescript-eslint/utils@5.59.1(eslint@8.56.0)(typescript@5.3.3)':
- dependencies:
- '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0)
- '@types/json-schema': 7.0.15
- '@types/semver': 7.5.7
- '@typescript-eslint/scope-manager': 5.59.1
- '@typescript-eslint/types': 5.59.1
- '@typescript-eslint/typescript-estree': 5.59.1(typescript@5.3.3)
- eslint: 8.56.0
- eslint-scope: 5.1.1
- semver: 7.7.2
- transitivePeerDependencies:
- - supports-color
- - typescript
+ '@unrs/resolver-binding-openharmony-arm64@1.12.2':
+ optional: true
- '@typescript-eslint/utils@7.18.0(eslint@8.56.0)(typescript@5.3.3)':
+ '@unrs/resolver-binding-wasm32-wasi@1.12.2':
dependencies:
- '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0)
- '@typescript-eslint/scope-manager': 7.18.0
- '@typescript-eslint/types': 7.18.0
- '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.3.3)
- eslint: 8.56.0
- transitivePeerDependencies:
- - supports-color
- - typescript
+ '@emnapi/core': 1.10.0
+ '@emnapi/runtime': 1.10.0
+ '@napi-rs/wasm-runtime': 1.2.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)
+ optional: true
- '@typescript-eslint/visitor-keys@5.51.0':
- dependencies:
- '@typescript-eslint/types': 5.51.0
- eslint-visitor-keys: 3.3.0
+ '@unrs/resolver-binding-win32-arm64-msvc@1.12.2':
+ optional: true
+
+ '@unrs/resolver-binding-win32-ia32-msvc@1.12.2':
+ optional: true
+
+ '@unrs/resolver-binding-win32-x64-msvc@1.12.2':
+ optional: true
- '@typescript-eslint/visitor-keys@5.59.1':
+ '@vitejs/plugin-react@6.1.1(vite@8.3.0(@types/node@24.13.4)(jiti@2.7.0))':
dependencies:
- '@typescript-eslint/types': 5.59.1
- eslint-visitor-keys: 3.4.3
+ '@rolldown/pluginutils': 1.0.1
+ vite: 8.3.0(@types/node@24.13.4)(jiti@2.7.0)
- '@typescript-eslint/visitor-keys@7.18.0':
+ '@vitest/coverage-v8@5.0.0(vitest@5.0.0)':
dependencies:
- '@typescript-eslint/types': 7.18.0
- eslint-visitor-keys: 3.4.3
+ '@bcoe/v8-coverage': 1.0.2
+ '@vitest/istanbul-lib-coverage': 1.0.1
+ '@vitest/istanbul-lib-report': 1.0.1
+ ast-v8-to-istanbul: 1.0.6
+ magicast: 0.5.5
+ obug: 2.2.1
+ std-env: 4.2.0
+ tinyrainbow: 3.1.1
+ vitest: 5.0.0(@types/node@24.13.4)(@vitest/coverage-v8@5.0.0)(jsdom@30.0.1)(vite@8.3.0(@types/node@24.13.4)(jiti@2.7.0))
- '@ungap/structured-clone@1.2.0': {}
-
- '@vercel/style-guide@6.0.0(@next/eslint-plugin-next@15.3.3)(eslint@8.56.0)(jest@29.7.0(@types/node@22.15.29))(prettier@3.2.5)(typescript@5.3.3)':
- dependencies:
- '@babel/core': 7.27.4
- '@babel/eslint-parser': 7.23.10(@babel/core@7.27.4)(eslint@8.56.0)
- '@rushstack/eslint-patch': 1.7.2
- '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0)(typescript@5.3.3)
- '@typescript-eslint/parser': 7.18.0(eslint@8.56.0)(typescript@5.3.3)
- eslint-config-prettier: 9.1.0(eslint@8.56.0)
- eslint-import-resolver-alias: 1.1.2(eslint-plugin-import@2.29.1)
- eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.56.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1)(eslint@8.56.0)
- eslint-plugin-eslint-comments: 3.2.0(eslint@8.56.0)
- eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0)
- eslint-plugin-jest: 27.9.0(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0)(jest@29.7.0(@types/node@22.15.29))(typescript@5.3.3)
- eslint-plugin-jsx-a11y: 6.10.2(eslint@8.56.0)
- eslint-plugin-playwright: 1.8.3(eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0)(jest@29.7.0(@types/node@22.15.29))(typescript@5.3.3))(eslint@8.56.0)
- eslint-plugin-react: 7.37.5(eslint@8.56.0)
- eslint-plugin-react-hooks: 4.6.0(eslint@8.56.0)
- eslint-plugin-testing-library: 6.2.0(eslint@8.56.0)(typescript@5.3.3)
- eslint-plugin-tsdoc: 0.2.17
- eslint-plugin-unicorn: 51.0.1(eslint@8.56.0)
- eslint-plugin-vitest: 0.3.26(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0)(typescript@5.3.3)
- prettier-plugin-packagejson: 2.5.15(prettier@3.2.5)
- optionalDependencies:
- '@next/eslint-plugin-next': 15.3.3
- eslint: 8.56.0
- prettier: 3.2.5
- typescript: 5.3.3
- transitivePeerDependencies:
- - eslint-import-resolver-node
- - eslint-import-resolver-webpack
- - jest
- - supports-color
- - vitest
+ '@vitest/istanbul-lib-coverage@1.0.1': {}
+
+ '@vitest/istanbul-lib-report@1.0.1':
+ dependencies:
+ '@vitest/istanbul-lib-coverage': 1.0.1
- acorn-jsx@5.3.2(acorn@8.11.3):
+ '@vitest/mocker@5.0.0(vite@8.3.0(@types/node@24.13.4)(jiti@2.7.0))':
dependencies:
- acorn: 8.11.3
+ '@jridgewell/trace-mapping': 0.3.31
+ '@vitest/spy': 5.0.0
+ estree-walker: 3.0.3
+ magic-string: 1.3.1
+ optionalDependencies:
+ vite: 8.3.0(@types/node@24.13.4)(jiti@2.7.0)
- acorn@8.11.3: {}
+ '@vitest/spy@5.0.0': {}
- aggregate-error@3.1.0:
+ acorn-jsx@5.3.2(acorn@8.18.0):
dependencies:
- clean-stack: 2.2.0
- indent-string: 4.0.0
+ acorn: 8.18.0
+
+ acorn@8.18.0: {}
- ajv@6.12.6:
+ ajv@6.15.0:
dependencies:
fast-deep-equal: 3.1.3
fast-json-stable-stringify: 2.1.0
json-schema-traverse: 0.4.1
uri-js: 4.4.1
- ajv@8.12.0:
- dependencies:
- fast-deep-equal: 3.1.3
- json-schema-traverse: 1.0.0
- require-from-string: 2.0.2
- uri-js: 4.4.1
-
- ansi-colors@4.1.3: {}
-
- ansi-escapes@4.3.2:
- dependencies:
- type-fest: 0.21.3
-
ansi-regex@5.0.1: {}
- ansi-styles@3.2.1:
- dependencies:
- color-convert: 1.9.3
-
ansi-styles@4.3.0:
dependencies:
color-convert: 2.0.1
ansi-styles@5.2.0: {}
- any-promise@1.3.0: {}
-
- anymatch@3.1.3:
- dependencies:
- normalize-path: 3.0.0
- picomatch: 2.3.1
-
- arch@2.2.0: {}
-
- arg@5.0.2: {}
-
- argparse@1.0.10:
- dependencies:
- sprintf-js: 1.0.3
-
argparse@2.0.1: {}
- aria-hidden@1.2.6:
- dependencies:
- tslib: 2.8.1
-
- aria-query@5.1.3:
+ aria-query@5.3.0:
dependencies:
- deep-equal: 2.2.0
+ dequal: 2.0.3
aria-query@5.3.2: {}
- array-buffer-byte-length@1.0.1:
- dependencies:
- call-bind: 1.0.7
- is-array-buffer: 3.0.4
-
array-buffer-byte-length@1.0.2:
dependencies:
call-bound: 1.0.4
is-array-buffer: 3.0.5
- array-includes@3.1.6:
+ array-includes@3.2.0:
dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- es-abstract: 1.21.1
- get-intrinsic: 1.2.0
- is-string: 1.0.7
-
- array-includes@3.1.7:
- dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- es-abstract: 1.22.4
- get-intrinsic: 1.2.4
- is-string: 1.0.7
-
- array-includes@3.1.9:
- dependencies:
- call-bind: 1.0.8
+ call-bind: 1.0.9
call-bound: 1.0.4
define-properties: 1.2.1
- es-abstract: 1.24.0
- es-object-atoms: 1.1.1
- get-intrinsic: 1.3.0
+ es-abstract: 1.24.2
+ es-object-atoms: 1.1.2
+ es-shim-unscopables: 1.1.0
is-string: 1.1.1
math-intrinsics: 1.1.0
- array-union@2.1.0: {}
-
- array.prototype.filter@1.0.3:
- dependencies:
- call-bind: 1.0.7
- define-properties: 1.2.1
- es-abstract: 1.22.4
- es-array-method-boxes-properly: 1.0.0
- is-string: 1.0.7
-
array.prototype.findlast@1.2.5:
dependencies:
- call-bind: 1.0.7
+ call-bind: 1.0.9
define-properties: 1.2.1
- es-abstract: 1.24.0
+ es-abstract: 1.24.2
es-errors: 1.3.0
- es-object-atoms: 1.1.1
- es-shim-unscopables: 1.0.2
+ es-object-atoms: 1.1.2
+ es-shim-unscopables: 1.1.0
- array.prototype.findlastindex@1.2.4:
+ array.prototype.findlastindex@1.2.6:
dependencies:
- call-bind: 1.0.7
+ call-bind: 1.0.9
+ call-bound: 1.0.4
define-properties: 1.2.1
- es-abstract: 1.22.4
+ es-abstract: 1.24.2
es-errors: 1.3.0
- es-shim-unscopables: 1.0.2
-
- array.prototype.flat@1.3.2:
- dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- es-abstract: 1.22.4
- es-shim-unscopables: 1.0.0
+ es-object-atoms: 1.1.2
+ es-shim-unscopables: 1.1.0
- array.prototype.flatmap@1.3.1:
+ array.prototype.flat@1.3.3:
dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- es-abstract: 1.21.1
- es-shim-unscopables: 1.0.0
-
- array.prototype.flatmap@1.3.2:
- dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- es-abstract: 1.22.4
- es-shim-unscopables: 1.0.0
+ call-bind: 1.0.9
+ define-properties: 1.2.1
+ es-abstract: 1.24.2
+ es-shim-unscopables: 1.1.0
array.prototype.flatmap@1.3.3:
dependencies:
- call-bind: 1.0.8
+ call-bind: 1.0.9
define-properties: 1.2.1
- es-abstract: 1.24.0
- es-shim-unscopables: 1.0.2
-
- array.prototype.tosorted@1.1.1:
- dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- es-abstract: 1.21.1
- es-shim-unscopables: 1.0.0
- get-intrinsic: 1.2.0
+ es-abstract: 1.24.2
+ es-shim-unscopables: 1.1.0
array.prototype.tosorted@1.1.4:
dependencies:
- call-bind: 1.0.7
- define-properties: 1.2.1
- es-abstract: 1.24.0
- es-errors: 1.3.0
- es-shim-unscopables: 1.0.2
-
- arraybuffer.prototype.slice@1.0.3:
- dependencies:
- array-buffer-byte-length: 1.0.1
- call-bind: 1.0.7
+ call-bind: 1.0.9
define-properties: 1.2.1
- es-abstract: 1.22.4
+ es-abstract: 1.24.2
es-errors: 1.3.0
- get-intrinsic: 1.2.4
- is-array-buffer: 3.0.4
- is-shared-array-buffer: 1.0.2
+ es-shim-unscopables: 1.1.0
arraybuffer.prototype.slice@1.0.4:
dependencies:
array-buffer-byte-length: 1.0.2
- call-bind: 1.0.8
+ call-bind: 1.0.9
define-properties: 1.2.1
- es-abstract: 1.24.0
+ es-abstract: 1.24.2
es-errors: 1.3.0
get-intrinsic: 1.3.0
is-array-buffer: 3.0.5
- asn1@0.2.6:
- dependencies:
- safer-buffer: 2.1.2
-
- assert-plus@1.0.0: {}
+ assertion-error@2.0.1: {}
ast-types-flow@0.0.8: {}
- astral-regex@2.0.0: {}
-
- async@3.2.4: {}
-
- asynciterator.prototype@1.0.0:
- dependencies:
- has-symbols: 1.0.3
-
- asynckit@0.4.0: {}
-
- at-least-node@1.0.0: {}
-
- autoprefixer@10.4.17(postcss@8.4.35):
+ ast-v8-to-istanbul@1.0.6:
dependencies:
- browserslist: 4.23.0
- caniuse-lite: 1.0.30001587
- fraction.js: 4.3.7
- normalize-range: 0.1.2
- picocolors: 1.0.0
- postcss: 8.4.35
- postcss-value-parser: 4.2.0
-
- available-typed-arrays@1.0.5: {}
+ '@jridgewell/trace-mapping': 0.3.31
+ estree-walker: 3.0.3
+ js-tokens: 10.0.0
- available-typed-arrays@1.0.6: {}
+ async-function@1.0.0: {}
available-typed-arrays@1.0.7:
dependencies:
possible-typed-array-names: 1.1.0
- aws-sign2@0.7.0: {}
+ axe-core@4.13.0: {}
- aws4@1.12.0: {}
+ axobject-query@4.1.0: {}
- axe-core@4.10.3: {}
+ balanced-match@1.0.2: {}
- axios@1.6.7:
- dependencies:
- follow-redirects: 1.15.5
- form-data: 4.0.0
- proxy-from-env: 1.1.0
- transitivePeerDependencies:
- - debug
+ balanced-match@4.0.4: {}
- axobject-query@4.1.0: {}
+ baseline-browser-mapping@2.11.22: {}
- babel-jest@29.7.0(@babel/core@7.20.12):
+ bidi-js@1.1.0:
dependencies:
- '@babel/core': 7.20.12
- '@jest/transform': 29.7.0
- '@types/babel__core': 7.20.0
- babel-plugin-istanbul: 6.1.1
- babel-preset-jest: 29.6.3(@babel/core@7.20.12)
- chalk: 4.1.2
- graceful-fs: 4.2.11
- slash: 3.0.0
- transitivePeerDependencies:
- - supports-color
+ require-from-string: 2.0.2
- babel-plugin-istanbul@6.1.1:
+ brace-expansion@1.1.18:
dependencies:
- '@babel/helper-plugin-utils': 7.20.2
- '@istanbuljs/load-nyc-config': 1.1.0
- '@istanbuljs/schema': 0.1.3
- istanbul-lib-instrument: 5.2.1
- test-exclude: 6.0.0
- transitivePeerDependencies:
- - supports-color
+ balanced-match: 1.0.2
+ concat-map: 0.0.1
- babel-plugin-jest-hoist@29.6.3:
+ brace-expansion@5.0.9:
dependencies:
- '@babel/template': 7.20.7
- '@babel/types': 7.20.7
- '@types/babel__core': 7.20.0
- '@types/babel__traverse': 7.18.3
+ balanced-match: 4.0.4
- babel-preset-current-node-syntax@1.0.1(@babel/core@7.20.12):
+ braces@3.0.3:
dependencies:
- '@babel/core': 7.20.12
- '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.20.12)
- '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.20.12)
- '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.20.12)
- '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.20.12)
- '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.20.12)
- '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.20.12)
- '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.20.12)
- '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.20.12)
- '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.20.12)
- '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.20.12)
- '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.20.12)
- '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.20.12)
+ fill-range: 7.1.1
- babel-preset-jest@29.6.3(@babel/core@7.20.12):
+ browserslist@4.28.9:
dependencies:
- '@babel/core': 7.20.12
- babel-plugin-jest-hoist: 29.6.3
- babel-preset-current-node-syntax: 1.0.1(@babel/core@7.20.12)
+ baseline-browser-mapping: 2.11.22
+ caniuse-lite: 1.0.30001810
+ electron-to-chromium: 1.5.427
+ node-releases: 2.0.55
+ update-browserslist-db: 1.3.3(browserslist@4.28.9)
- balanced-match@1.0.2: {}
+ call-bind-apply-helpers@1.0.2:
+ dependencies:
+ es-errors: 1.3.0
+ function-bind: 1.1.2
- base64-js@1.5.1: {}
+ call-bind@1.0.9:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ es-define-property: 1.0.1
+ get-intrinsic: 1.3.0
+ set-function-length: 1.2.2
- bcrypt-pbkdf@1.0.2:
+ call-bound@1.0.4:
dependencies:
- tweetnacl: 0.14.5
+ call-bind-apply-helpers: 1.0.2
+ get-intrinsic: 1.3.0
- binary-extensions@2.2.0: {}
+ callsites@3.1.0: {}
- blob-util@2.0.2: {}
+ caniuse-lite@1.0.30001810: {}
- bluebird@3.7.2: {}
+ chai@6.2.2: {}
- brace-expansion@1.1.11:
+ chalk@4.1.2:
dependencies:
- balanced-match: 1.0.2
- concat-map: 0.0.1
+ ansi-styles: 4.3.0
+ supports-color: 7.2.0
- brace-expansion@2.0.1:
- dependencies:
- balanced-match: 1.0.2
-
- braces@3.0.2:
- dependencies:
- fill-range: 7.0.1
-
- browserslist@4.21.5:
- dependencies:
- caniuse-lite: 1.0.30001720
- electron-to-chromium: 1.4.295
- node-releases: 2.0.10
- update-browserslist-db: 1.0.10(browserslist@4.21.5)
-
- browserslist@4.23.0:
- dependencies:
- caniuse-lite: 1.0.30001587
- electron-to-chromium: 1.4.673
- node-releases: 2.0.14
- update-browserslist-db: 1.0.13(browserslist@4.23.0)
-
- browserslist@4.25.0:
- dependencies:
- caniuse-lite: 1.0.30001720
- electron-to-chromium: 1.5.162
- node-releases: 2.0.19
- update-browserslist-db: 1.1.3(browserslist@4.25.0)
-
- bs-logger@0.2.6:
- dependencies:
- fast-json-stable-stringify: 2.1.0
-
- bser@2.1.1:
- dependencies:
- node-int64: 0.4.0
-
- buffer-crc32@0.2.13: {}
-
- buffer-from@1.1.2: {}
-
- buffer@5.7.1:
- dependencies:
- base64-js: 1.5.1
- ieee754: 1.2.1
-
- builtin-modules@3.3.0: {}
-
- builtins@5.0.1:
- dependencies:
- semver: 7.7.2
-
- cachedir@2.3.0: {}
-
- call-bind-apply-helpers@1.0.2:
- dependencies:
- es-errors: 1.3.0
- function-bind: 1.1.2
-
- call-bind@1.0.2:
- dependencies:
- function-bind: 1.1.1
- get-intrinsic: 1.2.4
-
- call-bind@1.0.7:
- dependencies:
- es-define-property: 1.0.0
- es-errors: 1.3.0
- function-bind: 1.1.2
- get-intrinsic: 1.2.4
- set-function-length: 1.2.1
-
- call-bind@1.0.8:
- dependencies:
- call-bind-apply-helpers: 1.0.2
- es-define-property: 1.0.0
- get-intrinsic: 1.3.0
- set-function-length: 1.2.2
-
- call-bound@1.0.4:
- dependencies:
- call-bind-apply-helpers: 1.0.2
- get-intrinsic: 1.3.0
-
- callsites@3.1.0: {}
-
- camelcase-css@2.0.1: {}
-
- camelcase@5.3.1: {}
-
- camelcase@6.3.0: {}
-
- caniuse-lite@1.0.30001587: {}
-
- caniuse-lite@1.0.30001720: {}
-
- caseless@0.12.0: {}
-
- chalk@2.4.2:
- dependencies:
- ansi-styles: 3.2.1
- escape-string-regexp: 1.0.5
- supports-color: 5.5.0
-
- chalk@3.0.0:
- dependencies:
- ansi-styles: 4.3.0
- supports-color: 7.2.0
-
- chalk@4.1.2:
- dependencies:
- ansi-styles: 4.3.0
- supports-color: 7.2.0
-
- char-regex@1.0.2: {}
-
- check-more-types@2.24.0: {}
-
- chokidar@3.5.3:
- dependencies:
- anymatch: 3.1.3
- braces: 3.0.2
- glob-parent: 5.1.2
- is-binary-path: 2.1.0
- is-glob: 4.0.3
- normalize-path: 3.0.0
- readdirp: 3.6.0
- optionalDependencies:
- fsevents: 2.3.2
-
- ci-info@3.7.1: {}
-
- ci-info@4.2.0: {}
-
- cjs-module-lexer@1.2.2: {}
-
- class-variance-authority@0.7.1:
+ class-variance-authority@0.7.1:
dependencies:
clsx: 2.1.1
- clean-regexp@1.0.0:
- dependencies:
- escape-string-regexp: 1.0.5
-
- clean-stack@2.2.0: {}
-
- cli-cursor@3.1.0:
- dependencies:
- restore-cursor: 3.1.0
-
- cli-table3@0.6.3:
- dependencies:
- string-width: 4.2.3
- optionalDependencies:
- '@colors/colors': 1.5.0
-
- cli-truncate@2.1.0:
- dependencies:
- slice-ansi: 3.0.0
- string-width: 4.2.3
-
client-only@0.0.1: {}
- cliui@8.0.1:
- dependencies:
- string-width: 4.2.3
- strip-ansi: 6.0.1
- wrap-ansi: 7.0.0
-
clsx@2.1.1: {}
- co@4.6.0: {}
-
- collect-v8-coverage@1.0.1: {}
-
- color-convert@1.9.3:
- dependencies:
- color-name: 1.1.3
+ cn@0.2.6: {}
color-convert@2.0.1:
dependencies:
color-name: 1.1.4
- color-name@1.1.3: {}
-
color-name@1.1.4: {}
- color-string@1.9.1:
- dependencies:
- color-name: 1.1.4
- simple-swizzle: 0.2.2
- optional: true
-
- color@4.2.3:
- dependencies:
- color-convert: 2.0.1
- color-string: 1.9.1
- optional: true
-
- colorette@2.0.19: {}
-
- combined-stream@1.0.8:
- dependencies:
- delayed-stream: 1.0.0
-
- commander@4.1.1: {}
-
- commander@6.2.1: {}
-
- common-tags@1.8.2: {}
-
concat-map@0.0.1: {}
- convert-source-map@1.9.0: {}
-
convert-source-map@2.0.0: {}
- core-js-compat@3.42.0:
- dependencies:
- browserslist: 4.25.0
-
- core-util-is@1.0.2: {}
-
- create-jest@29.7.0(@types/node@22.15.29):
- dependencies:
- '@jest/types': 29.6.3
- chalk: 4.1.2
- exit: 0.1.2
- graceful-fs: 4.2.11
- jest-config: 29.7.0(@types/node@22.15.29)
- jest-util: 29.7.0
- prompts: 2.4.2
- transitivePeerDependencies:
- - '@types/node'
- - babel-plugin-macros
- - supports-color
- - ts-node
-
- cross-spawn@7.0.3:
+ cross-spawn@7.0.6:
dependencies:
path-key: 3.1.1
shebang-command: 2.0.0
which: 2.0.2
- css.escape@1.5.1: {}
-
- cssesc@3.0.0: {}
+ css-tree@3.2.1:
+ dependencies:
+ mdn-data: 2.27.1
+ source-map-js: 1.2.1
- csstype@3.1.1: {}
+ css.escape@1.5.1: {}
- cypress@13.6.4:
- dependencies:
- '@cypress/request': 3.0.1
- '@cypress/xvfb': 1.2.4(supports-color@8.1.1)
- '@types/sinonjs__fake-timers': 8.1.1
- '@types/sizzle': 2.3.3
- arch: 2.2.0
- blob-util: 2.0.2
- bluebird: 3.7.2
- buffer: 5.7.1
- cachedir: 2.3.0
- chalk: 4.1.2
- check-more-types: 2.24.0
- cli-cursor: 3.1.0
- cli-table3: 0.6.3
- commander: 6.2.1
- common-tags: 1.8.2
- dayjs: 1.11.7
- debug: 4.3.4(supports-color@8.1.1)
- enquirer: 2.3.6
- eventemitter2: 6.4.7
- execa: 4.1.0
- executable: 4.1.1
- extract-zip: 2.0.1(supports-color@8.1.1)
- figures: 3.2.0
- fs-extra: 9.1.0
- getos: 3.2.1
- is-ci: 3.0.1
- is-installed-globally: 0.4.0
- lazy-ass: 1.6.0
- listr2: 3.14.0(enquirer@2.3.6)
- lodash: 4.17.21
- log-symbols: 4.1.0
- minimist: 1.2.8
- ospath: 1.2.2
- pretty-bytes: 5.6.0
- process: 0.11.10
- proxy-from-env: 1.0.0
- request-progress: 3.0.0
- semver: 7.6.0
- supports-color: 8.1.1
- tmp: 0.2.1
- untildify: 4.0.0
- yauzl: 2.10.0
+ csstype@3.2.3: {}
damerau-levenshtein@1.0.8: {}
- dashdash@1.14.1:
+ data-urls@7.0.0:
dependencies:
- assert-plus: 1.0.0
+ whatwg-mimetype: 5.0.0
+ whatwg-url: 16.0.1
+ transitivePeerDependencies:
+ - '@noble/hashes'
data-view-buffer@1.0.2:
dependencies:
@@ -6816,96 +4349,42 @@ snapshots:
es-errors: 1.3.0
is-data-view: 1.0.2
- dayjs@1.11.7: {}
-
- debug@3.2.7(supports-color@8.1.1):
+ debug@3.2.7(supports-color@7.2.0):
dependencies:
ms: 2.1.3
optionalDependencies:
- supports-color: 8.1.1
+ supports-color: 7.2.0
- debug@4.3.4(supports-color@8.1.1):
+ debug@4.4.3(supports-color@7.2.0):
dependencies:
- ms: 2.1.2
+ ms: 2.1.3
optionalDependencies:
- supports-color: 8.1.1
-
- dedent@1.5.1: {}
+ supports-color: 7.2.0
- deep-equal@2.2.0:
- dependencies:
- call-bind: 1.0.2
- es-get-iterator: 1.1.3
- get-intrinsic: 1.2.0
- is-arguments: 1.1.1
- is-array-buffer: 3.0.1
- is-date-object: 1.0.5
- is-regex: 1.1.4
- is-shared-array-buffer: 1.0.2
- isarray: 2.0.5
- object-is: 1.1.5
- object-keys: 1.1.1
- object.assign: 4.1.4
- regexp.prototype.flags: 1.4.3
- side-channel: 1.0.4
- which-boxed-primitive: 1.0.2
- which-collection: 1.0.1
- which-typed-array: 1.1.9
+ decimal.js@10.6.0: {}
deep-is@0.1.4: {}
- deepmerge@4.3.0: {}
-
define-data-property@1.1.4:
dependencies:
- es-define-property: 1.0.0
+ es-define-property: 1.0.1
es-errors: 1.3.0
- gopd: 1.0.1
-
- define-properties@1.2.0:
- dependencies:
- has-property-descriptors: 1.0.0
- object-keys: 1.1.1
+ gopd: 1.2.0
define-properties@1.2.1:
dependencies:
define-data-property: 1.1.4
- has-property-descriptors: 1.0.0
+ has-property-descriptors: 1.0.2
object-keys: 1.1.1
- delayed-stream@1.0.0: {}
-
- detect-indent@7.0.1: {}
-
- detect-libc@2.0.4:
- optional: true
-
- detect-newline@3.1.0: {}
-
- detect-newline@4.0.1: {}
-
- detect-node-es@1.1.0: {}
-
- didyoumean@1.2.2: {}
-
- diff-sequences@29.4.2: {}
-
- diff-sequences@29.6.3: {}
-
- dir-glob@3.0.1:
- dependencies:
- path-type: 4.0.0
+ dequal@2.0.3: {}
- dlv@1.1.3: {}
+ detect-libc@2.1.2: {}
doctrine@2.1.0:
dependencies:
esutils: 2.0.3
- doctrine@3.0.0:
- dependencies:
- esutils: 2.0.3
-
dom-accessibility-api@0.5.16: {}
dom-accessibility-api@0.6.3: {}
@@ -6916,136 +4395,40 @@ snapshots:
es-errors: 1.3.0
gopd: 1.2.0
- ecc-jsbn@0.1.2:
- dependencies:
- jsbn: 0.1.1
- safer-buffer: 2.1.2
-
- electron-to-chromium@1.4.295: {}
-
- electron-to-chromium@1.4.673: {}
-
- electron-to-chromium@1.5.162: {}
-
- emittery@0.13.1: {}
-
- emoji-regex@8.0.0: {}
+ electron-to-chromium@1.5.427: {}
emoji-regex@9.2.2: {}
- end-of-stream@1.4.4:
+ enhanced-resolve@5.24.5:
dependencies:
- once: 1.4.0
+ graceful-fs: 4.2.11
+ tapable: 2.3.3
- enhanced-resolve@5.13.0:
+ entities@8.1.0: {}
+
+ es-abstract-get@1.0.0:
dependencies:
- graceful-fs: 4.2.11
- tapable: 2.2.1
-
- enquirer@2.3.6:
- dependencies:
- ansi-colors: 4.1.3
-
- error-ex@1.3.2:
- dependencies:
- is-arrayish: 0.2.1
-
- es-abstract@1.21.1:
- dependencies:
- available-typed-arrays: 1.0.5
- call-bind: 1.0.2
- es-set-tostringtag: 2.0.1
- es-to-primitive: 1.2.1
- function-bind: 1.1.1
- function.prototype.name: 1.1.5
- get-intrinsic: 1.2.0
- get-symbol-description: 1.0.0
- globalthis: 1.0.3
- gopd: 1.0.1
- has: 1.0.3
- has-property-descriptors: 1.0.0
- has-proto: 1.0.1
- has-symbols: 1.0.3
- internal-slot: 1.0.5
- is-array-buffer: 3.0.1
- is-callable: 1.2.7
- is-negative-zero: 2.0.2
- is-regex: 1.1.4
- is-shared-array-buffer: 1.0.2
- is-string: 1.0.7
- is-typed-array: 1.1.10
- is-weakref: 1.0.2
- object-inspect: 1.12.3
- object-keys: 1.1.1
- object.assign: 4.1.4
- regexp.prototype.flags: 1.4.3
- safe-regex-test: 1.0.0
- string.prototype.trimend: 1.0.6
- string.prototype.trimstart: 1.0.6
- typed-array-length: 1.0.4
- unbox-primitive: 1.0.2
- which-typed-array: 1.1.9
-
- es-abstract@1.22.4:
- dependencies:
- array-buffer-byte-length: 1.0.1
- arraybuffer.prototype.slice: 1.0.3
- available-typed-arrays: 1.0.6
- call-bind: 1.0.7
- es-define-property: 1.0.0
es-errors: 1.3.0
- es-set-tostringtag: 2.0.2
- es-to-primitive: 1.2.1
- function.prototype.name: 1.1.6
- get-intrinsic: 1.2.4
- get-symbol-description: 1.0.2
- globalthis: 1.0.3
- gopd: 1.0.1
- has-property-descriptors: 1.0.2
- has-proto: 1.0.1
- has-symbols: 1.0.3
- hasown: 2.0.1
- internal-slot: 1.0.7
- is-array-buffer: 3.0.4
+ es-object-atoms: 1.1.2
is-callable: 1.2.7
- is-negative-zero: 2.0.2
- is-regex: 1.1.4
- is-shared-array-buffer: 1.0.2
- is-string: 1.0.7
- is-typed-array: 1.1.13
- is-weakref: 1.0.2
- object-inspect: 1.13.1
- object-keys: 1.1.1
- object.assign: 4.1.5
- regexp.prototype.flags: 1.5.2
- safe-array-concat: 1.1.0
- safe-regex-test: 1.0.3
- string.prototype.trim: 1.2.8
- string.prototype.trimend: 1.0.7
- string.prototype.trimstart: 1.0.7
- typed-array-buffer: 1.0.1
- typed-array-byte-length: 1.0.0
- typed-array-byte-offset: 1.0.0
- typed-array-length: 1.0.4
- unbox-primitive: 1.0.2
- which-typed-array: 1.1.14
-
- es-abstract@1.24.0:
+ object-inspect: 1.13.4
+
+ es-abstract@1.24.2:
dependencies:
array-buffer-byte-length: 1.0.2
arraybuffer.prototype.slice: 1.0.4
available-typed-arrays: 1.0.7
- call-bind: 1.0.8
+ call-bind: 1.0.9
call-bound: 1.0.4
data-view-buffer: 1.0.2
data-view-byte-length: 1.0.2
data-view-byte-offset: 1.0.1
es-define-property: 1.0.1
es-errors: 1.3.0
- es-object-atoms: 1.1.1
+ es-object-atoms: 1.1.2
es-set-tostringtag: 2.1.0
- es-to-primitive: 1.3.0
- function.prototype.name: 1.1.8
+ es-to-primitive: 1.3.4
+ function.prototype.name: 1.2.0
get-intrinsic: 1.3.0
get-proto: 1.0.1
get-symbol-description: 1.1.0
@@ -7054,7 +4437,7 @@ snapshots:
has-property-descriptors: 1.0.2
has-proto: 1.2.0
has-symbols: 1.1.0
- hasown: 2.0.2
+ hasown: 2.0.4
internal-slot: 1.1.0
is-array-buffer: 3.0.5
is-callable: 1.2.7
@@ -7070,69 +4453,33 @@ snapshots:
object-inspect: 1.13.4
object-keys: 1.1.1
object.assign: 4.1.7
- own-keys: 1.0.1
+ own-keys: 1.0.2
regexp.prototype.flags: 1.5.4
- safe-array-concat: 1.1.3
+ safe-array-concat: 1.1.4
safe-push-apply: 1.0.0
safe-regex-test: 1.1.0
set-proto: 1.0.0
stop-iteration-iterator: 1.1.0
- string.prototype.trim: 1.2.10
- string.prototype.trimend: 1.0.9
+ string.prototype.trim: 1.2.11
+ string.prototype.trimend: 1.0.10
string.prototype.trimstart: 1.0.8
typed-array-buffer: 1.0.3
typed-array-byte-length: 1.0.3
typed-array-byte-offset: 1.0.4
- typed-array-length: 1.0.7
+ typed-array-length: 1.0.8
unbox-primitive: 1.1.0
- which-typed-array: 1.1.19
-
- es-array-method-boxes-properly@1.0.0: {}
-
- es-define-property@1.0.0:
- dependencies:
- get-intrinsic: 1.2.4
+ which-typed-array: 1.1.22
es-define-property@1.0.1: {}
es-errors@1.3.0: {}
- es-get-iterator@1.1.3:
- dependencies:
- call-bind: 1.0.2
- get-intrinsic: 1.2.0
- has-symbols: 1.0.3
- is-arguments: 1.1.1
- is-map: 2.0.2
- is-set: 2.0.2
- is-string: 1.0.7
- isarray: 2.0.5
- stop-iteration-iterator: 1.0.0
-
- es-iterator-helpers@1.0.17:
+ es-iterator-helpers@1.4.0:
dependencies:
- asynciterator.prototype: 1.0.0
- call-bind: 1.0.7
- define-properties: 1.2.1
- es-abstract: 1.22.4
- es-errors: 1.3.0
- es-set-tostringtag: 2.0.2
- function-bind: 1.1.2
- get-intrinsic: 1.2.4
- globalthis: 1.0.3
- has-property-descriptors: 1.0.2
- has-proto: 1.0.1
- has-symbols: 1.0.3
- internal-slot: 1.0.7
- iterator.prototype: 1.1.2
- safe-array-concat: 1.1.0
-
- es-iterator-helpers@1.2.1:
- dependencies:
- call-bind: 1.0.8
+ call-bind: 1.0.9
call-bound: 1.0.4
define-properties: 1.2.1
- es-abstract: 1.24.0
+ es-abstract: 1.24.2
es-errors: 1.3.0
es-set-tostringtag: 2.1.0
function-bind: 1.1.2
@@ -7144,2287 +4491,978 @@ snapshots:
has-symbols: 1.1.0
internal-slot: 1.1.0
iterator.prototype: 1.1.5
- safe-array-concat: 1.1.3
-
- es-object-atoms@1.1.1:
- dependencies:
- es-errors: 1.3.0
+ math-intrinsics: 1.1.0
- es-set-tostringtag@2.0.1:
- dependencies:
- get-intrinsic: 1.2.0
- has: 1.0.3
- has-tostringtag: 1.0.0
+ es-module-lexer@2.3.2: {}
- es-set-tostringtag@2.0.2:
+ es-object-atoms@1.1.2:
dependencies:
- get-intrinsic: 1.2.4
- has-tostringtag: 1.0.0
- hasown: 2.0.1
+ es-errors: 1.3.0
es-set-tostringtag@2.1.0:
dependencies:
es-errors: 1.3.0
get-intrinsic: 1.3.0
has-tostringtag: 1.0.2
- hasown: 2.0.2
-
- es-shim-unscopables@1.0.0:
- dependencies:
- has: 1.0.3
-
- es-shim-unscopables@1.0.2:
- dependencies:
- hasown: 2.0.1
+ hasown: 2.0.4
- es-to-primitive@1.2.1:
+ es-shim-unscopables@1.1.0:
dependencies:
- is-callable: 1.2.7
- is-date-object: 1.0.5
- is-symbol: 1.0.4
+ hasown: 2.0.4
- es-to-primitive@1.3.0:
+ es-to-primitive@1.3.4:
dependencies:
+ es-abstract-get: 1.0.0
+ es-define-property: 1.0.1
+ es-errors: 1.3.0
is-callable: 1.2.7
- is-date-object: 1.0.5
- is-symbol: 1.0.4
-
- escalade@3.1.1: {}
+ is-date-object: 1.1.0
+ is-symbol: 1.1.1
escalade@3.2.0: {}
- escape-string-regexp@1.0.5: {}
-
- escape-string-regexp@2.0.0: {}
-
escape-string-regexp@4.0.0: {}
- eslint-config-prettier@9.1.0(eslint@8.56.0):
- dependencies:
- eslint: 8.56.0
-
- eslint-config-standard-jsx@11.0.0(eslint-plugin-react@7.33.2(eslint@8.56.0))(eslint@8.56.0):
- dependencies:
- eslint: 8.56.0
- eslint-plugin-react: 7.33.2(eslint@8.56.0)
-
- eslint-config-standard-with-typescript@23.0.0(@typescript-eslint/eslint-plugin@5.51.0(@typescript-eslint/parser@5.51.0(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1)(eslint-plugin-n@15.7.0(eslint@8.56.0))(eslint-plugin-promise@6.1.1(eslint@8.56.0))(eslint@8.56.0)(typescript@5.3.3):
- dependencies:
- '@typescript-eslint/eslint-plugin': 5.51.0(@typescript-eslint/parser@5.51.0(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0)(typescript@5.3.3)
- '@typescript-eslint/parser': 5.51.0(eslint@8.56.0)(typescript@5.3.3)
- eslint: 8.56.0
- eslint-config-standard: 17.0.0(eslint-plugin-import@2.29.1)(eslint-plugin-n@15.7.0(eslint@8.56.0))(eslint-plugin-promise@6.1.1(eslint@8.56.0))(eslint@8.56.0)
- eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0)
- eslint-plugin-n: 15.7.0(eslint@8.56.0)
- eslint-plugin-promise: 6.1.1(eslint@8.56.0)
- typescript: 5.3.3
- transitivePeerDependencies:
- - supports-color
-
- eslint-config-standard@17.0.0(eslint-plugin-import@2.29.1)(eslint-plugin-n@15.7.0(eslint@8.56.0))(eslint-plugin-promise@6.1.1(eslint@8.56.0))(eslint@8.56.0):
+ eslint-config-prettier@10.1.8(eslint@9.39.5(jiti@2.7.0)(supports-color@7.2.0)):
dependencies:
- eslint: 8.56.0
- eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0)
- eslint-plugin-n: 15.7.0(eslint@8.56.0)
- eslint-plugin-promise: 6.1.1(eslint@8.56.0)
+ eslint: 9.39.5(jiti@2.7.0)(supports-color@7.2.0)
- eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.29.1):
+ eslint-import-context@0.1.9(unrs-resolver@1.12.2):
dependencies:
- eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0)
-
- eslint-import-resolver-node@0.3.9:
- dependencies:
- debug: 3.2.7(supports-color@8.1.1)
- is-core-module: 2.13.1
- resolve: 1.22.8
- transitivePeerDependencies:
- - supports-color
-
- eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.56.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1)(eslint@8.56.0):
- dependencies:
- debug: 4.3.4(supports-color@8.1.1)
- enhanced-resolve: 5.13.0
- eslint: 8.56.0
- eslint-module-utils: 2.8.0(@typescript-eslint/parser@7.18.0(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0)
- eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0)
- fast-glob: 3.3.2
- get-tsconfig: 4.5.0
- is-core-module: 2.13.1
- is-glob: 4.0.3
- transitivePeerDependencies:
- - '@typescript-eslint/parser'
- - eslint-import-resolver-node
- - eslint-import-resolver-webpack
- - supports-color
-
- eslint-module-utils@2.8.0(@typescript-eslint/parser@5.51.0(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint@8.56.0):
- dependencies:
- debug: 3.2.7(supports-color@8.1.1)
+ get-tsconfig: 4.14.3
+ stable-hash-x: 0.2.0
optionalDependencies:
- '@typescript-eslint/parser': 5.51.0(eslint@8.56.0)(typescript@5.3.3)
- eslint: 8.56.0
- eslint-import-resolver-node: 0.3.9
- transitivePeerDependencies:
- - supports-color
+ unrs-resolver: 1.12.2
- eslint-module-utils@2.8.0(@typescript-eslint/parser@7.18.0(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0):
+ eslint-import-resolver-node@0.3.10(supports-color@7.2.0):
dependencies:
- debug: 3.2.7(supports-color@8.1.1)
- optionalDependencies:
- '@typescript-eslint/parser': 7.18.0(eslint@8.56.0)(typescript@5.3.3)
- eslint: 8.56.0
- eslint-import-resolver-node: 0.3.9
- eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.56.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1)(eslint@8.56.0)
+ debug: 3.2.7(supports-color@7.2.0)
+ is-core-module: 2.16.2
+ resolve: 2.0.0-next.7
transitivePeerDependencies:
- supports-color
- eslint-plugin-cypress@2.15.1(eslint@8.56.0):
- dependencies:
- eslint: 8.56.0
- globals: 13.20.0
-
- eslint-plugin-es@4.1.0(eslint@8.56.0):
- dependencies:
- eslint: 8.56.0
- eslint-utils: 2.1.0
- regexpp: 3.2.0
-
- eslint-plugin-eslint-comments@3.2.0(eslint@8.56.0):
- dependencies:
- escape-string-regexp: 1.0.5
- eslint: 8.56.0
- ignore: 5.2.4
-
- eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.51.0(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0):
+ eslint-import-resolver-typescript@4.4.5(eslint-plugin-import@2.32.0)(eslint@9.39.5(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0):
dependencies:
- array-includes: 3.1.7
- array.prototype.findlastindex: 1.2.4
- array.prototype.flat: 1.3.2
- array.prototype.flatmap: 1.3.2
- debug: 3.2.7(supports-color@8.1.1)
- doctrine: 2.1.0
- eslint: 8.56.0
- eslint-import-resolver-node: 0.3.9
- eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.51.0(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint@8.56.0)
- hasown: 2.0.1
- is-core-module: 2.13.1
- is-glob: 4.0.3
- minimatch: 3.1.2
- object.fromentries: 2.0.7
- object.groupby: 1.0.2
- object.values: 1.1.7
- semver: 6.3.1
- tsconfig-paths: 3.15.0
+ debug: 4.4.3(supports-color@7.2.0)
+ eslint: 9.39.5(jiti@2.7.0)(supports-color@7.2.0)
+ eslint-import-context: 0.1.9(unrs-resolver@1.12.2)
+ get-tsconfig: 4.14.3
+ is-bun-module: 2.0.0
+ stable-hash-x: 0.2.0
+ tinyglobby: 0.2.17
+ unrs-resolver: 1.12.2
optionalDependencies:
- '@typescript-eslint/parser': 5.51.0(eslint@8.56.0)(typescript@5.3.3)
+ eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.70.0(@typescript/typescript6@6.0.2)(eslint@9.39.5(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0))(eslint-import-resolver-typescript@4.4.5)(eslint@9.39.5(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)
transitivePeerDependencies:
- - eslint-import-resolver-typescript
- - eslint-import-resolver-webpack
- supports-color
- eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0):
+ eslint-module-utils@2.14.0(@typescript-eslint/parser@8.70.0(@typescript/typescript6@6.0.2)(eslint@9.39.5(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0))(eslint-import-resolver-node@0.3.10(supports-color@7.2.0))(eslint-import-resolver-typescript@4.4.5)(eslint@9.39.5(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0):
dependencies:
- array-includes: 3.1.7
- array.prototype.findlastindex: 1.2.4
- array.prototype.flat: 1.3.2
- array.prototype.flatmap: 1.3.2
- debug: 3.2.7(supports-color@8.1.1)
- doctrine: 2.1.0
- eslint: 8.56.0
- eslint-import-resolver-node: 0.3.9
- eslint-module-utils: 2.8.0(@typescript-eslint/parser@7.18.0(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0)
- hasown: 2.0.1
- is-core-module: 2.13.1
- is-glob: 4.0.3
- minimatch: 3.1.2
- object.fromentries: 2.0.7
- object.groupby: 1.0.2
- object.values: 1.1.7
- semver: 6.3.1
- tsconfig-paths: 3.15.0
+ debug: 3.2.7(supports-color@7.2.0)
optionalDependencies:
- '@typescript-eslint/parser': 7.18.0(eslint@8.56.0)(typescript@5.3.3)
+ '@typescript-eslint/parser': 8.70.0(@typescript/typescript6@6.0.2)(eslint@9.39.5(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)
+ eslint: 9.39.5(jiti@2.7.0)(supports-color@7.2.0)
+ eslint-import-resolver-node: 0.3.10(supports-color@7.2.0)
+ eslint-import-resolver-typescript: 4.4.5(eslint-plugin-import@2.32.0)(eslint@9.39.5(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)
transitivePeerDependencies:
- - eslint-import-resolver-typescript
- - eslint-import-resolver-webpack
- supports-color
- eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0):
+ eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.70.0(@typescript/typescript6@6.0.2)(eslint@9.39.5(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0))(eslint-import-resolver-typescript@4.4.5)(eslint@9.39.5(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0):
dependencies:
- array-includes: 3.1.7
- array.prototype.findlastindex: 1.2.4
- array.prototype.flat: 1.3.2
- array.prototype.flatmap: 1.3.2
- debug: 3.2.7(supports-color@8.1.1)
+ '@rtsao/scc': 1.1.0
+ array-includes: 3.2.0
+ array.prototype.findlastindex: 1.2.6
+ array.prototype.flat: 1.3.3
+ array.prototype.flatmap: 1.3.3
+ debug: 3.2.7(supports-color@7.2.0)
doctrine: 2.1.0
- eslint: 8.56.0
- eslint-import-resolver-node: 0.3.9
- eslint-module-utils: 2.8.0(@typescript-eslint/parser@7.18.0(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0)
- hasown: 2.0.1
- is-core-module: 2.13.1
+ eslint: 9.39.5(jiti@2.7.0)(supports-color@7.2.0)
+ eslint-import-resolver-node: 0.3.10(supports-color@7.2.0)
+ eslint-module-utils: 2.14.0(@typescript-eslint/parser@8.70.0(@typescript/typescript6@6.0.2)(eslint@9.39.5(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0))(eslint-import-resolver-node@0.3.10(supports-color@7.2.0))(eslint-import-resolver-typescript@4.4.5)(eslint@9.39.5(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)
+ hasown: 2.0.4
+ is-core-module: 2.16.2
is-glob: 4.0.3
- minimatch: 3.1.2
- object.fromentries: 2.0.7
- object.groupby: 1.0.2
- object.values: 1.1.7
+ minimatch: 3.1.5
+ object.fromentries: 2.0.8
+ object.groupby: 1.0.3
+ object.values: 1.2.1
semver: 6.3.1
+ string.prototype.trimend: 1.0.10
tsconfig-paths: 3.15.0
optionalDependencies:
- '@typescript-eslint/parser': 7.18.0(eslint@8.56.0)(typescript@5.3.3)
+ '@typescript-eslint/parser': 8.70.0(@typescript/typescript6@6.0.2)(eslint@9.39.5(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)
transitivePeerDependencies:
- eslint-import-resolver-typescript
- eslint-import-resolver-webpack
- supports-color
- eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0)(jest@29.7.0(@types/node@22.15.29))(typescript@5.3.3):
- dependencies:
- '@typescript-eslint/utils': 5.59.1(eslint@8.56.0)(typescript@5.3.3)
- eslint: 8.56.0
- optionalDependencies:
- '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0)(typescript@5.3.3)
- jest: 29.7.0(@types/node@22.15.29)
- transitivePeerDependencies:
- - supports-color
- - typescript
-
- eslint-plugin-jsx-a11y@6.10.2(eslint@8.56.0):
+ eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.5(jiti@2.7.0)(supports-color@7.2.0)):
dependencies:
aria-query: 5.3.2
- array-includes: 3.1.9
+ array-includes: 3.2.0
array.prototype.flatmap: 1.3.3
ast-types-flow: 0.0.8
- axe-core: 4.10.3
+ axe-core: 4.13.0
axobject-query: 4.1.0
damerau-levenshtein: 1.0.8
emoji-regex: 9.2.2
- eslint: 8.56.0
- hasown: 2.0.2
+ eslint: 9.39.5(jiti@2.7.0)(supports-color@7.2.0)
+ hasown: 2.0.4
jsx-ast-utils: 3.3.5
language-tags: 1.0.9
- minimatch: 3.1.2
+ minimatch: 3.1.5
object.fromentries: 2.0.8
safe-regex-test: 1.1.0
string.prototype.includes: 2.0.1
- eslint-plugin-n@15.7.0(eslint@8.56.0):
- dependencies:
- builtins: 5.0.1
- eslint: 8.56.0
- eslint-plugin-es: 4.1.0(eslint@8.56.0)
- eslint-utils: 3.0.0(eslint@8.56.0)
- ignore: 5.2.4
- is-core-module: 2.11.0
- minimatch: 3.1.2
- resolve: 1.22.2
- semver: 7.7.2
-
- eslint-plugin-playwright@1.8.3(eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0)(jest@29.7.0(@types/node@22.15.29))(typescript@5.3.3))(eslint@8.56.0):
- dependencies:
- eslint: 8.56.0
- globals: 13.24.0
- optionalDependencies:
- eslint-plugin-jest: 27.9.0(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0)(jest@29.7.0(@types/node@22.15.29))(typescript@5.3.3)
-
- eslint-plugin-prettier@5.1.3(eslint-config-prettier@9.1.0(eslint@8.56.0))(eslint@8.56.0)(prettier@3.2.5):
+ eslint-plugin-prettier@5.5.6(eslint-config-prettier@10.1.8(eslint@9.39.5(jiti@2.7.0)(supports-color@7.2.0)))(eslint@9.39.5(jiti@2.7.0)(supports-color@7.2.0))(prettier@3.9.6):
dependencies:
- eslint: 8.56.0
- prettier: 3.2.5
- prettier-linter-helpers: 1.0.0
- synckit: 0.8.8
+ eslint: 9.39.5(jiti@2.7.0)(supports-color@7.2.0)
+ prettier: 3.9.6
+ prettier-linter-helpers: 1.0.1
+ synckit: 0.11.13
optionalDependencies:
- eslint-config-prettier: 9.1.0(eslint@8.56.0)
+ eslint-config-prettier: 10.1.8(eslint@9.39.5(jiti@2.7.0)(supports-color@7.2.0))
- eslint-plugin-promise@6.1.1(eslint@8.56.0):
+ eslint-plugin-react-hooks@7.1.1(eslint@9.39.5(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0):
dependencies:
- eslint: 8.56.0
+ '@babel/core': 7.29.7(supports-color@7.2.0)
+ '@babel/parser': 7.29.8
+ eslint: 9.39.5(jiti@2.7.0)(supports-color@7.2.0)
+ hermes-parser: 0.25.1
+ zod: 4.6.2
+ zod-validation-error: 4.0.2(zod@4.6.2)
+ transitivePeerDependencies:
+ - supports-color
- eslint-plugin-react-hooks@4.6.0(eslint@8.56.0):
+ eslint-plugin-react@7.37.5(eslint@9.39.5(jiti@2.7.0)(supports-color@7.2.0)):
dependencies:
- eslint: 8.56.0
-
- eslint-plugin-react@7.33.2(eslint@8.56.0):
- dependencies:
- array-includes: 3.1.6
- array.prototype.flatmap: 1.3.1
- array.prototype.tosorted: 1.1.1
- doctrine: 2.1.0
- es-iterator-helpers: 1.0.17
- eslint: 8.56.0
- estraverse: 5.3.0
- jsx-ast-utils: 3.3.3
- minimatch: 3.1.2
- object.entries: 1.1.6
- object.fromentries: 2.0.6
- object.hasown: 1.1.2
- object.values: 1.1.6
- prop-types: 15.8.1
- resolve: 2.0.0-next.4
- semver: 6.3.1
- string.prototype.matchall: 4.0.8
-
- eslint-plugin-react@7.37.5(eslint@8.56.0):
- dependencies:
- array-includes: 3.1.9
+ array-includes: 3.2.0
array.prototype.findlast: 1.2.5
array.prototype.flatmap: 1.3.3
array.prototype.tosorted: 1.1.4
doctrine: 2.1.0
- es-iterator-helpers: 1.2.1
- eslint: 8.56.0
+ es-iterator-helpers: 1.4.0
+ eslint: 9.39.5(jiti@2.7.0)(supports-color@7.2.0)
estraverse: 5.3.0
- hasown: 2.0.2
- jsx-ast-utils: 3.3.3
- minimatch: 3.1.2
+ hasown: 2.0.4
+ jsx-ast-utils: 3.3.5
+ minimatch: 3.1.5
object.entries: 1.1.9
object.fromentries: 2.0.8
object.values: 1.2.1
prop-types: 15.8.1
- resolve: 2.0.0-next.5
+ resolve: 2.0.0-next.7
semver: 6.3.1
- string.prototype.matchall: 4.0.12
+ string.prototype.matchall: 4.1.0
string.prototype.repeat: 1.0.0
- eslint-plugin-tailwindcss@3.14.2(tailwindcss@3.4.1):
- dependencies:
- fast-glob: 3.2.12
- postcss: 8.4.35
- tailwindcss: 3.4.1
-
- eslint-plugin-testing-library@6.2.0(eslint@8.56.0)(typescript@5.3.3):
- dependencies:
- '@typescript-eslint/utils': 5.59.1(eslint@8.56.0)(typescript@5.3.3)
- eslint: 8.56.0
- transitivePeerDependencies:
- - supports-color
- - typescript
-
- eslint-plugin-tsdoc@0.2.17:
- dependencies:
- '@microsoft/tsdoc': 0.14.2
- '@microsoft/tsdoc-config': 0.16.2
-
- eslint-plugin-tsdoc@0.4.0:
- dependencies:
- '@microsoft/tsdoc': 0.15.1
- '@microsoft/tsdoc-config': 0.17.1
-
- eslint-plugin-unicorn@51.0.1(eslint@8.56.0):
- dependencies:
- '@babel/helper-validator-identifier': 7.22.20
- '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0)
- '@eslint/eslintrc': 2.1.4
- ci-info: 4.2.0
- clean-regexp: 1.0.0
- core-js-compat: 3.42.0
- eslint: 8.56.0
- esquery: 1.5.0
- indent-string: 4.0.0
- is-builtin-module: 3.2.1
- jsesc: 3.0.2
- pluralize: 8.0.0
- read-pkg-up: 7.0.1
- regexp-tree: 0.1.27
- regjsparser: 0.10.0
- semver: 7.7.2
- strip-indent: 3.0.0
- transitivePeerDependencies:
- - supports-color
-
- eslint-plugin-vitest@0.3.26(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0)(typescript@5.3.3):
- dependencies:
- '@typescript-eslint/utils': 7.18.0(eslint@8.56.0)(typescript@5.3.3)
- eslint: 8.56.0
- optionalDependencies:
- '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0)(typescript@5.3.3)
- transitivePeerDependencies:
- - supports-color
- - typescript
-
- eslint-scope@5.1.1:
- dependencies:
- esrecurse: 4.3.0
- estraverse: 4.3.0
-
- eslint-scope@7.2.2:
+ eslint-scope@8.4.0:
dependencies:
esrecurse: 4.3.0
estraverse: 5.3.0
- eslint-utils@2.1.0:
- dependencies:
- eslint-visitor-keys: 1.3.0
-
- eslint-utils@3.0.0(eslint@8.56.0):
- dependencies:
- eslint: 8.56.0
- eslint-visitor-keys: 2.1.0
-
- eslint-visitor-keys@1.3.0: {}
-
- eslint-visitor-keys@2.1.0: {}
+ eslint-visitor-keys@3.4.3: {}
- eslint-visitor-keys@3.3.0: {}
+ eslint-visitor-keys@4.2.1: {}
- eslint-visitor-keys@3.4.3: {}
+ eslint-visitor-keys@5.0.1: {}
- eslint@8.56.0:
+ eslint@9.39.5(jiti@2.7.0)(supports-color@7.2.0):
dependencies:
- '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0)
- '@eslint-community/regexpp': 4.10.0
- '@eslint/eslintrc': 2.1.4
- '@eslint/js': 8.56.0
- '@humanwhocodes/config-array': 0.11.14
+ '@eslint-community/eslint-utils': 4.10.1(eslint@9.39.5(jiti@2.7.0)(supports-color@7.2.0))
+ '@eslint-community/regexpp': 4.12.2
+ '@eslint/config-array': 0.21.2(supports-color@7.2.0)
+ '@eslint/config-helpers': 0.4.2
+ '@eslint/core': 0.17.0
+ '@eslint/eslintrc': 3.3.7(supports-color@7.2.0)
+ '@eslint/js': 9.39.5
+ '@eslint/plugin-kit': 0.4.1
+ '@humanfs/node': 0.16.8
'@humanwhocodes/module-importer': 1.0.1
- '@nodelib/fs.walk': 1.2.8
- '@ungap/structured-clone': 1.2.0
- ajv: 6.12.6
+ '@humanwhocodes/retry': 0.4.3
+ '@types/estree': 1.0.9
+ ajv: 6.15.0
chalk: 4.1.2
- cross-spawn: 7.0.3
- debug: 4.3.4(supports-color@8.1.1)
- doctrine: 3.0.0
+ cross-spawn: 7.0.6
+ debug: 4.4.3(supports-color@7.2.0)
escape-string-regexp: 4.0.0
- eslint-scope: 7.2.2
- eslint-visitor-keys: 3.4.3
- espree: 9.6.1
- esquery: 1.5.0
+ eslint-scope: 8.4.0
+ eslint-visitor-keys: 4.2.1
+ espree: 10.4.0
+ esquery: 1.7.0
esutils: 2.0.3
fast-deep-equal: 3.1.3
- file-entry-cache: 6.0.1
+ file-entry-cache: 8.0.0
find-up: 5.0.0
glob-parent: 6.0.2
- globals: 13.20.0
- graphemer: 1.4.0
- ignore: 5.2.4
+ ignore: 5.3.2
imurmurhash: 0.1.4
is-glob: 4.0.3
- is-path-inside: 3.0.3
- js-yaml: 4.1.0
json-stable-stringify-without-jsonify: 1.0.1
- levn: 0.4.1
lodash.merge: 4.6.2
- minimatch: 3.1.2
+ minimatch: 3.1.5
natural-compare: 1.4.0
- optionator: 0.9.3
- strip-ansi: 6.0.1
- text-table: 0.2.0
- transitivePeerDependencies:
- - supports-color
-
- espree@9.6.1:
- dependencies:
- acorn: 8.11.3
- acorn-jsx: 5.3.2(acorn@8.11.3)
- eslint-visitor-keys: 3.4.3
-
- esprima@4.0.1: {}
-
- esquery@1.5.0:
- dependencies:
- estraverse: 5.3.0
-
- esrecurse@4.3.0:
- dependencies:
- estraverse: 5.3.0
-
- estraverse@4.3.0: {}
-
- estraverse@5.3.0: {}
-
- esutils@2.0.3: {}
-
- eventemitter2@6.4.7: {}
-
- execa@4.1.0:
- dependencies:
- cross-spawn: 7.0.3
- get-stream: 5.2.0
- human-signals: 1.1.1
- is-stream: 2.0.1
- merge-stream: 2.0.0
- npm-run-path: 4.0.1
- onetime: 5.1.2
- signal-exit: 3.0.7
- strip-final-newline: 2.0.0
-
- execa@5.1.1:
- dependencies:
- cross-spawn: 7.0.3
- get-stream: 6.0.1
- human-signals: 2.1.0
- is-stream: 2.0.1
- merge-stream: 2.0.0
- npm-run-path: 4.0.1
- onetime: 5.1.2
- signal-exit: 3.0.7
- strip-final-newline: 2.0.0
-
- executable@4.1.1:
- dependencies:
- pify: 2.3.0
-
- exit@0.1.2: {}
-
- expect@29.4.2:
- dependencies:
- '@jest/expect-utils': 29.4.2
- jest-get-type: 29.4.2
- jest-matcher-utils: 29.4.2
- jest-message-util: 29.4.2
- jest-util: 29.4.2
-
- expect@29.7.0:
- dependencies:
- '@jest/expect-utils': 29.7.0
- jest-get-type: 29.6.3
- jest-matcher-utils: 29.7.0
- jest-message-util: 29.7.0
- jest-util: 29.7.0
-
- extend@3.0.2: {}
-
- extract-zip@2.0.1(supports-color@8.1.1):
- dependencies:
- debug: 4.3.4(supports-color@8.1.1)
- get-stream: 5.2.0
- yauzl: 2.10.0
+ optionator: 0.9.4
optionalDependencies:
- '@types/yauzl': 2.10.0
- transitivePeerDependencies:
- - supports-color
-
- extsprintf@1.3.0: {}
-
- fast-deep-equal@3.1.3: {}
-
- fast-diff@1.2.0: {}
-
- fast-glob@3.2.12:
- dependencies:
- '@nodelib/fs.stat': 2.0.5
- '@nodelib/fs.walk': 1.2.8
- glob-parent: 5.1.2
- merge2: 1.4.1
- micromatch: 4.0.5
-
- fast-glob@3.3.1:
- dependencies:
- '@nodelib/fs.stat': 2.0.5
- '@nodelib/fs.walk': 1.2.8
- glob-parent: 5.1.2
- merge2: 1.4.1
- micromatch: 4.0.5
-
- fast-glob@3.3.2:
- dependencies:
- '@nodelib/fs.stat': 2.0.5
- '@nodelib/fs.walk': 1.2.8
- glob-parent: 5.1.2
- merge2: 1.4.1
- micromatch: 4.0.5
-
- fast-json-stable-stringify@2.1.0: {}
-
- fast-levenshtein@2.0.6: {}
-
- fastq@1.15.0:
- dependencies:
- reusify: 1.0.4
-
- fb-watchman@2.0.2:
- dependencies:
- bser: 2.1.1
-
- fd-slicer@1.1.0:
- dependencies:
- pend: 1.2.0
-
- fdir@6.4.5(picomatch@4.0.2):
- optionalDependencies:
- picomatch: 4.0.2
-
- figures@3.2.0:
- dependencies:
- escape-string-regexp: 1.0.5
-
- file-entry-cache@6.0.1:
- dependencies:
- flat-cache: 3.0.4
-
- fill-range@7.0.1:
- dependencies:
- to-regex-range: 5.0.1
-
- find-up@3.0.0:
- dependencies:
- locate-path: 3.0.0
-
- find-up@4.1.0:
- dependencies:
- locate-path: 5.0.0
- path-exists: 4.0.0
-
- find-up@5.0.0:
- dependencies:
- locate-path: 6.0.0
- path-exists: 4.0.0
-
- find-up@6.3.0:
- dependencies:
- locate-path: 7.2.0
- path-exists: 5.0.0
-
- flat-cache@3.0.4:
- dependencies:
- flatted: 3.2.7
- rimraf: 3.0.2
-
- flatted@3.2.7: {}
-
- follow-redirects@1.15.5: {}
-
- for-each@0.3.3:
- dependencies:
- is-callable: 1.2.7
-
- for-each@0.3.5:
- dependencies:
- is-callable: 1.2.7
-
- forever-agent@0.6.1: {}
-
- form-data@2.3.3:
- dependencies:
- asynckit: 0.4.0
- combined-stream: 1.0.8
- mime-types: 2.1.35
-
- form-data@4.0.0:
- dependencies:
- asynckit: 0.4.0
- combined-stream: 1.0.8
- mime-types: 2.1.35
-
- fraction.js@4.3.7: {}
-
- fs-extra@9.1.0:
- dependencies:
- at-least-node: 1.0.0
- graceful-fs: 4.2.11
- jsonfile: 6.1.0
- universalify: 2.0.0
-
- fs.realpath@1.0.0: {}
-
- fsevents@2.3.2:
- optional: true
-
- function-bind@1.1.1: {}
-
- function-bind@1.1.2: {}
-
- function.prototype.name@1.1.5:
- dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- es-abstract: 1.21.1
- functions-have-names: 1.2.3
-
- function.prototype.name@1.1.6:
- dependencies:
- call-bind: 1.0.7
- define-properties: 1.2.0
- es-abstract: 1.22.4
- functions-have-names: 1.2.3
-
- function.prototype.name@1.1.8:
- dependencies:
- call-bind: 1.0.8
- call-bound: 1.0.4
- define-properties: 1.2.1
- functions-have-names: 1.2.3
- hasown: 2.0.2
- is-callable: 1.2.7
-
- functions-have-names@1.2.3: {}
-
- gensync@1.0.0-beta.2: {}
-
- get-caller-file@2.0.5: {}
-
- get-intrinsic@1.2.0:
- dependencies:
- function-bind: 1.1.1
- has: 1.0.3
- has-symbols: 1.0.3
-
- get-intrinsic@1.2.4:
- dependencies:
- es-errors: 1.3.0
- function-bind: 1.1.2
- has-proto: 1.0.1
- has-symbols: 1.0.3
- hasown: 2.0.1
-
- get-intrinsic@1.3.0:
- dependencies:
- call-bind-apply-helpers: 1.0.2
- es-define-property: 1.0.1
- es-errors: 1.3.0
- es-object-atoms: 1.1.1
- function-bind: 1.1.2
- get-proto: 1.0.1
- gopd: 1.2.0
- has-symbols: 1.1.0
- hasown: 2.0.2
- math-intrinsics: 1.1.0
-
- get-nonce@1.0.1: {}
-
- get-package-type@0.1.0: {}
-
- get-proto@1.0.1:
- dependencies:
- dunder-proto: 1.0.1
- es-object-atoms: 1.1.1
-
- get-stdin@8.0.0: {}
-
- get-stream@5.2.0:
- dependencies:
- pump: 3.0.0
-
- get-stream@6.0.1: {}
-
- get-symbol-description@1.0.0:
- dependencies:
- call-bind: 1.0.2
- get-intrinsic: 1.2.0
-
- get-symbol-description@1.0.2:
- dependencies:
- call-bind: 1.0.7
- es-errors: 1.3.0
- get-intrinsic: 1.2.4
-
- get-symbol-description@1.1.0:
- dependencies:
- call-bound: 1.0.4
- es-errors: 1.3.0
- get-intrinsic: 1.3.0
-
- get-tsconfig@4.5.0: {}
-
- getos@3.2.1:
- dependencies:
- async: 3.2.4
-
- getpass@0.1.7:
- dependencies:
- assert-plus: 1.0.0
-
- git-hooks-list@4.1.1: {}
-
- glob-parent@5.1.2:
- dependencies:
- is-glob: 4.0.3
-
- glob-parent@6.0.2:
- dependencies:
- is-glob: 4.0.3
-
- glob@7.1.6:
- dependencies:
- fs.realpath: 1.0.0
- inflight: 1.0.6
- inherits: 2.0.4
- minimatch: 3.1.2
- once: 1.4.0
- path-is-absolute: 1.0.1
-
- glob@7.2.3:
- dependencies:
- fs.realpath: 1.0.0
- inflight: 1.0.6
- inherits: 2.0.4
- minimatch: 3.1.2
- once: 1.4.0
- path-is-absolute: 1.0.1
-
- global-dirs@3.0.1:
- dependencies:
- ini: 2.0.0
-
- globals@11.12.0: {}
-
- globals@13.20.0:
- dependencies:
- type-fest: 0.20.2
-
- globals@13.24.0:
- dependencies:
- type-fest: 0.20.2
-
- globalthis@1.0.3:
- dependencies:
- define-properties: 1.2.1
-
- globalthis@1.0.4:
- dependencies:
- define-properties: 1.2.1
- gopd: 1.2.0
-
- globby@11.1.0:
- dependencies:
- array-union: 2.1.0
- dir-glob: 3.0.1
- fast-glob: 3.3.2
- ignore: 5.2.4
- merge2: 1.4.1
- slash: 3.0.0
-
- gopd@1.0.1:
- dependencies:
- get-intrinsic: 1.2.4
-
- gopd@1.2.0: {}
-
- graceful-fs@4.2.11: {}
-
- grapheme-splitter@1.0.4: {}
-
- graphemer@1.4.0: {}
-
- has-bigints@1.0.2: {}
-
- has-flag@3.0.0: {}
-
- has-flag@4.0.0: {}
-
- has-property-descriptors@1.0.0:
- dependencies:
- get-intrinsic: 1.2.4
-
- has-property-descriptors@1.0.2:
- dependencies:
- es-define-property: 1.0.0
-
- has-proto@1.0.1: {}
-
- has-proto@1.2.0:
- dependencies:
- dunder-proto: 1.0.1
-
- has-symbols@1.0.3: {}
-
- has-symbols@1.1.0: {}
-
- has-tostringtag@1.0.0:
- dependencies:
- has-symbols: 1.0.3
-
- has-tostringtag@1.0.2:
- dependencies:
- has-symbols: 1.0.3
-
- has@1.0.3:
- dependencies:
- function-bind: 1.1.1
-
- hasown@2.0.1:
- dependencies:
- function-bind: 1.1.2
-
- hasown@2.0.2:
- dependencies:
- function-bind: 1.1.2
-
- hosted-git-info@2.8.9: {}
-
- html-escaper@2.0.2: {}
-
- http-signature@1.3.6:
- dependencies:
- assert-plus: 1.0.0
- jsprim: 2.0.2
- sshpk: 1.17.0
-
- human-signals@1.1.1: {}
-
- human-signals@2.1.0: {}
-
- ieee754@1.2.1: {}
-
- ignore@5.2.4: {}
-
- ignore@5.3.2: {}
-
- import-fresh@3.3.0:
- dependencies:
- parent-module: 1.0.1
- resolve-from: 4.0.0
-
- import-local@3.1.0:
- dependencies:
- pkg-dir: 4.2.0
- resolve-cwd: 3.0.0
-
- imurmurhash@0.1.4: {}
-
- indent-string@4.0.0: {}
-
- inflight@1.0.6:
- dependencies:
- once: 1.4.0
- wrappy: 1.0.2
-
- inherits@2.0.4: {}
-
- ini@2.0.0: {}
-
- internal-slot@1.0.5:
- dependencies:
- get-intrinsic: 1.2.0
- has: 1.0.3
- side-channel: 1.0.4
-
- internal-slot@1.0.7:
- dependencies:
- es-errors: 1.3.0
- hasown: 2.0.1
- side-channel: 1.0.4
-
- internal-slot@1.1.0:
- dependencies:
- es-errors: 1.3.0
- hasown: 2.0.2
- side-channel: 1.1.0
-
- is-arguments@1.1.1:
- dependencies:
- call-bind: 1.0.2
- has-tostringtag: 1.0.0
-
- is-array-buffer@3.0.1:
- dependencies:
- call-bind: 1.0.2
- get-intrinsic: 1.2.0
- is-typed-array: 1.1.10
-
- is-array-buffer@3.0.4:
- dependencies:
- call-bind: 1.0.7
- get-intrinsic: 1.2.4
-
- is-array-buffer@3.0.5:
- dependencies:
- call-bind: 1.0.8
- call-bound: 1.0.4
- get-intrinsic: 1.3.0
-
- is-arrayish@0.2.1: {}
-
- is-arrayish@0.3.2:
- optional: true
-
- is-async-function@2.0.0:
- dependencies:
- has-tostringtag: 1.0.0
+ jiti: 2.7.0
+ transitivePeerDependencies:
+ - supports-color
- is-bigint@1.0.4:
+ espree@10.4.0:
dependencies:
- has-bigints: 1.0.2
+ acorn: 8.18.0
+ acorn-jsx: 5.3.2(acorn@8.18.0)
+ eslint-visitor-keys: 4.2.1
- is-bigint@1.1.0:
+ esquery@1.7.0:
dependencies:
- has-bigints: 1.0.2
+ estraverse: 5.3.0
- is-binary-path@2.1.0:
+ esrecurse@4.3.0:
dependencies:
- binary-extensions: 2.2.0
+ estraverse: 5.3.0
- is-boolean-object@1.1.2:
- dependencies:
- call-bind: 1.0.2
- has-tostringtag: 1.0.0
+ estraverse@5.3.0: {}
- is-boolean-object@1.2.2:
+ estree-walker@3.0.3:
dependencies:
- call-bound: 1.0.4
- has-tostringtag: 1.0.2
+ '@types/estree': 1.0.9
- is-builtin-module@3.2.1:
- dependencies:
- builtin-modules: 3.3.0
+ esutils@2.0.3: {}
- is-callable@1.2.7: {}
+ expect-type@1.4.0: {}
- is-ci@3.0.1:
- dependencies:
- ci-info: 3.7.1
+ fast-deep-equal@3.1.3: {}
- is-core-module@2.11.0:
- dependencies:
- has: 1.0.3
+ fast-diff@1.3.0: {}
- is-core-module@2.13.1:
+ fast-glob@3.3.1:
dependencies:
- hasown: 2.0.1
+ '@nodelib/fs.stat': 2.0.5
+ '@nodelib/fs.walk': 1.2.8
+ glob-parent: 5.1.2
+ merge2: 1.4.1
+ micromatch: 4.0.8
- is-data-view@1.0.2:
- dependencies:
- call-bound: 1.0.4
- get-intrinsic: 1.3.0
- is-typed-array: 1.1.15
+ fast-json-stable-stringify@2.1.0: {}
- is-date-object@1.0.5:
- dependencies:
- has-tostringtag: 1.0.0
+ fast-levenshtein@2.0.6: {}
- is-date-object@1.1.0:
+ fastq@1.20.3:
dependencies:
- call-bound: 1.0.4
- has-tostringtag: 1.0.2
-
- is-extglob@2.1.1: {}
+ reusify: 1.1.0
- is-finalizationregistry@1.0.2:
- dependencies:
- call-bind: 1.0.7
+ fdir@6.5.0(picomatch@4.0.7):
+ optionalDependencies:
+ picomatch: 4.0.7
- is-finalizationregistry@1.1.1:
+ file-entry-cache@8.0.0:
dependencies:
- call-bound: 1.0.4
-
- is-fullwidth-code-point@3.0.0: {}
+ flat-cache: 4.0.1
- is-generator-fn@2.1.0: {}
-
- is-generator-function@1.0.10:
+ fill-range@7.1.1:
dependencies:
- has-tostringtag: 1.0.0
+ to-regex-range: 5.0.1
- is-glob@4.0.3:
+ find-up@5.0.0:
dependencies:
- is-extglob: 2.1.1
+ locate-path: 6.0.0
+ path-exists: 4.0.0
- is-installed-globally@0.4.0:
+ flat-cache@4.0.1:
dependencies:
- global-dirs: 3.0.1
- is-path-inside: 3.0.3
-
- is-map@2.0.2: {}
+ flatted: 3.4.4
+ keyv: 4.5.4
- is-map@2.0.3: {}
+ flatted@3.4.4: {}
- is-negative-zero@2.0.2: {}
+ for-each@0.3.5:
+ dependencies:
+ is-callable: 1.2.7
- is-negative-zero@2.0.3: {}
+ fsevents@2.3.3:
+ optional: true
- is-number-object@1.0.7:
- dependencies:
- has-tostringtag: 1.0.0
+ function-bind@1.1.2: {}
- is-number-object@1.1.1:
+ function.prototype.name@1.2.0:
dependencies:
+ call-bind: 1.0.9
call-bound: 1.0.4
- has-tostringtag: 1.0.2
-
- is-number@7.0.0: {}
+ es-define-property: 1.0.1
+ es-errors: 1.3.0
+ functions-have-names: 1.2.3
+ has-property-descriptors: 1.0.2
+ hasown: 2.0.4
+ is-callable: 1.2.7
+ is-document.all: 1.0.0
- is-path-inside@3.0.3: {}
+ functions-have-names@1.2.3: {}
- is-plain-obj@4.1.0: {}
+ generator-function@2.0.1: {}
- is-regex@1.1.4:
- dependencies:
- call-bind: 1.0.2
- has-tostringtag: 1.0.0
+ gensync@1.0.0-beta.2: {}
- is-regex@1.2.1:
+ get-intrinsic@1.3.0:
dependencies:
- call-bound: 1.0.4
+ call-bind-apply-helpers: 1.0.2
+ es-define-property: 1.0.1
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.2
+ function-bind: 1.1.2
+ get-proto: 1.0.1
gopd: 1.2.0
- has-tostringtag: 1.0.2
- hasown: 2.0.2
-
- is-set@2.0.2: {}
-
- is-set@2.0.3: {}
+ has-symbols: 1.1.0
+ hasown: 2.0.4
+ math-intrinsics: 1.1.0
- is-shared-array-buffer@1.0.2:
+ get-proto@1.0.1:
dependencies:
- call-bind: 1.0.2
+ dunder-proto: 1.0.1
+ es-object-atoms: 1.1.2
- is-shared-array-buffer@1.0.4:
+ get-symbol-description@1.1.0:
dependencies:
call-bound: 1.0.4
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
- is-stream@2.0.1: {}
-
- is-string@1.0.7:
- dependencies:
- has-tostringtag: 1.0.0
-
- is-string@1.1.1:
+ get-tsconfig@4.14.3:
dependencies:
- call-bound: 1.0.4
- has-tostringtag: 1.0.2
+ resolve-pkg-maps: 1.0.0
- is-symbol@1.0.4:
+ glob-parent@5.1.2:
dependencies:
- has-symbols: 1.0.3
+ is-glob: 4.0.3
- is-symbol@1.1.1:
+ glob-parent@6.0.2:
dependencies:
- call-bound: 1.0.4
- has-symbols: 1.1.0
- safe-regex-test: 1.1.0
+ is-glob: 4.0.3
- is-typed-array@1.1.10:
- dependencies:
- available-typed-arrays: 1.0.5
- call-bind: 1.0.2
- for-each: 0.3.3
- gopd: 1.0.1
- has-tostringtag: 1.0.0
+ globals@14.0.0: {}
- is-typed-array@1.1.13:
- dependencies:
- which-typed-array: 1.1.14
+ globals@17.12.0: {}
- is-typed-array@1.1.15:
+ globalthis@1.0.4:
dependencies:
- which-typed-array: 1.1.19
+ define-properties: 1.2.1
+ gopd: 1.2.0
- is-typedarray@1.0.0: {}
+ gopd@1.2.0: {}
- is-unicode-supported@0.1.0: {}
+ graceful-fs@4.2.11: {}
- is-weakmap@2.0.1: {}
+ has-bigints@1.1.0: {}
- is-weakmap@2.0.2: {}
+ has-flag@4.0.0: {}
- is-weakref@1.0.2:
+ has-property-descriptors@1.0.2:
dependencies:
- call-bind: 1.0.7
+ es-define-property: 1.0.1
- is-weakref@1.1.1:
+ has-proto@1.2.0:
dependencies:
- call-bound: 1.0.4
+ dunder-proto: 1.0.1
- is-weakset@2.0.2:
- dependencies:
- call-bind: 1.0.2
- get-intrinsic: 1.2.0
+ has-symbols@1.1.0: {}
- is-weakset@2.0.4:
+ has-tostringtag@1.0.2:
dependencies:
- call-bound: 1.0.4
- get-intrinsic: 1.3.0
-
- isarray@2.0.5: {}
-
- isexe@2.0.0: {}
+ has-symbols: 1.1.0
- isstream@0.1.2: {}
+ hasown@2.0.4:
+ dependencies:
+ function-bind: 1.1.2
- istanbul-lib-coverage@3.2.0: {}
+ hermes-estree@0.25.1: {}
- istanbul-lib-instrument@5.2.1:
+ hermes-parser@0.25.1:
dependencies:
- '@babel/core': 7.20.12
- '@babel/parser': 7.20.15
- '@istanbuljs/schema': 0.1.3
- istanbul-lib-coverage: 3.2.0
- semver: 6.3.1
- transitivePeerDependencies:
- - supports-color
+ hermes-estree: 0.25.1
- istanbul-lib-instrument@6.0.1:
+ html-encoding-sniffer@6.0.0:
dependencies:
- '@babel/core': 7.20.12
- '@babel/parser': 7.20.15
- '@istanbuljs/schema': 0.1.3
- istanbul-lib-coverage: 3.2.0
- semver: 7.7.2
+ '@exodus/bytes': 1.15.1
transitivePeerDependencies:
- - supports-color
+ - '@noble/hashes'
- istanbul-lib-report@3.0.0:
- dependencies:
- istanbul-lib-coverage: 3.2.0
- make-dir: 3.1.0
- supports-color: 7.2.0
+ ignore@5.3.2: {}
- istanbul-lib-source-maps@4.0.1:
- dependencies:
- debug: 4.3.4(supports-color@8.1.1)
- istanbul-lib-coverage: 3.2.0
- source-map: 0.6.1
- transitivePeerDependencies:
- - supports-color
+ ignore@7.0.9: {}
- istanbul-reports@3.1.5:
+ import-fresh@3.3.1:
dependencies:
- html-escaper: 2.0.2
- istanbul-lib-report: 3.0.0
+ parent-module: 1.0.1
+ resolve-from: 4.0.0
+
+ imurmurhash@0.1.4: {}
+
+ indent-string@4.0.0: {}
- iterator.prototype@1.1.2:
+ internal-slot@1.1.0:
dependencies:
- define-properties: 1.2.1
- get-intrinsic: 1.2.4
- has-symbols: 1.0.3
- reflect.getprototypeof: 1.0.5
- set-function-name: 2.0.1
+ es-errors: 1.3.0
+ hasown: 2.0.4
+ side-channel: 1.1.1
- iterator.prototype@1.1.5:
+ is-array-buffer@3.0.5:
dependencies:
- define-data-property: 1.1.4
- es-object-atoms: 1.1.1
+ call-bind: 1.0.9
+ call-bound: 1.0.4
get-intrinsic: 1.3.0
- get-proto: 1.0.1
- has-symbols: 1.1.0
- set-function-name: 2.0.2
- jest-changed-files@29.7.0:
+ is-async-function@2.1.1:
dependencies:
- execa: 5.1.1
- jest-util: 29.7.0
- p-limit: 3.1.0
+ async-function: 1.0.0
+ call-bound: 1.0.4
+ get-proto: 1.0.1
+ has-tostringtag: 1.0.2
+ safe-regex-test: 1.1.0
- jest-circus@29.7.0:
+ is-bigint@1.1.0:
dependencies:
- '@jest/environment': 29.7.0
- '@jest/expect': 29.7.0
- '@jest/test-result': 29.7.0
- '@jest/types': 29.6.3
- '@types/node': 22.15.29
- chalk: 4.1.2
- co: 4.6.0
- dedent: 1.5.1
- is-generator-fn: 2.1.0
- jest-each: 29.7.0
- jest-matcher-utils: 29.7.0
- jest-message-util: 29.7.0
- jest-runtime: 29.7.0
- jest-snapshot: 29.7.0
- jest-util: 29.7.0
- p-limit: 3.1.0
- pretty-format: 29.7.0
- pure-rand: 6.0.4
- slash: 3.0.0
- stack-utils: 2.0.6
- transitivePeerDependencies:
- - babel-plugin-macros
- - supports-color
+ has-bigints: 1.1.0
- jest-cli@29.7.0(@types/node@22.15.29):
+ is-boolean-object@1.2.2:
dependencies:
- '@jest/core': 29.7.0
- '@jest/test-result': 29.7.0
- '@jest/types': 29.6.3
- chalk: 4.1.2
- create-jest: 29.7.0(@types/node@22.15.29)
- exit: 0.1.2
- import-local: 3.1.0
- jest-config: 29.7.0(@types/node@22.15.29)
- jest-util: 29.7.0
- jest-validate: 29.7.0
- yargs: 17.6.2
- transitivePeerDependencies:
- - '@types/node'
- - babel-plugin-macros
- - supports-color
- - ts-node
+ call-bound: 1.0.4
+ has-tostringtag: 1.0.2
- jest-config@29.7.0(@types/node@22.15.29):
+ is-bun-module@2.0.0:
dependencies:
- '@babel/core': 7.20.12
- '@jest/test-sequencer': 29.7.0
- '@jest/types': 29.6.3
- babel-jest: 29.7.0(@babel/core@7.20.12)
- chalk: 4.1.2
- ci-info: 3.7.1
- deepmerge: 4.3.0
- glob: 7.2.3
- graceful-fs: 4.2.11
- jest-circus: 29.7.0
- jest-environment-node: 29.7.0
- jest-get-type: 29.6.3
- jest-regex-util: 29.6.3
- jest-resolve: 29.7.0
- jest-runner: 29.7.0
- jest-util: 29.7.0
- jest-validate: 29.7.0
- micromatch: 4.0.5
- parse-json: 5.2.0
- pretty-format: 29.7.0
- slash: 3.0.0
- strip-json-comments: 3.1.1
- optionalDependencies:
- '@types/node': 22.15.29
- transitivePeerDependencies:
- - babel-plugin-macros
- - supports-color
+ semver: 7.8.5
- jest-diff@29.4.2:
- dependencies:
- chalk: 4.1.2
- diff-sequences: 29.4.2
- jest-get-type: 29.4.2
- pretty-format: 29.4.2
+ is-callable@1.2.7: {}
- jest-diff@29.7.0:
+ is-core-module@2.16.2:
dependencies:
- chalk: 4.1.2
- diff-sequences: 29.6.3
- jest-get-type: 29.6.3
- pretty-format: 29.7.0
+ hasown: 2.0.4
- jest-docblock@29.7.0:
+ is-data-view@1.0.2:
dependencies:
- detect-newline: 3.1.0
+ call-bound: 1.0.4
+ get-intrinsic: 1.3.0
+ is-typed-array: 1.1.15
- jest-each@29.7.0:
+ is-date-object@1.1.0:
dependencies:
- '@jest/types': 29.6.3
- chalk: 4.1.2
- jest-get-type: 29.6.3
- jest-util: 29.7.0
- pretty-format: 29.7.0
+ call-bound: 1.0.4
+ has-tostringtag: 1.0.2
- jest-environment-node@29.7.0:
+ is-document.all@1.0.0:
dependencies:
- '@jest/environment': 29.7.0
- '@jest/fake-timers': 29.7.0
- '@jest/types': 29.6.3
- '@types/node': 22.15.29
- jest-mock: 29.7.0
- jest-util: 29.7.0
-
- jest-get-type@29.4.2: {}
-
- jest-get-type@29.6.3: {}
+ call-bound: 1.0.4
- jest-haste-map@29.7.0:
- dependencies:
- '@jest/types': 29.6.3
- '@types/graceful-fs': 4.1.6
- '@types/node': 22.15.29
- anymatch: 3.1.3
- fb-watchman: 2.0.2
- graceful-fs: 4.2.11
- jest-regex-util: 29.6.3
- jest-util: 29.7.0
- jest-worker: 29.7.0
- micromatch: 4.0.5
- walker: 1.0.8
- optionalDependencies:
- fsevents: 2.3.2
+ is-extglob@2.1.1: {}
- jest-leak-detector@29.7.0:
+ is-finalizationregistry@1.1.1:
dependencies:
- jest-get-type: 29.6.3
- pretty-format: 29.7.0
+ call-bound: 1.0.4
- jest-matcher-utils@29.4.2:
+ is-generator-function@1.1.2:
dependencies:
- chalk: 4.1.2
- jest-diff: 29.4.2
- jest-get-type: 29.4.2
- pretty-format: 29.4.2
+ call-bound: 1.0.4
+ generator-function: 2.0.1
+ get-proto: 1.0.1
+ has-tostringtag: 1.0.2
+ safe-regex-test: 1.1.0
- jest-matcher-utils@29.7.0:
+ is-glob@4.0.3:
dependencies:
- chalk: 4.1.2
- jest-diff: 29.7.0
- jest-get-type: 29.6.3
- pretty-format: 29.7.0
+ is-extglob: 2.1.1
- jest-message-util@29.4.2:
- dependencies:
- '@babel/code-frame': 7.18.6
- '@jest/types': 29.4.2
- '@types/stack-utils': 2.0.1
- chalk: 4.1.2
- graceful-fs: 4.2.11
- micromatch: 4.0.5
- pretty-format: 29.4.2
- slash: 3.0.0
- stack-utils: 2.0.6
+ is-map@2.0.3: {}
- jest-message-util@29.7.0:
- dependencies:
- '@babel/code-frame': 7.18.6
- '@jest/types': 29.6.3
- '@types/stack-utils': 2.0.1
- chalk: 4.1.2
- graceful-fs: 4.2.11
- micromatch: 4.0.5
- pretty-format: 29.7.0
- slash: 3.0.0
- stack-utils: 2.0.6
+ is-negative-zero@2.0.3: {}
- jest-mock@29.7.0:
+ is-number-object@1.1.1:
dependencies:
- '@jest/types': 29.6.3
- '@types/node': 22.15.29
- jest-util: 29.7.0
+ call-bound: 1.0.4
+ has-tostringtag: 1.0.2
- jest-pnp-resolver@1.2.3(jest-resolve@29.7.0):
- optionalDependencies:
- jest-resolve: 29.7.0
+ is-number@7.0.0: {}
- jest-regex-util@29.6.3: {}
+ is-potential-custom-element-name@1.0.1: {}
- jest-resolve-dependencies@29.7.0:
+ is-regex@1.2.1:
dependencies:
- jest-regex-util: 29.6.3
- jest-snapshot: 29.7.0
- transitivePeerDependencies:
- - supports-color
+ call-bound: 1.0.4
+ gopd: 1.2.0
+ has-tostringtag: 1.0.2
+ hasown: 2.0.4
- jest-resolve@29.7.0:
- dependencies:
- chalk: 4.1.2
- graceful-fs: 4.2.11
- jest-haste-map: 29.7.0
- jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0)
- jest-util: 29.7.0
- jest-validate: 29.7.0
- resolve: 1.22.2
- resolve.exports: 2.0.0
- slash: 3.0.0
-
- jest-runner@29.7.0:
- dependencies:
- '@jest/console': 29.7.0
- '@jest/environment': 29.7.0
- '@jest/test-result': 29.7.0
- '@jest/transform': 29.7.0
- '@jest/types': 29.6.3
- '@types/node': 22.15.29
- chalk: 4.1.2
- emittery: 0.13.1
- graceful-fs: 4.2.11
- jest-docblock: 29.7.0
- jest-environment-node: 29.7.0
- jest-haste-map: 29.7.0
- jest-leak-detector: 29.7.0
- jest-message-util: 29.7.0
- jest-resolve: 29.7.0
- jest-runtime: 29.7.0
- jest-util: 29.7.0
- jest-watcher: 29.7.0
- jest-worker: 29.7.0
- p-limit: 3.1.0
- source-map-support: 0.5.13
- transitivePeerDependencies:
- - supports-color
+ is-set@2.0.3: {}
- jest-runtime@29.7.0:
+ is-shared-array-buffer@1.0.4:
dependencies:
- '@jest/environment': 29.7.0
- '@jest/fake-timers': 29.7.0
- '@jest/globals': 29.7.0
- '@jest/source-map': 29.6.3
- '@jest/test-result': 29.7.0
- '@jest/transform': 29.7.0
- '@jest/types': 29.6.3
- '@types/node': 22.15.29
- chalk: 4.1.2
- cjs-module-lexer: 1.2.2
- collect-v8-coverage: 1.0.1
- glob: 7.2.3
- graceful-fs: 4.2.11
- jest-haste-map: 29.7.0
- jest-message-util: 29.7.0
- jest-mock: 29.7.0
- jest-regex-util: 29.6.3
- jest-resolve: 29.7.0
- jest-snapshot: 29.7.0
- jest-util: 29.7.0
- slash: 3.0.0
- strip-bom: 4.0.0
- transitivePeerDependencies:
- - supports-color
-
- jest-snapshot@29.7.0:
- dependencies:
- '@babel/core': 7.20.12
- '@babel/generator': 7.20.14
- '@babel/plugin-syntax-jsx': 7.18.6(@babel/core@7.20.12)
- '@babel/plugin-syntax-typescript': 7.20.0(@babel/core@7.20.12)
- '@babel/types': 7.20.7
- '@jest/expect-utils': 29.7.0
- '@jest/transform': 29.7.0
- '@jest/types': 29.6.3
- babel-preset-current-node-syntax: 1.0.1(@babel/core@7.20.12)
- chalk: 4.1.2
- expect: 29.7.0
- graceful-fs: 4.2.11
- jest-diff: 29.7.0
- jest-get-type: 29.6.3
- jest-matcher-utils: 29.7.0
- jest-message-util: 29.7.0
- jest-util: 29.7.0
- natural-compare: 1.4.0
- pretty-format: 29.7.0
- semver: 7.7.2
- transitivePeerDependencies:
- - supports-color
+ call-bound: 1.0.4
- jest-util@29.4.2:
+ is-string@1.1.1:
dependencies:
- '@jest/types': 29.4.2
- '@types/node': 22.15.29
- chalk: 4.1.2
- ci-info: 3.7.1
- graceful-fs: 4.2.11
- picomatch: 2.3.1
+ call-bound: 1.0.4
+ has-tostringtag: 1.0.2
- jest-util@29.7.0:
+ is-symbol@1.1.1:
dependencies:
- '@jest/types': 29.6.3
- '@types/node': 22.15.29
- chalk: 4.1.2
- ci-info: 3.7.1
- graceful-fs: 4.2.11
- picomatch: 2.3.1
+ call-bound: 1.0.4
+ has-symbols: 1.1.0
+ safe-regex-test: 1.1.0
- jest-validate@29.7.0:
+ is-typed-array@1.1.15:
dependencies:
- '@jest/types': 29.6.3
- camelcase: 6.3.0
- chalk: 4.1.2
- jest-get-type: 29.6.3
- leven: 3.1.0
- pretty-format: 29.7.0
+ which-typed-array: 1.1.22
- jest-watcher@29.7.0:
- dependencies:
- '@jest/test-result': 29.7.0
- '@jest/types': 29.6.3
- '@types/node': 22.15.29
- ansi-escapes: 4.3.2
- chalk: 4.1.2
- emittery: 0.13.1
- jest-util: 29.7.0
- string-length: 4.0.2
+ is-weakmap@2.0.2: {}
- jest-worker@29.7.0:
+ is-weakref@1.1.1:
dependencies:
- '@types/node': 22.15.29
- jest-util: 29.7.0
- merge-stream: 2.0.0
- supports-color: 8.1.1
+ call-bound: 1.0.4
- jest@29.7.0(@types/node@22.15.29):
+ is-weakset@2.0.4:
dependencies:
- '@jest/core': 29.7.0
- '@jest/types': 29.6.3
- import-local: 3.1.0
- jest-cli: 29.7.0(@types/node@22.15.29)
- transitivePeerDependencies:
- - '@types/node'
- - babel-plugin-macros
- - supports-color
- - ts-node
+ call-bound: 1.0.4
+ get-intrinsic: 1.3.0
- jiti@1.21.0: {}
+ isarray@2.0.5: {}
- jju@1.4.0: {}
+ isexe@2.0.0: {}
- joi@17.12.1:
+ iterator.prototype@1.1.5:
dependencies:
- '@hapi/hoek': 9.3.0
- '@hapi/topo': 5.1.0
- '@sideway/address': 4.1.5
- '@sideway/formula': 3.0.1
- '@sideway/pinpoint': 2.0.0
+ define-data-property: 1.1.4
+ es-object-atoms: 1.1.2
+ get-intrinsic: 1.3.0
+ get-proto: 1.0.1
+ has-symbols: 1.1.0
+ set-function-name: 2.0.2
- js-tokens@4.0.0: {}
+ jiti@2.7.0: {}
- js-yaml@3.14.1:
- dependencies:
- argparse: 1.0.10
- esprima: 4.0.1
+ js-tokens@10.0.0: {}
+
+ js-tokens@4.0.0: {}
- js-yaml@4.1.0:
+ js-yaml@4.3.2:
dependencies:
argparse: 2.0.1
- jsbn@0.1.1: {}
-
- jsesc@0.5.0: {}
-
- jsesc@2.5.2: {}
-
- jsesc@3.0.2: {}
+ jsdom@30.0.1:
+ dependencies:
+ '@asamuzakjp/css-color': 6.0.7
+ '@asamuzakjp/dom-selector': 8.3.2
+ '@bramus/specificity': 2.4.2
+ '@csstools/css-syntax-patches-for-csstree': 1.1.13(css-tree@3.2.1)
+ '@exodus/bytes': 1.15.1
+ css-tree: 3.2.1
+ data-urls: 7.0.0
+ decimal.js: 10.6.0
+ html-encoding-sniffer: 6.0.0
+ is-potential-custom-element-name: 1.0.1
+ lru-cache: 11.5.2
+ parse5: 8.0.1
+ saxes: 6.0.0
+ symbol-tree: 3.2.4
+ tough-cookie: 6.0.2
+ undici: 8.10.2
+ w3c-xmlserializer: 5.0.0
+ webidl-conversions: 8.0.1
+ whatwg-mimetype: 5.0.0
+ whatwg-url: 17.1.1
+ xml-name-validator: 5.0.0
+ transitivePeerDependencies:
+ - '@noble/hashes'
- json-parse-better-errors@1.0.2: {}
+ jsesc@3.1.0: {}
- json-parse-even-better-errors@2.3.1: {}
+ json-buffer@3.0.1: {}
json-schema-traverse@0.4.1: {}
- json-schema-traverse@1.0.0: {}
-
- json-schema@0.4.0: {}
-
json-stable-stringify-without-jsonify@1.0.1: {}
- json-stringify-safe@5.0.1: {}
-
json5@1.0.2:
dependencies:
minimist: 1.2.8
json5@2.2.3: {}
- jsonfile@6.1.0:
- dependencies:
- universalify: 2.0.0
- optionalDependencies:
- graceful-fs: 4.2.11
-
- jsprim@2.0.2:
- dependencies:
- assert-plus: 1.0.0
- extsprintf: 1.3.0
- json-schema: 0.4.0
- verror: 1.10.0
-
- jsx-ast-utils@3.3.3:
- dependencies:
- array-includes: 3.1.6
- object.assign: 4.1.4
-
jsx-ast-utils@3.3.5:
dependencies:
- array-includes: 3.1.9
- array.prototype.flat: 1.3.2
+ array-includes: 3.2.0
+ array.prototype.flat: 1.3.3
object.assign: 4.1.7
object.values: 1.2.1
- kleur@3.0.3: {}
+ keyv@4.5.4:
+ dependencies:
+ json-buffer: 3.0.1
- language-subtag-registry@0.3.22: {}
+ language-subtag-registry@0.3.23: {}
language-tags@1.0.9:
dependencies:
- language-subtag-registry: 0.3.22
-
- lazy-ass@1.6.0: {}
-
- leven@3.1.0: {}
+ language-subtag-registry: 0.3.23
levn@0.4.1:
dependencies:
prelude-ls: 1.2.1
type-check: 0.4.0
- lilconfig@2.1.0: {}
+ lightningcss-android-arm64@1.32.0:
+ optional: true
- lines-and-columns@1.2.4: {}
+ lightningcss-android-arm64@1.33.0:
+ optional: true
- listr2@3.14.0(enquirer@2.3.6):
- dependencies:
- cli-truncate: 2.1.0
- colorette: 2.0.19
- log-update: 4.0.0
- p-map: 4.0.0
- rfdc: 1.3.0
- rxjs: 7.8.0
- through: 2.3.8
- wrap-ansi: 7.0.0
- optionalDependencies:
- enquirer: 2.3.6
+ lightningcss-darwin-arm64@1.32.0:
+ optional: true
- load-json-file@5.3.0:
- dependencies:
- graceful-fs: 4.2.11
- parse-json: 4.0.0
- pify: 4.0.1
- strip-bom: 3.0.0
- type-fest: 0.3.1
+ lightningcss-darwin-arm64@1.33.0:
+ optional: true
- load-json-file@7.0.1: {}
+ lightningcss-darwin-x64@1.32.0:
+ optional: true
- locate-path@3.0.0:
- dependencies:
- p-locate: 3.0.0
- path-exists: 3.0.0
+ lightningcss-darwin-x64@1.33.0:
+ optional: true
- locate-path@5.0.0:
- dependencies:
- p-locate: 4.1.0
+ lightningcss-freebsd-x64@1.32.0:
+ optional: true
- locate-path@6.0.0:
- dependencies:
- p-locate: 5.0.0
+ lightningcss-freebsd-x64@1.33.0:
+ optional: true
- locate-path@7.2.0:
- dependencies:
- p-locate: 6.0.0
+ lightningcss-linux-arm-gnueabihf@1.32.0:
+ optional: true
+
+ lightningcss-linux-arm-gnueabihf@1.33.0:
+ optional: true
- lodash.memoize@4.1.2: {}
+ lightningcss-linux-arm64-gnu@1.32.0:
+ optional: true
- lodash.merge@4.6.2: {}
+ lightningcss-linux-arm64-gnu@1.33.0:
+ optional: true
+
+ lightningcss-linux-arm64-musl@1.32.0:
+ optional: true
+
+ lightningcss-linux-arm64-musl@1.33.0:
+ optional: true
- lodash.once@4.1.1: {}
+ lightningcss-linux-x64-gnu@1.32.0:
+ optional: true
+
+ lightningcss-linux-x64-gnu@1.33.0:
+ optional: true
+
+ lightningcss-linux-x64-musl@1.32.0:
+ optional: true
+
+ lightningcss-linux-x64-musl@1.33.0:
+ optional: true
+
+ lightningcss-win32-arm64-msvc@1.32.0:
+ optional: true
+
+ lightningcss-win32-arm64-msvc@1.33.0:
+ optional: true
+
+ lightningcss-win32-x64-msvc@1.32.0:
+ optional: true
- lodash@4.17.21: {}
+ lightningcss-win32-x64-msvc@1.33.0:
+ optional: true
- log-symbols@4.1.0:
+ lightningcss@1.32.0:
dependencies:
- chalk: 4.1.2
- is-unicode-supported: 0.1.0
+ detect-libc: 2.1.2
+ optionalDependencies:
+ lightningcss-android-arm64: 1.32.0
+ lightningcss-darwin-arm64: 1.32.0
+ lightningcss-darwin-x64: 1.32.0
+ lightningcss-freebsd-x64: 1.32.0
+ lightningcss-linux-arm-gnueabihf: 1.32.0
+ lightningcss-linux-arm64-gnu: 1.32.0
+ lightningcss-linux-arm64-musl: 1.32.0
+ lightningcss-linux-x64-gnu: 1.32.0
+ lightningcss-linux-x64-musl: 1.32.0
+ lightningcss-win32-arm64-msvc: 1.32.0
+ lightningcss-win32-x64-msvc: 1.32.0
+
+ lightningcss@1.33.0:
+ dependencies:
+ detect-libc: 2.1.2
+ optionalDependencies:
+ lightningcss-android-arm64: 1.33.0
+ lightningcss-darwin-arm64: 1.33.0
+ lightningcss-darwin-x64: 1.33.0
+ lightningcss-freebsd-x64: 1.33.0
+ lightningcss-linux-arm-gnueabihf: 1.33.0
+ lightningcss-linux-arm64-gnu: 1.33.0
+ lightningcss-linux-arm64-musl: 1.33.0
+ lightningcss-linux-x64-gnu: 1.33.0
+ lightningcss-linux-x64-musl: 1.33.0
+ lightningcss-win32-arm64-msvc: 1.33.0
+ lightningcss-win32-x64-msvc: 1.33.0
- log-update@4.0.0:
+ locate-path@6.0.0:
dependencies:
- ansi-escapes: 4.3.2
- cli-cursor: 3.1.0
- slice-ansi: 4.0.0
- wrap-ansi: 6.2.0
+ p-locate: 5.0.0
+
+ lodash.merge@4.6.2: {}
loose-envify@1.4.0:
dependencies:
js-tokens: 4.0.0
+ lru-cache@11.5.2: {}
+
lru-cache@5.1.1:
dependencies:
yallist: 3.1.1
- lru-cache@6.0.0:
- dependencies:
- yallist: 4.0.0
-
- lucide-react@0.511.0(react@19.0.0-rc-d1afcb43-20240903):
+ lucide-react@1.43.0(react@19.3.0):
dependencies:
- react: 19.0.0-rc-d1afcb43-20240903
+ react: 19.3.0
lz-string@1.5.0: {}
- make-dir@3.1.0:
+ magic-string@0.30.21:
dependencies:
- semver: 6.3.1
+ '@jridgewell/sourcemap-codec': 1.6.0
- make-error@1.3.6: {}
+ magic-string@1.3.1:
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.6.0
- makeerror@1.0.12:
+ magicast@0.5.5:
dependencies:
- tmpl: 1.0.5
+ '@babel/parser': 7.29.8
+ '@babel/types': 7.29.8
+ source-map-js: 1.2.1
math-intrinsics@1.1.0: {}
- merge-stream@2.0.0: {}
+ mdn-data@2.27.1: {}
merge2@1.4.1: {}
- micromatch@4.0.5:
- dependencies:
- braces: 3.0.2
- picomatch: 2.3.1
-
- mime-db@1.52.0: {}
-
- mime-types@2.1.35:
+ micromatch@4.0.8:
dependencies:
- mime-db: 1.52.0
-
- mimic-fn@2.1.0: {}
+ braces: 3.0.3
+ picomatch: 2.3.2
min-indent@1.0.1: {}
- minimatch@3.1.2:
+ minimatch@10.2.6:
dependencies:
- brace-expansion: 1.1.11
+ brace-expansion: 5.0.9
- minimatch@9.0.5:
+ minimatch@3.1.5:
dependencies:
- brace-expansion: 2.0.1
+ brace-expansion: 1.1.18
minimist@1.2.8: {}
- ms@2.1.2: {}
-
ms@2.1.3: {}
- mz@2.7.0:
- dependencies:
- any-promise: 1.3.0
- object-assign: 4.1.1
- thenify-all: 1.6.0
-
- nanoid@3.3.11: {}
-
- nanoid@3.3.7: {}
+ nanoid@3.3.19: {}
- natural-compare-lite@1.4.0: {}
+ napi-postinstall@0.3.4: {}
natural-compare@1.4.0: {}
- next-themes@0.4.6(react-dom@19.0.0-rc-d1afcb43-20240903(react@19.0.0-rc-d1afcb43-20240903))(react@19.0.0-rc-d1afcb43-20240903):
+ next-themes@0.4.6(react-dom@19.3.0(react@19.3.0))(react@19.3.0):
dependencies:
- react: 19.0.0-rc-d1afcb43-20240903
- react-dom: 19.0.0-rc-d1afcb43-20240903(react@19.0.0-rc-d1afcb43-20240903)
+ react: 19.3.0
+ react-dom: 19.3.0(react@19.3.0)
- next@15.4.0-canary.62(@babel/core@7.20.12)(react-dom@19.0.0-rc-d1afcb43-20240903(react@19.0.0-rc-d1afcb43-20240903))(react@19.0.0-rc-d1afcb43-20240903):
+ next@16.3.4(@babel/core@7.29.7(supports-color@7.2.0))(@playwright/test@1.63.0)(@types/node@24.13.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0):
dependencies:
- '@next/env': 15.4.0-canary.62
- '@swc/helpers': 0.5.15
- caniuse-lite: 1.0.30001720
- postcss: 8.4.31
- react: 19.0.0-rc-d1afcb43-20240903
- react-dom: 19.0.0-rc-d1afcb43-20240903(react@19.0.0-rc-d1afcb43-20240903)
- styled-jsx: 5.1.6(@babel/core@7.20.12)(react@19.0.0-rc-d1afcb43-20240903)
+ '@next/env': 16.3.4
+ '@swc/helpers': 0.5.23
+ baseline-browser-mapping: 2.11.22
+ caniuse-lite: 1.0.30001810
+ postcss: 8.5.23
+ react: 19.3.0
+ react-dom: 19.3.0(react@19.3.0)
+ styled-jsx: 5.1.6(@babel/core@7.29.7(supports-color@7.2.0))(react@19.3.0)
optionalDependencies:
- '@next/swc-darwin-arm64': 15.4.0-canary.62
- '@next/swc-darwin-x64': 15.4.0-canary.62
- '@next/swc-linux-arm64-gnu': 15.4.0-canary.62
- '@next/swc-linux-arm64-musl': 15.4.0-canary.62
- '@next/swc-linux-x64-gnu': 15.4.0-canary.62
- '@next/swc-linux-x64-musl': 15.4.0-canary.62
- '@next/swc-win32-arm64-msvc': 15.4.0-canary.62
- '@next/swc-win32-x64-msvc': 15.4.0-canary.62
- sharp: 0.34.2
+ '@next/swc-darwin-arm64': 16.3.4
+ '@next/swc-darwin-x64': 16.3.4
+ '@next/swc-linux-arm64-gnu': 16.3.4
+ '@next/swc-linux-arm64-musl': 16.3.4
+ '@next/swc-linux-x64-gnu': 16.3.4
+ '@next/swc-linux-x64-musl': 16.3.4
+ '@next/swc-win32-arm64-msvc': 16.3.4
+ '@next/swc-win32-x64-msvc': 16.3.4
+ '@playwright/test': 1.63.0
+ sharp: 0.35.4(@types/node@24.13.4)
transitivePeerDependencies:
- '@babel/core'
+ - '@types/node'
- babel-plugin-macros
- node-int64@0.4.0: {}
-
- node-releases@2.0.10: {}
-
- node-releases@2.0.14: {}
-
- node-releases@2.0.19: {}
-
- normalize-package-data@2.5.0:
+ node-exports-info@1.6.2:
dependencies:
- hosted-git-info: 2.8.9
- resolve: 1.22.8
- semver: 5.7.2
- validate-npm-package-license: 3.0.4
-
- normalize-path@3.0.0: {}
-
- normalize-range@0.1.2: {}
+ array.prototype.flatmap: 1.3.3
+ es-errors: 1.3.0
+ object.entries: 1.1.9
+ semver: 6.3.1
- npm-run-path@4.0.1:
- dependencies:
- path-key: 3.1.1
+ node-releases@2.0.55: {}
object-assign@4.1.1: {}
- object-hash@3.0.0: {}
-
- object-inspect@1.12.3: {}
-
- object-inspect@1.13.1: {}
-
object-inspect@1.13.4: {}
- object-is@1.1.5:
- dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
-
object-keys@1.1.1: {}
- object.assign@4.1.4:
- dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- has-symbols: 1.0.3
- object-keys: 1.1.1
-
- object.assign@4.1.5:
- dependencies:
- call-bind: 1.0.7
- define-properties: 1.2.1
- has-symbols: 1.0.3
- object-keys: 1.1.1
-
object.assign@4.1.7:
dependencies:
- call-bind: 1.0.8
+ call-bind: 1.0.9
call-bound: 1.0.4
define-properties: 1.2.1
- es-object-atoms: 1.1.1
+ es-object-atoms: 1.1.2
has-symbols: 1.1.0
object-keys: 1.1.1
- object.entries@1.1.6:
- dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- es-abstract: 1.21.1
-
object.entries@1.1.9:
dependencies:
- call-bind: 1.0.8
+ call-bind: 1.0.9
call-bound: 1.0.4
define-properties: 1.2.1
- es-object-atoms: 1.1.1
-
- object.fromentries@2.0.6:
- dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- es-abstract: 1.21.1
-
- object.fromentries@2.0.7:
- dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- es-abstract: 1.22.4
+ es-object-atoms: 1.1.2
object.fromentries@2.0.8:
dependencies:
- call-bind: 1.0.7
+ call-bind: 1.0.9
define-properties: 1.2.1
- es-abstract: 1.24.0
- es-object-atoms: 1.1.1
+ es-abstract: 1.24.2
+ es-object-atoms: 1.1.2
- object.groupby@1.0.2:
+ object.groupby@1.0.3:
dependencies:
- array.prototype.filter: 1.0.3
- call-bind: 1.0.7
+ call-bind: 1.0.9
define-properties: 1.2.1
- es-abstract: 1.22.4
- es-errors: 1.3.0
-
- object.hasown@1.1.2:
- dependencies:
- define-properties: 1.2.0
- es-abstract: 1.21.1
-
- object.values@1.1.6:
- dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- es-abstract: 1.21.1
-
- object.values@1.1.7:
- dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- es-abstract: 1.22.4
+ es-abstract: 1.24.2
object.values@1.2.1:
dependencies:
- call-bind: 1.0.8
+ call-bind: 1.0.9
call-bound: 1.0.4
define-properties: 1.2.1
- es-object-atoms: 1.1.1
-
- once@1.4.0:
- dependencies:
- wrappy: 1.0.2
+ es-object-atoms: 1.1.2
- onetime@5.1.2:
- dependencies:
- mimic-fn: 2.1.0
+ obug@2.2.1: {}
- optionator@0.9.3:
+ optionator@0.9.4:
dependencies:
- '@aashutoshrathi/word-wrap': 1.2.6
deep-is: 0.1.4
fast-levenshtein: 2.0.6
levn: 0.4.1
prelude-ls: 1.2.1
type-check: 0.4.0
+ word-wrap: 1.2.5
- ospath@1.2.2: {}
-
- own-keys@1.0.1:
+ own-keys@1.0.2:
dependencies:
+ call-bound: 1.0.4
get-intrinsic: 1.3.0
object-keys: 1.1.1
safe-push-apply: 1.0.0
- p-limit@2.3.0:
- dependencies:
- p-try: 2.2.0
-
p-limit@3.1.0:
dependencies:
yocto-queue: 0.1.0
- p-limit@4.0.0:
- dependencies:
- yocto-queue: 1.0.0
-
- p-locate@3.0.0:
- dependencies:
- p-limit: 2.3.0
-
- p-locate@4.1.0:
- dependencies:
- p-limit: 2.3.0
-
p-locate@5.0.0:
dependencies:
p-limit: 3.1.0
- p-locate@6.0.0:
- dependencies:
- p-limit: 4.0.0
-
- p-map@4.0.0:
- dependencies:
- aggregate-error: 3.1.0
-
- p-try@2.2.0: {}
-
- papaparse@5.4.1: {}
+ papaparse@5.7.0: {}
parent-module@1.0.1:
dependencies:
callsites: 3.1.0
- parse-json@4.0.0:
+ parse5@8.0.1:
dependencies:
- error-ex: 1.3.2
- json-parse-better-errors: 1.0.2
-
- parse-json@5.2.0:
- dependencies:
- '@babel/code-frame': 7.18.6
- error-ex: 1.3.2
- json-parse-even-better-errors: 2.3.1
- lines-and-columns: 1.2.4
-
- path-exists@3.0.0: {}
+ entities: 8.1.0
path-exists@4.0.0: {}
- path-exists@5.0.0: {}
-
- path-is-absolute@1.0.1: {}
-
path-key@3.1.1: {}
path-parse@1.0.7: {}
- path-type@4.0.0: {}
-
- pend@1.2.0: {}
-
- performance-now@2.1.0: {}
-
- picocolors@1.0.0: {}
-
picocolors@1.1.1: {}
- picomatch@2.3.1: {}
-
- picomatch@4.0.2: {}
-
- pify@2.3.0: {}
-
- pify@4.0.1: {}
+ picomatch@2.3.2: {}
- pirates@4.0.5: {}
+ picomatch@4.0.7: {}
- pkg-conf@3.1.0:
- dependencies:
- find-up: 3.0.0
- load-json-file: 5.3.0
-
- pkg-conf@4.0.0:
- dependencies:
- find-up: 6.3.0
- load-json-file: 7.0.1
+ playwright-core@1.63.0: {}
- pkg-dir@4.2.0:
+ playwright@1.63.0:
dependencies:
- find-up: 4.1.0
-
- pluralize@8.0.0: {}
+ playwright-core: 1.63.0
possible-typed-array-names@1.1.0: {}
- postcss-import@15.1.0(postcss@8.4.35):
- dependencies:
- postcss: 8.4.35
- postcss-value-parser: 4.2.0
- read-cache: 1.0.0
- resolve: 1.22.2
-
- postcss-js@4.0.1(postcss@8.4.35):
- dependencies:
- camelcase-css: 2.0.1
- postcss: 8.4.35
-
- postcss-load-config@4.0.1(postcss@8.4.35):
+ postcss@8.5.23:
dependencies:
- lilconfig: 2.1.0
- yaml: 2.2.2
- optionalDependencies:
- postcss: 8.4.35
-
- postcss-nested@6.0.1(postcss@8.4.35):
- dependencies:
- postcss: 8.4.35
- postcss-selector-parser: 6.0.11
-
- postcss-selector-parser@6.0.11:
- dependencies:
- cssesc: 3.0.0
- util-deprecate: 1.0.2
-
- postcss-value-parser@4.2.0: {}
-
- postcss@8.4.31:
- dependencies:
- nanoid: 3.3.11
+ nanoid: 3.3.19
picocolors: 1.1.1
source-map-js: 1.2.1
- postcss@8.4.35:
- dependencies:
- nanoid: 3.3.7
- picocolors: 1.0.0
- source-map-js: 1.0.2
-
- prelude-ls@1.2.1: {}
-
- prettier-linter-helpers@1.0.0:
- dependencies:
- fast-diff: 1.2.0
-
- prettier-plugin-packagejson@2.5.15(prettier@3.2.5):
- dependencies:
- sort-package-json: 3.2.1
- synckit: 0.11.8
- optionalDependencies:
- prettier: 3.2.5
-
- prettier-plugin-tailwindcss@0.5.11(prettier@3.2.5):
- dependencies:
- prettier: 3.2.5
-
- prettier@3.2.5: {}
-
- pretty-bytes@5.6.0: {}
-
- pretty-format@27.5.1:
- dependencies:
- ansi-regex: 5.0.1
- ansi-styles: 5.2.0
- react-is: 17.0.2
-
- pretty-format@29.4.2:
- dependencies:
- '@jest/schemas': 29.4.2
- ansi-styles: 5.2.0
- react-is: 18.2.0
-
- pretty-format@29.7.0:
- dependencies:
- '@jest/schemas': 29.6.3
- ansi-styles: 5.2.0
- react-is: 18.2.0
-
- process@0.11.10: {}
-
- prompts@2.4.2:
- dependencies:
- kleur: 3.0.3
- sisteransi: 1.0.5
-
- prop-types@15.8.1:
- dependencies:
- loose-envify: 1.4.0
- object-assign: 4.1.1
- react-is: 16.13.1
-
- proxy-from-env@1.0.0: {}
-
- proxy-from-env@1.1.0: {}
-
- psl@1.9.0: {}
-
- pump@3.0.0:
- dependencies:
- end-of-stream: 1.4.4
- once: 1.4.0
-
- punycode@2.3.0: {}
-
- pure-rand@6.0.4: {}
-
- qs@6.10.4:
- dependencies:
- side-channel: 1.0.4
-
- querystringify@2.2.0: {}
-
- queue-microtask@1.2.3: {}
-
- react-dom@19.0.0-rc-d1afcb43-20240903(react@19.0.0-rc-d1afcb43-20240903):
+ postcss@8.5.28:
dependencies:
- react: 19.0.0-rc-d1afcb43-20240903
- scheduler: 0.25.0-rc-d1afcb43-20240903
-
- react-is@16.13.1: {}
-
- react-is@17.0.2: {}
-
- react-is@18.2.0: {}
+ nanoid: 3.3.19
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
- react-remove-scroll-bar@2.3.8(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903):
- dependencies:
- react: 19.0.0-rc-d1afcb43-20240903
- react-style-singleton: 2.2.3(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)
- tslib: 2.8.1
- optionalDependencies:
- '@types/react': 18.3.23
+ prelude-ls@1.2.1: {}
- react-remove-scroll@2.7.1(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903):
+ prettier-linter-helpers@1.0.1:
dependencies:
- react: 19.0.0-rc-d1afcb43-20240903
- react-remove-scroll-bar: 2.3.8(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)
- react-style-singleton: 2.2.3(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)
- tslib: 2.8.1
- use-callback-ref: 1.3.3(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)
- use-sidecar: 1.1.3(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903)
- optionalDependencies:
- '@types/react': 18.3.23
+ fast-diff: 1.3.0
- react-style-singleton@2.2.3(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903):
+ prettier-plugin-tailwindcss@0.8.1(prettier@3.9.6):
dependencies:
- get-nonce: 1.0.1
- react: 19.0.0-rc-d1afcb43-20240903
- tslib: 2.8.1
- optionalDependencies:
- '@types/react': 18.3.23
+ prettier: 3.9.6
- react@19.0.0-rc-d1afcb43-20240903: {}
+ prettier@3.9.6: {}
- read-cache@1.0.0:
+ pretty-format@27.5.1:
dependencies:
- pify: 2.3.0
+ ansi-regex: 5.0.1
+ ansi-styles: 5.2.0
+ react-is: 17.0.2
- read-pkg-up@7.0.1:
+ prop-types@15.8.1:
dependencies:
- find-up: 4.1.0
- read-pkg: 5.2.0
- type-fest: 0.8.1
+ loose-envify: 1.4.0
+ object-assign: 4.1.1
+ react-is: 16.13.1
- read-pkg@5.2.0:
- dependencies:
- '@types/normalize-package-data': 2.4.1
- normalize-package-data: 2.5.0
- parse-json: 5.2.0
- type-fest: 0.6.0
+ punycode@2.3.1: {}
+
+ queue-microtask@1.2.3: {}
- readdirp@3.6.0:
+ react-dom@19.3.0(react@19.3.0):
dependencies:
- picomatch: 2.3.1
+ react: 19.3.0
+ scheduler: 0.28.0
+
+ react-is@16.13.1: {}
+
+ react-is@17.0.2: {}
+
+ react@19.3.0: {}
redent@3.0.0:
dependencies:
@@ -9433,193 +5471,96 @@ snapshots:
reflect.getprototypeof@1.0.10:
dependencies:
- call-bind: 1.0.8
+ call-bind: 1.0.9
define-properties: 1.2.1
- es-abstract: 1.24.0
+ es-abstract: 1.24.2
es-errors: 1.3.0
- es-object-atoms: 1.1.1
+ es-object-atoms: 1.1.2
get-intrinsic: 1.3.0
get-proto: 1.0.1
which-builtin-type: 1.2.1
- reflect.getprototypeof@1.0.5:
- dependencies:
- call-bind: 1.0.7
- define-properties: 1.2.1
- es-abstract: 1.22.4
- es-errors: 1.3.0
- get-intrinsic: 1.2.4
- globalthis: 1.0.3
- which-builtin-type: 1.1.3
-
- regenerator-runtime@0.13.11: {}
-
- regexp-tree@0.1.27: {}
-
- regexp.prototype.flags@1.4.3:
- dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- functions-have-names: 1.2.3
-
- regexp.prototype.flags@1.5.2:
- dependencies:
- call-bind: 1.0.7
- define-properties: 1.2.1
- es-errors: 1.3.0
- set-function-name: 2.0.1
-
regexp.prototype.flags@1.5.4:
dependencies:
- call-bind: 1.0.8
+ call-bind: 1.0.9
define-properties: 1.2.1
es-errors: 1.3.0
get-proto: 1.0.1
gopd: 1.2.0
set-function-name: 2.0.2
- regexpp@3.2.0: {}
-
- regjsparser@0.10.0:
- dependencies:
- jsesc: 0.5.0
-
- request-progress@3.0.0:
- dependencies:
- throttleit: 1.0.0
-
- require-directory@2.1.1: {}
-
require-from-string@2.0.2: {}
- requires-port@1.0.0: {}
-
- resolve-cwd@3.0.0:
- dependencies:
- resolve-from: 5.0.0
+ reselect@5.3.0: {}
resolve-from@4.0.0: {}
- resolve-from@5.0.0: {}
-
- resolve.exports@2.0.0: {}
-
- resolve@1.19.0:
- dependencies:
- is-core-module: 2.13.1
- path-parse: 1.0.7
-
- resolve@1.22.2:
- dependencies:
- is-core-module: 2.11.0
- path-parse: 1.0.7
- supports-preserve-symlinks-flag: 1.0.0
-
- resolve@1.22.8:
- dependencies:
- is-core-module: 2.13.1
- path-parse: 1.0.7
- supports-preserve-symlinks-flag: 1.0.0
-
- resolve@2.0.0-next.4:
- dependencies:
- is-core-module: 2.11.0
- path-parse: 1.0.7
- supports-preserve-symlinks-flag: 1.0.0
+ resolve-pkg-maps@1.0.0: {}
- resolve@2.0.0-next.5:
+ resolve@2.0.0-next.7:
dependencies:
- is-core-module: 2.13.1
+ es-errors: 1.3.0
+ is-core-module: 2.16.2
+ node-exports-info: 1.6.2
+ object-keys: 1.1.1
path-parse: 1.0.7
supports-preserve-symlinks-flag: 1.0.0
- restore-cursor@3.1.0:
- dependencies:
- onetime: 5.1.2
- signal-exit: 3.0.7
-
- reusify@1.0.4: {}
+ reusify@1.1.0: {}
- rfdc@1.3.0: {}
-
- rimraf@3.0.2:
+ rolldown@1.2.8:
dependencies:
- glob: 7.2.3
+ '@oxc-project/types': 0.149.0
+ '@rolldown/pluginutils': 1.0.1
+ optionalDependencies:
+ '@rolldown/binding-android-arm-eabi': 1.2.8
+ '@rolldown/binding-android-arm64': 1.2.8
+ '@rolldown/binding-darwin-arm64': 1.2.8
+ '@rolldown/binding-darwin-x64': 1.2.8
+ '@rolldown/binding-freebsd-x64': 1.2.8
+ '@rolldown/binding-linux-arm-gnueabihf': 1.2.8
+ '@rolldown/binding-linux-arm64-gnu': 1.2.8
+ '@rolldown/binding-linux-arm64-musl': 1.2.8
+ '@rolldown/binding-linux-ppc64-gnu': 1.2.8
+ '@rolldown/binding-linux-s390x-gnu': 1.2.8
+ '@rolldown/binding-linux-x64-gnu': 1.2.8
+ '@rolldown/binding-linux-x64-musl': 1.2.8
+ '@rolldown/binding-openharmony-arm64': 1.2.8
+ '@rolldown/binding-win32-arm64-msvc': 1.2.8
+ '@rolldown/binding-win32-x64-msvc': 1.2.8
run-parallel@1.2.0:
dependencies:
queue-microtask: 1.2.3
- rxjs@7.8.0:
+ safe-array-concat@1.1.4:
dependencies:
- tslib: 2.8.1
-
- rxjs@7.8.1:
- dependencies:
- tslib: 2.6.2
-
- safe-array-concat@1.1.0:
- dependencies:
- call-bind: 1.0.7
- get-intrinsic: 1.2.4
- has-symbols: 1.0.3
- isarray: 2.0.5
-
- safe-array-concat@1.1.3:
- dependencies:
- call-bind: 1.0.8
+ call-bind: 1.0.9
call-bound: 1.0.4
get-intrinsic: 1.3.0
has-symbols: 1.1.0
isarray: 2.0.5
- safe-buffer@5.2.1: {}
-
safe-push-apply@1.0.0:
dependencies:
es-errors: 1.3.0
isarray: 2.0.5
- safe-regex-test@1.0.0:
- dependencies:
- call-bind: 1.0.2
- get-intrinsic: 1.2.0
- is-regex: 1.1.4
-
- safe-regex-test@1.0.3:
- dependencies:
- call-bind: 1.0.7
- es-errors: 1.3.0
- is-regex: 1.1.4
-
safe-regex-test@1.1.0:
dependencies:
call-bound: 1.0.4
es-errors: 1.3.0
is-regex: 1.2.1
- safer-buffer@2.1.2: {}
-
- scheduler@0.25.0-rc-d1afcb43-20240903: {}
+ saxes@6.0.0:
+ dependencies:
+ xmlchars: 2.2.0
- semver@5.7.2: {}
+ scheduler@0.28.0: {}
semver@6.3.1: {}
- semver@7.6.0:
- dependencies:
- lru-cache: 6.0.0
-
- semver@7.7.2: {}
-
- set-function-length@1.2.1:
- dependencies:
- define-data-property: 1.1.4
- es-errors: 1.3.0
- function-bind: 1.1.2
- get-intrinsic: 1.2.4
- gopd: 1.0.1
- has-property-descriptors: 1.0.2
+ semver@7.8.5: {}
set-function-length@1.2.2:
dependencies:
@@ -9627,13 +5568,7 @@ snapshots:
es-errors: 1.3.0
function-bind: 1.1.2
get-intrinsic: 1.3.0
- gopd: 1.0.1
- has-property-descriptors: 1.0.2
-
- set-function-name@2.0.1:
- dependencies:
- define-data-property: 1.1.4
- functions-have-names: 1.2.3
+ gopd: 1.2.0
has-property-descriptors: 1.0.2
set-function-name@2.0.2:
@@ -9647,35 +5582,40 @@ snapshots:
dependencies:
dunder-proto: 1.0.1
es-errors: 1.3.0
- es-object-atoms: 1.1.1
+ es-object-atoms: 1.1.2
- sharp@0.34.2:
+ sharp@0.35.4(@types/node@24.13.4):
dependencies:
- color: 4.2.3
- detect-libc: 2.0.4
- semver: 7.7.2
+ '@img/colour': 1.1.0
+ detect-libc: 2.1.2
+ semver: 7.8.5
optionalDependencies:
- '@img/sharp-darwin-arm64': 0.34.2
- '@img/sharp-darwin-x64': 0.34.2
- '@img/sharp-libvips-darwin-arm64': 1.1.0
- '@img/sharp-libvips-darwin-x64': 1.1.0
- '@img/sharp-libvips-linux-arm': 1.1.0
- '@img/sharp-libvips-linux-arm64': 1.1.0
- '@img/sharp-libvips-linux-ppc64': 1.1.0
- '@img/sharp-libvips-linux-s390x': 1.1.0
- '@img/sharp-libvips-linux-x64': 1.1.0
- '@img/sharp-libvips-linuxmusl-arm64': 1.1.0
- '@img/sharp-libvips-linuxmusl-x64': 1.1.0
- '@img/sharp-linux-arm': 0.34.2
- '@img/sharp-linux-arm64': 0.34.2
- '@img/sharp-linux-s390x': 0.34.2
- '@img/sharp-linux-x64': 0.34.2
- '@img/sharp-linuxmusl-arm64': 0.34.2
- '@img/sharp-linuxmusl-x64': 0.34.2
- '@img/sharp-wasm32': 0.34.2
- '@img/sharp-win32-arm64': 0.34.2
- '@img/sharp-win32-ia32': 0.34.2
- '@img/sharp-win32-x64': 0.34.2
+ '@img/sharp-darwin-arm64': 0.35.4
+ '@img/sharp-darwin-x64': 0.35.4
+ '@img/sharp-freebsd-wasm32': 0.35.4
+ '@img/sharp-libvips-darwin-arm64': 1.3.3
+ '@img/sharp-libvips-darwin-x64': 1.3.3
+ '@img/sharp-libvips-linux-arm': 1.3.3
+ '@img/sharp-libvips-linux-arm64': 1.3.3
+ '@img/sharp-libvips-linux-ppc64': 1.3.3
+ '@img/sharp-libvips-linux-riscv64': 1.3.3
+ '@img/sharp-libvips-linux-s390x': 1.3.3
+ '@img/sharp-libvips-linux-x64': 1.3.3
+ '@img/sharp-libvips-linuxmusl-arm64': 1.3.3
+ '@img/sharp-libvips-linuxmusl-x64': 1.3.3
+ '@img/sharp-linux-arm': 0.35.4
+ '@img/sharp-linux-arm64': 0.35.4
+ '@img/sharp-linux-ppc64': 0.35.4
+ '@img/sharp-linux-riscv64': 0.35.4
+ '@img/sharp-linux-s390x': 0.35.4
+ '@img/sharp-linux-x64': 0.35.4
+ '@img/sharp-linuxmusl-arm64': 0.35.4
+ '@img/sharp-linuxmusl-x64': 0.35.4
+ '@img/sharp-webcontainers-wasm32': 0.35.4
+ '@img/sharp-win32-arm64': 0.35.4
+ '@img/sharp-win32-ia32': 0.35.4
+ '@img/sharp-win32-x64': 0.35.4
+ '@types/node': 24.13.4
optional: true
shebang-command@2.0.0:
@@ -9684,7 +5624,7 @@ snapshots:
shebang-regex@3.0.0: {}
- side-channel-list@1.0.0:
+ side-channel-list@1.0.1:
dependencies:
es-errors: 1.3.0
object-inspect: 1.13.4
@@ -9704,393 +5644,143 @@ snapshots:
object-inspect: 1.13.4
side-channel-map: 1.0.1
- side-channel@1.0.4:
- dependencies:
- call-bind: 1.0.2
- get-intrinsic: 1.2.0
- object-inspect: 1.12.3
-
- side-channel@1.1.0:
+ side-channel@1.1.1:
dependencies:
es-errors: 1.3.0
object-inspect: 1.13.4
- side-channel-list: 1.0.0
+ side-channel-list: 1.0.1
side-channel-map: 1.0.1
side-channel-weakmap: 1.0.2
- signal-exit@3.0.7: {}
-
- simple-swizzle@0.2.2:
- dependencies:
- is-arrayish: 0.3.2
- optional: true
-
- sisteransi@1.0.5: {}
-
- slash@3.0.0: {}
-
- slice-ansi@3.0.0:
- dependencies:
- ansi-styles: 4.3.0
- astral-regex: 2.0.0
- is-fullwidth-code-point: 3.0.0
-
- slice-ansi@4.0.0:
- dependencies:
- ansi-styles: 4.3.0
- astral-regex: 2.0.0
- is-fullwidth-code-point: 3.0.0
-
- sort-object-keys@1.1.3: {}
-
- sort-package-json@3.2.1:
- dependencies:
- detect-indent: 7.0.1
- detect-newline: 4.0.1
- git-hooks-list: 4.1.1
- is-plain-obj: 4.1.0
- semver: 7.7.2
- sort-object-keys: 1.1.3
- tinyglobby: 0.2.14
-
- source-map-js@1.0.2: {}
+ siginfo@2.0.0: {}
source-map-js@1.2.1: {}
- source-map-support@0.5.13:
- dependencies:
- buffer-from: 1.1.2
- source-map: 0.6.1
-
- source-map@0.6.1: {}
-
- spdx-correct@3.2.0:
- dependencies:
- spdx-expression-parse: 3.0.1
- spdx-license-ids: 3.0.13
-
- spdx-exceptions@2.3.0: {}
-
- spdx-expression-parse@3.0.1:
- dependencies:
- spdx-exceptions: 2.3.0
- spdx-license-ids: 3.0.13
-
- spdx-license-ids@3.0.13: {}
-
- sprintf-js@1.0.3: {}
+ stable-hash-x@0.2.0: {}
- sshpk@1.17.0:
- dependencies:
- asn1: 0.2.6
- assert-plus: 1.0.0
- bcrypt-pbkdf: 1.0.2
- dashdash: 1.14.1
- ecc-jsbn: 0.1.2
- getpass: 0.1.7
- jsbn: 0.1.1
- safer-buffer: 2.1.2
- tweetnacl: 0.14.5
-
- stack-utils@2.0.6:
- dependencies:
- escape-string-regexp: 2.0.0
-
- standard-engine@15.0.0:
- dependencies:
- get-stdin: 8.0.0
- minimist: 1.2.8
- pkg-conf: 3.1.0
- xdg-basedir: 4.0.0
+ stackback@0.0.2: {}
- stop-iteration-iterator@1.0.0:
- dependencies:
- internal-slot: 1.0.5
+ std-env@4.2.0: {}
stop-iteration-iterator@1.1.0:
dependencies:
es-errors: 1.3.0
internal-slot: 1.1.0
- string-length@4.0.2:
- dependencies:
- char-regex: 1.0.2
- strip-ansi: 6.0.1
-
- string-width@4.2.3:
- dependencies:
- emoji-regex: 8.0.0
- is-fullwidth-code-point: 3.0.0
- strip-ansi: 6.0.1
-
string.prototype.includes@2.0.1:
dependencies:
- call-bind: 1.0.8
+ call-bind: 1.0.9
define-properties: 1.2.1
- es-abstract: 1.24.0
+ es-abstract: 1.24.2
- string.prototype.matchall@4.0.12:
+ string.prototype.matchall@4.1.0:
dependencies:
- call-bind: 1.0.8
+ call-bind: 1.0.9
call-bound: 1.0.4
define-properties: 1.2.1
- es-abstract: 1.24.0
+ es-abstract: 1.24.2
es-errors: 1.3.0
- es-object-atoms: 1.1.1
+ es-object-atoms: 1.1.2
get-intrinsic: 1.3.0
gopd: 1.2.0
has-symbols: 1.1.0
internal-slot: 1.1.0
regexp.prototype.flags: 1.5.4
set-function-name: 2.0.2
- side-channel: 1.1.0
-
- string.prototype.matchall@4.0.8:
- dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- es-abstract: 1.21.1
- get-intrinsic: 1.2.0
- has-symbols: 1.0.3
- internal-slot: 1.0.5
- regexp.prototype.flags: 1.4.3
- side-channel: 1.0.4
+ side-channel: 1.1.1
string.prototype.repeat@1.0.0:
dependencies:
define-properties: 1.2.1
- es-abstract: 1.22.4
+ es-abstract: 1.24.2
- string.prototype.trim@1.2.10:
+ string.prototype.trim@1.2.11:
dependencies:
- call-bind: 1.0.8
+ call-bind: 1.0.9
call-bound: 1.0.4
define-data-property: 1.1.4
define-properties: 1.2.1
- es-abstract: 1.24.0
- es-object-atoms: 1.1.1
+ es-abstract: 1.24.2
+ es-object-atoms: 1.1.2
has-property-descriptors: 1.0.2
+ safe-regex-test: 1.1.0
- string.prototype.trim@1.2.8:
- dependencies:
- call-bind: 1.0.7
- define-properties: 1.2.0
- es-abstract: 1.22.4
-
- string.prototype.trimend@1.0.6:
- dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- es-abstract: 1.21.1
-
- string.prototype.trimend@1.0.7:
- dependencies:
- call-bind: 1.0.7
- define-properties: 1.2.0
- es-abstract: 1.22.4
-
- string.prototype.trimend@1.0.9:
+ string.prototype.trimend@1.0.10:
dependencies:
- call-bind: 1.0.8
+ call-bind: 1.0.9
call-bound: 1.0.4
define-properties: 1.2.1
- es-object-atoms: 1.1.1
-
- string.prototype.trimstart@1.0.6:
- dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- es-abstract: 1.21.1
-
- string.prototype.trimstart@1.0.7:
- dependencies:
- call-bind: 1.0.7
- define-properties: 1.2.0
- es-abstract: 1.22.4
+ es-object-atoms: 1.1.2
string.prototype.trimstart@1.0.8:
dependencies:
- call-bind: 1.0.8
+ call-bind: 1.0.9
define-properties: 1.2.1
- es-object-atoms: 1.1.1
-
- strip-ansi@6.0.1:
- dependencies:
- ansi-regex: 5.0.1
+ es-object-atoms: 1.1.2
strip-bom@3.0.0: {}
- strip-bom@4.0.0: {}
-
- strip-final-newline@2.0.0: {}
-
strip-indent@3.0.0:
dependencies:
min-indent: 1.0.1
strip-json-comments@3.1.1: {}
- styled-jsx@5.1.6(@babel/core@7.20.12)(react@19.0.0-rc-d1afcb43-20240903):
+ styled-jsx@5.1.6(@babel/core@7.29.7(supports-color@7.2.0))(react@19.3.0):
dependencies:
client-only: 0.0.1
- react: 19.0.0-rc-d1afcb43-20240903
+ react: 19.3.0
optionalDependencies:
- '@babel/core': 7.20.12
-
- sucrase@3.32.0:
- dependencies:
- '@jridgewell/gen-mapping': 0.3.2
- commander: 4.1.1
- glob: 7.1.6
- lines-and-columns: 1.2.4
- mz: 2.7.0
- pirates: 4.0.5
- ts-interface-checker: 0.1.13
-
- supports-color@5.5.0:
- dependencies:
- has-flag: 3.0.0
+ '@babel/core': 7.29.7(supports-color@7.2.0)
supports-color@7.2.0:
dependencies:
has-flag: 4.0.0
- supports-color@8.1.1:
- dependencies:
- has-flag: 4.0.0
-
supports-preserve-symlinks-flag@1.0.0: {}
- synckit@0.11.8:
- dependencies:
- '@pkgr/core': 0.2.7
-
- synckit@0.8.8:
- dependencies:
- '@pkgr/core': 0.1.1
- tslib: 2.6.2
-
- tailwind-merge@2.6.0: {}
+ symbol-tree@3.2.4: {}
- tailwindcss-animate@1.0.7(tailwindcss@3.4.1):
+ synckit@0.11.13:
dependencies:
- tailwindcss: 3.4.1
+ '@pkgr/core': 0.3.6
- tailwindcss@3.4.1:
- dependencies:
- '@alloc/quick-lru': 5.2.0
- arg: 5.0.2
- chokidar: 3.5.3
- didyoumean: 1.2.2
- dlv: 1.1.3
- fast-glob: 3.3.2
- glob-parent: 6.0.2
- is-glob: 4.0.3
- jiti: 1.21.0
- lilconfig: 2.1.0
- micromatch: 4.0.5
- normalize-path: 3.0.0
- object-hash: 3.0.0
- picocolors: 1.0.0
- postcss: 8.4.35
- postcss-import: 15.1.0(postcss@8.4.35)
- postcss-js: 4.0.1(postcss@8.4.35)
- postcss-load-config: 4.0.1(postcss@8.4.35)
- postcss-nested: 6.0.1(postcss@8.4.35)
- postcss-selector-parser: 6.0.11
- resolve: 1.22.2
- sucrase: 3.32.0
- transitivePeerDependencies:
- - ts-node
+ tailwindcss@4.3.3: {}
- tapable@2.2.1: {}
+ tapable@2.3.3: {}
- test-exclude@6.0.0:
- dependencies:
- '@istanbuljs/schema': 0.1.3
- glob: 7.2.3
- minimatch: 3.1.2
-
- text-table@0.2.0: {}
+ tinybench@6.1.4: {}
- thenify-all@1.6.0:
- dependencies:
- thenify: 3.3.1
+ tinyexec@1.3.0: {}
- thenify@3.3.1:
+ tinyglobby@0.2.17:
dependencies:
- any-promise: 1.3.0
-
- throttleit@1.0.0: {}
+ fdir: 6.5.0(picomatch@4.0.7)
+ picomatch: 4.0.7
- through@2.3.8: {}
+ tinyrainbow@3.1.1: {}
- tinyglobby@0.2.14:
- dependencies:
- fdir: 6.4.5(picomatch@4.0.2)
- picomatch: 4.0.2
+ tldts-core@7.4.12: {}
- tmp@0.2.1:
+ tldts@7.4.12:
dependencies:
- rimraf: 3.0.2
-
- tmpl@1.0.5: {}
-
- to-fast-properties@2.0.0: {}
+ tldts-core: 7.4.12
to-regex-range@5.0.1:
dependencies:
is-number: 7.0.0
- tough-cookie@4.1.3:
+ tough-cookie@6.0.2:
dependencies:
- psl: 1.9.0
- punycode: 2.3.0
- universalify: 0.2.0
- url-parse: 1.5.10
+ tldts: 7.4.12
- ts-api-utils@1.4.3(typescript@5.3.3):
+ tr46@6.0.0:
dependencies:
- typescript: 5.3.3
-
- ts-interface-checker@0.1.13: {}
+ punycode: 2.3.1
- ts-jest@29.1.2(@babel/core@7.20.12)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.20.12))(jest@29.7.0(@types/node@22.15.29))(typescript@5.3.3):
+ ts-api-utils@2.5.0(@typescript/typescript6@6.0.2):
dependencies:
- bs-logger: 0.2.6
- fast-json-stable-stringify: 2.1.0
- jest: 29.7.0(@types/node@22.15.29)
- jest-util: 29.4.2
- json5: 2.2.3
- lodash.memoize: 4.1.2
- make-error: 1.3.6
- semver: 7.6.0
- typescript: 5.3.3
- yargs-parser: 21.1.1
- optionalDependencies:
- '@babel/core': 7.20.12
- '@jest/types': 29.6.3
- babel-jest: 29.7.0(@babel/core@7.20.12)
-
- ts-standard@12.0.2(typescript@5.3.3):
- dependencies:
- '@typescript-eslint/eslint-plugin': 5.51.0(@typescript-eslint/parser@5.51.0(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0)(typescript@5.3.3)
- '@typescript-eslint/parser': 5.51.0(eslint@8.56.0)(typescript@5.3.3)
- eslint: 8.56.0
- eslint-config-standard-jsx: 11.0.0(eslint-plugin-react@7.33.2(eslint@8.56.0))(eslint@8.56.0)
- eslint-config-standard-with-typescript: 23.0.0(@typescript-eslint/eslint-plugin@5.51.0(@typescript-eslint/parser@5.51.0(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1)(eslint-plugin-n@15.7.0(eslint@8.56.0))(eslint-plugin-promise@6.1.1(eslint@8.56.0))(eslint@8.56.0)(typescript@5.3.3)
- eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.51.0(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0)
- eslint-plugin-n: 15.7.0(eslint@8.56.0)
- eslint-plugin-promise: 6.1.1(eslint@8.56.0)
- eslint-plugin-react: 7.33.2(eslint@8.56.0)
- minimist: 1.2.8
- pkg-conf: 4.0.0
- standard-engine: 15.0.0
- typescript: 5.3.3
- transitivePeerDependencies:
- - eslint-import-resolver-typescript
- - eslint-import-resolver-webpack
- - supports-color
+ typescript: '@typescript/typescript6@6.0.2'
tsconfig-paths@3.15.0:
dependencies:
@@ -10099,207 +5789,191 @@ snapshots:
minimist: 1.2.8
strip-bom: 3.0.0
- tslib@1.14.1: {}
-
- tslib@2.6.2: {}
-
tslib@2.8.1: {}
- tsutils@3.21.0(typescript@5.3.3):
- dependencies:
- tslib: 1.14.1
- typescript: 5.3.3
-
- tunnel-agent@0.6.0:
- dependencies:
- safe-buffer: 5.2.1
-
- tweetnacl@0.14.5: {}
-
type-check@0.4.0:
dependencies:
prelude-ls: 1.2.1
- type-detect@4.0.8: {}
-
- type-fest@0.20.2: {}
-
- type-fest@0.21.3: {}
-
- type-fest@0.3.1: {}
-
- type-fest@0.6.0: {}
-
- type-fest@0.8.1: {}
-
- typed-array-buffer@1.0.1:
- dependencies:
- call-bind: 1.0.7
- es-errors: 1.3.0
- is-typed-array: 1.1.13
-
typed-array-buffer@1.0.3:
dependencies:
call-bound: 1.0.4
es-errors: 1.3.0
is-typed-array: 1.1.15
- typed-array-byte-length@1.0.0:
- dependencies:
- call-bind: 1.0.7
- for-each: 0.3.3
- has-proto: 1.0.1
- is-typed-array: 1.1.13
-
typed-array-byte-length@1.0.3:
dependencies:
- call-bind: 1.0.8
- for-each: 0.3.3
+ call-bind: 1.0.9
+ for-each: 0.3.5
gopd: 1.2.0
has-proto: 1.2.0
is-typed-array: 1.1.15
- typed-array-byte-offset@1.0.0:
- dependencies:
- available-typed-arrays: 1.0.6
- call-bind: 1.0.7
- for-each: 0.3.3
- has-proto: 1.0.1
- is-typed-array: 1.1.13
-
typed-array-byte-offset@1.0.4:
dependencies:
available-typed-arrays: 1.0.7
- call-bind: 1.0.8
- for-each: 0.3.3
+ call-bind: 1.0.9
+ for-each: 0.3.5
gopd: 1.2.0
has-proto: 1.2.0
is-typed-array: 1.1.15
reflect.getprototypeof: 1.0.10
- typed-array-length@1.0.4:
- dependencies:
- call-bind: 1.0.7
- for-each: 0.3.3
- is-typed-array: 1.1.13
-
- typed-array-length@1.0.7:
+ typed-array-length@1.0.8:
dependencies:
- call-bind: 1.0.8
- for-each: 0.3.3
+ call-bind: 1.0.9
+ for-each: 0.3.5
gopd: 1.2.0
is-typed-array: 1.1.15
possible-typed-array-names: 1.1.0
reflect.getprototypeof: 1.0.10
- typescript@5.3.3: {}
-
- unbox-primitive@1.0.2:
+ typescript-eslint@8.70.0(@typescript/typescript6@6.0.2)(eslint@9.39.5(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0):
dependencies:
- call-bind: 1.0.7
- has-bigints: 1.0.2
- has-symbols: 1.0.3
- which-boxed-primitive: 1.0.2
+ '@typescript-eslint/eslint-plugin': 8.70.0(@typescript-eslint/parser@8.70.0(@typescript/typescript6@6.0.2)(eslint@9.39.5(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0))(@typescript/typescript6@6.0.2)(eslint@9.39.5(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)
+ '@typescript-eslint/parser': 8.70.0(@typescript/typescript6@6.0.2)(eslint@9.39.5(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)
+ '@typescript-eslint/typescript-estree': 8.70.0(@typescript/typescript6@6.0.2)(supports-color@7.2.0)
+ '@typescript-eslint/utils': 8.70.0(@typescript/typescript6@6.0.2)(eslint@9.39.5(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)
+ eslint: 9.39.5(jiti@2.7.0)(supports-color@7.2.0)
+ typescript: '@typescript/typescript6@6.0.2'
+ transitivePeerDependencies:
+ - supports-color
+
+ typescript@6.0.3: {}
+
+ typescript@7.0.2:
+ optionalDependencies:
+ '@typescript/typescript-aix-ppc64': 7.0.2
+ '@typescript/typescript-darwin-arm64': 7.0.2
+ '@typescript/typescript-darwin-x64': 7.0.2
+ '@typescript/typescript-freebsd-arm64': 7.0.2
+ '@typescript/typescript-freebsd-x64': 7.0.2
+ '@typescript/typescript-linux-arm': 7.0.2
+ '@typescript/typescript-linux-arm64': 7.0.2
+ '@typescript/typescript-linux-loong64': 7.0.2
+ '@typescript/typescript-linux-mips64el': 7.0.2
+ '@typescript/typescript-linux-ppc64': 7.0.2
+ '@typescript/typescript-linux-riscv64': 7.0.2
+ '@typescript/typescript-linux-s390x': 7.0.2
+ '@typescript/typescript-linux-x64': 7.0.2
+ '@typescript/typescript-netbsd-arm64': 7.0.2
+ '@typescript/typescript-netbsd-x64': 7.0.2
+ '@typescript/typescript-openbsd-arm64': 7.0.2
+ '@typescript/typescript-openbsd-x64': 7.0.2
+ '@typescript/typescript-sunos-x64': 7.0.2
+ '@typescript/typescript-win32-arm64': 7.0.2
+ '@typescript/typescript-win32-x64': 7.0.2
unbox-primitive@1.1.0:
dependencies:
call-bound: 1.0.4
- has-bigints: 1.0.2
+ has-bigints: 1.1.0
has-symbols: 1.1.0
which-boxed-primitive: 1.1.1
- undici-types@6.21.0: {}
-
- universalify@0.2.0: {}
-
- universalify@2.0.0: {}
-
- untildify@4.0.0: {}
-
- update-browserslist-db@1.0.10(browserslist@4.21.5):
- dependencies:
- browserslist: 4.21.5
- escalade: 3.1.1
- picocolors: 1.1.1
+ undici-types@7.18.2: {}
- update-browserslist-db@1.0.13(browserslist@4.23.0):
- dependencies:
- browserslist: 4.23.0
- escalade: 3.1.1
- picocolors: 1.0.0
+ undici@8.10.2: {}
- update-browserslist-db@1.1.3(browserslist@4.25.0):
+ unrs-resolver@1.12.2:
dependencies:
- browserslist: 4.25.0
+ napi-postinstall: 0.3.4
+ optionalDependencies:
+ '@unrs/resolver-binding-android-arm-eabi': 1.12.2
+ '@unrs/resolver-binding-android-arm64': 1.12.2
+ '@unrs/resolver-binding-darwin-arm64': 1.12.2
+ '@unrs/resolver-binding-darwin-x64': 1.12.2
+ '@unrs/resolver-binding-freebsd-x64': 1.12.2
+ '@unrs/resolver-binding-linux-arm-gnueabihf': 1.12.2
+ '@unrs/resolver-binding-linux-arm-musleabihf': 1.12.2
+ '@unrs/resolver-binding-linux-arm64-gnu': 1.12.2
+ '@unrs/resolver-binding-linux-arm64-musl': 1.12.2
+ '@unrs/resolver-binding-linux-loong64-gnu': 1.12.2
+ '@unrs/resolver-binding-linux-loong64-musl': 1.12.2
+ '@unrs/resolver-binding-linux-ppc64-gnu': 1.12.2
+ '@unrs/resolver-binding-linux-riscv64-gnu': 1.12.2
+ '@unrs/resolver-binding-linux-riscv64-musl': 1.12.2
+ '@unrs/resolver-binding-linux-s390x-gnu': 1.12.2
+ '@unrs/resolver-binding-linux-x64-gnu': 1.12.2
+ '@unrs/resolver-binding-linux-x64-musl': 1.12.2
+ '@unrs/resolver-binding-openharmony-arm64': 1.12.2
+ '@unrs/resolver-binding-wasm32-wasi': 1.12.2
+ '@unrs/resolver-binding-win32-arm64-msvc': 1.12.2
+ '@unrs/resolver-binding-win32-ia32-msvc': 1.12.2
+ '@unrs/resolver-binding-win32-x64-msvc': 1.12.2
+
+ update-browserslist-db@1.3.3(browserslist@4.28.9):
+ dependencies:
+ browserslist: 4.28.9
escalade: 3.2.0
picocolors: 1.1.1
uri-js@4.4.1:
dependencies:
- punycode: 2.3.0
+ punycode: 2.3.1
- url-parse@1.5.10:
+ use-sync-external-store@1.7.0(react@19.3.0):
dependencies:
- querystringify: 2.2.0
- requires-port: 1.0.0
+ react: 19.3.0
- use-callback-ref@1.3.3(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903):
+ vite@8.3.0(@types/node@24.13.4)(jiti@2.7.0):
dependencies:
- react: 19.0.0-rc-d1afcb43-20240903
- tslib: 2.8.1
+ lightningcss: 1.33.0
+ picomatch: 4.0.7
+ postcss: 8.5.28
+ rolldown: 1.2.8
+ tinyglobby: 0.2.17
optionalDependencies:
- '@types/react': 18.3.23
-
- use-sidecar@1.1.3(@types/react@18.3.23)(react@19.0.0-rc-d1afcb43-20240903):
- dependencies:
- detect-node-es: 1.1.0
- react: 19.0.0-rc-d1afcb43-20240903
- tslib: 2.8.1
+ '@types/node': 24.13.4
+ fsevents: 2.3.3
+ jiti: 2.7.0
+
+ vitest@5.0.0(@types/node@24.13.4)(@vitest/coverage-v8@5.0.0)(jsdom@30.0.1)(vite@8.3.0(@types/node@24.13.4)(jiti@2.7.0)):
+ dependencies:
+ '@types/chai': 5.2.3
+ '@vitest/mocker': 5.0.0(vite@8.3.0(@types/node@24.13.4)(jiti@2.7.0))
+ chai: 6.2.2
+ es-module-lexer: 2.3.2
+ expect-type: 1.4.0
+ magic-string: 1.3.1
+ obug: 2.2.1
+ picomatch: 4.0.7
+ std-env: 4.2.0
+ tinybench: 6.1.4
+ tinyexec: 1.3.0
+ tinyglobby: 0.2.17
+ vite: 8.3.0(@types/node@24.13.4)(jiti@2.7.0)
+ why-is-node-running: 2.3.0
optionalDependencies:
- '@types/react': 18.3.23
-
- util-deprecate@1.0.2: {}
-
- uuid@8.3.2: {}
+ '@types/node': 24.13.4
+ '@vitest/coverage-v8': 5.0.0(vitest@5.0.0)
+ jsdom: 30.0.1
+ transitivePeerDependencies:
+ - msw
- v8-to-istanbul@9.0.1:
+ w3c-xmlserializer@5.0.0:
dependencies:
- '@jridgewell/trace-mapping': 0.3.22
- '@types/istanbul-lib-coverage': 2.0.4
- convert-source-map: 1.9.0
+ xml-name-validator: 5.0.0
- validate-npm-package-license@3.0.4:
- dependencies:
- spdx-correct: 3.2.0
- spdx-expression-parse: 3.0.1
+ webidl-conversions@8.0.1: {}
- verror@1.10.0:
- dependencies:
- assert-plus: 1.0.0
- core-util-is: 1.0.2
- extsprintf: 1.3.0
+ whatwg-mimetype@5.0.0: {}
- wait-on@7.2.0:
+ whatwg-url@16.0.1:
dependencies:
- axios: 1.6.7
- joi: 17.12.1
- lodash: 4.17.21
- minimist: 1.2.8
- rxjs: 7.8.1
+ '@exodus/bytes': 1.15.1
+ tr46: 6.0.0
+ webidl-conversions: 8.0.1
transitivePeerDependencies:
- - debug
-
- walker@1.0.8:
- dependencies:
- makeerror: 1.0.12
+ - '@noble/hashes'
- which-boxed-primitive@1.0.2:
+ whatwg-url@17.1.1:
dependencies:
- is-bigint: 1.0.4
- is-boolean-object: 1.1.2
- is-number-object: 1.0.7
- is-string: 1.0.7
- is-symbol: 1.0.4
+ '@exodus/bytes': 1.15.1
+ tr46: 6.0.0
+ webidl-conversions: 8.0.1
+ transitivePeerDependencies:
+ - '@noble/hashes'
which-boxed-primitive@1.1.1:
dependencies:
@@ -10309,43 +5983,21 @@ snapshots:
is-string: 1.1.1
is-symbol: 1.1.1
- which-builtin-type@1.1.3:
- dependencies:
- function.prototype.name: 1.1.5
- has-tostringtag: 1.0.0
- is-async-function: 2.0.0
- is-date-object: 1.0.5
- is-finalizationregistry: 1.0.2
- is-generator-function: 1.0.10
- is-regex: 1.1.4
- is-weakref: 1.0.2
- isarray: 2.0.5
- which-boxed-primitive: 1.0.2
- which-collection: 1.0.1
- which-typed-array: 1.1.9
-
which-builtin-type@1.2.1:
dependencies:
call-bound: 1.0.4
- function.prototype.name: 1.1.8
+ function.prototype.name: 1.2.0
has-tostringtag: 1.0.2
- is-async-function: 2.0.0
+ is-async-function: 2.1.1
is-date-object: 1.1.0
is-finalizationregistry: 1.1.1
- is-generator-function: 1.0.10
+ is-generator-function: 1.1.2
is-regex: 1.2.1
is-weakref: 1.1.1
isarray: 2.0.5
which-boxed-primitive: 1.1.1
which-collection: 1.0.2
- which-typed-array: 1.1.19
-
- which-collection@1.0.1:
- dependencies:
- is-map: 2.0.2
- is-set: 2.0.2
- is-weakmap: 2.0.1
- is-weakset: 2.0.2
+ which-typed-array: 1.1.22
which-collection@1.0.2:
dependencies:
@@ -10354,83 +6006,37 @@ snapshots:
is-weakmap: 2.0.2
is-weakset: 2.0.4
- which-typed-array@1.1.14:
- dependencies:
- available-typed-arrays: 1.0.6
- call-bind: 1.0.7
- for-each: 0.3.3
- gopd: 1.0.1
- has-tostringtag: 1.0.2
-
- which-typed-array@1.1.19:
+ which-typed-array@1.1.22:
dependencies:
available-typed-arrays: 1.0.7
- call-bind: 1.0.8
+ call-bind: 1.0.9
call-bound: 1.0.4
for-each: 0.3.5
get-proto: 1.0.1
gopd: 1.2.0
has-tostringtag: 1.0.2
- which-typed-array@1.1.9:
- dependencies:
- available-typed-arrays: 1.0.5
- call-bind: 1.0.2
- for-each: 0.3.3
- gopd: 1.0.1
- has-tostringtag: 1.0.0
- is-typed-array: 1.1.10
-
which@2.0.2:
dependencies:
isexe: 2.0.0
- wrap-ansi@6.2.0:
- dependencies:
- ansi-styles: 4.3.0
- string-width: 4.2.3
- strip-ansi: 6.0.1
-
- wrap-ansi@7.0.0:
+ why-is-node-running@2.3.0:
dependencies:
- ansi-styles: 4.3.0
- string-width: 4.2.3
- strip-ansi: 6.0.1
+ siginfo: 2.0.0
+ stackback: 0.0.2
- wrappy@1.0.2: {}
-
- write-file-atomic@4.0.2:
- dependencies:
- imurmurhash: 0.1.4
- signal-exit: 3.0.7
+ word-wrap@1.2.5: {}
- xdg-basedir@4.0.0: {}
+ xml-name-validator@5.0.0: {}
- y18n@5.0.8: {}
+ xmlchars@2.2.0: {}
yallist@3.1.1: {}
- yallist@4.0.0: {}
-
- yaml@2.2.2: {}
-
- yargs-parser@21.1.1: {}
-
- yargs@17.6.2:
- dependencies:
- cliui: 8.0.1
- escalade: 3.1.1
- get-caller-file: 2.0.5
- require-directory: 2.1.1
- string-width: 4.2.3
- y18n: 5.0.8
- yargs-parser: 21.1.1
+ yocto-queue@0.1.0: {}
- yauzl@2.10.0:
+ zod-validation-error@4.0.2(zod@4.6.2):
dependencies:
- buffer-crc32: 0.2.13
- fd-slicer: 1.1.0
-
- yocto-queue@0.1.0: {}
+ zod: 4.6.2
- yocto-queue@1.0.0: {}
+ zod@4.6.2: {}
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
new file mode 100644
index 0000000..dd1b4fd
--- /dev/null
+++ b/pnpm-workspace.yaml
@@ -0,0 +1,3 @@
+allowBuilds:
+ sharp: true
+ unrs-resolver: true
diff --git a/postcss.config.js b/postcss.config.js
index 33ad091..483f378 100644
--- a/postcss.config.js
+++ b/postcss.config.js
@@ -1,6 +1,5 @@
module.exports = {
plugins: {
- tailwindcss: {},
- autoprefixer: {},
+ "@tailwindcss/postcss": {},
},
-}
+};
diff --git a/skills-lock.json b/skills-lock.json
new file mode 100644
index 0000000..8dd8a4e
--- /dev/null
+++ b/skills-lock.json
@@ -0,0 +1,24 @@
+{
+ "version": 1,
+ "skills": {
+ "next-cache-components-adoption": {
+ "source": "vercel/next.js",
+ "sourceType": "github",
+ "skillPath": "skills/next-cache-components-adoption/SKILL.md",
+ "computedHash": "e8048c51a37d8973349477c9bb0a32d9f5f796a70ebaa10c89b59ac8015b9c55"
+ },
+ "next-cache-components-optimizer": {
+ "source": "vercel/next.js",
+ "sourceType": "github",
+ "skillPath": "skills/next-cache-components-optimizer/SKILL.md",
+ "computedHash": "c62f6c13119c4e9027268edaa07291c33d74a676e1bd93583349c07efd990f6b"
+ },
+ "next-dev-loop": {
+ "source": "vercel/next.js",
+ "ref": "canary",
+ "sourceType": "github",
+ "skillPath": "skills/next-dev-loop/SKILL.md",
+ "computedHash": "9a2cd6e78f118086f3b2dc69ba98bb34b3fb873a8bcf622eea86a0fe8e540009"
+ }
+ }
+}
diff --git a/src/app/[[...product]]/page.tsx b/src/app/[[...product]]/page.tsx
index 405e91c..ffc1ccb 100644
--- a/src/app/[[...product]]/page.tsx
+++ b/src/app/[[...product]]/page.tsx
@@ -1,45 +1,59 @@
import type {Metadata} from "next";
+import {Suspense} from "react";
+
import api from "~/product/api";
import StoreScreen from "@/modules/store/screens/Store";
+import ProductSelection from "@/modules/product/components/ProductSelection";
-export const dynamic = "force-static";
-
-export const dynamicParams = false;
+type Props = Pick, "params">;
export async function generateStaticParams() {
const products = await api.list();
return [
// Build index for the home page...
- {product: undefined},
+ {product: []},
// ...and for each product
...products.map((product) => ({product: [product.id]})),
];
}
-export async function generateMetadata(props: {
- params: Promise<{product?: string[]}>;
-}): Promise {
- const params = await props.params;
+export async function generateMetadata({params}: Props): Promise {
+ const {product: segments} = await params;
+
+ if (!segments) return;
+
+ const product = await api.fetch(segments[0]);
+
+ return {
+ title: product.title,
+ description: product.description,
+ };
+}
+
+async function SelectedProduct({params}: Props) {
+ const {product: segments} = await params;
+
+ if (!segments) return null;
- if (params.product) {
- const product = await api.fetch(params.product[0]);
+ const product = await api.fetch(segments[0]);
- return {
- title: product.title,
- description: product.description,
- };
- }
+ return ;
}
-async function HomeAndProductPage(props: {params: Promise<{product?: string[]}>}) {
- const params = await props.params;
+async function HomeAndProductPage({params}: Props) {
const products = await api.list();
- const selected = params.product?.[0] ? await api.fetch(params.product[0]) : null;
- return ;
+ return (
+ <>
+
+
+
+
+ >
+ );
}
export default HomeAndProductPage;
diff --git a/src/app/globals.css b/src/app/globals.css
index 4e4c08c..4100d40 100644
--- a/src/app/globals.css
+++ b/src/app/globals.css
@@ -1,63 +1,146 @@
-@tailwind base;
-@tailwind components;
-@tailwind utilities;
+@import "tailwindcss";
+@custom-variant dark (&:where(.dark, .dark *));
-@layer base {
- :root {
- --background: 0 0% 100%;
- --foreground: 224 71.4% 4.1%;
- --card: 0 0% 100%;
- --card-foreground: 224 71.4% 4.1%;
- --popover: 0 0% 100%;
- --popover-foreground: 224 71.4% 4.1%;
- --primary: 220.9 39.3% 11%;
- --primary-foreground: 210 20% 98%;
- --secondary: 220 14.3% 95.9%;
- --secondary-foreground: 220.9 39.3% 11%;
- --incentive: 160 67% 45%;
- --incentive-foreground: 160 67% 45%;
- --muted: 220 14.3% 95.9%;
- --muted-foreground: 220 8.9% 46.1%;
- --accent: 220 14.3% 95.9%;
- --accent-foreground: 220.9 39.3% 11%;
- --destructive: 0 84.2% 60.2%;
- --destructive-foreground: 210 20% 98%;
- --border: 220 13% 91%;
- --input: 220 13% 91%;
- --ring: 224 71.4% 4.1%;
- --radius: 0.5rem;
- }
+@theme inline {
+ --font-heading: var(--font-sans);
- .dark {
- --background: 224 71.4% 4.1%;
- --foreground: 210 20% 98%;
- --card: 224 71.4% 4.1%;
- --card-foreground: 210 20% 98%;
- --popover: 224 71.4% 4.1%;
- --popover-foreground: 210 20% 98%;
- --primary: 210 20% 98%;
- --primary-foreground: 220.9 39.3% 11%;
- --secondary: 215 27.9% 16.9%;
- --secondary-foreground: 210 20% 98%;
- --incentive: 142 69% 58%;
- --incentive-foreground: 142 69% 58%;
- --muted: 215 27.9% 16.9%;
- --muted-foreground: 217.9 10.6% 64.9%;
- --accent: 215 27.9% 16.9%;
- --accent-foreground: 210 20% 98%;
- --destructive: 0 62.8% 30.6%;
- --destructive-foreground: 210 20% 98%;
- --border: 215 27.9% 16.9%;
- --input: 215 27.9% 16.9%;
- --ring: 216 12.2% 83.9%;
- }
+ --color-brand-50: var(--color-teal-50);
+ --color-brand-100: var(--color-teal-100);
+ --color-brand-200: var(--color-teal-200);
+ --color-brand-300: var(--color-teal-300);
+ --color-brand-400: var(--color-teal-400);
+ --color-brand-500: var(--color-teal-500);
+ --color-brand-600: var(--color-teal-600);
+ --color-brand-700: var(--color-teal-700);
+ --color-brand-800: var(--color-teal-800);
+ --color-brand-900: var(--color-teal-900);
+ --color-brand-950: var(--color-teal-950);
+
+ --color-background: var(--background);
+ --color-foreground: var(--foreground);
+ --color-card: var(--card);
+ --color-card-foreground: var(--card-foreground);
+ --color-popover: var(--popover);
+ --color-popover-foreground: var(--popover-foreground);
+ --color-primary: var(--primary);
+ --color-primary-foreground: var(--primary-foreground);
+ --color-secondary: var(--secondary);
+ --color-secondary-foreground: var(--secondary-foreground);
+ --color-incentive: var(--incentive);
+ --color-incentive-foreground: var(--incentive-foreground);
+ --color-muted: var(--muted);
+ --color-muted-foreground: var(--muted-foreground);
+ --color-accent: var(--accent);
+ --color-accent-foreground: var(--accent-foreground);
+ --color-destructive: var(--destructive);
+ --color-destructive-foreground: var(--destructive-foreground);
+ --color-border: var(--border);
+ --color-input: var(--input);
+ --color-ring: var(--ring);
+ --color-chart-1: var(--chart-1);
+ --color-chart-2: var(--chart-2);
+ --color-chart-3: var(--chart-3);
+ --color-chart-4: var(--chart-4);
+ --color-chart-5: var(--chart-5);
+ --color-sidebar: var(--sidebar);
+ --color-sidebar-foreground: var(--sidebar-foreground);
+ --color-sidebar-primary: var(--sidebar-primary);
+ --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
+ --color-sidebar-accent: var(--sidebar-accent);
+ --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
+ --color-sidebar-border: var(--sidebar-border);
+ --color-sidebar-ring: var(--sidebar-ring);
+
+ --radius-sm: calc(var(--radius) * 0.6);
+ --radius-md: calc(var(--radius) * 0.8);
+ --radius-lg: var(--radius);
+ --radius-xl: calc(var(--radius) * 1.4);
+ --radius-2xl: calc(var(--radius) * 1.8);
+ --radius-3xl: calc(var(--radius) * 2.2);
+ --radius-4xl: calc(var(--radius) * 2.6);
+}
+
+:root {
+ --background: oklch(1 0 0);
+ --foreground: oklch(0.12945 0.02728 261.671);
+ --card: oklch(1 0 0);
+ --card-foreground: oklch(0.12945 0.02728 261.671);
+ --popover: oklch(1 0 0);
+ --popover-foreground: oklch(0.12945 0.02728 261.671);
+ --primary: oklch(0.21028 0.03182 264.652);
+ --primary-foreground: oklch(0.98432 0.00174 247.839);
+ --secondary: oklch(0.9671 0.00286 264.542);
+ --secondary-foreground: oklch(0.21028 0.03182 264.652);
+ --incentive: oklch(0.71826 0.14375 164.472);
+ --incentive-foreground: oklch(0.71826 0.14375 164.472);
+ --muted: oklch(0.9671 0.00286 264.542);
+ --muted-foreground: oklch(0.55125 0.02327 264.365);
+ --accent: oklch(0.9671 0.00286 264.542);
+ --accent-foreground: oklch(0.21028 0.03182 264.652);
+ --destructive: oklch(0.63683 0.20776 25.326);
+ --destructive-foreground: oklch(0.98432 0.00174 247.839);
+ --border: oklch(0.92775 0.00578 264.531);
+ --input: oklch(0.92775 0.00578 264.531);
+ --ring: oklch(0.12945 0.02728 261.671);
+ --chart-1: oklch(0.6 0.118 184.704);
+ --chart-2: oklch(0.511 0.096 186.391);
+ --chart-3: oklch(0.704 0.14 182.503);
+ --chart-4: oklch(0.437 0.078 188.216);
+ --chart-5: oklch(0.777 0.152 181.912);
+ --radius: 0.5rem;
+ --sidebar: oklch(0.98432 0.00174 247.839);
+ --sidebar-foreground: oklch(0.12945 0.02728 261.671);
+ --sidebar-primary: oklch(0.21028 0.03182 264.652);
+ --sidebar-primary-foreground: oklch(0.98432 0.00174 247.839);
+ --sidebar-accent: oklch(0.9671 0.00286 264.542);
+ --sidebar-accent-foreground: oklch(0.21028 0.03182 264.652);
+ --sidebar-border: oklch(0.92775 0.00578 264.531);
+ --sidebar-ring: oklch(0.12945 0.02728 261.671);
+}
+
+.dark {
+ --background: oklch(0.12945 0.02728 261.671);
+ --foreground: oklch(0.98432 0.00174 247.839);
+ --card: oklch(0.12945 0.02728 261.671);
+ --card-foreground: oklch(0.98432 0.00174 247.839);
+ --popover: oklch(0.12945 0.02728 261.671);
+ --popover-foreground: oklch(0.98432 0.00174 247.839);
+ --primary: oklch(0.98432 0.00174 247.839);
+ --primary-foreground: oklch(0.21028 0.03182 264.652);
+ --secondary: oklch(0.27845 0.02964 256.848);
+ --secondary-foreground: oklch(0.98432 0.00174 247.839);
+ --incentive: oklch(0.79988 0.18163 151.78);
+ --incentive-foreground: oklch(0.79988 0.18163 151.78);
+ --muted: oklch(0.27845 0.02964 256.848);
+ --muted-foreground: oklch(0.71365 0.01915 261.333);
+ --accent: oklch(0.27845 0.02964 256.848);
+ --accent-foreground: oklch(0.98432 0.00174 247.839);
+ --destructive: oklch(0.39594 0.13308 25.721);
+ --destructive-foreground: oklch(0.98432 0.00174 247.839);
+ --border: oklch(0.27845 0.02964 256.848);
+ --input: oklch(0.27845 0.02964 256.848);
+ --ring: oklch(0.8715 0.00936 258.338);
+ --chart-1: oklch(0.777 0.152 181.912);
+ --chart-2: oklch(0.704 0.14 182.503);
+ --chart-3: oklch(0.6 0.118 184.704);
+ --chart-4: oklch(0.511 0.096 186.391);
+ --chart-5: oklch(0.437 0.078 188.216);
+ --sidebar: oklch(0.21028 0.03182 264.652);
+ --sidebar-foreground: oklch(0.98432 0.00174 247.839);
+ --sidebar-primary: oklch(0.98432 0.00174 247.839);
+ --sidebar-primary-foreground: oklch(0.21028 0.03182 264.652);
+ --sidebar-accent: oklch(0.27845 0.02964 256.848);
+ --sidebar-accent-foreground: oklch(0.98432 0.00174 247.839);
+ --sidebar-border: oklch(0.27845 0.02964 256.848);
+ --sidebar-ring: oklch(0.8715 0.00936 258.338);
}
@layer base {
* {
- @apply border-border;
+ @apply border-border outline-ring/50;
}
+
body {
@apply bg-background text-foreground;
}
diff --git a/src/app/layout.tsx b/src/app/layout.tsx
index bd5d8dd..4a566ce 100644
--- a/src/app/layout.tsx
+++ b/src/app/layout.tsx
@@ -22,7 +22,7 @@ export async function generateMetadata(): Promise {
};
}
-const RootLayout = async ({children}: {children: React.ReactNode}) => {
+async function RootLayout({children}: {children: React.ReactNode}) {
const store = await api.fetch();
return (
@@ -30,7 +30,7 @@ const RootLayout = async ({children}: {children: React.ReactNode}) => {
-
+
{
@@ -51,7 +51,7 @@ const RootLayout = async ({children}: {children: React.ReactNode}) => {
{store.subtitle}
- {store.instagram ? (
+ {Boolean(store.instagram) && (
{
- ) : null}
- {store.whatsapp ? (
+ )}
+ {Boolean(store.whatsapp) && (
{
- ) : null}
+ )}
@@ -85,7 +85,7 @@ const RootLayout = async ({children}: {children: React.ReactNode}) => {
{/* Inicio de copyright - Cambiar el contenido de los mismos viola el contenido de los terminos de licencia */}
- © Copyright {new Date().getFullYear()}. Hecho con y Next.js, por{" "}
+ Hecho con y Next.js, por{" "}
svg~*]:pl-7 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground",
+ "group/alert relative grid w-full gap-0.5 rounded-lg border px-2.5 py-2 text-left text-sm has-data-[slot=alert-action]:relative has-data-[slot=alert-action]:pr-18 has-[>svg]:grid-cols-[auto_1fr] has-[>svg]:gap-x-2 *:[svg]:row-span-2 *:[svg]:translate-y-0.5 *:[svg]:text-current *:[svg:not([class*='size-'])]:size-4",
{
variants: {
variant: {
- default: "bg-background text-foreground",
+ default: "bg-card text-card-foreground",
destructive:
- "border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive",
+ "bg-card text-destructive *:data-[slot=alert-description]:text-destructive/90 *:[svg]:text-current",
},
},
defaultVariants: {
@@ -19,34 +19,51 @@ const alertVariants = cva(
},
);
-const Alert = React.forwardRef<
- HTMLDivElement,
- React.HTMLAttributes & VariantProps
->(({className, variant, ...props}, ref) => (
-
-));
-
-Alert.displayName = "Alert";
-
-const AlertTitle = React.forwardRef>(
- ({className, ...props}, ref) => (
- & VariantProps) {
+ return (
+
- ),
-);
+ );
+}
-AlertTitle.displayName = "AlertTitle";
+function AlertTitle({className, ...props}: React.ComponentProps<"div">) {
+ return (
+ svg]/alert:col-start-2 [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground",
+ className,
+ )}
+ data-slot="alert-title"
+ {...props}
+ />
+ );
+}
-const AlertDescription = React.forwardRef<
- HTMLParagraphElement,
- React.HTMLAttributes
->(({className, ...props}, ref) => (
-
-));
+function AlertDescription({className, ...props}: React.ComponentProps<"div">) {
+ return (
+
+ );
+}
-AlertDescription.displayName = "AlertDescription";
+function AlertAction({className, ...props}: React.ComponentProps<"div">) {
+ return (
+
+ );
+}
-export {Alert, AlertTitle, AlertDescription};
+export {Alert, AlertTitle, AlertDescription, AlertAction};
diff --git a/src/components/ui/button.tsx b/src/components/ui/button.tsx
index e15b5d0..8419291 100644
--- a/src/components/ui/button.tsx
+++ b/src/components/ui/button.tsx
@@ -1,27 +1,34 @@
-import * as React from "react";
-import {Slot} from "@radix-ui/react-slot";
+import {Button as ButtonPrimitive} from "@base-ui/react/button";
import {cva, type VariantProps} from "class-variance-authority";
-
import {cn} from "@/lib/utils";
const buttonVariants = cva(
- "inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",
+ "group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
{
variants: {
variant: {
brand: "bg-brand-500 hover:bg-brand-600 text-white/90",
- default: "bg-primary text-primary-foreground hover:bg-primary/90",
- destructive: "bg-destructive text-destructive-foreground hover:bg-destructive/90",
- outline: "border border-input bg-background hover:bg-accent hover:text-accent-foreground",
- secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
- ghost: "hover:bg-accent hover:text-accent-foreground",
+ default: "bg-primary text-primary-foreground hover:bg-primary/80",
+ outline:
+ "border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",
+ secondary:
+ "bg-secondary text-secondary-foreground hover:bg-[color-mix(in_oklch,var(--secondary),var(--foreground)_5%)] aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",
+ ghost:
+ "hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",
+ destructive:
+ "bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",
link: "text-primary underline-offset-4 hover:underline",
},
size: {
- default: "h-10 px-4 py-2",
- sm: "h-9 rounded-md px-3",
- lg: "h-11 rounded-md px-8 text-md",
- icon: "h-10 w-10",
+ default: "h-10 gap-1.5 px-4 py-2",
+ xs: "h-6 gap-1 rounded-md px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",
+ sm: "h-7 gap-1 rounded-md px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",
+ lg: "h-11 gap-1.5 px-8 text-base",
+ icon: "size-8",
+ "icon-xs":
+ "size-6 rounded-md in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3",
+ "icon-sm": "size-7 rounded-md in-data-[slot=button-group]:rounded-lg",
+ "icon-lg": "size-9",
},
},
defaultVariants: {
@@ -31,20 +38,19 @@ const buttonVariants = cva(
},
);
-export interface ButtonProps
- extends React.ButtonHTMLAttributes,
- VariantProps {
- asChild?: boolean;
+function Button({
+ className,
+ variant = "default",
+ size = "default",
+ ...props
+}: ButtonPrimitive.Props & VariantProps) {
+ return (
+
+ );
}
-const Button = React.forwardRef(
- ({className, variant, size, asChild = false, ...props}, ref) => {
- const Comp = asChild ? Slot : "button";
-
- return ;
- },
-);
-
-Button.displayName = "Button";
-
export {Button, buttonVariants};
diff --git a/src/components/ui/input.tsx b/src/components/ui/input.tsx
index b27659b..3d04881 100644
--- a/src/components/ui/input.tsx
+++ b/src/components/ui/input.tsx
@@ -1,23 +1,20 @@
-import * as React from "react";
+import type * as React from "react";
+import {Input as InputPrimitive} from "@base-ui/react/input";
import {cn} from "@/lib/utils";
-export type InputProps = React.InputHTMLAttributes;
-
-const Input = React.forwardRef(({className, type, ...props}, ref) => {
+function Input({className, type, ...props}: React.ComponentProps<"input">) {
return (
-
);
-});
-
-Input.displayName = "Input";
+}
export {Input};
diff --git a/src/components/ui/label.tsx b/src/components/ui/label.tsx
index 515f246..2b4ec5a 100644
--- a/src/components/ui/label.tsx
+++ b/src/components/ui/label.tsx
@@ -1,22 +1,23 @@
"use client";
-import * as React from "react";
-import * as LabelPrimitive from "@radix-ui/react-label";
-import {cva, type VariantProps} from "class-variance-authority";
+import type * as React from "react";
import {cn} from "@/lib/utils";
-const labelVariants = cva(
- "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70",
-);
-
-const Label = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef & VariantProps
->(({className, ...props}, ref) => (
-
-));
-
-Label.displayName = LabelPrimitive.Root.displayName;
+function Label({className, htmlFor, children, ...props}: React.ComponentProps<"label">) {
+ return (
+
+ {children}
+
+ );
+}
export {Label};
diff --git a/src/components/ui/radio-group.tsx b/src/components/ui/radio-group.tsx
index 25c7c40..6c5c97c 100644
--- a/src/components/ui/radio-group.tsx
+++ b/src/components/ui/radio-group.tsx
@@ -1,41 +1,36 @@
"use client";
-import * as React from "react";
-import * as RadioGroupPrimitive from "@radix-ui/react-radio-group";
-import {CircleIcon} from "lucide-react";
-
+import {Radio as RadioPrimitive} from "@base-ui/react/radio";
+import {RadioGroup as RadioGroupPrimitive} from "@base-ui/react/radio-group";
import {cn} from "@/lib/utils";
-function RadioGroup({className, ...props}: React.ComponentProps) {
+function RadioGroup({className, ...props}: RadioGroupPrimitive.Props) {
return (
-
);
}
-function RadioGroupItem({
- className,
- ...props
-}: React.ComponentProps) {
+function RadioGroupItem({className, ...props}: RadioPrimitive.Root.Props) {
return (
-
-
-
-
-
+
+
+
);
}
diff --git a/src/components/ui/sheet.tsx b/src/components/ui/sheet.tsx
index 985c9d4..d3df767 100644
--- a/src/components/ui/sheet.tsx
+++ b/src/components/ui/sheet.tsx
@@ -1,125 +1,117 @@
"use client";
-import * as React from "react";
-import * as SheetPrimitive from "@radix-ui/react-dialog";
-import {cva, type VariantProps} from "class-variance-authority";
-import dynamic from "next/dynamic";
+import type * as React from "react";
+import {Dialog as SheetPrimitive} from "@base-ui/react/dialog";
import {cn} from "@/lib/utils";
+import {XIcon} from "lucide-react";
-const Sheet = SheetPrimitive.Root;
+import {Button} from "@/components/ui/button";
-const SheetTrigger = SheetPrimitive.Trigger;
+function Sheet({...props}: SheetPrimitive.Root.Props) {
+ return ;
+}
-const SheetClose = SheetPrimitive.Close;
+function SheetTrigger({...props}: SheetPrimitive.Trigger.Props) {
+ return ;
+}
-const SheetPortal = SheetPrimitive.Portal;
+function SheetClose({...props}: SheetPrimitive.Close.Props) {
+ return ;
+}
-type SheetOverlayProps = React.ComponentPropsWithoutRef;
+function SheetPortal({...props}: SheetPrimitive.Portal.Props) {
+ return ;
+}
-function SheetOverlay({className, ...props}: SheetOverlayProps) {
+function SheetOverlay({className, ...props}: SheetPrimitive.Backdrop.Props) {
return (
-
);
}
-SheetOverlay.displayName = SheetPrimitive.Overlay.displayName;
-
-const sheetVariants = cva(
- "fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500",
- {
- variants: {
- side: {
- top: "inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top",
- bottom:
- "inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom",
- left: "inset-y-0 left-0 h-full w-full sm:w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-lg",
- right:
- "inset-y-0 right-0 h-full w-full sm:w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-lg",
- },
- },
- defaultVariants: {
- side: "right",
- },
- },
-);
-
-interface SheetContentProps
- extends React.ComponentPropsWithoutRef,
- VariantProps {}
-
-const SheetContent = dynamic(
- // eslint-disable-next-line @typescript-eslint/require-await
- async () =>
- // eslint-disable-next-line react/display-name
- function ({side = "right", className, children, ...props}: SheetContentProps) {
- return (
-
-
-
- {children}
-
-
- );
- },
- {ssr: false},
-);
-
-SheetContent.displayName = SheetPrimitive.Content.displayName;
+function SheetContent({
+ className,
+ children,
+ side = "right",
+ showCloseButton = true,
+ ...props
+}: SheetPrimitive.Popup.Props & {
+ side?: "top" | "right" | "bottom" | "left";
+ showCloseButton?: boolean;
+}) {
+ return (
+
+
+
+ {children}
+ {Boolean(showCloseButton) && (
+ }
+ >
+
+ Close
+
+ )}
+
+
+ );
+}
-function SheetHeader({className, ...props}: React.HTMLAttributes) {
+function SheetHeader({className, ...props}: React.ComponentProps<"div">) {
return (
-
+
);
}
-SheetHeader.displayName = "SheetHeader";
-function SheetFooter({className, ...props}: React.HTMLAttributes) {
+function SheetFooter({className, ...props}: React.ComponentProps<"div">) {
return (
);
}
-SheetFooter.displayName = "SheetFooter";
-
-type SheetTitleProps = React.ComponentPropsWithoutRef;
-function SheetTitle({className, ...props}: SheetTitleProps) {
+function SheetTitle({className, ...props}: SheetPrimitive.Title.Props) {
return (
);
}
-SheetTitle.displayName = SheetPrimitive.Title.displayName;
-
-type SheetDescriptionProps = React.ComponentPropsWithoutRef;
-
-function SheetDescription({className, ...props}: SheetDescriptionProps) {
+function SheetDescription({className, ...props}: SheetPrimitive.Description.Props) {
return (
);
}
-SheetDescription.displayName = SheetPrimitive.Description.displayName;
-
export {
Sheet,
- SheetPortal,
- SheetOverlay,
SheetTrigger,
SheetClose,
SheetContent,
diff --git a/src/components/ui/skeleton.tsx b/src/components/ui/skeleton.tsx
index 0fd0b39..3ceae21 100644
--- a/src/components/ui/skeleton.tsx
+++ b/src/components/ui/skeleton.tsx
@@ -1,7 +1,13 @@
import {cn} from "@/lib/utils";
-function Skeleton({className, ...props}: React.HTMLAttributes) {
- return
;
+function Skeleton({className, ...props}: React.ComponentProps<"div">) {
+ return (
+
+ );
}
export {Skeleton};
diff --git a/src/components/ui/toggle.tsx b/src/components/ui/toggle.tsx
index 923d2ed..e57b88c 100644
--- a/src/components/ui/toggle.tsx
+++ b/src/components/ui/toggle.tsx
@@ -1,23 +1,22 @@
"use client";
-import * as React from "react";
-import * as TogglePrimitive from "@radix-ui/react-toggle";
+import {Toggle as TogglePrimitive} from "@base-ui/react/toggle";
import {cva, type VariantProps} from "class-variance-authority";
-
import {cn} from "@/lib/utils";
const toggleVariants = cva(
- "inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-background transition-colors hover:bg-muted hover:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground",
+ "group/toggle inline-flex items-center justify-center gap-1 rounded-lg text-sm font-medium whitespace-nowrap transition-all outline-none hover:bg-muted hover:text-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 aria-pressed:bg-muted data-[state=on]:bg-muted dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
{
variants: {
variant: {
default: "bg-transparent",
- outline: "border border-input bg-transparent hover:bg-accent hover:text-accent-foreground",
+ outline: "border border-input bg-transparent hover:bg-muted",
},
size: {
- default: "h-10 px-3",
- sm: "h-9 px-2.5",
- lg: "h-11 px-5",
+ default:
+ "h-8 min-w-8 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",
+ sm: "h-7 min-w-7 rounded-md px-2.5 text-[0.8rem] has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",
+ lg: "h-9 min-w-9 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",
},
},
defaultVariants: {
@@ -27,17 +26,19 @@ const toggleVariants = cva(
},
);
-const Toggle = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef & VariantProps
->(({className, variant, size, ...props}, ref) => (
-
-));
-
-Toggle.displayName = TogglePrimitive.Root.displayName;
+function Toggle({
+ className,
+ variant = "default",
+ size = "default",
+ ...props
+}: TogglePrimitive.Props & VariantProps) {
+ return (
+
+ );
+}
export {Toggle, toggleVariants};
diff --git a/src/lib/utils.ts b/src/lib/utils.ts
index c713d7f..97a48be 100644
--- a/src/lib/utils.ts
+++ b/src/lib/utils.ts
@@ -1,6 +1 @@
-import {type ClassValue, clsx} from "clsx";
-import {twMerge} from "tailwind-merge";
-
-export function cn(...inputs: ClassValue[]) {
- return twMerge(clsx(inputs));
-}
+export {cn} from "cn";
diff --git a/src/modules/cart/__tests__/utils.test.ts b/src/modules/cart/__tests__/utils.test.ts
index 994188c..868f307 100644
--- a/src/modules/cart/__tests__/utils.test.ts
+++ b/src/modules/cart/__tests__/utils.test.ts
@@ -1,5 +1,7 @@
import type {CartItem} from "../types";
+import {describe, expect, it} from "vitest";
+
import {getCartItemOptionsSummary, getCartItemPrice, getCartMessage, getCartTotal} from "../utils";
const item: CartItem = {
@@ -121,8 +123,8 @@ describe("getCartTotal", () => {
it("debería devolver el precio correcto cuando hay más de una unidad", () => {
const cart = new Map();
- cart.set(Date.now(), item);
- cart.set(Date.now(), item);
+ cart.set(1, item);
+ cart.set(2, item);
const actual = getCartTotal(cart);
const expected = 200;
@@ -190,6 +192,8 @@ describe("getCartMessage", () => {
const actual: string = getCartMessage(cart, checkout);
const expected = `* title - $\u00a0100,00
+* Forma de pago: Efectivo
+
Total: $\u00a0100,00`;
expect(actual).toEqual(expected);
@@ -230,6 +234,8 @@ Total: $\u00a0100,00`;
const actual: string = getCartMessage(cart, checkout);
const expected = `* title [Peso: Medio kilo, Calidad: Alta] - $\u00a0200,00
+* Forma de pago: Efectivo
+
Total: $\u00a0200,00`;
expect(actual).toEqual(expected);
diff --git a/src/modules/cart/api.ts b/src/modules/cart/api.ts
index cdeec1c..d3dae9b 100644
--- a/src/modules/cart/api.ts
+++ b/src/modules/cart/api.ts
@@ -1,6 +1,7 @@
-import type {Field as IField, RadioField, TextField} from "./types";
+import type {Field as IField} from "./types";
import Papa from "papaparse";
+import {cacheLife, cacheTag} from "next/cache";
interface RawField {
title: string;
@@ -20,7 +21,7 @@ function normalize(data: RawField[]): IField[] {
required: field.required,
note: field.note || "",
type: "radio",
- } as RadioField;
+ };
case "text":
return {
@@ -29,19 +30,30 @@ function normalize(data: RawField[]): IField[] {
required: field.required,
note: field.note || "",
type: "text",
- } as TextField;
+ };
default: {
throw new Error("Unknown field type");
}
}
- }, []);
+ });
}
export default {
field: {
list: async (): Promise => {
- return fetch(process.env.FIELDS!, {next: {tags: ["fields"]}}).then(async (response) => {
+ "use cache";
+
+ cacheLife("max");
+ cacheTag("fields");
+
+ if (process.env.USE_MOCKS === "true") {
+ return import("./mocks/default.json").then((result) =>
+ normalize(result.default as RawField[]),
+ );
+ }
+
+ return fetch(process.env.FIELDS!).then(async (response) => {
const csv = await response.text();
return new Promise((resolve, reject) => {
@@ -58,10 +70,4 @@ export default {
});
},
},
- mock: {
- list: (mock: string): Promise =>
- import(`./mocks/${mock}.json`).then((result: {default: RawField[]}) =>
- normalize(result.default),
- ),
- },
};
diff --git a/src/modules/cart/components/CartDrawer/CartDrawer.tsx b/src/modules/cart/components/CartDrawer/CartDrawer.tsx
index 59549f3..c990bac 100644
--- a/src/modules/cart/components/CartDrawer/CartDrawer.tsx
+++ b/src/modules/cart/components/CartDrawer/CartDrawer.tsx
@@ -13,7 +13,7 @@ import {
SheetHeader,
SheetTitle,
} from "@/components/ui/sheet";
-import {Button} from "@/components/ui/button";
+import {Button, buttonVariants} from "@/components/ui/button";
import WhatsappIcon from "@/components/icons/whatsapp";
import {useCart} from "../../context/client";
@@ -56,9 +56,12 @@ function CartDrawer({
return (
!_isOpen && onClose()} {...props}>
-
+
-
+
Tu pedido
@@ -66,13 +69,13 @@ function CartDrawer({
{currentStep === "details" && }
- {fields && currentStep === "fields" ? (
-
- ) : null}
+ {Boolean(fields) && currentStep === "fields" && (
+
+ )}
- {fields && currentStep === "details" ? (
+ {Boolean(fields) && currentStep === "details" && (
@@ -91,7 +94,7 @@ function CartDrawer({
Continuar
- ) : null}
+ )}
{(currentStep === "fields" || !fields) && (
)}
diff --git a/src/modules/cart/components/CartDrawer/Details.tsx b/src/modules/cart/components/CartDrawer/Details.tsx
index af99dec..7417f43 100644
--- a/src/modules/cart/components/CartDrawer/Details.tsx
+++ b/src/modules/cart/components/CartDrawer/Details.tsx
@@ -21,7 +21,7 @@ function Details({cart, onChange}: {cart: Cart; onChange: (id: number, item: Car
{getCartItemOptionsSummary(item.options)}
)}
-
+
{parseCurrency(getCartItemPrice(item))}
@@ -36,7 +36,7 @@ function Details({cart, onChange}: {cart: Cart; onChange: (id: number, item: Car
>
-
+
{item.quantity}
+ onChange(String(value))}>
{options.map((option) => (
@@ -81,7 +81,7 @@ function Fields({
}}
/>
)}
- {field.note ?
{field.note} : null}
+ {Boolean(field.note) &&
{field.note} }
))}
diff --git a/src/modules/cart/components/CartDrawer/__tests__/CartDrawer.test.tsx b/src/modules/cart/components/CartDrawer/__tests__/CartDrawer.test.tsx
index f265691..21032ed 100644
--- a/src/modules/cart/components/CartDrawer/__tests__/CartDrawer.test.tsx
+++ b/src/modules/cart/components/CartDrawer/__tests__/CartDrawer.test.tsx
@@ -1,85 +1,68 @@
import type {CartItem} from "../../../types";
-import * as React from "react";
-import {render, screen, within} from "@testing-library/react";
+import {render, screen} from "@testing-library/react";
+import userEvent from "@testing-library/user-event";
+import {expect, test} from "vitest";
-import CartDrawer from "../CartDrawer";
-import * as cartContext from "../../../context/client";
+import store from "~/store/mocks/default.json";
-jest.mock("../../../context");
+import CartProviderClient, {useCart} from "../../../context/client";
-const cartItem: CartItem = {
+const item: CartItem = {
id: "id",
- image: "image",
+ image: "",
price: 100,
- title: "title",
- category: "category",
- description: "description",
+ title: "Hamburguesa",
+ category: "Comidas",
+ description: "Con queso",
quantity: 2,
};
-test("deberia mostrar la cantidad de productos en un item en el detalle", () => {
- const cart = new Map([[cartItem.id, cartItem]]);
-
- jest.spyOn(cartContext, "useCart").mockReturnValue([{cart}, {}]);
-
- render( );
-
- expect(screen.getByTestId("quantity")).toHaveTextContent(String(cartItem.quantity));
+function AddItem() {
+ const [, {addItem}] = useCart();
+
+ return (
+ addItem(1, item)}>
+ Agregar
+
+ );
+}
+
+async function openCart() {
+ const user = userEvent.setup();
+
+ render(
+
+
+ ,
+ );
+ await user.click(screen.getByRole("button", {name: "Agregar"}));
+ await user.click(screen.getByRole("button", {name: "Ver pedido"}));
+
+ return user;
+}
+
+test("actualiza la cantidad y elimina el último producto", async () => {
+ const user = await openCart();
+
+ expect(screen.getByTestId("quantity")).toHaveTextContent("2");
+ await user.click(screen.getByTestId("increment"));
+ expect(screen.getByTestId("quantity")).toHaveTextContent("3");
+ await user.click(screen.getByTestId("decrement"));
+ await user.click(screen.getByTestId("decrement"));
+ await user.click(screen.getByTestId("decrement"));
+ expect(screen.queryByRole("dialog")).not.toBeInTheDocument();
+ expect(screen.queryByRole("button", {name: "Ver pedido"})).not.toBeInTheDocument();
});
-test("deberia mostrar la cantidad de productos en el detalle", () => {
- const cart = new Map([[cartItem.id, cartItem]]);
+test("incluye la cantidad y el total en el enlace de WhatsApp", async () => {
+ const user = await openCart();
- jest.spyOn(cartContext, "useCart").mockReturnValue([{cart}, {}]);
+ await user.click(screen.getByTestId("continue-order"));
+ const link = screen.getByRole("link", {name: "Completar pedido"});
+ const url = new URL(link.getAttribute("href")!);
- render( );
-
- const item = screen.getByTestId(`cart-item-${cartItem.id}`);
- const quantityElement = within(item).getByTestId("quantity");
- const quantity = within(quantityElement).getByText(String(cartItem.quantity));
-
- expect(quantity).toBeInTheDocument();
+ expect(url.hostname).toBe("wa.me");
+ expect(url.searchParams.get("text")).toContain("Hamburguesa (X2)");
+ expect(url.searchParams.get("text")).toContain("200,00");
});
-
-// test("deberia llamar a onDecrement cuando resto un producto", () => {
-// const onDecrement = jest.fn();
-
-// render( );
-
-// fireEvent.click(screen.getByTestId("decrement"));
-
-// expect(onDecrement).toHaveBeenCalled();
-// });
-
-// test("deberia llamar a onIncrement cuando incremento un producto", () => {
-// const onIncrement = jest.fn();
-
-// render( );
-
-// fireEvent.click(screen.getByTestId("increment"));
-
-// expect(onIncrement).toHaveBeenCalled();
-// });
-
-// test("deberia mostrar la cantidad de productos en el mensaje de whatsapp si es uno", () => {
-// render( );
-
-// const link = screen.getByTestId("complete-order");
-
-// expect(link.getAttribute("href")).not.toMatch(`(X${String(cartItem.quantity)})`);
-// });
-
-// test("no deberia mostrar la cantidad de productos en el mensaje de whatsapp si es uno", () => {
-// render( );
-
-// const link = screen.getByTestId("complete-order");
-
-// expect(link.getAttribute("href")).not.toMatch(`(X${String(cartItem.quantity)})`);
-// });
-
-// test("muestro un mensaje de que no hay items cuando el product esta vacio", () => {
-// render( );
-
-// expect(screen.getByText("No hay elementos en tu carrito")).toBeInTheDocument();
-// });
diff --git a/src/modules/cart/components/CartItemDrawer.tsx b/src/modules/cart/components/CartItemDrawer.tsx
index 4c0054a..d0b9f9b 100644
--- a/src/modules/cart/components/CartItemDrawer.tsx
+++ b/src/modules/cart/components/CartItemDrawer.tsx
@@ -52,10 +52,21 @@ function CartItemDrawer({
}
return (
- !isOpen && onClose()} {...props}>
-
+ {
+ if (!isOpen) {
+ setFormData({...item, options: {}});
+ onClose();
+ }
+ }}
+ {...props}
+ >
+
-
+
@@ -69,7 +80,7 @@ function CartItemDrawer({
{Boolean(item.image) && (
)}
@@ -84,16 +95,22 @@ function CartItemDrawer({
return (
{category.title}
-
+ {
+ const option = category.options.find((option) => option.title === value);
+
+ if (option) handleSelectOption(option);
+ }}
+ >
{category.options.map((option) => (
{
- handleSelectOption(option);
- }}
/>
@@ -135,6 +152,7 @@ function CartItemDrawer({
variant="brand"
onClick={() => {
onSubmit(formData);
+ setFormData({...item, options: {}});
}}
>
Agregar al pedido
diff --git a/src/modules/cart/components/__tests__/CartItemDrawer.test.tsx b/src/modules/cart/components/__tests__/CartItemDrawer.test.tsx
new file mode 100644
index 0000000..762b710
--- /dev/null
+++ b/src/modules/cart/components/__tests__/CartItemDrawer.test.tsx
@@ -0,0 +1,50 @@
+import type {CartItem} from "../../types";
+
+import {render, screen} from "@testing-library/react";
+import userEvent from "@testing-library/user-event";
+import {expect, test, vi} from "vitest";
+
+import CartItemDrawer from "../CartItemDrawer";
+
+const item: CartItem = {
+ id: "hamburguesa",
+ title: "Hamburguesa",
+ description: "Con queso",
+ category: "Comidas",
+ image: "",
+ price: 1000,
+ quantity: 1,
+ options: {
+ Tamaño: [
+ {id: "simple", title: "Simple", category: "Tamaño", image: "", description: "", price: 0},
+ {id: "doble", title: "Doble", category: "Tamaño", image: "", description: "", price: 500},
+ ],
+ },
+};
+
+test("actualiza el precio y el pedido al elegir opciones con el teclado", async () => {
+ const user = userEvent.setup();
+ const onSubmit = vi.fn();
+
+ render(
);
+ await user.click(screen.getByRole("radio", {name: "Simple"}));
+ await user.keyboard("{ArrowDown}");
+
+ expect(screen.getByRole("radio", {name: /Doble/})).toBeChecked();
+ expect(screen.getByText(/1.500,00/)).toBeVisible();
+
+ await user.click(screen.getByRole("button", {name: "Agregar al pedido"}));
+
+ expect(onSubmit).toHaveBeenCalledWith({...item, options: {Tamaño: [item.options!.Tamaño[1]]}});
+});
+
+test("cierra el selector con Escape", async () => {
+ const user = userEvent.setup();
+ const onClose = vi.fn();
+
+ render(
);
+
+ await user.keyboard("{Escape}");
+
+ expect(onClose).toHaveBeenCalledOnce();
+});
diff --git a/src/modules/cart/context/index.tsx b/src/modules/cart/context/index.tsx
index 0843744..da8fd57 100644
--- a/src/modules/cart/context/index.tsx
+++ b/src/modules/cart/context/index.tsx
@@ -4,7 +4,7 @@ import cartApi from "../api";
import CartProviderClient from "./client";
-const CartProvider = async ({children}: {children: React.ReactNode}) => {
+async function CartProvider({children}: {children: React.ReactNode}) {
const fields = await cartApi.field.list();
const store = await storeApi.fetch();
@@ -13,6 +13,6 @@ const CartProvider = async ({children}: {children: React.ReactNode}) => {
{children}
);
-};
+}
export default CartProvider;
diff --git a/src/modules/currency/__tests__/utils.test.ts b/src/modules/currency/__tests__/utils.test.ts
index 2eb0fb5..db8d43e 100644
--- a/src/modules/currency/__tests__/utils.test.ts
+++ b/src/modules/currency/__tests__/utils.test.ts
@@ -1,3 +1,5 @@
+import {describe, expect, it} from "vitest";
+
import {parseCurrency} from "../utils";
describe("currency", () => {
diff --git a/src/modules/product/api.ts b/src/modules/product/api.ts
index 88581ce..a5cd811 100644
--- a/src/modules/product/api.ts
+++ b/src/modules/product/api.ts
@@ -1,13 +1,17 @@
import type {Option as IOption, Product as IProduct} from "./types";
import Papa from "papaparse";
+import {cache} from "react";
+import {cacheLife, cacheTag} from "next/cache";
import {notFound} from "next/navigation";
-interface RawOption extends IOption {
+interface RawOption extends Omit
{
+ price: string;
type: "option";
}
-interface RawProduct extends IProduct {
+interface RawProduct extends Omit {
+ price: string;
type: "product";
}
@@ -25,7 +29,7 @@ class Product implements IProduct {
price: IProduct["price"];
constructor() {
- this.options = {} as Product["options"];
+ this.options = {};
}
set(product: RawProduct) {
@@ -63,7 +67,7 @@ class Product implements IProduct {
description: this.description,
image: this.image,
options: this.options,
- price: Number(this.price),
+ price: this.price,
};
if (Object.keys(product.options!).length === 0) {
@@ -79,21 +83,23 @@ function normalize(data: (RawProduct | RawOption | RawUnknown)[]) {
for (const item of data) {
switch (item.type) {
- case "product":
+ case "product": {
const baseProduct = new Product();
baseProduct.set(item as RawProduct);
products.set(baseProduct.id, baseProduct);
break;
+ }
- case "option":
+ case "option": {
const existingProduct = products.get(item.id);
if (existingProduct) {
existingProduct.addOption(item as RawOption);
}
break;
+ }
}
}
@@ -106,12 +112,16 @@ function normalize(data: (RawProduct | RawOption | RawUnknown)[]) {
const api = {
list: async (): Promise => {
- // Uncomment to use the mock data
- // return await import(`./mocks/default.json`).then(
- // (module: {default: IProduct[]}) => module.default,
- // );
+ "use cache";
- return fetch(process.env.PRODUCTS!, {next: {tags: ["products"]}}).then(async (response) => {
+ cacheLife("max");
+ cacheTag("products");
+
+ if (process.env.USE_MOCKS === "true") {
+ return import("./mocks/default.json").then((result: {default: IProduct[]}) => result.default);
+ }
+
+ return fetch(process.env.PRODUCTS!).then(async (response) => {
const csv = await response.text();
return new Promise((resolve, reject) => {
@@ -127,19 +137,14 @@ const api = {
});
});
},
- fetch: async (id: IProduct["id"]): Promise => {
- // Uncomment to use the mock data
- // return await import(`./mocks/default.json`).then(
- // (module: {default: IProduct[]}) => module.default.find((product) => product.id === id)!,
- // );
-
+ fetch: cache(async (id: IProduct["id"]): Promise => {
const products = await api.list();
const product = products.find((product) => product.id === id);
if (!product) return notFound();
return product;
- },
+ }),
};
export default api;
diff --git a/src/modules/product/components/ProductCard.tsx b/src/modules/product/components/ProductCard.tsx
index ebc590d..930d041 100644
--- a/src/modules/product/components/ProductCard.tsx
+++ b/src/modules/product/components/ProductCard.tsx
@@ -10,14 +10,14 @@ function ProductCard({product}: {product: Product}) {
return (
-
{product.title}
-
+
{product.title}
+
{product.description}
diff --git a/src/modules/product/components/ProductSelection.tsx b/src/modules/product/components/ProductSelection.tsx
new file mode 100644
index 0000000..1e4ec87
--- /dev/null
+++ b/src/modules/product/components/ProductSelection.tsx
@@ -0,0 +1,25 @@
+"use client";
+
+import type {Product} from "../types";
+
+import {useRouter} from "next/navigation";
+
+import {useCart} from "~/cart/context/client";
+import CartItemDrawer from "~/cart/components/CartItemDrawer";
+
+export default function ProductSelection({product}: {product: Product}) {
+ const router = useRouter();
+ const [, {addItem}] = useCart();
+
+ return (
+
router.push("/", {scroll: false})}
+ onSubmit={(item) => {
+ addItem(Date.now(), item);
+ router.push("/", {scroll: false});
+ }}
+ />
+ );
+}
diff --git a/src/modules/product/components/__tests__/ProductCard.test.tsx b/src/modules/product/components/__tests__/ProductCard.test.tsx
index fd59c88..5fb28c7 100644
--- a/src/modules/product/components/__tests__/ProductCard.test.tsx
+++ b/src/modules/product/components/__tests__/ProductCard.test.tsx
@@ -1,64 +1,29 @@
import type {Product} from "../../types";
-import * as React from "react";
-import {render, screen, fireEvent} from "@testing-library/react";
+import {render, screen} from "@testing-library/react";
+import {expect, test} from "vitest";
import ProductCard from "../ProductCard";
const product: Product = {
id: "id",
- image: "image",
+ image: "/product.png",
price: 100,
- title: "title",
- category: "category",
- description: "description",
+ title: "Hamburguesa",
+ category: "Comidas",
+ description: "Con queso",
};
-test("deberia mostrar el titulo, precio y boton", () => {
- render( );
-
- const priceRegex = new RegExp(String(product.price), "i");
-
- expect(screen.getByText(product.title)).toBeInTheDocument();
- expect(screen.getByText(priceRegex)).toBeInTheDocument();
- expect(screen.getByText("Agregar")).toBeInTheDocument();
-});
-
-test("deberia ejecutar onAdd cuando clickeo en agregar y no tengo opciones", () => {
- const onAdd = jest.fn();
-
- render( );
-
- fireEvent.click(screen.getByText("Agregar"));
-
- expect(onAdd).toHaveBeenCalled();
+test("muestra el título, descripción, precio e imagen", () => {
+ render( );
+ expect(screen.getByText(product.title)).toBeVisible();
+ expect(screen.getByText(product.description)).toBeVisible();
+ expect(screen.getByText(/100/)).toBeVisible();
+ expect(screen.getByRole("img", {name: product.title})).toHaveAttribute("src", product.image);
});
-test("deberia ejecutar onAdd cuando clickeo en agregar y tengo opciones", () => {
- const onAdd = jest.fn();
-
- render(
- ,
- );
-
- fireEvent.click(screen.getByText("Agregar"));
-
- expect(screen.getByTestId("cart-item-drawer")).toBeInTheDocument();
+test("muestra el producto sin una imagen", () => {
+ render( );
+ expect(screen.getByText(product.title)).toBeVisible();
+ expect(screen.queryByRole("img")).not.toBeInTheDocument();
});
diff --git a/src/modules/store/api.ts b/src/modules/store/api.ts
index 27fe42e..b7b196c 100644
--- a/src/modules/store/api.ts
+++ b/src/modules/store/api.ts
@@ -1,10 +1,20 @@
import type {Store as IStore} from "./types";
import Papa from "papaparse";
+import {cacheLife, cacheTag} from "next/cache";
export default {
fetch: async (): Promise => {
- return fetch(process.env.STORE!, {next: {tags: ["store"]}}).then(async (response) => {
+ "use cache";
+
+ cacheLife("max");
+ cacheTag("store");
+
+ if (process.env.USE_MOCKS === "true") {
+ return import("./mocks/default.json").then((result: {default: IStore}) => result.default);
+ }
+
+ return fetch(process.env.STORE!).then(async (response) => {
const csv = await response.text();
return new Promise((resolve, reject) => {
@@ -18,8 +28,4 @@ export default {
});
});
},
- mock: {
- fetch: (mock: string): Promise =>
- import(`./mocks/${mock}.json`).then((result: {default: IStore}) => result.default),
- },
};
diff --git a/src/modules/store/screens/Store.tsx b/src/modules/store/screens/Store.tsx
index 849eba0..063f621 100644
--- a/src/modules/store/screens/Store.tsx
+++ b/src/modules/store/screens/Store.tsx
@@ -5,19 +5,14 @@ import type {Product} from "~/product/types";
import {useMemo, useState} from "react";
import {SearchIcon, X, Table, StretchHorizontal, ChevronDown} from "lucide-react";
import Link from "next/link";
-import {useRouter} from "next/navigation";
-import {useCart} from "~/cart/context/client";
import ProductCard from "~/product/components/ProductCard";
import {cn} from "@/lib/utils";
import {Input} from "@/components/ui/input";
import {Toggle} from "@/components/ui/toggle";
-import CartItemDrawer from "@/modules/cart/components/CartItemDrawer";
-function StoreScreen({products, selected}: {products: Product[]; selected: null | Product}) {
- const [, {addItem}] = useCart();
- const router = useRouter();
+function StoreScreen({products}: {products: Product[]}) {
const [query, setQuery] = useState("");
const [layout, setLayout] = useState<"list" | "grid">(() =>
products.length > 30 ? "list" : "grid",
@@ -70,113 +65,108 @@ function StoreScreen({products, selected}: {products: Product[]; selected: null
}
return (
- <>
-
- {/* Filters */}
-
-
-
-
{
- setQuery(event.target.value);
+
+ {/* Filters */}
+
+
+
+
{
+ setQuery(event.target.value);
+ }}
+ />
+ {Boolean(query) && (
+
{
+ setQuery("");
}}
/>
- {Boolean(query) && (
-
+
+
{
+ setLayout("list");
+ }}
+ >
+
+
+
+
+
{
+ setLayout("grid");
+ }}
+ >
+
+
+
+
+ {/* Grid of products by category */}
+
+ {categories.length ? (
+ categories.map(([category, categoryProducts]) => (
+
+
{
- setQuery("");
+ handleSelectCategory(category);
}}
- />
- )}
-
-
-
{
- setLayout("list");
- }}
- >
-
-
-
-
-
{
- setLayout("grid");
- }}
- >
-
-
-
-
- {/* Grid of products by category */}
-
- {categories.length ? (
- categories.map(([category, categoryProducts]) => (
-
-
{
+ onKeyDown={(event) => {
+ if (event.key === "Enter" || event.key === " ") {
+ event.preventDefault();
handleSelectCategory(category);
- }}
- >
-
- {category} ({categoryProducts.length})
-
- {layout === "list" && }
-
- {((layout === "list" && selectedCategory === category) || layout === "grid") && (
-
- {categoryProducts.length ? (
- categoryProducts.map((product) => (
-
-
-
- ))
- ) : (
-
-
- No hay productos
-
-
- )}
-
- )}
+ }
+ }}
+ >
+
+ {category} ({categoryProducts.length})
+
+ {layout === "list" &&
}
- ))
- ) : (
-
-
No hay productos
+ {((layout === "list" && selectedCategory === category) || layout === "grid") && (
+
+ {categoryProducts.length ? (
+ categoryProducts.map((product) => (
+
+
+
+ ))
+ ) : (
+
+
+ No hay productos
+
+
+ )}
+
+ )}
- )}
-
+ ))
+ ) : (
+
+
No hay productos
+
+ )}
- {Boolean(selected) && (
-
router.push("/", {scroll: false})}
- onSubmit={(item) => {
- addItem(Date.now(), item);
- router.push("/", {scroll: false});
- }}
- />
- )}
- >
+
);
}
diff --git a/src/modules/theme/components/ThemeToggle.tsx b/src/modules/theme/components/ThemeToggle.tsx
index b72a475..ac52de1 100644
--- a/src/modules/theme/components/ThemeToggle.tsx
+++ b/src/modules/theme/components/ThemeToggle.tsx
@@ -16,8 +16,8 @@ export default function ThemeToggle() {
setTheme(theme === "light" ? "dark" : "light");
}}
>
-
❤
-
+ ❤
+
🖤
Toggle theme
diff --git a/tailwind.config.ts b/tailwind.config.ts
deleted file mode 100644
index 59e741b..0000000
--- a/tailwind.config.ts
+++ /dev/null
@@ -1,87 +0,0 @@
-import type {Config} from "tailwindcss";
-
-import colors from "tailwindcss/colors";
-
-const config = {
- darkMode: ["class"],
- content: [
- "./pages/**/*.{ts,tsx}",
- "./components/**/*.{ts,tsx}",
- "./app/**/*.{ts,tsx}",
- "./src/**/*.{ts,tsx}",
- ],
- prefix: "",
- theme: {
- container: {
- center: true,
- padding: "2rem",
- screens: {
- "2xl": "1400px",
- },
- },
- extend: {
- colors: {
- brand: colors[process.env.COLOR!] || colors.teal,
- border: "hsl(var(--border))",
- input: "hsl(var(--input))",
- ring: "hsl(var(--ring))",
- background: "hsl(var(--background))",
- foreground: "hsl(var(--foreground))",
- primary: {
- DEFAULT: "hsl(var(--primary))",
- foreground: "hsl(var(--primary-foreground))",
- },
- secondary: {
- DEFAULT: "hsl(var(--secondary))",
- foreground: "hsl(var(--secondary-foreground))",
- },
- incentive: {
- DEFAULT: "hsl(var(--incentive))",
- foreground: "hsl(var(--incentive-foreground))",
- },
- destructive: {
- DEFAULT: "hsl(var(--destructive))",
- foreground: "hsl(var(--destructive-foreground))",
- },
- muted: {
- DEFAULT: "hsl(var(--muted))",
- foreground: "hsl(var(--muted-foreground))",
- },
- accent: {
- DEFAULT: "hsl(var(--accent))",
- foreground: "hsl(var(--accent-foreground))",
- },
- popover: {
- DEFAULT: "hsl(var(--popover))",
- foreground: "hsl(var(--popover-foreground))",
- },
- card: {
- DEFAULT: "hsl(var(--card))",
- foreground: "hsl(var(--card-foreground))",
- },
- },
- borderRadius: {
- lg: "var(--radius)",
- md: "calc(var(--radius) - 2px)",
- sm: "calc(var(--radius) - 4px)",
- },
- keyframes: {
- "accordion-down": {
- from: {height: "0"},
- to: {height: "var(--radix-accordion-content-height)"},
- },
- "accordion-up": {
- from: {height: "var(--radix-accordion-content-height)"},
- to: {height: "0"},
- },
- },
- animation: {
- "accordion-down": "accordion-down 0.2s ease-out",
- "accordion-up": "accordion-up 0.2s ease-out",
- },
- },
- },
- plugins: [require("tailwindcss-animate")],
-} satisfies Config;
-
-export default config;
diff --git a/tests/e2e/instant.test.ts b/tests/e2e/instant.test.ts
new file mode 100644
index 0000000..27f3456
--- /dev/null
+++ b/tests/e2e/instant.test.ts
@@ -0,0 +1,46 @@
+import {expect, test} from "@playwright/test";
+import {instant} from "@next/playwright";
+
+import products from "../../src/modules/product/mocks/default.json";
+
+const product = products.find((product) => product.title === "Dulce de leche")!;
+
+test("el catálogo se muestra en la carga inicial sin esperar datos dinámicos", async ({
+ page,
+ baseURL,
+}) => {
+ await instant(
+ page,
+ async () => {
+ await page.goto("/");
+ await expect(page.getByTestId("product").filter({visible: true})).toHaveCount(
+ products.length,
+ );
+ },
+ {baseURL},
+ );
+});
+
+test("el producto se muestra al navegar sin esperar datos dinámicos", async ({page}) => {
+ await page.goto("/");
+
+ await instant(page, async () => {
+ await page.getByRole("link").filter({hasText: product.title}).click();
+ await expect(page.getByRole("dialog", {name: product.title})).toBeVisible();
+ });
+});
+
+test("un producto del catálogo carga directamente sin esperar datos dinámicos", async ({
+ page,
+ baseURL,
+}) => {
+ await instant(
+ page,
+ async () => {
+ await page.goto(`/${product.id}`);
+ await expect(page.getByRole("dialog", {name: product.title})).toBeVisible();
+ await expect(page.getByRole("radio", {name: /1 KG/})).toBeVisible();
+ },
+ {baseURL},
+ );
+});
diff --git a/tests/e2e/store.test.ts b/tests/e2e/store.test.ts
new file mode 100644
index 0000000..a44992d
--- /dev/null
+++ b/tests/e2e/store.test.ts
@@ -0,0 +1,75 @@
+import {expect, test} from "@playwright/test";
+
+import products from "../../src/modules/product/mocks/default.json";
+import store from "../../src/modules/store/mocks/default.json";
+
+const product = products.find((product) => product.title === "Dulce de leche")!;
+
+test("busca, elige opciones y prepara el pedido", async ({page}) => {
+ await page.goto("/");
+ await expect(page).toHaveTitle(store.title);
+ await page.getByPlaceholder("Buscar...").fill(product.title);
+ await expect(page.getByTestId("product").filter({visible: true})).toHaveCount(1);
+ await page.getByRole("link").filter({hasText: product.title}).click();
+ await expect(page.getByRole("dialog", {name: product.title})).toBeVisible();
+ await page.getByRole("radio", {name: /1 KG/}).check();
+ await page.getByRole("radio", {name: /Alta/}).check();
+ await page.getByRole("button", {name: "Agregar al pedido"}).click();
+ await page.getByRole("button", {name: "Ver pedido"}).click();
+ await expect(page.getByTestId("cart")).toContainText("Peso: 1 KG, Calidad: Alta");
+ await page.getByTestId("increment").click();
+ await expect(page.getByTestId("quantity")).toHaveText("2");
+ await page.getByTestId("continue-order").click();
+ await page.getByPlaceholder("Mi casa 123").fill("Calle de prueba 123");
+ await page.getByRole("radio", {name: "Efectivo", exact: true}).check();
+ const href = await page.getByRole("link", {name: "Completar pedido"}).getAttribute("href");
+ const url = new URL(href!);
+ const message = url.searchParams.get("text");
+
+ expect(url.pathname).toBe(`/${store.phone}`);
+ expect(message).toContain("Dulce de leche (X2) [Peso: 1 KG, Calidad: Alta]");
+ expect(message).toContain("Direccion de envio: Calle de prueba 123");
+ expect(message).toContain("Forma de pago: Efectivo");
+ expect(message).toContain("538,00");
+});
+
+test("la actualización de caché requiere el secreto", async ({request}) => {
+ expect((await request.get("/refresh?secret=invalid")).status()).toBe(401);
+ expect((await request.get("/refresh?secret=local-test-secret")).status()).toBe(200);
+});
+
+test("muestra un error para productos inexistentes", async ({page}) => {
+ for (const path of ["/no-existe", "/no-existe/extra"]) {
+ await page.goto(path);
+ await expect(page.getByRole("heading", {name: "404", exact: true})).toBeVisible();
+ }
+});
+
+test("un nuevo pedido empieza sin las opciones del pedido anterior", async ({page}) => {
+ await page.goto("/");
+ await page.getByRole("link").filter({hasText: product.title}).click();
+ await page.getByRole("radio", {name: /1 KG/}).check();
+ await page.getByRole("radio", {name: /Alta/}).check();
+ await page.getByRole("button", {name: "Agregar al pedido"}).click();
+ await page.getByRole("link").filter({hasText: product.title}).click();
+
+ await expect(page.getByRole("radio", {name: /1 KG/})).not.toBeChecked();
+ await expect(page.getByRole("radio", {name: /Alta/})).not.toBeChecked();
+ await expect(page.getByRole("dialog")).toContainText("169,00");
+
+ await page.getByRole("radio", {name: /1 KG/}).check();
+ await page.getByRole("button", {name: "Cerrar", exact: true}).click();
+ await page.getByRole("link").filter({hasText: product.title}).click();
+ await expect(page.getByRole("radio", {name: /1 KG/})).not.toBeChecked();
+});
+
+test("un producto del catálogo carga directamente y por enlace", async ({page}) => {
+ await page.goto(`/${product.id}`);
+ await expect(page.getByRole("dialog", {name: product.title})).toBeVisible();
+ await page.getByRole("button", {name: "Cerrar", exact: true}).click();
+ await expect(page.getByTestId("product").filter({visible: true})).toHaveCount(products.length);
+
+ await page.getByRole("link").filter({hasText: product.title}).click();
+ await expect(page).toHaveURL(`/${product.id}`);
+ await expect(page.getByRole("dialog", {name: product.title})).toBeVisible();
+});
diff --git a/tests/setup.ts b/tests/setup.ts
new file mode 100644
index 0000000..93ae778
--- /dev/null
+++ b/tests/setup.ts
@@ -0,0 +1,6 @@
+import {cleanup} from "@testing-library/react";
+import {afterEach} from "vitest";
+
+import "@testing-library/jest-dom/vitest";
+
+afterEach(cleanup);
diff --git a/tsconfig.json b/tsconfig.json
index 0217fbe..7883743 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,11 +1,7 @@
{
"compilerOptions": {
- "target": "es5",
- "lib": [
- "dom",
- "dom.iterable",
- "esnext"
- ],
+ "target": "es2017",
+ "lib": ["dom", "dom.iterable", "esnext"],
"allowJs": true,
"skipLibCheck": true,
"strict": false,
@@ -13,31 +9,30 @@
"noEmit": true,
"esModuleInterop": true,
"module": "esnext",
- "moduleResolution": "node",
+ "moduleResolution": "bundler",
+ "types": ["node"],
"strictNullChecks": true,
"resolveJsonModule": true,
"isolatedModules": true,
- "jsx": "preserve",
+ "jsx": "react-jsx",
"incremental": true,
"plugins": [
{
"name": "next"
}
],
- "baseUrl": "./src",
"paths": {
- "@/*": ["./*"],
- "~/*": ["./modules/*"],
+ "@/*": ["./src/*"],
+ "~/*": ["./src/modules/*"]
}
},
"include": [
"next-env.d.ts",
"**/*.ts",
"**/*.tsx",
- ".next/types/**/*.ts"
+ "**/*.mts",
+ ".next/types/**/*.ts",
+ ".next/dev/types/**/*.ts"
],
- "exclude": [
- "node_modules",
- "./cypress"
- ]
+ "exclude": ["node_modules", ".next-e2e"]
}
diff --git a/vitest.config.mts b/vitest.config.mts
new file mode 100644
index 0000000..efa4a4f
--- /dev/null
+++ b/vitest.config.mts
@@ -0,0 +1,25 @@
+import {fileURLToPath} from "node:url";
+
+import react from "@vitejs/plugin-react";
+import {defineConfig} from "vitest/config";
+
+export default defineConfig({
+ plugins: [react()],
+ resolve: {
+ alias: {
+ "@": fileURLToPath(new URL("./src", import.meta.url)),
+ "~": fileURLToPath(new URL("./src/modules", import.meta.url)),
+ },
+ },
+ test: {
+ environment: "jsdom",
+ include: ["src/**/*.test.{ts,tsx}"],
+ setupFiles: ["./tests/setup.ts"],
+ restoreMocks: true,
+ coverage: {
+ provider: "v8",
+ reporter: ["text", "lcov"],
+ include: ["src/modules/**/utils.ts", "src/modules/**/components/**/*.tsx"],
+ },
+ },
+});
From 9baedd18e78b365a480861b4717c23e9ef0e914f Mon Sep 17 00:00:00 2001
From: goncy
Date: Fri, 11 Sep 2026 22:50:12 -0500
Subject: [PATCH 2/2] Remove review
---
REVIEW.md | 4 ----
1 file changed, 4 deletions(-)
delete mode 100644 REVIEW.md
diff --git a/REVIEW.md b/REVIEW.md
deleted file mode 100644
index 751e73b..0000000
--- a/REVIEW.md
+++ /dev/null
@@ -1,4 +0,0 @@
-- CartDrawer usa buttonVariants y no me gusta
-- CartItemDrawer tiene muchas cosas inline y pareceria ser controlled cuando antes era uncontrolled
-- StoreScreen perdió el modal y hay cosas inline y las cosas del modal se fueron a ProductSelection
-- El server de mocks no me gusta, se solucionaria con lo de arriba, lo mismo lo de playwright config