diff --git a/.agents/skills/remix/SKILL.md b/.agents/skills/remix/SKILL.md new file mode 100644 index 0000000..03fd659 --- /dev/null +++ b/.agents/skills/remix/SKILL.md @@ -0,0 +1,501 @@ +--- +name: remix +description: Build and review Remix 3 applications using the `remix` npm package and subpath imports. Use when working on Remix app structure, routes, controllers, middleware, validation, data access, auth, sessions, file uploads, server setup, UI components, hydration, navigation, or tests. +--- + +# Build a Remix App + +Use this skill for end-to-end Remix app work. It should help the agent choose the right layer +first, reach for the right package, and avoid the most common Remix-specific mistakes. + +## What Remix Is + +Remix 3 is a server-first web framework built on Web APIs such as `Request`, `Response`, `URL`, +and `FormData`. All packages ship from a single npm package, `remix`, and are imported via +subpath. There is no top-level `remix` import. + +A Remix app has four main pieces: + +- **Routes** in `app/routes.ts` define the typed URL contract and power `href()` generation. +- **Controllers and actions** implement that contract and return `Response` objects. +- **Middleware** composes request lifecycle behavior and populates typed context via + `context.set(Key, value)`. +- **Components** render UI with `remix/ui`. This is not React. A component receives a + `handle`, reads current props from `handle.props`, and returns a render function. + +## When To Use This Skill + +Use this skill for: + +- new features or refactors that touch routing, controllers, middleware, data, auth, sessions, UI, + or tests +- reviewing Remix app code for correctness, architecture, or framework usage +- answering "how should this be structured in Remix?" questions +- finding the right package, reference doc, or default pattern for a task + +## Load Only The References You Need + +Classify the task first, then load the smallest useful reference set. Each reference file starts +with a "What This Covers" section that lists the topics inside it — read that first to confirm +the file is relevant before reading the rest. + +Use the table below to find candidates. Loading more than two or three files at once is usually a +sign that the task hasn't been narrowed enough yet. + +| Task involves... | Start with | +| ----------------------------------------------------------------------------- | ------------------------------------------- | +| Defining URLs, writing controllers and actions, returning responses | `references/routing-and-controllers.md` | +| Composing the request lifecycle, ordering middleware, bridging to a server | `references/middleware-and-server.md` | +| Compiling and serving browser modules, asset URL namespaces, preloads | `references/assets-and-browser-modules.md` | +| Parsing input, validating with schemas, defining tables, querying, migrations | `references/data-and-validation.md` | +| Per-browser state, login flows, route protection, identity | `references/auth-and-sessions.md` | +| Component setup, state, lifecycle, updates, `queueTask`, context | `references/component-model.md` | +| Event handlers, styles, refs, click/key behavior, simple animations | `references/mixins-styling-events.md` | +| `clientEntry`, `run`, ``, navigation, `` | `references/hydration-frames-navigation.md` | +| Router tests, component tests, test isolation | `references/testing-patterns.md` | +| Spring physics, tweens, layout transitions | `references/animate-elements.md` | +| Authoring custom reusable mixins | `references/create-mixins.md` | + +Common bundles: + +- **Form or CRUD feature** -> routing, data and validation, testing; add auth if user-specific +- **Protected area** -> auth and sessions, routing, testing +- **Interactive widget** -> component model, mixins and styling; add hydration only if it runs in + the browser +- **Browser asset pipeline** -> assets and browser modules, hydration, middleware and server +- **File upload** -> middleware and server, data and validation, testing +- **Navigation or frames** -> hydration, frames, navigation + +## Default Workflow + +1. **Classify the change.** Decide whether it changes the route contract, request lifecycle, data + model, auth or session behavior, or only UI. +2. **Start from the server contract.** Add or update `app/routes.ts` before wiring handlers or UI. +3. **Put code in the narrowest owner.** Favor route-local code first, then promote only when reuse + is real. +4. **Make the server path correct before adding browser behavior.** A route should return the right + `Response` via `router.fetch(...)` before you add `clientEntry(...)`, animations, or DOM + effects. +5. **Add middleware deliberately.** Keep fast-exit middleware early and request-enriching + middleware later. Export a typed `AppContext` from the root middleware stack and use it in + controllers. +6. **Validate input at the boundary.** Parse and validate `Request`, `FormData`, params, cookies, + and external payloads before they reach rendering or persistence logic. +7. **Hydrate only when necessary.** Prefer server-rendered UI. Use `clientEntry(...)` and `run(...)` + only for real browser interactivity or browser-only APIs. +8. **Test the narrowest meaningful layer.** Prefer router tests for route behavior. Use component + tests when the behavior is truly interactive or DOM-specific. +9. **Finish with verification.** Re-read the route flow, confirm auth and authorization boundaries, + and run the smallest relevant test and typecheck loop. + +## Project Layout + +Use these root directories consistently: + +- `app/` for runtime application code +- `db/` for migrations and local database files +- `public/` for static assets served as-is +- `test/` for shared helpers, fixtures, and integration coverage +- `tmp/` for uploads, caches, local session files, and other scratch data + +Inside `app/`, organize by responsibility: + +- `assets/` for client entrypoints and client-owned browser behavior +- `controllers/` for route-owned handlers and route-local UI +- `data/` for schema, queries, persistence setup, migrations, and runtime data initialization +- `middleware/` for request lifecycle concerns such as auth, sessions, uploads, and database + injection +- `ui/` for shared cross-route UI primitives +- `utils/` only for genuinely cross-layer helpers that do not clearly belong elsewhere +- `routes.ts` for the route contract +- `router.ts` for router setup and wiring + +### Placement Precedence + +When code could live in multiple places: + +1. Put it in the narrowest owner first. +2. If it belongs to one route, keep it with that route. +3. If it is shared UI across route areas, move it to `app/ui/`. +4. If it is request lifecycle setup, keep it in `app/middleware/`. +5. If it is schema, query, persistence, or startup data logic, keep it in `app/data/`. +6. Use `app/utils/` only as a last resort for truly cross-layer helpers. + +### Route Ownership + +- Use a flat file in `app/controllers/` for a simple leaf action, such as `app/controllers/home.tsx` +- Use a folder with `controller.tsx` when a route owns nested routes or multiple actions, such as + `app/controllers/account/controller.tsx` +- Mirror nested route structure on disk, such as `app/controllers/auth/login/controller.tsx` +- Keep route-local UI next to its owner, such as `app/controllers/contact/page.tsx` +- Move shared UI to `app/ui/` +- If a flat leaf grows child routes or multiple actions, promote it to a controller folder + +### Layout Anti-Patterns + +- Do not create `app/lib/` as a generic dumping ground +- Do not create `app/components/` as a second shared UI bucket when `app/ui/` already owns that + role +- Do not put shared cross-route UI in `app/controllers/` +- Do not put middleware or persistence helpers in `app/utils/` when they have a clearer home +- Do not create folders for simple leaf actions unless they are real controllers + +## Core Remix Rules + +- Import from `remix/`, never `import { ... } from 'remix'` +- Treat `app/routes.ts` as the source of truth for URLs. Use `routes..href(...)` for + redirects, links, tests, and internal URL construction +- Controllers and actions should return explicit `Response` objects, including redirects, 404s, and + validation failures. At the route boundary, prefer returning a `Response` for expected outcomes + (validation errors, conflicts, not found) over throwing for control flow +- Model HTTP behavior explicitly. Status codes, headers, redirects, cache rules, and content types + are part of the route contract +- Make the server route correct first. A POST should already return the right HTML, redirect, or + error response on its own before `clientEntry(...)` layers interactivity on top +- Validate input at the boundary using `remix/data-schema` (and `remix/data-schema/form-data` for + forms). `parseSafe` makes the failure path a return value instead of an exception +- Derive `AppContext` from the root middleware stack so `get(Database)`, `get(Session)`, + `get(Auth)`, and similar keys stay typed. If the controller never reads from context, it doesn't + need the harness +- Outside actions and controllers, only use `getContext()` when `asyncContext()` is in the + middleware stack +- Remix Component is not React: read props from `handle.props`, keep state in setup-scope + variables, call `handle.update()` explicitly, and do DOM-sensitive work in event handlers or + `queueTask(...)`, not in render +- Prefer host-element mixins via `mix={mixin(...)}` for behavior and styling instead of inventing + custom host prop conventions. Use `mix={[...]}` only when composing multiple mixins +- Hydrated `clientEntry(...)` props must be serializable. Do not pass functions, class instances, or + opaque runtime objects + +## Security And Session Defaults + +- Never ship demo secrets. In non-test environments, require session and provider secrets from the + environment and fail fast if they are missing +- Use hardened cookies: `httpOnly` always, `sameSite` by default, and `secure` when serving over + HTTPS +- Regenerate session IDs on login, logout, and privilege changes +- Use `requireAuth()` to protect authenticated route areas, but still authorize resource ownership + inside handlers and data writes +- Add CSRF protection when browser forms mutate state using cookie-backed sessions +- Add CORS only for endpoints that must be called cross-origin. Prefer same-origin by default +- Prefer JSX or `remix/html-template` for HTML generation so escaping stays correct +- Validate uploads for size, type, and destination. Treat filenames and content as untrusted input + +## Testing Defaults + +- Prefer server and router tests first. Drive the app with `router.fetch(new Request(...))` and + assert on the returned `Response` +- Build a fresh router per test or per suite so sessions, in-memory storage, and database state + stay isolated +- Use `routes..href(...)` in tests so URLs stay coupled to the route contract +- For auth or session scenarios, use a test cookie and `createMemorySessionStorage()` instead of + production storage +- Use component tests only for interactive or DOM-specific behavior. Render with `createRoot(...)`, + interact with the real DOM, and call `root.flush()` between steps +- Prefer one representative behavior test over many repetitive assertion variants + +## Common Mistakes To Avoid + +- Treating Remix Component like React and reaching for hooks or implicit rerendering +- Importing from a top-level `remix` entry instead of a subpath +- Adding `clientEntry(...)` before the server-rendered route behavior is correct +- Passing non-serializable props into `clientEntry(...)` +- Calling `getContext()` without `asyncContext()` in the middleware stack +- Getting middleware order wrong; fast exits like static files belong early, request enrichment later +- Skipping boundary validation and trusting raw `FormData`, params, cookies, or external payloads +- Letting route-local domain errors leak out of the controller. Translate expected outcomes + (validation, conflicts, not-found) into the HTTP `Response` the route means to return rather than + throwing a custom `Error` subclass and catching it elsewhere +- Reaching for `createCookie` when a tamper-sensitive or server-managed per-browser fact really + wants `remix/session`. If editing the value would be a bug, use a session +- Building a JSON-only RPC layer when a normal form POST, redirect, or resource route would be + simpler. Fetch-from-the-client is a layer on top of sound route behavior, not a replacement for + it +- Treating JSON state endpoints and `` reloads as mutually exclusive patterns. Pick the + lightest sync mechanism that fits the UX; small widgets may reasonably poll a JSON endpoint +- Assuming authentication is enough without per-resource authorization checks +- Dropping shared code into vague buckets like `utils.ts`, `helpers.ts`, or `common.ts` when + ownership is known +- Writing only component tests for a feature whose main behavior is really an HTTP route concern + +## Package Map + +Use this map to find the right package quickly. Each entry says what the package is for, not just +what it exports. Open the linked reference file when you need full examples. + +### Routing, Server, and Responses + +- `remix/fetch-router` — the router itself. Use for `createRouter`, controller and middleware + types, and registering routes +- `remix/fetch-router/routes` — declarative route builders. Use for `route`, `get`, `post`, `put`, + `del`, `form`, `resources` when defining `app/routes.ts` +- `remix/node-fetch-server` — adapter from Node's `http` module to a Fetch-style router. Use for + `createRequestListener` in `server.ts` +- `remix/assets` — browser asset server. Use for `createAssetServer` when serving compiled + scripts and styles, getting public hrefs, and emitting preloads. Shared compiler options such as + `target`, `sourceMaps`, `sourceMapSourcePaths`, and `minify` live at the top level +- `remix/headers` — typed header parsers and builders. Use when reading `Accept`, `Cookie`, or + setting `CacheControl`, `Vary`, etc., instead of hand-formatting strings +- `remix/response/redirect` — `redirect(href, status?)`. Use for the canonical "POST then redirect" + pattern and other location changes +- `remix/response/html` — `createHtmlResponse`. Use when you need an HTML `Response` from a string + or stream without rendering through `remix/ui` +- `remix/response/compress` — `compressResponse`. Use when compressing one-off responses outside + the global `compression()` middleware +- `remix/response/file` — file-download responses. Use for `Content-Disposition: attachment` + responses +- `remix/route-pattern` — low-level URL matching and generation. Use when working with raw + patterns outside the router (custom matchers, scripts) +- `remix/fetch-proxy` — Fetch-based HTTP proxying. Use to forward a request to another origin; pass + `xForwardedHeaders` when the upstream needs forwarded proto, host, and port + +### Data, Validation, and Persistence + +- `remix/data-schema` — schema builders for runtime validation. Use for `parse` and `parseSafe` + to validate any input that crosses a trust boundary, and `.transform(...)` when validated output + should map to a different value or type +- `remix/data-schema/checks` — common check helpers (`email`, `minLength`, `maxLength`, etc.). + Use to compose into a schema +- `remix/data-schema/coerce` — coercion helpers for strings, numbers, booleans, dates, and ids. + Use when input arrives as a string but should be a typed value +- `remix/data-schema/form-data` — `f.object` and `f.field` for parsing `FormData` directly. Use + in actions that read browser forms +- `remix/data-table` — typed tables and a `Database` interface. Use for `table`, `column`, + `createDatabase` when modeling persisted data +- `remix/data-table-sqlite`, `remix/data-table-postgres`, `remix/data-table-mysql` — adapters. + Use to back `createDatabase` with a real engine. SQLite accepts Node, Bun, and compatible + synchronous clients with the shared `prepare`/`exec` surface +- `remix/data-table/migrations` — migration authoring and runners. Use for `createMigration`, + `createMigrationRunner` +- `remix/data-table/migrations/node` — `loadMigrations` from disk. Use in startup scripts that + apply migrations +- `remix/data-table/operators` — query operators such as `inList(...)`. Use when `where` clauses + need set or comparison logic + +### Auth, Sessions, and Cookies + +- `remix/session` — the `Session` object: `get`, `set`, `flash`, `unset`, `regenerateId`. Use for + any per-browser state where tampering would be a bug (login, "I submitted this form already", + cart, flash messages) +- `remix/session-middleware` — `session(cookie, storage)`. Use to wire a session cookie and + storage backend into the root middleware stack +- `remix/session/fs-storage`, `remix/session/memory-storage`, `remix/session/cookie-storage` — + storage backends. Use `fs-storage` for single-process apps, `memory-storage` for tests, + `cookie-storage` for stateless deployments where data fits in a cookie +- `remix/session-storage-redis` — Redis-backed storage. Use for multi-process or multi-host + deployments +- `remix/session-storage-memcache` — Memcache-backed storage. Same multi-host use case as Redis +- `remix/cookie` — `createCookie` for plain signed/unsigned cookies. Use for non-sensitive + preferences where the client is allowed to control the value (theme, locale, dismissed banner). + For state where tampering matters, prefer `remix/session` +- `remix/auth` — credentials, OAuth, OIDC, and Atmosphere providers. Use to define how identity is + verified, start/finish external login, and refresh stored OAuth/OIDC token bundles with + `refreshExternalAuth(...)` +- `remix/auth-middleware` — `auth({ schemes })`, `requireAuth`, the `Auth` context key. Use to + resolve identity into the request context and to gate routes + +### UI, Hydration, and Browser Behavior + +- `remix/ui` — the component runtime: components, core mixins, `clientEntry`, `run`, ``, + navigation helpers, and `createRoot`. Use for app UI behavior +- `remix/ui/server` — server rendering: `renderToStream`, `renderToString`. Use in the + `render(...)` helper that returns HTML responses +- `remix/ui/animation` — animation APIs: `animateEntrance`, `animateExit`, `animateLayout`, + `spring`, `tween`, and `easings` +- `remix/ui/` — UI primitives, mixins, glyphs, and theme helpers. Import from + `remix/ui/accordion`, `remix/ui/button`, `remix/ui/select`, etc. +- `remix/ui/test` — component test rendering helpers such as `render` +- `remix/ui/jsx-runtime` — JSX transform target. Configured in `tsconfig.json`, rarely + imported directly +- `remix/html-template` — escaped HTML template literals. Use when generating HTML outside the + component system (RSS feeds, email bodies, error pages) +- `remix/file-storage` — backend-agnostic `File` storage interface. Use as the type bound for + upload destinations +- `remix/file-storage/fs`, `remix/file-storage/memory`, `remix/file-storage-s3` — storage + backends. Use to implement an upload destination + +### Middleware + +- `remix/static-middleware` — `staticFiles(dir)`. Use to serve files from `public/` exactly as + they exist on disk +- `remix/form-data-middleware` — `formData()`. Use to parse `FormData` once and expose it via + `get(FormData)` instead of calling `await request.formData()` in each action +- `remix/form-data-parser` — lower-level `parseFormData`, `FileUpload`. Use when implementing + custom upload handlers. Upload handler errors propagate directly +- `remix/multipart-parser` and `remix/multipart-parser/node` — low-level multipart stream parsing. + `MultipartPart.headers` is a plain object keyed by lower-case header name; read values with + bracket notation such as `part.headers['content-type']` +- `remix/compression-middleware` — `compression()`. Use globally for text-like responses +- `remix/logger-middleware` — `logger()`. Use in development for request logs; pass `colors` to + force terminal color output on or off +- `remix/method-override-middleware` — `methodOverride()`. Use when HTML forms need `PUT`, + `PATCH`, or `DELETE` +- `remix/async-context-middleware` — `asyncContext()`, `getContext()`. Use when helpers outside + actions need request context without threading it through every call +- `remix/cors-middleware` — `cors(opts?)`. Use for endpoints called cross-origin +- `remix/csrf-middleware` — `csrf(opts?)`. Use when session-backed forms mutate state and need + synchronizer-token CSRF protection +- `remix/cop-middleware` — cross-origin protection. Use to reject unsafe cross-origin browser + requests + +### Test + +- `remix/test` — `describe`, `it`, and lifecycle hooks. Use as the test framework +- `remix/test/cli` — programmatic test runner APIs such as `runRemixTest` +- `remix/cli` — programmatic Remix CLI API. Use the `remix` executable for project commands such + as `remix test`, `remix routes`, and `remix doctor` +- `remix/assert` — assertion helpers. Use in place of `node:assert` so messages render cleanly + in the runner +- `remix/terminal` — ANSI styles, color detection, style factories, and testable terminal streams. + Use for CLIs and terminal output instead of hand-rolled escape sequences + +## Canonical Patterns + +### Define routes first + +```typescript +import { form, get, post, resources, route } from "remix/fetch-router/routes"; + +export const routes = route({ + home: "/", + contact: form("contact"), + books: { + index: "/books", + show: "/books/:slug", + }, + auth: route("auth", { + login: form("login"), + logout: post("logout"), + }), + admin: route("admin", { + index: get("/"), + books: resources("books", { param: "bookId" }), + }), +}); +``` + +### Type controllers against the route contract + +```typescript +import type { Controller } from 'remix/fetch-router' + +import type { AppContext } from '../router.ts' +import { routes } from '../routes.ts' + +export default { + actions: { + async index({ get }) { + let db = get(Database) + let allBooks = await db.findMany(books, { orderBy: ['id', 'asc'] }) + return render() + }, + async show({ get, params }) { + let db = get(Database) + let book = await db.findOne(books, { where: { slug: params.slug } }) + if (!book) return new Response('Not Found', { status: 404 }) + return render() + }, + }, +} satisfies Controller +``` + +### Compose middleware deliberately + +```typescript +import { + createRouter, + type AnyParams, + type MiddlewareContext, + type WithParams, +} from "remix/fetch-router"; + +export type RootMiddleware = [ + ReturnType, + ReturnType, + ReturnType, + ReturnType, +]; + +export type AppContext = WithParams< + MiddlewareContext, + params +>; + +let middleware = []; + +if (process.env.NODE_ENV === "development") { + middleware.push(logger()); +} + +middleware.push(compression()); +middleware.push(staticFiles("./public")); +middleware.push(formData()); +middleware.push(methodOverride()); +middleware.push(session(cookie, storage)); +middleware.push(asyncContext()); +middleware.push(loadDatabase()); +middleware.push(loadAuth()); + +let router = createRouter({ middleware }); +``` + +### Mutate, validate, and respond + +```typescript +import { redirect } from 'remix/response/redirect' +import * as s from 'remix/data-schema' +import * as f from 'remix/data-schema/form-data' +import { Session } from 'remix/session' +import { Database } from 'remix/data-table' + +let bookSchema = f.object({ + slug: f.field(s.string()), + title: f.field(s.string()), +}) + +export default { + actions: { + async create({ get }) { + let parsed = s.parseSafe(bookSchema, get(FormData)) + if (!parsed.success) { + return render(, { status: 400 }) + } + + let db = get(Database) + let book = await db.create(books, parsed.value) + + let session = get(Session) + session.flash('message', `Added ${book.title}.`) + + return redirect(routes.books.show.href({ slug: book.slug })) + }, + }, +} satisfies Controller +``` + +This shape works without JavaScript, returns a `Response` for every outcome, and is ready for +`clientEntry(...)` interactivity when the UI needs it. + +### Build UI from handle props plus render + +```tsx +import { on, type Handle } from "remix/ui"; + +function Counter(handle: Handle<{ initialCount?: number; label: string }>) { + let count = handle.props.initialCount ?? 0; + + return () => ( + + ); +} +``` + +Only add `clientEntry(...)` and `run(...)` when the component needs browser interactivity or +browser-only APIs. diff --git a/.agents/skills/remix/references/animate-elements.md b/.agents/skills/remix/references/animate-elements.md new file mode 100644 index 0000000..71515c2 --- /dev/null +++ b/.agents/skills/remix/references/animate-elements.md @@ -0,0 +1,195 @@ +# Animating Elements + +## What This Covers + +How to animate insertion, removal, and layout changes of elements. Read this when the task +involves: + +- Adding entrance, exit, or shared-layout transitions to UI +- Choosing between spring physics (`spring(...)`) and time-based easing (`tween`) +- Coordinating CSS transitions with the same easing as JS animations +- Imperative animation loops via `requestAnimationFrame` + +Import animation APIs from `remix/ui/animation`. For the smaller set of animation helpers that +show up alongside other mixins, see `mixins-styling-events.md`. + +## Animation Mixins + +### `animateEntrance(config)` + +Animates an element when inserted. Config specifies the **starting** style the element animates +**from**: + +```tsx +
+``` + +### `animateExit(config)` + +Animates an element when removed. Config specifies the **ending** style the element animates +**to**. The element stays in the DOM until the animation completes: + +```tsx +{ + isVisible && ( +
+ ); +} +``` + +### `animateLayout(config?)` + +Animates layout changes (position/size) using FLIP-style transforms: + +```tsx +{ + items.map((item) => ( +
  • + )); +} +``` + +Options: `duration` (default 200ms), `easing` (default spring snappy), `size` (default true — +include scale projection for size changes). + +### Combining mixins + +```tsx +
    +``` + +### Shared-layout swap + +```tsx +
    *": { gridArea: "1 / 1" } })}> + {stateA ? ( +
    + ) : ( +
    + )} +
    +``` + +## Spring API + +Physics-based spring animation. Returns a `SpringIterator` with `duration`, `easing`, and +`toString()` for CSS. + +### Presets + +| Preset | Bounce | Duration | Character | +| -------- | ------ | -------- | --------------------------- | +| `smooth` | -0.3 | 400ms | Overdamped, no overshoot | +| `snappy` | 0 | 200ms | Critically damped, quick | +| `bouncy` | 0.3 | 400ms | Underdamped, visible bounce | + +```tsx +spring("bouncy"); +spring("snappy"); +spring("smooth"); +spring("bouncy", { duration: 300 }); // override duration +``` + +### Custom spring + +```tsx +spring({ duration: 500, bounce: 0.3 }); +spring({ duration: 500, bounce: 0.3, velocity: 2 }); // continue momentum from gesture +``` + +### Spread into animation mixins + +Spreading a spring gives both `duration` and `easing`: + +```tsx +animateEntrance({ opacity: 0, ...spring("bouncy") }); +``` + +### CSS transitions + +The iterator stringifies to `"550ms linear(...)"`: + +```tsx +css({ transition: `width ${spring("bouncy")}` }); +``` + +Or use the `spring.transition()` helper for multiple properties: + +```tsx +css({ transition: spring.transition("width", "bouncy") }); +css({ transition: spring.transition(["left", "top"], "snappy") }); +``` + +### Web Animations API + +```tsx +element.animate(keyframes, { ...spring("bouncy") }); +``` + +### JS iteration + +The iterator yields position values from 0 to 1, one per frame: + +```tsx +for (let t of spring("bouncy")) { + let x = from + (to - from) * t; + updateSomething(x); + await nextFrame(); +} +``` + +## Tween API + +Generator-based tween for animating values over time with cubic bezier easing. Prefer animation +mixins or CSS transitions with `spring` for most UI work. Use `tween` for imperative +`requestAnimationFrame` loops, canvas/WebGL, or non-CSS properties. + +```tsx +import { tween, easings } from "remix/ui/animation"; + +let animation = tween({ + from: 0, + to: 100, + duration: 300, + curve: easings.easeOut, +}); + +animation.next(); // initialize +function tick(timestamp: number) { + if (handle.signal.aborted) return; + let { value, done } = animation.next(timestamp); + element.style.transform = `translateX(${value}px)`; + if (!done) requestAnimationFrame(tick); +} +requestAnimationFrame(tick); +``` + +Built-in easings: `easings.linear`, `easings.ease`, `easings.easeIn`, `easings.easeOut`, +`easings.easeInOut`. + +## Practical Guidance + +- Always key conditional or switching elements you expect to animate. +- Use `animateLayout` only on the element whose position or size changes. +- Prefer one clear transition intent per mixin: entrance starts from a style, exit ends at a style. +- Default to `...spring()` for duration and easing in most cases. +- Keep DOM work in `handle.queueTask(...)` or `ref(...)`, not in render. diff --git a/.agents/skills/remix/references/assets-and-browser-modules.md b/.agents/skills/remix/references/assets-and-browser-modules.md new file mode 100644 index 0000000..e7ff6e0 --- /dev/null +++ b/.agents/skills/remix/references/assets-and-browser-modules.md @@ -0,0 +1,122 @@ +# Assets and Browser Modules + +## What This Covers + +How to serve browser scripts and styles from source. Read this when the task involves: + +- Configuring `createAssetServer` (`fileMap`, `allow`, `deny`, fingerprinting, compiler options) +- Choosing between `staticFiles()` for already-built files and `createAssetServer()` for source + assets that need import rewriting, preloads, or fingerprinted URLs +- Generating script URLs or `` tags for a client entry +- Keeping server-only files out of the browser via `deny` rules + +For routing the URL namespace itself, see `routing-and-controllers.md`. For client entry +hydration, see `hydration-frames-navigation.md`. + +## When To Reach For It + +Use `remix/assets` when the app serves browser JavaScript, TypeScript, or CSS from source files. +This is the right tool for client entrypoints, browser-only helpers, styles under `app/assets/`, +and monorepo code that should be compiled and served under a public URL namespace. + +Use `staticFiles()` for files that already exist on disk exactly as they should be served. Use +`createAssetServer()` for source scripts or styles that need rewriting, dependency scanning, +preloads, sourcemaps, or fingerprinted URLs. + +## Default Pattern + +```typescript +import * as path from "node:path"; + +import { createAssetServer } from "remix/assets"; +import { createRouter } from "remix/fetch-router"; + +let assetServer = createAssetServer({ + rootDir: path.resolve(import.meta.dirname, ".."), + fileMap: { + "/assets/app/*path": "app/*path", + "/assets/packages/*path": "../packages/*path", + }, + allow: ["app/assets/**", "../packages/**"], + deny: ["app/**/*.server.*"], + target: { es: "2020", chrome: "109", safari: "16.4" }, + sourceMaps: process.env.NODE_ENV === "development" ? "external" : undefined, + minify: process.env.NODE_ENV === "production", + scripts: { + define: { + "process.env.NODE_ENV": JSON.stringify(process.env.NODE_ENV ?? "development"), + }, + }, +}); + +let router = createRouter(); + +router.get("/assets/*path", ({ request }) => { + return assetServer.fetch(request); +}); +``` + +## Rules + +- Treat `allow` and `deny` as the security boundary for browser-reachable source files. +- Add a `deny` list for server-only modules such as `*.server.*`, private config, or other files + that should never be exposed. +- Set `rootDir` explicitly in monorepos so relative paths resolve from the intended project root. +- `fileMap` keys are public URL patterns and values are root-relative file path patterns. They use + `route-pattern` syntax on both sides. +- Keep the same wildcard params on both sides of a `fileMap` entry so import rewriting can map + source files back to public URLs. +- CSS files are compiled and served alongside scripts. Local CSS `@import` rules are rewritten and + fingerprinted with the same asset server routing rules. + +## Rendering HTML + +Use `getHref()` when you need the public URL for one module, and `getPreloads()` when you want +`` tags or `Link` headers for one or more entrypoints and their +dependencies. + +```typescript +let entryHref = await assetServer.getHref("app/assets/entry.ts"); +let preloads = await assetServer.getPreloads(["app/assets/entry.ts"]); +``` + +Use this when rendering documents or layouts that boot browser behavior with a known client entry. + +When resolving hydrated client entries during server rendering, pass the source entry ID from +`clientEntry(import.meta.url, ...)` to `getHref()` inside `resolveClientEntry`. Keep export-name +resolution in that render helper, and avoid hard-coding public asset URLs in source-owned component +modules. + +## Development vs Deployment + +In development: + +- Keep `watch` enabled so source changes are picked up without restarting the server +- Prefer stable URLs with normal revalidation +- Enable source maps when debugging browser code + +In deployment: + +- Set `watch: false` +- Use `fingerprint: { buildId }` for long-lived immutable caching +- Make sure `buildId` changes for each deploy + +Fingerprinting assumes files on disk are stable and requires `watch: false`. + +## Useful Compiler Options + +- `minify` for production minification of scripts and styles +- `sourceMaps` for `'external'` or `'inline'` source maps for scripts and styles +- `sourceMapSourcePaths` for `'url'` or `'absolute'` source map paths +- `target` as an object for shared browser targets and script-only ECMAScript output, such as + `{ es: '2020', chrome: '109', safari: '16.4' }` +- `scripts.define` to replace globals such as `process.env.NODE_ENV` +- `scripts.external` to leave specific script imports untouched + +Do not nest shared compiler options under `scripts`. Use top-level `minify`, `sourceMaps`, +`sourceMapSourcePaths`, and `target` so they apply to styles as well as scripts. + +## Lifecycle + +If the asset server is long-lived and watching the file system, call `await assetServer.close()` +when shutting down dev servers or disposing tests. diff --git a/.agents/skills/remix/references/auth-and-sessions.md b/.agents/skills/remix/references/auth-and-sessions.md new file mode 100644 index 0000000..74d81e4 --- /dev/null +++ b/.agents/skills/remix/references/auth-and-sessions.md @@ -0,0 +1,420 @@ +# Authentication and Sessions + +## What This Covers + +How to remember things about a browser between requests and how to identify a user. Read this when +the task involves: + +- Storing per-browser state across requests (login, cart, "I have submitted this form") +- Adding a credentials login flow or an OAuth provider +- Protecting routes with `requireAuth()` or stacking authorization checks +- Reading or writing `Session`, `Auth`, or other identity-related context values +- Logging in, logging out, or rotating session IDs + +For raw cookies that are not session-backed (theme, locale, dismissed-banner), see +`createCookie` in this file plus the broader `Package Map` in `SKILL.md`. + +## Sessions vs Plain Cookies + +Reach for `remix/session` when state is sensitive, must be tamper-resistant, or represents the +identity of a request: who is logged in, which form a browser already submitted, what items are in +a cart. Sessions sign or encrypt their backing cookie with a server-held secret and give you a +typed `Session` object you can `get`, `set`, `flash`, `unset`, and `regenerateId`. + +Reach for `remix/cookie` directly when the browser is allowed to carry the value and the server +does not need session semantics. This often means preferences (theme, locale, dismissed banner), +but a signed cookie can also be fine for small low-risk values where you truly only need one +cookie-shaped fact and do not need `Session` helpers. + +If a malicious user editing the value would be a bug, or if the value needs server-managed +lifecycle, reach for a session. + +### Quick chooser + +| Need | Best fit | Why | +| ------------------------------------------------------------------- | --------------- | -------------------------------------------------- | +| Theme, locale, dismissed banner | `remix/cookie` | Browser-controlled preference | +| Small signed hint with minimal lifecycle | `remix/cookie` | One value, no `Session` helpers needed | +| "This browser already submitted", cart, flash messages, login state | `remix/session` | Tamper-sensitive, server-managed per-browser state | +| "One real person only", ownership, durable identity | account/auth | Cookies or sessions alone do not prove personhood | + +## Session Setup + +### Create a session cookie + +```typescript +import { createCookie } from "remix/cookie"; + +let sessionSecret = process.env.SESSION_SECRET; +if (!sessionSecret && process.env.NODE_ENV !== "test") { + throw new Error("SESSION_SECRET is required"); +} + +export let sessionCookie = createCookie("session", { + secrets: [sessionSecret ?? "test-only-secret"], + httpOnly: true, + sameSite: "Lax", + secure: process.env.NODE_ENV === "production", + maxAge: 2592000, // 30 days + path: "/", +}); +``` + +The cookie should always be `httpOnly`, default to `sameSite: 'Lax'`, and be `secure` in +production. Demo defaults like `'s3cr3t'` are fine in tests but should never reach production — +fail fast when the secret is missing. + +### Create session storage + +```typescript +// Filesystem storage +import { createFsSessionStorage } from "remix/session/fs-storage"; +export let sessionStorage = createFsSessionStorage("./tmp/sessions"); + +// Memory storage (for tests) +import { createMemorySessionStorage } from "remix/session/memory-storage"; +export let sessionStorage = createMemorySessionStorage(); +``` + +### Add session middleware + +```typescript +import { session } from "remix/session-middleware"; + +let router = createRouter({ + middleware: [ + session(sessionCookie, sessionStorage), + // ... other middleware + ], +}); +``` + +### Using sessions in handlers + +```typescript +import { Session } from "remix/session"; + +async function handler({ get }) { + let session = get(Session); + + // Read + let userId = session.get("userId"); + + // Write + session.set("userId", 42); + + // Flash (read once, then cleared) + session.flash("message", "Settings saved!"); + let message = session.get("message"); // returns and clears + + // Remove a key + session.unset("userId"); + + // Regenerate session ID (after login/logout) + session.regenerateId(true); +} +``` + +### Sessions for non-auth state + +Sessions are not just for login. They are the right place to store any tamper-sensitive +per-browser fact: which form a browser already submitted, how many free actions are left in a +trial, which feature flags a tester opted into, what items are in a cart. + +```typescript +async function submit({ get }) { + let session = get(Session) + if (session.get('hasSubmitted')) { + return render(, { status: 409 }) + } + + let parsed = s.parseSafe(submitSchema, get(FormData)) + if (!parsed.success) { + return render(, { status: 400 }) + } + + await saveSubmission(parsed.value) + session.set('hasSubmitted', true) + session.flash('message', 'Thanks for submitting!') + + return redirect(routes.thanks.href()) +} +``` + +Notice that there is no manual `Set-Cookie` plumbing in the action — the session middleware handles +that, and the handler returns an ordinary `Response`. Per-browser state enforced this way is still +bypassable by clearing cookies; if the guarantee needs to survive that, you also need an account +(see auth providers below). + +## Auth Middleware + +### Basic setup + +```typescript +import { auth, createSessionAuthScheme } from "remix/auth-middleware"; +import { Session } from "remix/session"; +import { Database } from "remix/data-table"; + +export function loadAuth() { + return auth({ + schemes: [ + createSessionAuthScheme({ + read(session) { + let data = session.get("auth"); + return data ?? null; + }, + async verify(value, context) { + let db = context.get(Database); + return (await db.find(users, value.userId)) ?? null; + }, + invalidate(session) { + session.unset("auth"); + }, + }), + ], + }); +} +``` + +### Reading auth state + +```typescript +import { Auth } from "remix/auth-middleware"; + +function handler({ get }) { + let auth = get(Auth); + + if (auth.ok) { + // User is authenticated + let user = auth.identity; + } +} +``` + +## Credentials Auth + +### Define a credentials provider + +```typescript +import { createCredentialsAuthProvider, verifyCredentials, completeAuth } from "remix/auth"; +import * as s from "remix/data-schema"; +import * as f from "remix/data-schema/form-data"; + +let loginSchema = f.object({ + email: f.field(s.defaulted(s.string(), "")), + password: f.field(s.defaulted(s.string(), "")), +}); + +export let passwordProvider = createCredentialsAuthProvider({ + parse(context) { + let formData = context.get(FormData); + return s.parse(loginSchema, formData); + }, + async verify({ email, password }, context) { + let db = context.get(Database); + let user = await db.findOne(users, { where: { email } }); + if (!user || !(await verifyPassword(password, user.password_hash))) { + return null; + } + return user; + }, +}); +``` + +### Login action + +```typescript +import { verifyCredentials, completeAuth } from 'remix/auth' +import { redirect } from 'remix/response/redirect' + +async action(context) { + let user = await verifyCredentials(passwordProvider, context) + + if (user == null) { + let session = context.get(Session) + session.flash('error', 'Invalid email or password.') + return redirect(routes.auth.login.href()) + } + + let session = completeAuth(context) + session.set('auth', { userId: user.id }) + + return redirect(routes.home.href()) +}, +``` + +### Logout action + +```typescript +import { Session } from "remix/session"; +import { redirect } from "remix/response/redirect"; + +function logout(context) { + let session = context.get(Session); + session.unset("auth"); + session.regenerateId(true); + return redirect(routes.home.href()); +} +``` + +## OAuth / External Auth + +### Create providers + +```typescript +import { + createAtmosphereAuthProvider, + createGoogleAuthProvider, + createGitHubAuthProvider, + startExternalAuth, + finishExternalAuth, + completeAuth, + refreshExternalAuth, +} from "remix/auth"; + +let googleProvider = createGoogleAuthProvider({ + clientId: process.env.GOOGLE_CLIENT_ID, + clientSecret: process.env.GOOGLE_CLIENT_SECRET, + redirectUri: new URL(routes.auth.google.callback.href(), origin), +}); + +let githubProvider = createGitHubAuthProvider({ + clientId: process.env.GITHUB_CLIENT_ID, + clientSecret: process.env.GITHUB_CLIENT_SECRET, + redirectUri: new URL(routes.auth.github.callback.href(), origin), +}); + +let atmosphereSessionSecret = process.env.ATMOSPHERE_SESSION_SECRET; +if (!atmosphereSessionSecret && process.env.NODE_ENV !== "test") { + throw new Error("ATMOSPHERE_SESSION_SECRET is required"); +} + +let atmosphereProvider = createAtmosphereAuthProvider({ + clientId: "https://app.example.com/oauth/client-metadata.json", + redirectUri: new URL(routes.auth.atmosphere.callback.href(), origin), + sessionSecret: atmosphereSessionSecret ?? "test-only-secret", +}); +``` + +For Atmosphere-compatible atproto OAuth, create the provider once, call +`atmosphereProvider.prepare(handleOrDid)` before `startExternalAuth(...)`, then pass the same +module-scope provider to `finishExternalAuth(...)` and `refreshExternalAuth(...)`. + +### OAuth controller + +```typescript +export default { + actions: { + // GET /auth/google — redirect to Google + async index(context) { + return await startExternalAuth(googleProvider, context, { + returnTo: context.url.searchParams.get("returnTo"), + }); + }, + + // GET /auth/google/callback — handle redirect back + async callback(context) { + let { result, returnTo } = await finishExternalAuth(googleProvider, context); + + let db = context.get(Database); + let { user, authAccount } = await resolveExternalAuth(db, result); + + let session = completeAuth(context); + session.set("auth", { + userId: user.id, + loginMethod: result.provider, + authAccountId: authAccount.id, + }); + + return redirect(returnTo ?? routes.account.href()); + }, + }, +} satisfies Controller; +``` + +### Refresh stored provider tokens + +Use `refreshExternalAuth(provider, tokens)` when an app has stored OAuth/OIDC tokens and needs a +fresh access token from a refresh token. Built-in OIDC providers, X, and Atmosphere support +refresh-token exchange. If the provider does not rotate the refresh token, the refreshed bundle +preserves the current one. + +```typescript +async function refreshGoogleTokens({ get }) { + let db = get(Database); + let account = await db.findOne(authAccounts, { where: { provider: "google" } }); + if (!account) return null; + + let refreshed = await refreshExternalAuth(googleProvider, account.tokens); + await db.update(authAccounts, account.id, { tokens: refreshed.tokens }); + + return refreshed.tokens; +} +``` + +## Protecting Routes + +### Controller-level protection + +Apply `requireAuth()` to an entire controller subtree: + +```typescript +import { requireAuth } from "remix/auth-middleware"; + +export default { + middleware: [requireAuth()], + actions: { + index() { + /* guaranteed authenticated */ + }, + settings: settingsController, + }, +} satisfies Controller; +``` + +### Stacking middleware + +Combine auth checks with role checks: + +```typescript +export default { + middleware: [requireAuth(), requireAdmin()], + actions: { + index() { + /* requires auth + admin */ + }, + }, +} satisfies Controller; +``` + +### Action-level protection + +Apply middleware to a single route: + +```typescript +import { Auth, requireAuth } from 'remix/auth-middleware' + +router.get(routes.account, { + middleware: [requireAuth()], + handler(context) { + let auth = context.get(Auth) + return render() + }, +}) +``` + +### Redirect on auth failure + +```typescript +import { requireAuth } from "remix/auth-middleware"; +import { redirect } from "remix/response/redirect"; + +export function requireAuthRedirect() { + return requireAuth({ + onFailure(context) { + let returnTo = encodeURIComponent(context.url.pathname); + return redirect(routes.auth.login.href() + `?returnTo=${returnTo}`, 303); + }, + }); +} +``` diff --git a/.agents/skills/remix/references/component-model.md b/.agents/skills/remix/references/component-model.md new file mode 100644 index 0000000..7c112e0 --- /dev/null +++ b/.agents/skills/remix/references/component-model.md @@ -0,0 +1,282 @@ +# Component Model + +## What This Covers + +How a Remix Component is shaped and how its state, lifecycle, and updates behave. Read this when +the task involves: + +- Writing a component (`handle` plus render function) +- Managing component-local state, derived values, or post-render DOM work +- Using `handle.props`, `handle.update()`, `handle.queueTask()`, `handle.signal`, `handle.id`, or + `handle.context` +- Listening to global events with cleanup tied to the component lifecycle + +For host-element behavior (event handlers, styles, refs, animations), see +`mixins-styling-events.md`. For browser hydration, frames, and navigation, see +`hydration-frames-navigation.md`. + +## Phases + +A component has two phases: + +1. **Setup phase** — runs once when the component is created +2. **Render phase** — returned function runs on initial render and every update + +```tsx +import { on, type Handle } from "remix/ui"; + +function Counter(handle: Handle<{ initialCount?: number; label: string }>) { + let count = handle.props.initialCount ?? 0; + + return () => ( + + ); +} +``` + +## Props + +Components receive all JSX props through `handle.props`. The object identity is stable for the +component lifetime, and its values are updated before each render. Put initialization inputs on +normal JSX props and read them from `handle.props`: + +```tsx +function Timer(handle: Handle<{ initialSeconds: number; paused?: boolean }>) { + let seconds = handle.props.initialSeconds; + + return () =>
    Time remaining: {seconds}s
    ; +} + +// Usage: +``` + +Because `handle.props` is stable, destructuring `let { props } = handle` is safe when helpers need +to read current values later. Destructuring individual prop values is only a snapshot; prefer +`handle.props.name` inside callbacks and render output when values can change. + +## State Rules + +- Keep state in setup scope as plain JavaScript variables. +- Store only what affects rendering. Derive computed values in render. +- Do not mirror input state unless you truly need controlled behavior. +- Do work in event handlers, not in render. Use the handler scope for transient state. + +```tsx +// Derive computed values in render +function TodoList(handle: Handle) { + let todos: Array<{ text: string; completed: boolean }> = []; + + return () => { + let completedCount = todos.filter((t) => t.completed).length; + return
    Completed: {completedCount}
    ; + }; +} +``` + +## Handle API + +### `handle.update()` + +Schedules a rerender. Returns a promise that resolves with an `AbortSignal` after the update +completes. Await it when you need the updated DOM before follow-up work: + +```tsx +on("click", async () => { + isPlaying = true; + let signal = await handle.update(); + // DOM is now updated, safe to focus or measure + stopButton.focus(); +}); +``` + +### `handle.queueTask(task)` + +Schedules a task to run after the next update. The task receives an `AbortSignal` that aborts when +the component re-renders or is removed. Use for post-render DOM work, reactive data loading, or +hydration-sensitive setup: + +```tsx +let data = null; +let requestedUrl: string | null = null; + +// Post-render DOM work in an event handler +on("click", () => { + showDetails = true; + handle.update(); + handle.queueTask(() => { + detailsSection.scrollIntoView({ behavior: "smooth" }); + }); +}); + +// Reactive data loading keyed by props.url +return () => { + if (requestedUrl !== handle.props.url) { + let nextUrl = handle.props.url; + requestedUrl = nextUrl; + data = null; + + handle.queueTask(async (signal) => { + let response = await fetch(nextUrl, { signal }); + let json = await response.json(); + if (signal.aborted || requestedUrl !== nextUrl) return; + data = json; + handle.update(); + }); + } + + return
    {data ?? "Loading..."}
    ; +}; +``` + +Avoid creating intermediate state just to trigger `queueTask`. Do the work directly in the handler +or the queued task. + +### `handle.signal` + +An `AbortSignal` aborted when the component disconnects. Use for cleanup: + +```tsx +function Clock(handle: Handle) { + let interval = setInterval(handle.update, 1000); + handle.signal.addEventListener("abort", () => clearInterval(interval)); + + return () => {new Date().toString()}; +} +``` + +### `handle.id` + +Stable identifier per component instance. Useful for `htmlFor`, `aria-owns`, etc.: + +```tsx +function LabeledInput(handle: Handle) { + return () => ( +
    + + +
    + ); +} +``` + +### `handle.frame` and `handle.frames` + +Frame-aware behavior for client entries rendered inside frames: + +- `handle.frame.reload()` — reload the containing frame +- `handle.frame.src` — the URL of the containing frame +- `handle.frames.top` — the root frame (the whole page) +- `handle.frames.top.reload()` — reload the entire page/frame tree +- `handle.frames.get(name)` — look up a named frame; returns `FrameHandle | undefined` + +```tsx +function RefreshButton(handle: Handle) { + return () => ; +} +``` + +### `handle.context` + +Context for ancestor/descendant communication. See the context section below. + +## Context + +Use `handle.context.set()` to provide values and `handle.context.get(Provider)` to consume them. +`set()` does **not** trigger updates — call `handle.update()` if the tree needs to rerender. + +```tsx +function ThemeProvider(handle: Handle<{ children?: RemixNode }, { theme: "light" | "dark" }>) { + let theme: "light" | "dark" = "light"; + handle.context.set({ theme }); + + return () => ( +
    + + {handle.props.children} +
    + ); +} + +function ThemedContent(handle: Handle) { + let { theme } = handle.context.get(ThemeProvider); + return () =>
    Current theme: {theme}
    ; +} +``` + +For granular updates without re-rendering the full subtree, use `TypedEventTarget`: + +```tsx +import { TypedEventTarget, addEventListeners } from "remix/ui"; + +class Theme extends TypedEventTarget<{ change: Event }> { + #value: "light" | "dark" = "light"; + get value() { + return this.#value; + } + setValue(value: "light" | "dark") { + this.#value = value; + this.dispatchEvent(new Event("change")); + } +} + +function ThemeProvider(handle: Handle<{ children?: RemixNode }, Theme>) { + let theme = new Theme(); + handle.context.set(theme); + + return () => ( +
    + + {handle.props.children} +
    + ); +} + +function ThemedContent(handle: Handle) { + let theme = handle.context.get(ThemeProvider); + addEventListeners(theme, handle.signal, { + change() { + handle.update(); + }, + }); + return () =>
    Theme: {theme.value}
    ; +} +``` + +## Global Events + +Use `addEventListeners(target, handle.signal, listeners)` to listen to global targets with +automatic cleanup when the component disconnects: + +```tsx +import { addEventListeners, type Handle } from "remix/ui"; + +function ResizeTracker(handle: Handle) { + let width = window.innerWidth; + + addEventListeners(window, handle.signal, { + resize() { + width = window.innerWidth; + handle.update(); + }, + }); + + return () =>
    {width}
    ; +} +``` diff --git a/.agents/skills/remix/references/create-mixins.md b/.agents/skills/remix/references/create-mixins.md new file mode 100644 index 0000000..cb4f379 --- /dev/null +++ b/.agents/skills/remix/references/create-mixins.md @@ -0,0 +1,158 @@ +# Creating Mixins + +## What This Covers + +How to author your own reusable host-element behavior with `createMixin`. Read this when the task +involves: + +- Combining multiple low-level events or DOM hooks into one semantic mixin +- Dispatching custom DOM events from a host node +- Encapsulating imperative DOM setup that several components share +- Typing custom events on `HTMLElementEventMap` for use with `on(...)` + +For the built-in mixins most code should use, see `mixins-styling-events.md`. + +Use `createMixin` from `remix/ui` to author reusable host-element behavior. + +Most app code should use built-in core mixins (`on`, `css`, `ref`, `link`, `attrs`) and animation +mixins from `remix/ui/animation`. Create custom mixins when combining multiple low-level events +into one semantic event, or when the pattern is reused across components. + +## Core Semantics + +1. A mixin handle is tied to one mounted host node lifecycle. +2. `insert` is the host-node availability point for imperative setup. +3. `remove` is teardown for that same lifecycle. +4. `queueTask` runs post-commit and receives `(node, signal)` for mixins. +5. Mixin render functions should stay pure; side effects belong in `insert`, `remove`, or queued + work. + +```tsx +import { createMixin } from "remix/ui"; + +let myMixin = createMixin((handle) => { + handle.addEventListener("insert", (event) => { + // event.node is the mounted host node + }); + + handle.addEventListener("remove", () => { + // Clean up listeners, timers, observers + }); + + return (props) => { + handle.queueTask((node) => { + // Post-commit work that needs the concrete host node + }); + return ; + }; +}); +``` + +## Patterns + +### Pure prop transform + +```tsx +let withTitle = createMixin((handle) => (title: string, props: { title?: string }) => ( + +)); +``` + +### Lifecycle-managed imperative setup + +```tsx +let withFocus = createMixin((handle) => { + handle.addEventListener("insert", (event) => { + event.node.focus(); + }); + return (props) => ; +}); +``` + +## Custom Event Mixins + +Create event mixins when you combine multiple low-level events into one semantic custom event that +is reused across components. + +1. Namespace custom event names (`myapp:*`) to avoid collisions. +2. Extend `Event` with the data consumers need. +3. Declare the event on `HTMLElementEventMap` for type safety with `on(...)`. +4. Dispatch from the host node inside the mixin. + +```tsx +import { createMixin, on } from "remix/ui"; + +export let dragReleaseType = "myapp:drag-release" as const; + +declare global { + interface HTMLElementEventMap { + [dragReleaseType]: DragReleaseEvent; + } +} + +export class DragReleaseEvent extends Event { + velocityX: number; + velocityY: number; + constructor(init: { velocityX: number; velocityY: number }) { + super(dragReleaseType, { bubbles: true, cancelable: true }); + this.velocityX = init.velocityX; + this.velocityY = init.velocityY; + } +} + +export let dragRelease = createMixin((handle) => { + let node: HTMLElement | undefined; + let tracking = false; + let velocityX = 0; + let velocityY = 0; + let lastX = 0; + let lastY = 0; + let lastT = 0; + + handle.addEventListener("insert", (event) => { + node = event.node; + }); + + return () => ( + { + if (!event.isPrimary) return; + tracking = true; + lastX = event.clientX; + lastY = event.clientY; + lastT = event.timeStamp; + node?.setPointerCapture(event.pointerId); + }), + on("pointermove", (event) => { + if (!tracking) return; + let dt = Math.max(1, event.timeStamp - lastT); + velocityX = (event.clientX - lastX) / dt; + velocityY = (event.clientY - lastY) / dt; + lastX = event.clientX; + lastY = event.clientY; + lastT = event.timeStamp; + }), + on("pointerup", () => { + if (!tracking) return; + tracking = false; + node?.dispatchEvent(new DragReleaseEvent({ velocityX, velocityY })); + }), + ]} + /> + ); +}); +``` + +Consume it: + +```tsx +
    { + console.log("velocity:", event.velocityX, event.velocityY); + }), + ]} +/> +``` diff --git a/.agents/skills/remix/references/data-and-validation.md b/.agents/skills/remix/references/data-and-validation.md new file mode 100644 index 0000000..5eb4510 --- /dev/null +++ b/.agents/skills/remix/references/data-and-validation.md @@ -0,0 +1,363 @@ +# Data Access and Validation + +## What This Covers + +How input becomes a value the app trusts, and how that value reaches storage. Read this when the +task involves: + +- Defining database tables, columns, relations, and migrations +- Querying or mutating persisted data with `Database` +- Parsing and validating user input from forms, query strings, or external payloads +- Choosing between schema-level checks, table validation hooks, and migration-level constraints + +For where validation runs in the request lifecycle, see `routing-and-controllers.md`. For session +or identity-bound writes, see `auth-and-sessions.md`. + +## Table Definitions (`remix/data-table`) + +Define tables with typed columns, relations, and optional validation hooks: + +```typescript +import { belongsTo, column as c, hasMany, table } from "remix/data-table"; +import type { TableRow, TableRowWith } from "remix/data-table"; + +export const books = table({ + name: "books", + columns: { + id: c.integer().primaryKey().autoIncrement(), + slug: c.text().notNull().unique(), + title: c.text().notNull(), + author: c.text().notNull(), + price: c.decimal(10, 2).notNull(), + genre: c.text().notNull(), + in_stock: c.boolean(), + }, +}); + +export const orders = table({ + name: "orders", + columns: { + id: c.integer().primaryKey().autoIncrement(), + user_id: c.integer().notNull().references("users", "id"), + total: c.decimal(10, 2).notNull(), + created_at: c.integer().notNull(), + }, + relations: { + user: belongsTo("users", "user_id"), + items: hasMany("order_items", "order_id"), + }, +}); + +export type Book = TableRow; +export type Order = TableRow; +export type OrderWithItems = TableRowWith; +``` + +### Column types + +| Method | SQL type | +| ----------------------------- | ------------------ | +| `c.integer()` | INTEGER | +| `c.text()` | TEXT | +| `c.boolean()` | BOOLEAN | +| `c.decimal(precision, scale)` | DECIMAL | +| `c.enum([...])` | TEXT (string enum) | +| `c.uuid()` | UUID / TEXT | +| `c.varchar(length)` | VARCHAR | + +Column modifiers: `.primaryKey()`, `.autoIncrement()`, `.notNull()`, `.unique()`, +`.references(table, column, fkName?)`, `.onDelete(action)`, `.default(value)`. + +Composite primary keys go on the table option, not the column: `primaryKey: ['order_id', 'book_id']`. + +### Schema vs migrations + +Column modifiers describe SQL constraints — the source of truth for them is your **migration** +files, where they generate the actual DDL. Runtime `table(...)` definitions in `app/data/schema.ts` +can use the same modifiers, or they can stay minimal (`c.integer()`, `c.text()`, ...) since the +runtime only needs the column shape and validation hooks. Two valid patterns: + +- **Modifiers in both** — schema and migrations stay in sync visually; useful when you want + schema-level docs. +- **Bare columns in schema, full modifiers in migrations** — schema describes what the app reads + and writes; migrations own the DDL and constraints. + +Pick one and apply it consistently across the app. + +### Table validation hooks + +Tables can define `validate`, `beforeWrite`, and `afterRead` hooks: + +```typescript +export const books = table({ + name: "books", + columns: { + /* ... */ + }, + validate({ operation, value }) { + let issues = []; + if (operation === "create" && !value.slug) { + issues.push({ message: "Slug is required.", path: ["slug"] }); + } + return issues.length > 0 ? { issues } : { value }; + }, +}); +``` + +## Database Setup + +Create a database with an adapter and expose it via middleware: + +```typescript +import BetterSqlite3 from "better-sqlite3"; +import { createDatabase, Database } from "remix/data-table"; +import { createSqliteDatabaseAdapter } from "remix/data-table-sqlite"; + +let sqlite = new BetterSqlite3("./db/app.db"); +sqlite.pragma("foreign_keys = ON"); +let adapter = createSqliteDatabaseAdapter(sqlite); +export let db = createDatabase(adapter); +``` + +`createSqliteDatabaseAdapter` accepts synchronous SQLite clients with a shared `prepare`/`exec` +surface, including Node's `node:sqlite`, Bun's `bun:sqlite`, and compatible clients. Use whichever +client fits the runtime instead of assuming `better-sqlite3` is required. + +### Database middleware + +```typescript +import type { Middleware } from "remix/fetch-router"; +import { Database } from "remix/data-table"; + +export function loadDatabase(): Middleware { + return async (context, next) => { + context.set(Database, db); + return next(); + }; +} +``` + +### Querying + +```typescript +let db = get(Database); + +// Find by primary key +let book = await db.find(books, id); + +// Find one by condition +let user = await db.findOne(users, { where: { email } }); + +// Find many with ordering +let allBooks = await db.findMany(books, { orderBy: ["id", "asc"] }); + +// Count +let total = await db.count(orders, { where: { user_id: userId } }); + +// Query builder +let genres = await db.query(books).select("genre").distinct().orderBy("genre", "asc").all(); + +// Create +let newBook = await db.create(books, { slug: "new-book", title: "New Book" /* ... */ }); + +// Update +await db.update(books, bookId, { title: "Updated Title" }); + +// Delete +await db.delete(books, bookId); +``` + +### Operators + +```typescript +import { inList } from "remix/data-table/operators"; + +let featured = await db.findMany(books, { + where: inList("slug", ["book-a", "book-b", "book-c"]), +}); +``` + +## Migrations + +### Writing migrations + +```typescript +import { column as c, createMigration } from "remix/data-table/migrations"; +import { table } from "remix/data-table"; + +export default createMigration({ + async up({ schema }) { + let users = table({ + name: "users", + columns: { + id: c.integer().primaryKey().autoIncrement(), + email: c.text().notNull().unique(), + name: c.text().notNull(), + }, + }); + await schema.createTable(users); + await schema.createIndex(users, "email", { name: "users_email_idx", unique: true }); + }, + + async down({ schema }) { + await schema.dropTable("users"); + }, +}); +``` + +Migrations can also import table definitions from the app schema to avoid duplication: + +```typescript +import { createMigration } from "remix/data-table/migrations"; +import { users, authAccounts } from "../../app/data/schema.ts"; + +export default createMigration({ + async up({ schema }) { + await schema.createTable(users); + await schema.createTable(authAccounts); + }, +}); +``` + +### Running migrations + +```typescript +import { createMigrationRunner } from "remix/data-table/migrations"; +import { loadMigrations } from "remix/data-table/migrations/node"; + +let migrations = await loadMigrations("./db/migrations"); +let runner = createMigrationRunner(adapter, migrations); +await runner.up(); +``` + +### Migration file naming + +Name migration files with a timestamp prefix: `20260228090000_create_users.ts`. Place them in +`db/migrations/`. + +## Input Validation (`remix/data-schema`) + +Use `data-schema` to validate user input (forms, query params, API payloads). This is separate from +table-level `validate` hooks which run at persistence. + +### Schema builders + +```typescript +import * as s from "remix/data-schema"; +import { email, minLength, maxLength } from "remix/data-schema/checks"; + +let userSchema = s.object({ + name: s.string().pipe(minLength(1)), + email: s.string().pipe(email()), + age: s.optional(s.number()), +}); + +let result = s.parse(userSchema, data); +``` + +### FormData validation + +Use `remix/data-schema/form-data` to validate `FormData` directly: + +```typescript +import * as s from "remix/data-schema"; +import * as f from "remix/data-schema/form-data"; +import { email, minLength } from "remix/data-schema/checks"; + +let signupSchema = f.object({ + name: f.field(s.string().pipe(minLength(1))), + email: f.field(s.string().pipe(email())), + password: f.field(s.string().pipe(minLength(8))), +}); + +// In a controller action: +let formData = get(FormData); +let { name, email, password } = s.parse(signupSchema, formData); +``` + +### Reading FormData: middleware vs `request.formData()` + +There are two ways to get a `FormData` value inside an action. + +The recommended way: register `formData()` middleware in the root stack and read with +`get(FormData)`. The body is parsed once per request, and the typed `FormData` value flows through +the context system. This also lets `methodOverride()` and CSRF middleware work uniformly. + +```typescript +import { formData } from "remix/form-data-middleware"; + +let router = createRouter({ + middleware: [, /* ... */ formData() /* ... */], +}); + +// In an action: +let parsed = s.parseSafe(signupSchema, get(FormData)); +``` + +The fallback: `await request.formData()` directly. This works without middleware and is fine for +small one-off cases, but it bypasses the context system, runs once per call site, and doesn't +compose with middleware that depends on parsed form fields. + +### Safe parsing + +`s.parse` throws on invalid input. `s.parseSafe` returns a tagged result and is usually what an +action wants, since validation failure is an expected outcome (re-render the form with errors) +rather than an exception: + +```typescript +let result = s.parseSafe(signupSchema, get(FormData)) +if (!result.success) { + return render(, { status: 400 }) +} +let { name, email, password } = result.value +``` + +Returning a `Response` for validation failures keeps the route contract honest: the same action +returns 200 on success, 400 with errors on bad input, no out-of-band exception flow. + +### Transforming validated output + +Use `.transform(...)` when a schema should validate one shape but return another value or output +type. Transforms run after validation and compose with `.pipe(...)` and `.refine(...)`: + +```typescript +import * as coerce from "remix/data-schema/coerce"; + +let slugSchema = s + .string() + .pipe(minLength(1)) + .transform((value) => value.trim().toLowerCase().replace(/\s+/g, "-")); + +let pageSchema = f.object({ + page: f.field(s.defaulted(coerce.coerceNumber(), 1).refine(Number.isInteger)), + q: f.field(s.defaulted(s.string(), "").transform((value) => value.trim())), +}); + +let { page, q } = s.parse(pageSchema, formData); +``` + +### Anti-patterns + +Avoid these shapes when reading and validating input: + +- **Raw `formData.get('name')` plus an `if (typeof name !== 'string')` guard**, then a thrown + custom error. This reinvents what `data-schema` already does, loses the typed result, and + pushes error translation into a `try/catch` instead of a return value. +- **Letting route-local domain errors leak out of the action.** Translate expected outcomes (bad + input, missing record, duplicate entry) into the `Response` the route means to return instead of + throwing a custom `Error` subclass with a `status` field and catching it later. +- **Trusting `params`, query strings, or external payloads without a schema.** Anything that + crosses a trust boundary should be parsed before it reaches business logic. + +### Common patterns + +```typescript +// Optional with default +let limitSchema = f.field(s.defaulted(s.string(), "10")); + +// Union types +let methodSchema = s.union([s.literal("credentials"), s.literal("google"), s.literal("github")]); + +// Refinements +let idSchema = s.number().refine(Number.isInteger, "Expected an integer"); +``` diff --git a/.agents/skills/remix/references/hydration-frames-navigation.md b/.agents/skills/remix/references/hydration-frames-navigation.md new file mode 100644 index 0000000..0d2d1b0 --- /dev/null +++ b/.agents/skills/remix/references/hydration-frames-navigation.md @@ -0,0 +1,297 @@ +# Hydration, Frames, and Navigation + +## What This Covers + +How server-rendered UI becomes interactive in the browser, and how the page updates without a full +navigation. Read this when the task involves: + +- Marking a component for client-side hydration with `clientEntry` +- Booting the client runtime with `run` +- Streaming server content into a region of the page with `` and reloading those regions +- Triggering Navigation API transitions with `navigate(...)` or `link(...)` +- Server rendering with `renderToStream` or `renderToString` +- Managing the document `` + +For component-local state and updates, see `component-model.md`. For host-element behavior and +events, see `mixins-styling-events.md`. + +## Server First, Then Hydrate + +Make the server route correct before adding `clientEntry(...)`. A POST should already do the right +thing on its own — return HTML, a redirect, or an error response — and a GET should already render +the page the user expects. `clientEntry` exists to layer interactivity on top of UI that already +works without it. + +When server state changes after a mutation, prefer reloading a `` when the UI region already +maps cleanly to a server-rendered route. Frames re-fetch the same route, so the rendering logic +stays in one place and the client does not need a parallel "state" API. + +```tsx +on("submit", async (event, signal) => { + event.preventDefault(); + await fetch(routes.cart.add.href(), { + method: "POST", + body: new FormData(event.currentTarget), + signal, + }); + if (signal.aborted) return; + await handle.frames.get("cart-summary")?.reload(); +}); +``` + +Use polling or a small JSON state endpoint when the data changes outside this page, or when a tiny +shared widget would be heavier to model as a frame. Pick the lightest sync mechanism that preserves +clear ownership of rendering logic. + +## Client Entries + +Use `clientEntry` to mark a component for client-side hydration. In source-served apps, prefer the +source module's `import.meta.url` as the entry ID and let server rendering map it to the public +asset URL: + +```tsx +import { clientEntry, on, type Handle } from "remix/ui"; + +export const Counter = clientEntry( + import.meta.url, + function Counter(handle: Handle<{ initialCount: number; label: string }>) { + let count = handle.props.initialCount; + + return () => ( +
    + + {handle.props.label}: {count} + + +
    + ); + }, +); +``` + +On the server, provide `resolveClientEntry` to `renderToStream(...)` so source file URLs become +browser-loadable asset URLs. Keep this resolution in the render helper so component modules do not +hard-code deployment-specific asset paths: + +```tsx +let stream = renderToStream(, { + async resolveClientEntry(entryId, component) { + let exportName = entryId.split("#")[1] || component.name; + if (!exportName) { + throw new Error(`Unable to resolve client entry export for ${entryId}`); + } + + return { + href: await assetServer.getHref(entryId), + exportName, + }; + }, +}); +``` + +If the module export name differs from the component function name, include `#ExportName` in the +entry ID or return the exact export name from `resolveClientEntry`. A render helper that only +supports source-owned entries can also fail fast when `entryId` is not a `file://` URL. + +On the server, `clientEntry` components render like any other component. The server wraps their +output in comment markers and serializes props into a ` + + + ); +} diff --git a/app/ui/layout.tsx b/app/ui/layout.tsx new file mode 100644 index 0000000..24816d3 --- /dev/null +++ b/app/ui/layout.tsx @@ -0,0 +1,22 @@ +import type { RemixNode } from "remix/ui"; + +import { routes } from "../routes.ts"; +import { Document } from "./document.tsx"; + +export interface LayoutProps { + children?: RemixNode; + title?: string; +} + +export function Layout() { + return ({ children, title }: LayoutProps) => ( + +
    + +
    +
    {children}
    +
    + ); +} diff --git a/app/utils/render.tsx b/app/utils/render.tsx new file mode 100644 index 0000000..24a0927 --- /dev/null +++ b/app/utils/render.tsx @@ -0,0 +1,30 @@ +import type { RemixNode } from "remix/ui"; +import { renderToStream } from "remix/ui/server"; + +import { router } from "../router.ts"; + +export function render(node: RemixNode, request: Request, init?: ResponseInit) { + const stream = renderToStream(node, { + frameSrc: request.url, + async resolveFrame(src, target) { + const headers = new Headers({ accept: "text/html" }); + const cookie = request.headers.get("cookie"); + if (cookie) { + headers.set("cookie", cookie); + } + if (target) { + headers.set("x-remix-target", target); + } + + const response = await router.fetch(new Request(new URL(src, request.url), { headers })); + return response.body ?? response.text(); + }, + }); + + const headers = new Headers(init?.headers); + if (!headers.has("Content-Type")) { + headers.set("Content-Type", "text/html; charset=utf-8"); + } + + return new Response(stream, { ...init, headers }); +} diff --git a/astro.config.mjs b/astro.config.mjs deleted file mode 100644 index b18a1d9..0000000 --- a/astro.config.mjs +++ /dev/null @@ -1,41 +0,0 @@ -import { defineConfig } from "astro/config"; -import mdx from "@astrojs/mdx"; -import tailwindcss from "@tailwindcss/vite"; - -import sitemap from "@astrojs/sitemap"; - -// https://astro.build/config -export default defineConfig({ - site: "https://ubmit.dev", - markdown: { - shikiConfig: { - themes: { - light: "catppuccin-latte", - dark: "catppuccin-mocha", - }, - }, - }, - vite: { - plugins: [tailwindcss()], - }, - integrations: [mdx(), sitemap()], - redirects: { - "/twitter": "https://x.com/ubmit", - "/x": "https://x.com/ubmit", - "/linkedin": "https://www.linkedin.com/in/ubmit/", - "/github": "https://github.com/ubmit", - "/meet": "https://cal.com/ubmit/30min", - "/resume": "/resume.pdf", - /** - * Blog post redirects: Preserve SEO and prevent broken links. - * Blog posts were moved from root (/{slug}/) to /writing/{slug}/ route on Dec 23, 2025. - * These 301 redirects maintain backwards compatibility for existing URLs. - */ - "/agentic-engineering-without-lock-in/": - "/writing/agentic-engineering-without-lock-in/", - "/introduction-to-functional-programming-in-javascript/": - "/writing/introduction-to-functional-programming-in-javascript/", - "/use-an-object-instead-of-a-switch/": - "/writing/use-an-object-instead-of-a-switch/", - }, -}); diff --git a/conductor.json b/conductor.json deleted file mode 100644 index 8a98207..0000000 --- a/conductor.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "scripts": { - "setup": "cp \"$CONDUCTOR_ROOT_PATH/.env\" .env; pnpm install; vp config", - "run": "pnpm run dev --port $CONDUCTOR_PORT", - "archive": "rm -rf \"$HOME/Library/Application Support/com.conductor.app.dev.$CONDUCTOR_WORKSPACE_NAME\"" - } -} diff --git a/package.json b/package.json index e5c557d..d7c0c77 100644 --- a/package.json +++ b/package.json @@ -1,45 +1,41 @@ { "name": "ubmit-dev", + "private": true, "type": "module", - "version": "0.0.1", "scripts": { - "dev": "astro dev", - "start": "astro dev", - "build": "astro build", - "preview": "astro preview", - "astro": "astro", - "format": "vp fmt ./src", - "format:check": "vp fmt --check ./src", - "resume:compile": "typst compile ./resume/resume.typ ./public/resume.pdf", - "resume:watch": "typst watch ./resume/resume.typ ./public/resume.pdf", + "css:watch": "vp exec tailwindcss -i ./app/assets/styles.css -o ./app/assets/styles-out.css --watch", + "server:dev": "NODE_ENV=DEVELOPMENT tsx watch server.ts", + "dev": "npm-run-all --parallel css:watch server:dev", + "prestart": "vp exec tailwindcss -i ./app/assets/styles.css -o ./app/assets/styles-out.css", + "start": "tsx server.ts", + "tsc": "tsgo", + "lint": "vp lint", + "format": "vp fmt", + "format:check": "vp fmt --check", + "check": "npm-run-all --parallel tsc lint format:check", "prepare": "vp config" }, "dependencies": { - "@astrojs/check": "^0.9.8", - "@astrojs/mdx": "^5.0.2", - "@astrojs/rss": "^4.0.17", - "@astrojs/sitemap": "^3.7.1", - "@fontsource/work-sans": "^5.0.18", - "@radix-ui/colors": "^3.0.0", - "astro": "^6.0.6", - "chart.js": "^4.5.1", - "clsx": "^2.1.0", - "tailwind-merge": "^3.4.0", - "typescript": "^5.9.3" + "remix": "^3.0.0-beta.0", + "tsx": "latest" }, "devDependencies": { - "@astrojs/upgrade": "^0.7.1", - "@myriaddreamin/typst-ts-node-compiler": "0.7.0-rc2", - "@tailwindcss/typography": "^0.5.19", - "@tailwindcss/vite": "^4.1.18", - "tailwindcss": "^4.1.18", - "vite-plus": "latest" + "@nkzw/eslint-plugin": "^2.0.0", + "@nkzw/oxlint-config": "^1.1.1", + "@tailwindcss/cli": "^4.2.4", + "@types/node": "latest", + "@typescript/native-preview": "7.0.0-dev.20260501.1", + "eslint-plugin-no-only-tests": "^3.4.0", + "eslint-plugin-perfectionist": "^5.9.0", + "eslint-plugin-react-hooks": "^7.1.1", + "eslint-plugin-unused-imports": "^4.4.1", + "npm-run-all2": "^8.0.4", + "tailwindcss": "^4.2.4", + "typescript": "latest", + "vite-plus": "catalog:" }, - "packageManager": "pnpm@10.32.1", - "pnpm": { - "overrides": { - "vite": "npm:@voidzero-dev/vite-plus-core@latest", - "vitest": "npm:@voidzero-dev/vite-plus-test@latest" - } - } + "engines": { + "node": ">=24.3.0" + }, + "packageManager": "pnpm@10.33.2" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2144ee7..43670ed 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,6 +4,12 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +catalogs: + default: + vite-plus: + specifier: latest + version: 0.1.20 + overrides: vite: npm:@voidzero-dev/vite-plus-core@latest vitest: npm:@voidzero-dev/vite-plus-test@latest @@ -12,122 +18,88 @@ importers: .: dependencies: - '@astrojs/check': - specifier: ^0.9.8 - version: 0.9.8(prettier-plugin-astro@0.14.1)(prettier@3.8.1)(typescript@5.9.3) - '@astrojs/mdx': - specifier: ^5.0.2 - version: 5.0.2(astro@6.0.6(@types/node@24.12.0)(jiti@2.6.1)(rollup@4.59.0)(typescript@5.9.3)(yaml@2.8.2)) - '@astrojs/rss': - specifier: ^4.0.17 - version: 4.0.17 - '@astrojs/sitemap': - specifier: ^3.7.1 - version: 3.7.1 - '@fontsource/work-sans': - specifier: ^5.0.18 - version: 5.2.8 - '@radix-ui/colors': - specifier: ^3.0.0 - version: 3.0.0 - astro: - specifier: ^6.0.6 - version: 6.0.6(@types/node@24.12.0)(jiti@2.6.1)(rollup@4.59.0)(typescript@5.9.3)(yaml@2.8.2) - chart.js: - specifier: ^4.5.1 - version: 4.5.1 - clsx: - specifier: ^2.1.0 - version: 2.1.1 - tailwind-merge: - specifier: ^3.4.0 - version: 3.5.0 - typescript: - specifier: ^5.9.3 - version: 5.9.3 + remix: + specifier: ^3.0.0-beta.0 + version: 3.0.0-beta.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + tsx: + specifier: latest + version: 4.21.0 devDependencies: - '@astrojs/upgrade': - specifier: ^0.7.1 - version: 0.7.1 - '@myriaddreamin/typst-ts-node-compiler': - specifier: 0.7.0-rc2 - version: 0.7.0-rc2 - '@tailwindcss/typography': - specifier: ^0.5.19 - version: 0.5.19(tailwindcss@4.2.2) - '@tailwindcss/vite': - specifier: ^4.1.18 - version: 4.2.2(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.2)) + '@nkzw/eslint-plugin': + specifier: ^2.0.0 + version: 2.0.0(eslint@10.3.0(jiti@2.6.1)) + '@nkzw/oxlint-config': + specifier: ^1.1.1 + version: 1.1.1(eslint@10.3.0(jiti@2.6.1))(oxlint@1.62.0(oxlint-tsgolint@0.22.0))(typescript@6.0.3) + '@tailwindcss/cli': + specifier: ^4.2.4 + version: 4.2.4 + '@types/node': + specifier: latest + version: 25.6.0 + '@typescript/native-preview': + specifier: 7.0.0-dev.20260501.1 + version: 7.0.0-dev.20260501.1 + eslint-plugin-no-only-tests: + specifier: ^3.4.0 + version: 3.4.0 + eslint-plugin-perfectionist: + specifier: ^5.9.0 + version: 5.9.0(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) + eslint-plugin-react-hooks: + specifier: ^7.1.1 + version: 7.1.1(eslint@10.3.0(jiti@2.6.1)) + eslint-plugin-unused-imports: + specifier: ^4.4.1 + version: 4.4.1(eslint@10.3.0(jiti@2.6.1)) + npm-run-all2: + specifier: ^8.0.4 + version: 8.0.4 tailwindcss: - specifier: ^4.1.18 - version: 4.2.2 - vite-plus: + specifier: ^4.2.4 + version: 4.2.4 + typescript: specifier: latest - version: 0.1.12(@types/node@24.12.0)(esbuild@0.27.4)(jiti@2.6.1)(typescript@5.9.3)(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.2))(yaml@2.8.2) + version: 6.0.3 + vite-plus: + specifier: 'catalog:' + version: 0.1.20(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(typescript@6.0.3)(vite@8.0.10(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)) packages: - '@astrojs/check@0.9.8': - resolution: {integrity: sha512-LDng8446QLS5ToKjRHd3bgUdirvemVVExV7nRyJfW2wV36xuv7vDxwy5NWN9zqeSEDgg0Tv84sP+T3yEq+Zlkw==} - hasBin: true - peerDependencies: - typescript: ^5.0.0 + '@babel/code-frame@7.29.0': + resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} + engines: {node: '>=6.9.0'} - '@astrojs/cli-kit@0.4.1': - resolution: {integrity: sha512-bVzyKzEpIwqjihBU/aUzt1LQckJuHK0agd3/ITdXhPUYculrc6K1/K7H+XG4rwjXtg+ikT3PM05V1MVYWiIvQw==} - engines: {node: '>=18.14.1'} + '@babel/compat-data@7.29.3': + resolution: {integrity: sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==} + engines: {node: '>=6.9.0'} - '@astrojs/compiler@2.13.1': - resolution: {integrity: sha512-f3FN83d2G/v32ipNClRKgYv30onQlMZX1vCeZMjPsMMPl1mDpmbl0+N5BYo4S/ofzqJyS5hvwacEo0CCVDn/Qg==} + '@babel/core@7.29.0': + resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} + engines: {node: '>=6.9.0'} - '@astrojs/compiler@3.0.1': - resolution: {integrity: sha512-z97oYbdebO5aoWzuJ/8q5hLK232+17KcLZ7cJ8BCWk6+qNzVxn/gftC0KzMBUTD8WAaBkPpNSQK6PXLnNrZ0CA==} + '@babel/generator@7.29.1': + resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} + engines: {node: '>=6.9.0'} - '@astrojs/internal-helpers@0.8.0': - resolution: {integrity: sha512-J56GrhEiV+4dmrGLPNOl2pZjpHXAndWVyiVDYGDuw6MWKpBSEMLdFxHzeM/6sqaknw9M+HFfHZAcvi3OfT3D/w==} + '@babel/helper-compilation-targets@7.28.6': + resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} + engines: {node: '>=6.9.0'} - '@astrojs/language-server@2.16.6': - resolution: {integrity: sha512-N990lu+HSFiG57owR0XBkr02BYMgiLCshLf+4QG4v6jjSWkBeQGnzqi+E1L08xFPPJ7eEeXnxPXGLaVv5pa4Ug==} - hasBin: true - peerDependencies: - prettier: ^3.0.0 - prettier-plugin-astro: '>=0.11.0' - peerDependenciesMeta: - prettier: - optional: true - prettier-plugin-astro: - optional: true + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} - '@astrojs/markdown-remark@7.0.1': - resolution: {integrity: sha512-zAfLJmn07u9SlDNNHTpjv0RT4F8D4k54NR7ReRas8CO4OeGoqSvOuKwqCFg2/cqN3wHwdWlK/7Yv/lMXlhVIaw==} + '@babel/helper-module-imports@7.28.6': + resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} + engines: {node: '>=6.9.0'} - '@astrojs/mdx@5.0.2': - resolution: {integrity: sha512-0as6odPH9ZQhS3pdH9dWmVOwgXuDtytJiE4VvYgR0lSFBvF4PSTyE0HdODHm/d7dBghvWTPc2bQaBm4y4nTBNw==} - engines: {node: '>=22.12.0'} + '@babel/helper-module-transforms@7.28.6': + resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} + engines: {node: '>=6.9.0'} peerDependencies: - astro: ^6.0.0 - - '@astrojs/prism@4.0.1': - resolution: {integrity: sha512-nksZQVjlferuWzhPsBpQ1JE5XuKAf1id1/9Hj4a9KG4+ofrlzxUUwX4YGQF/SuDiuiGKEnzopGOt38F3AnVWsQ==} - engines: {node: '>=22.12.0'} - - '@astrojs/rss@4.0.17': - resolution: {integrity: sha512-eV+wdMbeVKC9+sPaV0LN8JL1LGo9YAh3GKl4Ou4nzMNLmXM/aswYpSGxVEAuHilgBZ6/++/Pv08ICmuOqX107w==} - - '@astrojs/sitemap@3.7.1': - resolution: {integrity: sha512-IzQqdTeskaMX+QDZCzMuJIp8A8C1vgzMBp/NmHNnadepHYNHcxQdGLQZYfkbd2EbRXUfOS+UDIKx8sKg0oWVdw==} - - '@astrojs/telemetry@3.3.0': - resolution: {integrity: sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ==} - engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} - - '@astrojs/upgrade@0.7.1': - resolution: {integrity: sha512-ToVSYvDF7y0b1CxgPgnrY1uTO+ES0yWa9j806nDvrDu0atkPjuKNgeGvEMJuLGbl2KbjrVeg2us8rZxB1FzMVg==} - engines: {node: '>=22.12.0'} - hasBin: true - - '@astrojs/yaml2ts@0.2.3': - resolution: {integrity: sha512-PJzRmgQzUxI2uwpdX2lXSHtP4G8ocp24/t+bZyf5Fy0SZLSF9f9KXZoMlFM/XCGue+B0nH/2IZ7FpBYQATBsCg==} + '@babel/core': ^7.0.0 '@babel/helper-string-parser@7.27.1': resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} @@ -137,360 +109,245 @@ packages: resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} - '@babel/parser@7.29.2': - resolution: {integrity: sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==} - engines: {node: '>=6.0.0'} - hasBin: true - - '@babel/types@7.29.0': - resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} - '@capsizecss/unpack@4.0.0': - resolution: {integrity: sha512-VERIM64vtTP1C4mxQ5thVT9fK0apjPFobqybMtA1UdUujWka24ERHbRHFGmpbbhp73MhV+KSsHQH9C6uOTdEQA==} - engines: {node: '>=18'} - - '@clack/core@1.1.0': - resolution: {integrity: sha512-SVcm4Dqm2ukn64/8Gub2wnlA5nS2iWJyCkdNHcvNHPIeBTGojpdJ+9cZKwLfmqy7irD4N5qLteSilJlE0WLAtA==} - - '@clack/prompts@1.1.0': - resolution: {integrity: sha512-pkqbPGtohJAvm4Dphs2M8xE29ggupihHdy1x84HNojZuMtFsHiUlRvqD24tM2+XmI+61LlfNceM3Wr7U5QES5g==} - - '@emmetio/abbreviation@2.3.3': - resolution: {integrity: sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA==} + '@babel/helpers@7.29.2': + resolution: {integrity: sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==} + engines: {node: '>=6.9.0'} - '@emmetio/css-abbreviation@2.1.8': - resolution: {integrity: sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw==} + '@babel/parser@7.29.3': + resolution: {integrity: sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==} + engines: {node: '>=6.0.0'} + hasBin: true - '@emmetio/css-parser@0.4.1': - resolution: {integrity: sha512-2bC6m0MV/voF4CTZiAbG5MWKbq5EBmDPKu9Sb7s7nVcEzNQlrZP6mFFFlIaISM8X6514H9shWMme1fCm8cWAfQ==} + '@babel/template@7.28.6': + resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} + engines: {node: '>=6.9.0'} - '@emmetio/html-matcher@1.3.0': - resolution: {integrity: sha512-NTbsvppE5eVyBMuyGfVu2CRrLvo7J4YHb6t9sBFLyY03WYhXET37qA4zOYUjBWFCRHO7pS1B9khERtY0f5JXPQ==} + '@babel/traverse@7.29.0': + resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} + engines: {node: '>=6.9.0'} - '@emmetio/scanner@1.0.4': - resolution: {integrity: sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==} + '@babel/types@7.29.0': + resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + engines: {node: '>=6.9.0'} - '@emmetio/stream-reader-utils@0.1.0': - resolution: {integrity: sha512-ZsZ2I9Vzso3Ho/pjZFsmmZ++FWeEd/txqybHTm4OgaZzdS8V9V/YYWQwg5TC38Z7uLWUV1vavpLLbjJtKubR1A==} + '@emnapi/core@1.10.0': + resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} - '@emmetio/stream-reader@2.2.0': - resolution: {integrity: sha512-fXVXEyFA5Yv3M3n8sUGT7+fvecGrZP4k6FnWWMSZVQf69kAq0LLpaBQLGcPR30m3zMmKYhECP4k/ZkzvhEW5kw==} + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} - '@emnapi/runtime@1.9.0': - resolution: {integrity: sha512-QN75eB0IH2ywSpRpNddCRfQIhmJYBCJ1x5Lb3IscKAL8bMnVAKnRg8dCoXbHzVLLH7P38N2Z3mtulB7W0J0FKw==} + '@emnapi/wasi-threads@1.2.1': + resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} - '@esbuild/aix-ppc64@0.27.4': - resolution: {integrity: sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==} + '@esbuild/aix-ppc64@0.27.7': + resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.27.4': - resolution: {integrity: sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==} + '@esbuild/android-arm64@0.27.7': + resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.27.4': - resolution: {integrity: sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==} + '@esbuild/android-arm@0.27.7': + resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.27.4': - resolution: {integrity: sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==} + '@esbuild/android-x64@0.27.7': + resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.27.4': - resolution: {integrity: sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==} + '@esbuild/darwin-arm64@0.27.7': + resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.27.4': - resolution: {integrity: sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==} + '@esbuild/darwin-x64@0.27.7': + resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.27.4': - resolution: {integrity: sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==} + '@esbuild/freebsd-arm64@0.27.7': + resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.27.4': - resolution: {integrity: sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==} + '@esbuild/freebsd-x64@0.27.7': + resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.27.4': - resolution: {integrity: sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==} + '@esbuild/linux-arm64@0.27.7': + resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.27.4': - resolution: {integrity: sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==} + '@esbuild/linux-arm@0.27.7': + resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.27.4': - resolution: {integrity: sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==} + '@esbuild/linux-ia32@0.27.7': + resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.27.4': - resolution: {integrity: sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==} + '@esbuild/linux-loong64@0.27.7': + resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.27.4': - resolution: {integrity: sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==} + '@esbuild/linux-mips64el@0.27.7': + resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.27.4': - resolution: {integrity: sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==} + '@esbuild/linux-ppc64@0.27.7': + resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.27.4': - resolution: {integrity: sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==} + '@esbuild/linux-riscv64@0.27.7': + resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.27.4': - resolution: {integrity: sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==} + '@esbuild/linux-s390x@0.27.7': + resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.27.4': - resolution: {integrity: sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA==} + '@esbuild/linux-x64@0.27.7': + resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.27.4': - resolution: {integrity: sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q==} + '@esbuild/netbsd-arm64@0.27.7': + resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.27.4': - resolution: {integrity: sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==} + '@esbuild/netbsd-x64@0.27.7': + resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.27.4': - resolution: {integrity: sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow==} + '@esbuild/openbsd-arm64@0.27.7': + resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.27.4': - resolution: {integrity: sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ==} + '@esbuild/openbsd-x64@0.27.7': + resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.27.4': - resolution: {integrity: sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg==} + '@esbuild/openharmony-arm64@0.27.7': + resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.27.4': - resolution: {integrity: sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g==} + '@esbuild/sunos-x64@0.27.7': + resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.27.4': - resolution: {integrity: sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg==} + '@esbuild/win32-arm64@0.27.7': + resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.27.4': - resolution: {integrity: sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw==} + '@esbuild/win32-ia32@0.27.7': + resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.27.4': - resolution: {integrity: sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg==} + '@esbuild/win32-x64@0.27.7': + resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==} engines: {node: '>=18'} cpu: [x64] os: [win32] - '@fontsource/work-sans@5.2.8': - resolution: {integrity: sha512-6LaHjVVgts+rnrcqvEkP2+iUB/jw1oDSYsGO0+TltAhnWki9Hnf/UGpgMQh2jcm0GEH8VqCPnq4PpmHLFzxXtQ==} - - '@img/colour@1.1.0': - resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} - engines: {node: '>=18'} - - '@img/sharp-darwin-arm64@0.34.5': - resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm64] - os: [darwin] - - '@img/sharp-darwin-x64@0.34.5': - resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [x64] - os: [darwin] - - '@img/sharp-libvips-darwin-arm64@1.2.4': - resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} - cpu: [arm64] - os: [darwin] - - '@img/sharp-libvips-darwin-x64@1.2.4': - resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} - cpu: [x64] - os: [darwin] - - '@img/sharp-libvips-linux-arm64@1.2.4': - resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} - cpu: [arm64] - os: [linux] - libc: [glibc] - - '@img/sharp-libvips-linux-arm@1.2.4': - resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} - cpu: [arm] - os: [linux] - libc: [glibc] - - '@img/sharp-libvips-linux-ppc64@1.2.4': - resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} - cpu: [ppc64] - os: [linux] - libc: [glibc] - - '@img/sharp-libvips-linux-riscv64@1.2.4': - resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} - cpu: [riscv64] - os: [linux] - libc: [glibc] - - '@img/sharp-libvips-linux-s390x@1.2.4': - resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} - cpu: [s390x] - os: [linux] - libc: [glibc] - - '@img/sharp-libvips-linux-x64@1.2.4': - resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} - cpu: [x64] - os: [linux] - libc: [glibc] - - '@img/sharp-libvips-linuxmusl-arm64@1.2.4': - resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} - cpu: [arm64] - os: [linux] - libc: [musl] - - '@img/sharp-libvips-linuxmusl-x64@1.2.4': - resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} - cpu: [x64] - os: [linux] - libc: [musl] - - '@img/sharp-linux-arm64@0.34.5': - resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm64] - os: [linux] - libc: [glibc] + '@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: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@img/sharp-linux-arm@0.34.5': - resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm] - os: [linux] - libc: [glibc] + '@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} - '@img/sharp-linux-ppc64@0.34.5': - resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [ppc64] - os: [linux] - libc: [glibc] + '@eslint/config-array@0.23.5': + resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@img/sharp-linux-riscv64@0.34.5': - resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [riscv64] - os: [linux] - libc: [glibc] + '@eslint/config-helpers@0.5.5': + resolution: {integrity: sha512-eIJYKTCECbP/nsKaaruF6LW967mtbQbsw4JTtSVkUQc9MneSkbrgPJAbKl9nWr0ZeowV8BfsarBmPpBzGelA2w==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@img/sharp-linux-s390x@0.34.5': - resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [s390x] - os: [linux] - libc: [glibc] + '@eslint/core@1.2.1': + resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@img/sharp-linux-x64@0.34.5': - resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [x64] - os: [linux] - libc: [glibc] + '@eslint/object-schema@3.0.5': + resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@img/sharp-linuxmusl-arm64@0.34.5': - resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm64] - os: [linux] - libc: [musl] + '@eslint/plugin-kit@0.7.1': + resolution: {integrity: sha512-rZAP3aVgB9ds9KOeUSL+zZ21hPmo8dh6fnIFwRQj5EAZl9gzR7wxYbYXYysAM8CTqGmUGyp2S4kUdV17MnGuWQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@img/sharp-linuxmusl-x64@0.34.5': - resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [x64] - os: [linux] - libc: [musl] + '@humanfs/core@0.19.2': + resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} + engines: {node: '>=18.18.0'} - '@img/sharp-wasm32@0.34.5': - resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [wasm32] + '@humanfs/node@0.16.8': + resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==} + engines: {node: '>=18.18.0'} - '@img/sharp-win32-arm64@0.34.5': - resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm64] - os: [win32] + '@humanfs/types@0.15.0': + resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==} + engines: {node: '>=18.18.0'} - '@img/sharp-win32-ia32@0.34.5': - resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [ia32] - os: [win32] + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} - '@img/sharp-win32-x64@0.34.5': - resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [x64] - os: [win32] + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -508,620 +365,1332 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - '@kurkle/color@0.3.4': - resolution: {integrity: sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==} - - '@mdx-js/mdx@3.1.1': - resolution: {integrity: sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==} - - '@myriaddreamin/typst-ts-node-compiler-android-arm-eabi@0.7.0-rc2': - resolution: {integrity: sha512-OnfUH3XbGel3+QUZc4G3+V1npXYGCDc3b7WhFw88ihCH/Xpw+NNjidLrFkY6kK2a5vVHnY2AEG0hJSwZzvOw0Q==} - engines: {node: '>= 10'} - cpu: [arm] - os: [android] - - '@myriaddreamin/typst-ts-node-compiler-android-arm64@0.7.0-rc2': - resolution: {integrity: sha512-LR76t0jXcKp0F0vMViinS6+RBxyTFqBUFiUoZcGRPQD/DhLNBReTS7tJ14Jp5Mwuqe76RUshSeQSrKbJUoaQ3A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [android] - - '@myriaddreamin/typst-ts-node-compiler-darwin-arm64@0.7.0-rc2': - resolution: {integrity: sha512-xJndoR6Kn6UUYQDui41R7tx/avpfyY6c8dV5udyHP5FkeUSVgRAoFcjOtlI9Lpc84alFusIPwp4QR6V+xjOAhA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - '@myriaddreamin/typst-ts-node-compiler-darwin-x64@0.7.0-rc2': - resolution: {integrity: sha512-kmh37eshR40LVAM6P59uLWEYt5ffyUhKWcBOzsd/1QYNtsH28kLRUOShugAdxQN164Re+47z2nkSgd7HejASFg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - '@myriaddreamin/typst-ts-node-compiler-linux-arm-gnueabihf@0.7.0-rc2': - resolution: {integrity: sha512-giroa96wdN0mxARN1NbRrKp9t+qqUNUSBzWBQp1RMPqGNPwtahEqJnpf5zmRSrEJYhEzVZbs9+CwxFjj5lw7VQ==} - engines: {node: '>= 10'} - cpu: [arm] - os: [linux] - - '@myriaddreamin/typst-ts-node-compiler-linux-arm64-gnu@0.7.0-rc2': - resolution: {integrity: sha512-pDdc6hQrGdqr0BT+nNe0tJmdcmyp9yhn3WDeGlTi4YpYG2IybP7fBVIwDI3Mzr/IdCMtPbQxew4AfmAoJwIz6A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - libc: [glibc] - - '@myriaddreamin/typst-ts-node-compiler-linux-arm64-musl@0.7.0-rc2': - resolution: {integrity: sha512-wNEYhpjuwnhd7VrArL4EHd652z8YEGxG6C8haUjkVhGseFBetrL51yD1Ymg5fWEa+3+O4oZ1+IUN0Fu4/fKgHw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - libc: [musl] - - '@myriaddreamin/typst-ts-node-compiler-linux-x64-gnu@0.7.0-rc2': - resolution: {integrity: sha512-Z4i78r5MtFDYGHqgYrWfAcvqb3xW49WlLI35l1G818lYmkmGZAjAkVKb946ChOx+bBQIuMWefykCABLOlBkgKA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [glibc] - - '@myriaddreamin/typst-ts-node-compiler-linux-x64-musl@0.7.0-rc2': - resolution: {integrity: sha512-PXteqxa3RITEh5v3lQ4c5VGn16KHvUKVXjSZ2BudCe6C0gEuOO16JS9JU8DZVwd0dbtH0Mky6Q5V7tf6erpXGA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [musl] - - '@myriaddreamin/typst-ts-node-compiler-win32-arm64-msvc@0.7.0-rc2': - resolution: {integrity: sha512-wN1tjdRxabJzT8WuDVdOs2QKQuMzKht3QWPU/H7OjuDta1WcrYs/3IKnF67HNiphe/33MU8bKeih2GBVU+AuLg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - - '@myriaddreamin/typst-ts-node-compiler-win32-x64-msvc@0.7.0-rc2': - resolution: {integrity: sha512-6DUe2iepqptLkJsOdUC4yHWM3/USCW82YieA+lPAeky37XSJ5KuLuLL6zOQiQt3IWot7jB+m9oKIvBqJh7yriA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - - '@myriaddreamin/typst-ts-node-compiler@0.7.0-rc2': - resolution: {integrity: sha512-a4Vicil6Tu0S87C3+J2EMtFDdQEmT18zYAW6Srmt32lgjrTq3HLy+WN0lA/bgaBgw2wNEkXdogz3yRg49vXs8w==} - engines: {node: '>= 10'} - - '@oslojs/encoding@1.1.0': - resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} + '@napi-rs/wasm-runtime@1.1.4': + resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} + peerDependencies: + '@emnapi/core': ^1.7.1 + '@emnapi/runtime': ^1.7.1 - '@oxc-project/runtime@0.115.0': - resolution: {integrity: sha512-Rg8Wlt5dCbXhQnsXPrkOjL1DTSvXLgb2R/KYfnf1/K+R0k6UMLEmbQXPM+kwrWqSmWA2t0B1EtHy2/3zikQpvQ==} - engines: {node: ^20.19.0 || >=22.12.0} + '@nkzw/eslint-plugin@2.0.0': + resolution: {integrity: sha512-IoU8kOqHfnf7se2dGxMD/7RPm6WVjzjOjWSo7FulRx3lJzuZvXioSkT5Nd82l66DH3Pl2whw74lPT1di3KMwFA==} + peerDependencies: + eslint: '>= 9' - '@oxc-project/types@0.115.0': - resolution: {integrity: sha512-4n91DKnebUS4yjUHl2g3/b2T+IUdCfmoZGhmwsovZCDaJSs+QkVAM+0AqqTxHSsHfeiMuueT75cZaZcT/m0pSw==} + '@nkzw/oxlint-config@1.1.1': + resolution: {integrity: sha512-pPl4AnLbd60neo8ZFCKlOJ592Iey4afl/8oDcAK1tQxpx5+lnGz8qlFKDogrYNtoBXZk9sWjx/KpKjPEZcxgYA==} + peerDependencies: + oxlint: '>=1.46.0' - '@oxfmt/binding-android-arm-eabi@0.40.0': - resolution: {integrity: sha512-S6zd5r1w/HmqR8t0CTnGjFTBLDq2QKORPwriCHxo4xFNuhmOTABGjPaNvCJJVnrKBLsohOeiDX3YqQfJPF+FXw==} + '@oxc-minify/binding-android-arm-eabi@0.121.0': + resolution: {integrity: sha512-RcQXLj3JLLVm41n80/6+7OUion2PSQWOH5EUvlD9kCWSF1fWLXCNX1A6t/+nFNjeyaCXZ3YbIWwCTiGXhxxHEw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@oxfmt/binding-android-arm64@0.40.0': - resolution: {integrity: sha512-/mbS9UUP/5Vbl2D6osIdcYiP0oie63LKMoTyGj5hyMCK/SFkl3EhtyRAfdjPvuvHC0SXdW6ePaTKkBSq1SNcIw==} + '@oxc-minify/binding-android-arm64@0.121.0': + resolution: {integrity: sha512-VnFvB9DgADWpgwQb6LmeRv302xwdgpD/45WlQNWI380YUgWVXmhoZoNOgnaCSbuFEz+ElQDb/iE2U2LADkfu8w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@oxfmt/binding-darwin-arm64@0.40.0': - resolution: {integrity: sha512-wRt8fRdfLiEhnRMBonlIbKrJWixoEmn6KCjKE9PElnrSDSXETGZfPb8ee+nQNTobXkCVvVLytp2o0obAsxl78Q==} + '@oxc-minify/binding-darwin-arm64@0.121.0': + resolution: {integrity: sha512-0EKcroW5oMgJ27DOUWD724nQmLhV1PLArkXW5F4t7cUoRZy81OlFMqS97AOWIrQPlNPaC/1MYfCtIoZIW8OElQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@oxfmt/binding-darwin-x64@0.40.0': - resolution: {integrity: sha512-fzowhqbOE/NRy+AE5ob0+Y4X243WbWzDb00W+pKwD7d9tOqsAFbtWUwIyqqCoCLxj791m2xXIEeLH/3uz7zCCg==} + '@oxc-minify/binding-darwin-x64@0.121.0': + resolution: {integrity: sha512-DvsiLCZQ7KvufItkGuU45ovM4paB99M3/J5ZqpzjSnHpyFmcWUx19gwG9RTDOmHHA+7TPCq3b02aQoCiX6xiaA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@oxfmt/binding-freebsd-x64@0.40.0': - resolution: {integrity: sha512-agZ9ITaqdBjcerRRFEHB8s0OyVcQW8F9ZxsszjxzeSthQ4fcN2MuOtQFWec1ed8/lDa50jSLHVE2/xPmTgtCfQ==} + '@oxc-minify/binding-freebsd-x64@0.121.0': + resolution: {integrity: sha512-b+ngbloTvuei3HxfOz6nCwWkIl8dhgp42W1TREBUVRRe80iKe4bclrpZHxacFQYmVZ/bDjIV7ePPRSCSKM93RA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@oxfmt/binding-linux-arm-gnueabihf@0.40.0': - resolution: {integrity: sha512-ZM2oQ47p28TP1DVIp7HL1QoMUgqlBFHey0ksHct7tMXoU5BqjNvPWw7888azzMt25lnyPODVuye1wvNbvVUFOA==} + '@oxc-minify/binding-linux-arm-gnueabihf@0.121.0': + resolution: {integrity: sha512-Vj1xJ46zDTJlnF4UQgAVqX4xb2uv6hpmtHkypCMiaNbuop7bJ+VbqSfs7SCKvg23fygK530XTUxr+A7YDbkEzQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxfmt/binding-linux-arm-musleabihf@0.40.0': - resolution: {integrity: sha512-RBFPAxRAIsMisKM47Oe6Lwdv6agZYLz02CUhVCD1sOv5ajAcRMrnwCFBPWwGXpazToW2mjnZxFos8TuFjTU15A==} + '@oxc-minify/binding-linux-arm-musleabihf@0.121.0': + resolution: {integrity: sha512-lVhZ/y6Piqi+TlM+VB3UdRWWtqm7ks2He5VrYmZfO0a8A/wBE7KTpIK+RoUFGW3ii3wr4Hc8AEWZNEjU4fs38Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxfmt/binding-linux-arm64-gnu@0.40.0': - resolution: {integrity: sha512-Nb2XbQ+wV3W2jSIihXdPj7k83eOxeSgYP3N/SRXvQ6ZYPIk6Q86qEh5Gl/7OitX3bQoQrESqm1yMLvZV8/J7dA==} + '@oxc-minify/binding-linux-arm64-gnu@0.121.0': + resolution: {integrity: sha512-FMEtjwWKVRehcs4ebsmM8nj7F7/kVH54dcFZodNFsk1iUsVdqPrOWhzanMcU55AYrGmXHeKFx7PlrimDOz2ZdA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-arm64-musl@0.40.0': - resolution: {integrity: sha512-tGmWhLD/0YMotCdfezlT6tC/MJG/wKpo4vnQ3Cq+4eBk/BwNv7EmkD0VkD5F/dYkT3b8FNU01X2e8vvJuWoM1w==} + '@oxc-minify/binding-linux-arm64-musl@0.121.0': + resolution: {integrity: sha512-ZFCqQWU7TP4oCiu9q0q9xg1wg78Et4bRSCv9LzMAn/N9zJezPa+u3kVqKXkQnvAgrA7fBo9VPSaEx0XMpXsPhA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@oxfmt/binding-linux-ppc64-gnu@0.40.0': - resolution: {integrity: sha512-rVbFyM3e7YhkVnp0IVYjaSHfrBWcTRWb60LEcdNAJcE2mbhTpbqKufx0FrhWfoxOrW/+7UJonAOShoFFLigDqQ==} + '@oxc-minify/binding-linux-ppc64-gnu@0.121.0': + resolution: {integrity: sha512-WSV2TNT7a6wfwfWHHvpaOoHVKwB0tKyJpMjj3P401k8tFEZpH/xNqDNofdvXQznKqJ3nyYxIC4llvNGCXUtTzQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-riscv64-gnu@0.40.0': - resolution: {integrity: sha512-3ZqBw14JtWeEoLiioJcXSJz8RQyPE+3jLARnYM1HdPzZG4vk+Ua8CUupt2+d+vSAvMyaQBTN2dZK+kbBS/j5mA==} + '@oxc-minify/binding-linux-riscv64-gnu@0.121.0': + resolution: {integrity: sha512-hTToDA4mEd4P4HdwnmULtyyWP6CsNwuxdiToGZ5LjQvznpF5acRi9KEAqF8zmNXQ9r1RbrbGbYHATfRWogEbfw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-riscv64-musl@0.40.0': - resolution: {integrity: sha512-JJ4PPSdcbGBjPvb+O7xYm2FmAsKCyuEMYhqatBAHMp/6TA6rVlf9Z/sYPa4/3Bommb+8nndm15SPFRHEPU5qFA==} + '@oxc-minify/binding-linux-riscv64-musl@0.121.0': + resolution: {integrity: sha512-zhgxjY8IkVZ2MpuElCiK37DjEwX2uk9r7fawRh0J4yjkYWVQR5kmmMEo5oMPbBMtri61vnSiqLZmD25cTFP1vw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [musl] - '@oxfmt/binding-linux-s390x-gnu@0.40.0': - resolution: {integrity: sha512-Kp0zNJoX9Ik77wUya2tpBY3W9f40VUoMQLWVaob5SgCrblH/t2xr/9B2bWHfs0WCefuGmqXcB+t0Lq77sbBmZw==} + '@oxc-minify/binding-linux-s390x-gnu@0.121.0': + resolution: {integrity: sha512-YruvsabXqUdhtfe9Qjv2F1tb0u1PqqNBnf0jFhC8K4qJLctgveH/2rBYE8WAqdahxfdR59ByFZd0u6dqwDCKPg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-x64-gnu@0.40.0': - resolution: {integrity: sha512-7YTCNzleWTaQTqNGUNQ66qVjpoV6DjbCOea+RnpMBly2bpzrI/uu7Rr+2zcgRfNxyjXaFTVQKaRKjqVdeUfeVA==} + '@oxc-minify/binding-linux-x64-gnu@0.121.0': + resolution: {integrity: sha512-OOUpoGKeGN6D9bP9dr2lczK3SgOFeMLFiJuldPxOcY21VAxlemEiTPFTPXp4VWzw65sy3bCx0k8R6wyE8TA3EQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-x64-musl@0.40.0': - resolution: {integrity: sha512-hWnSzJ0oegeOwfOEeejYXfBqmnRGHusgtHfCPzmvJvHTwy1s3Neo59UKc1CmpE3zxvrCzJoVHos0rr97GHMNPw==} + '@oxc-minify/binding-linux-x64-musl@0.121.0': + resolution: {integrity: sha512-ixdrFcKUdRXsavlAe+ttKQHtR6nUyXSrCjLTkB4eiy8U/5f5A1BQXAKDdw9rUNoPkLc4vrKohG8frI0pjg7S6g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@oxfmt/binding-openharmony-arm64@0.40.0': - resolution: {integrity: sha512-28sJC1lR4qtBJGzSRRbPnSW3GxU2+4YyQFE6rCmsUYqZ5XYH8jg0/w+CvEzQ8TuAQz5zLkcA25nFQGwoU0PT3Q==} + '@oxc-minify/binding-openharmony-arm64@0.121.0': + resolution: {integrity: sha512-P52luYhm78qAPjACwHEMWJQag4hgX3InczjXazLqSWJPf5ismBWDmrSiccVWi2B6nPGSuYd4YQVR3j0h2IELyA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@oxfmt/binding-win32-arm64-msvc@0.40.0': - resolution: {integrity: sha512-cDkRnyT0dqwF5oIX1Cv59HKCeZQFbWWdUpXa3uvnHFT2iwYSSZspkhgjXjU6iDp5pFPaAEAe9FIbMoTgkTmKPg==} + '@oxc-minify/binding-wasm32-wasi@0.121.0': + resolution: {integrity: sha512-1XDHPrAJa6W8dGqaDnlt+0k5In5JzGE0EOI87cJnOkSGsUAb1Sk8mKNhUe3/PuGiBDDat8eZ0wlq/VcUeOmsoA==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@oxc-minify/binding-win32-arm64-msvc@0.121.0': + resolution: {integrity: sha512-FvUEX7eTfSh1OBB+/AGSWhkNX/8jPFGM2jvMwrrAZ5vj8kTtnETNTkJdkkPMUEiIEVupxoARKc5UFU2/k+3THw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@oxfmt/binding-win32-ia32-msvc@0.40.0': - resolution: {integrity: sha512-7rPemBJjqm5Gkv6ZRCPvK8lE6AqQ/2z31DRdWazyx2ZvaSgL7QGofHXHNouRpPvNsT9yxRNQJgigsWkc+0qg4w==} + '@oxc-minify/binding-win32-ia32-msvc@0.121.0': + resolution: {integrity: sha512-ZNcMq+yy9QBgekrBP/NxTD4RW1sZKHOWO+aH5SgqRvfU035Bldvns7zHC8VdaY4Sz3PcaChfmSeapfUoUGqT5w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@oxfmt/binding-win32-x64-msvc@0.40.0': - resolution: {integrity: sha512-/Zmj0yTYSvmha6TG1QnoLqVT7ZMRDqXvFXXBQpIjteEwx9qvUYMBH2xbiOFhDeMUJkGwC3D6fdKsFtaqUvkwNA==} + '@oxc-minify/binding-win32-x64-msvc@0.121.0': + resolution: {integrity: sha512-/0qRGvYnBVhzwSXHcJ6sF+2rb2QpotbJeAr1wmADgq/hm7JjdRukktngmwXQuIILmC+UELYLoVpa0PTBoEqwrg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@oxlint-tsgolint/darwin-arm64@0.17.0': - resolution: {integrity: sha512-z3XwCDuOAKgk7bO4y5tyH8Zogwr51G56R0XGKC3tlAbrAq8DecoxAd3qhRZqWBMG2Gzl5bWU3Ghu7lrxuLPzYw==} - cpu: [arm64] - os: [darwin] - - '@oxlint-tsgolint/darwin-x64@0.17.0': - resolution: {integrity: sha512-TZgVXy0MtI8nt0MYiceuZhHPwHcwlIZ/YwzFTAKrgdHiTvVzFbqHVdXi5wbZfT/o1nHGw9fbGWPlb6qKZ4uZ9Q==} - cpu: [x64] - os: [darwin] - - '@oxlint-tsgolint/linux-arm64@0.17.0': - resolution: {integrity: sha512-IDfhFl/Y8bjidCvAP6QAxVyBsl78TmfCHlfjtEv2XtJXgYmIwzv6muO18XMp74SZ2qAyD4y2n2dUedrmghGHeA==} - cpu: [arm64] - os: [linux] - - '@oxlint-tsgolint/linux-x64@0.17.0': - resolution: {integrity: sha512-Bgdgqx/m8EnfjmmlRLEeYy9Yhdt1GdFrMr5mTu/NyLRGkB1C9VLAikdxB7U9QambAGTAmjMbHNFDFk8Vx69Huw==} - cpu: [x64] - os: [linux] - - '@oxlint-tsgolint/win32-arm64@0.17.0': - resolution: {integrity: sha512-dO6wyKMDqFWh1vwr+zNZS7/ovlfGgl4S3P1LDy4CKjP6V6NGtdmEwWkWax8j/I8RzGZdfXKnoUfb/qhVg5bx0w==} - cpu: [arm64] - os: [win32] - - '@oxlint-tsgolint/win32-x64@0.17.0': - resolution: {integrity: sha512-lPGYFp3yX2nh6hLTpIuMnJbZnt3Df42VkoA/fSkMYi2a/LXdDytQGpgZOrb5j47TICARd34RauKm0P3OA4Oxbw==} - cpu: [x64] - os: [win32] - - '@oxlint/binding-android-arm-eabi@1.55.0': - resolution: {integrity: sha512-NhvgAhncTSOhRahQSCnkK/4YIGPjTmhPurQQ2dwt2IvwCMTvZRW5vF2K10UBOxFve4GZDMw6LtXZdC2qeuYIVQ==} + '@oxc-parser/binding-android-arm-eabi@0.121.0': + resolution: {integrity: sha512-n07FQcySwOlzap424/PLMtOkbS7xOu8nsJduKL8P3COGHKgKoDYXwoAHCbChfgFpHnviehrLWIPX0lKGtbEk/A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@oxlint/binding-android-arm64@1.55.0': - resolution: {integrity: sha512-P9iWRh+Ugqhg+D7rkc7boHX8o3H2h7YPcZHQIgvVBgnua5tk4LR2L+IBlreZs58/95cd2x3/004p5VsQM9z4SA==} + '@oxc-parser/binding-android-arm64@0.121.0': + resolution: {integrity: sha512-/Dd1xIXboYAicw+twT2utxPD7bL8qh7d3ej0qvaYIMj3/EgIrGR+tSnjCUkiCT6g6uTC0neSS4JY8LxhdSU/sA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@oxlint/binding-darwin-arm64@1.55.0': - resolution: {integrity: sha512-esakkJIt7WFAhT30P/Qzn96ehFpzdZ1mNuzpOb8SCW7lI4oB8VsyQnkSHREM671jfpuBb/o2ppzBCx5l0jpgMA==} + '@oxc-parser/binding-darwin-arm64@0.121.0': + resolution: {integrity: sha512-A0jNEvv7QMtCO1yk205t3DWU9sWUjQ2KNF0hSVO5W9R9r/R1BIvzG01UQAfmtC0dQm7sCrs5puixurKSfr2bRQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@oxlint/binding-darwin-x64@1.55.0': - resolution: {integrity: sha512-xDMFRCCAEK9fOH6As2z8ELsC+VDGSFRHwIKVSilw+xhgLwTDFu37rtmRbmUlx8rRGS6cWKQPTc47AVxAZEVVPQ==} + '@oxc-parser/binding-darwin-x64@0.121.0': + resolution: {integrity: sha512-SsHzipdxTKUs3I9EOAPmnIimEeJOemqRlRDOp9LIj+96wtxZejF51gNibmoGq8KoqbT1ssAI5po/E3J+vEtXGA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@oxlint/binding-freebsd-x64@1.55.0': - resolution: {integrity: sha512-mYZqnwUD7ALCRxGenyLd1uuG+rHCL+OTT6S8FcAbVm/ZT2AZMGjvibp3F6k1SKOb2aeqFATmwRykrE41Q0GWVw==} + '@oxc-parser/binding-freebsd-x64@0.121.0': + resolution: {integrity: sha512-v1APOTkCp+RWOIDAHRoaeW/UoaHF15a60E8eUL6kUQXh+i4K7PBwq2Wi7jm8p0ymID5/m/oC1w3W31Z/+r7HQw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@oxlint/binding-linux-arm-gnueabihf@1.55.0': - resolution: {integrity: sha512-LcX6RYcF9vL9ESGwJW3yyIZ/d/ouzdOKXxCdey1q0XJOW1asrHsIg5MmyKdEBR4plQx+shvYeQne7AzW5f3T1w==} + '@oxc-parser/binding-linux-arm-gnueabihf@0.121.0': + resolution: {integrity: sha512-PmqPQuqHZyFVWA4ycr0eu4VnTMmq9laOHZd+8R359w6kzuNZPvmmunmNJ8ybkm769A0nCoVp3TJ6dUz7B3FYIQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxlint/binding-linux-arm-musleabihf@1.55.0': - resolution: {integrity: sha512-C+8GS1rPtK+dI7mJFkqoRBkDuqbrNihnyYQsJPS9ez+8zF9JzfvU19lawqt4l/Y23o5uQswE/DORa8aiXUih3w==} + '@oxc-parser/binding-linux-arm-musleabihf@0.121.0': + resolution: {integrity: sha512-vF24htj+MOH+Q7y9A8NuC6pUZu8t/C2Fr/kDOi2OcNf28oogr2xadBPXAbml802E8wRAVfbta6YLDQTearz+jw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxlint/binding-linux-arm64-gnu@1.55.0': - resolution: {integrity: sha512-ErLE4XbmcCopA4/CIDiH6J1IAaDOMnf/KSx/aFObs4/OjAAM3sFKWGZ57pNOMxhhyBdcmcXwYymph9GwcpcqgQ==} + '@oxc-parser/binding-linux-arm64-gnu@0.121.0': + resolution: {integrity: sha512-wjH8cIG2Lu/3d64iZpbYr73hREMgKAfu7fqpXjgM2S16y2zhTfDIp8EQjxO8vlDtKP5Rc7waZW72lh8nZtWrpA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-arm64-musl@1.55.0': - resolution: {integrity: sha512-/kp65avi6zZfqEng56TTuhiy3P/3pgklKIdf38yvYeJ9/PgEeRA2A2AqKAKbZBNAqUzrzHhz9jF6j/PZvhJzTQ==} + '@oxc-parser/binding-linux-arm64-musl@0.121.0': + resolution: {integrity: sha512-qT663J/W8yQFw3dtscbEi9LKJevr20V7uWs2MPGTnvNZ3rm8anhhE16gXGpxDOHeg9raySaSHKhd4IGa3YZvuw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@oxlint/binding-linux-ppc64-gnu@1.55.0': - resolution: {integrity: sha512-A6pTdXwcEEwL/nmz0eUJ6WxmxcoIS+97GbH96gikAyre3s5deC7sts38ZVVowjS2QQFuSWkpA4ZmQC0jZSNvJQ==} + '@oxc-parser/binding-linux-ppc64-gnu@0.121.0': + resolution: {integrity: sha512-mYNe4NhVvDBbPkAP8JaVS8lC1dsoJZWH5WCjpw5E+sjhk1R08wt3NnXYUzum7tIiWPfgQxbCMcoxgeemFASbRw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-riscv64-gnu@1.55.0': - resolution: {integrity: sha512-clj0lnIN+V52G9tdtZl0LbdTSurnZ1NZj92Je5X4lC7gP5jiCSW+Y/oiDiSauBAD4wrHt2S7nN3pA0zfKYK/6Q==} + '@oxc-parser/binding-linux-riscv64-gnu@0.121.0': + resolution: {integrity: sha512-+QiFoGxhAbaI/amqX567784cDyyuZIpinBrJNxUzb+/L2aBRX67mN6Jv40pqduHf15yYByI+K5gUEygCuv0z9w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-riscv64-musl@1.55.0': - resolution: {integrity: sha512-NNu08pllN5x/O94/sgR3DA8lbrGBnTHsINZZR0hcav1sj79ksTiKKm1mRzvZvacwQ0hUnGinFo+JO75ok2PxYg==} + '@oxc-parser/binding-linux-riscv64-musl@0.121.0': + resolution: {integrity: sha512-9ykEgyTa5JD/Uhv2sttbKnCfl2PieUfOjyxJC/oDL2UO0qtXOtjPLl7H8Kaj5G7p3hIvFgu3YWvAxvE0sqY+hQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [musl] - '@oxlint/binding-linux-s390x-gnu@1.55.0': - resolution: {integrity: sha512-BvfQz3PRlWZRoEZ17dZCqgQsMRdpzGZomJkVATwCIGhHVVeHJMQdmdXPSjcT1DCNUrOjXnVyj1RGDj5+/Je2+Q==} + '@oxc-parser/binding-linux-s390x-gnu@0.121.0': + resolution: {integrity: sha512-DB1EW5VHZdc1lIRjOI3bW/wV6R6y0xlfvdVrqj6kKi7Ayu2U3UqUBdq9KviVkcUGd5Oq+dROqvUEEFRXGAM7EQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@oxlint/binding-linux-x64-gnu@1.55.0': - resolution: {integrity: sha512-ngSOoFCSBMKVQd24H8zkbcBNc7EHhjnF1sv3mC9NNXQ/4rRjI/4Dj9+9XoDZeFEkF1SX1COSBXF1b2Pr9rqdEw==} + '@oxc-parser/binding-linux-x64-gnu@0.121.0': + resolution: {integrity: sha512-s4lfobX9p4kPTclvMiH3gcQUd88VlnkMTF6n2MTMDAyX5FPNRhhRSFZK05Ykhf8Zy5NibV4PbGR6DnK7FGNN6A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-x64-musl@1.55.0': - resolution: {integrity: sha512-BDpP7W8GlaG7BR6QjGZAleYzxoyKc/D24spZIF2mB3XsfALQJJT/OBmP8YpeTb1rveFSBHzl8T7l0aqwkWNdGA==} + '@oxc-parser/binding-linux-x64-musl@0.121.0': + resolution: {integrity: sha512-P9KlyTpuBuMi3NRGpJO8MicuGZfOoqZVRP1WjOecwx8yk4L/+mrCRNc5egSi0byhuReblBF2oVoDSMgV9Bj4Hw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@oxlint/binding-openharmony-arm64@1.55.0': - resolution: {integrity: sha512-PS6GFvmde/pc3fCA2Srt51glr8Lcxhpf6WIBFfLphndjRrD34NEcses4TSxQrEcxYo6qVywGfylM0ZhSCF2gGA==} + '@oxc-parser/binding-openharmony-arm64@0.121.0': + resolution: {integrity: sha512-R+4jrWOfF2OAPPhj3Eb3U5CaKNAH9/btMveMULIrcNW/hjfysFQlF8wE0GaVBr81dWz8JLgQlsxwctoL78JwXw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@oxlint/binding-win32-arm64-msvc@1.55.0': - resolution: {integrity: sha512-P6JcLJGs/q1UOvDLzN8otd9JsH4tsuuPDv+p7aHqHM3PrKmYdmUvkNj4K327PTd35AYcznOCN+l4ZOaq76QzSw==} + '@oxc-parser/binding-wasm32-wasi@0.121.0': + resolution: {integrity: sha512-5TFISkPTymKvsmIlKasPVTPuWxzCcrT8pM+p77+mtQbIZDd1UC8zww4CJcRI46kolmgrEX6QpKO8AvWMVZ+ifw==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@oxc-parser/binding-win32-arm64-msvc@0.121.0': + resolution: {integrity: sha512-V0pxh4mql4XTt3aiEtRNUeBAUFOw5jzZNxPABLaOKAWrVzSr9+XUaB095lY7jqMf5t8vkfh8NManGB28zanYKw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@oxlint/binding-win32-ia32-msvc@1.55.0': - resolution: {integrity: sha512-gzkk4zE2zsE+WmRxFOiAZHpCpUNDFytEakqNXoNHW+PnYEOTPKDdW6nrzgSeTbGKVPXNAKQnRnMgrh7+n3Xueg==} + '@oxc-parser/binding-win32-ia32-msvc@0.121.0': + resolution: {integrity: sha512-4Ob1qvYMPnlF2N9rdmKdkQFdrq16QVcQwBsO8yiPZXof0fHKFF+LmQV501XFbi7lHyrKm8rlJRfQ/M8bZZPVLw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@oxlint/binding-win32-x64-msvc@1.55.0': - resolution: {integrity: sha512-ZFALNow2/og75gvYzNP7qe+rREQ5xunktwA+lgykoozHZ6hw9bqg4fn5j2UvG4gIn1FXqrZHkOAXuPf5+GOYTQ==} + '@oxc-parser/binding-win32-x64-msvc@0.121.0': + resolution: {integrity: sha512-BOp1KCzdboB1tPqoCPXgntgFs0jjeSyOXHzgxVFR7B/qfr3F8r4YDacHkTOUNXtDgM8YwKnkf3rE5gwALYX7NA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@polka/url@1.0.0-next.29': - resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} + '@oxc-project/runtime@0.121.0': + resolution: {integrity: sha512-p0bQukD8OEHxzY4T9OlANBbEFGnOnjo1CYi50HES7OD36UO2yPh6T+uOJKLtlg06eclxroipRCpQGMpeH8EJ/g==} + engines: {node: ^20.19.0 || >=22.12.0} - '@radix-ui/colors@3.0.0': - resolution: {integrity: sha512-FUOsGBkHrYJwCSEtWRCIfQbZG7q1e6DgxCIOe1SUQzDe/7rXXeA47s8yCn6fuTNQAj1Zq4oTFi9Yjp3wzElcxg==} + '@oxc-project/runtime@0.127.0': + resolution: {integrity: sha512-UQYLxAhDDPHm++szfa4z0RTdcPq5vaywrAoEA2n1YaAKeanXQdjHsoT6x1gP3U97RN8LZ7yHsSOrKPCcA6mCqw==} + engines: {node: ^20.19.0 || >=22.12.0} - '@rollup/pluginutils@5.3.0': - resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true + '@oxc-project/types@0.121.0': + resolution: {integrity: sha512-CGtOARQb9tyv7ECgdAlFxi0Fv7lmzvmlm2rpD/RdijOO9rfk/JvB1CjT8EnoD+tjna/IYgKKw3IV7objRb+aYw==} + + '@oxc-project/types@0.127.0': + resolution: {integrity: sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==} - '@rollup/rollup-android-arm-eabi@4.59.0': - resolution: {integrity: sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==} + '@oxc-resolver/binding-android-arm-eabi@11.19.1': + resolution: {integrity: sha512-aUs47y+xyXHUKlbhqHUjBABjvycq6YSD7bpxSW7vplUmdzAlJ93yXY6ZR0c1o1x5A/QKbENCvs3+NlY8IpIVzg==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.59.0': - resolution: {integrity: sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==} + '@oxc-resolver/binding-android-arm64@11.19.1': + resolution: {integrity: sha512-oolbkRX+m7Pq2LNjr/kKgYeC7bRDMVTWPgxBGMjSpZi/+UskVo4jsMU3MLheZV55jL6c3rNelPl4oD60ggYmqA==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.59.0': - resolution: {integrity: sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==} + '@oxc-resolver/binding-darwin-arm64@11.19.1': + resolution: {integrity: sha512-nUC6d2i3R5B12sUW4O646qD5cnMXf2oBGPLIIeaRfU9doJRORAbE2SGv4eW6rMqhD+G7nf2Y8TTJTLiiO3Q/dQ==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.59.0': - resolution: {integrity: sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==} + '@oxc-resolver/binding-darwin-x64@11.19.1': + resolution: {integrity: sha512-cV50vE5+uAgNcFa3QY1JOeKDSkM/9ReIcc/9wn4TavhW/itkDGrXhw9jaKnkQnGbjJ198Yh5nbX/Gr2mr4Z5jQ==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.59.0': - resolution: {integrity: sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==} - cpu: [arm64] - os: [freebsd] - - '@rollup/rollup-freebsd-x64@4.59.0': - resolution: {integrity: sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==} + '@oxc-resolver/binding-freebsd-x64@11.19.1': + resolution: {integrity: sha512-xZOQiYGFxtk48PBKff+Zwoym7ScPAIVp4c14lfLxizO2LTTTJe5sx9vQNGrBymrf/vatSPNMD4FgsaaRigPkqw==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.59.0': - resolution: {integrity: sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==} + '@oxc-resolver/binding-linux-arm-gnueabihf@11.19.1': + resolution: {integrity: sha512-lXZYWAC6kaGe/ky2su94e9jN9t6M0/6c+GrSlCqL//XO1cxi5lpAhnJYdyrKfm0ZEr/c7RNyAx3P7FSBcBd5+A==} cpu: [arm] os: [linux] - libc: [glibc] - '@rollup/rollup-linux-arm-musleabihf@4.59.0': - resolution: {integrity: sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==} + '@oxc-resolver/binding-linux-arm-musleabihf@11.19.1': + resolution: {integrity: sha512-veG1kKsuK5+t2IsO9q0DErYVSw2azvCVvWHnfTOS73WE0STdLLB7Q1bB9WR+yHPQM76ASkFyRbogWo1GR1+WbQ==} cpu: [arm] os: [linux] - libc: [musl] - '@rollup/rollup-linux-arm64-gnu@4.59.0': - resolution: {integrity: sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==} + '@oxc-resolver/binding-linux-arm64-gnu@11.19.1': + resolution: {integrity: sha512-heV2+jmXyYnUrpUXSPugqWDRpnsQcDm2AX4wzTuvgdlZfoNYO0O3W2AVpJYaDn9AG4JdM6Kxom8+foE7/BcSig==} cpu: [arm64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm64-musl@4.59.0': - resolution: {integrity: sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==} + '@oxc-resolver/binding-linux-arm64-musl@11.19.1': + resolution: {integrity: sha512-jvo2Pjs1c9KPxMuMPIeQsgu0mOJF9rEb3y3TdpsrqwxRM+AN6/nDDwv45n5ZrUnQMsdBy5gIabioMKnQfWo9ew==} cpu: [arm64] os: [linux] libc: [musl] - '@rollup/rollup-linux-loong64-gnu@4.59.0': - resolution: {integrity: sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==} - cpu: [loong64] - os: [linux] - libc: [glibc] - - '@rollup/rollup-linux-loong64-musl@4.59.0': - resolution: {integrity: sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==} - cpu: [loong64] - os: [linux] - libc: [musl] - - '@rollup/rollup-linux-ppc64-gnu@4.59.0': - resolution: {integrity: sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==} + '@oxc-resolver/binding-linux-ppc64-gnu@11.19.1': + resolution: {integrity: sha512-vLmdNxWCdN7Uo5suays6A/+ywBby2PWBBPXctWPg5V0+eVuzsJxgAn6MMB4mPlshskYbppjpN2Zg83ArHze9gQ==} cpu: [ppc64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-ppc64-musl@4.59.0': - resolution: {integrity: sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==} - cpu: [ppc64] - os: [linux] - libc: [musl] - - '@rollup/rollup-linux-riscv64-gnu@4.59.0': - resolution: {integrity: sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==} + '@oxc-resolver/binding-linux-riscv64-gnu@11.19.1': + resolution: {integrity: sha512-/b+WgR+VTSBxzgOhDO7TlMXC1ufPIMR6Vj1zN+/x+MnyXGW7prTLzU9eW85Aj7Th7CCEG9ArCbTeqxCzFWdg2w==} cpu: [riscv64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-riscv64-musl@4.59.0': - resolution: {integrity: sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==} + '@oxc-resolver/binding-linux-riscv64-musl@11.19.1': + resolution: {integrity: sha512-YlRdeWb9j42p29ROh+h4eg/OQ3dTJlpHSa+84pUM9+p6i3djtPz1q55yLJhgW9XfDch7FN1pQ/Vd6YP+xfRIuw==} cpu: [riscv64] os: [linux] libc: [musl] - '@rollup/rollup-linux-s390x-gnu@4.59.0': - resolution: {integrity: sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==} + '@oxc-resolver/binding-linux-s390x-gnu@11.19.1': + resolution: {integrity: sha512-EDpafVOQWF8/MJynsjOGFThcqhRHy417sRyLfQmeiamJ8qVhSKAn2Dn2VVKUGCjVB9C46VGjhNo7nOPUi1x6uA==} cpu: [s390x] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-gnu@4.59.0': - resolution: {integrity: sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==} + '@oxc-resolver/binding-linux-x64-gnu@11.19.1': + resolution: {integrity: sha512-NxjZe+rqWhr+RT8/Ik+5ptA3oz7tUw361Wa5RWQXKnfqwSSHdHyrw6IdcTfYuml9dM856AlKWZIUXDmA9kkiBQ==} cpu: [x64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-musl@4.59.0': - resolution: {integrity: sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==} + '@oxc-resolver/binding-linux-x64-musl@11.19.1': + resolution: {integrity: sha512-cM/hQwsO3ReJg5kR+SpI69DMfvNCp+A/eVR4b4YClE5bVZwz8rh2Nh05InhwI5HR/9cArbEkzMjcKgTHS6UaNw==} cpu: [x64] os: [linux] libc: [musl] - '@rollup/rollup-openbsd-x64@4.59.0': - resolution: {integrity: sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==} - cpu: [x64] - os: [openbsd] - - '@rollup/rollup-openharmony-arm64@4.59.0': - resolution: {integrity: sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==} + '@oxc-resolver/binding-openharmony-arm64@11.19.1': + resolution: {integrity: sha512-QF080IowFB0+9Rh6RcD19bdgh49BpQHUW5TajG1qvWHvmrQznTZZjYlgE2ltLXyKY+qs4F/v5xuX1XS7Is+3qA==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.59.0': - resolution: {integrity: sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==} + '@oxc-resolver/binding-wasm32-wasi@11.19.1': + resolution: {integrity: sha512-w8UCKhX826cP/ZLokXDS6+milN8y4X7zidsAttEdWlVoamTNf6lhBJldaWr3ukTDiye7s4HRcuPEPOXNC432Vg==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@oxc-resolver/binding-win32-arm64-msvc@11.19.1': + resolution: {integrity: sha512-nJ4AsUVZrVKwnU/QRdzPCCrO0TrabBqgJ8pJhXITdZGYOV28TIYystV1VFLbQ7DtAcaBHpocT5/ZJnF78YJPtQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.59.0': - resolution: {integrity: sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==} + '@oxc-resolver/binding-win32-ia32-msvc@11.19.1': + resolution: {integrity: sha512-EW+ND5q2Tl+a3pH81l1QbfgbF3HmqgwLfDfVithRFheac8OTcnbXt/JxqD2GbDkb7xYEqy1zNaVFRr3oeG8npA==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.59.0': - resolution: {integrity: sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==} - cpu: [x64] - os: [win32] - - '@rollup/rollup-win32-x64-msvc@4.59.0': - resolution: {integrity: sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==} + '@oxc-resolver/binding-win32-x64-msvc@11.19.1': + resolution: {integrity: sha512-6hIU3RQu45B+VNTY4Ru8ppFwjVS/S5qwYyGhBotmjxfEKk41I2DlGtRfGJndZ5+6lneE2pwloqunlOyZuX/XAw==} cpu: [x64] os: [win32] - '@shikijs/core@4.0.2': - resolution: {integrity: sha512-hxT0YF4ExEqB8G/qFdtJvpmHXBYJ2lWW7qTHDarVkIudPFE6iCIrqdgWxGn5s+ppkGXI0aEGlibI0PAyzP3zlw==} - engines: {node: '>=20'} - - '@shikijs/engine-javascript@4.0.2': - resolution: {integrity: sha512-7PW0Nm49DcoUIQEXlJhNNBHyoGMjalRETTCcjMqEaMoJRLljy1Bi/EGV3/qLBgLKQejdspiiYuHGQW6dX94Nag==} - engines: {node: '>=20'} - - '@shikijs/engine-oniguruma@4.0.2': - resolution: {integrity: sha512-UpCB9Y2sUKlS9z8juFSKz7ZtysmeXCgnRF0dlhXBkmQnek7lAToPte8DkxmEYGNTMii72zU/lyXiCB6StuZeJg==} - engines: {node: '>=20'} - - '@shikijs/langs@4.0.2': - resolution: {integrity: sha512-KaXby5dvoeuZzN0rYQiPMjFoUrz4hgwIE+D6Du9owcHcl6/g16/yT5BQxSW5cGt2MZBz6Hl0YuRqf12omRfUUg==} - engines: {node: '>=20'} - - '@shikijs/primitive@4.0.2': - resolution: {integrity: sha512-M6UMPrSa3fN5ayeJwFVl9qWofl273wtK1VG8ySDZ1mQBfhCpdd8nEx7nPZ/tk7k+TYcpqBZzj/AnwxT9lO+HJw==} - engines: {node: '>=20'} - - '@shikijs/themes@4.0.2': - resolution: {integrity: sha512-mjCafwt8lJJaVSsQvNVrJumbnnj1RI8jbUKrPKgE6E3OvQKxnuRoBaYC51H4IGHePsGN/QtALglWBU7DoKDFnA==} - engines: {node: '>=20'} - - '@shikijs/types@4.0.2': - resolution: {integrity: sha512-qzbeRooUTPnLE+sHD/Z8DStmaDgnbbc/pMrU203950aRqjX/6AFHeDYT+j00y2lPdz0ywJKx7o/7qnqTivtlXg==} - engines: {node: '>=20'} - - '@shikijs/vscode-textmate@10.0.2': - resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} - - '@standard-schema/spec@1.1.0': - resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} - - '@tailwindcss/node@4.2.2': - resolution: {integrity: sha512-pXS+wJ2gZpVXqFaUEjojq7jzMpTGf8rU6ipJz5ovJV6PUGmlJ+jvIwGrzdHdQ80Sg+wmQxUFuoW1UAAwHNEdFA==} + '@oxc-transform/binding-android-arm-eabi@0.121.0': + resolution: {integrity: sha512-NNYkyDjTID7oVW0LUZ04kDShtyY6hgsTakd2u3mz/hN765JviCuyBIi5qT9dDOmgX0t1y74nuS7FwiLgaCcZ4g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] - '@tailwindcss/oxide-android-arm64@4.2.2': - resolution: {integrity: sha512-dXGR1n+P3B6748jZO/SvHZq7qBOqqzQ+yFrXpoOWWALWndF9MoSKAT3Q0fYgAzYzGhxNYOoysRvYlpixRBBoDg==} - engines: {node: '>= 20'} + '@oxc-transform/binding-android-arm64@0.121.0': + resolution: {integrity: sha512-zO5az3E5JUmF/k7xOOL9TCipqaVn/d8QHK5T8/bcw6qTWAPVFJjQRK8+5MSmp2ItO2Dmxed5DdWMSxG2NNfA5w==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@tailwindcss/oxide-darwin-arm64@4.2.2': - resolution: {integrity: sha512-iq9Qjr6knfMpZHj55/37ouZeykwbDqF21gPFtfnhCCKGDcPI/21FKC9XdMO/XyBM7qKORx6UIhGgg6jLl7BZlg==} - engines: {node: '>= 20'} + '@oxc-transform/binding-darwin-arm64@0.121.0': + resolution: {integrity: sha512-3vcZdmL8OAdYzXfPDeXrO9KagTgUbXPSFXotoww9N0jVNbdCvSpKJHia1aqdltyevrCWF4KqJyOeeUfGcw7AJw==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@tailwindcss/oxide-darwin-x64@4.2.2': - resolution: {integrity: sha512-BlR+2c3nzc8f2G639LpL89YY4bdcIdUmiOOkv2GQv4/4M0vJlpXEa0JXNHhCHU7VWOKWT/CjqHdTP8aUuDJkuw==} - engines: {node: '>= 20'} + '@oxc-transform/binding-darwin-x64@0.121.0': + resolution: {integrity: sha512-R63ZXF4Fuer3FEZYX9UmzIKAENSEYQZTglTkzWoyNPyuHDhSfyJIK+X+wgy2Wc1lTad1XquCUq5SDuRSd37fcQ==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@tailwindcss/oxide-freebsd-x64@4.2.2': - resolution: {integrity: sha512-YUqUgrGMSu2CDO82hzlQ5qSb5xmx3RUrke/QgnoEx7KvmRJHQuZHZmZTLSuuHwFf0DJPybFMXMYf+WJdxHy/nQ==} - engines: {node: '>= 20'} + '@oxc-transform/binding-freebsd-x64@0.121.0': + resolution: {integrity: sha512-0krk8L6iOJ6fobs3f9XHo4RSgEas0yLq9/xGZMuwxFs+rI/rnpYPX+1LLSmreHqeZM77a7r+UF12WjwI1odVUA==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.2': - resolution: {integrity: sha512-FPdhvsW6g06T9BWT0qTwiVZYE2WIFo2dY5aCSpjG/S/u1tby+wXoslXS0kl3/KXnULlLr1E3NPRRw0g7t2kgaQ==} - engines: {node: '>= 20'} + '@oxc-transform/binding-linux-arm-gnueabihf@0.121.0': + resolution: {integrity: sha512-cNkTaw77UaNiGOCIv2R1kHZ3OkTVlr/059agLCUaeQmZGl76Ad7DrDcDyhC0Iugw0jEdWZ9zeUS5VLmzblnTXQ==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@tailwindcss/oxide-linux-arm64-gnu@4.2.2': - resolution: {integrity: sha512-4og1V+ftEPXGttOO7eCmW7VICmzzJWgMx+QXAJRAhjrSjumCwWqMfkDrNu1LXEQzNAwz28NCUpucgQPrR4S2yw==} + '@oxc-transform/binding-linux-arm-musleabihf@0.121.0': + resolution: {integrity: sha512-eDwTIN0UUCQePgFR41doxorzsxoMoUTbXo6bEbvdFH7P4ZoaUXgHYN10Qjd9K6k0x/bBnU6oC4YPSWYKvQDr9Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxc-transform/binding-linux-arm64-gnu@0.121.0': + resolution: {integrity: sha512-UthSp+L23xeV0lIVloiRDU1d3aOvq0KRif3s6vszeSGnWf69+EVcZcondqLuX9optUhKV0/L8xwe2wLr9WkaDA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@oxc-transform/binding-linux-arm64-musl@0.121.0': + resolution: {integrity: sha512-J5vKUF8Jml1m9Fl48fKp2/wPl8LhGdjJWZ3PrrT+S16SbW7yEKixq5upzO2arhrky5elRYMXWwfi60ex1tBi6g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@oxc-transform/binding-linux-ppc64-gnu@0.121.0': + resolution: {integrity: sha512-ya+/TL/YH/VcfWeRs95pMIgEj1eQgKg3kR/9AkQgSi8i9jIDEXrgrcQ8cwRYSZ3THlT6cxe3KGJa6vwcHG6JEg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@oxc-transform/binding-linux-riscv64-gnu@0.121.0': + resolution: {integrity: sha512-XhUBS/6bxL3maLMvkyY5jM23jFCORl+noYc7KkMydpb0Ot08XSu+8c2o7QpGVHWf85eTH/1Tx0aOTrcWek7EAw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@oxc-transform/binding-linux-riscv64-musl@0.121.0': + resolution: {integrity: sha512-kAcZZrU2Wxopcpt38D1u5OeLUwV78EXyOu3VfFNkP/vrMiKB4Tbca8ZxBq+XTkpijuKE4DdCQaLZylsFj7L00w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@oxc-transform/binding-linux-s390x-gnu@0.121.0': + resolution: {integrity: sha512-jHyHS+NwPAlUEuY6BzFBDoT4LfSBEW/Ne2FeMzdK8LXOvgHFrJiBf6x8FgekatrTGrDpy1hLiACNnPA81Hs2pQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@oxc-transform/binding-linux-x64-gnu@0.121.0': + resolution: {integrity: sha512-KedV2jkFxeMvUqfh6SgXjCnO5SBZ+SorTUxSBeql7zp59ONZgAcehWAqDX+YWsK8wEpt23Q8ydC/0d6ebJIAzQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@oxc-transform/binding-linux-x64-musl@0.121.0': + resolution: {integrity: sha512-jFAZwvgjsswiHET2xxxNvxhKCI74yVmewl0F00i3vzt9C088ZVaUvvWlqDS1GRvD4ORBmpJWOYkHdscpIJijEA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@oxc-transform/binding-openharmony-arm64@0.121.0': + resolution: {integrity: sha512-xn9nxaq31f19PUyGh1xKMOSs8MVPImeaESWNOHtAIznckE+qa5/oHtYALzF3z8uvy1EC/eZODWcHrsYOVNaWug==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxc-transform/binding-wasm32-wasi@0.121.0': + resolution: {integrity: sha512-7lj6FBMX8zLfTqIY4YHHTE/b6oyCzZaUwqi2n9KX4FkgjtBpfmq5KSUgi/I+YiE7JJHu1g8Bd3uWJq1lbehL8Q==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@oxc-transform/binding-win32-arm64-msvc@0.121.0': + resolution: {integrity: sha512-+ve3UajNq2ldcCEEmpMVn7Ic3v/qCykPTSx3lZfe0iCW6tisIWvkYiXpf6B5dvwSY7SDyrdt9EyPMS75b41iPA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxc-transform/binding-win32-ia32-msvc@0.121.0': + resolution: {integrity: sha512-9ZUHa4bXWlPRLzbjYsU3VBSvqwSVHAknQlN+nUO1DVu6j958Ui9ux0I9pZHwxb07I26VMdDhd7AjJyz1ZtZlkg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxc-transform/binding-win32-x64-msvc@0.121.0': + resolution: {integrity: sha512-vV/rzJsmJeeXI1q/xuy93PnoL/IYMwCCyYMX9MmIgMx2a4Lu3vIjUNBLJx1R5CqP/NnvAelsuz05sKlO017FmQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@oxfmt/binding-android-arm-eabi@0.46.0': + resolution: {integrity: sha512-b1doV4WRcJU+BESSlCvCjV+5CEr/T6h0frArAdV26Nir+gGNFNaylvDiiMPfF1pxeV0txZEs38ojzJaxBYg+ng==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxfmt/binding-android-arm64@0.46.0': + resolution: {integrity: sha512-v6+HhjsoV3GO0u2u9jLSAZrvWfTraDxKofUIQ7/ktS7tzS+epVsxdHmeM+XxuNcAY/nWxxU1Sg4JcGTNRXraBA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxfmt/binding-darwin-arm64@0.46.0': + resolution: {integrity: sha512-3eeooJGrqGIlI5MyryDZsAcKXSmKIgAD4yYtfRrRJzXZ0UTFZtiSveIur56YPrGMYZwT4XyVhHsMqrNwr1XeFA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxfmt/binding-darwin-x64@0.46.0': + resolution: {integrity: sha512-QG8BDM0CXWbu84k2SKmCqfEddPQPFiBicwtYnLqHRWZZl57HbtOLRMac/KTq2NO4AEc4ICCBpFxJIV9zcqYfkQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxfmt/binding-freebsd-x64@0.46.0': + resolution: {integrity: sha512-9DdCqS/n2ncu/Chazvt3cpgAjAmIGQDz7hFKSrNItMApyV/Ja9mz3hD4JakIE3nS8PW9smEbPWnb389QLBY4nw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxfmt/binding-linux-arm-gnueabihf@0.46.0': + resolution: {integrity: sha512-Dgs7VeE2jT0LHMhw6tPEt0xQYe54kBqHEovmWsv4FVQlegCOvlIJNx0S8n4vj8WUtpT+Z6BD2HhKJPLglLxvZg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxfmt/binding-linux-arm-musleabihf@0.46.0': + resolution: {integrity: sha512-Zxn3adhTH13JKnU4xXJj8FeEfF680XjXh3gSShKl57HCMBRde2tUJTgogV/1MSHA80PJEVrDa7r66TLVq3Ia7Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxfmt/binding-linux-arm64-gnu@0.46.0': + resolution: {integrity: sha512-+TWipjrgVM8D7aIdDD0tlr3teLTTvQTn7QTE5BpT10H1Fj82gfdn9X6nn2sDgx/MepuSCfSnzFNJq2paLL0OiA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-arm64-musl@0.46.0': + resolution: {integrity: sha512-aAUPBWJ1lGwwnxZUEDLJ94+Iy6MuwJwPxUgO4sCA5mEEyDk7b+cDQ+JpX1VR150Zoyd+D49gsrUzpUK5h587Eg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@oxfmt/binding-linux-ppc64-gnu@0.46.0': + resolution: {integrity: sha512-ufBCJukyFX/UDrokP/r6BGDoTInnsDs7bxyzKAgMiZlt2Qu8GPJSJ6Zm6whIiJzKk0naxA8ilwmbO1LMw6Htxw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-riscv64-gnu@0.46.0': + resolution: {integrity: sha512-eqtlC2YmPqjun76R1gVfGLuKWx7NuEnLEAudZ7n6ipSKbCZTqIKSs1b5Y8K/JHZsRpLkeSmAAjig5HOIg8fQzQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-riscv64-musl@0.46.0': + resolution: {integrity: sha512-yccVOO2nMXkQLGgy0He3EQEwKD7NF0zEk+/OWmroznkqXyJdN6bfK0LtNnr6/14Bh3FjpYq7bP33l/VloCnxpA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@oxfmt/binding-linux-s390x-gnu@0.46.0': + resolution: {integrity: sha512-aAf7fG23OQCey6VRPj9IeCraoYtpgtx0ZyJ1CXkPyT1wjzBE7c3xtuxHe/AdHaJfVVb/SXpSk8Gl1LzyQupSqw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-x64-gnu@0.46.0': + resolution: {integrity: sha512-q0JPsTMyJNjYrBvYFDz4WbVsafNZaPCZv4RnFypRotLqpKROtBZcEaXQW4eb9YmvLU3NckVemLJnzkSZSdmOxw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-x64-musl@0.46.0': + resolution: {integrity: sha512-7LsLY9Cw57GPkhSR+duI3mt9baRczK/DtHYSldQ4BEU92da9igBQNl4z7Vq5U9NNPsh1FmpKvv1q9WDtiUQR1A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@oxfmt/binding-openharmony-arm64@0.46.0': + resolution: {integrity: sha512-lHiBOz8Duaku7JtRNLlps3j++eOaICPZSd8FCVmTDM4DFOPT71Bjn7g6iar1z7StXlKRweUKxWUs4sA+zWGDXg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxfmt/binding-win32-arm64-msvc@0.46.0': + resolution: {integrity: sha512-/5ktYUliP89RhgC37DBH1x20U5zPSZMy3cMEcO0j3793rbHP9MWsknBwQB6eozRzWmYrh0IFM/p20EbPvDlYlg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxfmt/binding-win32-ia32-msvc@0.46.0': + resolution: {integrity: sha512-3WTnoiuIr8XvV0DIY7SN+1uJSwKf4sPpcbHfobcRT9JutGcLaef/miyBB87jxd3aqH+mS0+G5lsgHuXLUwjjpQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxfmt/binding-win32-x64-msvc@0.46.0': + resolution: {integrity: sha512-IXxiQpkYnOwNfP23vzwSfhdpxJzyiPTY7eTn6dn3DsriKddESzM8i6kfq9R7CD/PUJwCvQT22NgtygBeug3KoA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@oxlint-tsgolint/darwin-arm64@0.22.0': + resolution: {integrity: sha512-/exgXceakHbQrzaHTtKOe7MuDATaWMCCWpsCDQCZKeYhLGXzComipTrCYnHzAXrdnNBb5r5K+RRf5A6ormrhMA==} + cpu: [arm64] + os: [darwin] + + '@oxlint-tsgolint/darwin-x64@0.22.0': + resolution: {integrity: sha512-xFGdIahlmUbK+/MpZ5y08D0ewMGLDbd2Vki5wxVFYg50lSrtgPAtdDl+kqKZLNaFu0zpMar8n9wv1le05sL/jw==} + cpu: [x64] + os: [darwin] + + '@oxlint-tsgolint/linux-arm64@0.22.0': + resolution: {integrity: sha512-53RvC9f77eUo+V1dfQNwGVnsIfPJFMibRR0ee128EUpYNDOZe/ojmCfuXJeU7cY91V7r7fZSm42KPJocXUX8og==} + cpu: [arm64] + os: [linux] + + '@oxlint-tsgolint/linux-x64@0.22.0': + resolution: {integrity: sha512-evZcJAZ9hjNyuN69RnXwbt+U2pAOcYt+yvqukgugiCkRm4iBZ0R0CvpY1tgfG2XcGUhEPh8dljO+nPZTEVGpCQ==} + cpu: [x64] + os: [linux] + + '@oxlint-tsgolint/win32-arm64@0.22.0': + resolution: {integrity: sha512-7jTO+k1mr5BxRAI2fxc1NRcE3MAbHNZ0Vef9SD1yAR6d1E6qEv5D/D7yuHpQpw6AO3qoecSVo2Jzr+JirN61+w==} + cpu: [arm64] + os: [win32] + + '@oxlint-tsgolint/win32-x64@0.22.0': + resolution: {integrity: sha512-7lbl9XFcqO+scsynxMzTQdl0XUe6sBUCyY/oGWvCB+JmV4U+70vzSyZJdTEzzxtkZiNnUVFFh9RJLmoiQSne+w==} + cpu: [x64] + os: [win32] + + '@oxlint/binding-android-arm-eabi@1.61.0': + resolution: {integrity: sha512-6eZBPgiigK5txqoVgRqxbaxiom4lM8AP8CyKPPvpzKnQ3iFRFOIDc+0AapF+qsUSwjOzr5SGk4SxQDpQhkSJMQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxlint/binding-android-arm-eabi@1.62.0': + resolution: {integrity: sha512-pKsthNECyvJh8lPTICz6VcwVy2jOqdhhsp1rlxCkhgZR47aKvXPmaRWQDv+zlXpRae4qm1MaaTnutkaOk5aofg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxlint/binding-android-arm64@1.61.0': + resolution: {integrity: sha512-CkwLR69MUnyv5wjzebvbbtTSUwqLxM35CXE79bHqDIK+NtKmPEUpStTcLQRZMCo4MP0qRT6TXIQVpK0ZVScnMA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxlint/binding-android-arm64@1.62.0': + resolution: {integrity: sha512-b1AUNViByvgmR2xJDubvLIr+dSuu3uraG7bsAoKo+xrpspPvu6RIn6Fhr2JUhobfep3jwUTy18Huco6GkwdvGQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxlint/binding-darwin-arm64@1.61.0': + resolution: {integrity: sha512-8JbefTkbmvqkqWjmQrHke+MdpgT2UghhD/ktM4FOQSpGeCgbMToJEKdl9zwhr/YWTl92i4QI1KiTwVExpcUN8A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxlint/binding-darwin-arm64@1.62.0': + resolution: {integrity: sha512-iG+Tvf70UJ6otfwFYIHk36Sjq9cpPP5YLxkoggANNRtzgi3Tj3g8q6Ybqi6AtkU3+yg9QwF7bDCkCS6bbL4PCg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxlint/binding-darwin-x64@1.61.0': + resolution: {integrity: sha512-uWpoxDT47hTnDLcdEh5jVbso8rlTTu5o0zuqa9J8E0JAKmIWn7kGFEIB03Pycn2hd2vKxybPGLhjURy/9We5FQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxlint/binding-darwin-x64@1.62.0': + resolution: {integrity: sha512-oOWI6YPPr5AJUx+yIDlxmuUbQjS5gZX3OH3QisawYvsZgLiQVvZtR0rPBcJTxLWqt2ClrWg0DlSrlUiG5SQNHg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxlint/binding-freebsd-x64@1.61.0': + resolution: {integrity: sha512-K/o4hEyW7flfMel0iBVznmMBt7VIMHGdjADocHKpK1DUF9erpWnJ+BSSWd2W0c8K3mPtpph+CuHzRU6CI3l9jQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxlint/binding-freebsd-x64@1.62.0': + resolution: {integrity: sha512-dLP33T7VLCmLVv4cvjkVX+rmkcwNk2UfxmsZPNur/7BQHoQR60zJ7XLiRvNUawlzn0u8ngCa3itjEG73MAMa/w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxlint/binding-linux-arm-gnueabihf@1.61.0': + resolution: {integrity: sha512-P6040ZkcyweJ0Po9yEFqJCdvZnf3VNCGs1SIHgXDf8AAQNC6ID/heXQs9iSgo2FH7gKaKq32VWc59XZwL34C5Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxlint/binding-linux-arm-gnueabihf@1.62.0': + resolution: {integrity: sha512-fl//LWNks6qo9chNY60UDYyIwtp7a5cEx4Y/rHPjaarhuwqx6jtbzEpD5V5AqmdL4a6Y5D8zeXg5HF2Cr0QmSQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxlint/binding-linux-arm-musleabihf@1.61.0': + resolution: {integrity: sha512-bwxrGCzTZkuB+THv2TQ1aTkVEfv5oz8sl+0XZZCpoYzErJD8OhPQOTA0ENPd1zJz8QsVdSzSrS2umKtPq4/JXg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxlint/binding-linux-arm-musleabihf@1.62.0': + resolution: {integrity: sha512-i5vkAuxvueTODV3J2dL61/TXewDHhMFKvtD156cIsk7GsdfiAu7zW7kY0NJXhKeFHeiMZIh7eFNjkPYH6J47HQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxlint/binding-linux-arm64-gnu@1.61.0': + resolution: {integrity: sha512-vkhb9/wKguMkLlrm3FoJW/Xmdv31GgYAE+x8lxxQ+7HeOxXUySI0q36a3NTVIuQUdLzxCI1zzMGsk1o37FOe3w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-arm64-gnu@1.62.0': + resolution: {integrity: sha512-QwN19LLuIGuOjEflSeJkZmOTfBdBMlTmW8xbMf8TZhjd//cxVNYQPq75q7oKZBJc6hRx3gY7sX0Egc8cEIFZYg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-arm64-musl@1.61.0': + resolution: {integrity: sha512-bl1dQh8LnVqsj6oOQAcxwbuOmNJkwc4p6o//HTBZhNTzJy21TLDwAviMqUFNUxDHkPGpmdKTSN4tWTjLryP8xg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@oxlint/binding-linux-arm64-musl@1.62.0': + resolution: {integrity: sha512-8eCy3FCDuWUM5hWujAv6heMvfZPbcCOU3SdQUAkixZLu5bSzOkNfirJiLGoQFO943xceOKkiQRMQNzH++jM3WA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@oxlint/binding-linux-ppc64-gnu@1.61.0': + resolution: {integrity: sha512-QoOX6KB2IiEpyOj/HKqaxi+NQHPnOgNgnr22n9N4ANJCzXkUlj1UmeAbFb4PpqdlHIzvGDM5xZ0OKtcLq9RhiQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-ppc64-gnu@1.62.0': + resolution: {integrity: sha512-NjQ7K7tpTPDe9J+yq8p/s/J0E7lRCkK2uDBDqvT4XIT6f4Z0tlnr59OBg/WcrmVHER1AbrcfyxhGTXgcG8ytWg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-riscv64-gnu@1.61.0': + resolution: {integrity: sha512-1TGcTerjY6p152wCof3oKElccq3xHljS/Mucp04gV/4ATpP6nO7YNnp7opEg6SHkv2a57/b4b8Ndm9znJ1/qAw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-riscv64-gnu@1.62.0': + resolution: {integrity: sha512-oKZed9gmSwze29dEt3/Wnsv6l/Ygw/FUst+8Kfpv2SGeS/glEoTGZAMQw37SVyzFV76UTHJN2snGgxK2t2+8ow==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-riscv64-musl@1.61.0': + resolution: {integrity: sha512-65wXEmZIrX2ADwC8i/qFL4EWLSbeuBpAm3suuX1vu4IQkKd+wLT/HU/BOl84kp91u2SxPkPDyQgu4yrqp8vwVA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@oxlint/binding-linux-riscv64-musl@1.62.0': + resolution: {integrity: sha512-gBjBxQ+9lGpAYq+ELqw0w8QXsBnkZclFc7GRX2r0LnEVn3ZTEqeIKpKcGjucmp76Q53bvJD0i4qBWBhcfhSfGA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@oxlint/binding-linux-s390x-gnu@1.61.0': + resolution: {integrity: sha512-TVvhgMvor7Qa6COeXxCJ7ENOM+lcAOGsQ0iUdPSCv2hxb9qSHLQ4XF1h50S6RE1gBOJ0WV3rNukg4JJJP1LWRA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-s390x-gnu@1.62.0': + resolution: {integrity: sha512-Ew2Kxs9EQ9/mbAIJ2hvocMC0wsOu6YKzStI2eFBDt+Td5O8seVC/oxgRIHqCcl5sf5ratA1nozQBAuv7tphkHg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-x64-gnu@1.61.0': + resolution: {integrity: sha512-SjpS5uYuFoDnDdZPwZE59ndF95AsY47R5MliuneTWR1pDm2CxGJaYXbKULI71t5TVfLQUWmrHEGRL9xvuq6dnA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-x64-gnu@1.62.0': + resolution: {integrity: sha512-5z25jcAA0gfKyVwz71A0VXgaPlocPoTAxhlv/hgoK6tlCrfoNuw7haWbDHvGMfjXhdic4EqVXGRv5XsTqFnbRQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-x64-musl@1.61.0': + resolution: {integrity: sha512-gGfAeGD4sNJGILZbc/yKcIimO9wQnPMoYp9swAaKeEtwsSQAbU+rsdQze5SBtIP6j0QDzeYd4XSSUCRCF+LIeQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@oxlint/binding-linux-x64-musl@1.62.0': + resolution: {integrity: sha512-IWpHmMB6ZDllPvqWDkG6AmXrN7JF5e/c4g/0PuURsmlK+vHoYZPB70rr4u1bn3I4LsKCSpqqfveyx6UCOC8wdg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@oxlint/binding-openharmony-arm64@1.61.0': + resolution: {integrity: sha512-OlVT0LrG/ct33EVtWRyR+B/othwmDWeRxfi13wUdPeb3lAT5TgTcFDcfLfarZtzB4W1nWF/zICMgYdkggX2WmQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxlint/binding-openharmony-arm64@1.62.0': + resolution: {integrity: sha512-fjlSxxrD5pA594vkyikCS9MnPRjQawW6/BLgyTYkO+73wwPlYjkcZ7LSd974l0Q2zkHQmu4DPvJFLYA7o8xrxQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxlint/binding-win32-arm64-msvc@1.61.0': + resolution: {integrity: sha512-vI//NZPJk6DToiovPtaiwD4iQ7kO1r5ReWQD0sOOyKRtP3E2f6jxin4uvwi3OvDzHA2EFfd7DcZl5dtkQh7g1w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxlint/binding-win32-arm64-msvc@1.62.0': + resolution: {integrity: sha512-EiFXr8loNS0Ul3Gu80+9nr1T8jRmnKocqmHHg16tj5ZqTgUXyb97l2rrspVHdDluyFn9JfR4PoJFdNzw4paHww==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxlint/binding-win32-ia32-msvc@1.61.0': + resolution: {integrity: sha512-0ySj4/4zd2XjePs3XAQq7IigIstN4LPQZgCyigX5/ERMLjdWAJfnxcTsrtxZxuij8guJW8foXuHmhGxW0H4dDA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxlint/binding-win32-ia32-msvc@1.62.0': + resolution: {integrity: sha512-IgOFvL73li1bFgab+hThXYA0N2Xms2kV2MvZN95cebV+fmrZ9AVui1JSxfeeqRLo3CpPxKZlzhyq4G0cnaAvIw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxlint/binding-win32-x64-msvc@1.61.0': + resolution: {integrity: sha512-0xgSiyeqDLDZxXoe9CVJrOx3TUVsfyoOY7cNi03JbItNcC9WCZqrSNdrAbHONxhSPaVh/lzfnDcON1RqSUMhHw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@oxlint/binding-win32-x64-msvc@1.62.0': + resolution: {integrity: sha512-6hMpyDWQ2zGA1OXFKBrdYMUveUCO8UJhkO6JdwZPd78xIdHZNhjx+pib+4fC2Cljuhjyl0QwA2F3df/bs4Bp6A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@parcel/watcher-android-arm64@2.5.6': + resolution: {integrity: sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + + '@parcel/watcher-darwin-arm64@2.5.6': + resolution: {integrity: sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + + '@parcel/watcher-darwin-x64@2.5.6': + resolution: {integrity: sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + + '@parcel/watcher-freebsd-x64@2.5.6': + resolution: {integrity: sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + + '@parcel/watcher-linux-arm-glibc@2.5.6': + resolution: {integrity: sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-arm-musl@2.5.6': + resolution: {integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + libc: [musl] + + '@parcel/watcher-linux-arm64-glibc@2.5.6': + resolution: {integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-arm64-musl@2.5.6': + resolution: {integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@parcel/watcher-linux-x64-glibc@2.5.6': + resolution: {integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-x64-musl@2.5.6': + resolution: {integrity: sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@parcel/watcher-win32-arm64@2.5.6': + resolution: {integrity: sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + + '@parcel/watcher-win32-ia32@2.5.6': + resolution: {integrity: sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + + '@parcel/watcher-win32-x64@2.5.6': + resolution: {integrity: sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + + '@parcel/watcher@2.5.6': + resolution: {integrity: sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==} + engines: {node: '>= 10.0.0'} + + '@polka/url@1.0.0-next.29': + resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} + + '@remix-run/assert@0.2.0': + resolution: {integrity: sha512-SNfcxPQstoIBr/hbRSsTYLNnmIXMgiL4cY8o5HH9PE7Ue/NQcIwqNJtvV0xVrk3pY/ywxHhAwSl2V8ao1Is9Cg==} + + '@remix-run/assets@0.3.0': + resolution: {integrity: sha512-WmnAgg+D4BA70r4VccW3LF/XPl192NY+7+SicBCeMLu6KKH7lNW5cFqL9e0GM2bmyL9lP8EVNEd/Ld/c9kCxyg==} + + '@remix-run/async-context-middleware@0.2.2': + resolution: {integrity: sha512-zDuA5HoSAEqaPkjJFg8sSYeYxZK1s6kWUSXlOzcOxgQC9DHk5X3f1pl552zbq/MSzQo1MgzTBgFxQ5Lu8UTLAQ==} + + '@remix-run/auth-middleware@0.1.2': + resolution: {integrity: sha512-hXv0tCKNcwcSWAKYTTxtaKM+xiWk/U4ZL4IKlk5pHLiEaFoYykSgVOlMB59cmZuovqt74ju7YQME9MW2zhnFEA==} + + '@remix-run/auth@0.2.1': + resolution: {integrity: sha512-KGX1y1h7eZiCVU204Z9NZhOjV+zhF4wktm5gOuiUoVN95oYTh9BFEEIsyGQdxHhxTH31hWUNNh2Aj5dCrr/u6Q==} + + '@remix-run/cli@0.2.0': + resolution: {integrity: sha512-u0xOE0GUF98OSfonAtVOFLRC4rPM9mmenXkVfwHu3VZHENRpkafmi/zkdkvwDdJMp2/ucODlFd5gmfC0/CCiMA==} + engines: {node: '>=24.3.0'} + + '@remix-run/compression-middleware@0.1.7': + resolution: {integrity: sha512-7sdpcNYHSuA2X4lkpzCclOTsQY1WQ2JHwahAF7Pcsx1lF8FKniSjgdjubMsl/mOrbK1ajeefIkBDA4wpF3E8Gw==} + + '@remix-run/cookie@0.5.1': + resolution: {integrity: sha512-gbeZfVd1AKRlFj3IJWcIcR6zqVGz2XGJhR+mcqYiWnYt6KM8oUGtc82dsc4qZnWWA1f0nM4/He9wrU4GjB0pag==} + + '@remix-run/cop-middleware@0.1.2': + resolution: {integrity: sha512-8N0yGKuEeP9AD+1uyq/kwF+F82gmG2otGt4nzzXOYDm/6D7pkFfAvQpV2Fhv6sNYtntKQnIzyTMa6tdMXP3n0A==} + + '@remix-run/cors-middleware@0.1.2': + resolution: {integrity: sha512-+tyo+npF+6szzVorrApp0Ilx+UZUdHlSTu5HJG/Nh1zw/gavWEeMtBw9ZWEWz8EhZZ03vVYnTvlEUW5GRhW3TA==} + + '@remix-run/csrf-middleware@0.1.2': + resolution: {integrity: sha512-f+l8f3sBD3xBec2kKKvEVwPLLD7No96Xf8nOYXhuPyeSy2iRaeRG+psqpZ0nH4WukU0/mmWXxuM0/DkPxr4mgg==} + + '@remix-run/data-schema@0.3.0': + resolution: {integrity: sha512-rjGaFJduzO3iMFOKwA5URpZDuGbUxgBwcX9myBglfqbax8dBlhRcxurydepq+xi+XBE+bPrT9V57Jur6p1igow==} + + '@remix-run/data-table-mysql@0.3.1': + resolution: {integrity: sha512-AG02+HbMlBsxuX9/3Y285YO1/ZPCWcQV6+eVthDZ0ub0ksZ7xNqY54LW6XF9b2QM++8yRTMKPTIElhJgyb6UgQ==} + peerDependencies: + mysql2: ^3.15.3 + peerDependenciesMeta: + mysql2: + optional: true + + '@remix-run/data-table-postgres@0.3.1': + resolution: {integrity: sha512-wveXpsPwesuWtNPWrRrWq5XL4y1Jkk6uBfIYCd9twPyDOX5urCjwZzI8muPW+X1Gs3co5NWZK8+TjI0t+uYW6w==} + peerDependencies: + pg: ^8.16.3 + peerDependenciesMeta: + pg: + optional: true + + '@remix-run/data-table-sqlite@0.4.1': + resolution: {integrity: sha512-l4ZtPaviYKF/hiDXBbb35lnbye9m+X31B1RcPNUA6DNF0u5jwAFbaUfVRB+CwfJgv+PNZx9FXJbmMW5vK1Giwg==} + + '@remix-run/data-table@0.2.1': + resolution: {integrity: sha512-p7LFOzgSmRws6U7N2karl+t85J/8jKtUjtKb3XxvCBWEwJk2XZ2nVhhhmamdN5+XEzgFK/KGnNyRtdu114v7sA==} + + '@remix-run/fetch-proxy@0.8.0': + resolution: {integrity: sha512-kUBHz1ykwpS9eiWWeakdsvyIRyNSxKqFJCX2dwceUMOFuGtHkdN96gF1fyv9f6oxhRZCApgm4sjrdL67VpOfhA==} + + '@remix-run/fetch-router@0.18.2': + resolution: {integrity: sha512-/yZkz81ZwzWcZR9od+PIOfwavsreC62TmRdSYESznThYYhVezLkvvRLvNh0v8hAaSOIzNkoLN/wc037m67mm4Q==} + + '@remix-run/file-storage-s3@0.1.1': + resolution: {integrity: sha512-ylE9w6A6mrX4OystdNbIRNqozADgnnnEly9m53VDb3yO+CDYc+izFQZ93R3uPqC7jUenuG4Jc07Yv709J8Z/SA==} + + '@remix-run/file-storage@0.13.4': + resolution: {integrity: sha512-DunIIfs5/qpxQRvlxs5OT1I8TMiZqf7zbCOzKz6LJconD5lC97P58UKOfwS69hfxhg3NyBGFqhBuQ+QhYUCAOQ==} + + '@remix-run/form-data-middleware@0.2.3': + resolution: {integrity: sha512-gaHAQay7ckLcmkpJpPJlYgN5vJpXp+WLdHUCC8MiAJ0uFWhyaKDzKZvjewq7V0InVwi/M0J0Fvyaa2ljocq+3w==} + + '@remix-run/form-data-parser@0.17.0': + resolution: {integrity: sha512-012VyeBYzqHxg/c6n882qDdHgR/hLk+bT+Eh9nb2CCfzt5OtkhAIuQOCj1Me9KZs3x23Rfe06ybZZ8k/dp3cxw==} + + '@remix-run/fs@0.4.3': + resolution: {integrity: sha512-4fT/28oF8VR99eJRK6jFw1YQ3X3KlKBt6fhfS/jFMq4OMQ2KOTUfLwLOTVGY3/utf1Am9mX359WBKYxdsIGoJA==} + + '@remix-run/headers@0.19.0': + resolution: {integrity: sha512-+62NbkXuXm9r/NdG6KfH9OCKofCWm8VjkrVPICiHKtRl8Gf2Vi6eFTN4mGgBlZRhd5mmEVRV4hTIn/JUSHDAOw==} + + '@remix-run/html-template@0.3.0': + resolution: {integrity: sha512-aAMx68udtIk0fmCpCXHYscVeCDsRVEmEgh4XvtusPr3vkHu3jn4gx5oAxgsPXPdDmmD/d75SYyI0m/F+aLz5iQ==} + + '@remix-run/lazy-file@5.0.3': + resolution: {integrity: sha512-3NIp4xRaxAwcDtRSXKm6qYeGX/DjFGNY4FVm0tdvvW2TFyuFbzBoYDQxo4PyEiLtlqkEaqqHTZTIe2SD+Dau+w==} + + '@remix-run/logger-middleware@0.2.1': + resolution: {integrity: sha512-V1suiosYzMhX6urHkmT4o4EgqCk7RpZjfovJ0vtTyHEYU8m66Wm9JrvqYjV0ws9wzyUjAVb8FGBqwq7HKRDWzQ==} + + '@remix-run/method-override-middleware@0.1.7': + resolution: {integrity: sha512-DOGYlVvh5E5ohwUOOjUBCMUwMYzMyfipiUeO+Ly9h5UPfIETWoCgaaVR+XxWXUfIm/9pPCD6DLeNPR8sXDz4ug==} + + '@remix-run/mime@0.4.1': + resolution: {integrity: sha512-n0DUUwpHiDrtHCSw6YFbjeMjajj7STqwzK9PMJkQOHbvOarfPdQdRRMkRqYPBmhu6ABzb6sAdYRSrxPx50I5VQ==} + + '@remix-run/multipart-parser@0.16.0': + resolution: {integrity: sha512-RZqdkP+jOW3sQSsv/kC9OwaA0eifMEvTwlaIw/VC3HOHgebKgvQO/+gBJsBgH7YecFSbvaZq1/iB5J+1jVhDpg==} + + '@remix-run/node-fetch-server@0.13.1': + resolution: {integrity: sha512-dOL+A/C84EA47gO/ps52KGrVSiYy96512rwtbXmJfWKYFm1FbrbjA3jao1hcIfao+jwVNEaZ1kTMwFjiino+HQ==} + + '@remix-run/node-serve@0.1.0': + resolution: {integrity: sha512-/OhPBuJkEswC7og5yHc5kG2JnOBHwWCXP4051X05K73Y7e7iAzcgjGz8eYaKNR5Lvk2uUmcECNelRdqNRxFSbg==} + + '@remix-run/response@0.3.3': + resolution: {integrity: sha512-hgqYDk557dYjLJ0W5Oa6cj5jtNc/5HpAV+jCYlW8+PvoO0gkQzwOJihaFbePCuGW7jhOAFeD4L+SlvV1TxvWpQ==} + + '@remix-run/route-pattern@0.20.1': + resolution: {integrity: sha512-SSwyX3hX/xZck5UXy0bN4ubsnRJeuEKqHjz4Cc3so32FECexdNk0Y+pg2YZNu7FLGpjBn5dBUQCOtjIXQQudUw==} + + '@remix-run/session-middleware@0.2.2': + resolution: {integrity: sha512-JZVUoE2Ow/wOP4lOPdJIgXhgMEV2AZrYTv7+cEVDp4qzf2hZApVnAp2N4AcrNekSF24IRqz1Xm2gccHuHfIK8Q==} + + '@remix-run/session-storage-memcache@0.1.0': + resolution: {integrity: sha512-k853rpHncdTJUwdk0hqd+gZ2OONZLNdOUJBKdJB+MehxrVv1TtacDnA+Xs3kh+IVwUrsTmBhED+GHSUocMATUg==} + + '@remix-run/session-storage-redis@0.1.0': + resolution: {integrity: sha512-MovUS1E98wDHP8zsESJGm3ySB7iiOhd+3usxyXXM2sbF9gIe6r1bdAXXirGIoC8AEq1v8IiFE5u5ipo7PX0UHQ==} + peerDependencies: + redis: ^5.10.0 + peerDependenciesMeta: + redis: + optional: true + + '@remix-run/session@0.4.1': + resolution: {integrity: sha512-Bm6aKYgutb/raHZ3laloz8g/Qu7f3CeK3o4gUVDMxtEiAdWCzJamwHoTpGOc5+g1Kuy7z85v4M6nGrF06MFDSg==} + + '@remix-run/static-middleware@0.4.8': + resolution: {integrity: sha512-dXU4MzxW/r+/btjittqXu7CeRU2IR0Z9G55pu241bh3i9fMOdtw2hhzVpUaNNfOPGsFCTq7KDIxo+dPKfTah0A==} + + '@remix-run/tar-parser@0.7.1': + resolution: {integrity: sha512-NZKTuA66rj0zqpljWAb6v147cNu5BtRCiv8FY5kn64ZPvLmoI62Ehm2hoUh0g0wJHeCNmgS5QZg1xhw6FX67SA==} + + '@remix-run/terminal@0.1.0': + resolution: {integrity: sha512-vxiiCm3yQTBeG4j9Lm4PVZElEdD7gBNm+Q2rqTGMlE4ImrWFoq7h2Jk1y3BMylNZYz0m3pzihQ5G2sbY1XtdLg==} + + '@remix-run/test@0.3.0': + resolution: {integrity: sha512-amfWPIenHXXZqozPY+LUqspjmaSjHAW5J6jd4Owl180AEc+14IdMPy3D0x27S9ArjRioiqsPBKpYP1EmRft61g==} + engines: {node: '>=24.3.0'} + hasBin: true + peerDependencies: + playwright: ^1.59.0 + peerDependenciesMeta: + playwright: + optional: true + + '@remix-run/ui@0.1.1': + resolution: {integrity: sha512-yn5oL/uZ8izabJxjeKhVo9lBGhb+ZhOJHWk5Tu7YJL3RSxvP7BrO/ofrdWUcOXSsNxao3Lj+PF1lVmnTBf8nfQ==} + + '@rolldown/binding-android-arm64@1.0.0-rc.17': + resolution: {integrity: sha512-s70pVGhw4zqGeFnXWvAzJDlvxhlRollagdCCKRgOsgUOH3N1l0LIxf83AtGzmb5SiVM4Hjl5HyarMRfdfj3DaQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.0.0-rc.17': + resolution: {integrity: sha512-4ksWc9n0mhlZpZ9PMZgTGjeOPRu8MB1Z3Tz0Mo02eWfWCHMW1zN82Qz/pL/rC+yQa+8ZnutMF0JjJe7PjwasYw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.0-rc.17': + resolution: {integrity: sha512-SUSDOI6WwUVNcWxd02QEBjLdY1VPHvlEkw6T/8nYG322iYWCTxRb1vzk4E+mWWYehTp7ERibq54LSJGjmouOsw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.0.0-rc.17': + resolution: {integrity: sha512-hwnz3nw9dbJ05EDO/PvcjaaewqqDy7Y1rn1UO81l8iIK1GjenME75dl16ajbvSSMfv66WXSRCYKIqfgq2KCfxw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.17': + resolution: {integrity: sha512-IS+W7epTcwANmFSQFrS1SivEXHtl1JtuQA9wlxrZTcNi6mx+FDOYrakGevvvTwgj2JvWiK8B29/qD9BELZPyXQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.17': + resolution: {integrity: sha512-e6usGaHKW5BMNZOymS1UcEYGowQMWcgZ71Z17Sl/h2+ZziNJ1a9n3Zvcz6LdRyIW5572wBCTH/Z+bKuZouGk9Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.17': + resolution: {integrity: sha512-b/CgbwAJpmrRLp02RPfhbudf5tZnN9nsPWK82znefso832etkem8H7FSZwxrOI9djcdTP7U6YfNhbRnh7djErg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.17': + resolution: {integrity: sha512-4EII1iNGRUN5WwGbF/kOh/EIkoDN9HsupgLQoXfY+D1oyJm7/F4t5PYU5n8SWZgG0FEwakyM8pGgwcBYruGTlA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.17': + resolution: {integrity: sha512-AH8oq3XqQo4IibpVXvPeLDI5pzkpYn0WiZAfT05kFzoJ6tQNzwRdDYQ45M8I/gslbodRZwW8uxLhbSBbkv96rA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.17': + resolution: {integrity: sha512-cLnjV3xfo7KslbU41Z7z8BH/E1y5mzUYzAqih1d1MDaIGZRCMqTijqLv76/P7fyHuvUcfGsIpqCdddbxLLK9rA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-musl@1.0.0-rc.17': + resolution: {integrity: sha512-0phclDw1spsL7dUB37sIARuis2tAgomCJXAHZlpt8PXZ4Ba0dRP1e+66lsRqrfhISeN9bEGNjQs+T/Fbd7oYGw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rolldown/binding-openharmony-arm64@1.0.0-rc.17': + resolution: {integrity: sha512-0ag/hEgXOwgw4t8QyQvUCxvEg+V0KBcA6YuOx9g0r02MprutRF5dyljgm3EmR02O292UX7UeS6HzWHAl6KgyhA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.0.0-rc.17': + resolution: {integrity: sha512-LEXei6vo0E5wTGwpkJ4KoT3OZJRnglwldt5ziLzOlc6qqb55z4tWNq2A+PFqCJuvWWdP53CVhG1Z9NtToDPJrA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.17': + resolution: {integrity: sha512-gUmyzBl3SPMa6hrqFUth9sVfcLBlYsbMzBx5PlexMroZStgzGqlZ26pYG89rBb45Mnia+oil6YAIFeEWGWhoZA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.17': + resolution: {integrity: sha512-3hkiolcUAvPB9FLb3UZdfjVVNWherN1f/skkGWJP/fgSQhYUZpSIRr0/I8ZK9TkF3F7kxvJAk0+IcKvPHk9qQg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.0-rc.17': + resolution: {integrity: sha512-n8iosDOt6Ig1UhJ2AYqoIhHWh/isz0xpicHTzpKBeotdVsTEcxsSA/i3EVM7gQAj0rU27OLAxCjzlj15IWY7bg==} + + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + + '@tailwindcss/cli@4.2.4': + resolution: {integrity: sha512-e87GGhuXxnyQPyA0TS8an/3wNpj+OUmx8u0F4BicYr48TF72032AIu5917rRYaWm7HorXi3GSZ/uG+ohqP6AKA==} + hasBin: true + + '@tailwindcss/node@4.2.4': + resolution: {integrity: sha512-Ai7+yQPxz3ddrDQzFfBKdHEVBg0w3Zl83jnjuwxnZOsnH9pGn93QHQtpU0p/8rYWxvbFZHneni6p1BSLK4DkGA==} + + '@tailwindcss/oxide-android-arm64@4.2.4': + resolution: {integrity: sha512-e7MOr1SAn9U8KlZzPi1ZXGZHeC5anY36qjNwmZv9pOJ8E4Q6jmD1vyEHkQFmNOIN7twGPEMXRHmitN4zCMN03g==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.2.4': + resolution: {integrity: sha512-tSC/Kbqpz/5/o/C2sG7QvOxAKqyd10bq+ypZNf+9Fi2TvbVbv1zNpcEptcsU7DPROaSbVgUXmrzKhurFvo5eDg==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.2.4': + resolution: {integrity: sha512-yPyUXn3yO/ufR6+Kzv0t4fCg2qNr90jxXc5QqBpjlPNd0NqyDXcmQb/6weunH/MEDXW5dhyEi+agTDiqa3WsGg==} + engines: {node: '>= 20'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.2.4': + resolution: {integrity: sha512-BoMIB4vMQtZsXdGLVc2z+P9DbETkiopogfWZKbWwM8b/1Vinbs4YcUwo+kM/KeLkX3Ygrf4/PsRndKaYhS8Eiw==} + engines: {node: '>= 20'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.4': + resolution: {integrity: sha512-7pIHBLTHYRAlS7V22JNuTh33yLH4VElwKtB3bwchK/UaKUPpQ0lPQiOWcbm4V3WP2I6fNIJ23vABIvoy2izdwA==} + engines: {node: '>= 20'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.2.4': + resolution: {integrity: sha512-+E4wxJ0ZGOzSH325reXTWB48l42i93kQqMvDyz5gqfRzRZ7faNhnmvlV4EPGJU3QJM/3Ab5jhJ5pCRUsKn6OQw==} engines: {node: '>= 20'} cpu: [arm64] os: [linux] libc: [glibc] - '@tailwindcss/oxide-linux-arm64-musl@4.2.2': - resolution: {integrity: sha512-oCfG/mS+/+XRlwNjnsNLVwnMWYH7tn/kYPsNPh+JSOMlnt93mYNCKHYzylRhI51X+TbR+ufNhhKKzm6QkqX8ag==} + '@tailwindcss/oxide-linux-arm64-musl@4.2.4': + resolution: {integrity: sha512-bBADEGAbo4ASnppIziaQJelekCxdMaxisrk+fB7Thit72IBnALp9K6ffA2G4ruj90G9XRS2VQ6q2bCKbfFV82g==} engines: {node: '>= 20'} cpu: [arm64] os: [linux] libc: [musl] - '@tailwindcss/oxide-linux-x64-gnu@4.2.2': - resolution: {integrity: sha512-rTAGAkDgqbXHNp/xW0iugLVmX62wOp2PoE39BTCGKjv3Iocf6AFbRP/wZT/kuCxC9QBh9Pu8XPkv/zCZB2mcMg==} + '@tailwindcss/oxide-linux-x64-gnu@4.2.4': + resolution: {integrity: sha512-7Mx25E4WTfnht0TVRTyC00j3i0M+EeFe7wguMDTlX4mRxafznw0CA8WJkFjWYH5BlgELd1kSjuU2JiPnNZbJDA==} engines: {node: '>= 20'} cpu: [x64] os: [linux] libc: [glibc] - '@tailwindcss/oxide-linux-x64-musl@4.2.2': - resolution: {integrity: sha512-XW3t3qwbIwiSyRCggeO2zxe3KWaEbM0/kW9e8+0XpBgyKU4ATYzcVSMKteZJ1iukJ3HgHBjbg9P5YPRCVUxlnQ==} + '@tailwindcss/oxide-linux-x64-musl@4.2.4': + resolution: {integrity: sha512-2wwJRF7nyhOR0hhHoChc04xngV3iS+akccHTGtz965FwF0up4b2lOdo6kI1EbDaEXKgvcrFBYcYQQ/rrnWFVfA==} engines: {node: '>= 20'} cpu: [x64] os: [linux] libc: [musl] - '@tailwindcss/oxide-wasm32-wasi@4.2.2': - resolution: {integrity: sha512-eKSztKsmEsn1O5lJ4ZAfyn41NfG7vzCg496YiGtMDV86jz1q/irhms5O0VrY6ZwTUkFy/EKG3RfWgxSI3VbZ8Q==} + '@tailwindcss/oxide-wasm32-wasi@4.2.4': + resolution: {integrity: sha512-FQsqApeor8Fo6gUEklzmaa9994orJZZDBAlQpK2Mq+DslRKFJeD6AjHpBQ0kZFQohVr8o85PPh8eOy86VlSCmw==} engines: {node: '>=14.0.0'} cpu: [wasm32] bundledDependencies: @@ -1132,87 +1701,143 @@ packages: - '@emnapi/wasi-threads' - tslib - '@tailwindcss/oxide-win32-arm64-msvc@4.2.2': - resolution: {integrity: sha512-qPmaQM4iKu5mxpsrWZMOZRgZv1tOZpUm+zdhhQP0VhJfyGGO3aUKdbh3gDZc/dPLQwW4eSqWGrrcWNBZWUWaXQ==} + '@tailwindcss/oxide-win32-arm64-msvc@4.2.4': + resolution: {integrity: sha512-L9BXqxC4ToVgwMFqj3pmZRqyHEztulpUJzCxUtLjobMCzTPsGt1Fa9enKbOpY2iIyVtaHNeNvAK8ERP/64sqGQ==} engines: {node: '>= 20'} cpu: [arm64] os: [win32] - '@tailwindcss/oxide-win32-x64-msvc@4.2.2': - resolution: {integrity: sha512-1T/37VvI7WyH66b+vqHj/cLwnCxt7Qt3WFu5Q8hk65aOvlwAhs7rAp1VkulBJw/N4tMirXjVnylTR72uI0HGcA==} + '@tailwindcss/oxide-win32-x64-msvc@4.2.4': + resolution: {integrity: sha512-ESlKG0EpVJQwRjXDDa9rLvhEAh0mhP1sF7sap9dNZT0yyl9SAG6T7gdP09EH0vIv0UNTlo6jPWyujD6559fZvw==} engines: {node: '>= 20'} cpu: [x64] os: [win32] - '@tailwindcss/oxide@4.2.2': - resolution: {integrity: sha512-qEUA07+E5kehxYp9BVMpq9E8vnJuBHfJEC0vPC5e7iL/hw7HR61aDKoVoKzrG+QKp56vhNZe4qwkRmMC0zDLvg==} + '@tailwindcss/oxide@4.2.4': + resolution: {integrity: sha512-9El/iI069DKDSXwTvB9J4BwdO5JhRrOweGaK25taBAvBXyXqJAX+Jqdvs8r8gKpsI/1m0LeJLyQYTf/WLrBT1Q==} engines: {node: '>= 20'} - '@tailwindcss/typography@0.5.19': - resolution: {integrity: sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg==} - peerDependencies: - tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1' - - '@tailwindcss/vite@4.2.2': - resolution: {integrity: sha512-mEiF5HO1QqCLXoNEfXVA1Tzo+cYsrqV7w9Juj2wdUFyW07JRenqMG225MvPwr3ZD9N1bFQj46X7r33iHxLUW0w==} - peerDependencies: - vite: ^5.2.0 || ^6 || ^7 || ^8 + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} - '@types/debug@4.1.12': - resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} - '@types/estree-jsx@1.0.5': - resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + '@types/dom-navigation@1.0.7': + resolution: {integrity: sha512-Di4W+i2faYquHUnyWUg3bBQp5pTNvjDDA7mIYfD/1WlLgan6sKkeVjGbdL78K0CuNEk5Pfc/c0rfelwkz10mnQ==} + + '@types/esrecurse@4.3.1': + resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - '@types/hast@3.0.4': - resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/node@25.6.0': + resolution: {integrity: sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==} + + '@typescript-eslint/project-service@8.59.1': + resolution: {integrity: sha512-+MuHQlHiEr00Of/IQbE/MmEoi44znZHbR/Pz7Opq4HryUOlRi+/44dro9Ycy8Fyo+/024IWtw8m4JUMCGTYxDg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/scope-manager@8.59.1': + resolution: {integrity: sha512-LwuHQI4pDOYVKvmH2dkaJo6YZCSgouVgnS/z7yBPKBMvgtBvyLqiLy9Z6b7+m/TRcX1NFYUqZetI5Y+aT4GEfg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.59.1': + resolution: {integrity: sha512-/0nEyPbX7gRsk0Uwfe4ALwwgxuA66d/l2mhRDNlAvaj4U3juhUtJNq0DsY8M2AYwwb9rEq2hrC3IcIcEt++iJA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/types@8.59.1': + resolution: {integrity: sha512-ZDCjgccSdYPw5Bxh+my4Z0lJU96ZDN7jbBzvmEn0FZx3RtU1C7VWl6NbDx94bwY3V5YsgwRzJPOgeY2Q/nLG8A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.59.1': + resolution: {integrity: sha512-OUd+vJS05sSkOip+BkZ/2NS8RMxrAAJemsC6vU3kmfLyeaJT0TftHkV9mcx2107MmsBVXXexhVu4F0TZXyMl4g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/utils@8.59.1': + resolution: {integrity: sha512-3pIeoXhCeYH9FSCBI8P3iNwJlGuzPlYKkTlen2O9T1DSeeg8UG8jstq6BLk+Mda0qup7mgk4z4XL4OzRaxZ8LA==} + 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' - '@types/mdast@4.0.4': - resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + '@typescript-eslint/visitor-keys@8.59.1': + resolution: {integrity: sha512-LdDNl6C5iJExcM0Yh0PwAIBb9PrSiCsWamF/JyEZawm3kFDnRoaq3LGE4bpyRao/fWeGKKyw7icx0YxrLFC5Cg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@types/mdx@2.0.13': - resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} + '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260501.1': + resolution: {integrity: sha512-OIYsqKouI2U7W5Q6VgUz7+t9FpIXNFk30xSUG7gGlN1bdDniWfW7t5n6mzEtiHUVTxRgJQBjXGAlhVa6A9h+pg==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [darwin] - '@types/ms@2.1.0': - resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + '@typescript/native-preview-darwin-x64@7.0.0-dev.20260501.1': + resolution: {integrity: sha512-hQ5UsEyOz3ErQE3sKKHMCfJJGQenD0DSCi2ob+ywElXirG2NyFNA8cmx1g+MIm1lpQeEQslWZhe9EGwo9DJAbg==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [darwin] - '@types/nlcst@2.0.3': - resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==} + '@typescript/native-preview-linux-arm64@7.0.0-dev.20260501.1': + resolution: {integrity: sha512-fbaFKE1UvtsQ6i1eJjBiNbglR9ywXrW/CH1sqYPEtr0WgTUpixbE6inQOXjB0jlEA9RzQq+QMzDyaCDmU82Dkw==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [linux] - '@types/node@24.12.0': - resolution: {integrity: sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ==} + '@typescript/native-preview-linux-arm@7.0.0-dev.20260501.1': + resolution: {integrity: sha512-agkTW/t85XSJKWGcXdUV9ZmSi3Akh3POK+HhWehigEJR3W/jebiO9njifETfoUF6cpoYkFn+CZvfAJ00IWGZfA==} + engines: {node: '>=16.20.0'} + cpu: [arm] + os: [linux] - '@types/sax@1.2.7': - resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} + '@typescript/native-preview-linux-x64@7.0.0-dev.20260501.1': + resolution: {integrity: sha512-Sd8D+S88P7K0IH1U+a8pK20ZD+GM54t48/GLw9ebSklfCdt0iKdHgprjKIcl54C3SocGCcvEBPr1thwtTO9Vtg==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [linux] - '@types/unist@2.0.11': - resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + '@typescript/native-preview-win32-arm64@7.0.0-dev.20260501.1': + resolution: {integrity: sha512-07sJNDnU7KHfo/trv/cBXpgFBELDYJAsTx5kNvBckSQUxbX+p/b9oQ3eFbtK3zDP4EEKdeiD9EelIy22atBnzA==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [win32] - '@types/unist@3.0.3': - resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + '@typescript/native-preview-win32-x64@7.0.0-dev.20260501.1': + resolution: {integrity: sha512-8rzd/eQZyBuR+IRiPnIQrCwSuXIGBFiL8LsUMFqQt2WAUlQ0gGWBlLJHUVU4YNlju9QROjNHUGpJ52XGZbFv0Q==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [win32] - '@ungap/structured-clone@1.3.0': - resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + '@typescript/native-preview@7.0.0-dev.20260501.1': + resolution: {integrity: sha512-skD0ig8IzPwSY1L8VmNgfaxkfT8ImBwKeIypfZyJA+zHzWvroRKbRbT2GryOSREl22ZqLOuDfcq+7BdA0rjF2Q==} + engines: {node: '>=16.20.0'} + hasBin: true - '@voidzero-dev/vite-plus-core@0.1.12': - resolution: {integrity: sha512-j8YNe7A+8JcSoddztf5whvom/yJ7OKUO3Y5a3UoLIUmOL8YEKVv5nPANrxJ7eaFfHJoMnBEwzBpq1YVZ+H3uPA==} + '@voidzero-dev/vite-plus-core@0.1.20': + resolution: {integrity: sha512-4KmzRfzwTeG3JuvDijrdqWusSgRvLMKDPrVsDdtbDVVjEMq0VnM8lSH+Nvepd6Pg+SuSVUP212OIfH/3Yn1bfA==} engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: '@arethetypeswrong/core': ^0.18.1 - '@tsdown/css': 0.21.3 - '@tsdown/exe': 0.21.3 + '@tsdown/css': 0.21.10 + '@tsdown/exe': 0.21.10 '@types/node': ^20.19.0 || >=22.12.0 - '@vitejs/devtools': ^0.0.0-alpha.31 - esbuild: ^0.27.0 + '@vitejs/devtools': ^0.1.0 + esbuild: ^0.27.0 || ^0.28.0 jiti: '>=1.21.0' less: ^4.0.0 publint: ^0.3.0 @@ -1222,7 +1847,7 @@ packages: sugarss: ^5.0.0 terser: ^5.16.0 tsx: ^4.8.1 - typescript: ^5.0.0 + typescript: ^5.0.0 || ^6.0.0 unplugin-unused: ^0.5.0 yaml: ^2.4.2 peerDependenciesMeta: @@ -1263,43 +1888,59 @@ packages: yaml: optional: true - '@voidzero-dev/vite-plus-darwin-arm64@0.1.12': - resolution: {integrity: sha512-tYQrfmcLxIqqr/de00oN7ayu+rYobEOjyR9AxoeJoNUqRyNQCdT0A5vg78kJNPaQCyL6ctgRRvpEKr0WHVmduQ==} + '@voidzero-dev/vite-plus-darwin-arm64@0.1.20': + resolution: {integrity: sha512-ykCOJk91h0IEMvljYGTauI4Svxr/CatZAitofvtEFqaTCLE3n06QCHD8qWphMM784VnPz1G/J2xuewxbQduNlg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@voidzero-dev/vite-plus-darwin-x64@0.1.12': - resolution: {integrity: sha512-852hO/Onx9Z5u0tOYOVEUVzYJUmWdlHeqYnNT6pj0IClgVp0+KSabxr7A2paTWEFWp6XbKWvqw5Y5cVwUV3A6Q==} + '@voidzero-dev/vite-plus-darwin-x64@0.1.20': + resolution: {integrity: sha512-5XxNW9cYEh85Z4BErALyWh/tLP/NZmxNXzUQ0FanhHreI2Zq7FfgbSqQNvC7/sYsPYTWf74RlxmIjzV7R/Lb5Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@voidzero-dev/vite-plus-linux-arm64-gnu@0.1.12': - resolution: {integrity: sha512-/gTh4tGyJKCNBn9SZUs3sq9QVRUmyuyseZefBgS223QRxdwFaxc7tIKaw91X59WXXYOzUYZOD5zsTcaIF4hc9A==} + '@voidzero-dev/vite-plus-linux-arm64-gnu@0.1.20': + resolution: {integrity: sha512-Mc7npPBd9t/h0haURVCZGae+TfB0Yx2Ex8HbPKOVA4hnN9ynlMhMpLRFfTQAicDKYbEGDhfBcbCIX0vVv4vacA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@voidzero-dev/vite-plus-linux-x64-gnu@0.1.12': - resolution: {integrity: sha512-9oN9ITjK/Xq9Werx+6G6jnI3+F1S3g9lB36J1VAHyRlAEtuiCDV0E3YMoW2O7KzM/PlodZIZ8LStVkH7aA5ZCw==} + '@voidzero-dev/vite-plus-linux-arm64-musl@0.1.20': + resolution: {integrity: sha512-Oh/pxMdTLR/wsDl/OONjItjLOeTewFBLuKkH5RQmcI9g3AVqKzLj1/uawujgysBI5E25tonRRK7I2q/zu8Uqvg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@voidzero-dev/vite-plus-linux-x64-gnu@0.1.20': + resolution: {integrity: sha512-msO1ZoUX5aSK8L6kN1C3XQO4CcH9aFsNPRSNcO1cjk1kTnaLyVYzkVxgvbh3vk7nzZAAMkmyZ4SlMpqJrdahrg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@voidzero-dev/vite-plus-test@0.1.12': - resolution: {integrity: sha512-EE8Y2vQvqS4c/1qSa7qlhUY9koAG6wYev0NFAtDZsijQCHUqE7nYXGJYnyUInAE6GX4zlQDGg7tf2DAl+CISYw==} + '@voidzero-dev/vite-plus-linux-x64-musl@0.1.20': + resolution: {integrity: sha512-U93urREvg23ZFDkxKkkfWWIOI4GI9erhbWAZpXG+GeYqygWKrVC6PUTXiuexVg3/CFg2sSMTdm1W6V7TFG5hYA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@voidzero-dev/vite-plus-test@0.1.20': + resolution: {integrity: sha512-vy2dJYw1bhgQ/+BrQrfwPlSKzQ2mm3YLJ9kGF7Yo0UJ2P3XKpshtgFIWLjSg/IASnC93OAx0c/7j3NM0I1RMuA==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: '@edge-runtime/vm': '*' '@opentelemetry/api': ^1.9.0 '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/ui': 4.1.0 + '@vitest/coverage-istanbul': 4.1.5 + '@vitest/coverage-v8': 4.1.5 + '@vitest/ui': 4.1.5 happy-dom: '*' jsdom: '*' - vite: ^6.0.0 || ^7.0.0 || ^8.0.0-0 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: '@edge-runtime/vm': optional: true @@ -1307,6 +1948,10 @@ packages: optional: true '@types/node': optional: true + '@vitest/coverage-istanbul': + optional: true + '@vitest/coverage-v8': + optional: true '@vitest/ui': optional: true happy-dom: @@ -1314,44 +1959,18 @@ packages: jsdom: optional: true - '@voidzero-dev/vite-plus-win32-arm64-msvc@0.1.12': - resolution: {integrity: sha512-JanAb6Y+6BmPhKNLvpZB/syeyY99bt7EPJCaLlbaCt3V0Y2Iw7c7dWBM4Sg4GZ7szGYdGw385fRz0n2M32f1rg==} + '@voidzero-dev/vite-plus-win32-arm64-msvc@0.1.20': + resolution: {integrity: sha512-deXfe3h2OpzKV88s1PMUgVOJfN9LlnDDpIEVH6y2+YAXwlTSO7YeKBj2QmyS6ALZCI4Rfp4HOsB0OKMVBfEqww==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@voidzero-dev/vite-plus-win32-x64-msvc@0.1.12': - resolution: {integrity: sha512-Ei/UtTTp7UgeEGyV83jhDpSMXhwaZZzfS7Xiaj+zj80GGOwsBre0i+oHGZ7+TuVsZ7Im0sD8IZ9enCpKpV//AQ==} + '@voidzero-dev/vite-plus-win32-x64-msvc@0.1.20': + resolution: {integrity: sha512-ygdgQgo0N9oUI1Q2IdYBcvr+KLY6riaqLY/bkWNYtvHS4uk8a4GuEd0F08znWt2E8sFm29i35bYIzI6fFY2EBg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@volar/kit@2.4.28': - resolution: {integrity: sha512-cKX4vK9dtZvDRaAzeoUdaAJEew6IdxHNCRrdp5Kvcl6zZOqb6jTOfk3kXkIkG3T7oTFXguEMt5+9ptyqYR84Pg==} - peerDependencies: - typescript: '*' - - '@volar/language-core@2.4.28': - resolution: {integrity: sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==} - - '@volar/language-server@2.4.28': - resolution: {integrity: sha512-NqcLnE5gERKuS4PUFwlhMxf6vqYo7hXtbMFbViXcbVkbZ905AIVWhnSo0ZNBC2V127H1/2zP7RvVOVnyITFfBw==} - - '@volar/language-service@2.4.28': - resolution: {integrity: sha512-Rh/wYCZJrI5vCwMk9xyw/Z+MsWxlJY1rmMZPsxUoJKfzIRjS/NF1NmnuEcrMbEVGja00aVpCsInJfixQTMdvLw==} - - '@volar/source-map@2.4.28': - resolution: {integrity: sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==} - - '@volar/typescript@2.4.28': - resolution: {integrity: sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==} - - '@vscode/emmet-helper@2.11.0': - resolution: {integrity: sha512-QLxjQR3imPZPQltfbWRnHU6JecWTF1QSWhx3GAKQpslx7y3Dp6sIIXhKjiUJ/BR9FX8PVthjr9PD6pNwOJfAzw==} - - '@vscode/l10n@0.0.18': - resolution: {integrity: sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==} - acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -1362,191 +1981,52 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - ajv-draft-04@1.0.0: - resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} - peerDependencies: - ajv: ^8.5.0 - peerDependenciesMeta: - ajv: - optional: true - - ajv@8.18.0: - resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} - - ansi-escapes@5.0.0: - resolution: {integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==} - engines: {node: '>=12'} - - ansi-escapes@7.3.0: - resolution: {integrity: sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==} - engines: {node: '>=18'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-regex@6.2.2: - resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} - engines: {node: '>=12'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} + ajv@6.15.0: + resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} ansi-styles@6.2.3: resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - arg@5.0.2: - resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - aria-query@5.3.2: - resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} - engines: {node: '>= 0.4'} - - array-iterate@2.0.1: - resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==} - assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} - astring@1.9.0: - resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} - hasBin: true - - astro@6.0.6: - resolution: {integrity: sha512-Fg25tok0RF+ToCcfdfNdtkv7MutTfbE0Lc4UhZpQyoc8/iiTdAaNw1nHPxPD6Nfa/ql3lGAp9uOWaTTnnFY2Zg==} - engines: {node: '>=22.12.0', npm: '>=9.6.5', pnpm: '>=7.1.0'} - hasBin: true - - axobject-query@4.1.0: - resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} - engines: {node: '>= 0.4'} - - bail@2.0.2: - resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} - - boolbase@1.0.0: - resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - - cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} - - ccount@2.0.1: - resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - - chalk@5.6.2: - resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + aws4fetch@1.0.20: + resolution: {integrity: sha512-/djoAN709iY65ETD6LKCtyyEI04XIBP5xVvfmNxsEP0uJB5tyaGBztSryRr4HqMStr9R06PisQE7m9zDTXKu6g==} - character-entities-html4@2.1.0: - resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} - character-entities-legacy@3.0.0: - resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} - - character-entities@2.0.2: - resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + baseline-browser-mapping@2.10.25: + resolution: {integrity: sha512-QO/VHsXCQdnzADMfmkeOPvHdIAkoB7i0/rGjINPJEetLx75hNttVWGQ/jycHUDP9zZ9rupbm60WRxcwViB0MiA==} + engines: {node: '>=6.0.0'} + hasBin: true - character-reference-invalid@2.0.1: - resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + brace-expansion@5.0.5: + resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} + engines: {node: 18 || 20 || >=22} - chart.js@4.5.1: - resolution: {integrity: sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw==} - engines: {pnpm: '>=8'} + browserslist@4.28.2: + resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true - chokidar@4.0.3: - resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} - engines: {node: '>= 14.16.0'} + caniuse-lite@1.0.30001791: + resolution: {integrity: sha512-yk0l/YSrOnFZk3UROpDLQD9+kC1l4meK/wed583AXrzoarMGJcbRi2Q4RaUYbKxYAsZ8sWmaSa/DsLmdBeI1vQ==} chokidar@5.0.0: resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} engines: {node: '>= 20.19.0'} - ci-info@4.4.0: - resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} - engines: {node: '>=8'} - - cli-cursor@4.0.0: - resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - 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'} - - collapse-white-space@2.1.0: - resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - comma-separated-tokens@2.0.3: - resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} - - commander@11.1.0: - resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} - engines: {node: '>=16'} - - common-ancestor-path@2.0.0: - resolution: {integrity: sha512-dnN3ibLeoRf2HNC+OlCiNc5d2zxbLJXOtiZUudNFSXZrNSydxcCsSpRzXwfu7BBWCIfHPw+xTayeBvJCP/D8Ng==} - engines: {node: '>= 18'} - - cookie-es@1.2.2: - resolution: {integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==} - - cookie@1.1.1: - resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} - engines: {node: '>=18'} + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} - crossws@0.3.5: - resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} - - css-select@5.2.2: - resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} - - css-tree@2.2.1: - resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} - - 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-what@6.2.2: - resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} - engines: {node: '>= 6'} - - cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} - hasBin: true - - csso@5.0.5: - resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} - debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} @@ -1556,95 +2036,28 @@ packages: supports-color: optional: true - decode-named-character-reference@1.3.0: - resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} - - defu@6.1.4: - resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} - - dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} - - destr@2.0.5: - resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} detect-libc@2.1.2: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} - devalue@5.6.4: - resolution: {integrity: sha512-Gp6rDldRsFh/7XuouDbxMH3Mx8GMCcgzIb1pDTvNyn8pZGQ22u+Wa+lGV9dQCltFQ7uVw0MhRyb8XDskNFOReA==} - - devlop@1.1.0: - resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - - diff@8.0.3: - resolution: {integrity: sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==} - engines: {node: '>=0.3.1'} - - dlv@1.1.3: - resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} - - dom-serializer@2.0.0: - resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} - - domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - - domhandler@5.0.3: - resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} - engines: {node: '>= 4'} - - domutils@3.2.2: - resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} - - dset@3.1.4: - resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} - engines: {node: '>=4'} - - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - - emmet@2.4.11: - resolution: {integrity: sha512-23QPJB3moh/U9sT4rQzGgeyyGIrcM+GH5uVYg2C6wZIxAIJq7Ng3QLT79tl8FUwDXhyq9SusfknOrofAKqvgyQ==} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + electron-to-chromium@1.5.348: + resolution: {integrity: sha512-QC2X59nRlycQQMc4ZXjSVBX+tSgJfgRtcrYHbIZLgOV2dCvefoQGegLR7lLXKgpPpSuVmJU19LMzGrSa2C7k3Q==} - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - - enhanced-resolve@5.20.1: - resolution: {integrity: sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==} + enhanced-resolve@5.21.0: + resolution: {integrity: sha512-otxSQPw4lkOZWkHpB3zaEQs6gWYEsmX4xQF68ElXC/TWvGxGMSGOvoNbaLXm6/cS/fSfHtsEdw90y20PCd+sCA==} engines: {node: '>=10.13.0'} - entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - - entities@6.0.1: - resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} - engines: {node: '>=0.12'} - - environment@1.1.0: - resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} - engines: {node: '>=18'} - es-module-lexer@1.7.0: resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} - es-module-lexer@2.0.0: - resolution: {integrity: sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==} - - esast-util-from-estree@2.0.0: - resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==} + es-module-lexer@2.1.0: + resolution: {integrity: sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==} - esast-util-from-js@2.0.1: - resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==} - - esbuild@0.27.4: - resolution: {integrity: sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==} + esbuild@0.27.7: + resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} engines: {node: '>=18'} hasBin: true @@ -1652,52 +2065,85 @@ packages: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} - escape-string-regexp@5.0.0: - resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} - engines: {node: '>=12'} + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-plugin-no-only-tests@3.4.0: + resolution: {integrity: sha512-4S3/9Nb7A2tiMcpzEQE9bQSlpeOz6WJkgryBuou/SA8W2x2c8Zf4j0NvTKBjv6qNhF9T79tmkecm/0CHqV0UGg==} + engines: {node: '>=5.0.0'} + + eslint-plugin-perfectionist@5.9.0: + resolution: {integrity: sha512-8TWzg02zmnBdZwCkWLi8jhzqXI+fE7Z/RwV8SL6xD45tJ8Bp3wGuYL2XtQgfe/Wd0eBqOUX+s6ey73IyszvKTA==} + engines: {node: ^20.0.0 || >=22.0.0} + peerDependencies: + eslint: ^8.45.0 || ^9.0.0 || ^10.0.0 + + 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 || ^9.0.0 || ^10.0.0 - estree-util-attach-comments@3.0.0: - resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} + eslint-plugin-unused-imports@4.4.1: + resolution: {integrity: sha512-oZGYUz1X3sRMGUB+0cZyK2VcvRX5lm/vB56PgNNcU+7ficUCKm66oZWKUubXWnOuPjQ8PvmXtCViXBMONPe7tQ==} + peerDependencies: + '@typescript-eslint/eslint-plugin': ^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0 + eslint: ^10.0.0 || ^9.0.0 || ^8.0.0 + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true - estree-util-build-jsx@3.0.1: - resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==} + eslint-scope@9.1.2: + resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - estree-util-is-identifier-name@3.0.0: - resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + 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} - estree-util-scope@1.0.0: - resolution: {integrity: sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==} + eslint-visitor-keys@5.0.1: + resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - estree-util-to-js@2.0.0: - resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} + eslint@10.3.0: + resolution: {integrity: sha512-XbEXaRva5cF0ZQB8w6MluHA0kZZfV2DuCMJ3ozyEOHLwDpZX2Lmm/7Pp0xdJmI0GL1W05VH5VwIFHEm1Vcw2gw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true - estree-util-visit@2.0.0: - resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} + espree@11.2.0: + resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - estree-walker@2.0.2: - resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} + engines: {node: '>=0.10'} - estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} - eventemitter3@5.0.4: - resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} - extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fast-uri@3.1.0: - resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} - - fast-xml-builder@1.1.4: - resolution: {integrity: sha512-f2jhpN4Eccy0/Uz9csxh3Nu6q4ErKxf0XIsasomfOihuSUa3/xw6w8dnOtCDgEItQFJG8KyXPzQXzcODDrrbOg==} + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - fast-xml-parser@5.4.1: - resolution: {integrity: sha512-BQ30U1mKkvXQXXkAGcuyUA/GA26oEB7NzOtsxCDtyu62sjGw5QraKFhx2Em3WQNjPw9PG6MQ9yuIIgkSDfGu5A==} - hasBin: true + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} @@ -1708,151 +2154,124 @@ packages: picomatch: optional: true - flattie@1.1.1: - resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==} - engines: {node: '>=8'} + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} - fontace@0.4.1: - resolution: {integrity: sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw==} + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} - fontkitten@1.0.3: - resolution: {integrity: sha512-Wp1zXWPVUPBmfoa3Cqc9ctaKuzKAV6uLstRqlR56kSjplf5uAce+qeyYym7F+PHbGTk+tCEdkCW6RD7DX/gBZw==} - engines: {node: '>=20'} + flatted@3.4.2: + resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-tsconfig@4.14.0: + resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} - github-slugger@2.0.0: - resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - h3@1.15.8: - resolution: {integrity: sha512-iOH6Vl8mGd9nNfu9C0IZ+GuOAfJHcyf3VriQxWaSWIB76Fg4BnFuk4cxBxjmQSSxJS664+pgjP6e7VBnUzFfcg==} - - has-flag@5.0.1: - resolution: {integrity: sha512-CsNUt5x9LUdx6hnk/E2SZLsDyvfqANZSUq4+D3D8RzDJ2M+HDTIkF60ibS1vHaK55vzgiZw1bEPFG9yH7l33wA==} - engines: {node: '>=12'} - - hast-util-from-html@2.0.3: - resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} - - hast-util-from-parse5@8.0.3: - resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} - - hast-util-is-element@3.0.0: - resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} - - hast-util-parse-selector@4.0.0: - resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} - - hast-util-raw@9.1.0: - resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==} - - hast-util-to-estree@3.1.3: - resolution: {integrity: sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==} - - hast-util-to-html@9.0.5: - resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} - - hast-util-to-jsx-runtime@2.3.6: - resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==} - - hast-util-to-parse5@8.0.1: - resolution: {integrity: sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==} - - hast-util-to-text@4.0.2: - resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} - hast-util-whitespace@3.0.0: - resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + hermes-estree@0.25.1: + resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} - hastscript@9.0.1: - resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} + hermes-parser@0.25.1: + resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} - html-escaper@3.0.3: - resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==} + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - html-void-elements@3.0.0: - resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} - http-cache-semantics@4.2.0: - resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} - inline-style-parser@0.2.7: - resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==} + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} - iron-webcrypto@1.2.1: - resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} - is-alphabetical@2.0.1: - resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - is-alphanumerical@2.0.1: - resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + isexe@3.1.5: + resolution: {integrity: sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==} + engines: {node: '>=18'} - is-decimal@2.0.1: - resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} - is-docker@3.0.0: - resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - hasBin: true + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + istanbul-reports@3.2.0: + resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} engines: {node: '>=8'} - is-fullwidth-code-point@4.0.0: - resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} - engines: {node: '>=12'} + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + hasBin: true - is-hexadecimal@2.0.1: - resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - is-inside-container@1.0.0: - resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} - engines: {node: '>=14.16'} + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} hasBin: true - is-plain-obj@4.1.0: - resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} - engines: {node: '>=12'} + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - is-wsl@3.1.1: - resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} - engines: {node: '>=16'} + json-parse-even-better-errors@4.0.0: + resolution: {integrity: sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==} + engines: {node: ^18.17.0 || >=20.5.0} - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - jiti@2.6.1: - resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} - hasBin: true + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - js-yaml@4.1.1: - resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} hasBin: true - json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - - jsonc-parser@2.3.1: - resolution: {integrity: sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==} - - jsonc-parser@3.3.1: - resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} lightningcss-android-arm64@1.32.0: resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} @@ -1928,195 +2347,31 @@ packages: resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} engines: {node: '>= 12.0.0'} - log-update@5.0.1: - resolution: {integrity: sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - longest-streak@3.1.0: - resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} - lru-cache@11.2.7: - resolution: {integrity: sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==} - engines: {node: 20 || >=22} + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} - magicast@0.5.2: - resolution: {integrity: sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==} - - markdown-extensions@2.0.0: - resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} - engines: {node: '>=16'} - - markdown-table@3.0.4: - resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} - - mdast-util-definitions@6.0.0: - resolution: {integrity: sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==} - - mdast-util-find-and-replace@3.0.2: - resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} - - mdast-util-from-markdown@2.0.3: - resolution: {integrity: sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==} - - mdast-util-gfm-autolink-literal@2.0.1: - resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} - - mdast-util-gfm-footnote@2.1.0: - resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} - - mdast-util-gfm-strikethrough@2.0.0: - resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} - - mdast-util-gfm-table@2.0.0: - resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} - - mdast-util-gfm-task-list-item@2.0.0: - resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} - - mdast-util-gfm@3.1.0: - resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} - - mdast-util-mdx-expression@2.0.1: - resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} - - mdast-util-mdx-jsx@3.2.0: - resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==} - - mdast-util-mdx@3.0.0: - resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} - - mdast-util-mdxjs-esm@2.0.1: - resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} - - mdast-util-phrasing@4.1.0: - resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} - - mdast-util-to-hast@13.2.1: - resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} - - mdast-util-to-markdown@2.1.2: - resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} - - mdast-util-to-string@4.0.0: - resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} - - mdn-data@2.0.28: - resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} - - mdn-data@2.27.1: - resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} - - micromark-core-commonmark@2.0.3: - resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} - - micromark-extension-gfm-autolink-literal@2.1.0: - resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} - - micromark-extension-gfm-footnote@2.1.0: - resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} - - micromark-extension-gfm-strikethrough@2.1.0: - resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} - - micromark-extension-gfm-table@2.1.1: - resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} - - micromark-extension-gfm-tagfilter@2.0.0: - resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} - - micromark-extension-gfm-task-list-item@2.1.0: - resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} - - micromark-extension-gfm@3.0.0: - resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} - - micromark-extension-mdx-expression@3.0.1: - resolution: {integrity: sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==} - - micromark-extension-mdx-jsx@3.0.2: - resolution: {integrity: sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==} - - micromark-extension-mdx-md@2.0.0: - resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} - - micromark-extension-mdxjs-esm@3.0.0: - resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==} - - micromark-extension-mdxjs@3.0.0: - resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} - - micromark-factory-destination@2.0.1: - resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} - - micromark-factory-label@2.0.1: - resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} - - micromark-factory-mdx-expression@2.0.3: - resolution: {integrity: sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==} - - micromark-factory-space@2.0.1: - resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} - - micromark-factory-title@2.0.1: - resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} - - micromark-factory-whitespace@2.0.1: - resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} - - micromark-util-character@2.1.1: - resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} - - micromark-util-chunked@2.0.1: - resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} - - micromark-util-classify-character@2.0.1: - resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} - - micromark-util-combine-extensions@2.0.1: - resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} - - micromark-util-decode-numeric-character-reference@2.0.2: - resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} - - micromark-util-decode-string@2.0.1: - resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} - - micromark-util-encode@2.0.1: - resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} - - micromark-util-events-to-acorn@2.0.3: - resolution: {integrity: sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==} - - micromark-util-html-tag-name@2.0.1: - resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} - - micromark-util-normalize-identifier@2.0.1: - resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} - - micromark-util-resolve-all@2.0.1: - resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} - - micromark-util-sanitize-uri@2.0.1: - resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} - - micromark-util-subtokenize@2.1.0: - resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} - - micromark-util-symbol@2.0.1: - resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} - micromark-util-types@2.0.2: - resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + memorystream@0.3.1: + resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} + engines: {node: '>= 0.10.0'} - micromark@4.0.2: - resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + engines: {node: 18 || 20 || >=22} - mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} mrmime@2.0.1: resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} @@ -2125,275 +2380,176 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - muggle-string@0.4.1: - resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} - - nanoid@3.3.11: - resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + nanoid@3.3.12: + resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - neotraverse@0.6.18: - resolution: {integrity: sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==} - engines: {node: '>= 10'} + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - nlcst-to-string@4.0.0: - resolution: {integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==} + natural-orderby@5.0.0: + resolution: {integrity: sha512-kKHJhxwpR/Okycz4HhQKKlhWe4ASEfPgkSWNmKFHd7+ezuQlxkA5cM3+XkBPvm1gmHen3w53qsYAv+8GwRrBlg==} + engines: {node: '>=18'} - node-fetch-native@1.6.7: - resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} - node-mock-http@1.0.4: - resolution: {integrity: sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==} + node-releases@2.0.38: + resolution: {integrity: sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==} - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} + npm-normalize-package-bin@4.0.0: + resolution: {integrity: sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==} + engines: {node: ^18.17.0 || >=20.5.0} - nth-check@2.1.1: - resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + npm-run-all2@8.0.4: + resolution: {integrity: sha512-wdbB5My48XKp2ZfJUlhnLVihzeuA1hgBnqB2J9ahV77wLS+/YAJAlN8I+X3DIFIPZ3m5L7nplmlbhNiFDmXRDA==} + engines: {node: ^20.5.0 || >=22.0.0, npm: '>= 10'} + hasBin: true obug@2.1.1: resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} - ofetch@1.5.1: - resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==} + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} - ohash@2.0.11: - resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} + oxc-minify@0.121.0: + resolution: {integrity: sha512-XziD0au8etayM2zJnqcSiW+Pn3hEpqHsbwfL7G4Ej0SwqfvbIjiEF1/uNqONuHl0n9LkLI1ez378vSWZRJZWAQ==} + engines: {node: ^20.19.0 || >=22.12.0} - onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} + oxc-parser@0.121.0: + resolution: {integrity: sha512-ek9o58+SCv6AV7nchiAcUJy1DNE2CC5WRdBcO0mF+W4oRjNQfPO7b3pLjTHSFECpHkKGOZSQxx3hk8viIL5YCg==} + engines: {node: ^20.19.0 || >=22.12.0} - oniguruma-parser@0.12.1: - resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==} + oxc-resolver@11.19.1: + resolution: {integrity: sha512-qE/CIg/spwrTBFt5aKmwe3ifeDdLfA2NESN30E42X/lII5ClF8V7Wt6WIJhcGZjp0/Q+nQ+9vgxGk//xZNX2hg==} - oniguruma-to-es@4.3.5: - resolution: {integrity: sha512-Zjygswjpsewa0NLTsiizVuMQZbp0MDyM6lIt66OxsF21npUDlzpHi1Mgb/qhQdkb+dWFTzJmFbEWdvZgRho8eQ==} + oxc-transform@0.121.0: + resolution: {integrity: sha512-Kf243wJU/vWF/ThV+ZyfLMQIrViVFRSyYO7UPKpZMMPGGMzxxcHgsNGWy0Uy+pcXD78+jdUnxVTR9rYT73Qw3A==} + engines: {node: ^20.19.0 || >=22.12.0} - oxfmt@0.40.0: - resolution: {integrity: sha512-g0C3I7xUj4b4DcagevM9kgH6+pUHytikxUcn3/VUkvzTNaaXBeyZqb7IBsHwojeXm4mTBEC/aBjBTMVUkZwWUQ==} + oxfmt@0.46.0: + resolution: {integrity: sha512-CopwJOwPAjZ9p76fCvz+mSOJTw9/NY3cSksZK3VO/bUQ8UoEcketNgUuYS0UB3p+R9XnXe7wGGXUmyFxc7QxJA==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - oxlint-tsgolint@0.17.0: - resolution: {integrity: sha512-TdrKhDZCgEYqONFo/j+KvGan7/k3tP5Ouz88wCqpOvJtI2QmcLfGsm1fcMvDnTik48Jj6z83IJBqlkmK9DnY1A==} + oxlint-tsgolint@0.22.0: + resolution: {integrity: sha512-ku4MecLmCQIj1ScCtzNAqTuyl0BJQ02B36fJT+c5XQihHpYSFak+FC3GYO5fPyYk4oDwi0w0S7hTvrpNzuZhig==} hasBin: true - oxlint@1.55.0: - resolution: {integrity: sha512-T+FjepiyWpaZMhekqRpH8Z3I4vNM610p6w+Vjfqgj5TZUxHXl7N8N5IPvmOU8U4XdTRxqtNNTh9Y4hLtr7yvFg==} + oxlint@1.61.0: + resolution: {integrity: sha512-ZC0ALuhDZ6ivOFG+sy0D0pEDN49EvsId98zVlmYdkcXHsEM14m/qTNUEsUpiFiCVbpIxYtVBmmLE87nsbUHohQ==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: - oxlint-tsgolint: '>=0.15.0' + oxlint-tsgolint: '>=0.18.0' peerDependenciesMeta: oxlint-tsgolint: optional: true - p-limit@7.3.0: - resolution: {integrity: sha512-7cIXg/Z0M5WZRblrsOla88S4wAK+zOQQWeBYfV3qJuJXMr+LnbYjaadrFaS0JILfEDPVqHyKnZ1Z/1d6J9VVUw==} - engines: {node: '>=20'} - - p-queue@9.1.0: - resolution: {integrity: sha512-O/ZPaXuQV29uSLbxWBGGZO1mCQXV2BLIwUr59JUU9SoH76mnYvtms7aafH/isNSNGwuEfP6W/4xD0/TJXxrizw==} - engines: {node: '>=20'} - - p-timeout@7.0.1: - resolution: {integrity: sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg==} - engines: {node: '>=20'} - - package-manager-detector@1.6.0: - resolution: {integrity: sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==} - - parse-entities@4.0.2: - resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} - - parse-latin@7.0.0: - resolution: {integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==} + oxlint@1.62.0: + resolution: {integrity: sha512-1uFkg6HakjsGIpW9wNdeW4/2LOHW9MEkoWjZUTUfQtIHyLIZPYt00w3Sg+H3lH+206FgBPHBbW5dVE5l2ExECQ==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + oxlint-tsgolint: '>=0.18.0' + peerDependenciesMeta: + oxlint-tsgolint: + optional: true - parse5@7.3.0: - resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} - path-browserify@1.0.1: - resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} - path-expression-matcher@1.1.3: - resolution: {integrity: sha512-qdVgY8KXmVdJZRSS1JdEPOKPdTiEK/pi0RkcT2sw1RhXxohdujUlJFPuS1TSkevZ9vzd3ZlL7ULl1MHGTApKzQ==} - engines: {node: '>=14.0.0'} + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - piccolore@0.1.3: - resolution: {integrity: sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==} - picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - picomatch@4.0.3: - resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} - pixelmatch@7.1.0: - resolution: {integrity: sha512-1wrVzJ2STrpmONHKBy228LM1b84msXDUoAzVEl0R8Mz4Ce6EPr+IVtxm8+yvrqLYMHswREkjYFaMxnyGnaY3Ng==} + pidtree@0.6.0: + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} + hasBin: true + + pixelmatch@7.2.0: + resolution: {integrity: sha512-xhcb4yHu9sM/G7foGzoLtXYcC0zHEaOXXjRKhGup0fw78Nf2Tkiapv4EQyMzrbcmQPsllAI7DbFY2UT7PlI9Pg==} hasBin: true pngjs@7.0.0: resolution: {integrity: sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==} engines: {node: '>=14.19.0'} - postcss-selector-parser@6.0.10: - resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} - engines: {node: '>=4'} - - postcss@8.5.8: - resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==} + postcss@8.5.13: + resolution: {integrity: sha512-qif0+jGGZoLWdHey3UFHHWP0H7Gbmsk8T5VEqyYFbWqPr1XqvLGBbk/sl8V5exGmcYJklJOhOQq1pV9IcsiFag==} engines: {node: ^10 || ^12 || >=14} - prettier-plugin-astro@0.14.1: - resolution: {integrity: sha512-RiBETaaP9veVstE4vUwSIcdATj6dKmXljouXc/DDNwBSPTp8FRkLGDSGFClKsAFeeg+13SB0Z1JZvbD76bigJw==} - engines: {node: ^14.15.0 || >=16.0.0} - - prettier@3.8.1: - resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==} - engines: {node: '>=14'} - hasBin: true + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} - prismjs@1.30.0: - resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - property-information@7.1.0: - resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} - - radix3@1.1.2: - resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} - - readdirp@4.1.2: - resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} - engines: {node: '>= 14.18.0'} + read-package-json-fast@4.0.0: + resolution: {integrity: sha512-qpt8EwugBWDw2cgE2W+/3oxC+KTez2uSVR8JU9Q36TXPAGCaozfQUs59v4j4GFpWTaw0i6hAZSvOmu1J0uOEUg==} + engines: {node: ^18.17.0 || >=20.5.0} readdirp@5.0.0: resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} engines: {node: '>= 20.19.0'} - recma-build-jsx@1.0.0: - resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==} - - recma-jsx@1.0.1: - resolution: {integrity: sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==} + remix@3.0.0-beta.0: + resolution: {integrity: sha512-puVDlqsID9k1N7p+qb5IOLDeMlQ6WynU9qm2/iJAL+iX+1upgyaVzWeuLxNg761t9/Uh1u1tT/PuaaRTi932Tg==} + engines: {node: '>=24.3.0'} + hasBin: true peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - - recma-parse@1.0.0: - resolution: {integrity: sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==} - - recma-stringify@1.0.0: - resolution: {integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==} - - regex-recursion@6.0.2: - resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} - - regex-utilities@2.3.0: - resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} - - regex@6.1.0: - resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==} - - rehype-parse@9.0.1: - resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==} - - rehype-raw@7.0.0: - resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} - - rehype-recma@1.0.0: - resolution: {integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==} - - rehype-stringify@10.0.1: - resolution: {integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==} - - rehype@13.0.2: - resolution: {integrity: sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==} - - remark-gfm@4.0.1: - resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} - - remark-mdx@3.1.1: - resolution: {integrity: sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==} - - remark-parse@11.0.0: - resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} - - remark-rehype@11.1.2: - resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} - - remark-smartypants@3.0.2: - resolution: {integrity: sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==} - engines: {node: '>=16.0.0'} - - remark-stringify@11.0.0: - resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} - - request-light@0.5.8: - resolution: {integrity: sha512-3Zjgh+8b5fhRJBQZoy+zbVKpAQGLyka0MPgW3zruTF4dFFJ8Fqcfu9YsAvi/rvdcaTeWG3MkbZv4WKxAn/84Lg==} - - request-light@0.7.0: - resolution: {integrity: sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q==} - - 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'} - - restore-cursor@4.0.0: - resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - retext-latin@4.0.0: - resolution: {integrity: sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==} - - retext-smartypants@6.2.0: - resolution: {integrity: sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==} - - retext-stringify@4.0.0: - resolution: {integrity: sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==} + mysql2: ^3.15.3 + pg: ^8.16.3 + playwright: ^1.59.0 + redis: ^5.10.0 + peerDependenciesMeta: + mysql2: + optional: true + pg: + optional: true + playwright: + optional: true + redis: + optional: true - retext@9.0.0: - resolution: {integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==} + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - rollup@4.59.0: - resolution: {integrity: sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} + rolldown@1.0.0-rc.17: + resolution: {integrity: sha512-ZrT53oAKrtA4+YtBWPQbtPOxIbVDbxT0orcYERKd63VJTF13zPcgXTvD4843L8pcsI7M6MErt8QtON6lrB9tyA==} + engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - s.color@0.0.15: - resolution: {integrity: sha512-AUNrbEUHeKY8XsYr/DYpl+qk5+aM+DChopnWOPEzn8YKzOhv4l2zH6LzZms3tOZP3wwdOyc0RmTciyi46HLIuA==} - - sass-formatter@0.7.9: - resolution: {integrity: sha512-CWZ8XiSim+fJVG0cFLStwDvft1VI7uvXdCNJYXhDvowiv+DsbD1nXLiQ4zrE5UBvj5DWZJ93cwN0NX5PMsr1Pw==} - - sax@1.6.0: - resolution: {integrity: sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==} - engines: {node: '>=11.0.0'} + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true semver@7.7.4: resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} engines: {node: '>=10'} hasBin: true - sharp@0.34.5: - resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -2402,124 +2558,41 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shiki@4.0.2: - resolution: {integrity: sha512-eAVKTMedR5ckPo4xne/PjYQYrU3qx78gtJZ+sHlXEg5IHhhoQhMfZVzetTYuaJS0L2Ef3AcCRzCHV8T0WI6nIQ==} - engines: {node: '>=20'} - - signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + shell-quote@1.8.3: + resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} + engines: {node: '>= 0.4'} sirv@3.0.2: resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} engines: {node: '>=18'} - sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - - sitemap@9.0.1: - resolution: {integrity: sha512-S6hzjGJSG3d6if0YoF5kTyeRJvia6FSTBroE5fQ0bu1QNxyJqhhinfUsXi9fH3MgtXODWvwo2BDyQSnhPQ88uQ==} - engines: {node: '>=20.19.5', npm: '>=10.8.2'} - hasBin: true - - slice-ansi@5.0.0: - resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} - engines: {node: '>=12'} - - smol-toml@1.6.0: - resolution: {integrity: sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw==} - engines: {node: '>= 18'} - source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} - source-map@0.7.6: - resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} - engines: {node: '>= 12'} - - space-separated-tokens@2.0.2: - resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - - std-env@4.0.0: - resolution: {integrity: sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ==} - - stream-replace-string@2.0.0: - resolution: {integrity: sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - - stringify-entities@4.0.4: - resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + std-env@4.1.0: + resolution: {integrity: sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==} - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} - strip-ansi@7.2.0: - resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} - engines: {node: '>=12'} - - strnum@2.2.0: - resolution: {integrity: sha512-Y7Bj8XyJxnPAORMZj/xltsfo55uOiyHcU2tnAVzHUnSJR/KsEX+9RoDeXEnsXtl/CX4fAcrt64gZ13aGaWPeBg==} - - style-to-js@1.1.21: - resolution: {integrity: sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==} - - style-to-object@1.0.14: - resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==} - - suf-log@2.5.3: - resolution: {integrity: sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow==} - - supports-color@10.2.2: - resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==} - engines: {node: '>=18'} - - supports-hyperlinks@4.4.0: - resolution: {integrity: sha512-UKbpT93hN5Nr9go5UY7bopIB9YQlMz9nm/ct4IXt/irb5YRkn9WaqrOBJGZ5Pwvsd5FQzSVeYlGdXoCAPQZrPg==} - engines: {node: '>=20'} - - svgo@4.0.1: - resolution: {integrity: sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w==} - engines: {node: '>=16'} - hasBin: true - - tailwind-merge@3.5.0: - resolution: {integrity: sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==} + tailwindcss@4.2.4: + resolution: {integrity: sha512-HhKppgO81FQof5m6TEnuBWCZGgfRAWbaeOaGT00KOy/Pf/j6oUihdvBpA7ltCeAvZpFhW3j0PTclkxsd4IXYDA==} - tailwindcss@4.2.2: - resolution: {integrity: sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q==} - - tapable@2.3.0: - resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} + tapable@2.3.3: + resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} engines: {node: '>=6'} - terminal-link@5.0.0: - resolution: {integrity: sha512-qFAy10MTMwjzjU8U16YS4YoZD+NQLHzLssFMNqgravjbvIPNiqkGFR4yjhJfmY9R5OFU7+yHxc6y+uGHkKwLRA==} - engines: {node: '>=20'} - - tiny-inflate@1.0.3: - resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} - tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - tinyclip@0.1.12: - resolution: {integrity: sha512-Ae3OVUqifDw0wBriIBS7yVaW44Dp6eSHQcyq4Igc7eN2TJH/2YsicswaW+J/OuMvhpDPOKEgpAZCjkb4hpoyeA==} - engines: {node: ^16.14.0 || >= 17.3.0} - - tinyexec@1.0.4: - resolution: {integrity: sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==} + tinyexec@1.1.2: + resolution: {integrity: sha512-dAqSqE/RabpBKI8+h26GfLq6Vb3JVXs30XYQjdMjaj/c2tS8IYYMbIzP599KtRj7c57/wYApb3QjgRgXmrCukA==} engines: {node: '>=18'} - tinyglobby@0.2.15: - resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + tinyglobby@0.2.16: + resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} engines: {node: '>=12.0.0'} tinypool@2.1.0: @@ -2530,176 +2603,64 @@ packages: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} - trim-lines@3.0.1: - resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} - - trough@2.2.0: - resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} - - tsconfck@3.1.6: - resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==} - engines: {node: ^18 || >=20} - hasBin: true + ts-api-utils@2.5.0: + resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} + engines: {node: '>=18.12'} peerDependencies: - typescript: ^5.0.0 - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4' tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - type-fest@1.4.0: - resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} - engines: {node: '>=10'} - - typesafe-path@0.2.2: - resolution: {integrity: sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA==} + tsx@4.21.0: + resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} + engines: {node: '>=18.0.0'} + hasBin: true - typescript-auto-import-cache@0.3.6: - resolution: {integrity: sha512-RpuHXrknHdVdK7wv/8ug3Fr0WNsNi5l5aB8MYYuXhq2UH5lnEB1htJ1smhtD5VeCsGr2p8mUDtd83LCQDFVgjQ==} + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} - typescript@5.9.3: - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} engines: {node: '>=14.17'} hasBin: true - ufo@1.6.3: - resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} - - ultrahtml@1.6.0: - resolution: {integrity: sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==} - - uncrypto@0.1.3: - resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} - - undici-types@7.16.0: - resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} - - unified@11.0.5: - resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} - - unifont@0.7.4: - resolution: {integrity: sha512-oHeis4/xl42HUIeHuNZRGEvxj5AaIKR+bHPNegRq5LV1gdc3jundpONbjglKpihmJf+dswygdMJn3eftGIMemg==} + uWebSockets.js@https://codeload.github.com/uNetworking/uWebSockets.js/tar.gz/a63031f40f76dc2422e8da736c04217053e9db2b: + resolution: {tarball: https://codeload.github.com/uNetworking/uWebSockets.js/tar.gz/a63031f40f76dc2422e8da736c04217053e9db2b} + version: 20.66.0 - unist-util-find-after@5.0.0: - resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} + undici-types@7.19.2: + resolution: {integrity: sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==} - unist-util-is@6.0.1: - resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} - - unist-util-modify-children@4.0.0: - resolution: {integrity: sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==} - - unist-util-position-from-estree@2.0.0: - resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} - - unist-util-position@5.0.0: - resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} - - unist-util-remove-position@5.0.0: - resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} - - unist-util-stringify-position@4.0.0: - resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} - - unist-util-visit-children@3.0.0: - resolution: {integrity: sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==} - - unist-util-visit-parents@6.0.2: - resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} - - unist-util-visit@5.1.0: - resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} - - unstorage@1.17.4: - resolution: {integrity: sha512-fHK0yNg38tBiJKp/Vgsq4j0JEsCmgqH58HAn707S7zGkArbZsVr/CwINoi+nh3h98BRCwKvx1K3Xg9u3VV83sw==} + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + hasBin: true peerDependencies: - '@azure/app-configuration': ^1.8.0 - '@azure/cosmos': ^4.2.0 - '@azure/data-tables': ^13.3.0 - '@azure/identity': ^4.6.0 - '@azure/keyvault-secrets': ^4.9.0 - '@azure/storage-blob': ^12.26.0 - '@capacitor/preferences': ^6 || ^7 || ^8 - '@deno/kv': '>=0.9.0' - '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0 - '@planetscale/database': ^1.19.0 - '@upstash/redis': ^1.34.3 - '@vercel/blob': '>=0.27.1' - '@vercel/functions': ^2.2.12 || ^3.0.0 - '@vercel/kv': ^1 || ^2 || ^3 - aws4fetch: ^1.0.20 - db0: '>=0.2.1' - idb-keyval: ^6.2.1 - ioredis: ^5.4.2 - uploadthing: ^7.4.4 - peerDependenciesMeta: - '@azure/app-configuration': - optional: true - '@azure/cosmos': - optional: true - '@azure/data-tables': - optional: true - '@azure/identity': - optional: true - '@azure/keyvault-secrets': - optional: true - '@azure/storage-blob': - optional: true - '@capacitor/preferences': - optional: true - '@deno/kv': - optional: true - '@netlify/blobs': - optional: true - '@planetscale/database': - optional: true - '@upstash/redis': - optional: true - '@vercel/blob': - optional: true - '@vercel/functions': - optional: true - '@vercel/kv': - optional: true - aws4fetch: - optional: true - db0: - optional: true - idb-keyval: - optional: true - ioredis: - optional: true - uploadthing: - optional: true - - util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - - vfile-location@5.0.3: - resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} + browserslist: '>= 4.21.0' - vfile-message@4.0.3: - resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - vfile@6.0.3: - resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + v8-to-istanbul@9.3.0: + resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} + engines: {node: '>=10.12.0'} - vite-plus@0.1.12: - resolution: {integrity: sha512-8s1RzomZkgrJRiwiYWGq3R0txFPYfBBJGp73XNHQnme0KTTVH5dNm/E2GNyBSMFJbeeF7eh1OSgqWVc2FpR6eA==} + vite-plus@0.1.20: + resolution: {integrity: sha512-hxJqXTxiiFhszwAeD0MvKlztVuXE4TztTdJ64BPxGqgY67F0PDa5eZkUsrN91Ae8aYUMfweW6V/J57OUO9/0zw==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - vite@7.3.1: - resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} + vite@8.0.10: + resolution: {integrity: sha512-rZuUu9j6J5uotLDs+cAA4O5H4K1SfPliUlQwqa6YEwSrWDZzP4rhm00oJR5snMewjxF5V/K3D4kctsUTsIU9Mw==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: '@types/node': ^20.19.0 || >=22.12.0 + '@vitejs/devtools': ^0.1.0 + esbuild: ^0.27.0 || ^0.28.0 jiti: '>=1.21.0' less: ^4.0.0 - lightningcss: ^1.21.0 sass: ^1.70.0 sass-embedded: ^1.70.0 stylus: '>=0.54.8' @@ -2710,12 +2671,14 @@ packages: peerDependenciesMeta: '@types/node': optional: true + '@vitejs/devtools': + optional: true + esbuild: + optional: true jiti: optional: true less: optional: true - lightningcss: - optional: true sass: optional: true sass-embedded: @@ -2731,128 +2694,22 @@ packages: yaml: optional: true - vitefu@1.1.2: - resolution: {integrity: sha512-zpKATdUbzbsycPFBN71nS2uzBUQiVnFoOrr2rvqv34S1lcAgMKKkjWleLGeiJlZ8lwCXvtWaRn7R3ZC16SYRuw==} - peerDependencies: - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-beta.0 - peerDependenciesMeta: - vite: - optional: true - - volar-service-css@0.0.70: - resolution: {integrity: sha512-K1qyOvBpE3rzdAv3e4/6Rv5yizrYPy5R/ne3IWCAzLBuMO4qBMV3kSqWzj6KUVe6S0AnN6wxF7cRkiaKfYMYJw==} - peerDependencies: - '@volar/language-service': ~2.4.0 - peerDependenciesMeta: - '@volar/language-service': - optional: true - - volar-service-emmet@0.0.70: - resolution: {integrity: sha512-xi5bC4m/VyE3zy/n2CXspKeDZs3qA41tHLTw275/7dNWM/RqE2z3BnDICQybHIVp/6G1iOQj5c1qXMgQC08TNg==} - peerDependencies: - '@volar/language-service': ~2.4.0 - peerDependenciesMeta: - '@volar/language-service': - optional: true - - volar-service-html@0.0.70: - resolution: {integrity: sha512-eR6vCgMdmYAo4n+gcT7DSyBQbwB8S3HZZvSagTf0sxNaD4WppMCFfpqWnkrlGStPKMZvMiejRRVmqsX9dYcTvQ==} - peerDependencies: - '@volar/language-service': ~2.4.0 - peerDependenciesMeta: - '@volar/language-service': - optional: true - - volar-service-prettier@0.0.70: - resolution: {integrity: sha512-Z6BCFSpGVCd8BPAsZ785Kce1BGlWd5ODqmqZGVuB14MJvrR4+CYz6cDy4F+igmE1gMifqfvMhdgT8Aud4M5ngg==} - peerDependencies: - '@volar/language-service': ~2.4.0 - prettier: ^2.2 || ^3.0 - peerDependenciesMeta: - '@volar/language-service': - optional: true - prettier: - optional: true - - volar-service-typescript-twoslash-queries@0.0.70: - resolution: {integrity: sha512-IdD13Z9N2Bu8EM6CM0fDV1E69olEYGHDU25X51YXmq8Y0CmJ2LNj6gOiBJgpS5JGUqFzECVhMNBW7R0sPdRTMQ==} - peerDependencies: - '@volar/language-service': ~2.4.0 - peerDependenciesMeta: - '@volar/language-service': - optional: true - - volar-service-typescript@0.0.70: - resolution: {integrity: sha512-l46Bx4cokkUedTd74ojO5H/zqHZJ8SUuyZ0IB8JN4jfRqUM3bQFBHoOwlZCyZmOeO0A3RQNkMnFclxO4c++gsg==} - peerDependencies: - '@volar/language-service': ~2.4.0 - peerDependenciesMeta: - '@volar/language-service': - optional: true - - volar-service-yaml@0.0.70: - resolution: {integrity: sha512-0c8bXDBeoATF9F6iPIlOuYTuZAC4c+yi0siQo920u7eiBJk8oQmUmg9cDUbR4+Gl++bvGP4plj3fErbJuPqdcQ==} - peerDependencies: - '@volar/language-service': ~2.4.0 - peerDependenciesMeta: - '@volar/language-service': - optional: true - - vscode-css-languageservice@6.3.10: - resolution: {integrity: sha512-eq5N9Er3fC4vA9zd9EFhyBG90wtCCuXgRSpAndaOgXMh1Wgep5lBgRIeDgjZBW9pa+332yC9+49cZMW8jcL3MA==} - - vscode-html-languageservice@5.6.2: - resolution: {integrity: sha512-ulCrSnFnfQ16YzvwnYUgEbUEl/ZG7u2eV27YhvLObSHKkb8fw1Z9cgsnUwjTEeDIdJDoTDTDpxuhQwoenoLNMg==} - - vscode-json-languageservice@4.1.8: - resolution: {integrity: sha512-0vSpg6Xd9hfV+eZAaYN63xVVMOTmJ4GgHxXnkLCh+9RsQBkWKIghzLhW2B9ebfG+LQQg8uLtsQ2aUKjTgE+QOg==} - engines: {npm: '>=7.0.0'} - - vscode-jsonrpc@8.2.0: - resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} - engines: {node: '>=14.0.0'} - - vscode-languageserver-protocol@3.17.5: - resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==} - - vscode-languageserver-textdocument@1.0.12: - resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} - - vscode-languageserver-types@3.17.5: - resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} - - vscode-languageserver@9.0.1: - resolution: {integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==} - hasBin: true - - vscode-nls@5.2.0: - resolution: {integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==} - - vscode-uri@3.1.0: - resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} - - web-namespaces@2.0.1: - resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} - - which-pm-runs@1.1.0: - resolution: {integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==} - engines: {node: '>=4'} - which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} hasBin: true - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} + which@5.0.0: + resolution: {integrity: sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} - ws@8.19.0: - resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==} + ws@8.20.0: + resolution: {integrity: sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -2863,2870 +2720,2143 @@ packages: utf-8-validate: optional: true - xxhash-wasm@1.1.0: - resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==} + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - yaml-language-server@1.20.0: - resolution: {integrity: sha512-qhjK/bzSRZ6HtTvgeFvjNPJGWdZ0+x5NREV/9XZWFjIGezew2b4r5JPy66IfOhd5OA7KeFwk1JfmEbnTvev0cA==} - hasBin: true - - yaml@2.7.1: - resolution: {integrity: sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==} - engines: {node: '>= 14'} - hasBin: true - - yaml@2.8.2: - resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==} - engines: {node: '>= 14.6'} - hasBin: true - - yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - - yargs-parser@22.0.0: - resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} - engines: {node: ^20.19.0 || ^22.12.0 || >=23} - - yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} + 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 - yocto-queue@1.2.2: - resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} - engines: {node: '>=12.20'} + zod@4.4.1: + resolution: {integrity: sha512-a6ENMBBGZBsnlSebQ/eKCguSBeGKSf4O7BPnqVPmYGtpBYI7VSqoVqw+QcB7kPRjbqPwhYTpFbVj/RqNz/CT0Q==} - zod@4.3.6: - resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} +snapshots: - zwitch@2.0.4: - resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + '@babel/code-frame@7.29.0': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 -snapshots: + '@babel/compat-data@7.29.3': {} - '@astrojs/check@0.9.8(prettier-plugin-astro@0.14.1)(prettier@3.8.1)(typescript@5.9.3)': + '@babel/core@7.29.0': dependencies: - '@astrojs/language-server': 2.16.6(prettier-plugin-astro@0.14.1)(prettier@3.8.1)(typescript@5.9.3) - chokidar: 4.0.3 - kleur: 4.1.5 - typescript: 5.9.3 - yargs: 17.7.2 + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) + '@babel/helpers': 7.29.2 + '@babel/parser': 7.29.3 + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 transitivePeerDependencies: - - prettier - - prettier-plugin-astro + - supports-color - '@astrojs/cli-kit@0.4.1': + '@babel/generator@7.29.1': dependencies: - chalk: 5.6.2 - log-update: 5.0.1 - sisteransi: 1.0.5 - - '@astrojs/compiler@2.13.1': {} - - '@astrojs/compiler@3.0.1': {} + '@babel/parser': 7.29.3 + '@babel/types': 7.29.0 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 - '@astrojs/internal-helpers@0.8.0': + '@babel/helper-compilation-targets@7.28.6': dependencies: - picomatch: 4.0.3 + '@babel/compat-data': 7.29.3 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.28.2 + lru-cache: 5.1.1 + semver: 6.3.1 - '@astrojs/language-server@2.16.6(prettier-plugin-astro@0.14.1)(prettier@3.8.1)(typescript@5.9.3)': - dependencies: - '@astrojs/compiler': 2.13.1 - '@astrojs/yaml2ts': 0.2.3 - '@jridgewell/sourcemap-codec': 1.5.5 - '@volar/kit': 2.4.28(typescript@5.9.3) - '@volar/language-core': 2.4.28 - '@volar/language-server': 2.4.28 - '@volar/language-service': 2.4.28 - muggle-string: 0.4.1 - tinyglobby: 0.2.15 - volar-service-css: 0.0.70(@volar/language-service@2.4.28) - volar-service-emmet: 0.0.70(@volar/language-service@2.4.28) - volar-service-html: 0.0.70(@volar/language-service@2.4.28) - volar-service-prettier: 0.0.70(@volar/language-service@2.4.28)(prettier@3.8.1) - volar-service-typescript: 0.0.70(@volar/language-service@2.4.28) - volar-service-typescript-twoslash-queries: 0.0.70(@volar/language-service@2.4.28) - volar-service-yaml: 0.0.70(@volar/language-service@2.4.28) - vscode-html-languageservice: 5.6.2 - vscode-uri: 3.1.0 - optionalDependencies: - prettier: 3.8.1 - prettier-plugin-astro: 0.14.1 - transitivePeerDependencies: - - typescript + '@babel/helper-globals@7.28.0': {} - '@astrojs/markdown-remark@7.0.1': - dependencies: - '@astrojs/internal-helpers': 0.8.0 - '@astrojs/prism': 4.0.1 - github-slugger: 2.0.0 - hast-util-from-html: 2.0.3 - hast-util-to-text: 4.0.2 - js-yaml: 4.1.1 - mdast-util-definitions: 6.0.0 - rehype-raw: 7.0.0 - rehype-stringify: 10.0.1 - remark-gfm: 4.0.1 - remark-parse: 11.0.0 - remark-rehype: 11.1.2 - remark-smartypants: 3.0.2 - shiki: 4.0.2 - smol-toml: 1.6.0 - unified: 11.0.5 - unist-util-remove-position: 5.0.0 - unist-util-visit: 5.1.0 - unist-util-visit-parents: 6.0.2 - vfile: 6.0.3 + '@babel/helper-module-imports@7.28.6': + dependencies: + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color - '@astrojs/mdx@5.0.2(astro@6.0.6(@types/node@24.12.0)(jiti@2.6.1)(rollup@4.59.0)(typescript@5.9.3)(yaml@2.8.2))': + '@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)': dependencies: - '@astrojs/markdown-remark': 7.0.1 - '@mdx-js/mdx': 3.1.1 - acorn: 8.16.0 - astro: 6.0.6(@types/node@24.12.0)(jiti@2.6.1)(rollup@4.59.0)(typescript@5.9.3)(yaml@2.8.2) - es-module-lexer: 2.0.0 - estree-util-visit: 2.0.0 - hast-util-to-html: 9.0.5 - piccolore: 0.1.3 - rehype-raw: 7.0.0 - remark-gfm: 4.0.1 - remark-smartypants: 3.0.2 - source-map: 0.7.6 - unist-util-visit: 5.1.0 - vfile: 6.0.3 + '@babel/core': 7.29.0 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color - '@astrojs/prism@4.0.1': + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helpers@7.29.2': dependencies: - prismjs: 1.30.0 + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 - '@astrojs/rss@4.0.17': + '@babel/parser@7.29.3': dependencies: - fast-xml-parser: 5.4.1 - piccolore: 0.1.3 - zod: 4.3.6 + '@babel/types': 7.29.0 - '@astrojs/sitemap@3.7.1': + '@babel/template@7.28.6': dependencies: - sitemap: 9.0.1 - stream-replace-string: 2.0.0 - zod: 4.3.6 + '@babel/code-frame': 7.29.0 + '@babel/parser': 7.29.3 + '@babel/types': 7.29.0 - '@astrojs/telemetry@3.3.0': + '@babel/traverse@7.29.0': dependencies: - ci-info: 4.4.0 + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.29.3 + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 debug: 4.4.3 - dlv: 1.1.3 - dset: 3.1.4 - is-docker: 3.0.0 - is-wsl: 3.1.1 - which-pm-runs: 1.1.0 transitivePeerDependencies: - supports-color - '@astrojs/upgrade@0.7.1': + '@babel/types@7.29.0': dependencies: - '@astrojs/cli-kit': 0.4.1 - package-manager-detector: 1.6.0 - semver: 7.7.4 - terminal-link: 5.0.0 + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 - '@astrojs/yaml2ts@0.2.3': + '@emnapi/core@1.10.0': dependencies: - yaml: 2.8.2 + '@emnapi/wasi-threads': 1.2.1 + tslib: 2.8.1 + optional: true - '@babel/helper-string-parser@7.27.1': {} + '@emnapi/runtime@1.10.0': + dependencies: + tslib: 2.8.1 + optional: true - '@babel/helper-validator-identifier@7.28.5': {} + '@emnapi/wasi-threads@1.2.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@esbuild/aix-ppc64@0.27.7': + optional: true + + '@esbuild/android-arm64@0.27.7': + optional: true + + '@esbuild/android-arm@0.27.7': + optional: true + + '@esbuild/android-x64@0.27.7': + optional: true + + '@esbuild/darwin-arm64@0.27.7': + optional: true + + '@esbuild/darwin-x64@0.27.7': + optional: true + + '@esbuild/freebsd-arm64@0.27.7': + optional: true - '@babel/parser@7.29.2': + '@esbuild/freebsd-x64@0.27.7': + optional: true + + '@esbuild/linux-arm64@0.27.7': + optional: true + + '@esbuild/linux-arm@0.27.7': + optional: true + + '@esbuild/linux-ia32@0.27.7': + optional: true + + '@esbuild/linux-loong64@0.27.7': + optional: true + + '@esbuild/linux-mips64el@0.27.7': + optional: true + + '@esbuild/linux-ppc64@0.27.7': + optional: true + + '@esbuild/linux-riscv64@0.27.7': + optional: true + + '@esbuild/linux-s390x@0.27.7': + optional: true + + '@esbuild/linux-x64@0.27.7': + optional: true + + '@esbuild/netbsd-arm64@0.27.7': + optional: true + + '@esbuild/netbsd-x64@0.27.7': + optional: true + + '@esbuild/openbsd-arm64@0.27.7': + optional: true + + '@esbuild/openbsd-x64@0.27.7': + optional: true + + '@esbuild/openharmony-arm64@0.27.7': + optional: true + + '@esbuild/sunos-x64@0.27.7': + optional: true + + '@esbuild/win32-arm64@0.27.7': + optional: true + + '@esbuild/win32-ia32@0.27.7': + optional: true + + '@esbuild/win32-x64@0.27.7': + optional: true + + '@eslint-community/eslint-utils@4.9.1(eslint@10.3.0(jiti@2.6.1))': dependencies: - '@babel/types': 7.29.0 + eslint: 10.3.0(jiti@2.6.1) + eslint-visitor-keys: 3.4.3 - '@babel/types@7.29.0': + '@eslint-community/regexpp@4.12.2': {} + + '@eslint/config-array@0.23.5': dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 + '@eslint/object-schema': 3.0.5 + debug: 4.4.3 + minimatch: 10.2.5 + transitivePeerDependencies: + - supports-color - '@capsizecss/unpack@4.0.0': + '@eslint/config-helpers@0.5.5': dependencies: - fontkitten: 1.0.3 + '@eslint/core': 1.2.1 - '@clack/core@1.1.0': + '@eslint/core@1.2.1': dependencies: - sisteransi: 1.0.5 + '@types/json-schema': 7.0.15 - '@clack/prompts@1.1.0': + '@eslint/object-schema@3.0.5': {} + + '@eslint/plugin-kit@0.7.1': dependencies: - '@clack/core': 1.1.0 - sisteransi: 1.0.5 + '@eslint/core': 1.2.1 + levn: 0.4.1 - '@emmetio/abbreviation@2.3.3': + '@humanfs/core@0.19.2': dependencies: - '@emmetio/scanner': 1.0.4 + '@humanfs/types': 0.15.0 - '@emmetio/css-abbreviation@2.1.8': + '@humanfs/node@0.16.8': dependencies: - '@emmetio/scanner': 1.0.4 + '@humanfs/core': 0.19.2 + '@humanfs/types': 0.15.0 + '@humanwhocodes/retry': 0.4.3 + + '@humanfs/types@0.15.0': {} - '@emmetio/css-parser@0.4.1': + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.4.3': {} + + '@jridgewell/gen-mapping@0.3.13': dependencies: - '@emmetio/stream-reader': 2.2.0 - '@emmetio/stream-reader-utils': 0.1.0 + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 - '@emmetio/html-matcher@1.3.0': + '@jridgewell/remapping@2.3.5': dependencies: - '@emmetio/scanner': 1.0.4 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 - '@emmetio/scanner@1.0.4': {} + '@jridgewell/resolve-uri@3.1.2': {} - '@emmetio/stream-reader-utils@0.1.0': {} + '@jridgewell/sourcemap-codec@1.5.5': {} - '@emmetio/stream-reader@2.2.0': {} + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 - '@emnapi/runtime@1.9.0': + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: - tslib: 2.8.1 + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@tybys/wasm-util': 0.10.1 optional: true - '@esbuild/aix-ppc64@0.27.4': - optional: true + '@nkzw/eslint-plugin@2.0.0(eslint@10.3.0(jiti@2.6.1))': + dependencies: + eslint: 10.3.0(jiti@2.6.1) - '@esbuild/android-arm64@0.27.4': - optional: true + '@nkzw/oxlint-config@1.1.1(eslint@10.3.0(jiti@2.6.1))(oxlint@1.62.0(oxlint-tsgolint@0.22.0))(typescript@6.0.3)': + dependencies: + '@nkzw/eslint-plugin': 2.0.0(eslint@10.3.0(jiti@2.6.1)) + eslint-plugin-no-only-tests: 3.4.0 + eslint-plugin-perfectionist: 5.9.0(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) + eslint-plugin-react-hooks: 7.1.1(eslint@10.3.0(jiti@2.6.1)) + eslint-plugin-unused-imports: 4.4.1(eslint@10.3.0(jiti@2.6.1)) + oxlint: 1.62.0(oxlint-tsgolint@0.22.0) + transitivePeerDependencies: + - '@typescript-eslint/eslint-plugin' + - eslint + - supports-color + - typescript - '@esbuild/android-arm@0.27.4': + '@oxc-minify/binding-android-arm-eabi@0.121.0': optional: true - '@esbuild/android-x64@0.27.4': + '@oxc-minify/binding-android-arm64@0.121.0': optional: true - '@esbuild/darwin-arm64@0.27.4': + '@oxc-minify/binding-darwin-arm64@0.121.0': optional: true - '@esbuild/darwin-x64@0.27.4': + '@oxc-minify/binding-darwin-x64@0.121.0': optional: true - '@esbuild/freebsd-arm64@0.27.4': + '@oxc-minify/binding-freebsd-x64@0.121.0': optional: true - '@esbuild/freebsd-x64@0.27.4': + '@oxc-minify/binding-linux-arm-gnueabihf@0.121.0': optional: true - '@esbuild/linux-arm64@0.27.4': + '@oxc-minify/binding-linux-arm-musleabihf@0.121.0': optional: true - '@esbuild/linux-arm@0.27.4': + '@oxc-minify/binding-linux-arm64-gnu@0.121.0': optional: true - '@esbuild/linux-ia32@0.27.4': + '@oxc-minify/binding-linux-arm64-musl@0.121.0': optional: true - '@esbuild/linux-loong64@0.27.4': + '@oxc-minify/binding-linux-ppc64-gnu@0.121.0': optional: true - '@esbuild/linux-mips64el@0.27.4': + '@oxc-minify/binding-linux-riscv64-gnu@0.121.0': optional: true - '@esbuild/linux-ppc64@0.27.4': + '@oxc-minify/binding-linux-riscv64-musl@0.121.0': optional: true - '@esbuild/linux-riscv64@0.27.4': + '@oxc-minify/binding-linux-s390x-gnu@0.121.0': optional: true - '@esbuild/linux-s390x@0.27.4': + '@oxc-minify/binding-linux-x64-gnu@0.121.0': optional: true - '@esbuild/linux-x64@0.27.4': + '@oxc-minify/binding-linux-x64-musl@0.121.0': optional: true - '@esbuild/netbsd-arm64@0.27.4': + '@oxc-minify/binding-openharmony-arm64@0.121.0': optional: true - '@esbuild/netbsd-x64@0.27.4': + '@oxc-minify/binding-wasm32-wasi@0.121.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + dependencies: + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' optional: true - '@esbuild/openbsd-arm64@0.27.4': + '@oxc-minify/binding-win32-arm64-msvc@0.121.0': optional: true - '@esbuild/openbsd-x64@0.27.4': + '@oxc-minify/binding-win32-ia32-msvc@0.121.0': optional: true - '@esbuild/openharmony-arm64@0.27.4': + '@oxc-minify/binding-win32-x64-msvc@0.121.0': optional: true - '@esbuild/sunos-x64@0.27.4': + '@oxc-parser/binding-android-arm-eabi@0.121.0': optional: true - '@esbuild/win32-arm64@0.27.4': + '@oxc-parser/binding-android-arm64@0.121.0': optional: true - '@esbuild/win32-ia32@0.27.4': + '@oxc-parser/binding-darwin-arm64@0.121.0': optional: true - '@esbuild/win32-x64@0.27.4': + '@oxc-parser/binding-darwin-x64@0.121.0': optional: true - '@fontsource/work-sans@5.2.8': {} + '@oxc-parser/binding-freebsd-x64@0.121.0': + optional: true - '@img/colour@1.1.0': + '@oxc-parser/binding-linux-arm-gnueabihf@0.121.0': optional: true - '@img/sharp-darwin-arm64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.2.4 + '@oxc-parser/binding-linux-arm-musleabihf@0.121.0': optional: true - '@img/sharp-darwin-x64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.2.4 + '@oxc-parser/binding-linux-arm64-gnu@0.121.0': optional: true - '@img/sharp-libvips-darwin-arm64@1.2.4': + '@oxc-parser/binding-linux-arm64-musl@0.121.0': optional: true - '@img/sharp-libvips-darwin-x64@1.2.4': + '@oxc-parser/binding-linux-ppc64-gnu@0.121.0': optional: true - '@img/sharp-libvips-linux-arm64@1.2.4': + '@oxc-parser/binding-linux-riscv64-gnu@0.121.0': optional: true - '@img/sharp-libvips-linux-arm@1.2.4': + '@oxc-parser/binding-linux-riscv64-musl@0.121.0': optional: true - '@img/sharp-libvips-linux-ppc64@1.2.4': + '@oxc-parser/binding-linux-s390x-gnu@0.121.0': optional: true - '@img/sharp-libvips-linux-riscv64@1.2.4': + '@oxc-parser/binding-linux-x64-gnu@0.121.0': optional: true - '@img/sharp-libvips-linux-s390x@1.2.4': + '@oxc-parser/binding-linux-x64-musl@0.121.0': optional: true - '@img/sharp-libvips-linux-x64@1.2.4': + '@oxc-parser/binding-openharmony-arm64@0.121.0': optional: true - '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + '@oxc-parser/binding-wasm32-wasi@0.121.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + dependencies: + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' optional: true - '@img/sharp-libvips-linuxmusl-x64@1.2.4': + '@oxc-parser/binding-win32-arm64-msvc@0.121.0': optional: true - '@img/sharp-linux-arm64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.2.4 + '@oxc-parser/binding-win32-ia32-msvc@0.121.0': optional: true - '@img/sharp-linux-arm@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.2.4 + '@oxc-parser/binding-win32-x64-msvc@0.121.0': optional: true - '@img/sharp-linux-ppc64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linux-ppc64': 1.2.4 + '@oxc-project/runtime@0.121.0': {} + + '@oxc-project/runtime@0.127.0': {} + + '@oxc-project/types@0.121.0': {} + + '@oxc-project/types@0.127.0': {} + + '@oxc-resolver/binding-android-arm-eabi@11.19.1': optional: true - '@img/sharp-linux-riscv64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linux-riscv64': 1.2.4 + '@oxc-resolver/binding-android-arm64@11.19.1': optional: true - '@img/sharp-linux-s390x@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.2.4 + '@oxc-resolver/binding-darwin-arm64@11.19.1': optional: true - '@img/sharp-linux-x64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.2.4 + '@oxc-resolver/binding-darwin-x64@11.19.1': optional: true - '@img/sharp-linuxmusl-arm64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + '@oxc-resolver/binding-freebsd-x64@11.19.1': optional: true - '@img/sharp-linuxmusl-x64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + '@oxc-resolver/binding-linux-arm-gnueabihf@11.19.1': optional: true - '@img/sharp-wasm32@0.34.5': - dependencies: - '@emnapi/runtime': 1.9.0 + '@oxc-resolver/binding-linux-arm-musleabihf@11.19.1': optional: true - '@img/sharp-win32-arm64@0.34.5': + '@oxc-resolver/binding-linux-arm64-gnu@11.19.1': optional: true - '@img/sharp-win32-ia32@0.34.5': + '@oxc-resolver/binding-linux-arm64-musl@11.19.1': optional: true - '@img/sharp-win32-x64@0.34.5': + '@oxc-resolver/binding-linux-ppc64-gnu@11.19.1': optional: true - '@jridgewell/gen-mapping@0.3.13': - dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 - '@jridgewell/trace-mapping': 0.3.31 + '@oxc-resolver/binding-linux-riscv64-gnu@11.19.1': + optional: true - '@jridgewell/remapping@2.3.5': - dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 + '@oxc-resolver/binding-linux-riscv64-musl@11.19.1': + optional: true - '@jridgewell/resolve-uri@3.1.2': {} + '@oxc-resolver/binding-linux-s390x-gnu@11.19.1': + optional: true - '@jridgewell/sourcemap-codec@1.5.5': {} + '@oxc-resolver/binding-linux-x64-gnu@11.19.1': + optional: true - '@jridgewell/trace-mapping@0.3.31': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 + '@oxc-resolver/binding-linux-x64-musl@11.19.1': + optional: true - '@kurkle/color@0.3.4': {} + '@oxc-resolver/binding-openharmony-arm64@11.19.1': + optional: true - '@mdx-js/mdx@3.1.1': + '@oxc-resolver/binding-wasm32-wasi@11.19.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: - '@types/estree': 1.0.8 - '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.4 - '@types/mdx': 2.0.13 - acorn: 8.16.0 - collapse-white-space: 2.1.0 - devlop: 1.1.0 - estree-util-is-identifier-name: 3.0.0 - estree-util-scope: 1.0.0 - estree-walker: 3.0.3 - hast-util-to-jsx-runtime: 2.3.6 - markdown-extensions: 2.0.0 - recma-build-jsx: 1.0.0 - recma-jsx: 1.0.1(acorn@8.16.0) - recma-stringify: 1.0.0 - rehype-recma: 1.0.0 - remark-mdx: 3.1.1 - remark-parse: 11.0.0 - remark-rehype: 11.1.2 - source-map: 0.7.6 - unified: 11.0.5 - unist-util-position-from-estree: 2.0.0 - unist-util-stringify-position: 4.0.0 - unist-util-visit: 5.1.0 - vfile: 6.0.3 + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) transitivePeerDependencies: - - supports-color - - '@myriaddreamin/typst-ts-node-compiler-android-arm-eabi@0.7.0-rc2': + - '@emnapi/core' + - '@emnapi/runtime' optional: true - '@myriaddreamin/typst-ts-node-compiler-android-arm64@0.7.0-rc2': + '@oxc-resolver/binding-win32-arm64-msvc@11.19.1': optional: true - '@myriaddreamin/typst-ts-node-compiler-darwin-arm64@0.7.0-rc2': + '@oxc-resolver/binding-win32-ia32-msvc@11.19.1': optional: true - '@myriaddreamin/typst-ts-node-compiler-darwin-x64@0.7.0-rc2': + '@oxc-resolver/binding-win32-x64-msvc@11.19.1': optional: true - '@myriaddreamin/typst-ts-node-compiler-linux-arm-gnueabihf@0.7.0-rc2': + '@oxc-transform/binding-android-arm-eabi@0.121.0': optional: true - '@myriaddreamin/typst-ts-node-compiler-linux-arm64-gnu@0.7.0-rc2': + '@oxc-transform/binding-android-arm64@0.121.0': optional: true - '@myriaddreamin/typst-ts-node-compiler-linux-arm64-musl@0.7.0-rc2': + '@oxc-transform/binding-darwin-arm64@0.121.0': optional: true - '@myriaddreamin/typst-ts-node-compiler-linux-x64-gnu@0.7.0-rc2': + '@oxc-transform/binding-darwin-x64@0.121.0': optional: true - '@myriaddreamin/typst-ts-node-compiler-linux-x64-musl@0.7.0-rc2': + '@oxc-transform/binding-freebsd-x64@0.121.0': optional: true - '@myriaddreamin/typst-ts-node-compiler-win32-arm64-msvc@0.7.0-rc2': + '@oxc-transform/binding-linux-arm-gnueabihf@0.121.0': optional: true - '@myriaddreamin/typst-ts-node-compiler-win32-x64-msvc@0.7.0-rc2': + '@oxc-transform/binding-linux-arm-musleabihf@0.121.0': optional: true - '@myriaddreamin/typst-ts-node-compiler@0.7.0-rc2': - optionalDependencies: - '@myriaddreamin/typst-ts-node-compiler-android-arm-eabi': 0.7.0-rc2 - '@myriaddreamin/typst-ts-node-compiler-android-arm64': 0.7.0-rc2 - '@myriaddreamin/typst-ts-node-compiler-darwin-arm64': 0.7.0-rc2 - '@myriaddreamin/typst-ts-node-compiler-darwin-x64': 0.7.0-rc2 - '@myriaddreamin/typst-ts-node-compiler-linux-arm-gnueabihf': 0.7.0-rc2 - '@myriaddreamin/typst-ts-node-compiler-linux-arm64-gnu': 0.7.0-rc2 - '@myriaddreamin/typst-ts-node-compiler-linux-arm64-musl': 0.7.0-rc2 - '@myriaddreamin/typst-ts-node-compiler-linux-x64-gnu': 0.7.0-rc2 - '@myriaddreamin/typst-ts-node-compiler-linux-x64-musl': 0.7.0-rc2 - '@myriaddreamin/typst-ts-node-compiler-win32-arm64-msvc': 0.7.0-rc2 - '@myriaddreamin/typst-ts-node-compiler-win32-x64-msvc': 0.7.0-rc2 - - '@oslojs/encoding@1.1.0': {} - - '@oxc-project/runtime@0.115.0': {} + '@oxc-transform/binding-linux-arm64-gnu@0.121.0': + optional: true - '@oxc-project/types@0.115.0': {} + '@oxc-transform/binding-linux-arm64-musl@0.121.0': + optional: true - '@oxfmt/binding-android-arm-eabi@0.40.0': + '@oxc-transform/binding-linux-ppc64-gnu@0.121.0': optional: true - '@oxfmt/binding-android-arm64@0.40.0': + '@oxc-transform/binding-linux-riscv64-gnu@0.121.0': optional: true - '@oxfmt/binding-darwin-arm64@0.40.0': + '@oxc-transform/binding-linux-riscv64-musl@0.121.0': optional: true - '@oxfmt/binding-darwin-x64@0.40.0': + '@oxc-transform/binding-linux-s390x-gnu@0.121.0': optional: true - '@oxfmt/binding-freebsd-x64@0.40.0': + '@oxc-transform/binding-linux-x64-gnu@0.121.0': optional: true - '@oxfmt/binding-linux-arm-gnueabihf@0.40.0': + '@oxc-transform/binding-linux-x64-musl@0.121.0': optional: true - '@oxfmt/binding-linux-arm-musleabihf@0.40.0': + '@oxc-transform/binding-openharmony-arm64@0.121.0': optional: true - '@oxfmt/binding-linux-arm64-gnu@0.40.0': + '@oxc-transform/binding-wasm32-wasi@0.121.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + dependencies: + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' optional: true - '@oxfmt/binding-linux-arm64-musl@0.40.0': + '@oxc-transform/binding-win32-arm64-msvc@0.121.0': optional: true - '@oxfmt/binding-linux-ppc64-gnu@0.40.0': + '@oxc-transform/binding-win32-ia32-msvc@0.121.0': optional: true - '@oxfmt/binding-linux-riscv64-gnu@0.40.0': + '@oxc-transform/binding-win32-x64-msvc@0.121.0': optional: true - '@oxfmt/binding-linux-riscv64-musl@0.40.0': + '@oxfmt/binding-android-arm-eabi@0.46.0': optional: true - '@oxfmt/binding-linux-s390x-gnu@0.40.0': + '@oxfmt/binding-android-arm64@0.46.0': optional: true - '@oxfmt/binding-linux-x64-gnu@0.40.0': + '@oxfmt/binding-darwin-arm64@0.46.0': optional: true - '@oxfmt/binding-linux-x64-musl@0.40.0': + '@oxfmt/binding-darwin-x64@0.46.0': optional: true - '@oxfmt/binding-openharmony-arm64@0.40.0': + '@oxfmt/binding-freebsd-x64@0.46.0': optional: true - '@oxfmt/binding-win32-arm64-msvc@0.40.0': + '@oxfmt/binding-linux-arm-gnueabihf@0.46.0': optional: true - '@oxfmt/binding-win32-ia32-msvc@0.40.0': + '@oxfmt/binding-linux-arm-musleabihf@0.46.0': optional: true - '@oxfmt/binding-win32-x64-msvc@0.40.0': + '@oxfmt/binding-linux-arm64-gnu@0.46.0': optional: true - '@oxlint-tsgolint/darwin-arm64@0.17.0': + '@oxfmt/binding-linux-arm64-musl@0.46.0': optional: true - '@oxlint-tsgolint/darwin-x64@0.17.0': + '@oxfmt/binding-linux-ppc64-gnu@0.46.0': optional: true - '@oxlint-tsgolint/linux-arm64@0.17.0': + '@oxfmt/binding-linux-riscv64-gnu@0.46.0': optional: true - '@oxlint-tsgolint/linux-x64@0.17.0': + '@oxfmt/binding-linux-riscv64-musl@0.46.0': optional: true - '@oxlint-tsgolint/win32-arm64@0.17.0': + '@oxfmt/binding-linux-s390x-gnu@0.46.0': optional: true - '@oxlint-tsgolint/win32-x64@0.17.0': + '@oxfmt/binding-linux-x64-gnu@0.46.0': optional: true - '@oxlint/binding-android-arm-eabi@1.55.0': + '@oxfmt/binding-linux-x64-musl@0.46.0': optional: true - '@oxlint/binding-android-arm64@1.55.0': + '@oxfmt/binding-openharmony-arm64@0.46.0': optional: true - '@oxlint/binding-darwin-arm64@1.55.0': + '@oxfmt/binding-win32-arm64-msvc@0.46.0': optional: true - '@oxlint/binding-darwin-x64@1.55.0': + '@oxfmt/binding-win32-ia32-msvc@0.46.0': optional: true - '@oxlint/binding-freebsd-x64@1.55.0': + '@oxfmt/binding-win32-x64-msvc@0.46.0': optional: true - '@oxlint/binding-linux-arm-gnueabihf@1.55.0': + '@oxlint-tsgolint/darwin-arm64@0.22.0': optional: true - '@oxlint/binding-linux-arm-musleabihf@1.55.0': + '@oxlint-tsgolint/darwin-x64@0.22.0': optional: true - '@oxlint/binding-linux-arm64-gnu@1.55.0': + '@oxlint-tsgolint/linux-arm64@0.22.0': optional: true - '@oxlint/binding-linux-arm64-musl@1.55.0': + '@oxlint-tsgolint/linux-x64@0.22.0': optional: true - '@oxlint/binding-linux-ppc64-gnu@1.55.0': + '@oxlint-tsgolint/win32-arm64@0.22.0': optional: true - '@oxlint/binding-linux-riscv64-gnu@1.55.0': + '@oxlint-tsgolint/win32-x64@0.22.0': optional: true - '@oxlint/binding-linux-riscv64-musl@1.55.0': + '@oxlint/binding-android-arm-eabi@1.61.0': optional: true - '@oxlint/binding-linux-s390x-gnu@1.55.0': + '@oxlint/binding-android-arm-eabi@1.62.0': optional: true - '@oxlint/binding-linux-x64-gnu@1.55.0': + '@oxlint/binding-android-arm64@1.61.0': optional: true - '@oxlint/binding-linux-x64-musl@1.55.0': + '@oxlint/binding-android-arm64@1.62.0': optional: true - '@oxlint/binding-openharmony-arm64@1.55.0': + '@oxlint/binding-darwin-arm64@1.61.0': optional: true - '@oxlint/binding-win32-arm64-msvc@1.55.0': + '@oxlint/binding-darwin-arm64@1.62.0': optional: true - '@oxlint/binding-win32-ia32-msvc@1.55.0': + '@oxlint/binding-darwin-x64@1.61.0': optional: true - '@oxlint/binding-win32-x64-msvc@1.55.0': + '@oxlint/binding-darwin-x64@1.62.0': optional: true - '@polka/url@1.0.0-next.29': {} - - '@radix-ui/colors@3.0.0': {} - - '@rollup/pluginutils@5.3.0(rollup@4.59.0)': - dependencies: - '@types/estree': 1.0.8 - estree-walker: 2.0.2 - picomatch: 4.0.3 - optionalDependencies: - rollup: 4.59.0 - - '@rollup/rollup-android-arm-eabi@4.59.0': + '@oxlint/binding-freebsd-x64@1.61.0': optional: true - '@rollup/rollup-android-arm64@4.59.0': + '@oxlint/binding-freebsd-x64@1.62.0': optional: true - '@rollup/rollup-darwin-arm64@4.59.0': + '@oxlint/binding-linux-arm-gnueabihf@1.61.0': optional: true - '@rollup/rollup-darwin-x64@4.59.0': + '@oxlint/binding-linux-arm-gnueabihf@1.62.0': optional: true - '@rollup/rollup-freebsd-arm64@4.59.0': + '@oxlint/binding-linux-arm-musleabihf@1.61.0': optional: true - '@rollup/rollup-freebsd-x64@4.59.0': + '@oxlint/binding-linux-arm-musleabihf@1.62.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.59.0': + '@oxlint/binding-linux-arm64-gnu@1.61.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.59.0': + '@oxlint/binding-linux-arm64-gnu@1.62.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.59.0': + '@oxlint/binding-linux-arm64-musl@1.61.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.59.0': + '@oxlint/binding-linux-arm64-musl@1.62.0': optional: true - '@rollup/rollup-linux-loong64-gnu@4.59.0': + '@oxlint/binding-linux-ppc64-gnu@1.61.0': optional: true - '@rollup/rollup-linux-loong64-musl@4.59.0': + '@oxlint/binding-linux-ppc64-gnu@1.62.0': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.59.0': + '@oxlint/binding-linux-riscv64-gnu@1.61.0': optional: true - '@rollup/rollup-linux-ppc64-musl@4.59.0': + '@oxlint/binding-linux-riscv64-gnu@1.62.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.59.0': + '@oxlint/binding-linux-riscv64-musl@1.61.0': optional: true - '@rollup/rollup-linux-riscv64-musl@4.59.0': + '@oxlint/binding-linux-riscv64-musl@1.62.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.59.0': + '@oxlint/binding-linux-s390x-gnu@1.61.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.59.0': + '@oxlint/binding-linux-s390x-gnu@1.62.0': optional: true - '@rollup/rollup-linux-x64-musl@4.59.0': + '@oxlint/binding-linux-x64-gnu@1.61.0': optional: true - '@rollup/rollup-openbsd-x64@4.59.0': + '@oxlint/binding-linux-x64-gnu@1.62.0': optional: true - '@rollup/rollup-openharmony-arm64@4.59.0': + '@oxlint/binding-linux-x64-musl@1.61.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.59.0': + '@oxlint/binding-linux-x64-musl@1.62.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.59.0': + '@oxlint/binding-openharmony-arm64@1.61.0': optional: true - '@rollup/rollup-win32-x64-gnu@4.59.0': + '@oxlint/binding-openharmony-arm64@1.62.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.59.0': + '@oxlint/binding-win32-arm64-msvc@1.61.0': optional: true - '@shikijs/core@4.0.2': - dependencies: - '@shikijs/primitive': 4.0.2 - '@shikijs/types': 4.0.2 - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 - hast-util-to-html: 9.0.5 - - '@shikijs/engine-javascript@4.0.2': - dependencies: - '@shikijs/types': 4.0.2 - '@shikijs/vscode-textmate': 10.0.2 - oniguruma-to-es: 4.3.5 - - '@shikijs/engine-oniguruma@4.0.2': - dependencies: - '@shikijs/types': 4.0.2 - '@shikijs/vscode-textmate': 10.0.2 - - '@shikijs/langs@4.0.2': - dependencies: - '@shikijs/types': 4.0.2 - - '@shikijs/primitive@4.0.2': - dependencies: - '@shikijs/types': 4.0.2 - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 - - '@shikijs/themes@4.0.2': - dependencies: - '@shikijs/types': 4.0.2 - - '@shikijs/types@4.0.2': - dependencies: - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 - - '@shikijs/vscode-textmate@10.0.2': {} - - '@standard-schema/spec@1.1.0': {} - - '@tailwindcss/node@4.2.2': - dependencies: - '@jridgewell/remapping': 2.3.5 - enhanced-resolve: 5.20.1 - jiti: 2.6.1 - lightningcss: 1.32.0 - magic-string: 0.30.21 - source-map-js: 1.2.1 - tailwindcss: 4.2.2 - - '@tailwindcss/oxide-android-arm64@4.2.2': + '@oxlint/binding-win32-arm64-msvc@1.62.0': optional: true - '@tailwindcss/oxide-darwin-arm64@4.2.2': + '@oxlint/binding-win32-ia32-msvc@1.61.0': optional: true - '@tailwindcss/oxide-darwin-x64@4.2.2': + '@oxlint/binding-win32-ia32-msvc@1.62.0': optional: true - '@tailwindcss/oxide-freebsd-x64@4.2.2': + '@oxlint/binding-win32-x64-msvc@1.61.0': optional: true - '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.2': + '@oxlint/binding-win32-x64-msvc@1.62.0': optional: true - '@tailwindcss/oxide-linux-arm64-gnu@4.2.2': + '@parcel/watcher-android-arm64@2.5.6': optional: true - '@tailwindcss/oxide-linux-arm64-musl@4.2.2': + '@parcel/watcher-darwin-arm64@2.5.6': optional: true - '@tailwindcss/oxide-linux-x64-gnu@4.2.2': + '@parcel/watcher-darwin-x64@2.5.6': optional: true - '@tailwindcss/oxide-linux-x64-musl@4.2.2': + '@parcel/watcher-freebsd-x64@2.5.6': optional: true - '@tailwindcss/oxide-wasm32-wasi@4.2.2': + '@parcel/watcher-linux-arm-glibc@2.5.6': optional: true - '@tailwindcss/oxide-win32-arm64-msvc@4.2.2': + '@parcel/watcher-linux-arm-musl@2.5.6': optional: true - '@tailwindcss/oxide-win32-x64-msvc@4.2.2': + '@parcel/watcher-linux-arm64-glibc@2.5.6': optional: true - '@tailwindcss/oxide@4.2.2': - optionalDependencies: - '@tailwindcss/oxide-android-arm64': 4.2.2 - '@tailwindcss/oxide-darwin-arm64': 4.2.2 - '@tailwindcss/oxide-darwin-x64': 4.2.2 - '@tailwindcss/oxide-freebsd-x64': 4.2.2 - '@tailwindcss/oxide-linux-arm-gnueabihf': 4.2.2 - '@tailwindcss/oxide-linux-arm64-gnu': 4.2.2 - '@tailwindcss/oxide-linux-arm64-musl': 4.2.2 - '@tailwindcss/oxide-linux-x64-gnu': 4.2.2 - '@tailwindcss/oxide-linux-x64-musl': 4.2.2 - '@tailwindcss/oxide-wasm32-wasi': 4.2.2 - '@tailwindcss/oxide-win32-arm64-msvc': 4.2.2 - '@tailwindcss/oxide-win32-x64-msvc': 4.2.2 - - '@tailwindcss/typography@0.5.19(tailwindcss@4.2.2)': - dependencies: - postcss-selector-parser: 6.0.10 - tailwindcss: 4.2.2 - - '@tailwindcss/vite@4.2.2(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.2))': - dependencies: - '@tailwindcss/node': 4.2.2 - '@tailwindcss/oxide': 4.2.2 - tailwindcss: 4.2.2 - vite: 7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.2) - - '@types/chai@5.2.3': - dependencies: - '@types/deep-eql': 4.0.2 - assertion-error: 2.0.1 - - '@types/debug@4.1.12': - dependencies: - '@types/ms': 2.1.0 - - '@types/deep-eql@4.0.2': {} - - '@types/estree-jsx@1.0.5': - dependencies: - '@types/estree': 1.0.8 - - '@types/estree@1.0.8': {} - - '@types/hast@3.0.4': - dependencies: - '@types/unist': 3.0.3 - - '@types/mdast@4.0.4': - dependencies: - '@types/unist': 3.0.3 - - '@types/mdx@2.0.13': {} - - '@types/ms@2.1.0': {} - - '@types/nlcst@2.0.3': - dependencies: - '@types/unist': 3.0.3 - - '@types/node@24.12.0': - dependencies: - undici-types: 7.16.0 - - '@types/sax@1.2.7': - dependencies: - '@types/node': 24.12.0 - - '@types/unist@2.0.11': {} - - '@types/unist@3.0.3': {} - - '@ungap/structured-clone@1.3.0': {} - - '@voidzero-dev/vite-plus-core@0.1.12(@types/node@24.12.0)(esbuild@0.27.4)(jiti@2.6.1)(typescript@5.9.3)(yaml@2.8.2)': - dependencies: - '@oxc-project/runtime': 0.115.0 - '@oxc-project/types': 0.115.0 - lightningcss: 1.32.0 - postcss: 8.5.8 - optionalDependencies: - '@types/node': 24.12.0 - esbuild: 0.27.4 - fsevents: 2.3.3 - jiti: 2.6.1 - typescript: 5.9.3 - yaml: 2.8.2 - - '@voidzero-dev/vite-plus-darwin-arm64@0.1.12': + '@parcel/watcher-linux-arm64-musl@2.5.6': optional: true - '@voidzero-dev/vite-plus-darwin-x64@0.1.12': + '@parcel/watcher-linux-x64-glibc@2.5.6': optional: true - '@voidzero-dev/vite-plus-linux-arm64-gnu@0.1.12': + '@parcel/watcher-linux-x64-musl@2.5.6': optional: true - '@voidzero-dev/vite-plus-linux-x64-gnu@0.1.12': + '@parcel/watcher-win32-arm64@2.5.6': optional: true - '@voidzero-dev/vite-plus-test@0.1.12(@types/node@24.12.0)(esbuild@0.27.4)(jiti@2.6.1)(typescript@5.9.3)(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.2))(yaml@2.8.2)': - dependencies: - '@standard-schema/spec': 1.1.0 - '@types/chai': 5.2.3 - '@voidzero-dev/vite-plus-core': 0.1.12(@types/node@24.12.0)(esbuild@0.27.4)(jiti@2.6.1)(typescript@5.9.3)(yaml@2.8.2) - es-module-lexer: 1.7.0 - obug: 2.1.1 - pixelmatch: 7.1.0 - pngjs: 7.0.0 - sirv: 3.0.2 - std-env: 4.0.0 - tinybench: 2.9.0 - tinyexec: 1.0.4 - tinyglobby: 0.2.15 - vite: 7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.2) - ws: 8.19.0 - optionalDependencies: - '@types/node': 24.12.0 - transitivePeerDependencies: - - '@arethetypeswrong/core' - - '@tsdown/css' - - '@tsdown/exe' - - '@vitejs/devtools' - - bufferutil - - esbuild - - jiti - - less - - publint - - sass - - sass-embedded - - stylus - - sugarss - - terser - - tsx - - typescript - - unplugin-unused - - utf-8-validate - - yaml - - '@voidzero-dev/vite-plus-win32-arm64-msvc@0.1.12': + '@parcel/watcher-win32-ia32@2.5.6': optional: true - '@voidzero-dev/vite-plus-win32-x64-msvc@0.1.12': + '@parcel/watcher-win32-x64@2.5.6': optional: true - '@volar/kit@2.4.28(typescript@5.9.3)': - dependencies: - '@volar/language-service': 2.4.28 - '@volar/typescript': 2.4.28 - typesafe-path: 0.2.2 - typescript: 5.9.3 - vscode-languageserver-textdocument: 1.0.12 - vscode-uri: 3.1.0 - - '@volar/language-core@2.4.28': - dependencies: - '@volar/source-map': 2.4.28 - - '@volar/language-server@2.4.28': - dependencies: - '@volar/language-core': 2.4.28 - '@volar/language-service': 2.4.28 - '@volar/typescript': 2.4.28 - path-browserify: 1.0.1 - request-light: 0.7.0 - vscode-languageserver: 9.0.1 - vscode-languageserver-protocol: 3.17.5 - vscode-languageserver-textdocument: 1.0.12 - vscode-uri: 3.1.0 - - '@volar/language-service@2.4.28': - dependencies: - '@volar/language-core': 2.4.28 - vscode-languageserver-protocol: 3.17.5 - vscode-languageserver-textdocument: 1.0.12 - vscode-uri: 3.1.0 - - '@volar/source-map@2.4.28': {} - - '@volar/typescript@2.4.28': - dependencies: - '@volar/language-core': 2.4.28 - path-browserify: 1.0.1 - vscode-uri: 3.1.0 - - '@vscode/emmet-helper@2.11.0': - dependencies: - emmet: 2.4.11 - jsonc-parser: 2.3.1 - vscode-languageserver-textdocument: 1.0.12 - vscode-languageserver-types: 3.17.5 - vscode-uri: 3.1.0 - - '@vscode/l10n@0.0.18': {} - - acorn-jsx@5.3.2(acorn@8.16.0): + '@parcel/watcher@2.5.6': dependencies: - acorn: 8.16.0 - - acorn@8.16.0: {} - - ajv-draft-04@1.0.0(ajv@8.18.0): + detect-libc: 2.1.2 + is-glob: 4.0.3 + node-addon-api: 7.1.1 + picomatch: 4.0.4 optionalDependencies: - ajv: 8.18.0 - - ajv@8.18.0: - dependencies: - fast-deep-equal: 3.1.3 - fast-uri: 3.1.0 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - - ansi-escapes@5.0.0: - dependencies: - type-fest: 1.4.0 - - ansi-escapes@7.3.0: - dependencies: - environment: 1.1.0 - - ansi-regex@5.0.1: {} - - ansi-regex@6.2.2: {} + '@parcel/watcher-android-arm64': 2.5.6 + '@parcel/watcher-darwin-arm64': 2.5.6 + '@parcel/watcher-darwin-x64': 2.5.6 + '@parcel/watcher-freebsd-x64': 2.5.6 + '@parcel/watcher-linux-arm-glibc': 2.5.6 + '@parcel/watcher-linux-arm-musl': 2.5.6 + '@parcel/watcher-linux-arm64-glibc': 2.5.6 + '@parcel/watcher-linux-arm64-musl': 2.5.6 + '@parcel/watcher-linux-x64-glibc': 2.5.6 + '@parcel/watcher-linux-x64-musl': 2.5.6 + '@parcel/watcher-win32-arm64': 2.5.6 + '@parcel/watcher-win32-ia32': 2.5.6 + '@parcel/watcher-win32-x64': 2.5.6 - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 + '@polka/url@1.0.0-next.29': {} - ansi-styles@6.2.3: {} + '@remix-run/assert@0.2.0': {} - anymatch@3.1.3: + '@remix-run/assets@0.3.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - arg@5.0.2: {} - - argparse@2.0.1: {} - - aria-query@5.3.2: {} - - array-iterate@2.0.1: {} - - assertion-error@2.0.1: {} - - astring@1.9.0: {} - - astro@6.0.6(@types/node@24.12.0)(jiti@2.6.1)(rollup@4.59.0)(typescript@5.9.3)(yaml@2.8.2): - dependencies: - '@astrojs/compiler': 3.0.1 - '@astrojs/internal-helpers': 0.8.0 - '@astrojs/markdown-remark': 7.0.1 - '@astrojs/telemetry': 3.3.0 - '@capsizecss/unpack': 4.0.0 - '@clack/prompts': 1.1.0 - '@oslojs/encoding': 1.1.0 - '@rollup/pluginutils': 5.3.0(rollup@4.59.0) - aria-query: 5.3.2 - axobject-query: 4.1.0 - ci-info: 4.4.0 - clsx: 2.1.1 - common-ancestor-path: 2.0.0 - cookie: 1.1.1 - devalue: 5.6.4 - diff: 8.0.3 - dlv: 1.1.3 - dset: 3.1.4 - es-module-lexer: 2.0.0 - esbuild: 0.27.4 - flattie: 1.1.1 - fontace: 0.4.1 - github-slugger: 2.0.0 - html-escaper: 3.0.3 - http-cache-semantics: 4.2.0 - js-yaml: 4.1.1 + '@oxc-project/runtime': 0.121.0 + '@remix-run/headers': 0.19.0 + '@remix-run/route-pattern': 0.20.1 + chokidar: 5.0.0 + es-module-lexer: 2.1.0 + get-tsconfig: 4.14.0 + lightningcss: 1.32.0 magic-string: 0.30.21 - magicast: 0.5.2 - mrmime: 2.0.1 - neotraverse: 0.6.18 - obug: 2.1.1 - p-limit: 7.3.0 - p-queue: 9.1.0 - package-manager-detector: 1.6.0 - piccolore: 0.1.3 - picomatch: 4.0.3 - rehype: 13.0.2 - semver: 7.7.4 - shiki: 4.0.2 - smol-toml: 1.6.0 - svgo: 4.0.1 - tinyclip: 0.1.12 - tinyexec: 1.0.4 - tinyglobby: 0.2.15 - tsconfck: 3.1.6(typescript@5.9.3) - ultrahtml: 1.6.0 - unifont: 0.7.4 - unist-util-visit: 5.1.0 - unstorage: 1.17.4 - vfile: 6.0.3 - vite: '@voidzero-dev/vite-plus-core@0.1.12(@types/node@24.12.0)(esbuild@0.27.4)(jiti@2.6.1)(typescript@5.9.3)(yaml@2.8.2)' - vitefu: 1.1.2(@voidzero-dev/vite-plus-core@0.1.12(@types/node@24.12.0)(esbuild@0.27.4)(jiti@2.6.1)(typescript@5.9.3)(yaml@2.8.2)) - xxhash-wasm: 1.1.0 - yargs-parser: 22.0.0 - zod: 4.3.6 - optionalDependencies: - sharp: 0.34.5 - transitivePeerDependencies: - - '@arethetypeswrong/core' - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@deno/kv' - - '@netlify/blobs' - - '@planetscale/database' - - '@tsdown/css' - - '@tsdown/exe' - - '@types/node' - - '@upstash/redis' - - '@vercel/blob' - - '@vercel/functions' - - '@vercel/kv' - - '@vitejs/devtools' - - aws4fetch - - db0 - - idb-keyval - - ioredis - - jiti - - less - - publint - - rollup - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - typescript - - unplugin-unused - - uploadthing - - yaml - - axobject-query@4.1.0: {} - - bail@2.0.2: {} - - boolbase@1.0.0: {} - - cac@6.7.14: {} - - ccount@2.0.1: {} - - chalk@5.6.2: {} - - character-entities-html4@2.1.0: {} - - character-entities-legacy@3.0.0: {} - - character-entities@2.0.2: {} - - character-reference-invalid@2.0.1: {} - - chart.js@4.5.1: - dependencies: - '@kurkle/color': 0.3.4 - - chokidar@4.0.3: - dependencies: - readdirp: 4.1.2 - - chokidar@5.0.0: - dependencies: - readdirp: 5.0.0 - - ci-info@4.4.0: {} - - cli-cursor@4.0.0: - dependencies: - restore-cursor: 4.0.0 - - cliui@8.0.1: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - clsx@2.1.1: {} - - collapse-white-space@2.1.0: {} - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - comma-separated-tokens@2.0.3: {} - - commander@11.1.0: {} - - common-ancestor-path@2.0.0: {} - - cookie-es@1.2.2: {} - - cookie@1.1.1: {} - - cross-spawn@7.0.6: - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - crossws@0.3.5: - dependencies: - uncrypto: 0.1.3 - - css-select@5.2.2: - dependencies: - boolbase: 1.0.0 - css-what: 6.2.2 - domhandler: 5.0.3 - domutils: 3.2.2 - nth-check: 2.1.1 - - css-tree@2.2.1: - dependencies: - mdn-data: 2.0.28 + oxc-minify: 0.121.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + oxc-parser: 0.121.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + oxc-resolver: 11.19.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + oxc-transform: 0.121.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + picomatch: 4.0.4 source-map-js: 1.2.1 + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' - css-tree@3.2.1: - dependencies: - mdn-data: 2.27.1 - source-map-js: 1.2.1 - - css-what@6.2.2: {} - - cssesc@3.0.0: {} - - csso@5.0.5: - dependencies: - css-tree: 2.2.1 - - debug@4.4.3: - dependencies: - ms: 2.1.3 - - decode-named-character-reference@1.3.0: - dependencies: - character-entities: 2.0.2 - - defu@6.1.4: {} - - dequal@2.0.3: {} - - destr@2.0.5: {} - - detect-libc@2.1.2: {} - - devalue@5.6.4: {} - - devlop@1.1.0: - dependencies: - dequal: 2.0.3 - - diff@8.0.3: {} - - dlv@1.1.3: {} - - dom-serializer@2.0.0: - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - entities: 4.5.0 - - domelementtype@2.3.0: {} - - domhandler@5.0.3: - dependencies: - domelementtype: 2.3.0 - - domutils@3.2.2: - dependencies: - dom-serializer: 2.0.0 - domelementtype: 2.3.0 - domhandler: 5.0.3 - - dset@3.1.4: {} - - eastasianwidth@0.2.0: {} - - emmet@2.4.11: - dependencies: - '@emmetio/abbreviation': 2.3.3 - '@emmetio/css-abbreviation': 2.1.8 - - emoji-regex@8.0.0: {} - - emoji-regex@9.2.2: {} - - enhanced-resolve@5.20.1: - dependencies: - graceful-fs: 4.2.11 - tapable: 2.3.0 - - entities@4.5.0: {} - - entities@6.0.1: {} - - environment@1.1.0: {} - - es-module-lexer@1.7.0: {} - - es-module-lexer@2.0.0: {} - - esast-util-from-estree@2.0.0: + '@remix-run/async-context-middleware@0.2.2': dependencies: - '@types/estree-jsx': 1.0.5 - devlop: 1.1.0 - estree-util-visit: 2.0.0 - unist-util-position-from-estree: 2.0.0 + '@remix-run/fetch-router': 0.18.2 - esast-util-from-js@2.0.1: + '@remix-run/auth-middleware@0.1.2': dependencies: - '@types/estree-jsx': 1.0.5 - acorn: 8.16.0 - esast-util-from-estree: 2.0.0 - vfile-message: 4.0.3 - - esbuild@0.27.4: - optionalDependencies: - '@esbuild/aix-ppc64': 0.27.4 - '@esbuild/android-arm': 0.27.4 - '@esbuild/android-arm64': 0.27.4 - '@esbuild/android-x64': 0.27.4 - '@esbuild/darwin-arm64': 0.27.4 - '@esbuild/darwin-x64': 0.27.4 - '@esbuild/freebsd-arm64': 0.27.4 - '@esbuild/freebsd-x64': 0.27.4 - '@esbuild/linux-arm': 0.27.4 - '@esbuild/linux-arm64': 0.27.4 - '@esbuild/linux-ia32': 0.27.4 - '@esbuild/linux-loong64': 0.27.4 - '@esbuild/linux-mips64el': 0.27.4 - '@esbuild/linux-ppc64': 0.27.4 - '@esbuild/linux-riscv64': 0.27.4 - '@esbuild/linux-s390x': 0.27.4 - '@esbuild/linux-x64': 0.27.4 - '@esbuild/netbsd-arm64': 0.27.4 - '@esbuild/netbsd-x64': 0.27.4 - '@esbuild/openbsd-arm64': 0.27.4 - '@esbuild/openbsd-x64': 0.27.4 - '@esbuild/openharmony-arm64': 0.27.4 - '@esbuild/sunos-x64': 0.27.4 - '@esbuild/win32-arm64': 0.27.4 - '@esbuild/win32-ia32': 0.27.4 - '@esbuild/win32-x64': 0.27.4 - - escalade@3.2.0: {} + '@remix-run/fetch-router': 0.18.2 + '@remix-run/session': 0.4.1 - escape-string-regexp@5.0.0: {} + '@remix-run/auth@0.2.1': + dependencies: + '@remix-run/fetch-router': 0.18.2 + '@remix-run/session': 0.4.1 - estree-util-attach-comments@3.0.0: + '@remix-run/cli@0.2.0': dependencies: - '@types/estree': 1.0.8 + '@remix-run/terminal': 0.1.0 + '@remix-run/test': 0.3.0 + semver: 7.7.4 + transitivePeerDependencies: + - playwright - estree-util-build-jsx@3.0.1: + '@remix-run/compression-middleware@0.1.7': dependencies: - '@types/estree-jsx': 1.0.5 - devlop: 1.1.0 - estree-util-is-identifier-name: 3.0.0 - estree-walker: 3.0.3 + '@remix-run/fetch-router': 0.18.2 + '@remix-run/mime': 0.4.1 + '@remix-run/response': 0.3.3 - estree-util-is-identifier-name@3.0.0: {} + '@remix-run/cookie@0.5.1': + dependencies: + '@remix-run/headers': 0.19.0 - estree-util-scope@1.0.0: + '@remix-run/cop-middleware@0.1.2': dependencies: - '@types/estree': 1.0.8 - devlop: 1.1.0 + '@remix-run/fetch-router': 0.18.2 - estree-util-to-js@2.0.0: + '@remix-run/cors-middleware@0.1.2': dependencies: - '@types/estree-jsx': 1.0.5 - astring: 1.9.0 - source-map: 0.7.6 + '@remix-run/fetch-router': 0.18.2 + '@remix-run/headers': 0.19.0 - estree-util-visit@2.0.0: + '@remix-run/csrf-middleware@0.1.2': dependencies: - '@types/estree-jsx': 1.0.5 - '@types/unist': 3.0.3 + '@remix-run/fetch-router': 0.18.2 + '@remix-run/session': 0.4.1 - estree-walker@2.0.2: {} + '@remix-run/data-schema@0.3.0': + dependencies: + '@standard-schema/spec': 1.1.0 - estree-walker@3.0.3: + '@remix-run/data-table-mysql@0.3.1': dependencies: - '@types/estree': 1.0.8 + '@remix-run/data-table': 0.2.1 - eventemitter3@5.0.4: {} + '@remix-run/data-table-postgres@0.3.1': + dependencies: + '@remix-run/data-table': 0.2.1 - extend@3.0.2: {} + '@remix-run/data-table-sqlite@0.4.1': + dependencies: + '@remix-run/data-table': 0.2.1 - fast-deep-equal@3.1.3: {} + '@remix-run/data-table@0.2.1': {} - fast-uri@3.1.0: {} + '@remix-run/fetch-proxy@0.8.0': + dependencies: + '@remix-run/headers': 0.19.0 - fast-xml-builder@1.1.4: + '@remix-run/fetch-router@0.18.2': dependencies: - path-expression-matcher: 1.1.3 + '@remix-run/route-pattern': 0.20.1 - fast-xml-parser@5.4.1: + '@remix-run/file-storage-s3@0.1.1': dependencies: - fast-xml-builder: 1.1.4 - strnum: 2.2.0 + '@remix-run/file-storage': 0.13.4 + aws4fetch: 1.0.20 - fdir@6.5.0(picomatch@4.0.3): - optionalDependencies: - picomatch: 4.0.3 + '@remix-run/file-storage@0.13.4': + dependencies: + '@remix-run/fs': 0.4.3 + '@remix-run/lazy-file': 5.0.3 - flattie@1.1.1: {} + '@remix-run/form-data-middleware@0.2.3': + dependencies: + '@remix-run/fetch-router': 0.18.2 + '@remix-run/form-data-parser': 0.17.0 - fontace@0.4.1: + '@remix-run/form-data-parser@0.17.0': dependencies: - fontkitten: 1.0.3 + '@remix-run/multipart-parser': 0.16.0 - fontkitten@1.0.3: + '@remix-run/fs@0.4.3': dependencies: - tiny-inflate: 1.0.3 + '@remix-run/lazy-file': 5.0.3 + '@remix-run/mime': 0.4.1 - fsevents@2.3.3: - optional: true + '@remix-run/headers@0.19.0': {} - get-caller-file@2.0.5: {} + '@remix-run/html-template@0.3.0': {} - github-slugger@2.0.0: {} + '@remix-run/lazy-file@5.0.3': + dependencies: + '@remix-run/mime': 0.4.1 - graceful-fs@4.2.11: {} + '@remix-run/logger-middleware@0.2.1': + dependencies: + '@remix-run/fetch-router': 0.18.2 + '@remix-run/terminal': 0.1.0 - h3@1.15.8: + '@remix-run/method-override-middleware@0.1.7': dependencies: - cookie-es: 1.2.2 - crossws: 0.3.5 - defu: 6.1.4 - destr: 2.0.5 - iron-webcrypto: 1.2.1 - node-mock-http: 1.0.4 - radix3: 1.1.2 - ufo: 1.6.3 - uncrypto: 0.1.3 + '@remix-run/fetch-router': 0.18.2 - has-flag@5.0.1: {} + '@remix-run/mime@0.4.1': {} - hast-util-from-html@2.0.3: + '@remix-run/multipart-parser@0.16.0': dependencies: - '@types/hast': 3.0.4 - devlop: 1.1.0 - hast-util-from-parse5: 8.0.3 - parse5: 7.3.0 - vfile: 6.0.3 - vfile-message: 4.0.3 + '@remix-run/headers': 0.19.0 - hast-util-from-parse5@8.0.3: - dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.3 - devlop: 1.1.0 - hastscript: 9.0.1 - property-information: 7.1.0 - vfile: 6.0.3 - vfile-location: 5.0.3 - web-namespaces: 2.0.1 + '@remix-run/node-fetch-server@0.13.1': {} - hast-util-is-element@3.0.0: - dependencies: - '@types/hast': 3.0.4 + '@remix-run/node-serve@0.1.0': + optionalDependencies: + uWebSockets.js: https://codeload.github.com/uNetworking/uWebSockets.js/tar.gz/a63031f40f76dc2422e8da736c04217053e9db2b - hast-util-parse-selector@4.0.0: + '@remix-run/response@0.3.3': dependencies: - '@types/hast': 3.0.4 + '@remix-run/headers': 0.19.0 + '@remix-run/html-template': 0.3.0 + '@remix-run/mime': 0.4.1 - hast-util-raw@9.1.0: - dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.3 - '@ungap/structured-clone': 1.3.0 - hast-util-from-parse5: 8.0.3 - hast-util-to-parse5: 8.0.1 - html-void-elements: 3.0.0 - mdast-util-to-hast: 13.2.1 - parse5: 7.3.0 - unist-util-position: 5.0.0 - unist-util-visit: 5.1.0 - vfile: 6.0.3 - web-namespaces: 2.0.1 - zwitch: 2.0.4 + '@remix-run/route-pattern@0.20.1': {} - hast-util-to-estree@3.1.3: + '@remix-run/session-middleware@0.2.2': dependencies: - '@types/estree': 1.0.8 - '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.4 - comma-separated-tokens: 2.0.3 - devlop: 1.1.0 - estree-util-attach-comments: 3.0.0 - estree-util-is-identifier-name: 3.0.0 - hast-util-whitespace: 3.0.0 - mdast-util-mdx-expression: 2.0.1 - mdast-util-mdx-jsx: 3.2.0 - mdast-util-mdxjs-esm: 2.0.1 - property-information: 7.1.0 - space-separated-tokens: 2.0.2 - style-to-js: 1.1.21 - unist-util-position: 5.0.0 - zwitch: 2.0.4 - transitivePeerDependencies: - - supports-color + '@remix-run/cookie': 0.5.1 + '@remix-run/fetch-router': 0.18.2 + '@remix-run/session': 0.4.1 - hast-util-to-html@9.0.5: + '@remix-run/session-storage-memcache@0.1.0': dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.3 - ccount: 2.0.1 - comma-separated-tokens: 2.0.3 - hast-util-whitespace: 3.0.0 - html-void-elements: 3.0.0 - mdast-util-to-hast: 13.2.1 - property-information: 7.1.0 - space-separated-tokens: 2.0.2 - stringify-entities: 4.0.4 - zwitch: 2.0.4 + '@remix-run/session': 0.4.1 - hast-util-to-jsx-runtime@2.3.6: + '@remix-run/session-storage-redis@0.1.0': dependencies: - '@types/estree': 1.0.8 - '@types/hast': 3.0.4 - '@types/unist': 3.0.3 - comma-separated-tokens: 2.0.3 - devlop: 1.1.0 - estree-util-is-identifier-name: 3.0.0 - hast-util-whitespace: 3.0.0 - mdast-util-mdx-expression: 2.0.1 - mdast-util-mdx-jsx: 3.2.0 - mdast-util-mdxjs-esm: 2.0.1 - property-information: 7.1.0 - space-separated-tokens: 2.0.2 - style-to-js: 1.1.21 - unist-util-position: 5.0.0 - vfile-message: 4.0.3 - transitivePeerDependencies: - - supports-color + '@remix-run/session': 0.4.1 - hast-util-to-parse5@8.0.1: - dependencies: - '@types/hast': 3.0.4 - comma-separated-tokens: 2.0.3 - devlop: 1.1.0 - property-information: 7.1.0 - space-separated-tokens: 2.0.2 - web-namespaces: 2.0.1 - zwitch: 2.0.4 + '@remix-run/session@0.4.1': {} - hast-util-to-text@4.0.2: + '@remix-run/static-middleware@0.4.8': dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.3 - hast-util-is-element: 3.0.0 - unist-util-find-after: 5.0.0 + '@remix-run/fetch-router': 0.18.2 + '@remix-run/fs': 0.4.3 + '@remix-run/html-template': 0.3.0 + '@remix-run/mime': 0.4.1 + '@remix-run/response': 0.3.3 + + '@remix-run/tar-parser@0.7.1': {} - hast-util-whitespace@3.0.0: + '@remix-run/terminal@0.1.0': {} + + '@remix-run/test@0.3.0': dependencies: - '@types/hast': 3.0.4 + '@remix-run/terminal': 0.1.0 + es-module-lexer: 2.1.0 + esbuild: 0.27.7 + get-tsconfig: 4.14.0 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-reports: 3.2.0 + magic-string: 0.30.21 + source-map-js: 1.2.1 + tsx: 4.21.0 + v8-to-istanbul: 9.3.0 - hastscript@9.0.1: + '@remix-run/ui@0.1.1': dependencies: - '@types/hast': 3.0.4 - comma-separated-tokens: 2.0.3 - hast-util-parse-selector: 4.0.0 - property-information: 7.1.0 - space-separated-tokens: 2.0.2 + '@types/dom-navigation': 1.0.7 - html-escaper@3.0.3: {} + '@rolldown/binding-android-arm64@1.0.0-rc.17': + optional: true - html-void-elements@3.0.0: {} + '@rolldown/binding-darwin-arm64@1.0.0-rc.17': + optional: true - http-cache-semantics@4.2.0: {} + '@rolldown/binding-darwin-x64@1.0.0-rc.17': + optional: true - inline-style-parser@0.2.7: {} + '@rolldown/binding-freebsd-x64@1.0.0-rc.17': + optional: true - iron-webcrypto@1.2.1: {} + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.17': + optional: true - is-alphabetical@2.0.1: {} + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.17': + optional: true - is-alphanumerical@2.0.1: - dependencies: - is-alphabetical: 2.0.1 - is-decimal: 2.0.1 + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.17': + optional: true - is-decimal@2.0.1: {} + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.17': + optional: true - is-docker@3.0.0: {} + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.17': + optional: true - is-fullwidth-code-point@3.0.0: {} + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.17': + optional: true - is-fullwidth-code-point@4.0.0: {} + '@rolldown/binding-linux-x64-musl@1.0.0-rc.17': + optional: true - is-hexadecimal@2.0.1: {} + '@rolldown/binding-openharmony-arm64@1.0.0-rc.17': + optional: true - is-inside-container@1.0.0: + '@rolldown/binding-wasm32-wasi@1.0.0-rc.17': dependencies: - is-docker: 3.0.0 + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + optional: true - is-plain-obj@4.1.0: {} + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.17': + optional: true - is-wsl@3.1.1: - dependencies: - is-inside-container: 1.0.0 + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.17': + optional: true - isexe@2.0.0: {} + '@rolldown/pluginutils@1.0.0-rc.17': {} - jiti@2.6.1: {} + '@standard-schema/spec@1.1.0': {} - js-yaml@4.1.1: + '@tailwindcss/cli@4.2.4': dependencies: - argparse: 2.0.1 - - json-schema-traverse@1.0.0: {} - - jsonc-parser@2.3.1: {} + '@parcel/watcher': 2.5.6 + '@tailwindcss/node': 4.2.4 + '@tailwindcss/oxide': 4.2.4 + enhanced-resolve: 5.21.0 + mri: 1.2.0 + picocolors: 1.1.1 + tailwindcss: 4.2.4 - jsonc-parser@3.3.1: {} + '@tailwindcss/node@4.2.4': + dependencies: + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.21.0 + jiti: 2.6.1 + lightningcss: 1.32.0 + magic-string: 0.30.21 + source-map-js: 1.2.1 + tailwindcss: 4.2.4 - kleur@4.1.5: {} + '@tailwindcss/oxide-android-arm64@4.2.4': + optional: true - lightningcss-android-arm64@1.32.0: + '@tailwindcss/oxide-darwin-arm64@4.2.4': optional: true - lightningcss-darwin-arm64@1.32.0: + '@tailwindcss/oxide-darwin-x64@4.2.4': optional: true - lightningcss-darwin-x64@1.32.0: + '@tailwindcss/oxide-freebsd-x64@4.2.4': optional: true - lightningcss-freebsd-x64@1.32.0: + '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.4': optional: true - lightningcss-linux-arm-gnueabihf@1.32.0: + '@tailwindcss/oxide-linux-arm64-gnu@4.2.4': optional: true - lightningcss-linux-arm64-gnu@1.32.0: + '@tailwindcss/oxide-linux-arm64-musl@4.2.4': optional: true - lightningcss-linux-arm64-musl@1.32.0: + '@tailwindcss/oxide-linux-x64-gnu@4.2.4': optional: true - lightningcss-linux-x64-gnu@1.32.0: + '@tailwindcss/oxide-linux-x64-musl@4.2.4': optional: true - lightningcss-linux-x64-musl@1.32.0: + '@tailwindcss/oxide-wasm32-wasi@4.2.4': optional: true - lightningcss-win32-arm64-msvc@1.32.0: + '@tailwindcss/oxide-win32-arm64-msvc@4.2.4': optional: true - lightningcss-win32-x64-msvc@1.32.0: + '@tailwindcss/oxide-win32-x64-msvc@4.2.4': optional: true - lightningcss@1.32.0: - dependencies: - detect-libc: 2.1.2 + '@tailwindcss/oxide@4.2.4': 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 - - log-update@5.0.1: + '@tailwindcss/oxide-android-arm64': 4.2.4 + '@tailwindcss/oxide-darwin-arm64': 4.2.4 + '@tailwindcss/oxide-darwin-x64': 4.2.4 + '@tailwindcss/oxide-freebsd-x64': 4.2.4 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.2.4 + '@tailwindcss/oxide-linux-arm64-gnu': 4.2.4 + '@tailwindcss/oxide-linux-arm64-musl': 4.2.4 + '@tailwindcss/oxide-linux-x64-gnu': 4.2.4 + '@tailwindcss/oxide-linux-x64-musl': 4.2.4 + '@tailwindcss/oxide-wasm32-wasi': 4.2.4 + '@tailwindcss/oxide-win32-arm64-msvc': 4.2.4 + '@tailwindcss/oxide-win32-x64-msvc': 4.2.4 + + '@tybys/wasm-util@0.10.1': dependencies: - ansi-escapes: 5.0.0 - cli-cursor: 4.0.0 - slice-ansi: 5.0.0 - strip-ansi: 7.2.0 - wrap-ansi: 8.1.0 + tslib: 2.8.1 + optional: true - longest-streak@3.1.0: {} + '@types/chai@5.2.3': + dependencies: + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 - lru-cache@11.2.7: {} + '@types/deep-eql@4.0.2': {} - magic-string@0.30.21: - dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 + '@types/dom-navigation@1.0.7': {} - magicast@0.5.2: - dependencies: - '@babel/parser': 7.29.2 - '@babel/types': 7.29.0 - source-map-js: 1.2.1 + '@types/esrecurse@4.3.1': {} - markdown-extensions@2.0.0: {} + '@types/estree@1.0.8': {} - markdown-table@3.0.4: {} + '@types/istanbul-lib-coverage@2.0.6': {} - mdast-util-definitions@6.0.0: - dependencies: - '@types/mdast': 4.0.4 - '@types/unist': 3.0.3 - unist-util-visit: 5.1.0 + '@types/json-schema@7.0.15': {} - mdast-util-find-and-replace@3.0.2: + '@types/node@25.6.0': dependencies: - '@types/mdast': 4.0.4 - escape-string-regexp: 5.0.0 - unist-util-is: 6.0.1 - unist-util-visit-parents: 6.0.2 + undici-types: 7.19.2 - mdast-util-from-markdown@2.0.3: + '@typescript-eslint/project-service@8.59.1(typescript@6.0.3)': dependencies: - '@types/mdast': 4.0.4 - '@types/unist': 3.0.3 - decode-named-character-reference: 1.3.0 - devlop: 1.1.0 - mdast-util-to-string: 4.0.0 - micromark: 4.0.2 - micromark-util-decode-numeric-character-reference: 2.0.2 - micromark-util-decode-string: 2.0.1 - micromark-util-normalize-identifier: 2.0.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - unist-util-stringify-position: 4.0.0 + '@typescript-eslint/tsconfig-utils': 8.59.1(typescript@6.0.3) + '@typescript-eslint/types': 8.59.1 + debug: 4.4.3 + typescript: 6.0.3 transitivePeerDependencies: - supports-color - mdast-util-gfm-autolink-literal@2.0.1: + '@typescript-eslint/scope-manager@8.59.1': dependencies: - '@types/mdast': 4.0.4 - ccount: 2.0.1 - devlop: 1.1.0 - mdast-util-find-and-replace: 3.0.2 - micromark-util-character: 2.1.1 + '@typescript-eslint/types': 8.59.1 + '@typescript-eslint/visitor-keys': 8.59.1 - mdast-util-gfm-footnote@2.1.0: + '@typescript-eslint/tsconfig-utils@8.59.1(typescript@6.0.3)': dependencies: - '@types/mdast': 4.0.4 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.3 - mdast-util-to-markdown: 2.1.2 - micromark-util-normalize-identifier: 2.0.1 - transitivePeerDependencies: - - supports-color + typescript: 6.0.3 - mdast-util-gfm-strikethrough@2.0.0: - dependencies: - '@types/mdast': 4.0.4 - mdast-util-from-markdown: 2.0.3 - mdast-util-to-markdown: 2.1.2 - transitivePeerDependencies: - - supports-color + '@typescript-eslint/types@8.59.1': {} - mdast-util-gfm-table@2.0.0: + '@typescript-eslint/typescript-estree@8.59.1(typescript@6.0.3)': dependencies: - '@types/mdast': 4.0.4 - devlop: 1.1.0 - markdown-table: 3.0.4 - mdast-util-from-markdown: 2.0.3 - mdast-util-to-markdown: 2.1.2 + '@typescript-eslint/project-service': 8.59.1(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.59.1(typescript@6.0.3) + '@typescript-eslint/types': 8.59.1 + '@typescript-eslint/visitor-keys': 8.59.1 + debug: 4.4.3 + minimatch: 10.2.5 + semver: 7.7.4 + tinyglobby: 0.2.16 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 transitivePeerDependencies: - supports-color - mdast-util-gfm-task-list-item@2.0.0: + '@typescript-eslint/utils@8.59.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3)': dependencies: - '@types/mdast': 4.0.4 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.3 - mdast-util-to-markdown: 2.1.2 + '@eslint-community/eslint-utils': 4.9.1(eslint@10.3.0(jiti@2.6.1)) + '@typescript-eslint/scope-manager': 8.59.1 + '@typescript-eslint/types': 8.59.1 + '@typescript-eslint/typescript-estree': 8.59.1(typescript@6.0.3) + eslint: 10.3.0(jiti@2.6.1) + typescript: 6.0.3 transitivePeerDependencies: - supports-color - mdast-util-gfm@3.1.0: + '@typescript-eslint/visitor-keys@8.59.1': dependencies: - mdast-util-from-markdown: 2.0.3 - mdast-util-gfm-autolink-literal: 2.0.1 - mdast-util-gfm-footnote: 2.1.0 - mdast-util-gfm-strikethrough: 2.0.0 - mdast-util-gfm-table: 2.0.0 - mdast-util-gfm-task-list-item: 2.0.0 - mdast-util-to-markdown: 2.1.2 - transitivePeerDependencies: - - supports-color + '@typescript-eslint/types': 8.59.1 + eslint-visitor-keys: 5.0.1 - mdast-util-mdx-expression@2.0.1: - dependencies: - '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.4 - '@types/mdast': 4.0.4 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.3 - mdast-util-to-markdown: 2.1.2 - transitivePeerDependencies: - - supports-color + '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260501.1': + optional: true - mdast-util-mdx-jsx@3.2.0: - dependencies: - '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.4 - '@types/mdast': 4.0.4 - '@types/unist': 3.0.3 - ccount: 2.0.1 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.3 - mdast-util-to-markdown: 2.1.2 - parse-entities: 4.0.2 - stringify-entities: 4.0.4 - unist-util-stringify-position: 4.0.0 - vfile-message: 4.0.3 - transitivePeerDependencies: - - supports-color + '@typescript/native-preview-darwin-x64@7.0.0-dev.20260501.1': + optional: true - mdast-util-mdx@3.0.0: - dependencies: - mdast-util-from-markdown: 2.0.3 - mdast-util-mdx-expression: 2.0.1 - mdast-util-mdx-jsx: 3.2.0 - mdast-util-mdxjs-esm: 2.0.1 - mdast-util-to-markdown: 2.1.2 - transitivePeerDependencies: - - supports-color + '@typescript/native-preview-linux-arm64@7.0.0-dev.20260501.1': + optional: true - mdast-util-mdxjs-esm@2.0.1: - dependencies: - '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.4 - '@types/mdast': 4.0.4 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.3 - mdast-util-to-markdown: 2.1.2 - transitivePeerDependencies: - - supports-color + '@typescript/native-preview-linux-arm@7.0.0-dev.20260501.1': + optional: true - mdast-util-phrasing@4.1.0: - dependencies: - '@types/mdast': 4.0.4 - unist-util-is: 6.0.1 + '@typescript/native-preview-linux-x64@7.0.0-dev.20260501.1': + optional: true - mdast-util-to-hast@13.2.1: - dependencies: - '@types/hast': 3.0.4 - '@types/mdast': 4.0.4 - '@ungap/structured-clone': 1.3.0 - devlop: 1.1.0 - micromark-util-sanitize-uri: 2.0.1 - trim-lines: 3.0.1 - unist-util-position: 5.0.0 - unist-util-visit: 5.1.0 - vfile: 6.0.3 - - mdast-util-to-markdown@2.1.2: - dependencies: - '@types/mdast': 4.0.4 - '@types/unist': 3.0.3 - longest-streak: 3.1.0 - mdast-util-phrasing: 4.1.0 - mdast-util-to-string: 4.0.0 - micromark-util-classify-character: 2.0.1 - micromark-util-decode-string: 2.0.1 - unist-util-visit: 5.1.0 - zwitch: 2.0.4 - - mdast-util-to-string@4.0.0: - dependencies: - '@types/mdast': 4.0.4 - - mdn-data@2.0.28: {} - - mdn-data@2.27.1: {} - - micromark-core-commonmark@2.0.3: - dependencies: - decode-named-character-reference: 1.3.0 - devlop: 1.1.0 - micromark-factory-destination: 2.0.1 - micromark-factory-label: 2.0.1 - micromark-factory-space: 2.0.1 - micromark-factory-title: 2.0.1 - micromark-factory-whitespace: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-chunked: 2.0.1 - micromark-util-classify-character: 2.0.1 - micromark-util-html-tag-name: 2.0.1 - micromark-util-normalize-identifier: 2.0.1 - micromark-util-resolve-all: 2.0.1 - micromark-util-subtokenize: 2.1.0 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-extension-gfm-autolink-literal@2.1.0: - dependencies: - micromark-util-character: 2.1.1 - micromark-util-sanitize-uri: 2.0.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-extension-gfm-footnote@2.1.0: - dependencies: - devlop: 1.1.0 - micromark-core-commonmark: 2.0.3 - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-normalize-identifier: 2.0.1 - micromark-util-sanitize-uri: 2.0.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-extension-gfm-strikethrough@2.1.0: - dependencies: - devlop: 1.1.0 - micromark-util-chunked: 2.0.1 - micromark-util-classify-character: 2.0.1 - micromark-util-resolve-all: 2.0.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-extension-gfm-table@2.1.1: - dependencies: - devlop: 1.1.0 - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-extension-gfm-tagfilter@2.0.0: - dependencies: - micromark-util-types: 2.0.2 - - micromark-extension-gfm-task-list-item@2.1.0: - dependencies: - devlop: 1.1.0 - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-extension-gfm@3.0.0: - dependencies: - micromark-extension-gfm-autolink-literal: 2.1.0 - micromark-extension-gfm-footnote: 2.1.0 - micromark-extension-gfm-strikethrough: 2.1.0 - micromark-extension-gfm-table: 2.1.1 - micromark-extension-gfm-tagfilter: 2.0.0 - micromark-extension-gfm-task-list-item: 2.1.0 - micromark-util-combine-extensions: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-extension-mdx-expression@3.0.1: - dependencies: - '@types/estree': 1.0.8 - devlop: 1.1.0 - micromark-factory-mdx-expression: 2.0.3 - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-events-to-acorn: 2.0.3 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 + '@typescript/native-preview-win32-arm64@7.0.0-dev.20260501.1': + optional: true - micromark-extension-mdx-jsx@3.0.2: - dependencies: - '@types/estree': 1.0.8 - devlop: 1.1.0 - estree-util-is-identifier-name: 3.0.0 - micromark-factory-mdx-expression: 2.0.3 - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-events-to-acorn: 2.0.3 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - vfile-message: 4.0.3 + '@typescript/native-preview-win32-x64@7.0.0-dev.20260501.1': + optional: true - micromark-extension-mdx-md@2.0.0: - dependencies: - micromark-util-types: 2.0.2 + '@typescript/native-preview@7.0.0-dev.20260501.1': + optionalDependencies: + '@typescript/native-preview-darwin-arm64': 7.0.0-dev.20260501.1 + '@typescript/native-preview-darwin-x64': 7.0.0-dev.20260501.1 + '@typescript/native-preview-linux-arm': 7.0.0-dev.20260501.1 + '@typescript/native-preview-linux-arm64': 7.0.0-dev.20260501.1 + '@typescript/native-preview-linux-x64': 7.0.0-dev.20260501.1 + '@typescript/native-preview-win32-arm64': 7.0.0-dev.20260501.1 + '@typescript/native-preview-win32-x64': 7.0.0-dev.20260501.1 + + '@voidzero-dev/vite-plus-core@0.1.20(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(typescript@6.0.3)': + dependencies: + '@oxc-project/runtime': 0.127.0 + '@oxc-project/types': 0.127.0 + lightningcss: 1.32.0 + postcss: 8.5.13 + optionalDependencies: + '@types/node': 25.6.0 + esbuild: 0.27.7 + fsevents: 2.3.3 + jiti: 2.6.1 + tsx: 4.21.0 + typescript: 6.0.3 - micromark-extension-mdxjs-esm@3.0.0: - dependencies: - '@types/estree': 1.0.8 - devlop: 1.1.0 - micromark-core-commonmark: 2.0.3 - micromark-util-character: 2.1.1 - micromark-util-events-to-acorn: 2.0.3 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - unist-util-position-from-estree: 2.0.0 - vfile-message: 4.0.3 + '@voidzero-dev/vite-plus-darwin-arm64@0.1.20': + optional: true - micromark-extension-mdxjs@3.0.0: - dependencies: - acorn: 8.16.0 - acorn-jsx: 5.3.2(acorn@8.16.0) - micromark-extension-mdx-expression: 3.0.1 - micromark-extension-mdx-jsx: 3.0.2 - micromark-extension-mdx-md: 2.0.0 - micromark-extension-mdxjs-esm: 3.0.0 - micromark-util-combine-extensions: 2.0.1 - micromark-util-types: 2.0.2 + '@voidzero-dev/vite-plus-darwin-x64@0.1.20': + optional: true - micromark-factory-destination@2.0.1: - dependencies: - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 + '@voidzero-dev/vite-plus-linux-arm64-gnu@0.1.20': + optional: true - micromark-factory-label@2.0.1: - dependencies: - devlop: 1.1.0 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 + '@voidzero-dev/vite-plus-linux-arm64-musl@0.1.20': + optional: true - micromark-factory-mdx-expression@2.0.3: - dependencies: - '@types/estree': 1.0.8 - devlop: 1.1.0 - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-events-to-acorn: 2.0.3 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - unist-util-position-from-estree: 2.0.0 - vfile-message: 4.0.3 + '@voidzero-dev/vite-plus-linux-x64-gnu@0.1.20': + optional: true - micromark-factory-space@2.0.1: - dependencies: - micromark-util-character: 2.1.1 - micromark-util-types: 2.0.2 + '@voidzero-dev/vite-plus-linux-x64-musl@0.1.20': + optional: true - micromark-factory-title@2.0.1: + '@voidzero-dev/vite-plus-test@0.1.20(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(typescript@6.0.3)(vite@8.0.10(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0))': dependencies: - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 + '@standard-schema/spec': 1.1.0 + '@types/chai': 5.2.3 + '@voidzero-dev/vite-plus-core': 0.1.20(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(typescript@6.0.3) + es-module-lexer: 1.7.0 + obug: 2.1.1 + pixelmatch: 7.2.0 + pngjs: 7.0.0 + sirv: 3.0.2 + std-env: 4.1.0 + tinybench: 2.9.0 + tinyexec: 1.1.2 + tinyglobby: 0.2.16 + vite: 8.0.10(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0) + ws: 8.20.0 + optionalDependencies: + '@types/node': 25.6.0 + transitivePeerDependencies: + - '@arethetypeswrong/core' + - '@tsdown/css' + - '@tsdown/exe' + - '@vitejs/devtools' + - bufferutil + - esbuild + - jiti + - less + - publint + - sass + - sass-embedded + - stylus + - sugarss + - terser + - tsx + - typescript + - unplugin-unused + - utf-8-validate + - yaml - micromark-factory-whitespace@2.0.1: - dependencies: - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 + '@voidzero-dev/vite-plus-win32-arm64-msvc@0.1.20': + optional: true - micromark-util-character@2.1.1: - dependencies: - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 + '@voidzero-dev/vite-plus-win32-x64-msvc@0.1.20': + optional: true - micromark-util-chunked@2.0.1: + acorn-jsx@5.3.2(acorn@8.16.0): dependencies: - micromark-util-symbol: 2.0.1 + acorn: 8.16.0 - micromark-util-classify-character@2.0.1: - dependencies: - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 + acorn@8.16.0: {} - micromark-util-combine-extensions@2.0.1: + ajv@6.15.0: dependencies: - micromark-util-chunked: 2.0.1 - micromark-util-types: 2.0.2 + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 - micromark-util-decode-numeric-character-reference@2.0.2: - dependencies: - micromark-util-symbol: 2.0.1 + ansi-styles@6.2.3: {} - micromark-util-decode-string@2.0.1: - dependencies: - decode-named-character-reference: 1.3.0 - micromark-util-character: 2.1.1 - micromark-util-decode-numeric-character-reference: 2.0.2 - micromark-util-symbol: 2.0.1 + assertion-error@2.0.1: {} - micromark-util-encode@2.0.1: {} + aws4fetch@1.0.20: {} - micromark-util-events-to-acorn@2.0.3: - dependencies: - '@types/estree': 1.0.8 - '@types/unist': 3.0.3 - devlop: 1.1.0 - estree-util-visit: 2.0.0 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - vfile-message: 4.0.3 + balanced-match@4.0.4: {} - micromark-util-html-tag-name@2.0.1: {} + baseline-browser-mapping@2.10.25: {} - micromark-util-normalize-identifier@2.0.1: + brace-expansion@5.0.5: dependencies: - micromark-util-symbol: 2.0.1 + balanced-match: 4.0.4 - micromark-util-resolve-all@2.0.1: + browserslist@4.28.2: dependencies: - micromark-util-types: 2.0.2 + baseline-browser-mapping: 2.10.25 + caniuse-lite: 1.0.30001791 + electron-to-chromium: 1.5.348 + node-releases: 2.0.38 + update-browserslist-db: 1.2.3(browserslist@4.28.2) - micromark-util-sanitize-uri@2.0.1: - dependencies: - micromark-util-character: 2.1.1 - micromark-util-encode: 2.0.1 - micromark-util-symbol: 2.0.1 + caniuse-lite@1.0.30001791: {} - micromark-util-subtokenize@2.1.0: + chokidar@5.0.0: dependencies: - devlop: 1.1.0 - micromark-util-chunked: 2.0.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-util-symbol@2.0.1: {} + readdirp: 5.0.0 - micromark-util-types@2.0.2: {} + convert-source-map@2.0.0: {} - micromark@4.0.2: + cross-spawn@7.0.6: dependencies: - '@types/debug': 4.1.12 - debug: 4.4.3 - decode-named-character-reference: 1.3.0 - devlop: 1.1.0 - micromark-core-commonmark: 2.0.3 - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-chunked: 2.0.1 - micromark-util-combine-extensions: 2.0.1 - micromark-util-decode-numeric-character-reference: 2.0.2 - micromark-util-encode: 2.0.1 - micromark-util-normalize-identifier: 2.0.1 - micromark-util-resolve-all: 2.0.1 - micromark-util-sanitize-uri: 2.0.1 - micromark-util-subtokenize: 2.1.0 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - transitivePeerDependencies: - - supports-color - - mimic-fn@2.1.0: {} - - mrmime@2.0.1: {} + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 - ms@2.1.3: {} + debug@4.4.3: + dependencies: + ms: 2.1.3 - muggle-string@0.4.1: {} + deep-is@0.1.4: {} - nanoid@3.3.11: {} + detect-libc@2.1.2: {} - neotraverse@0.6.18: {} + electron-to-chromium@1.5.348: {} - nlcst-to-string@4.0.0: + enhanced-resolve@5.21.0: dependencies: - '@types/nlcst': 2.0.3 - - node-fetch-native@1.6.7: {} + graceful-fs: 4.2.11 + tapable: 2.3.3 - node-mock-http@1.0.4: {} + es-module-lexer@1.7.0: {} - normalize-path@3.0.0: {} + es-module-lexer@2.1.0: {} - nth-check@2.1.1: - dependencies: - boolbase: 1.0.0 + esbuild@0.27.7: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.7 + '@esbuild/android-arm': 0.27.7 + '@esbuild/android-arm64': 0.27.7 + '@esbuild/android-x64': 0.27.7 + '@esbuild/darwin-arm64': 0.27.7 + '@esbuild/darwin-x64': 0.27.7 + '@esbuild/freebsd-arm64': 0.27.7 + '@esbuild/freebsd-x64': 0.27.7 + '@esbuild/linux-arm': 0.27.7 + '@esbuild/linux-arm64': 0.27.7 + '@esbuild/linux-ia32': 0.27.7 + '@esbuild/linux-loong64': 0.27.7 + '@esbuild/linux-mips64el': 0.27.7 + '@esbuild/linux-ppc64': 0.27.7 + '@esbuild/linux-riscv64': 0.27.7 + '@esbuild/linux-s390x': 0.27.7 + '@esbuild/linux-x64': 0.27.7 + '@esbuild/netbsd-arm64': 0.27.7 + '@esbuild/netbsd-x64': 0.27.7 + '@esbuild/openbsd-arm64': 0.27.7 + '@esbuild/openbsd-x64': 0.27.7 + '@esbuild/openharmony-arm64': 0.27.7 + '@esbuild/sunos-x64': 0.27.7 + '@esbuild/win32-arm64': 0.27.7 + '@esbuild/win32-ia32': 0.27.7 + '@esbuild/win32-x64': 0.27.7 - obug@2.1.1: {} + escalade@3.2.0: {} - ofetch@1.5.1: - dependencies: - destr: 2.0.5 - node-fetch-native: 1.6.7 - ufo: 1.6.3 + escape-string-regexp@4.0.0: {} - ohash@2.0.11: {} + eslint-plugin-no-only-tests@3.4.0: {} - onetime@5.1.2: + eslint-plugin-perfectionist@5.9.0(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3): dependencies: - mimic-fn: 2.1.0 - - oniguruma-parser@0.12.1: {} + '@typescript-eslint/utils': 8.59.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) + eslint: 10.3.0(jiti@2.6.1) + natural-orderby: 5.0.0 + transitivePeerDependencies: + - supports-color + - typescript - oniguruma-to-es@4.3.5: + eslint-plugin-react-hooks@7.1.1(eslint@10.3.0(jiti@2.6.1)): dependencies: - oniguruma-parser: 0.12.1 - regex: 6.1.0 - regex-recursion: 6.0.2 + '@babel/core': 7.29.0 + '@babel/parser': 7.29.3 + eslint: 10.3.0(jiti@2.6.1) + hermes-parser: 0.25.1 + zod: 4.4.1 + zod-validation-error: 4.0.2(zod@4.4.1) + transitivePeerDependencies: + - supports-color - oxfmt@0.40.0: + eslint-plugin-unused-imports@4.4.1(eslint@10.3.0(jiti@2.6.1)): dependencies: - tinypool: 2.1.0 - optionalDependencies: - '@oxfmt/binding-android-arm-eabi': 0.40.0 - '@oxfmt/binding-android-arm64': 0.40.0 - '@oxfmt/binding-darwin-arm64': 0.40.0 - '@oxfmt/binding-darwin-x64': 0.40.0 - '@oxfmt/binding-freebsd-x64': 0.40.0 - '@oxfmt/binding-linux-arm-gnueabihf': 0.40.0 - '@oxfmt/binding-linux-arm-musleabihf': 0.40.0 - '@oxfmt/binding-linux-arm64-gnu': 0.40.0 - '@oxfmt/binding-linux-arm64-musl': 0.40.0 - '@oxfmt/binding-linux-ppc64-gnu': 0.40.0 - '@oxfmt/binding-linux-riscv64-gnu': 0.40.0 - '@oxfmt/binding-linux-riscv64-musl': 0.40.0 - '@oxfmt/binding-linux-s390x-gnu': 0.40.0 - '@oxfmt/binding-linux-x64-gnu': 0.40.0 - '@oxfmt/binding-linux-x64-musl': 0.40.0 - '@oxfmt/binding-openharmony-arm64': 0.40.0 - '@oxfmt/binding-win32-arm64-msvc': 0.40.0 - '@oxfmt/binding-win32-ia32-msvc': 0.40.0 - '@oxfmt/binding-win32-x64-msvc': 0.40.0 - - oxlint-tsgolint@0.17.0: - optionalDependencies: - '@oxlint-tsgolint/darwin-arm64': 0.17.0 - '@oxlint-tsgolint/darwin-x64': 0.17.0 - '@oxlint-tsgolint/linux-arm64': 0.17.0 - '@oxlint-tsgolint/linux-x64': 0.17.0 - '@oxlint-tsgolint/win32-arm64': 0.17.0 - '@oxlint-tsgolint/win32-x64': 0.17.0 - - oxlint@1.55.0(oxlint-tsgolint@0.17.0): - optionalDependencies: - '@oxlint/binding-android-arm-eabi': 1.55.0 - '@oxlint/binding-android-arm64': 1.55.0 - '@oxlint/binding-darwin-arm64': 1.55.0 - '@oxlint/binding-darwin-x64': 1.55.0 - '@oxlint/binding-freebsd-x64': 1.55.0 - '@oxlint/binding-linux-arm-gnueabihf': 1.55.0 - '@oxlint/binding-linux-arm-musleabihf': 1.55.0 - '@oxlint/binding-linux-arm64-gnu': 1.55.0 - '@oxlint/binding-linux-arm64-musl': 1.55.0 - '@oxlint/binding-linux-ppc64-gnu': 1.55.0 - '@oxlint/binding-linux-riscv64-gnu': 1.55.0 - '@oxlint/binding-linux-riscv64-musl': 1.55.0 - '@oxlint/binding-linux-s390x-gnu': 1.55.0 - '@oxlint/binding-linux-x64-gnu': 1.55.0 - '@oxlint/binding-linux-x64-musl': 1.55.0 - '@oxlint/binding-openharmony-arm64': 1.55.0 - '@oxlint/binding-win32-arm64-msvc': 1.55.0 - '@oxlint/binding-win32-ia32-msvc': 1.55.0 - '@oxlint/binding-win32-x64-msvc': 1.55.0 - oxlint-tsgolint: 0.17.0 + eslint: 10.3.0(jiti@2.6.1) - p-limit@7.3.0: + eslint-scope@9.1.2: dependencies: - yocto-queue: 1.2.2 + '@types/esrecurse': 4.3.1 + '@types/estree': 1.0.8 + esrecurse: 4.3.0 + estraverse: 5.3.0 - p-queue@9.1.0: - dependencies: - eventemitter3: 5.0.4 - p-timeout: 7.0.1 + eslint-visitor-keys@3.4.3: {} - p-timeout@7.0.1: {} + eslint-visitor-keys@5.0.1: {} - package-manager-detector@1.6.0: {} + eslint@10.3.0(jiti@2.6.1): + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@10.3.0(jiti@2.6.1)) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.23.5 + '@eslint/config-helpers': 0.5.5 + '@eslint/core': 1.2.1 + '@eslint/plugin-kit': 0.7.1 + '@humanfs/node': 0.16.8 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 + ajv: 6.15.0 + cross-spawn: 7.0.6 + debug: 4.4.3 + escape-string-regexp: 4.0.0 + eslint-scope: 9.1.2 + eslint-visitor-keys: 5.0.1 + espree: 11.2.0 + esquery: 1.7.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + minimatch: 10.2.5 + natural-compare: 1.4.0 + optionator: 0.9.4 + optionalDependencies: + jiti: 2.6.1 + transitivePeerDependencies: + - supports-color - parse-entities@4.0.2: + espree@11.2.0: dependencies: - '@types/unist': 2.0.11 - character-entities-legacy: 3.0.0 - character-reference-invalid: 2.0.1 - decode-named-character-reference: 1.3.0 - is-alphanumerical: 2.0.1 - is-decimal: 2.0.1 - is-hexadecimal: 2.0.1 + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) + eslint-visitor-keys: 5.0.1 - parse-latin@7.0.0: + esquery@1.7.0: dependencies: - '@types/nlcst': 2.0.3 - '@types/unist': 3.0.3 - nlcst-to-string: 4.0.0 - unist-util-modify-children: 4.0.0 - unist-util-visit-children: 3.0.0 - vfile: 6.0.3 + estraverse: 5.3.0 - parse5@7.3.0: + esrecurse@4.3.0: dependencies: - entities: 6.0.1 - - path-browserify@1.0.1: {} + estraverse: 5.3.0 - path-expression-matcher@1.1.3: {} + estraverse@5.3.0: {} - path-key@3.1.1: {} - - piccolore@0.1.3: {} - - picocolors@1.1.1: {} + esutils@2.0.3: {} - picomatch@2.3.1: {} + fast-deep-equal@3.1.3: {} - picomatch@4.0.3: {} + fast-json-stable-stringify@2.1.0: {} - pixelmatch@7.1.0: - dependencies: - pngjs: 7.0.0 + fast-levenshtein@2.0.6: {} - pngjs@7.0.0: {} + fdir@6.5.0(picomatch@4.0.4): + optionalDependencies: + picomatch: 4.0.4 - postcss-selector-parser@6.0.10: + file-entry-cache@8.0.0: dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 + flat-cache: 4.0.1 - postcss@8.5.8: + find-up@5.0.0: dependencies: - nanoid: 3.3.11 - picocolors: 1.1.1 - source-map-js: 1.2.1 + locate-path: 6.0.0 + path-exists: 4.0.0 - prettier-plugin-astro@0.14.1: + flat-cache@4.0.1: dependencies: - '@astrojs/compiler': 2.13.1 - prettier: 3.8.1 - sass-formatter: 0.7.9 - optional: true + flatted: 3.4.2 + keyv: 4.5.4 - prettier@3.8.1: {} + flatted@3.4.2: {} - prismjs@1.30.0: {} - - property-information@7.1.0: {} - - radix3@1.1.2: {} - - readdirp@4.1.2: {} + fsevents@2.3.3: + optional: true - readdirp@5.0.0: {} + gensync@1.0.0-beta.2: {} - recma-build-jsx@1.0.0: + get-tsconfig@4.14.0: dependencies: - '@types/estree': 1.0.8 - estree-util-build-jsx: 3.0.1 - vfile: 6.0.3 + resolve-pkg-maps: 1.0.0 - recma-jsx@1.0.1(acorn@8.16.0): + glob-parent@6.0.2: dependencies: - acorn: 8.16.0 - acorn-jsx: 5.3.2(acorn@8.16.0) - estree-util-to-js: 2.0.0 - recma-parse: 1.0.0 - recma-stringify: 1.0.0 - unified: 11.0.5 + is-glob: 4.0.3 - recma-parse@1.0.0: - dependencies: - '@types/estree': 1.0.8 - esast-util-from-js: 2.0.1 - unified: 11.0.5 - vfile: 6.0.3 + graceful-fs@4.2.11: {} - recma-stringify@1.0.0: - dependencies: - '@types/estree': 1.0.8 - estree-util-to-js: 2.0.0 - unified: 11.0.5 - vfile: 6.0.3 + has-flag@4.0.0: {} - regex-recursion@6.0.2: + hermes-estree@0.25.1: {} + + hermes-parser@0.25.1: dependencies: - regex-utilities: 2.3.0 + hermes-estree: 0.25.1 - regex-utilities@2.3.0: {} + html-escaper@2.0.2: {} - regex@6.1.0: - dependencies: - regex-utilities: 2.3.0 + ignore@5.3.2: {} - rehype-parse@9.0.1: - dependencies: - '@types/hast': 3.0.4 - hast-util-from-html: 2.0.3 - unified: 11.0.5 + imurmurhash@0.1.4: {} - rehype-raw@7.0.0: - dependencies: - '@types/hast': 3.0.4 - hast-util-raw: 9.1.0 - vfile: 6.0.3 + is-extglob@2.1.1: {} - rehype-recma@1.0.0: + is-glob@4.0.3: dependencies: - '@types/estree': 1.0.8 - '@types/hast': 3.0.4 - hast-util-to-estree: 3.1.3 - transitivePeerDependencies: - - supports-color + is-extglob: 2.1.1 - rehype-stringify@10.0.1: - dependencies: - '@types/hast': 3.0.4 - hast-util-to-html: 9.0.5 - unified: 11.0.5 + isexe@2.0.0: {} - rehype@13.0.2: - dependencies: - '@types/hast': 3.0.4 - rehype-parse: 9.0.1 - rehype-stringify: 10.0.1 - unified: 11.0.5 + isexe@3.1.5: {} - remark-gfm@4.0.1: - dependencies: - '@types/mdast': 4.0.4 - mdast-util-gfm: 3.1.0 - micromark-extension-gfm: 3.0.0 - remark-parse: 11.0.0 - remark-stringify: 11.0.0 - unified: 11.0.5 - transitivePeerDependencies: - - supports-color + istanbul-lib-coverage@3.2.2: {} - remark-mdx@3.1.1: + istanbul-lib-report@3.0.1: dependencies: - mdast-util-mdx: 3.0.0 - micromark-extension-mdxjs: 3.0.0 - transitivePeerDependencies: - - supports-color + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 - remark-parse@11.0.0: + istanbul-reports@3.2.0: dependencies: - '@types/mdast': 4.0.4 - mdast-util-from-markdown: 2.0.3 - micromark-util-types: 2.0.2 - unified: 11.0.5 - transitivePeerDependencies: - - supports-color + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 - remark-rehype@11.1.2: - dependencies: - '@types/hast': 3.0.4 - '@types/mdast': 4.0.4 - mdast-util-to-hast: 13.2.1 - unified: 11.0.5 - vfile: 6.0.3 + jiti@2.6.1: {} - remark-smartypants@3.0.2: - dependencies: - retext: 9.0.0 - retext-smartypants: 6.2.0 - unified: 11.0.5 - unist-util-visit: 5.1.0 + js-tokens@4.0.0: {} - remark-stringify@11.0.0: - dependencies: - '@types/mdast': 4.0.4 - mdast-util-to-markdown: 2.1.2 - unified: 11.0.5 + jsesc@3.1.0: {} - request-light@0.5.8: {} + json-buffer@3.0.1: {} - request-light@0.7.0: {} + json-parse-even-better-errors@4.0.0: {} - require-directory@2.1.1: {} + json-schema-traverse@0.4.1: {} - require-from-string@2.0.2: {} + json-stable-stringify-without-jsonify@1.0.1: {} - restore-cursor@4.0.0: - dependencies: - onetime: 5.1.2 - signal-exit: 3.0.7 + json5@2.2.3: {} - retext-latin@4.0.0: + keyv@4.5.4: dependencies: - '@types/nlcst': 2.0.3 - parse-latin: 7.0.0 - unified: 11.0.5 + json-buffer: 3.0.1 - retext-smartypants@6.2.0: + levn@0.4.1: dependencies: - '@types/nlcst': 2.0.3 - nlcst-to-string: 4.0.0 - unist-util-visit: 5.1.0 + prelude-ls: 1.2.1 + type-check: 0.4.0 - retext-stringify@4.0.0: - dependencies: - '@types/nlcst': 2.0.3 - nlcst-to-string: 4.0.0 - unified: 11.0.5 + lightningcss-android-arm64@1.32.0: + optional: true - retext@9.0.0: - dependencies: - '@types/nlcst': 2.0.3 - retext-latin: 4.0.0 - retext-stringify: 4.0.0 - unified: 11.0.5 + lightningcss-darwin-arm64@1.32.0: + optional: true - rollup@4.59.0: - dependencies: - '@types/estree': 1.0.8 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.59.0 - '@rollup/rollup-android-arm64': 4.59.0 - '@rollup/rollup-darwin-arm64': 4.59.0 - '@rollup/rollup-darwin-x64': 4.59.0 - '@rollup/rollup-freebsd-arm64': 4.59.0 - '@rollup/rollup-freebsd-x64': 4.59.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.59.0 - '@rollup/rollup-linux-arm-musleabihf': 4.59.0 - '@rollup/rollup-linux-arm64-gnu': 4.59.0 - '@rollup/rollup-linux-arm64-musl': 4.59.0 - '@rollup/rollup-linux-loong64-gnu': 4.59.0 - '@rollup/rollup-linux-loong64-musl': 4.59.0 - '@rollup/rollup-linux-ppc64-gnu': 4.59.0 - '@rollup/rollup-linux-ppc64-musl': 4.59.0 - '@rollup/rollup-linux-riscv64-gnu': 4.59.0 - '@rollup/rollup-linux-riscv64-musl': 4.59.0 - '@rollup/rollup-linux-s390x-gnu': 4.59.0 - '@rollup/rollup-linux-x64-gnu': 4.59.0 - '@rollup/rollup-linux-x64-musl': 4.59.0 - '@rollup/rollup-openbsd-x64': 4.59.0 - '@rollup/rollup-openharmony-arm64': 4.59.0 - '@rollup/rollup-win32-arm64-msvc': 4.59.0 - '@rollup/rollup-win32-ia32-msvc': 4.59.0 - '@rollup/rollup-win32-x64-gnu': 4.59.0 - '@rollup/rollup-win32-x64-msvc': 4.59.0 - fsevents: 2.3.3 + lightningcss-darwin-x64@1.32.0: + optional: true - s.color@0.0.15: + lightningcss-freebsd-x64@1.32.0: optional: true - sass-formatter@0.7.9: - dependencies: - suf-log: 2.5.3 + lightningcss-linux-arm-gnueabihf@1.32.0: optional: true - sax@1.6.0: {} + lightningcss-linux-arm64-gnu@1.32.0: + optional: true - semver@7.7.4: {} + lightningcss-linux-arm64-musl@1.32.0: + optional: true + + lightningcss-linux-x64-gnu@1.32.0: + optional: true + + lightningcss-linux-x64-musl@1.32.0: + optional: true + + lightningcss-win32-arm64-msvc@1.32.0: + optional: true + + lightningcss-win32-x64-msvc@1.32.0: + optional: true - sharp@0.34.5: + lightningcss@1.32.0: dependencies: - '@img/colour': 1.1.0 detect-libc: 2.1.2 - semver: 7.7.4 optionalDependencies: - '@img/sharp-darwin-arm64': 0.34.5 - '@img/sharp-darwin-x64': 0.34.5 - '@img/sharp-libvips-darwin-arm64': 1.2.4 - '@img/sharp-libvips-darwin-x64': 1.2.4 - '@img/sharp-libvips-linux-arm': 1.2.4 - '@img/sharp-libvips-linux-arm64': 1.2.4 - '@img/sharp-libvips-linux-ppc64': 1.2.4 - '@img/sharp-libvips-linux-riscv64': 1.2.4 - '@img/sharp-libvips-linux-s390x': 1.2.4 - '@img/sharp-libvips-linux-x64': 1.2.4 - '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 - '@img/sharp-libvips-linuxmusl-x64': 1.2.4 - '@img/sharp-linux-arm': 0.34.5 - '@img/sharp-linux-arm64': 0.34.5 - '@img/sharp-linux-ppc64': 0.34.5 - '@img/sharp-linux-riscv64': 0.34.5 - '@img/sharp-linux-s390x': 0.34.5 - '@img/sharp-linux-x64': 0.34.5 - '@img/sharp-linuxmusl-arm64': 0.34.5 - '@img/sharp-linuxmusl-x64': 0.34.5 - '@img/sharp-wasm32': 0.34.5 - '@img/sharp-win32-arm64': 0.34.5 - '@img/sharp-win32-ia32': 0.34.5 - '@img/sharp-win32-x64': 0.34.5 - optional: true + 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 - shebang-command@2.0.0: + locate-path@6.0.0: dependencies: - shebang-regex: 3.0.0 + p-locate: 5.0.0 - shebang-regex@3.0.0: {} - - shiki@4.0.2: + lru-cache@5.1.1: dependencies: - '@shikijs/core': 4.0.2 - '@shikijs/engine-javascript': 4.0.2 - '@shikijs/engine-oniguruma': 4.0.2 - '@shikijs/langs': 4.0.2 - '@shikijs/themes': 4.0.2 - '@shikijs/types': 4.0.2 - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 + yallist: 3.1.1 - signal-exit@3.0.7: {} + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 - sirv@3.0.2: + make-dir@4.0.0: dependencies: - '@polka/url': 1.0.0-next.29 - mrmime: 2.0.1 - totalist: 3.0.1 + semver: 7.7.4 - sisteransi@1.0.5: {} + memorystream@0.3.1: {} - sitemap@9.0.1: + minimatch@10.2.5: dependencies: - '@types/node': 24.12.0 - '@types/sax': 1.2.7 - arg: 5.0.2 - sax: 1.6.0 + brace-expansion: 5.0.5 - slice-ansi@5.0.0: - dependencies: - ansi-styles: 6.2.3 - is-fullwidth-code-point: 4.0.0 + mri@1.2.0: {} - smol-toml@1.6.0: {} + mrmime@2.0.1: {} - source-map-js@1.2.1: {} + ms@2.1.3: {} - source-map@0.7.6: {} + nanoid@3.3.12: {} - space-separated-tokens@2.0.2: {} + natural-compare@1.4.0: {} - std-env@4.0.0: {} + natural-orderby@5.0.0: {} - stream-replace-string@2.0.0: {} + node-addon-api@7.1.1: {} - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 + node-releases@2.0.38: {} - string-width@5.1.2: - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.2.0 + npm-normalize-package-bin@4.0.0: {} - stringify-entities@4.0.4: + npm-run-all2@8.0.4: dependencies: - character-entities-html4: 2.1.0 - character-entities-legacy: 3.0.0 + ansi-styles: 6.2.3 + cross-spawn: 7.0.6 + memorystream: 0.3.1 + picomatch: 4.0.4 + pidtree: 0.6.0 + read-package-json-fast: 4.0.0 + shell-quote: 1.8.3 + which: 5.0.0 - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 + obug@2.1.1: {} - strip-ansi@7.2.0: + optionator@0.9.4: dependencies: - ansi-regex: 6.2.2 - - strnum@2.2.0: {} + 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 - style-to-js@1.1.21: - dependencies: - style-to-object: 1.0.14 + oxc-minify@0.121.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0): + optionalDependencies: + '@oxc-minify/binding-android-arm-eabi': 0.121.0 + '@oxc-minify/binding-android-arm64': 0.121.0 + '@oxc-minify/binding-darwin-arm64': 0.121.0 + '@oxc-minify/binding-darwin-x64': 0.121.0 + '@oxc-minify/binding-freebsd-x64': 0.121.0 + '@oxc-minify/binding-linux-arm-gnueabihf': 0.121.0 + '@oxc-minify/binding-linux-arm-musleabihf': 0.121.0 + '@oxc-minify/binding-linux-arm64-gnu': 0.121.0 + '@oxc-minify/binding-linux-arm64-musl': 0.121.0 + '@oxc-minify/binding-linux-ppc64-gnu': 0.121.0 + '@oxc-minify/binding-linux-riscv64-gnu': 0.121.0 + '@oxc-minify/binding-linux-riscv64-musl': 0.121.0 + '@oxc-minify/binding-linux-s390x-gnu': 0.121.0 + '@oxc-minify/binding-linux-x64-gnu': 0.121.0 + '@oxc-minify/binding-linux-x64-musl': 0.121.0 + '@oxc-minify/binding-openharmony-arm64': 0.121.0 + '@oxc-minify/binding-wasm32-wasi': 0.121.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + '@oxc-minify/binding-win32-arm64-msvc': 0.121.0 + '@oxc-minify/binding-win32-ia32-msvc': 0.121.0 + '@oxc-minify/binding-win32-x64-msvc': 0.121.0 + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' - style-to-object@1.0.14: + oxc-parser@0.121.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0): dependencies: - inline-style-parser: 0.2.7 + '@oxc-project/types': 0.121.0 + optionalDependencies: + '@oxc-parser/binding-android-arm-eabi': 0.121.0 + '@oxc-parser/binding-android-arm64': 0.121.0 + '@oxc-parser/binding-darwin-arm64': 0.121.0 + '@oxc-parser/binding-darwin-x64': 0.121.0 + '@oxc-parser/binding-freebsd-x64': 0.121.0 + '@oxc-parser/binding-linux-arm-gnueabihf': 0.121.0 + '@oxc-parser/binding-linux-arm-musleabihf': 0.121.0 + '@oxc-parser/binding-linux-arm64-gnu': 0.121.0 + '@oxc-parser/binding-linux-arm64-musl': 0.121.0 + '@oxc-parser/binding-linux-ppc64-gnu': 0.121.0 + '@oxc-parser/binding-linux-riscv64-gnu': 0.121.0 + '@oxc-parser/binding-linux-riscv64-musl': 0.121.0 + '@oxc-parser/binding-linux-s390x-gnu': 0.121.0 + '@oxc-parser/binding-linux-x64-gnu': 0.121.0 + '@oxc-parser/binding-linux-x64-musl': 0.121.0 + '@oxc-parser/binding-openharmony-arm64': 0.121.0 + '@oxc-parser/binding-wasm32-wasi': 0.121.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + '@oxc-parser/binding-win32-arm64-msvc': 0.121.0 + '@oxc-parser/binding-win32-ia32-msvc': 0.121.0 + '@oxc-parser/binding-win32-x64-msvc': 0.121.0 + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' - suf-log@2.5.3: - dependencies: - s.color: 0.0.15 - optional: true + oxc-resolver@11.19.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0): + optionalDependencies: + '@oxc-resolver/binding-android-arm-eabi': 11.19.1 + '@oxc-resolver/binding-android-arm64': 11.19.1 + '@oxc-resolver/binding-darwin-arm64': 11.19.1 + '@oxc-resolver/binding-darwin-x64': 11.19.1 + '@oxc-resolver/binding-freebsd-x64': 11.19.1 + '@oxc-resolver/binding-linux-arm-gnueabihf': 11.19.1 + '@oxc-resolver/binding-linux-arm-musleabihf': 11.19.1 + '@oxc-resolver/binding-linux-arm64-gnu': 11.19.1 + '@oxc-resolver/binding-linux-arm64-musl': 11.19.1 + '@oxc-resolver/binding-linux-ppc64-gnu': 11.19.1 + '@oxc-resolver/binding-linux-riscv64-gnu': 11.19.1 + '@oxc-resolver/binding-linux-riscv64-musl': 11.19.1 + '@oxc-resolver/binding-linux-s390x-gnu': 11.19.1 + '@oxc-resolver/binding-linux-x64-gnu': 11.19.1 + '@oxc-resolver/binding-linux-x64-musl': 11.19.1 + '@oxc-resolver/binding-openharmony-arm64': 11.19.1 + '@oxc-resolver/binding-wasm32-wasi': 11.19.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + '@oxc-resolver/binding-win32-arm64-msvc': 11.19.1 + '@oxc-resolver/binding-win32-ia32-msvc': 11.19.1 + '@oxc-resolver/binding-win32-x64-msvc': 11.19.1 + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' - supports-color@10.2.2: {} + oxc-transform@0.121.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0): + optionalDependencies: + '@oxc-transform/binding-android-arm-eabi': 0.121.0 + '@oxc-transform/binding-android-arm64': 0.121.0 + '@oxc-transform/binding-darwin-arm64': 0.121.0 + '@oxc-transform/binding-darwin-x64': 0.121.0 + '@oxc-transform/binding-freebsd-x64': 0.121.0 + '@oxc-transform/binding-linux-arm-gnueabihf': 0.121.0 + '@oxc-transform/binding-linux-arm-musleabihf': 0.121.0 + '@oxc-transform/binding-linux-arm64-gnu': 0.121.0 + '@oxc-transform/binding-linux-arm64-musl': 0.121.0 + '@oxc-transform/binding-linux-ppc64-gnu': 0.121.0 + '@oxc-transform/binding-linux-riscv64-gnu': 0.121.0 + '@oxc-transform/binding-linux-riscv64-musl': 0.121.0 + '@oxc-transform/binding-linux-s390x-gnu': 0.121.0 + '@oxc-transform/binding-linux-x64-gnu': 0.121.0 + '@oxc-transform/binding-linux-x64-musl': 0.121.0 + '@oxc-transform/binding-openharmony-arm64': 0.121.0 + '@oxc-transform/binding-wasm32-wasi': 0.121.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + '@oxc-transform/binding-win32-arm64-msvc': 0.121.0 + '@oxc-transform/binding-win32-ia32-msvc': 0.121.0 + '@oxc-transform/binding-win32-x64-msvc': 0.121.0 + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' - supports-hyperlinks@4.4.0: + oxfmt@0.46.0: dependencies: - has-flag: 5.0.1 - supports-color: 10.2.2 + tinypool: 2.1.0 + optionalDependencies: + '@oxfmt/binding-android-arm-eabi': 0.46.0 + '@oxfmt/binding-android-arm64': 0.46.0 + '@oxfmt/binding-darwin-arm64': 0.46.0 + '@oxfmt/binding-darwin-x64': 0.46.0 + '@oxfmt/binding-freebsd-x64': 0.46.0 + '@oxfmt/binding-linux-arm-gnueabihf': 0.46.0 + '@oxfmt/binding-linux-arm-musleabihf': 0.46.0 + '@oxfmt/binding-linux-arm64-gnu': 0.46.0 + '@oxfmt/binding-linux-arm64-musl': 0.46.0 + '@oxfmt/binding-linux-ppc64-gnu': 0.46.0 + '@oxfmt/binding-linux-riscv64-gnu': 0.46.0 + '@oxfmt/binding-linux-riscv64-musl': 0.46.0 + '@oxfmt/binding-linux-s390x-gnu': 0.46.0 + '@oxfmt/binding-linux-x64-gnu': 0.46.0 + '@oxfmt/binding-linux-x64-musl': 0.46.0 + '@oxfmt/binding-openharmony-arm64': 0.46.0 + '@oxfmt/binding-win32-arm64-msvc': 0.46.0 + '@oxfmt/binding-win32-ia32-msvc': 0.46.0 + '@oxfmt/binding-win32-x64-msvc': 0.46.0 + + oxlint-tsgolint@0.22.0: + optionalDependencies: + '@oxlint-tsgolint/darwin-arm64': 0.22.0 + '@oxlint-tsgolint/darwin-x64': 0.22.0 + '@oxlint-tsgolint/linux-arm64': 0.22.0 + '@oxlint-tsgolint/linux-x64': 0.22.0 + '@oxlint-tsgolint/win32-arm64': 0.22.0 + '@oxlint-tsgolint/win32-x64': 0.22.0 + + oxlint@1.61.0(oxlint-tsgolint@0.22.0): + optionalDependencies: + '@oxlint/binding-android-arm-eabi': 1.61.0 + '@oxlint/binding-android-arm64': 1.61.0 + '@oxlint/binding-darwin-arm64': 1.61.0 + '@oxlint/binding-darwin-x64': 1.61.0 + '@oxlint/binding-freebsd-x64': 1.61.0 + '@oxlint/binding-linux-arm-gnueabihf': 1.61.0 + '@oxlint/binding-linux-arm-musleabihf': 1.61.0 + '@oxlint/binding-linux-arm64-gnu': 1.61.0 + '@oxlint/binding-linux-arm64-musl': 1.61.0 + '@oxlint/binding-linux-ppc64-gnu': 1.61.0 + '@oxlint/binding-linux-riscv64-gnu': 1.61.0 + '@oxlint/binding-linux-riscv64-musl': 1.61.0 + '@oxlint/binding-linux-s390x-gnu': 1.61.0 + '@oxlint/binding-linux-x64-gnu': 1.61.0 + '@oxlint/binding-linux-x64-musl': 1.61.0 + '@oxlint/binding-openharmony-arm64': 1.61.0 + '@oxlint/binding-win32-arm64-msvc': 1.61.0 + '@oxlint/binding-win32-ia32-msvc': 1.61.0 + '@oxlint/binding-win32-x64-msvc': 1.61.0 + oxlint-tsgolint: 0.22.0 + + oxlint@1.62.0(oxlint-tsgolint@0.22.0): + optionalDependencies: + '@oxlint/binding-android-arm-eabi': 1.62.0 + '@oxlint/binding-android-arm64': 1.62.0 + '@oxlint/binding-darwin-arm64': 1.62.0 + '@oxlint/binding-darwin-x64': 1.62.0 + '@oxlint/binding-freebsd-x64': 1.62.0 + '@oxlint/binding-linux-arm-gnueabihf': 1.62.0 + '@oxlint/binding-linux-arm-musleabihf': 1.62.0 + '@oxlint/binding-linux-arm64-gnu': 1.62.0 + '@oxlint/binding-linux-arm64-musl': 1.62.0 + '@oxlint/binding-linux-ppc64-gnu': 1.62.0 + '@oxlint/binding-linux-riscv64-gnu': 1.62.0 + '@oxlint/binding-linux-riscv64-musl': 1.62.0 + '@oxlint/binding-linux-s390x-gnu': 1.62.0 + '@oxlint/binding-linux-x64-gnu': 1.62.0 + '@oxlint/binding-linux-x64-musl': 1.62.0 + '@oxlint/binding-openharmony-arm64': 1.62.0 + '@oxlint/binding-win32-arm64-msvc': 1.62.0 + '@oxlint/binding-win32-ia32-msvc': 1.62.0 + '@oxlint/binding-win32-x64-msvc': 1.62.0 + oxlint-tsgolint: 0.22.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + path-exists@4.0.0: {} - svgo@4.0.1: - dependencies: - commander: 11.1.0 - css-select: 5.2.2 - css-tree: 3.2.1 - css-what: 6.2.2 - csso: 5.0.5 - picocolors: 1.1.1 - sax: 1.6.0 + path-key@3.1.1: {} - tailwind-merge@3.5.0: {} + picocolors@1.1.1: {} - tailwindcss@4.2.2: {} + picomatch@4.0.4: {} - tapable@2.3.0: {} + pidtree@0.6.0: {} - terminal-link@5.0.0: + pixelmatch@7.2.0: dependencies: - ansi-escapes: 7.3.0 - supports-hyperlinks: 4.4.0 + pngjs: 7.0.0 - tiny-inflate@1.0.3: {} + pngjs@7.0.0: {} - tinybench@2.9.0: {} + postcss@8.5.13: + dependencies: + nanoid: 3.3.12 + picocolors: 1.1.1 + source-map-js: 1.2.1 - tinyclip@0.1.12: {} + prelude-ls@1.2.1: {} - tinyexec@1.0.4: {} + punycode@2.3.1: {} - tinyglobby@0.2.15: + read-package-json-fast@4.0.0: dependencies: - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 + json-parse-even-better-errors: 4.0.0 + npm-normalize-package-bin: 4.0.0 - tinypool@2.1.0: {} - - totalist@3.0.1: {} + readdirp@5.0.0: {} - trim-lines@3.0.1: {} + remix@3.0.0-beta.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0): + dependencies: + '@remix-run/assert': 0.2.0 + '@remix-run/assets': 0.3.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + '@remix-run/async-context-middleware': 0.2.2 + '@remix-run/auth': 0.2.1 + '@remix-run/auth-middleware': 0.1.2 + '@remix-run/cli': 0.2.0 + '@remix-run/compression-middleware': 0.1.7 + '@remix-run/cookie': 0.5.1 + '@remix-run/cop-middleware': 0.1.2 + '@remix-run/cors-middleware': 0.1.2 + '@remix-run/csrf-middleware': 0.1.2 + '@remix-run/data-schema': 0.3.0 + '@remix-run/data-table': 0.2.1 + '@remix-run/data-table-mysql': 0.3.1 + '@remix-run/data-table-postgres': 0.3.1 + '@remix-run/data-table-sqlite': 0.4.1 + '@remix-run/fetch-proxy': 0.8.0 + '@remix-run/fetch-router': 0.18.2 + '@remix-run/file-storage': 0.13.4 + '@remix-run/file-storage-s3': 0.1.1 + '@remix-run/form-data-middleware': 0.2.3 + '@remix-run/form-data-parser': 0.17.0 + '@remix-run/fs': 0.4.3 + '@remix-run/headers': 0.19.0 + '@remix-run/html-template': 0.3.0 + '@remix-run/lazy-file': 5.0.3 + '@remix-run/logger-middleware': 0.2.1 + '@remix-run/method-override-middleware': 0.1.7 + '@remix-run/mime': 0.4.1 + '@remix-run/multipart-parser': 0.16.0 + '@remix-run/node-fetch-server': 0.13.1 + '@remix-run/node-serve': 0.1.0 + '@remix-run/response': 0.3.3 + '@remix-run/route-pattern': 0.20.1 + '@remix-run/session': 0.4.1 + '@remix-run/session-middleware': 0.2.2 + '@remix-run/session-storage-memcache': 0.1.0 + '@remix-run/session-storage-redis': 0.1.0 + '@remix-run/static-middleware': 0.4.8 + '@remix-run/tar-parser': 0.7.1 + '@remix-run/terminal': 0.1.0 + '@remix-run/test': 0.3.0 + '@remix-run/ui': 0.1.1 + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' - trough@2.2.0: {} + resolve-pkg-maps@1.0.0: {} - tsconfck@3.1.6(typescript@5.9.3): + rolldown@1.0.0-rc.17: + dependencies: + '@oxc-project/types': 0.127.0 + '@rolldown/pluginutils': 1.0.0-rc.17 optionalDependencies: - typescript: 5.9.3 - - tslib@2.8.1: - optional: true - - type-fest@1.4.0: {} + '@rolldown/binding-android-arm64': 1.0.0-rc.17 + '@rolldown/binding-darwin-arm64': 1.0.0-rc.17 + '@rolldown/binding-darwin-x64': 1.0.0-rc.17 + '@rolldown/binding-freebsd-x64': 1.0.0-rc.17 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.17 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.17 + '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.17 + '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.17 + '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.17 + '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.17 + '@rolldown/binding-linux-x64-musl': 1.0.0-rc.17 + '@rolldown/binding-openharmony-arm64': 1.0.0-rc.17 + '@rolldown/binding-wasm32-wasi': 1.0.0-rc.17 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.17 + '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.17 + + semver@6.3.1: {} - typesafe-path@0.2.2: {} + semver@7.7.4: {} - typescript-auto-import-cache@0.3.6: + shebang-command@2.0.0: dependencies: - semver: 7.7.4 + shebang-regex: 3.0.0 - typescript@5.9.3: {} + shebang-regex@3.0.0: {} - ufo@1.6.3: {} + shell-quote@1.8.3: {} - ultrahtml@1.6.0: {} + sirv@3.0.2: + dependencies: + '@polka/url': 1.0.0-next.29 + mrmime: 2.0.1 + totalist: 3.0.1 - uncrypto@0.1.3: {} + source-map-js@1.2.1: {} - undici-types@7.16.0: {} + std-env@4.1.0: {} - unified@11.0.5: + supports-color@7.2.0: dependencies: - '@types/unist': 3.0.3 - bail: 2.0.2 - devlop: 1.1.0 - extend: 3.0.2 - is-plain-obj: 4.1.0 - trough: 2.2.0 - vfile: 6.0.3 + has-flag: 4.0.0 - unifont@0.7.4: - dependencies: - css-tree: 3.2.1 - ofetch: 1.5.1 - ohash: 2.0.11 + tailwindcss@4.2.4: {} - unist-util-find-after@5.0.0: - dependencies: - '@types/unist': 3.0.3 - unist-util-is: 6.0.1 + tapable@2.3.3: {} - unist-util-is@6.0.1: - dependencies: - '@types/unist': 3.0.3 + tinybench@2.9.0: {} - unist-util-modify-children@4.0.0: - dependencies: - '@types/unist': 3.0.3 - array-iterate: 2.0.1 + tinyexec@1.1.2: {} - unist-util-position-from-estree@2.0.0: + tinyglobby@0.2.16: dependencies: - '@types/unist': 3.0.3 + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 - unist-util-position@5.0.0: - dependencies: - '@types/unist': 3.0.3 + tinypool@2.1.0: {} - unist-util-remove-position@5.0.0: - dependencies: - '@types/unist': 3.0.3 - unist-util-visit: 5.1.0 + totalist@3.0.1: {} - unist-util-stringify-position@4.0.0: + ts-api-utils@2.5.0(typescript@6.0.3): dependencies: - '@types/unist': 3.0.3 + typescript: 6.0.3 - unist-util-visit-children@3.0.0: - dependencies: - '@types/unist': 3.0.3 + tslib@2.8.1: + optional: true - unist-util-visit-parents@6.0.2: + tsx@4.21.0: dependencies: - '@types/unist': 3.0.3 - unist-util-is: 6.0.1 + esbuild: 0.27.7 + get-tsconfig: 4.14.0 + optionalDependencies: + fsevents: 2.3.3 - unist-util-visit@5.1.0: + type-check@0.4.0: dependencies: - '@types/unist': 3.0.3 - unist-util-is: 6.0.1 - unist-util-visit-parents: 6.0.2 + prelude-ls: 1.2.1 - unstorage@1.17.4: - dependencies: - anymatch: 3.1.3 - chokidar: 5.0.0 - destr: 2.0.5 - h3: 1.15.8 - lru-cache: 11.2.7 - node-fetch-native: 1.6.7 - ofetch: 1.5.1 - ufo: 1.6.3 + typescript@6.0.3: {} + + uWebSockets.js@https://codeload.github.com/uNetworking/uWebSockets.js/tar.gz/a63031f40f76dc2422e8da736c04217053e9db2b: + optional: true - util-deprecate@1.0.2: {} + undici-types@7.19.2: {} - vfile-location@5.0.3: + update-browserslist-db@1.2.3(browserslist@4.28.2): dependencies: - '@types/unist': 3.0.3 - vfile: 6.0.3 + browserslist: 4.28.2 + escalade: 3.2.0 + picocolors: 1.1.1 - vfile-message@4.0.3: + uri-js@4.4.1: dependencies: - '@types/unist': 3.0.3 - unist-util-stringify-position: 4.0.0 + punycode: 2.3.1 - vfile@6.0.3: + v8-to-istanbul@9.3.0: dependencies: - '@types/unist': 3.0.3 - vfile-message: 4.0.3 + '@jridgewell/trace-mapping': 0.3.31 + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 2.0.0 - vite-plus@0.1.12(@types/node@24.12.0)(esbuild@0.27.4)(jiti@2.6.1)(typescript@5.9.3)(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.2))(yaml@2.8.2): + vite-plus@0.1.20(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(typescript@6.0.3)(vite@8.0.10(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)): dependencies: - '@oxc-project/types': 0.115.0 - '@voidzero-dev/vite-plus-core': 0.1.12(@types/node@24.12.0)(esbuild@0.27.4)(jiti@2.6.1)(typescript@5.9.3)(yaml@2.8.2) - '@voidzero-dev/vite-plus-test': 0.1.12(@types/node@24.12.0)(esbuild@0.27.4)(jiti@2.6.1)(typescript@5.9.3)(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.2))(yaml@2.8.2) - cac: 6.7.14 - cross-spawn: 7.0.6 - oxfmt: 0.40.0 - oxlint: 1.55.0(oxlint-tsgolint@0.17.0) - oxlint-tsgolint: 0.17.0 - picocolors: 1.1.1 + '@oxc-project/types': 0.127.0 + '@voidzero-dev/vite-plus-core': 0.1.20(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(typescript@6.0.3) + '@voidzero-dev/vite-plus-test': 0.1.20(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(typescript@6.0.3)(vite@8.0.10(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)) + oxfmt: 0.46.0 + oxlint: 1.61.0(oxlint-tsgolint@0.22.0) + oxlint-tsgolint: 0.22.0 optionalDependencies: - '@voidzero-dev/vite-plus-darwin-arm64': 0.1.12 - '@voidzero-dev/vite-plus-darwin-x64': 0.1.12 - '@voidzero-dev/vite-plus-linux-arm64-gnu': 0.1.12 - '@voidzero-dev/vite-plus-linux-x64-gnu': 0.1.12 - '@voidzero-dev/vite-plus-win32-arm64-msvc': 0.1.12 - '@voidzero-dev/vite-plus-win32-x64-msvc': 0.1.12 + '@voidzero-dev/vite-plus-darwin-arm64': 0.1.20 + '@voidzero-dev/vite-plus-darwin-x64': 0.1.20 + '@voidzero-dev/vite-plus-linux-arm64-gnu': 0.1.20 + '@voidzero-dev/vite-plus-linux-arm64-musl': 0.1.20 + '@voidzero-dev/vite-plus-linux-x64-gnu': 0.1.20 + '@voidzero-dev/vite-plus-linux-x64-musl': 0.1.20 + '@voidzero-dev/vite-plus-win32-arm64-msvc': 0.1.20 + '@voidzero-dev/vite-plus-win32-x64-msvc': 0.1.20 transitivePeerDependencies: - '@arethetypeswrong/core' - '@edge-runtime/vm' @@ -5735,6 +4865,8 @@ snapshots: - '@tsdown/exe' - '@types/node' - '@vitejs/devtools' + - '@vitest/coverage-istanbul' + - '@vitest/coverage-v8' - '@vitest/ui' - bufferutil - esbuild @@ -5755,182 +4887,38 @@ snapshots: - vite - yaml - vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.2): + vite@8.0.10(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0): dependencies: - esbuild: 0.27.4 - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 - postcss: 8.5.8 - rollup: 4.59.0 - tinyglobby: 0.2.15 + lightningcss: 1.32.0 + picomatch: 4.0.4 + postcss: 8.5.13 + rolldown: 1.0.0-rc.17 + tinyglobby: 0.2.16 optionalDependencies: - '@types/node': 24.12.0 + '@types/node': 25.6.0 + esbuild: 0.27.7 fsevents: 2.3.3 jiti: 2.6.1 - lightningcss: 1.32.0 - yaml: 2.8.2 - - vitefu@1.1.2(@voidzero-dev/vite-plus-core@0.1.12(@types/node@24.12.0)(esbuild@0.27.4)(jiti@2.6.1)(typescript@5.9.3)(yaml@2.8.2)): - optionalDependencies: - vite: '@voidzero-dev/vite-plus-core@0.1.12(@types/node@24.12.0)(esbuild@0.27.4)(jiti@2.6.1)(typescript@5.9.3)(yaml@2.8.2)' - - volar-service-css@0.0.70(@volar/language-service@2.4.28): - dependencies: - vscode-css-languageservice: 6.3.10 - vscode-languageserver-textdocument: 1.0.12 - vscode-uri: 3.1.0 - optionalDependencies: - '@volar/language-service': 2.4.28 - - volar-service-emmet@0.0.70(@volar/language-service@2.4.28): - dependencies: - '@emmetio/css-parser': 0.4.1 - '@emmetio/html-matcher': 1.3.0 - '@vscode/emmet-helper': 2.11.0 - vscode-uri: 3.1.0 - optionalDependencies: - '@volar/language-service': 2.4.28 - - volar-service-html@0.0.70(@volar/language-service@2.4.28): - dependencies: - vscode-html-languageservice: 5.6.2 - vscode-languageserver-textdocument: 1.0.12 - vscode-uri: 3.1.0 - optionalDependencies: - '@volar/language-service': 2.4.28 - - volar-service-prettier@0.0.70(@volar/language-service@2.4.28)(prettier@3.8.1): - dependencies: - vscode-uri: 3.1.0 - optionalDependencies: - '@volar/language-service': 2.4.28 - prettier: 3.8.1 - - volar-service-typescript-twoslash-queries@0.0.70(@volar/language-service@2.4.28): - dependencies: - vscode-uri: 3.1.0 - optionalDependencies: - '@volar/language-service': 2.4.28 - - volar-service-typescript@0.0.70(@volar/language-service@2.4.28): - dependencies: - path-browserify: 1.0.1 - semver: 7.7.4 - typescript-auto-import-cache: 0.3.6 - vscode-languageserver-textdocument: 1.0.12 - vscode-nls: 5.2.0 - vscode-uri: 3.1.0 - optionalDependencies: - '@volar/language-service': 2.4.28 - - volar-service-yaml@0.0.70(@volar/language-service@2.4.28): - dependencies: - vscode-uri: 3.1.0 - yaml-language-server: 1.20.0 - optionalDependencies: - '@volar/language-service': 2.4.28 - - vscode-css-languageservice@6.3.10: - dependencies: - '@vscode/l10n': 0.0.18 - vscode-languageserver-textdocument: 1.0.12 - vscode-languageserver-types: 3.17.5 - vscode-uri: 3.1.0 - - vscode-html-languageservice@5.6.2: - dependencies: - '@vscode/l10n': 0.0.18 - vscode-languageserver-textdocument: 1.0.12 - vscode-languageserver-types: 3.17.5 - vscode-uri: 3.1.0 - - vscode-json-languageservice@4.1.8: - dependencies: - jsonc-parser: 3.3.1 - vscode-languageserver-textdocument: 1.0.12 - vscode-languageserver-types: 3.17.5 - vscode-nls: 5.2.0 - vscode-uri: 3.1.0 - - vscode-jsonrpc@8.2.0: {} - - vscode-languageserver-protocol@3.17.5: - dependencies: - vscode-jsonrpc: 8.2.0 - vscode-languageserver-types: 3.17.5 - - vscode-languageserver-textdocument@1.0.12: {} - - vscode-languageserver-types@3.17.5: {} - - vscode-languageserver@9.0.1: - dependencies: - vscode-languageserver-protocol: 3.17.5 - - vscode-nls@5.2.0: {} - - vscode-uri@3.1.0: {} - - web-namespaces@2.0.1: {} - - which-pm-runs@1.1.0: {} + tsx: 4.21.0 which@2.0.2: dependencies: isexe: 2.0.0 - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrap-ansi@8.1.0: - dependencies: - ansi-styles: 6.2.3 - string-width: 5.1.2 - strip-ansi: 7.2.0 - - ws@8.19.0: {} - - xxhash-wasm@1.1.0: {} - - y18n@5.0.8: {} - - yaml-language-server@1.20.0: + which@5.0.0: dependencies: - '@vscode/l10n': 0.0.18 - ajv: 8.18.0 - ajv-draft-04: 1.0.0(ajv@8.18.0) - prettier: 3.8.1 - request-light: 0.5.8 - vscode-json-languageservice: 4.1.8 - vscode-languageserver: 9.0.1 - vscode-languageserver-textdocument: 1.0.12 - vscode-languageserver-types: 3.17.5 - vscode-uri: 3.1.0 - yaml: 2.7.1 + isexe: 3.1.5 - yaml@2.7.1: {} + word-wrap@1.2.5: {} - yaml@2.8.2: {} + ws@8.20.0: {} - yargs-parser@21.1.1: {} + yallist@3.1.1: {} - yargs-parser@22.0.0: {} + yocto-queue@0.1.0: {} - yargs@17.7.2: + zod-validation-error@4.0.2(zod@4.4.1): dependencies: - cliui: 8.0.1 - escalade: 3.2.0 - 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@1.2.2: {} - - zod@4.3.6: {} + zod: 4.4.1 - zwitch@2.0.4: {} + zod@4.4.1: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..77e0f77 --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,16 @@ +allowBuilds: + esbuild: true +catalog: + vite: npm:@voidzero-dev/vite-plus-core@latest + vite-plus: latest + vitest: npm:@voidzero-dev/vite-plus-test@latest +overrides: + vite: "catalog:" + vitest: "catalog:" +peerDependencyRules: + allowAny: + - vite + - vitest + allowedVersions: + vite: "*" + vitest: "*" diff --git a/public/favicon.ico b/public/favicon.ico deleted file mode 100644 index 119e662..0000000 Binary files a/public/favicon.ico and /dev/null differ diff --git a/public/fonts/CommitMono-400-Italic.otf b/public/fonts/CommitMono-400-Italic.otf deleted file mode 100644 index 3c88f89..0000000 Binary files a/public/fonts/CommitMono-400-Italic.otf and /dev/null differ diff --git a/public/fonts/CommitMono-400-Regular.otf b/public/fonts/CommitMono-400-Regular.otf deleted file mode 100644 index a859cc5..0000000 Binary files a/public/fonts/CommitMono-400-Regular.otf and /dev/null differ diff --git a/public/fonts/CommitMono-700-Italic.otf b/public/fonts/CommitMono-700-Italic.otf deleted file mode 100644 index 6386a6d..0000000 Binary files a/public/fonts/CommitMono-700-Italic.otf and /dev/null differ diff --git a/public/fonts/CommitMono-700-Regular.otf b/public/fonts/CommitMono-700-Regular.otf deleted file mode 100644 index b877cec..0000000 Binary files a/public/fonts/CommitMono-700-Regular.otf and /dev/null differ diff --git a/public/og-image.jpg b/public/og-image.jpg deleted file mode 100644 index fbb96c6..0000000 Binary files a/public/og-image.jpg and /dev/null differ diff --git a/public/resume.pdf b/public/resume.pdf deleted file mode 100644 index b9e8cf3..0000000 Binary files a/public/resume.pdf and /dev/null differ diff --git a/resume/resume.typ b/resume/resume.typ deleted file mode 100644 index bb627c0..0000000 --- a/resume/resume.typ +++ /dev/null @@ -1,149 +0,0 @@ -#set page(margin: (x: 0.75in, y: 0.75in)) -#set text(font: "Source Serif 4", size: 11pt, weight: "light") -#set par(justify: true) - -#let section(title) = { - v(8pt) - text(weight: "medium", size: 11pt)[#title] - v(-4pt) - line(length: 100%, stroke: 0.5pt) - v(4pt) -} - -// Header -#align(center)[ - #text(size: 18pt, weight: "semibold")[Guilherme de Andrade] - #v(-6pt) - #link("mailto:gui@ubmit.dev")[gui\@ubmit.dev] | #link("https://linkedin.com/in/ubmit")[linkedin.com/in/ubmit] | #link("https://github.com/ubmit")[github.com/ubmit] | | +351 936 747 095 | Porto, Portugal -] - -#section[Profile] -Senior Frontend Engineer with 7+ years in React.js and JavaScript/TypeScript. Experienced with robust, scalable UI development with pixel-perfect design implementation. Excels in translating complex requirements into intuitive user experiences. Committed to continuous learning and delivering solutions that exceed expectations. - -#section[Professional Experience] -#grid( - columns: (1fr, auto), - align: (left, right), - text(weight: "medium")[Senior Software Engineer, DataCamp], - [August 2024 - October 2025] -) -#v(-8pt) -#align(right)[Porto, Portugal (Remote)] -- Collaborated with different teams to implement campaigns and promotions on the platform while ensuring alignment with overall growth strategies. -- Conducted frequent A/B tests on different pages to identify effective alternatives that drive user conversion and enhance overall performance. -- Improved Core Web Vitals by implementing caching strategies for our most visited pages, reducing load times, enhancing the Largest Contentful Paint (LCP) metric and improving interaction speed. -- Tech stack: React, TypeScript, Next.js, TanStack Query, Jest, React Testing Library, Theme UI, Emotion, Ruby, and Ruby on Rails. - -#v(4pt) - -#grid( - columns: (1fr, auto), - align: (left, right), - text(weight: "medium")[Frontend Engineer, Viz.ai], - [February 2022 - April 2024] -) -#v(-8pt) -#align(right)[Porto, Portugal (Remote)] -- Led the "decoupling" process of the web app into two separate teams within a monorepo, optimizing CI/CD steps for isolated app development. -- Contributed to the development of a design system, including grid system and design tokens for typography and iconography. -- Improved web app security by configuring security headers using Terraform across multiple environments, achieving an A+ grade on SSL Labs' Server Test. -- Ensured consistency and responsiveness across screens, improving user experience. -- Tech stack: React, TypeScript, React Router, TanStack Query, Jest, React Testing Library, Cypress, Material UI, and styled-components. - -#v(4pt) - -#grid( - columns: (1fr, auto), - align: (left, right), - text(weight: "medium")[Frontend Engineer, New Work SE], - [November 2020 - February 2022] -) -#v(-8pt) -#align(right)[Porto, Portugal (Remote)] -- Migrated Embedded Ruby (ERB) templates to React, enhancing the UX on #link("https://xing.com")[xing.com] B2C payments. -- Led frontend development efforts, particularly in maintaining and enhancing pages and components related to the profile visitors feature. -- Developed and published reusable components to an internal NPM registry, ensuring consistency and efficiency across projects. -- Assumed leadership responsibilities within the team following the departure of a senior colleague, becoming the primary technical contact for frontend-related matters. -- Mentored an intern, sharing knowledge and best practices in frontend development and tooling. -- Tech stack: Ruby, Ruby on Rails, GraphQL, React, TypeScript, styled-components, Jest, and React Testing Library. - -#v(4pt) - -#grid( - columns: (1fr, auto), - align: (left, right), - text(weight: "medium")[Software Engineer, MOXY], - [November 2019 - November 2020] -) -#v(-8pt) -#align(right)[Porto, Portugal (Hybrid)] -- Developed a deep understanding of CSS through extensive customization of user interfaces, surpassing previous experiences with UI libraries and embracing tailored solutions for each project. -- Contributed to maintaining and enhancing headless UI components utilized across projects for improved efficiency and consistency. -- Actively participated in open-source initiatives, including refining and sharing our website template built on Next.js, showcasing dedication to community-driven development. -- Tech stack: JavaScript, React, Next.js, CSS Modules, Jest, and React Testing Library. - -#v(4pt) - -#grid( - columns: (1fr, auto), - align: (left, right), - text(weight: "medium")[Software Engineer, Gistia], - [November 2018 - November 2019] -) -#v(-8pt) -#align(right)[Porto, Portugal (Remote)] -- Developed forms, customized PDF generation, and implemented on-demand configurations using React components. -- Contributed to the migration from JavaScript to TypeScript in a React application. -- Implemented frontend unit tests using Jest and React Testing Library for reliability. -- Gained proficiency in functional programming libraries such as Fluture. -- Tech stack: JavaScript, TypeScript, React, Redux, Node.js, Express.js, MongoDB, and Fluture. - -#v(4pt) - -#grid( - columns: (1fr, auto), - align: (left, right), - text(weight: "medium")[Software Engineer Intern, TrackingTrade], - [March 2018 - July 2018] -) -#v(-8pt) -#align(right)[Recife, Brazil (On-site)] -- Developed and maintained dashboards to monitor sales points. -- Implemented spreadsheets generation to extract and present application data. -- Improved user experience by adding filtering and data visualization features. -- Tech stack: HTML, CSS, JavaScript, AngularJS, Ruby, Ruby on Rails, and PostgreSQL. - -#section[Education] -#grid( - columns: (1fr, auto), - align: (left, right), - text(weight: "medium")[Bachelor's Degree, Electrical and Computers Engineering], - [September 2018 - September 2019] -) -#v(-8pt) -#grid( - columns: (1fr, auto), - align: (left, right), - [Faculty of Engineering of the University of Porto (FEUP)], - [_(Incomplete)_] -) - -#grid( - columns: (1fr, auto), - align: (left, right), - text(weight: "medium")[Bachelor's Degree, Electronics Engineering], - [January 2016 - July 2018] -) -#v(-8pt) -#grid( - columns: (1fr, auto), - align: (left, right), - [Polytechnic School of Pernambuco (POLI-UPE)], - [_(Incomplete)_] -) - -#section[Skills] -JavaScript, TypeScript, HTML, CSS, React, React Native, Next.js, React Router, Remix, TanStack Query, Vite, Redux, Astro, Node.js, Express.js, Fluture, Jest, Vitest, Playwright, Cypress, React Testing Library, Tailwind CSS, styled-components, Emotion, Theme UI, Radix UI, shadcn/ui, Ruby, Ruby on Rails, GraphQL, PostgreSQL, SQLite, MongoDB, Docker, Terraform, CI/CD, GitHub Actions, Cursor, Claude Code, GitHub Copilot - -#section[Languages] -Portuguese (Native/C2), English (Advanced/C1), and German (Basic/A2). diff --git a/server.ts b/server.ts new file mode 100644 index 0000000..3efeeba --- /dev/null +++ b/server.ts @@ -0,0 +1,37 @@ +import { serve } from "remix/node-serve"; + +import { router } from "./app/router.ts"; + +const port = process.env.PORT ? Number.parseInt(process.env.PORT, 10) : 44_100; + +const server = serve( + async (request) => { + try { + return await router.fetch(request); + } catch (error) { + console.error(error); + return new Response("Internal Server Error", { status: 500 }); + } + }, + { + port, + }, +); + +await server.ready; +console.log(`Server listening on http://localhost:${server.port}`); + +let shuttingDown = false; + +function shutdown() { + if (shuttingDown) { + return; + } + + shuttingDown = true; + server.close(); + process.exit(0); +} + +process.on("SIGINT", shutdown); +process.on("SIGTERM", shutdown); diff --git a/src/components/BaseHead.astro b/src/components/BaseHead.astro deleted file mode 100644 index da0e3fc..0000000 --- a/src/components/BaseHead.astro +++ /dev/null @@ -1,39 +0,0 @@ ---- -interface Props { - title: string; - description: string; - image?: string; -} - -const canonicalURL = new URL(Astro.url.pathname, Astro.site); - -const { title, description, image = "/og-image.jpg" } = Astro.props; ---- - - - - - - - - - - - -{title} - - - - - - - - - - - - - - - - diff --git a/src/components/FormattedDate.astro b/src/components/FormattedDate.astro deleted file mode 100644 index f264044..0000000 --- a/src/components/FormattedDate.astro +++ /dev/null @@ -1,17 +0,0 @@ ---- -interface Props { - date: Date; -} - -const { date } = Astro.props; ---- - - diff --git a/src/components/Header.astro b/src/components/Header.astro deleted file mode 100644 index 7c8f9ef..0000000 --- a/src/components/Header.astro +++ /dev/null @@ -1,11 +0,0 @@ ---- -import { SITE_TITLE } from "../consts"; -import LedgerLabel from "./LedgerLabel.astro"; ---- - -
    - - {SITE_TITLE} - - Frontend Engineer -
    diff --git a/src/components/LedgerLabel.astro b/src/components/LedgerLabel.astro deleted file mode 100644 index e267dd4..0000000 --- a/src/components/LedgerLabel.astro +++ /dev/null @@ -1,26 +0,0 @@ ---- -interface Props { - as?: "h2" | "span" | "div"; - href?: string; - class?: string; -} - -const { as: Tag = "span", href, class: className } = Astro.props as Props; -const classes = - "text-gray-1000 font-sans text-sm font-medium uppercase tracking-wide leading-6"; -const classList = [classes, className]; ---- - -{ - href ? ( - - - - - - ) : ( - - - - ) -} diff --git a/src/components/PostCard.astro b/src/components/PostCard.astro deleted file mode 100644 index c69979f..0000000 --- a/src/components/PostCard.astro +++ /dev/null @@ -1,25 +0,0 @@ ---- -interface Props { - title: string; - description?: string; - href: string; -} - -const { title, description, href } = Astro.props; ---- - -
  • - - {title} - { - description && ( - - {description} - - ) - } - -
  • diff --git a/src/components/SectionHeading.astro b/src/components/SectionHeading.astro deleted file mode 100644 index ce0e762..0000000 --- a/src/components/SectionHeading.astro +++ /dev/null @@ -1,12 +0,0 @@ ---- -import LedgerLabel from "./LedgerLabel.astro"; - -interface Props { - title: string; - href?: string; -} - -const { title, href } = Astro.props; ---- - -{title} diff --git a/src/components/SubtleLink.astro b/src/components/SubtleLink.astro deleted file mode 100644 index 36cf2b5..0000000 --- a/src/components/SubtleLink.astro +++ /dev/null @@ -1,17 +0,0 @@ ---- -interface Props { - href: string; - target?: string; -} - -const { href, target } = Astro.props; ---- - - - diff --git a/src/consts.ts b/src/consts.ts deleted file mode 100644 index 9effb07..0000000 --- a/src/consts.ts +++ /dev/null @@ -1,18 +0,0 @@ -// Place any global data in this file. -// You can import this data from anywhere in your site by using the `import` keyword. - -import { getCollection, type CollectionEntry } from "astro:content"; - -export const SITE_TITLE = "Guilherme de Andrade"; -export const SITE_DESCRIPTION = - "Guilherme de Andrade (@ubmit). Building user-first products and exploring agentic engineering."; - -export const postsSortedByPubDate = (await getCollection("blog")).sort( - (a: CollectionEntry<"blog">, b: CollectionEntry<"blog">) => - b.data.pubDate.valueOf() - a.data.pubDate.valueOf(), -); - -export const talksSortedByPubDate = (await getCollection("talks")).sort( - (a: CollectionEntry<"talks">, b: CollectionEntry<"talks">) => - b.data.pubDate.valueOf() - a.data.pubDate.valueOf(), -); diff --git a/src/content.config.ts b/src/content.config.ts deleted file mode 100644 index 35fc1d9..0000000 --- a/src/content.config.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { defineCollection, z } from "astro:content"; -import { glob } from "astro/loaders"; - -const blog = defineCollection({ - loader: glob({ pattern: "**/*.{md,mdx}", base: "./src/content/blog" }), - schema: z.object({ - title: z.string(), - description: z.string(), - // Transform string to Date object - pubDate: z.coerce.date(), - updatedDate: z.coerce.date().optional(), - heroImage: z.string().optional(), - }), -}); - -const talks = defineCollection({ - loader: glob({ - pattern: "**/*.{md,mdx}", - base: "./src/content/talks", - }), - schema: z.object({ - title: z.string(), - description: z.string(), - pubDate: z.coerce.date(), - updatedDate: z.coerce.date().optional(), - event: z.string().optional(), - slides: z.string().optional(), - recording: z.string().optional(), - }), -}); - -export const collections = { blog, talks }; diff --git a/src/content/blog/agentic-engineering-without-lock-in.md b/src/content/blog/agentic-engineering-without-lock-in.md deleted file mode 100644 index 51d3857..0000000 --- a/src/content/blog/agentic-engineering-without-lock-in.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -title: "Agentic engineering without lock-in" -description: "Building a lock-in-free agentic coding setup with OpenCode and Zed." -pubDate: "Dec 08 2025" ---- - -## Chasing the summit - -The race to the summit that represents the best coding Large Language Model (LLM) started a long time ago, and we have yet to see who will arrive first. It feels like one of those mountain ultramarathon races such as the Madeira Island Ultra Trail (MIUT) with distances over 100km and elevation gains of more than 6,000 meters—except the competitors have no idea how long they'll need to run or how much they'll need to climb, because the finish line is actually unknown. - -One player has definitely put a considerable gap on the chasing group: Anthropic. In my personal experience, the coding LLM that gave me that magical "A-HA" moment was Claude 3.5 Sonnet in conjunction with Cursor. That was the turning point of my experience coding alongside an LLM. Before that, I wasn't really interested in the topic, although I had already been using GitHub Copilot since its early days. Back then, I had no idea which model was powering that experience—and no motivation or curiosity to find out. That was probably because, even though the experience was positive and helpful, it never felt groundbreaking in the sense that it would make me totally rethink how I write code—or perhaps not even write most of the code myself and manage multiple agents instead. But Claude 3.5 Sonnet was enough motivation to make me dig deeper and understand how to leverage AI in my workflow. - -I was a happy user of Claude 3.5 Sonnet (and later versions) with Cursor for months, thinking that would be it—in my mind, it would be pretty difficult to beat. I couldn't have been more wrong. Two weeks ago, I saw a Claude Code demo along with Claude Opus 4.5, and I was fascinated by how much is possible once you rewire your brain and understand that you can manage multiple agents, each with their own specific role, working together on the same project. All while focusing your attention on more complex problems—or even improving specifications or writing new ones to feed into another agent. I wish I had discovered it sooner, but better late than never, right? - -## My own agentic engineering journey - -As you probably expected, I'm now diving deeper into tools like Claude Code and learning how to leverage them to build software. Although Claude Code felt amazing, I wasn't sure about subscribing while other players could appear in a few weeks with something even better—as has been happening if we look at how close together the last best coding LLMs were released. - -As someone who wants freedom but still wants access to great software and AI models, I started searching for the pieces I needed to meet the following requirements while spending the least amount of money on subscriptions: - -- Access to recent and powerful coding models such as Claude Opus 4.5, Claude Sonnet 4.5, GPT-5.1, and Gemini 3 Pro -- An agentic coding assistant as close as possible to Claude Code -- An IDE-integrated coding agent -- Bring Your Own Key (BYOK) policy - -After an entire evening of searching, here's what I found and was able to put together: - -- **[GitHub Copilot Pro](https://github.com/features/copilot/plans)** subscription for $10/mo (with a free 1-month trial), which offers me the models I wanted at a fair price -- **[OpenCode](https://opencode.ai/)**, "the open source AI coding agent" as a Claude Code alternative that provides agentic coding assistance, supports BYOK, and can be integrated with various IDEs for a customizable, lock-in-free workflow. -- **[Zed](https://zed.dev/)**, which not only lets me choose any model I have access to through GitHub Copilot Pro for autocompletion, but also integrates nicely with OpenCode using the [ACP protocol](https://zed.dev/acp). - -## The meta layer - -The first version of this article, which was really raw, was written entirely by me. After putting out all the ideas I wanted to convey, I reached out to Claude Opus 4.5 for help ensuring my grammar was correct, the text was clear, and there wasn't any false or incorrect information about the mentioned models and tools. - -And that's pretty much how I leverage coding agents when I'm actively writing code in my IDE of choice. In most situations, I know I can write code faster without focusing too much on details because I'll be able to sharpen those rough edges with the AI coding agent's help. Also, when the code I need to write is too boilerplate-heavy, I do it the other way around: I let the agent take care of the boilerplate and then only need to sprinkle in some code to get a good output. diff --git a/src/content/blog/introduction-to-functional-programming-in-javascript.md b/src/content/blog/introduction-to-functional-programming-in-javascript.md deleted file mode 100644 index a94f158..0000000 --- a/src/content/blog/introduction-to-functional-programming-in-javascript.md +++ /dev/null @@ -1,737 +0,0 @@ ---- -title: "Introduction to Functional Programming in JavaScript" -description: "A friendly introduction to the functional world through JS." -pubDate: "Jan 08 2022" ---- - -The motivation behind this blog post is to challenge the myth that functional programming, FP for short, is hard to learn and isn't possible to be used with JavaScript. - -## Origins of Functional Programming in JavaScript - -The functional paradigm has noticeably grown in the past years. Currently, there are interesting functional languages with good JavaScript intertop. Some of those languages included PureScript, ClojureScript, Elm and ReScript. They help us creating solutions to real-world problems. FP, however, is not all that new and in fact it's quite old! It started with LISP at 1968 and came from a project led by John McCarthy at MIT. - -## Why Should I Care? - -Now, you may be asking yourself whether or not you should care about FP. To help answer this question, let's take a look at a problem being solved in different ways, starting with a typical procedural approach and gradually improving it using functional programming concepts. - -### The Procedural Way - -Imagine we're building a feature to validate and process user input for a registration form. Here's how many developers might approach it: - -```js -// Procedural approach -function processUserRegistration(userInput) { - let username = userInput.username; - let errors = []; - - // Validation logic mixed with processing - if (username) { - username = username.trim(); - - if (username.length > 0) { - username = username.toLowerCase(); - - // Check database - const existingUser = database.users[username]; - if (existingUser) { - errors.push("Username already exists"); - return { success: false, errors: errors }; - } else { - // More validation - if (username.length < 3) { - errors.push("Username too short"); - return { success: false, errors: errors }; - } - - if (!/^[a-z0-9]+$/.test(username)) { - errors.push("Username contains invalid characters"); - return { success: false, errors: errors }; - } - - // Success case buried at the bottom - return { success: true, username: username }; - } - } else { - errors.push("Username cannot be empty"); - return { success: false, errors: errors }; - } - } else { - errors.push("Username is required"); - return { success: false, errors: errors }; - } -} -``` - -This code works, but it has several problems: - -- **Nested conditionals** make it hard to follow the logic -- **Multiple return points** scattered throughout -- **Mutations** (`let` variables being reassigned) -- **Mixed concerns** (validation, transformation, and database checks all in one function) -- **Hard to test** (you'd need to mock the database for every test) -- **Hard to reuse** (can't use individual validation rules elsewhere) - -### The Functional Way (Pure Functions) - -Let's refactor this using pure functions. First, we'll break down the problem into small, testable pieces: - -```js -// Small, pure functions that do one thing each -const trim = (str) => str.trim(); -const toLowerCase = (str) => str.toLowerCase(); -const isNotEmpty = (str) => str.length > 0; -const isMinLength = (min) => (str) => str.length >= min; -const isAlphanumeric = (str) => /^[a-z0-9]+$/.test(str); - -// Validation functions that return error messages or null -const validateNotEmpty = (username) => - isNotEmpty(username) ? null : "Username cannot be empty"; - -const validateMinLength = (username) => - isMinLength(3)(username) ? null : "Username too short"; - -const validateAlphanumeric = (username) => - isAlphanumeric(username) ? null : "Username contains invalid characters"; - -const checkUserExists = (database) => (username) => - database.users[username] ? "Username already exists" : null; - -// Compose them together -function processUserRegistration(userInput, database) { - if (!userInput.username) { - return { success: false, errors: ["Username is required"] }; - } - - // Transform the input - const username = toLowerCase(trim(userInput.username)); - - // Run all validations - const validations = [ - validateNotEmpty, - validateMinLength, - validateAlphanumeric, - checkUserExists(database), - ]; - - const errors = validations - .map((validate) => validate(username)) - .filter((error) => error !== null); - - // Return result - if (errors.length > 0) { - return { success: false, errors }; - } - - return { success: true, username }; -} -``` - -Notice the improvements: - -- **Single responsibility**: Each function does exactly one thing -- **Easy to test**: You can test `isMinLength` without touching a database -- **Reusable**: These validation functions can be used anywhere -- **Composable**: Easy to add or remove validations -- **Readable**: The main function reads like a story - -But we can make this even better! Let's introduce function composition. - -### Function Composition with Pipe - -One powerful concept in FP is **function composition** - combining simple functions to build complex behavior. Let's look at two ways to do this: - -```js -// compose: applies functions right to left (like math notation) -const compose = - (...fns) => - (arg) => - fns.reduceRight((prev, fn) => fn(prev), arg); - -// pipe: applies functions left to right (more intuitive for reading) -const pipe = - (...fns) => - (arg) => - fns.reduce((prev, fn) => fn(prev), arg); -``` - -Now we can transform data in a clear, linear way: - -```js -// Transform the username: trim, then lowercase -const prepareUsername = pipe(trim, toLowerCase); - -// Or with compose (reads right to left) -const prepareUsername = compose(toLowerCase, trim); - -// Usage -prepareUsername(" JohnDoe "); // "johndoe" -``` - -The difference is just ordering: - -- **`pipe`**: calls functions left to right (trim → toLowerCase) -- **`compose`**: calls functions right to left, matching math notation `f∘g` where `g` is applied first - -Most people find `pipe` more intuitive, so we'll use that from now on. - -Here's our registration function using `pipe`: - -```js -// Now our transformation is crystal clear -const prepareUsername = pipe(trim, toLowerCase); - -function processUserRegistration(userInput, database) { - if (!userInput.username) { - return { success: false, errors: ["Username is required"] }; - } - - const username = prepareUsername(userInput.username); - - const validations = [ - validateNotEmpty, - validateMinLength, - validateAlphanumeric, - checkUserExists(database), - ]; - - const errors = validations - .map((validate) => validate(username)) - .filter((error) => error !== null); - - if (errors.length > 0) { - return { success: false, errors }; - } - - return { success: true, username }; -} -``` - -### Why This Matters - -By using pure functions and composition, we've gained several benefits: - -**Predictability**: Pure functions always return the same output for the same input. No surprises, no hidden behavior. This makes debugging significantly easier. - -**Testability**: Each function can be tested in isolation. Want to test username validation? Just call `validateMinLength("ab")` - no setup required. - -**Reusability**: Need to validate usernames in multiple places? Just import the functions you need. - -**Refactoring confidence**: Since functions don't depend on external state, you can refactor fearlessly. Change the implementation without worrying about breaking distant parts of your code. - -**Readability**: The code reads top-to-bottom like a recipe. No mental juggling of state or jumping around to follow the logic. - -In the next sections, we'll explore the core concepts that make this possible, and then introduce some powerful patterns for handling common scenarios like null values and error handling. - -## Cornerstones of Functional Programming - -### Pure Functions - -The concept of a pure function comes from mathematics. To fully understand it, let's take a step back and discuss the mathematical definition of a function. - -> "A function is a relation between two sets (A and B), where A is a set of inputs and B is a set of possible outputs. However, each input must be related to exactly one output." - -The definition brings up some interesting things: - -- An input cannot be related to multiple outputs, it must be related to a single one -- A function doesn't care about its context, it only cares about returning an output for a given input -- A function not only doesn't care about its context, it also doesn't bother affecting it - -A pure function holds all of these properties. Let's see what this means in practice: - -```js -// ❌ Impure: depends on external state -let maxPrice = 2.0; -const checkPrice = (price) => price <= maxPrice; - -checkPrice(1.5); // true -maxPrice = 1.0; // Someone changed it! -checkPrice(1.5); // false - same input, different output! - -// ✅ Pure: all inputs are explicit -const checkPrice = (price, maxPrice) => price <= maxPrice; - -checkPrice(1.5, 2.0); // true -checkPrice(1.5, 2.0); // true - always the same! -``` - -The impure version is unpredictable because it depends on external state. The pure version always returns the same output for the same inputs. - -Here's another example showing **side effects**: - -```js -// ❌ Impure: has side effects -const users = []; -const registerUser = (username) => { - users.push(username); // Modifies external state! - console.log(`Registered: ${username}`); // Side effect! - return username; -}; - -// ✅ Pure: no side effects, returns new state -const registerUser = (users, username) => { - return [...users, username]; // Returns new array -}; - -// The caller handles side effects -const newUsers = registerUser([], "alice"); -console.log(`Registered: ${newUsers[0]}`); -``` - -**Common side effects to avoid in pure functions:** - -- Modifying variables outside the function scope -- Mutating input parameters -- Making API calls or database queries -- Writing to files or console -- Getting the current time or random numbers - -Pure functions make your code more predictable, testable, and easier to reason about. When you see a pure function, you know exactly what it does just by looking at its inputs and outputs. - -## First-Class Functions - -A programming language is said to have first-class functions if it holds the following conditions: - -✅ A function can be assigned to a variable - -```js -function foo(x, y) { - return x + y; -} - -const add = foo; - -add(1, 2); // 3 -``` - -✅ A function can be an argument of another function - -```js -const fibonacci = [0, 1, 1, 2, 3, 5, 8]; - -fibonacci.map(checkPrice); -// [ true, true, true, true, false, false, false ] - -fibonacci.filter(checkPrice); -// [ 0, 1, 1, 2 ] - -fibonacci.reduce(add); -// 20 -``` - -✅ A function can be returned from another function - -```js -const checkPrice = (max) => (price) => price <= max; - -const checkPriceBelowOrEqualTwo = checkPrice(2); - -checkPriceBelowOrEqualTwo(5); // false -``` - -## Immutability - -> "...the true constant is change. Mutation hides change. Hidden change creates chaos." — Eric Elliott - -Immutable data structures cannot be modified after they are defined. Instead of changing existing data, you create new versions with the desired changes. This might sound wasteful, but it brings huge benefits for debugging and reasoning about your code. - -In JavaScript, only primitive values (strings, numbers, booleans) are immutable by default. When working with objects and arrays, you need to be deliberate about avoiding mutations. - -**Why immutability matters:** - -- **Predictability**: If data can't change, you always know what you're working with -- **Time-travel debugging**: You can keep old versions of state and replay changes -- **Easier testing**: No need to worry about test pollution from mutations -- **Safe concurrency**: Multiple functions can work with the same data without conflicts - -Let's see what mutation looks like and why it's problematic: - -```js -// ❌ Mutation can cause bugs -const settings = { theme: "dark", fontSize: 14 }; - -function updateTheme(settings) { - settings.theme = "light"; // Mutates the original! - return settings; -} - -const newSettings = updateTheme(settings); -console.log(settings.theme); // "light" - Oops! Original was changed -``` - -Now let's see the immutable approach: - -```js -// ✅ Immutable update using spread operator -const settings = { theme: "dark", fontSize: 14 }; - -function updateTheme(settings) { - return { ...settings, theme: "light" }; // Creates new object -} - -const newSettings = updateTheme(settings); -console.log(settings.theme); // "dark" - Original unchanged! -console.log(newSettings.theme); // "light" - New version -``` - -**Important note about `const`**: Using `const` doesn't make objects immutable! It only prevents reassignment of the variable: - -```js -const user = { name: "Alice" }; -user.name = "Bob"; // This works! const doesn't prevent mutation -user = { name: "Charlie" }; // This fails! const prevents reassignment -``` - -**Working with nested objects:** - -```js -const order = { - customer: "Alice", - items: { - drinks: ["coffee", "tea"], - food: ["sandwich"], - }, -}; - -// Update nested data immutably -const updatedOrder = { - ...order, - items: { - ...order.items, - drinks: [...order.items.drinks, "juice"], // Add new drink - }, -}; - -// Original is unchanged -console.log(order.items.drinks); // ["coffee", "tea"] -console.log(updatedOrder.items.drinks); // ["coffee", "tea", "juice"] -``` - -**Working with arrays:** - -```js -const fruits = ["apple", "banana", "orange"]; - -// ✅ Adding items (immutable) -const moreFruits = [...fruits, "mango"]; - -// ✅ Removing items (immutable) -const lessFruits = fruits.filter((fruit) => fruit !== "banana"); - -// ✅ Updating items (immutable) -const updatedFruits = fruits.map((fruit) => - fruit === "apple" ? "green apple" : fruit, -); - -// ❌ Mutating operations to avoid -fruits.push("grape"); // Mutates original -fruits.pop(); // Mutates original -fruits.sort(); // Mutates original -``` - -As you can see in these examples, the spread operator (`...`) along with array methods like `map` and `filter` help us avoid mutations while working with arrays and objects. - -For complex nested updates, there are libraries such as [Immer](https://github.com/immerjs/immer) and [Immutable.js](https://github.com/immutable-js/immutable-js) that make working with immutable data much easier. - -## Practical Functional Patterns - -Now that we understand the fundamentals—pure functions, first-class functions, and immutability—let's explore some practical patterns that functional programmers use to handle real-world scenarios. Specifically, we'll look at how to safely work with values that might be `null` or `undefined`. - -### The Problem with Null - -One of the most common bugs in JavaScript comes from trying to access properties on `null` or `undefined`: - -```js -const getUserEmail = (userId) => { - const user = database.findUser(userId); // Might return null - return user.email; // 💥 Cannot read property 'email' of null -}; -``` - -The traditional solution is defensive checks everywhere: - -```js -const getUserEmail = (userId) => { - const user = database.findUser(userId); - if (user !== null && user !== undefined) { - return user.email; - } else { - return null; - } -}; -``` - -This works, but it's verbose and error-prone. Forget one check and your app crashes. There's a better way! - -### Introducing the Box Pattern - -The **Box** (also called Identity functor) is a simple wrapper that lets us chain operations on a value: - -```js -const Box = (x) => ({ - // map: transform the value inside the box - map: (f) => Box(f(x)), - - // fold: extract the final value - fold: (f) => f(x), - - // inspect: for debugging - inspect: () => `Box(${x})`, -}); -``` - -Here's how it works: - -```js -const result = Box(5) - .map((x) => x * 2) // Box(10) - .map((x) => x + 3) // Box(13) - .fold((x) => x); // 13 - -console.log(result); // 13 -``` - -**Why is this useful?** It lets us chain transformations without manually passing values between functions. Think of it like a pipeline where data flows through. - -Let's see a more practical example: - -```js -// Without Box: manual passing -const formatPrice = (price) => { - const doubled = price * 2; - const withTax = doubled * 1.1; - const rounded = Math.round(withTax); - const formatted = `$${rounded}`; - return formatted; -}; - -// With Box: clear pipeline -const formatPrice = (price) => - Box(price) - .map((x) => x * 2) // Double it - .map((x) => x * 1.1) // Add tax - .map(Math.round) // Round - .map((x) => `$${x}`) // Format - .fold((x) => x); // Extract - -formatPrice(5); // "$11" -``` - -The `Box` version reads like a recipe: "take the price, double it, add tax, round it, format it." No temporary variables needed! - -### Understanding map and fold - -Let's break down these two key methods: - -**`map(f)`**: Applies a function to the value inside the `Box`, and returns a new `Box` with the transformed value. - -```js -Box(10) - .map((x) => x * 2) // Returns Box(20) - .map((x) => x + 5); // Returns Box(25) -``` - -Think of `map` like Array's `map`, but for a single value. It keeps the value "boxed" so you can keep chaining. - -**`fold(f)`**: Extracts the value from the `Box` by applying a function to it. - -```js -const result = Box(10) - .map((x) => x * 2) - .fold((x) => x); // Extracts 20 -``` - -You can think of `fold` as "unboxing" the value to get back to regular JavaScript. - -### Extending Box to Handle Null: The Maybe Pattern - -Now let's make `Box` smarter so it can handle `null` and `undefined` safely. We'll call this **Maybe** (also known as Option in some languages): - -```js -const Maybe = (x) => ({ - // Check if the value is null or undefined - isNothing: x === null || x === undefined, - - // map: only transform if we have a value - map(f) { - return this.isNothing ? Maybe(null) : Maybe(f(x)); - }, - - // chain: for functions that return another Maybe - // prevents Maybe(Maybe(value)) - chain(f) { - return this.isNothing ? Maybe(null) : f(x); - }, - - // fold: handle both cases (null and value) - fold(onNothing, onValue) { - return this.isNothing ? onNothing() : onValue(x); - }, - - // inspect: for debugging - inspect() { - return this.isNothing ? "Maybe(Nothing)" : `Maybe(${x})`; - }, -}); - -// Helper function to create a Maybe from a nullable value -const fromNullable = (x) => Maybe(x); -``` - -Now we can safely chain operations without checking for null at each step: - -```js -const getStreetName = (user) => - Maybe(user) - .map((u) => u.address) // Might be null - .map((a) => a.street) // Might be null - .map((s) => s.name) // Might be null - .fold( - () => "Unknown street", // Handle null case - (name) => name, // Handle success case - ); - -// Test it -const user1 = { address: { street: { name: "Main St" } } }; -const user2 = { address: null }; -const user3 = null; - -getStreetName(user1); // "Main St" -getStreetName(user2); // "Unknown street" -getStreetName(user3); // "Unknown street" -``` - -No null checks, no crashes! If any step returns null, the rest of the chain is skipped, and we go straight to the `onNothing` function in `fold`. - -### Understanding chain vs map - -You might be wondering: when do I use `chain` instead of `map`? Let's clarify: - -**Use `map`** when your function returns a regular value: - -```js -Maybe(5) - .map((x) => x * 2) // Returns Maybe(10) ✅ - .fold( - () => 0, - (x) => x, - ); -``` - -**Use `chain`** when your function returns another Maybe: - -```js -const safeDivide = (a, b) => (b === 0 ? Maybe(null) : Maybe(a / b)); - -// ❌ Using map creates Maybe(Maybe(5)) -Maybe(10).map((x) => safeDivide(x, 2)); // Maybe(Maybe(5)) - nested! - -// ✅ Using chain flattens it to Maybe(5) -Maybe(10).chain((x) => safeDivide(x, 2)); // Maybe(5) - flat! -``` - -`chain` "flattens" the result, preventing nested Maybes. - -### A Complete Example: Safe Data Access - -Let's revisit our juice store example from earlier, now using Maybe: - -```js -const juices = { - passionfruit: "$2.50", - orange: "$2.00", - apple: "$1.50", -}; - -// Helper functions (pure!) -const trim = (str) => str.trim(); -const toLowerCase = (str) => str.toLowerCase(); -const removeAccents = (str) => - str.normalize("NFD").replace(/[\u0300-\u036f]/g, ""); - -// Process juice name and look up price safely -const getJuicePrice = (inputValue) => - Maybe(inputValue) - .map(trim) // Remove whitespace - .map(toLowerCase) // Normalize case - .map(removeAccents) // Remove accents - .chain((juiceName) => fromNullable(juices[juiceName])) // Lookup (might be null) - .fold( - () => "error", // If any step failed or juice not found - (price) => price, // Success! Return the price - ); - -// Test it -getJuicePrice(" Passionfruit "); // "$2.50" -getJuicePrice("ORANGE"); // "$2.00" -getJuicePrice("banana"); // "error" - not in our list -getJuicePrice(null); // "error" - null input -``` - -Notice how clean this is compared to nested if-statements! Each transformation is clearly stated, and null handling is automatic. - -### Comparing to Traditional Error Handling - -You might be wondering: how does this compare to try/catch? Let's see: - -```js -// Traditional try/catch approach -function getUserDiscount(userId) { - try { - const user = database.findUser(userId); - if (!user) throw new Error("User not found"); - - const membership = user.membership; - if (!membership) throw new Error("No membership"); - - const discount = membership.discount; - if (!discount) throw new Error("No discount"); - - return discount; - } catch (error) { - console.error(error.message); - return 0; - } -} - -// Functional approach with Maybe -const getUserDiscount = (userId) => - Maybe(database.findUser(userId)) - .map((user) => user.membership) - .map((membership) => membership.discount) - .fold( - () => 0, // Default if anything is null - (discount) => discount, - ); -``` - -The `Maybe` version is shorter, doesn't need try/catch, and makes the "happy path" obvious. Plus, it's composable—you can easily chain more operations. - -### When to Use These Patterns - -Here's a quick guide for beginners: - -**Use pure functions + pipe/compose** for: - -- Transforming data -- Simple validations -- Business logic -- Most day-to-day programming - -**Use Maybe/Box** when: - -- Dealing with nullable values (API responses, database queries, user input) -- You want to chain operations that might fail -- You want to avoid nested if-statements -- You're working with optional data - -**Use traditional try/catch** when: - -- Dealing with actual exceptions (network errors, file system errors) -- Using libraries that throw errors -- You need to log detailed error information - -These patterns aren't about replacing all your code—they're tools in your toolbox. Use them when they make your code clearer and safer. - -## Dive Deeper - -Fortunately, as it has been shown in this article, it’s definitely possible to use functional programming with plain JavaScript. However, if you really want to dive deeper into this paradigm while using JavaScript, you’ll probably want to use some already existing functional libraries such as [Sanctuary](https://github.com/sanctuary-js/sanctuary), [Fluture](https://github.com/fluture-js/Fluture), [Ramda](https://github.com/ramda/ramda) and others. diff --git a/src/content/blog/use-an-object-instead-of-a-switch.md b/src/content/blog/use-an-object-instead-of-a-switch.md deleted file mode 100644 index ec30f4d..0000000 --- a/src/content/blog/use-an-object-instead-of-a-switch.md +++ /dev/null @@ -1,99 +0,0 @@ ---- -title: "Replace switch statements with object lookups" -description: "A quick refactoring tip to improve readability when mapping keys to values." -pubDate: "Jan 02 2022" ---- - -Sometimes we can do a simple refactor and achieve a lot with it! The example I'm going to show was taken from a real project that has been working just fine for a long time. Still, that doesn't mean we shouldn't take the initiative to improve simply because it's already working. However, we also need to be pragmatic and not fall into the perfectionism trap—endlessly polishing code that's already "good enough." Basically, we should find the sweet spot where the effort necessary is paid by its own results. - -I was working on a module that had a `getMonth` function which would return the translation key according to the given month: - -```ts -const getMonth = (month: string) => { - let translationKey = ""; - switch (month) { - case "January": - translationKey = "JANUARY_TRANSLATION_KEY"; - break; - case "February": - translationKey = "FEBRUARY_TRANSLATION_KEY"; - break; - case "March": - translationKey = "MARCH_TRANSLATION_KEY"; - break; - case "April": - translationKey = "APRIL_TRANSLATION_KEY"; - break; - case "May": - translationKey = "MAY_TRANSLATION_KEY"; - break; - case "June": - translationKey = "JUNE_TRANSLATION_KEY"; - break; - case "July": - translationKey = "JULY_TRANSLATION_KEY"; - break; - case "August": - translationKey = "AUGUST_TRANSLATION_KEY"; - break; - case "September": - translationKey = "SEPTEMBER_TRANSLATION_KEY"; - break; - case "October": - translationKey = "OCTOBER_TRANSLATION_KEY"; - break; - case "November": - translationKey = "NOVEMBER_TRANSLATION_KEY"; - break; - case "December": - translationKey = "DECEMBER_TRANSLATION_KEY"; - } - return translationKey; -}; -``` - -In this case, it was clear to me what I would accomplish using an object instead of a switch statement: better readability and reduced [cognitive complexity](https://www.sonarsource.com/resources/white-papers/cognitive-complexity/). - -Why an object? Well, if you take a closer look at what the `getMonth` function is doing, you realize that it's doing nothing but mapping keys to values, which is exactly what an object does! - -Therefore, a switch statement isn't needed at all. Actually, it just makes the code less readable and increases its cognitive complexity. So, after refactoring: - -```ts -const MONTH_TO_TRANSLATION_KEY = { - January: "JANUARY_TRANSLATION_KEY", - February: "FEBRUARY_TRANSLATION_KEY", - March: "MARCH_TRANSLATION_KEY", - April: "APRIL_TRANSLATION_KEY", - May: "MAY_TRANSLATION_KEY", - June: "JUNE_TRANSLATION_KEY", - July: "JULY_TRANSLATION_KEY", - August: "AUGUST_TRANSLATION_KEY", - September: "SEPTEMBER_TRANSLATION_KEY", - October: "OCTOBER_TRANSLATION_KEY", - November: "NOVEMBER_TRANSLATION_KEY", - December: "DECEMBER_TRANSLATION_KEY", -} as const; - -type Month = keyof typeof MONTH_TO_TRANSLATION_KEY; - -const getMonth = (month: Month) => MONTH_TO_TRANSLATION_KEY[month]; -``` - -Notice that the refactored version is also **safer**. The original switch returns an empty string for invalid months—a silent failure that could cause bugs downstream. With the `Month` type, invalid inputs become a compile-time error. TypeScript won't even let you call `getMonth("Janaury")` (typo intended). - -If you need to handle unknown inputs at runtime (e.g., from an API), you can add a fallback: - -```ts -const getMonth = (month: string) => - MONTH_TO_TRANSLATION_KEY[month as Month] ?? "UNKNOWN_MONTH_KEY"; -``` - -## When to keep the switch - -This pattern works great when you're purely mapping keys to values. However, a switch statement is still the right choice when: - -- Cases have complex logic beyond simple value mapping -- You need fall-through behavior -- You're matching against non-string types or patterns - -**tl;dr:** whenever we notice that the switch is doing nothing more than mapping keys to values, we should use an object instead. diff --git a/src/content/talks/from-prompts-to-predictable-user-interfaces.md b/src/content/talks/from-prompts-to-predictable-user-interfaces.md deleted file mode 100644 index 854c296..0000000 --- a/src/content/talks/from-prompts-to-predictable-user-interfaces.md +++ /dev/null @@ -1,545 +0,0 @@ ---- -title: "From Prompts to Predictable User Interfaces" -description: "Three techniques for building reliable AI-generated UIs: structured output formats, feedback loops, and design system contracts." -pubDate: "January 22 2026" ---- - -You give a coding agent the same prompt twice. You get two completely different UIs. - -That's not a bug, it's just how LLMs work. Non-determinism is baked into these models. Same input, different output. Every time. When you're generating code, this creates a predictability problem: you don't know what you're going to get. One run gives you clean, modular components. The next? A spaghetti mess with a totally different framework approach. - -If you've built anything with LLMs, you've felt this. You craft the "perfect" prompt, it works during your demo, then you run it for a customer and it produces something completely different. Not necessarily wrong, just _different_. And in software, different usually means unreliable. - -The fix isn't writing "better" prompts. It's adding constraints. - -## Constraints are features - -When you limit choices, you get predictable results. This works for design systems, code architecture, and AI-generated UIs. Instead of letting the LLM wander through infinite possibilities, give it a small, well-defined map to follow. - -I spoke at [FE.OPO #9](https://www.youtube.com/live/omoDqK2kWKU?si=zsB14TzXFnZyJfKe&t=429) about three ways to tame this unpredictability: - -1. **Figma MCP (Design System Contracts)**: Turning Figma into a machine-readable source of truth. -2. **agent-browser (Visual Feedback Loops)**: A "Generate → Validate → Iterate" cycle that actually sees what it built. -3. **json-render (Structured Output)**: Swapping free-form code for a strict component catalog. - -Let's break down how they work. - -## 1. Figma MCP: Design as contract - -**The frustration**: The "telephone game" of design handoff. - -A designer builds a mockup, a developer interprets the visuals, and somewhere the implementation drifts. Colors are a hex code off. Spacing feels wrong. Typography doesn't quite match. This gap between intent and implementation is where UI quality dies. - -**The fix**: Stop interpreting. Start extracting. - -Figma MCP (Model Context Protocol) lets an agent read Figma files programmatically. Extract components, design tokens, variants. Generate code that matches design exactly. No interpretation gap. - -**Step 1: Extract design tokens** - -```typescript -// Use Figma MCP -mcp__figma__get_variable_defs(fileKey, nodeId); - -// Generates tokens.ts: - -// Design tokens extracted from Figma Simple Design System -// https://www.figma.com/design/dHqyIhebbTxZSzOun8aAaA/Simple-Design-System--Community- -export const tokens = { - color: { - text: { - brandOnBrand: "#f5f5f5", - default: "#1e1e1e", - subtle: "#666666", - }, - background: { - brandDefault: "#1e1e1e", - brandHover: "#2d2d2d", - neutral: "#e5e5e5", - neutralHover: "#d4d4d4", - subtle: "transparent", - subtleHover: "#f5f5f5", - }, - border: { - neutral: "#d4d4d4", - subtle: "#e5e5e5", - }, - }, - typography: { - body: { - fontFamily: "Inter, sans-serif", - fontWeightRegular: 400, - sizeMedium: "16px", - sizeSmall: "14px", - }, - }, - spacing: { - xs: "4px", - sm: "8px", - md: "12px", - lg: "16px", - }, - borderRadius: { - sm: "4px", - md: "6px", - }, -} as const; -``` - -If you are using Tailwind CSS you could easily ask your coding agent to convert this file to Tailwind's V4 CSS configuration: - -```css -/* don't worry about the variable names */ -/* they are bad, but that's just an example */ -@import "tailwindcss"; - -@theme { - /* Colors - Text */ - --color-brand-on-brand: #f5f5f5; - --color-default: #1e1e1e; - --color-subtle: #666666; - --color-disabled: #a3a3a3; - - /* Colors - Background */ - --color-bg-brand: #2c2c2c; - --color-bg-brand-hover: #1e1e1e; - --color-bg-neutral: #e3e3e3; - --color-bg-neutral-hover: #cdcdcd; - --color-bg-subtle-hover: #f5f5f5; - --color-bg-disabled: #e5e5e5; - - /* Colors - Border */ - --color-border-primary: #2c2c2c; - --color-border-neutral: #767676; - --color-border-subtle: #d9d9d9; - --color-border-disabled: #b3b3b3; - - /* Typography */ - --font-body: "Inter", sans-serif; - - /* Border Radius */ - --radius-md: 8px; - - /* Spacing */ - --spacing-sm: 8px; - --spacing-md: 12px; -} -``` - -These become your single source of truth. Change Figma variable, re-extract, update tokens.ts. Design stays in sync with code. - -**Step 2: Extract component structure** - -```typescript -// Extract Button component -mcp__figma__get_design_context(fileKey, buttonNodeId); -``` - -```tsx -// Returns React component code with Base UI + Tailwind CSS: -import * as React from "react"; -import { Button as BaseButton } from "@base-ui/react/button"; -import { cva, type VariantProps } from "class-variance-authority"; - -export interface ButtonProps - extends - Omit, "disabled">, - VariantProps {} - -const buttonVariants = cva( - "inline-flex items-center justify-center gap-2 border font-body font-normal leading-none rounded-md transition-colors", - { - variants: { - variant: { - primary: "bg-bg-brand text-brand-on-brand", - neutral: "bg-bg-neutral text-default", - subtle: "bg-transparent text-default border-transparent", - }, - size: { - small: "h-8 p-sm text-sm", - medium: "h-10 p-md text-base", - }, - disabled: { - false: null, - true: "bg-bg-disabled text-disabled cursor-not-allowed border-border-disabled", - }, - }, - compoundVariants: [ - { - variant: "primary", - disabled: false, - className: "border-border-primary hover:bg-bg-brand-hover", - }, - { - variant: "neutral", - disabled: false, - className: "border-border-neutral hover:bg-bg-neutral-hover", - }, - { - variant: "subtle", - disabled: false, - className: "hover:border-border-subtle", - }, - ], - defaultVariants: { - variant: "primary", - size: "medium", - disabled: false, - }, - }, -); - -export function Button({ - className, - variant, - size, - children, - disabled, - ...props -}: ButtonProps) { - return ( - - {children} - - ); -} -``` - -For a Button component with 18 variants (3 visual styles × 3 states × 2 sizes), Figma MCP extracts all of them and maps to accessible primitives like Base UI. - -**Step 3: Generate Storybook stories** - -For each Figma variant, generate a Storybook story: - -```typescript -// examples/design-system-demo/src/components/button.stories.tsx -export const PrimaryDefaultMedium: Story = { - args: { - variant: "primary", - size: "medium", - children: "Button", - }, -}; - -export const PrimaryHoverMedium: Story = { - args: { - variant: "primary", - size: "medium", - children: "Button", - }, - parameters: { - pseudo: { hover: true }, - }, -}; - -export const PrimaryDisabledMedium: Story = { - args: { - variant: "primary", - size: "medium", - children: "Button", - disabled: true, - }, -}; - -// ...15 more variants -``` - -Storybook becomes documentation that matches Figma exactly. Designers and developers reference the same source. - -**Why this works**: - -- Design tokens aren't scattered across Slack messages and CSS files. They live in Figma and sync to code. -- Stop hand-coding 18 button variants. Let the machine do the grunt work. -- When a designer changes "Primary Blue," the code updates automatically. -- You can compare a screenshot of the code against the original Figma node to verify they match. - -**When to use it**: You have a solid design system in Figma. You're building a component library. The gap between design and dev is causing friction. - -**When to skip it**: You don't have a design system yet. Your designs are changing so fast that extraction becomes a bottleneck. - -The power is in the constraint. Figma becomes the boss. You're not guessing, you're following a contract. - -## 2. Visual feedback loops: Giving the AI eyes - -**The blind spot**: LLMs reason about code well, but they're blind to how that code actually _looks_. - -An LLM knows `justify-center` should center an item. It understands a footer belongs at the bottom. But it has no idea about browser quirks, z-index collisions, or parent container constraints. It's writing code into a void. - -We've all seen it: - -- **Prompt**: "Center the login form." -- **Code**: Looks perfect on paper. -- **Reality**: Shoved into the top-left corner because of a CSS reset it didn't see coming. - -**The fix**: A "Generate → Validate → Iterate" loop. - -Build a feedback loop: the LLM generates code, you (or a tool) validate the rendered output, then feed results back for iteration. The constraint is forcing validation before considering work done. - -Two tools enable this: **agent-browser** (natural language) and **Playwright MCP** (screenshots). Different tradeoffs. - -A login form I built for the demo: - -```tsx -// examples/feedback-loop-demo/app/page.tsx -export default function Page() { - return ( -
    -
    -
    -

    - Welcome back -

    -

    - Sign in to your account to continue -

    - -
    -
    - - -
    - {/* password, checkbox, button... */} -
    -
    -
    -
    - ); -} -``` - -To validate with **agent-browser**: - -```bash -# Navigate and get snapshot -Navigate to http://localhost:3001 and validate the login form layout. -Check if email input, password input, and submit button are all visible -and properly aligned. -``` - -agent-browser returns natural language: - -``` -* Page loaded successfully -* Login form card visible at center -* Email input: visible, properly labeled, placeholder present -* Password input: visible, properly labeled, placeholder present -* Submit button: visible, blue background, prominent -* Visual hierarchy: excellent (title → inputs → button → footer) -* Accessibility: labels properly associated with inputs -! Minor: "Forgot password" link small, could be more prominent - -Overall: Form displays correctly with good UX -``` - -This output validates all key elements, identifies an improvement opportunity, and uses ~500 bytes vs ~50KB for screenshots. That means 100+ iterations within a typical context window. - -Compare to **Playwright MCP**: - -```typescript -// Would require: -mcp__playwright__browser_navigate({ url: "http://localhost:3001" }); -mcp__playwright__browser_snapshot({ filename: "login-form.md" }); -mcp__playwright__browser_take_screenshot({ filename: "login-form.png" }); -``` - -Returns full page snapshot (markdown + accessibility tree) plus base64 PNG screenshot. ~50KB+ added to context window per screenshot. - -Context budget comparison: - -| Aspect | agent-browser | Playwright MCP | -| --------------- | ------------------- | ------------------------ | -| Output format | Natural language | Markdown + base64 images | -| Context impact | Low (~1KB) | High (~50KB+) | -| Use case | Quick visual checks | Deep inspection | -| Iteration speed | Fast (text-based) | Slower (image-heavy) | -| Precision | Semantic validation | Pixel-perfect validation | - -**When to use agent-browser**: Validating layout, positioning, or basic visibility. Iterating fast. Watching your context window budget. - -**When to use Playwright MCP**: Pixel-perfect comparisons. Complex multi-step user flows. Screenshots for documentation or regression testing. - -The workflow: Generate → Render → Validate → Fix. Forcing the AI to "look" at its work before moving on kills 90% of visual bugs that haunt AI-generated UIs. - -For agentic workflows where an agent iterates autonomously, agent-browser preserves context budget for code changes instead of bloating it with images. - -## 3. json-render: UI as data - -**The chaos**: Free-form code generation is a wild west. - -Even within the same framework, naming conventions and component structures shift every time you hit "Regenerate." - -**The fix**: Stop asking for code. Ask for data. - -json-render implements this pattern: AI → JSONL → UI. Instead of asking the LLM to output React/Vue/whatever directly, you teach it to output JSON Lines patches describing the UI structure. A separate renderer applies those patches and maps them to your component library. - -The key constraint is the **component catalog**. You define available components upfront with Zod schemas: - -```typescript -export const catalog = createCatalog({ - components: { - Card: { - props: z.object({ - title: z.string(), - description: z.string().nullable(), - }), - hasChildren: true, - }, - Button: { - props: z.object({ - label: z.string(), - action: z.string(), - params: z.record(z.string(), z.any()).optional(), - variant: z.enum(["default", "outline", "ghost"]).optional(), - size: z.enum(["default", "sm", "lg"]).optional(), - }), - }, - Text: { - props: z.object({ - content: z.string(), - }), - }, - }, - actions: { - submit: { - params: z.object({ formId: z.string() }), - }, - navigate: { - params: z.object({ url: z.string() }), - }, - }, -}); -``` - -This catalog serves two purposes: - -1. Generates the system prompt teaching the LLM the JSONL format -2. Validates runtime props via `@json-render/core` - -The system prompt becomes your contract: - -```typescript -const SYSTEM_PROMPT = `You are a UI generator that outputs JSONL (JSON Lines) patches. - -AVAILABLE COMPONENTS: -Card, Button, Text - -COMPONENT DETAILS: -- Card: { title: string, description?: string | null } - Container with title, can have children -- Button: { label: string, action: string, params?: object, variant?: "default" | "outline" | "ghost", size?: "default" | "sm" | "lg" } - Clickable button that triggers an action -- Text: { content: string } - Text paragraph - -OUTPUT FORMAT: -Output JSONL where each line is a patch operation. Use a FLAT key-based structure: - -OPERATIONS: -- {"op":"set","path":"/root","value":"main-card"} - Set the root element key -- {"op":"add","path":"/elements/main-card","value":{...}} - Add an element by unique key - -ELEMENT STRUCTURE: -{ - "key": "unique-key", - "type": "ComponentType", - "props": { ... }, - "children": ["child-key-1", "child-key-2"] // Array of child element keys (only for Card) -} - -RULES: -1. First set /root to the root element's key -2. Add each element with a unique key using /elements/{key} -3. Parent elements list child keys in their "children" array -4. Stream elements progressively - parent first, then children -5. Each element must have: key, type, props -6. Children array contains STRING KEYS, not nested objects -7. Only Card can have children - -Generate JSONL patches now:`; -``` - -Notice the constraints: - -- Only 3 components (Card, Button, Text) -- Flat key-based structure (no nesting) -- Only Card supports children -- Children are string keys, not objects -- Specific operations (set, add) - -When you prompt "Create a welcome card with a button," the model generates: - -```jsonl -{"op":"set","path":"/root","value":"welcome-card"} -{"op":"add","path":"/elements/welcome-card","value":{"key":"welcome-card","type":"Card","props":{"title":"Welcome","description":"Thanks for trying json-render"},"children":["greeting-text","get-started-btn"]}} -{"op":"add","path":"/elements/greeting-text","value":{"key":"greeting-text","type":"Text","props":{"content":"This demo shows how AI can generate predictable UIs using structured output formats."}}} -{"op":"add","path":"/elements/get-started-btn","value":{"key":"get-started-btn","type":"Button","props":{"label":"Get Started","action":"navigate","params":{"url":"/home"},"variant":"default"}}} -``` - -These patches stream to the frontend. The `useUIStream` hook parses them. The `Renderer` component applies them to a tree structure. Finally, the component registry maps types to React implementations: - -```tsx -export const registry: ComponentRegistry = { - Card: ({ element, children }) => ( -
    -
    -

    {element.props.title}

    - {element.props.description && ( -

    {element.props.description}

    - )} -
    -
    {children}
    -
    - ), - Button, - Text: ({ element }) =>

    {element.props.content}

    , -}; -``` - -**Why this works**: The LLM _cannot_ deviate. It knows it has exactly three components. It knows what props they take. It has a strict recipe to follow. Limited choices, predictable results. - -**When to use json-render**: You have a set component library and want the AI to assemble UIs. You want progressive streaming. You need to validate output at runtime before it hits the user. - -**When to skip it**: You need total design freedom (custom landing pages). Your layout has deep nesting that's hard to represent flat. Your component library is constantly changing. - -The catalog is your design contract. Change it, regenerate the system prompt, done. - -## Which one should you use? - -These aren't competing tools. They're different layers of the same stack. - -- **Figma MCP**: Your design system is law. You need 1:1 match with Figma files. -- **agent-browser**: Speed and cost matter. The AI gets "semantic vision" to fix its own mistakes without burning context on screenshots. -- **json-render**: You need absolute consistency. Dashboards or internal tools where the AI assembles pre-approved building blocks. - -**Watch your context budget.** If the agent is iterating autonomously, every byte counts. - -- agent-browser (~1KB) beats Playwright screenshots (~50KB) -- json-render patches (~2KB) beat full code generation (~20KB) - -The more expensive your feedback, the fewer chances the AI gets to iterate. - -## The bottom line - -Same prompt, different outputs. That's how LLMs work. Constraints change the game. - -Design contracts (Figma MCP), feedback loops (agent-browser), and structured output (json-render) turn a chaotic generator into something predictable. - -These aren't silver bullets. Figma MCP has rate limits. agent-browser won't catch every pixel-perfect glitch. json-render isn't built for infinite design freedom. - -But guardrails work. When you constrain the problem space and make choices finite, you get code you can trust. - -Predictability through constraints. Not despite them. - ---- - -All code from this post is available at [ubmit/from-prompts-to-predictable-user-interfaces](https://github.com/ubmit/from-prompts-to-predictable-user-interfaces). Slides, demos, and full examples are all there. diff --git a/src/env.d.ts b/src/env.d.ts deleted file mode 100644 index aabef7f..0000000 --- a/src/env.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -import "../.astro/types.d.ts"; -import "astro/client"; diff --git a/src/layouts/BaseLayout.astro b/src/layouts/BaseLayout.astro deleted file mode 100644 index 6a772fd..0000000 --- a/src/layouts/BaseLayout.astro +++ /dev/null @@ -1,39 +0,0 @@ ---- -import Header from "../components/Header.astro"; ---- - - -
    -
    -
    -
    -
    - -
    -
    -
    - - - diff --git a/src/layouts/BlogPost.astro b/src/layouts/BlogPost.astro deleted file mode 100644 index e065e95..0000000 --- a/src/layouts/BlogPost.astro +++ /dev/null @@ -1,41 +0,0 @@ ---- -import type { CollectionEntry } from "astro:content"; -import BaseHead from "../components/BaseHead.astro"; -import FormattedDate from "../components/FormattedDate.astro"; -import BaseLayout from "../layouts/BaseLayout.astro"; - -type Props = CollectionEntry<"blog">["data"]; - -const { title, description, pubDate, updatedDate } = Astro.props; ---- - - - - - - - -
    -
    -
    -

    {title}

    -
    - -
    - { - updatedDate && ( -
    - Last updated on -
    - ) - } -
    -
    -
    -
    - -
    -
    -
    -
    - diff --git a/src/layouts/Talk.astro b/src/layouts/Talk.astro deleted file mode 100644 index fa67d7e..0000000 --- a/src/layouts/Talk.astro +++ /dev/null @@ -1,69 +0,0 @@ ---- -import type { CollectionEntry } from "astro:content"; -import BaseHead from "../components/BaseHead.astro"; -import FormattedDate from "../components/FormattedDate.astro"; -import BaseLayout from "../layouts/BaseLayout.astro"; - -type Props = CollectionEntry<"talks">["data"]; - -const { title, description, pubDate, updatedDate, event, slides, recording } = - Astro.props; ---- - - - - - - - -
    -
    -
    -

    {title}

    -
    - -
    - {event &&
    Event: {event}
    } - { - (slides || recording) && ( -
    - {slides && ( - - Slides → - - )} - {recording && ( - - Recording → - - )} -
    - ) - } - { - updatedDate && ( -
    - Last updated on -
    - ) - } -
    -
    -
    -
    - -
    -
    -
    -
    - diff --git a/src/pages/index.astro b/src/pages/index.astro deleted file mode 100644 index 036e8e3..0000000 --- a/src/pages/index.astro +++ /dev/null @@ -1,86 +0,0 @@ ---- -import BaseHead from "../components/BaseHead.astro"; -import { - SITE_TITLE, - SITE_DESCRIPTION, - postsSortedByPubDate, - talksSortedByPubDate, -} from "../consts"; -import BaseLayout from "../layouts/BaseLayout.astro"; -import SectionHeading from "../components/SectionHeading.astro"; -import PostCard from "../components/PostCard.astro"; -import SubtleLink from "../components/SubtleLink.astro"; -import "../styles/base.css"; ---- - - - - - - -
    - -

    - I'm Gui, a Frontend Engineer focused on crafting polished and user-first - products. I work with AI agents to build software and explore new ways - of engineering. You can read my ramblings on Twitter, take a look at my code on GitHub, and find more about my experience on LinkedIn. -

    -
    - -
    - -
    -

    - I'm diving deep into agentic engineering. I'm building software alongside AI coding agents and exploring how - to orchestrate multiple agents, manage context effectively, and - building predictable UIs from prompts. -

    -

    - On the same topic, I'm reading Vibe Coding by Gene Kim and Steve Yegge. Planning to write about it once I finish. -

    -
    -
    - -
    - -
      - { - postsSortedByPubDate.map((post, index) => ( - - )) - } -
    -
    - -
    - -
      - { - talksSortedByPubDate.map((talk, index) => ( - - )) - } -
    -
    -
    - diff --git a/src/pages/rss.xml.js b/src/pages/rss.xml.js deleted file mode 100644 index 52c03cd..0000000 --- a/src/pages/rss.xml.js +++ /dev/null @@ -1,16 +0,0 @@ -import rss from "@astrojs/rss"; -import { getCollection } from "astro:content"; -import { SITE_TITLE, SITE_DESCRIPTION } from "../consts"; - -export async function GET(context) { - const posts = await getCollection("blog"); - return rss({ - title: SITE_TITLE, - description: SITE_DESCRIPTION, - site: context.site, - items: posts.map((post) => ({ - ...post.data, - link: `/writing/${post.id}/`, - })), - }); -} diff --git a/src/pages/talks.astro b/src/pages/talks.astro deleted file mode 100644 index 92bb573..0000000 --- a/src/pages/talks.astro +++ /dev/null @@ -1,38 +0,0 @@ ---- -import BaseHead from "../components/BaseHead.astro"; -import BaseLayout from "../layouts/BaseLayout.astro"; -import FormattedDate from "../components/FormattedDate.astro"; -import SectionHeading from "../components/SectionHeading.astro"; -import "../styles/base.css"; -import { SITE_DESCRIPTION, talksSortedByPubDate } from "../consts"; ---- - - - - - - -
    - - -
    -
    - diff --git a/src/pages/talks/[...slug].astro b/src/pages/talks/[...slug].astro deleted file mode 100644 index f64f14e..0000000 --- a/src/pages/talks/[...slug].astro +++ /dev/null @@ -1,21 +0,0 @@ ---- -import { type CollectionEntry, getCollection, render } from "astro:content"; -import Talk from "../../layouts/Talk.astro"; -import "../../styles/base.css"; - -export async function getStaticPaths() { - const talks = await getCollection("talks"); - return talks.map((talk) => ({ - params: { slug: talk.id }, - props: talk, - })); -} -type Props = CollectionEntry<"talks">; - -const talk = Astro.props; -const { Content } = await render(talk); ---- - - - - diff --git a/src/pages/writing.astro b/src/pages/writing.astro deleted file mode 100644 index e7aef34..0000000 --- a/src/pages/writing.astro +++ /dev/null @@ -1,38 +0,0 @@ ---- -import BaseHead from "../components/BaseHead.astro"; -import BaseLayout from "../layouts/BaseLayout.astro"; -import FormattedDate from "../components/FormattedDate.astro"; -import SectionHeading from "../components/SectionHeading.astro"; -import "../styles/base.css"; -import { SITE_DESCRIPTION, postsSortedByPubDate } from "../consts"; ---- - - - - - - -
    - - -
    -
    - diff --git a/src/pages/writing/[...slug].astro b/src/pages/writing/[...slug].astro deleted file mode 100644 index 4ea0ac9..0000000 --- a/src/pages/writing/[...slug].astro +++ /dev/null @@ -1,21 +0,0 @@ ---- -import { type CollectionEntry, getCollection, render } from "astro:content"; -import BlogPost from "../../layouts/BlogPost.astro"; -import "../../styles/base.css"; - -export async function getStaticPaths() { - const posts = await getCollection("blog"); - return posts.map((post) => ({ - params: { slug: post.id }, - props: post, - })); -} -type Props = CollectionEntry<"blog">; - -const post = Astro.props; -const { Content } = await render(post); ---- - - - - diff --git a/src/styles/base.css b/src/styles/base.css deleted file mode 100644 index 62059f7..0000000 --- a/src/styles/base.css +++ /dev/null @@ -1,150 +0,0 @@ -@import "tailwindcss"; -@import "@radix-ui/colors/slate.css"; -@import "@radix-ui/colors/slate-dark.css"; - -@plugin "@tailwindcss/typography"; - -@theme { - /* Using Radix slate for a subtle blue-gray tint */ - --color-gray-100: var(--slate-1); - --color-gray-200: var(--slate-2); - --color-gray-300: var(--slate-3); - --color-gray-400: var(--slate-4); - --color-gray-500: var(--slate-5); - --color-gray-600: var(--slate-6); - --color-gray-700: var(--slate-7); - --color-gray-800: var(--slate-8); - --color-gray-900: var(--slate-9); - --color-gray-1000: var(--slate-10); - --color-gray-1100: var(--slate-11); - --color-gray-1200: var(--slate-12); - - --font-sans: "Work Sans", ui-sans-serif, system-ui, sans-serif; - --font-mono: "Commit Mono", ui-monospace, monospace; -} - -@layer utilities { - /* Prose styles - in utilities layer to match typography plugin */ - .prose h1 { - color: var(--color-gray-1200); - font-size: var(--text-2xl); - } - - .prose h2 { - color: var(--color-gray-1200); - font-size: var(--text-xl); - } - - .prose h3 { - color: var(--color-gray-1200); - font-size: var(--text-lg); - } - - .prose p, - .prose li { - color: var(--color-gray-1100); - } - - .prose a { - text-decoration-line: underline; - text-decoration-color: var(--color-gray-400); - text-underline-offset: 4px; - transition: - color 0.2s ease, - text-decoration-color 0.2s ease; - } - - .prose a:hover { - color: var(--color-gray-1200); - text-decoration-color: var(--color-gray-600); - } - - .prose code { - color: var(--color-gray-1200); - } - - .prose time { - color: var(--color-gray-1000); - font-family: var(--font-mono); - font-size: var(--text-sm); - font-weight: var(--font-weight-light); - } -} - -@utility scrollbar-hide { - -ms-overflow-style: none; - scrollbar-width: none; - - &::-webkit-scrollbar { - display: none; - } -} - -html { - scrollbar-gutter: stable; -} - -@font-face { - font-family: "Commit Mono"; - src: url("/fonts/CommitMono-400-Regular.otf") format("opentype"); - font-weight: normal; - font-style: normal; -} - -@font-face { - font-family: "Commit Mono"; - src: url("/fonts/CommitMono-400-Italic.otf") format("opentype"); - font-weight: normal; - font-style: italic; -} - -@font-face { - font-family: "Commit Mono"; - src: url("/fonts/CommitMono-700-Regular.otf") format("opentype"); - font-weight: 700; - font-style: normal; -} - -@font-face { - font-family: "Commit Mono"; - src: url("/fonts/CommitMono-700-Italic.otf") format("opentype"); - font-weight: 700; - font-style: italic; -} - -@media (prefers-color-scheme: dark) { - .astro-code, - .astro-code span { - color: var(--shiki-dark) !important; - background-color: var(--shiki-dark-bg) !important; - } - - /* Mermaid dark mode */ - .prose svg[id^="mermaid-"] .node rect, - .prose svg[id^="mermaid-"] .node circle, - .prose svg[id^="mermaid-"] .node ellipse, - .prose svg[id^="mermaid-"] .node polygon { - fill: var(--color-gray-300) !important; - stroke: var(--color-gray-700) !important; - } - - .prose svg[id^="mermaid-"] .label, - .prose svg[id^="mermaid-"] .label text, - .prose svg[id^="mermaid-"] .nodeLabel, - .prose svg[id^="mermaid-"] .nodeLabel p, - .prose svg[id^="mermaid-"] .edgeLabel { - color: var(--color-gray-1100) !important; - fill: var(--color-gray-1100) !important; - } - - .prose svg[id^="mermaid-"] .edgePath .path, - .prose svg[id^="mermaid-"] .flowchart-link { - stroke: var(--color-gray-600) !important; - } - - .prose svg[id^="mermaid-"] .arrowheadPath, - .prose svg[id^="mermaid-"] .marker { - fill: var(--color-gray-600) !important; - stroke: var(--color-gray-600) !important; - } -} diff --git a/src/utils.ts b/src/utils.ts deleted file mode 100644 index a5ef193..0000000 --- a/src/utils.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { clsx, type ClassValue } from "clsx"; -import { twMerge } from "tailwind-merge"; - -export function cn(...inputs: ClassValue[]) { - return twMerge(clsx(inputs)); -} diff --git a/tsconfig.json b/tsconfig.json index f37be9e..457b78e 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,10 +1,18 @@ { - "extends": "astro/tsconfigs/strict", "compilerOptions": { - "strictNullChecks": true, + "strict": true, + "lib": ["ES2024", "DOM", "DOM.Iterable"], + "types": ["node"], + "module": "ES2022", + "moduleResolution": "Bundler", + "target": "ESNext", + "allowImportingTsExtensions": true, + "rewriteRelativeImportExtensions": true, + "verbatimModuleSyntax": true, + "skipLibCheck": true, "jsx": "react-jsx", - "jsxImportSource": "react" + "jsxImportSource": "remix/ui", + "noEmit": true }, - "include": [".astro/types.d.ts", "**/*"], "exclude": ["dist"] } diff --git a/vite.config.ts b/vite.config.ts index 3d5355f..6b177f5 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,14 +1,33 @@ +import nkzw from "@nkzw/oxlint-config"; import { defineConfig } from "vite-plus"; export default defineConfig({ + fmt: { + ignorePatterns: ["node_modules", "build", "dist", "public/build"], + }, + lint: { + extends: [nkzw], + options: { + typeAware: true, + typeCheck: true, + }, + overrides: [ + { + files: ["**/*.ts", "**/*.tsx", "**/*.mts", "**/*.cts"], + rules: { + "react-in-jsx-scope": "off", + "react/display-name": "off", + }, + }, + { + files: ["server.ts", "app/**/*.tsx"], + rules: { + "no-console": "off", + }, + }, + ], + }, staged: { "*": "vp check --fix", }, - lint: { options: { typeAware: true, typeCheck: true } }, - fmt: { - sortTailwindcss: {}, - printWidth: 80, - sortPackageJson: false, - ignorePatterns: ["AGENTS.md"], - }, });