From a6f0fa22b0305627d7ab3251c210ec8fa84ad438 Mon Sep 17 00:00:00 2001 From: ChanHaeng Lee <2chanhaeng@gmail.com> Date: Thu, 9 Apr 2026 09:09:40 +0000 Subject: [PATCH 01/10] Fix dev server process tree not terminated in test:init Replace @david/dax process spawning with node:child_process.spawn() using detached: true to create a new process group. On cleanup, use process.kill(-child.pid, 'SIGKILL') to terminate the entire process group, ensuring all descendant processes (tsx watch, dotenvx, etc.) are killed. @david/dax's CommandChild.kill() only sends a signal through its internal KillSignal abstraction, which cannot propagate to the full OS process tree. This is a known limitation (dsherret/dax#351). Closes: https://github.com/fedify-dev/fedify/issues/667 Co-Authored-By: GitHub Copilot --- packages/init/src/test/server.ts | 42 +++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/packages/init/src/test/server.ts b/packages/init/src/test/server.ts index 25be5d982..a455fa4ac 100644 --- a/packages/init/src/test/server.ts +++ b/packages/init/src/test/server.ts @@ -1,6 +1,8 @@ -import $ from "@david/dax"; +import { spawn } from "node:child_process"; import { createWriteStream, type WriteStream } from "node:fs"; import { join as joinPath } from "node:path"; +import process from "node:process"; +import { Readable } from "node:stream"; import { printErrorMessage } from "../utils.ts"; import { ensurePortReleased, killProcessOnPort } from "./port.ts"; @@ -45,20 +47,22 @@ export async function serverClosure( await releasePort?.(); const devCommand = cmd.split(" "); - const serverProcess = $`${devCommand}` - .cwd(dir) - .env("PORT", String(defaultPort)) - .stdin("null") - .stdout("piped") - .stderr("piped") - .noThrow() - .spawn(); + const child = spawn(devCommand[0], devCommand.slice(1), { + cwd: dir, + env: { ...process.env, PORT: String(defaultPort) }, + stdio: ["ignore", "pipe", "pipe"], + detached: true, // creates a new process group so we can kill the tree + }); + + // Prevent unhandled exception when the process is killed + child.on("error", () => {}); - // Prevent unhandled rejection when the process is killed - serverProcess.catch(() => {}); + // Convert Node.js readable streams to Web ReadableStreams for tee() + const stdoutWeb = Readable.toWeb(child.stdout!) as ReadableStream; + const stderrWeb = Readable.toWeb(child.stderr!) as ReadableStream; - const [stdoutForFile, stdoutForPort] = serverProcess.stdout().tee(); - const [stderrForFile, stderrForPort] = serverProcess.stderr().tee(); + const [stdoutForFile, stdoutForPort] = stdoutWeb.tee(); + const [stderrForFile, stderrForPort] = stderrWeb.tee(); // Shared signal to cancel all background stream readers on cleanup const cleanup = new AbortController(); @@ -82,8 +86,18 @@ export async function serverClosure( }); return await callback(port); } finally { + // Kill the entire process group (tsx watch + all its children) + try { + if (child.pid != null) { + process.kill(-child.pid, "SIGKILL"); + } + } catch { + // Process group already exited + } + + // Also kill the child directly in case it wasn't in the group try { - serverProcess.kill("SIGKILL"); + child.kill("SIGKILL"); } catch { // Process already exited } From e9aeaebb3f87c82c18227c5d15789f3bf514e3a9 Mon Sep 17 00:00:00 2001 From: ChanHaeng Lee <2chanhaeng@gmail.com> Date: Mon, 6 Apr 2026 23:34:48 +0000 Subject: [PATCH 02/10] Define create-integration-package skill --- .../create-integration-package/SKILL.md | 308 +++++++++++ .../example/ARCHITECTURE.md | 191 +++++++ .../example/DESIGN.md | 295 ++++++++++ .../example/README.md | 55 ++ .../example/deno.jsonc | 13 + .../example/package.jsonc | 29 + .../example/public/demo-profile.png | Bin 0 -> 45358 bytes .../example/public/fedify-logo.svg | 206 +++++++ .../example/public/style.css | 504 ++++++++++++++++++ .../example/public/theme.js | 7 + .../example/src/federation.ts | 163 ++++++ .../example/src/logging.ts | 23 + .../example/src/main.ts | 2 + .../example/src/store.ts | 45 ++ .../init/framework.ts | 58 ++ .../package/README.md | 72 +++ .../package/deno.jsonc | 22 + .../package/package.jsonc | 66 +++ .../package/src/mod.ts | 16 + .../package/tsdown.config.ts | 13 + AGENTS.md | 9 +- CONTRIBUTING.md | 9 + examples/test-examples/mod.ts | 19 + 23 files changed, 2120 insertions(+), 5 deletions(-) create mode 100644 .agents/skills/create-integration-package/SKILL.md create mode 100644 .agents/skills/create-integration-package/example/ARCHITECTURE.md create mode 100644 .agents/skills/create-integration-package/example/DESIGN.md create mode 100644 .agents/skills/create-integration-package/example/README.md create mode 100644 .agents/skills/create-integration-package/example/deno.jsonc create mode 100644 .agents/skills/create-integration-package/example/package.jsonc create mode 100644 .agents/skills/create-integration-package/example/public/demo-profile.png create mode 100644 .agents/skills/create-integration-package/example/public/fedify-logo.svg create mode 100644 .agents/skills/create-integration-package/example/public/style.css create mode 100644 .agents/skills/create-integration-package/example/public/theme.js create mode 100644 .agents/skills/create-integration-package/example/src/federation.ts create mode 100644 .agents/skills/create-integration-package/example/src/logging.ts create mode 100644 .agents/skills/create-integration-package/example/src/main.ts create mode 100644 .agents/skills/create-integration-package/example/src/store.ts create mode 100644 .agents/skills/create-integration-package/init/framework.ts create mode 100644 .agents/skills/create-integration-package/package/README.md create mode 100644 .agents/skills/create-integration-package/package/deno.jsonc create mode 100644 .agents/skills/create-integration-package/package/package.jsonc create mode 100644 .agents/skills/create-integration-package/package/src/mod.ts create mode 100644 .agents/skills/create-integration-package/package/tsdown.config.ts diff --git a/.agents/skills/create-integration-package/SKILL.md b/.agents/skills/create-integration-package/SKILL.md new file mode 100644 index 000000000..7b380fd08 --- /dev/null +++ b/.agents/skills/create-integration-package/SKILL.md @@ -0,0 +1,308 @@ +--- +name: create-integration-package +description: >- + This skill is utilized when creating a web framework integration package. + After examining the given framework, a feasibility assessment is conducted + regarding the creation of an integration package. + If implementation is feasible, the package is generated; + if it is not possible, the rationale is provided to the user. +argument-hint: "Provide the name of the web framework you want to integrate with." +--- + + + +Adding an integration package to a web framework +================================================ + +Follow these steps in order to implement the integration package. + +1. Research the web framework +2. Create the package directory +3. Implement the package +4. Add to `@fedify/init` +5. Test with `mise test:init` +6. Add an example + + +Research the web framework +-------------------------- + +Research the web framework for which the integration package will be +implemented. Fedify operates as middleware via +[`Federation.fetch`](../../../packages/fedify/src/federation/federation.ts). +The critical question is whether the given framework can act as a server +framework and supports adding middleware. Search for and investigate +whether the relevant functionality is available. Assess feasibility based +on the research. If research indicates implementation is not possible, +explain the reasons in detail to the user and stop. If feasible, proceed +to create the package. Even during package creation, it may turn out to be +infeasible. In that case as well, explain the reasons in detail to the +user and stop. + + +Implement the package +--------------------- + +**Prioritize usability above all else.** The most important goal is that +the package integrates smoothly with the framework so users do not +experience friction when connecting it. + +Create the package directory inside the `packages/` directory. For example, if +the framework is named “framework”, create the directory `packages/framework/`. + +Copy the template files from into the directory you created. Then, +implement the package according to the framework. Since the comments in the +template are instructions for the developer to follow, please remove them once +the implementation is complete. + +Add additional definitions as appropriate based on context. Aside from the +main integration function and the `ContextDataFactory` type, keep module +exports to a minimum to avoid confusing users. + +### Request flow + +When a request arrives, the integration middleware calls +`federation.fetch()`. If Fedify has a route for the path and the client's +`Accept` header includes an ActivityPub media type such as +`application/activity+json`, Fedify generates and returns the JSON-LD +response directly. Framework-side routing does not execute. + +### Request conversion + +Some frameworks define and use their own `Request` type internally instead +of the Web API `Request`. If the target framework does so, write +conversion functions within the integration package to translate between +the Web API `Request` and the framework's native `Request`. + +### 406 not acceptable + +The final failure 406 response uses this form: + +~~~~ typescript +new Response("Not acceptable", { + status: 406, + headers: { + "Content-Type": "text/plain", + Vary: "Accept", + }, +}); +~~~~ + +### Function naming conventions + +A consistent naming convention for the main function has not yet been +established, but there is an [open naming convention issue]. If the issue +has been resolved by the time this skill is executed, update this section. +As a temporary convention, respect conventions of the framework : name it +`fedifyMiddleware` if the official documentation calls it as middleware, or +`fedifyHandler` if it's called a handler. + +[open naming convention issue]: https://github.com/fedify-dev/fedify/issues/657 + +### Non-source files + +#### README.md + +The package README.md must include the following: + + - Package description + - Supported framework versions, if only specific versions are supported + - Installation instructions + - Usage instructions (with example code) + +#### `deno.json` + +A *deno.json* is required to publish to JSR. + +#### `package.json` + +A *package.json* is required to publish to npm. + +#### `tsdown.config.ts` + +A *tsdown.config.ts* is required for the build in Node.js and Bun +environments. + +### Other updates + +Refer to the “Adding a new package” section in *CONTRIBUTING.md* and +perform the required updates. Record the package addition in *CHANGES.md*. + +### Tests + +Unit tests aren't mandatory since you can test using `mise test:init`, which +will be explained later. Therefore, testing by packages is not necessary. + +### Implementation checklist + +1. Create the *packages/framework/* directory +2. Write *src/mod.ts*: + - Export the main integration middleware/handler function + - Implement `federation.fetch()` invocation with + `onNotFound`/`onNotAcceptable` + - Export the `ContextDataFactory` type + - Write conversion functions if the framework does not natively support + Web API `Request`/`Response` +3. Write *README.md* +4. Write *deno.json* (if publishing to JSR is intended) +5. Write *package.json* (if publishing to npm is intended) +6. Write *tsdown.config.ts* (if Node.js and Bun are supported) +7. Write tests if possible +8. Perform remaining updates per the “Adding a new package” section in + *CONTRIBUTING.md* +9. Record changes in *CHANGES.md* + + +Add to `@fedify/init` +--------------------- + +Add the new package to the `@fedify/init` package so users can select the +new framework via the `fedify init` command. Follow these steps. + +Steps may require code modifications not explicitly listed. For example, +if the new package needs specific configuration, utility functions in +`packages/init/src/webframeworks/utils.ts` may need updating. Make +modifications consistent with the existing code style and context. + +### Write the `WebFrameworkDescription` object + +Create a `packages/init/src/webframeworks/framework.ts` file and write the +`WebFrameworkDescription` object, referring to . Check +the specifications in the comments in `packages/init/src/types.ts` for +details. + +### Add to the `WEB_FRAMEWORK` array + +Add the new framework name to the end of the `WEB_FRAMEWORK` array in +`packages/init/src/const.ts`. + +~~~~ typescript +export const WEB_FRAMEWORK = [ + // ... other frameworks + "framework", // Fill with the framework name +]; +~~~~ + +### Add to the `webFrameworks` object + +Add the new `WebFrameworkDescription` object in alphabetical order to the +`webFrameworks` object in `packages/init/src/webframeworks/mod.ts`. + +~~~~ typescript +// packages/init/src/webframeworks/mod.ts + +// ... other imports +import framework from "./framework.ts"; // Fill with the framework name + +const webFrameworks: Record = { + // ... other frameworks + framework, // Fill with the framework name +}; +~~~~ + +### Add templates in `packages/init/src/templates/framework/` + +If additional files need to be generated, add template files under the +`packages/init/src/templates/framework/` directory. Template files must +end with the `.tpl` extension appended to their base name. Then, in +`packages/init/src/webframeworks/framework.ts`, load the templates using +the `readTemplate` function defined in `packages/init/src/lib.ts` and add +them to the `WebFrameworkDescription.init().files` object. + + +Test with `mise test:init` +-------------------------- + +Run `mise test:init` to verify that the new package is generated and runs +correctly. If a test fails, the output and error file paths are printed; +read them to diagnose the issue. + +Running `mise test:init` without arguments tests all option combinations +and can take a very long time. Use appropriate options to narrow the test +scope. + +Immediately remove test paths after completing the tests and analyzing any +resulting errors. + +At a minimum, test the following three combinations. + + - `mise test:init -w framework -m in-process -k in-memory --no-dry-run`: + Tests the new framework with the in-memory KV store and in-process message + queue, which are the most basic options. This combination verify that the + newly created package can be used without issues by minimizing dependencies + on other environments. + - `mise test:init -w framework`: Tests all package manager, KV store, + and message queue combinations with the framework selected. If a + required database is not installed or running, this combinations are + useless. Therefore, if the test output indicates that the databases are + not running, don't use this combination ever again for the session. + Instead, use the previous one or the next one. + - `mise test:init -m in-process -k in-memory --no-dry-run`: Fixes the + KV store and message queue and tests all web framework and package + manager combinations. This test is mandatory if you modified logic + beyond just writing the `WebFrameworkDescription` object. + +For details on options, run `mise test:init --help`. + +Some frameworks or combinations may be untestable. Analyze the test +results; if there are impossible combinations, identify the reason and add +the combination and reason as a key-value pair to the +`BANNED_LOOKUP_REASONS` object in +`packages/init/src/test/lookup.ts`. + + +Add an example +-------------- + +Create an `examples/framework/` app and write an example for the new +package. If Deno is supported, add a *deno.json* based on ; +if Node.js is supported, add *package.json* based on +and *tsdown.config.ts*. Depending on the supported environments, +add the example path to the `workspace` field in +the root *deno.json* and to the `packages` field in +*pnpm-workspace.yaml*. + +If the framework is backend-only and needs a frontend framework, and there +is no natural pairing like solidstart-solid, use Hono. + +Base the example on the files under the path. + describes the example's architecture. + describes the example's design. Both documents are +references for writing the example and are not needed in the actual +generated example app — do not create these two files. Copy the remaining +files as-is and modify as needed. + +If the framework does not have a prescribed entry point, use `src/main.ts` +as the application entry point. Define and export the framework app in +`src/app.ts`, then import and run it from the entry file. Register the +Fedify middleware in `src/app.ts`. Import `src/logging.ts` in the entry +file to initialize `@logtape/logtape`. When logging is needed, use the +`getLogger` function from `@logtape/logtape` to create a logger. + +If there are any build files or paths other than those already added to the +root `.gitignore`, define a separate `.gitignore` file within the example path +to prevent git tracking them. + +### Test the example with `mise test:examples` + +Register the new example in `examples/test-examples/mod.ts`. Read the +comments above the example registry arrays in that file to determine +which array is appropriate and what fields are required. Follow the +patterns of existing entries. + +While developing the example, run only the new example to iterate +quickly: + +~~~~ bash +mise test:examples framework +~~~~ + +where `framework` is the `name` field of the registered entry. Pass +`--debug` for verbose output if the test fails. + +After the example is complete, run the full suite once to confirm nothing +is broken: + +~~~~ bash +mise test:examples +~~~~ diff --git a/.agents/skills/create-integration-package/example/ARCHITECTURE.md b/.agents/skills/create-integration-package/example/ARCHITECTURE.md new file mode 100644 index 000000000..92a4d646b --- /dev/null +++ b/.agents/skills/create-integration-package/example/ARCHITECTURE.md @@ -0,0 +1,191 @@ + + +Fedify example architecture +=========================== + +This document defines the shared architecture for Fedify example applications. +Every example should follow these conventions regardless of the web framework +used, so that learners can compare examples and transfer knowledge between them. + + +Middleware integration +---------------------- + +Every Fedify framework adapter exposes a middleware or hook function that +intercepts incoming requests. Register this middleware at the top level of +the server so that it runs before any application routes. + +The middleware inspects the `Accept` and `Content-Type` headers. Requests +carrying ActivityPub media types (`application/activity+json`, +`application/ld+json`, etc.) or targeting well-known federation endpoints +are forwarded to the `Federation` instance. All other requests fall through +to the application's own routes. + +The specific API differs, but the role is identical: delegate federation +traffic to Fedify, let everything else pass through. + + +Reverse proxy support +--------------------- + +If needed, wrap the middleware (or the request handler it receives) with +`getXForwardedRequest` from the `x-forwarded-fetch` package. This rewrites +the request URL to respect `X-Forwarded-Host` and related headers, which is +required when the server runs behind a tunneling tool or reverse proxy during +local development. Apply this wrapping at the same level as the Fedify +middleware registration, before any routing logic executes. + + +Routing +------- + +### `GET /` + +The main page. Contains the following sections: + +**Search** + +A text input for searching fediverse accounts by handle. The client +debounces input with a 300ms delay, then sends a `GET` request with the +handle as a URL query parameter (e.g. `/?q=@user@example.com`). The server +resolves the handle using Fedify's `lookupObject` and returns the result. +The result shows: profile image, display name, handle, and a follow button. +If the local actor already follows the target, show an unfollow button +instead. + +**User info** + +Displays the local actor's profile. Because this is a demo there is exactly +one actor, `@demo`. + + - Profile image: `/demo-profile.png` + - Name: `"Fedify Demo"` + - Handle: `@demo` + - Summary: `"This is a Fedify Demo account."` + +**Following** + +Lists accounts the local actor follows. Shows the total count and, for +each account: profile image, display name, handle, and an unfollow button. + +**Followers** + +Lists accounts that follow the local actor. Shows the total count and, for +each account: profile image, display name, and handle. + +The following and followers sections update in real time via SSE (see below). + +**Compose** + +A text area and a submit button for writing a new post. On submission the +server creates a `Note`, stores it in `postStore`, wraps it in a `Create` +activity, and sends it to followers. If sending fails, the post is removed +from the store. + +**Posts** + +Lists all posts by the local actor in reverse chronological order. Each +entry shows the post content, published timestamp, and a link to the +single post detail page (`/users/{identifier}/posts/{id}`). + +### `GET /users/{identifier}` + +Actor profile page. Shares its path with the Fedify actor dispatcher. +When a federation peer requests this URL with an ActivityPub media type, the +middleware handles it. Otherwise the request falls through to this route, +which renders an HTML page showing: + + - Profile image + - Name + - Handle + - Summary + - Following count + - Followers count + +### `GET /users/{identifier}/posts/{id}` + +Single post detail page. Shares its path with the Fedify `Note` object +dispatcher. Same content-negotiation fallback as the actor profile: the +middleware serves ActivityPub JSON to federation peers, and this route +renders HTML for browsers. Shows: + + - Author profile (same layout as the actor profile page) + - Post content + - Published timestamp + +### `POST /post` + +Accepts post content from the compose form, creates a `Note`, stores it in +`postStore`, wraps it in a `Create` activity, and sends it to followers. +If sending fails, the post is removed from the store. Redirects back to +`/` on completion. + +### `POST /follow` + +Accepts a target actor URI, sends a `Follow` activity from the local actor, +and stores the relationship locally. + +### `POST /unfollow` + +Accepts a target actor URI, sends an `Undo(Follow)` activity, and removes +the relationship locally. + +### `GET /events` + +SSE endpoint. See the SSE section below. + + +Server-sent events +------------------ + +The `/events` endpoint keeps an open SSE connection to the client. +When the following or followers list changes (a follow is accepted, a +remote follow arrives, an unfollow occurs, etc.), the server pushes an +event so the page can update without a full reload. + +The server maintains a set of active SSE connections. Whenever the +follower or following store is mutated — inside inbox listeners or after a +local follow/unfollow request — it broadcasts an event to every open +connection. + +The client listens on an `EventSource` and replaces the relevant DOM +section with the received data. + + +Server-side data access +----------------------- + +Use Fedify's `RequestContext` to bridge between the framework routing layer +and the federation layer. Obtain a context by calling +`federation.createContext(request, contextData)` inside a route handler. +Through this context, routes can look up actors, resolve object URIs, and +invoke `sendActivity` without coupling to Fedify internals. + +Avoid accessing the data stores directly from route handlers when a +`RequestContext` method exists for the same purpose. This keeps the +routing layer thin and ensures that Fedify's internal bookkeeping (key +resolution, URI canonicalization, etc.) is applied consistently. + + +Federation +---------- + +Use `src/federation.ts`. + + +Storing +------- + +Use `src/store.ts` and the provided in-memory stores. + + +View rendering +-------------- + +See `DESIGN.md`. + + +Logging +------- + +Use `@logtape/logtape` and `src/logging.ts`. diff --git a/.agents/skills/create-integration-package/example/DESIGN.md b/.agents/skills/create-integration-package/example/DESIGN.md new file mode 100644 index 000000000..fbd8db29f --- /dev/null +++ b/.agents/skills/create-integration-package/example/DESIGN.md @@ -0,0 +1,295 @@ +Fedify example design system +============================ + +Visual theme & atmosphere +------------------------- + +Clean, functional, and developer-friendly. The aesthetic is minimal and +modern: a neutral canvas with a single bold gradient accent for profile +sections. The overall feel is “documentation site meets social app” —- +sparse enough to read comfortably, colorful enough to feel alive. + +Dark and light themes are mandatory. The system detects +`prefers-color-scheme` and switches automatically; there is no manual +toggle. + +**Key Characteristics:** + + - Neutral canvas that inverts cleanly between light and dark + - Single gradient accent (purple) reserved for the profile header and + primary actions + - Card-based content layout with subtle shadows + - Monospace typesetting for handles and federation addresses + - No framework-specific branding in UI chrome —- only the demo profile + and Fedify logo + + +Color palette & roles +--------------------- + +### Surface & background + +Two CSS custom properties control the entire theme inversion. +`--background` is `#ffffff` in light mode and `#0a0a0a` in dark mode. +`--foreground` is `#171717` in light mode and `#ededed` in dark mode. +All other surface colors derive from these two tokens through `rgba()` +or `color-mix()`. + +### Accent & brand + +Link text and input focus rings use `#3b82f6`. The focus ring shadow is +`rgba(59, 130, 246, 0.3)`. The profile gradient is +`linear-gradient(135deg, #667eea, #764ba2)` and applies exclusively to +the profile header background and the primary action button. + +### Neutral & semantic + +Handle badges and follower items use `#f3f4f6` background with `#000` +text. Card borders use `rgba(0, 0, 0, 0.05)` for subtle dividers and +`rgba(0, 0, 0, 0.1)` for post cards and forms. Textarea borders are +`rgba(0, 0, 0, 0.2)`. Post avatar rings are `#e5e7eb`. Text on +gradient backgrounds is always `white`. + +### Shadow system + +Four elevation levels. Elevation 1 (`0 2px 8px rgba(0,0,0,0.05)`) for +post cards and forms. Elevation 2 (`0 4px 20px rgba(0,0,0,0.08)`) for +info cards and detail cards. Elevation 3 +(`0 8px 32px rgba(0,0,0,0.1)`) for the profile header. Hover lift +(`0 8px 24px rgba(0,0,0,0.1)`) for card hover states. + + +Typography rules +---------------- + +### Font family + +Body text uses the system font stack: +`-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, sans-serif`. +No custom fonts or font loading. Monospace (`monospace`) is reserved for +federation handles and follower addresses. + +### Hierarchy + +Base font size is `16px`. Line height for readable content is `1.625`. + + - **User name** (profile header): `2.25rem`, weight `700` + - **Section title** (card headings, posts title): `1.5rem`, + weight `600`—`700` + - **User handle** (profile header): `1.25rem`, weight `500` + - **Body large** (bio, post detail content): `1.125rem`, weight `400`, + line-height `1.625` + - **Body** (post content, forms): `1rem`, weight `400`, + line-height `1.625` + - **Label** (info labels, metadata, timestamps): `0.875rem`, + weight `600` + +### Principles + +Weight `600`—`700` for headings; `400`—`500` for body and subtext. +Opacity (`0.6`—`0.9`) creates text hierarchy on gradient backgrounds +instead of color changes. + + +Component stylings +------------------ + +### Profile header + +Background is the profile gradient. Text is `white`. Padding `2rem`, +gap `2rem` between avatar and info. Border radius `1rem`. Shadow is +elevation 3. Layout is `flex row`, collapsing to `column` on mobile. + +### Avatar + +Profile header avatar is `7.5rem` square, `border-radius: 50%`, with a +`4px solid rgba(255,255,255,0.2)` border. Post card avatars are `3rem` +with a `2px solid #e5e7eb` border. Post detail avatars are `4rem` with +the same border. + +### Cards + +Background is `var(--background)`. Border is +`1px solid rgba(0,0,0,0.1)`. Border radius is `0.75rem`. Shadow is +elevation 1 or 2 depending on context. Post cards gain +`translateY(-2px)` and hover-lift shadow on hover. Transitions are +`transform 0.2s, box-shadow 0.2s`. + +### Search input + +Full-width text input with `border-radius: 0.5rem` and +`padding: 0.75rem`. Border is `1px solid rgba(0,0,0,0.2)`. On focus +the border becomes `#3b82f6` with a `0 0 0 2px` focus ring shadow. +Placeholder text reads “Search by handle (e.g. @user@example.com)”. + +### Search result + +Inline card below the search input. Shows a row with the target's +avatar (`3rem`, rounded), display name, handle (monospace badge), and an +action button (follow or unfollow depending on current state). Appears +only when a result is available; hidden otherwise. + +### Compose form + +Textarea is full width with `border-radius: 0.5rem` and +`padding: 0.75rem`. On focus the border becomes `#3b82f6` with a +`0 0 0 2px` focus ring shadow. Font inherits body font family. Resize +is vertical only. A submit button sits below the textarea, right-aligned. + +### Buttons (primary) + +Background is the profile gradient. Text is `white`. +Padding `0.5rem 1.5rem`. Border radius `0.5rem`. Font weight `600`. +On hover the button lifts `translateY(-1px)` and the shadow intensifies. +Transition matches cards. + +### Buttons (danger) + +Used for unfollow actions. Background is `#ef4444`. Text is `white`. +Same padding, radius, weight, and hover behavior as primary buttons. + +### Back link + +Background is `color-mix(in srgb, var(--foreground) 10%, transparent)`. +Padding `0.5rem 1rem`. Border radius `0.5rem`. Hover increases the +foreground mix to 15%. + +### Fedify badge + +Background `#7dd3fc`, text `white`, height `1.5rem`, +border radius `0.375rem`. A `::before` pseudo-element renders a 16x16 +Fedify logo icon. + + +Layout principles +----------------- + +### Spacing + +Base unit is `1rem` (16px). Common spacing values are `0.25rem`, +`0.5rem`, `0.75rem`, `1rem`, `1.5rem`, and `2rem`. Section gaps range +from `1.5rem` to `2rem`. + +### Containers + +Profile, posts, and post detail containers max out at `56rem` with +`2rem` padding. The home page container maxes at `780px` with `1rem` +padding. Profile container stretches to `min-height: 100vh`. + +### Grid + +All grids are single-column. Post grid gap is `1.5rem`. Info grid gap +is `1rem`. Home grid gap is `1rem`. Profile content grid gap is `2rem`. + +### Whitespace + +Generous vertical breathing room between sections. Card internal +padding is `1.5rem`—`2rem`. Dividers are bottom borders on list items +(`1px solid rgba(0,0,0,0.05)`); the last item has no border. + + +Responsive behavior +------------------- + +Single breakpoint at `768px`. + +Below the breakpoint: + + - Profile header switches to `flex-direction: column`, + `align-items: center`, `text-align: center` + - User name shrinks from `2.25rem` to `1.875rem` + - Container padding reduces from `2rem` to `1rem` + - Post detail card padding: `2rem` to `1.5rem` + - Author avatar: `4rem` to `3.5rem` + - Author name: `1.5rem` to `1.25rem` + - Post detail content: `1.125rem` to `1rem` + - Info items stack vertically with `0.25rem` gap + +No hover-dependent information. Hover effects add visual polish only. +Tap targets meet at least `44px` effective height through padding. + + +Do's and don'ts +--------------- + +### Do + + - Use CSS custom properties (`--background`, `--foreground`) for + theme-dependent values. + - Detect theme via `prefers-color-scheme`; apply class (`light`/`dark`) + on `` at runtime. + - Keep all layout in a single static CSS file under *public/*. + - Use `rgba()` or `color-mix()` for transparent overlays rather than + hard-coded gray values. + - Render handles and federation addresses in monospace with a light gray + badge background. + - Provide *demo-profile.png* and *fedify-logo.svg* in *public/*. + - Maintain the gradient accent exclusively for profile headers and + primary action buttons. + +### Don't + + - Don't add a CSS framework (Tailwind, Bootstrap). The example must + stay dependency-free on the styling side so that any framework + integration can adopt it. + - Don't introduce custom fonts or font loading. + - Don't use JavaScript for layout or styling beyond the dark-mode class + toggle. + - Don't create multiple themes or color schemes beyond light/dark. + - Don't use the gradient accent on secondary elements (back links, info + cards, text). + - Don't add animations beyond the card hover lift and button press + feedback. + + +Static assets +------------- + +All visual assets live in *public/* and are served at the site root: + + - *style.css* —- Complete stylesheet + - *theme.js* —- Dark/light class toggle script + - *demo-profile.png* —- Demo actor avatar + - *fedify-logo.svg* —- Fedify logo for badge and branding + +### Following / followers list + +Each list is a vertical stack of rows. Each row contains an avatar +(`3rem`, rounded), display name, and handle (monospace badge). Following +rows additionally include an unfollow button (danger style). A count +label sits above each list (e.g. “Following (3)”). When the list is +empty, show a single line of muted text. Both lists update in real time +via SSE without page reload. + + +Page structure +-------------- + +Every example must implement these pages. See *ARCHITECTURE.md* for the +full routing specification. + +### Home (`/`) + +Top to bottom: + +1. **Search** —- text input with debounced lookup; result card appears + inline below +2. **User info** —- profile header (gradient, avatar, name, handle, + bio) +3. **Following** —- count + account list with unfollow buttons +4. **Followers** —- count + account list +5. **Compose** —- textarea + submit button +6. **Posts** —- reverse-chronological post cards, each linking to the + detail page + +### Actor profile (`/users/{identifier}`) + +Profile header (gradient, avatar, name, handle, bio) followed by +following count and followers count. Content-negotiated: serves HTML to +browsers and ActivityPub JSON to federation peers. + +### Post detail (`/users/{identifier}/posts/{id}`) + +Back link to home, then author profile section (same layout as the actor +profile page), then the post content and a formatted timestamp. +Content-negotiated like the actor profile. diff --git a/.agents/skills/create-integration-package/example/README.md b/.agents/skills/create-integration-package/example/README.md new file mode 100644 index 000000000..5f0cadf26 --- /dev/null +++ b/.agents/skills/create-integration-package/example/README.md @@ -0,0 +1,55 @@ + + + + +프레임워크 example application +============================== + +A comprehensive example of building a federated server application using +[Fedify] with [프레임워크]. This example demonstrates how to create an +ActivityPub-compatible federated social media server that can interact with +other federated platforms like Mastodon, Pleroma, and other ActivityPub +implementations using the Fedify and [프레임워크]. + +[Fedify]: https://fedify.dev +[프레임워크]: https://프레임.워크/ + + +Running the example +------------------- + + + +~~~~ sh +# For Deno +deno task dev + +# For pnpm(Node.js) +pnpm dev +~~~~ + + +Communicate with other federated servers +---------------------------------------- + + + +1. Tunnel your local server to the internet using `fedify tunnel` + + ~~~~ sh + fedify tunnel 0000 + ~~~~ + +2. Open your browser tunneled URL and check the server is running properly. + +3. Search your handle and follow from other federated servers such as Mastodon + or Misskey. + + > [!NOTE] + > [ActivityPub Academy] is a great resource to learn how to interact + > with other federated servers using ActivityPub protocol. + +[ActivityPub Academy]: https://www.activitypub.academy/ diff --git a/.agents/skills/create-integration-package/example/deno.jsonc b/.agents/skills/create-integration-package/example/deno.jsonc new file mode 100644 index 000000000..44ac01f3e --- /dev/null +++ b/.agents/skills/create-integration-package/example/deno.jsonc @@ -0,0 +1,13 @@ +{ + "imports": { + // Add imports required for the framework you are integrating with. + // If packages are already added in the workspace, + // you don't need to add import maps for here. + }, + "tasks": { + // `dev` task STRONGLY RECOMMENDED for `mise test:example`. + // Other tasks can be added as needed. + // Follow the convention of the framework you are integrating with. + "dev": "deno run --watch -A src/main.ts" + } +} diff --git a/.agents/skills/create-integration-package/example/package.jsonc b/.agents/skills/create-integration-package/example/package.jsonc new file mode 100644 index 000000000..7c6bbb114 --- /dev/null +++ b/.agents/skills/create-integration-package/example/package.jsonc @@ -0,0 +1,29 @@ +{ + // Fill 프레임워크 with the name of the framework you want to integrate with + "name": "프레임워크-example", + "version": "0.0.1", + "private": true, + "type": "module", + "description": "Fedify app with 프레임워크 integration", + "scripts": { + // `dev` script STRONGLY RECOMMENDED for `mise test:example`. + // Other scripts can be added as needed. + // Follow the convention of the framework you are integrating with. + "dev": "" + }, + "dependencies": { + // Add packages required for the 프레임워크 integration here + // If packages are already added in the workspace, + // you can reference them with "catalog:". + // Check `pnpm-workspace.yaml` for more packages in the workspace. + "@fedify/fedify": "workspace:^", + "@fedify/프레임워크": "workspace:^", + "@fedify/vocab": "workspace:^", + "@logtape/logtape": "catalog:" + }, + "devDependencies": { + "typescript": "catalog:", + "@types/node": "catalog:" + // Add dev dependencies required for the 프레임워크 integration here + } +} diff --git a/.agents/skills/create-integration-package/example/public/demo-profile.png b/.agents/skills/create-integration-package/example/public/demo-profile.png new file mode 100644 index 0000000000000000000000000000000000000000..d91cf5956c06f5da5d914db6423d06d80986b3f3 GIT binary patch literal 45358 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 literal 0 HcmV?d00001 diff --git a/.agents/skills/create-integration-package/example/public/fedify-logo.svg b/.agents/skills/create-integration-package/example/public/fedify-logo.svg new file mode 100644 index 000000000..ba4a7e371 --- /dev/null +++ b/.agents/skills/create-integration-package/example/public/fedify-logo.svg @@ -0,0 +1,206 @@ + + + + + + + + Fedify + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Fedify + + + + diff --git a/.agents/skills/create-integration-package/example/public/style.css b/.agents/skills/create-integration-package/example/public/style.css new file mode 100644 index 000000000..0f9a07ef0 --- /dev/null +++ b/.agents/skills/create-integration-package/example/public/style.css @@ -0,0 +1,504 @@ +:root { + --background: #ffffff; + --foreground: #171717; +} + +@media (prefers-color-scheme: dark) { + :root { + --background: #0a0a0a; + --foreground: #ededed; + } +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + background: var(--background); + color: var(--foreground); + font-size: 16px; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, + Oxygen, Ubuntu, Cantarell, sans-serif; +} + +a { + color: #3b82f6; + text-decoration: none; +} +a:hover { + text-decoration: underline; +} + +/* Profile Header */ +.profile-header { + display: flex; + gap: 2rem; + padding: 2rem; + margin-bottom: 2rem; + border-radius: 1rem; + color: white; + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1); +} + +.avatar-section { + flex-shrink: 0; +} + +.avatar { + width: 7.5rem; + height: 7.5rem; + border-radius: 50%; + object-fit: cover; + border: 4px solid rgba(255, 255, 255, 0.2); + box-shadow: 0 4px 16px rgba(0, 0, 0, 0.2); +} + +.user-info { + display: flex; + flex-direction: column; + justify-content: center; + flex: 1; +} + +.user-name { + font-size: 2.25rem; + font-weight: bold; + margin: 0 0 0.5rem 0; + text-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); +} + +.user-handle { + font-size: 1.25rem; + font-weight: 500; + margin-bottom: 1rem; + opacity: 0.9; +} + +.user-bio { + font-size: 1.125rem; + line-height: 1.625; + opacity: 0.95; + margin: 0; +} + +/* Profile Container & Content */ +.profile-container { + max-width: 56rem; + margin: 0 auto; + display: flex; + flex-direction: column; + justify-content: center; + align-content: center; + padding: 2rem; + min-height: 100vh; +} + +.profile-content { + display: grid; + gap: 2rem; +} + +.info-card { + border-radius: 0.75rem; + border: 1px solid rgba(0, 0, 0, 0.05); + background: var(--background); + color: var(--foreground); + padding: 2rem; + box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08); +} + +.info-card h3 { + font-size: 1.5rem; + font-weight: 600; + margin: 0 0 1.5rem 0; +} + +.info-grid { + display: grid; + gap: 1rem; +} + +.info-item { + display: flex; + flex-direction: column; + justify-content: space-between; + padding: 0.75rem 0; + border-bottom: 1px solid rgba(0, 0, 0, 0.05); +} + +.info-item:last-child { + border-bottom: none; +} + +.info-label { + font-size: 0.875rem; + font-weight: 600; + color: color-mix(in srgb, var(--foreground) 60%, transparent); +} + +.fedify-anchor { + display: inline-flex; + align-items: center; + gap: 0.25rem; + height: 1.5rem; + padding: 0.125rem 0.25rem; + border-radius: 0.375rem; + background: #7dd3fc; + color: white; + font-weight: 500; + text-decoration: none; +} + +.fedify-anchor::before { + content: ""; + display: inline-block; + width: 16px; + height: 16px; + background-image: url("/fedify-logo.svg"); + background-size: 16px 16px; + vertical-align: middle; + margin-bottom: 0.125rem; +} + +/* Post Form */ +.post-form { + max-width: 56rem; + margin: 2rem auto; + padding: 1.5rem; + border-radius: 0.75rem; + border: 1px solid rgba(0, 0, 0, 0.1); + background: var(--background); + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05); +} + +.form-group { + margin-bottom: 1rem; +} + +.form-label { + display: block; + font-size: 1.125rem; + font-weight: 600; + margin-bottom: 0.5rem; + color: var(--foreground); +} + +.form-textarea { + width: 100%; + resize: none; + border-radius: 0.5rem; + border: 1px solid rgba(0, 0, 0, 0.2); + padding: 0.75rem; + font-size: 1rem; + background: var(--background); + color: var(--foreground); + transition: border-color 0.2s, box-shadow 0.2s; + font-family: inherit; +} + +.form-textarea:focus { + outline: none; + border-color: #3b82f6; + box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.3); +} + +.post-button { + padding: 0.5rem 1.5rem; + border: none; + border-radius: 0.5rem; + font-size: 1rem; + font-weight: 600; + color: white; + cursor: pointer; + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); + transition: transform 0.2s, box-shadow 0.2s; +} + +.post-button:hover { + transform: translateY(-1px); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); +} + +/* Posts Container & Grid */ +.posts-container { + max-width: 56rem; + margin: 0 auto; + padding: 0 2rem; +} + +.posts-title { + font-size: 1.5rem; + font-weight: bold; + margin-bottom: 1.5rem; + color: var(--foreground); +} + +.posts-grid { + display: grid; + gap: 1.5rem; +} + +.post-card { + border-radius: 0.75rem; + border: 1px solid rgba(0, 0, 0, 0.1); + background: var(--background); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05); + transition: transform 0.2s, box-shadow 0.2s; +} + +.post-card:hover { + transform: translateY(-2px); + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.1); +} + +.post-link { + display: block; + padding: 1.5rem; + text-decoration: none; + color: inherit; +} +.post-link:hover { + text-decoration: none; +} + +.post-header { + display: flex; + align-items: center; + gap: 0.75rem; + margin-bottom: 1rem; +} + +.post-avatar { + width: 3rem; + height: 3rem; + border-radius: 50%; + object-fit: cover; + border: 2px solid #e5e7eb; +} + +.post-user-info { + flex: 1; +} + +.post-user-name { + font-size: 1.125rem; + font-weight: 600; + margin: 0 0 0.25rem 0; + color: var(--foreground); +} + +.post-user-handle { + font-size: 0.875rem; + opacity: 0.7; + color: var(--foreground); + margin: 0; +} + +.post-content { + font-size: 1rem; + line-height: 1.625; + color: var(--foreground); +} + +.post-content p { + margin: 0; +} + +/* Post Detail */ +.post-detail-container { + max-width: 56rem; + margin: 0 auto; + padding: 2rem; +} + +.post-detail-card { + border-radius: 0.75rem; + border: 1px solid rgba(0, 0, 0, 0.1); + background: var(--background); + padding: 2rem; + margin-bottom: 2rem; + box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08); +} + +.post-detail-author { + display: flex; + align-items: flex-start; + gap: 1rem; + padding-bottom: 1.5rem; + margin-bottom: 1.5rem; + border-bottom: 1px solid rgba(0, 0, 0, 0.1); + text-decoration: none; + color: inherit; +} +.post-detail-author:hover { + text-decoration: none; +} + +.author-avatar { + width: 4rem; + height: 4rem; + border-radius: 50%; + object-fit: cover; + border: 2px solid #e5e7eb; +} + +.author-info { + flex: 1; +} + +.author-name { + font-size: 1.5rem; + font-weight: bold; + margin: 0 0 0.25rem 0; + color: var(--foreground); +} + +.author-handle { + font-size: 1rem; + font-weight: 500; + opacity: 0.7; + margin: 0 0 0.5rem 0; + color: var(--foreground); +} + +.post-timestamp { + font-size: 0.875rem; + opacity: 0.6; + color: var(--foreground); +} + +.post-detail-content { + padding: 1.5rem 0; + font-size: 1.125rem; + line-height: 1.625; + color: var(--foreground); +} + +.post-detail-content p { + margin: 0; +} + +.back-link { + display: inline-block; + margin-bottom: 1.5rem; + padding: 0.5rem 1rem; + border-radius: 0.5rem; + font-weight: 500; + color: var(--foreground); + background: color-mix(in srgb, var(--foreground) 10%, transparent); + text-decoration: none; + transition: background 0.2s; +} + +.back-link:hover { + background: color-mix(in srgb, var(--foreground) 15%, transparent); + text-decoration: none; +} + +/* Home Page */ +.home-container { + max-width: 780px; + margin: 2rem auto; + display: grid; + gap: 1rem; + padding: 1rem; +} + +.home-logo { + display: block; + width: 8rem; + height: 8rem; + margin: 0 auto; +} + +.home-banner { + display: flex; + flex-wrap: wrap; + justify-content: center; + font-family: monospace; + line-height: 1.2; + white-space: pre; +} + +.home-handle { + font-family: monospace; + background: #f3f4f6; + color: #000; + padding: 0.25rem 0.5rem; + border-radius: 0.375rem; + user-select: all; +} + +.follower-item { + font-family: monospace; + background: #f3f4f6; + color: #000; + padding: 0.25rem 0.5rem; + border-radius: 0.375rem; +} + +.follower-list { + display: flex; + flex-direction: column; + gap: 0.25rem; + width: max-content; + list-style: none; +} + +/* Responsive */ +@media (max-width: 768px) { + .profile-container { + padding: 1rem; + } + + .profile-header { + flex-direction: column; + align-items: center; + gap: 1rem; + text-align: center; + } + + .user-name { + font-size: 1.875rem; + } + + .info-item { + flex-direction: column; + align-items: flex-start; + gap: 0.25rem; + } + + .posts-container { + padding: 0 1rem; + } + + .post-form { + padding: 1rem; + } + + .post-detail-container { + padding: 1rem; + } + + .post-detail-card { + padding: 1.5rem; + } + + .author-avatar { + width: 3.5rem; + height: 3.5rem; + } + + .author-name { + font-size: 1.25rem; + } + + .post-detail-content { + font-size: 1rem; + } +} diff --git a/.agents/skills/create-integration-package/example/public/theme.js b/.agents/skills/create-integration-package/example/public/theme.js new file mode 100644 index 000000000..8d521d625 --- /dev/null +++ b/.agents/skills/create-integration-package/example/public/theme.js @@ -0,0 +1,7 @@ +"use strict"; +var mq = window.matchMedia("(prefers-color-scheme: dark)"); +document.body.classList.add(mq.matches ? "dark" : "light"); +mq.addEventListener("change", function (e) { + document.body.classList.remove("light", "dark"); + document.body.classList.add(e.matches ? "dark" : "light"); +}); diff --git a/.agents/skills/create-integration-package/example/src/federation.ts b/.agents/skills/create-integration-package/example/src/federation.ts new file mode 100644 index 000000000..d4952e85d --- /dev/null +++ b/.agents/skills/create-integration-package/example/src/federation.ts @@ -0,0 +1,163 @@ +import { + createFederation, + generateCryptoKeyPair, + InProcessMessageQueue, + MemoryKvStore, +} from "@fedify/fedify"; +import { + Accept, + Endpoints, + Follow, + Image, + Note, + Person, + PUBLIC_COLLECTION, + type Recipient, + Undo, +} from "@fedify/vocab"; + +const federation = createFederation({ + kv: new MemoryKvStore(), + queue: new InProcessMessageQueue(), +}); + +const IDENTIFIER = "demo"; + +federation + .setActorDispatcher( + "/users/{identifier}", + async (context, identifier) => { + if (identifier != IDENTIFIER) { + return null; + } + const keyPairs = await context.getActorKeyPairs(identifier); + return new Person({ + id: context.getActorUri(identifier), + name: "Fedify Demo", + summary: "This is a Fedify Demo account.", + preferredUsername: identifier, + icon: new Image({ url: new URL("/demo-profile.png", context.url) }), + url: new URL("/", context.url), + inbox: context.getInboxUri(identifier), + endpoints: new Endpoints({ sharedInbox: context.getInboxUri() }), + publicKey: keyPairs[0].cryptographicKey, + assertionMethods: keyPairs.map((keyPair) => keyPair.multikey), + }); + }, + ) + .setKeyPairsDispatcher(async (_, identifier) => { + if (identifier != IDENTIFIER) { + return []; + } + const keyPairs = keyPairsStore.get(identifier); + if (keyPairs) { + return keyPairs; + } + const { privateKey, publicKey } = await generateCryptoKeyPair(); + keyPairsStore.set(identifier, [{ privateKey, publicKey }]); + return [{ privateKey, publicKey }]; + }); + +federation + .setInboxListeners("/users/{identifier}/inbox", "/inbox") + .on(Follow, async (context, follow) => { + if ( + follow.id == null || + follow.actorId == null || + follow.objectId == null + ) { + return; + } + const result = context.parseUri(follow.objectId); + if (result?.type !== "actor" || result.identifier !== IDENTIFIER) { + return; + } + const follower = await follow.getActor(context) as Person; + if (!follower?.id || follower.id === null) { + throw new Error("follower is null"); + } + await context.sendActivity( + { identifier: result.identifier }, + follower, + new Accept({ + id: new URL( + `#accepts/${follower.id.href}`, + context.getActorUri(IDENTIFIER), + ), + actor: follow.objectId, + object: follow, + }), + ); + relationStore.set(follower.id.href, follower); + }) + .on(Undo, async (context, undo) => { + const activity = await undo.getObject(context); + if (activity instanceof Follow) { + if (activity.id == null) { + return; + } + if (undo.actorId == null) { + return; + } + relationStore.delete(undo.actorId.href); + } else { + console.debug(undo); + } + }); + +federation.setObjectDispatcher( + Note, + "/users/{identifier}/posts/{id}", + (ctx, values) => { + const id = ctx.getObjectUri(Note, values); + const post = postStore.get(id); + if (post == null) return null; + return new Note({ + id, + attribution: ctx.getActorUri(values.identifier), + to: PUBLIC_COLLECTION, + cc: ctx.getFollowersUri(values.identifier), + content: post.content, + mediaType: "text/html", + published: post.published, + url: id, + }); + }, +); + +federation + .setFollowersDispatcher( + "/users/{identifier}/followers", + () => { + const followers = Array.from(relationStore.values()); + const items: Recipient[] = followers.map((f) => ({ + id: f.id, + inboxId: f.inboxId, + endpoints: f.endpoints, + })); + return { items }; + }, + ); + +federation.setNodeInfoDispatcher("/nodeinfo/2.1", (ctx) => { + return { + software: { + /** + * Fill `` with the actual framework name. + * Lowercase, digits, and hyphens only. + */ + name: "fedify-", + version: "0.0.1", + homepage: new URL(ctx.canonicalOrigin), + }, + protocols: ["activitypub"], + usage: { + // Usage statistics is hard-coded here for demonstration purposes. + // You should replace these with real statistics: + users: { total: 1, activeHalfyear: 1, activeMonth: 1 }, + localPosts: postStore.getAll().length, + }, + }; +}); + +export default federation; diff --git a/.agents/skills/create-integration-package/example/src/logging.ts b/.agents/skills/create-integration-package/example/src/logging.ts new file mode 100644 index 000000000..b6c55b34a --- /dev/null +++ b/.agents/skills/create-integration-package/example/src/logging.ts @@ -0,0 +1,23 @@ +import { configure, getConsoleSink } from "@logtape/logtape"; +import { AsyncLocalStorage } from "node:async_hooks"; + +await configure({ + contextLocalStorage: new AsyncLocalStorage(), + sinks: { + console: getConsoleSink(), + }, + filters: {}, + loggers: [ + { + category: "default example", + lowestLevel: "debug", + sinks: ["console"], + }, + { category: "fedify", lowestLevel: "info", sinks: ["console"] }, + { + category: ["logtape", "meta"], + lowestLevel: "warning", + sinks: ["console"], + }, + ], +}); diff --git a/.agents/skills/create-integration-package/example/src/main.ts b/.agents/skills/create-integration-package/example/src/main.ts new file mode 100644 index 000000000..54324dcb0 --- /dev/null +++ b/.agents/skills/create-integration-package/example/src/main.ts @@ -0,0 +1,2 @@ +import "./logging.ts"; +import "./app.ts"; diff --git a/.agents/skills/create-integration-package/example/src/store.ts b/.agents/skills/create-integration-package/example/src/store.ts new file mode 100644 index 000000000..154e71f5e --- /dev/null +++ b/.agents/skills/create-integration-package/example/src/store.ts @@ -0,0 +1,45 @@ +import { Note, Person } from "@fedify/vocab"; + +declare global { + var keyPairsStore: Map>; + var relationStore: Map; + var postStore: PostStore; +} + +class PostStore { + #map: Map = new Map(); + #timeline: URL[] = []; + constructor() {} + append(posts: Note[]) { + posts.filter((p) => p.id && !this.#map.has(p.id.toString())) + .forEach((p) => { + this.#map.set(p.id!.toString(), p); + this.#timeline.push(p.id!); + }); + } + get(id: URL) { + return this.#map.get(id.toString()); + } + getAll() { + return this.#timeline.toReversed() + .map((id) => id.toString()) + .map((id) => this.#map.get(id)!) + .filter((p) => p); + } + delete(id: URL) { + const existed = this.#map.delete(id.toString()); + if (existed) { + this.#timeline = this.#timeline.filter((i) => i !== id); + } + } +} + +const keyPairsStore = globalThis.keyPairsStore ?? new Map(); +const relationStore = globalThis.relationStore ?? new Map(); +const postStore = globalThis.postStore ?? new PostStore(); + +// this is just a hack for the demo +// never do this in production, use safe and secure storage +globalThis.keyPairsStore = keyPairsStore; +globalThis.relationStore = relationStore; +globalThis.postStore = postStore; diff --git a/.agents/skills/create-integration-package/init/framework.ts b/.agents/skills/create-integration-package/init/framework.ts new file mode 100644 index 000000000..a6d6f4fc5 --- /dev/null +++ b/.agents/skills/create-integration-package/init/framework.ts @@ -0,0 +1,58 @@ +// packages/init/src/webframeworks/프레임워크.ts +// The import paths are written based on the files in +// `packages/init/src/webframeworks/` where the actual files must exist, +// so do not modify them unless necessary. + +import deps from "../json/deps.json" with { type: "json" }; +import { WebFrameworkDescription } from "../types.ts"; +import { defaultDenoDependencies, defaultDevDependencies } from "./const.ts"; +import { getInstruction } from "./utils.ts"; + +const frameworkDescription: WebFrameworkDescription = { + name: "프레임워크", // Fill 프레임워크 with the official framework name + packageManagers: [ + // List the package managers that support this framework, + // the list should be a subset of `PACKAGE_MANAGER` from `../const.ts`. + // If the framework is compatible with all package managers, + // you can just use `packageManagers: PACKAGE_MANAGER`. + ], + defaultPort: 0, // Fill in the default port of the framework + init: ({ + // Destructure necessary parameters from the argument + packageManager: pm, + }) => ({ + command: [ + // Optional shell command to run before scaffolding e.g., `create-next-app`. + // Split the command into an array of command and arguments, + // e.g., `["npx", "create-next-app@latest"]`. + ], + dependencies: pm === "deno" + ? { + // Use `deps.json` for version numbers, + // e.g., `"@fedify/프레임워크": deps["@fedify/프레임워크"]`. + ...defaultDenoDependencies, + } + : { + // Use `deps.json` for version numbers, + // e.g., `"@fedify/프레임워크": deps["@fedify/프레임워크"]`. + }, + devDependencies: { + // Use `deps.json` for version numbers, + // e.g., `"@fedify/프레임워크": deps["@fedify/프레임워크"]`. + ...defaultDevDependencies, + }, + federationFile: "**/federation.ts", + loggingFile: "**/logging.ts", + tasks: { + // If `command` create a project with `tasks` in `deno.json` (or `script`s in + // `package.json`) to run application, this could be unnecessary. + // In the tasks of the finally generated application, at least include + // a `dev` task to run the development server. `dev` task is used by + // `mise test:init` to run tests against the generated project. + // For Node.js/Bun, `lint: "eslint ."` is needed. + }, + instruction: getInstruction(pm, 0 /* Replace with default port */), + }), +}; + +export default frameworkDescription; diff --git a/.agents/skills/create-integration-package/package/README.md b/.agents/skills/create-integration-package/package/README.md new file mode 100644 index 000000000..2ef2525e9 --- /dev/null +++ b/.agents/skills/create-integration-package/package/README.md @@ -0,0 +1,72 @@ + + + + +@fedify/프레임워크: Integrate Fedify with 프레임워크 +==================================================== + +[![JSR][JSR badge]][JSR] +[![npm][npm badge]][npm] +[![Matrix][Matrix badge]][Matrix] +[![Follow @fedify@hollo.social][@fedify@hollo.social badge]][@fedify@hollo.social] + +This package provides a simple way to integrate [Fedify] with [프레임워크]. + +[JSR badge]: https://jsr.io/badges/@fedify/nuxt +[JSR]: https://jsr.io/@fedify/nuxt +[npm badge]: https://img.shields.io/npm/v/@fedify/nuxt?logo=npm +[npm]: https://www.npmjs.com/package/@fedify/nuxt +[Matrix badge]: https://img.shields.io/matrix/fedify%3Amatrix.org +[Matrix]: https://matrix.to/#/#fedify:matrix.org +[@fedify@hollo.social badge]: https://fedi-badge.deno.dev/@fedify@hollo.social/followers.svg +[@fedify@hollo.social]: https://hollo.social/@fedify +[Fedify]: https://fedify.dev/ +[프레임워크]: https://프레임.워크/ + + +Installation +------------ + + + +~~~~ bash +deno add jsr:@fedify/프레임워크 +# or +npm add @fedify/프레임워크 +# or +pnpm add @fedify/프레임워크 +# or +yarn add @fedify/프레임워크 +# or +bun add @fedify/프레임워크 +~~~~ + + +Usage +----- + +First, create your `Federation` instance in a server utility file, +e.g., *src/federation.ts*: + +~~~~ typescript +import { createFederation, MemoryKvStore } from "@fedify/fedify"; + +const federation = createFederation({ + kv: new MemoryKvStore(), +}); + +// ... configure your federation ... + +export default federation; +~~~~ + +Then, add Fedify middleware to your server: + +~~~~ typescript +import fedifyHandler from "@fedify/프레임워크"; +import { federation } from "./federation.ts"; + +const fedifyMiddleware = fedifyHandler(federation); + +app.use(fedifyMiddleware); +~~~~ diff --git a/.agents/skills/create-integration-package/package/deno.jsonc b/.agents/skills/create-integration-package/package/deno.jsonc new file mode 100644 index 000000000..879979c29 --- /dev/null +++ b/.agents/skills/create-integration-package/package/deno.jsonc @@ -0,0 +1,22 @@ +{ + "name": "@fedify/프레임워크", // Replace `프레임워크` with the framework name in lowercase + "version": "*.*.*", // Sync with packages/fedify/deno.json + "license": "MIT", + "exports": { + ".": "./src/mod.ts" + }, + "exclude": [ + "dist", + "node_modules" + ], + "publish": { + "exclude": [ + "**/*.test.ts", // If there are test files + "tsdown.config.ts" + ] + }, + "tasks": { + "check": "deno fmt --check && deno lint && deno check src/*.ts", + "test": "deno test" // Add if --allow-* for permissions is needed + } +} diff --git a/.agents/skills/create-integration-package/package/package.jsonc b/.agents/skills/create-integration-package/package/package.jsonc new file mode 100644 index 000000000..552622b92 --- /dev/null +++ b/.agents/skills/create-integration-package/package/package.jsonc @@ -0,0 +1,66 @@ +{ + "name": "@fedify/프레임워크", // Fill 프레임워크 with the framework name in lowercase + "version": "*.*.*", // Sync with packages/fedify/package.json + "description": "Integration Package for Fedify with 프레임워크", // Fill 프레임워크 with the framework name + "keywords": [ + "Fedify", + "Federation", + // Add relevant keywords for the framework + ], + "author": { // Fill in author information + "name": "", + "email": "", + "url": "", + }, + "repository": { + "type": "git", + "url": "git+https://github.com/fedify-dev/fedify.git", + "directory": "packages/프레임워크" // Fill 프레임워크 with the framework name + }, + "homepage": "https://fedify.dev/", + "license": "MIT", + "bugs": { + "url": "https://github.com/fedify-dev/fedify/issues" + }, + "funding": [ + "https://opencollective.com/fedify", + "https://github.com/sponsors/dahlia" + ], + "main": "./dist/mod.js", + "module": "./dist/mod.mjs", + "types": "./dist/mod.d.ts", + "exports": { + ".": { + "types": { + "import": "./dist/mod.d.ts", + "require": "./dist/mod.d.cts", + "default": "./dist/mod.d.ts" + }, + "import": "./dist/mod.js", + "require": "./dist/mod.cjs", + "default": "./dist/mod.js" + }, + "./package.json": "./package.json" + }, + "files": [ + "dist/", + "package.json" + ], + "peerDependencies": { + "@fedify/fedify": "workspace:^", + "@nestjs/common": "catalog:", + // Add other relevant peer dependencies for the framework + }, + "devDependencies": { + "@types/node": "catalog:", + "tsdown": "catalog:", + "typescript": "catalog:", + // Add other relevant peer dependencies for the framework + }, + "scripts": { + "build:self": "tsdown", + "build": "pnpm --filter @fedify/프레임워크... run build:self", + "prepack": "pnpm build", + "prepublish": "pnpm build" + } +} diff --git a/.agents/skills/create-integration-package/package/src/mod.ts b/.agents/skills/create-integration-package/package/src/mod.ts new file mode 100644 index 000000000..c484666e7 --- /dev/null +++ b/.agents/skills/create-integration-package/package/src/mod.ts @@ -0,0 +1,16 @@ +import { Federation } from "@fedify/fedify"; + +// `FrameworkContext` could be unnecessary. +// Remove it if the framework's middleware handler does not provide a context object. + +export type ContextDataFactory = ( + context: FrameworkContext, +) => TContextData | Promise; + +export function fedifyMiddleware( + federation: Federation, + contextDataFactory?: ContextDataFactory = + (() => void 0 as TContextData), +): FrameworkMiddlewareHandler { + // Implement handler or middleware +} diff --git a/.agents/skills/create-integration-package/package/tsdown.config.ts b/.agents/skills/create-integration-package/package/tsdown.config.ts new file mode 100644 index 000000000..54e25f61b --- /dev/null +++ b/.agents/skills/create-integration-package/package/tsdown.config.ts @@ -0,0 +1,13 @@ +import { defineConfig } from "tsdown"; + +export default defineConfig({ + entry: ["src/mod.ts"], + format: ["esm", "cjs"], + platform: "node", + outExtensions({ format }) { + return { + js: format === "cjs" ? ".cjs" : ".js", + dts: format === "cjs" ? ".d.cts" : ".d.ts", + }; + }, +}); diff --git a/AGENTS.md b/AGENTS.md index b23d7d2b9..020c40f65 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -158,11 +158,10 @@ Common tasks ### Implementing framework integrations -1. Create a new package in *packages/* directory for new integrations -2. Follow pattern from existing integration packages (*packages/hono/*, - *packages/sveltekit/*) -3. Use standard request/response interfaces for compatibility -4. Consider creating example applications in *examples/* that demonstrate usage +A detailed step-by-step guide is available in +*.agents/skills/create-integration-package/SKILL.md*. It covers the entire +workflow: researching the framework, creating the package, adding it to +`fedify init`, testing, and writing an example. ### Creating database adapters diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8b73c580e..e41f9bbad 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -208,6 +208,15 @@ When adding a new package to the monorepo, the following files must be updated: - If using pnpm catalog for dependency management: Add to `catalog` in *pnpm-workspace.yaml*. +### Adding a web framework integration + +A step-by-step guide for implementing a web framework integration package is +available in *.agents/skills/create-integration-package/SKILL.md*. Although +the file is primarily designed for AI coding agents, the instructions are +written so that human contributors can also read and follow them. The guide +covers the entire workflow from researching the framework through creating +the package, adding it to `fedify init`, testing, and writing an example. + ### Dependency management Fedify uses two package managers: diff --git a/examples/test-examples/mod.ts b/examples/test-examples/mod.ts index 0ed78181f..d83dac360 100644 --- a/examples/test-examples/mod.ts +++ b/examples/test-examples/mod.ts @@ -126,6 +126,25 @@ type TestResult = | { name: string; status: "skip"; reason: string }; // ─── Example Registry ───────────────────────────────────────────────────────── +// +// Every example directory under examples/ must be registered in exactly one of +// the arrays below. The test runner scans the examples/ directory and reports +// any unregistered directories as warnings. +// +// - SERVER_EXAMPLES – Long-running HTTP servers. The runner starts the +// server, opens a tunnel, and verifies federation via +// `fedify lookup`. Most integration framework examples +// belong here. +// - SCRIPT_EXAMPLES – Standalone scripts (no server). The runner executes +// the command and checks the exit code. +// - MULTI_HANDLE_EXAMPLES – Scripts that accept an ActivityPub handle as +// their last argument. Multiple handles are tried in +// order; the test passes if any exits with code 0. +// - SKIPPED_EXAMPLES – Examples that cannot be tested automatically. +// Provide a reason string explaining why. +// +// See the interface definitions above for the full set of fields each entry +// accepts. const SERVER_EXAMPLES: ServerExample[] = [ { From 7d018d71b0fd97c857acab7b863cf373782d4826 Mon Sep 17 00:00:00 2001 From: ChanHaeng Lee <2chanhaeng@gmail.com> Date: Thu, 9 Apr 2026 04:41:55 +0000 Subject: [PATCH 03/10] Create `@fedify/adonis` by Claude Opus 4.6 using `/create-integration-package` skill in one-shot No error while `mise test:init`. --- CHANGES.md | 6 + deno.json | 1 + docs/manual/integration.md | 732 +++++++++-------- examples/adonis/.gitignore | 1 + examples/adonis/README.md | 39 + examples/adonis/package.json | 23 + examples/adonis/src/app.ts | 65 ++ examples/adonis/src/federation.ts | 78 ++ examples/adonis/src/logging.ts | 20 + examples/adonis/src/main.ts | 2 + examples/adonis/tsconfig.json | 18 + examples/test-examples/mod.ts | 10 + packages/adonis/README.md | 80 ++ packages/adonis/deno.json | 21 + packages/adonis/package.json | 66 ++ packages/adonis/src/mod.ts | 191 +++++ packages/adonis/tsdown.config.ts | 14 + packages/fedify/README.md | 3 + packages/init/src/const.ts | 1 + packages/init/src/json/deps.json | 1 + packages/init/src/templates/adonis/app.ts.tpl | 46 ++ .../init/src/templates/adonis/index.ts.tpl | 6 + packages/init/src/test/port.ts | 1 + packages/init/src/webframeworks/adonis.ts | 65 ++ packages/init/src/webframeworks/mod.ts | 2 + pnpm-lock.yaml | 762 +++++++++++++++++- pnpm-workspace.yaml | 2 + 27 files changed, 1894 insertions(+), 362 deletions(-) create mode 100644 examples/adonis/.gitignore create mode 100644 examples/adonis/README.md create mode 100644 examples/adonis/package.json create mode 100644 examples/adonis/src/app.ts create mode 100644 examples/adonis/src/federation.ts create mode 100644 examples/adonis/src/logging.ts create mode 100644 examples/adonis/src/main.ts create mode 100644 examples/adonis/tsconfig.json create mode 100644 packages/adonis/README.md create mode 100644 packages/adonis/deno.json create mode 100644 packages/adonis/package.json create mode 100644 packages/adonis/src/mod.ts create mode 100644 packages/adonis/tsdown.config.ts create mode 100644 packages/init/src/templates/adonis/app.ts.tpl create mode 100644 packages/init/src/templates/adonis/index.ts.tpl create mode 100644 packages/init/src/webframeworks/adonis.ts diff --git a/CHANGES.md b/CHANGES.md index 89b9a29fa..d69c38018 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -35,6 +35,12 @@ To be released. [FEP-0837]: https://w3id.org/fep/0837 [#578]: https://github.com/fedify-dev/fedify/issues/578 +### @fedify/adonis + + - Added `@fedify/adonis` package for integrating Fedify with [AdonisJS]. + +[AdonisJS]: https://adonisjs.com/ + ### @fedify/solidstart - Added `@fedify/solidstart` package for integrating Fedify with diff --git a/deno.json b/deno.json index 869bc2e36..01ab1218a 100644 --- a/deno.json +++ b/deno.json @@ -1,5 +1,6 @@ { "workspace": [ + "./packages/adonis", "./packages/amqp", "./packages/astro", "./packages/cfworkers", diff --git a/docs/manual/integration.md b/docs/manual/integration.md index d9829982d..00edfbd4c 100644 --- a/docs/manual/integration.md +++ b/docs/manual/integration.md @@ -4,35 +4,31 @@ description: >- explains how to integrate Fedify with web frameworks. --- -Integration -=========== +# Integration -Fedify is designed to be used together with web frameworks. This document +Fedify is designed to be used together with web frameworks. This document explains how to integrate Fedify with web frameworks. - -How it works ------------- +## How it works Usually, Fedify behaves as a middleware that wraps around the web framework's -request handler. The middleware intercepts the incoming HTTP requests and -dispatches them to the appropriate handler based on the request path and -the [`Accept`] header (i.e., [content negotiation]). Basically, this -architecture allows Fedify and your web framework to coexist in the same domain -and port. - -For example, if you make a request to */.well-known/webfinger* Fedify will -handle the request by itself, but if you make a request to */users/alice* +request handler. The middleware intercepts the incoming HTTP requests and +dispatches them to the appropriate handler based on the request path and the +[`Accept`] header (i.e., [content negotiation]). Basically, this architecture +allows Fedify and your web framework to coexist in the same domain and port. + +For example, if you make a request to _/.well-known/webfinger_ Fedify will +handle the request by itself, but if you make a request to _/users/alice_ (assuming your web framework has a handler for `/users/:identifier`) with `Accept: text/html` header, Fedify will dispatch the request to the web -framework's appropriate handler for `/users/:identifier`. Or if you define an +framework's appropriate handler for `/users/:identifier`. Or if you define an actor dispatcher for `/users/{identifier}` in Fedify, and the request is made with `Accept: application/activity+json` header, Fedify will dispatch the request to the appropriate actor dispatcher. Here is a diagram that illustrates the architecture: -~~~~ mermaid +```mermaid sequenceDiagram participant Client participant Fedify @@ -51,58 +47,111 @@ sequenceDiagram Fedify ->> WF: GET /users/alice WF -->> Fedify: 200 OK Fedify -->> Client: 200 OK -~~~~ +``` > [!NOTE] > -> Why not use a reverse proxy in front of the web framework and Fedify? -> Because you would want to call Fedify's API from the web framework's -> request handler, e.g., to send an ActivityPub activity. If you put a -> reverse proxy in front of them, the web framework cannot call Fedify's API -> directly. +> Why not use a reverse proxy in front of the web framework and Fedify? Because +> you would want to call Fedify's API from the web framework's request handler, +> e.g., to send an ActivityPub activity. If you put a reverse proxy in front of +> them, the web framework cannot call Fedify's API directly. > -> Of course, you can divide your application into two separate services, -> one for ActivityPub and the other for the web application, and put a -> reverse proxy in front of them. But in this case, you need to implement -> the communication between the two services (using a message queue or RPC, -> for example), which is non-trivial. +> Of course, you can divide your application into two separate services, one for +> ActivityPub and the other for the web application, and put a reverse proxy in +> front of them. But in this case, you need to implement the communication +> between the two services (using a message queue or RPC, for example), which is +> non-trivial. [`Accept`]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept [content negotiation]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Content_negotiation +## AdonisJS + +[AdonisJS] is a batteries-included TypeScript framework for building full-stack +web applications on Node.js. The _@fedify/adonis_ package provides a middleware +to integrate Fedify with AdonisJS: + +::: code-group + +```sh [npm] +npm add @fedify/adonis +``` + +```sh [pnpm] +pnpm add @fedify/adonis +``` + +```sh [Yarn] +yarn add @fedify/adonis +``` + +```sh [Bun] +bun add @fedify/adonis +``` + +::: + +Create a middleware file and register it as a server middleware: + +```typescript +// app/middleware/fedify_middleware.ts +import { fedifyMiddleware } from "@fedify/adonis"; +import { createFederation } from "@fedify/fedify"; + +export const federation = createFederation({ + // Omitted for brevity; see the related section for details. +}); + +export default fedifyMiddleware(federation); +``` + +```typescript +// start/kernel.ts +import server from "@adonisjs/core/services/server"; + +server.use([ + () => import("#middleware/fedify_middleware"), + // ... other middleware +]); +``` + +> [!TIP] +> Register the Fedify middleware before the body parser middleware so that +> federation endpoints can read the raw request body. + +[AdonisJS]: https://adonisjs.com/ -Express -------- +## Express -[Express] is a fast, unopinionated, minimalist web framework for Node.js. -The *@fedify/express* package provides a middleware to integrate Fedify with +[Express] is a fast, unopinionated, minimalist web framework for Node.js. The +_@fedify/express_ package provides a middleware to integrate Fedify with Express: ::: code-group -~~~~ sh [Deno] +```sh [Deno] deno add jsr:@fedify/express -~~~~ +``` -~~~~ sh [npm] +```sh [npm] npm add @fedify/express -~~~~ +``` -~~~~ sh [pnpm] +```sh [pnpm] pnpm add @fedify/express -~~~~ +``` -~~~~ sh [Yarn] +```sh [Yarn] yarn add @fedify/express -~~~~ +``` -~~~~ sh [Bun] +```sh [Bun] bun add @fedify/express -~~~~ +``` ::: -~~~~ typescript twoslash +```typescript twoslash // @noErrors: 2345 import express from "express"; import { integrateFederation } from "@fedify/express"; @@ -116,54 +165,52 @@ export const app = express(); app.set("trust proxy", true); -app.use(integrateFederation(federation, (req) => "context data goes here")); // [!code highlight] -~~~~ +app.use(integrateFederation(federation, (req) => "context data goes here")); // [!code highlight] +``` > [!NOTE] -> If your application uses Express 4.x behind a reverse proxy with -> a non-standard port (e.g., `Host: example.com:8080`), the reconstructed -> request URL may lose the port number. This is because Express 4.x's -> [`req.host`][trust proxy] (which respects `trust proxy`) strips the port -> from the `Host` header. +> If your application uses Express 4.x behind a reverse proxy with a +> non-standard port (e.g., `Host: example.com:8080`), the reconstructed request +> URL may lose the port number. This is because Express 4.x's +> [`req.host`][trust proxy] (which respects `trust proxy`) strips the port from +> the `Host` header. > -> This does not occur with Express 5.x, where `req.host` retains the port. -> If you rely on `trust proxy` and your origin includes a non-standard port, -> we recommend upgrading to Express 5. +> This does not occur with Express 5.x, where `req.host` retains the port. If +> you rely on `trust proxy` and your origin includes a non-standard port, we +> recommend upgrading to Express 5. [Express]: https://expressjs.com/ [trust proxy]: https://expressjs.com/en/guide/behind-proxies.html +## Fastify -Fastify -------- - -*This API is available since Fedify 1.9.0.* +_This API is available since Fedify 1.9.0._ -[Fastify] is a fast and low overhead web framework for Node.js, with -a powerful plugin architecture and sensible defaults. The *@fedify/fastify* -package provides a plugin to integrate Fedify with Fastify: +[Fastify] is a fast and low overhead web framework for Node.js, with a powerful +plugin architecture and sensible defaults. The _@fedify/fastify_ package +provides a plugin to integrate Fedify with Fastify: ::: code-group -~~~~ sh [npm] +```sh [npm] npm add @fedify/fastify -~~~~ +``` -~~~~ sh [pnpm] +```sh [pnpm] pnpm add @fedify/fastify -~~~~ +``` -~~~~ sh [Yarn] +```sh [Yarn] yarn add @fedify/fastify -~~~~ +``` -~~~~ sh [Bun] +```sh [Bun] bun add @fedify/fastify -~~~~ +``` ::: -~~~~ typescript twoslash +```typescript twoslash // @noErrors: 2345 import Fastify from "fastify"; import { fedifyPlugin } from "@fedify/fastify"; @@ -176,52 +223,50 @@ export const federation = createFederation({ const fastify = Fastify({ logger: true }); // Register the Fedify plugin: -await fastify.register(fedifyPlugin, { // [!code highlight] - federation, // [!code highlight] - contextDataFactory: () => undefined, // [!code highlight] -}); // [!code highlight] +await fastify.register(fedifyPlugin, { // [!code highlight] + federation, // [!code highlight] + contextDataFactory: () => undefined, // [!code highlight] +}); // [!code highlight] fastify.listen({ port: 3000 }); -~~~~ +``` [Fastify]: https://fastify.dev/ +## Koa -Koa ---- - -*This API is available since Fedify 1.9.0.* +_This API is available since Fedify 1.9.0._ [Koa] is a lightweight, expressive, and modern web framework for Node.js, -designed by the team behind Express. It uses async functions and provides -a more elegant middleware architecture. The *@fedify/koa* package provides -a middleware to integrate Fedify with Koa: +designed by the team behind Express. It uses async functions and provides a more +elegant middleware architecture. The _@fedify/koa_ package provides a middleware +to integrate Fedify with Koa: ::: code-group -~~~~ sh [Deno] +```sh [Deno] deno add jsr:@fedify/koa -~~~~ +``` -~~~~ sh [npm] +```sh [npm] npm add @fedify/koa -~~~~ +``` -~~~~ sh [pnpm] +```sh [pnpm] pnpm add @fedify/koa -~~~~ +``` -~~~~ sh [Yarn] +```sh [Yarn] yarn add @fedify/koa -~~~~ +``` -~~~~ sh [Bun] +```sh [Bun] bun add @fedify/koa -~~~~ +``` ::: -~~~~ typescript twoslash +```typescript twoslash // @noErrors: 2345 import Koa from "koa"; import { createMiddleware } from "@fedify/koa"; @@ -233,51 +278,49 @@ export const federation = createFederation({ export const app = new Koa(); -app.proxy = true; // trust proxy headers +app.proxy = true; // trust proxy headers -app.use(createMiddleware(federation, (ctx) => "context data goes here")); // [!code highlight] -~~~~ +app.use(createMiddleware(federation, (ctx) => "context data goes here")); // [!code highlight] +``` > [!NOTE] > The `@fedify/koa` package supports both Koa v2.x and v3.x. [Koa]: https://koajs.com/ +## Hono -Hono ----- - -*This API is available since Fedify 1.9.0.* +_This API is available since Fedify 1.9.0._ [Hono] is a fast, lightweight, and Web standard-compliant server framework for -TypeScript. The *@fedify/hono* package provides a middleware to integrate -Fedify with Hono: +TypeScript. The _@fedify/hono_ package provides a middleware to integrate Fedify +with Hono: ::: code-group -~~~~ sh [Deno] +```sh [Deno] deno add jsr:@fedify/hono -~~~~ +``` -~~~~ sh [npm] +```sh [npm] npm add @fedify/hono -~~~~ +``` -~~~~ sh [pnpm] +```sh [pnpm] pnpm add @fedify/hono -~~~~ +``` -~~~~ sh [Yarn] +```sh [Yarn] yarn add @fedify/hono -~~~~ +``` -~~~~ sh [Bun] +```sh [Bun] bun add @fedify/hono -~~~~ +``` ::: -~~~~ typescript +```typescript import { createFederation } from "@fedify/fedify"; import { federation } from "@fedify/hono"; import { Hono } from "hono"; @@ -287,44 +330,42 @@ const fedi = createFederation({ }); const app = new Hono(); -app.use(federation(fedi, (ctx) => "context data")); // [!code highlight] -~~~~ +app.use(federation(fedi, (ctx) => "context data")); // [!code highlight] +``` [Hono]: https://hono.dev/ - -h3 --- +## h3 [h3] is an HTTP server framework behind [Nitro], [Analog], [Vinxi], -[SolidStart], [TanStack Start], and other many web frameworks. -The *@fedify/h3* package provides a middleware to integrate Fedify with h3: +[SolidStart], [TanStack Start], and other many web frameworks. The _@fedify/h3_ +package provides a middleware to integrate Fedify with h3: ::: code-group -~~~~ sh [Deno] +```sh [Deno] deno add jsr:@fedify/h3 -~~~~ +``` -~~~~ sh [npm] +```sh [npm] npm add @fedify/h3 -~~~~ +``` -~~~~ sh [pnpm] +```sh [pnpm] pnpm add @fedify/h3 -~~~~ +``` -~~~~ sh [Yarn] +```sh [Yarn] yarn add @fedify/h3 -~~~~ +``` -~~~~ sh [Bun] +```sh [Bun] bun add @fedify/h3 -~~~~ +``` ::: -~~~~ typescript {9-15} twoslash +```typescript {9-15} twoslash // @noErrors: 2345 import { createApp, createRouter } from "h3"; import { createFederation } from "@fedify/fedify"; @@ -338,17 +379,17 @@ export const app = createApp({ onError }); app.use( integrateFederation( federation, - (event, request) => "context data goes here" - ) + (event, request) => "context data goes here", + ), ); const router = createRouter(); app.use(router); -~~~~ +``` > [!NOTE] -> Your app has to configure `onError` to let Fedify negotiate content types. -> If you don't do this, Fedify will not be able to respond with a proper error +> Your app has to configure `onError` to let Fedify negotiate content types. If +> you don't do this, Fedify will not be able to respond with a proper error > status code when a content negotiation fails. [h3]: https://h3.unjs.io/ @@ -358,41 +399,39 @@ app.use(router); [SolidStart]: https://start.solidjs.com/ [TanStack Start]: https://tanstack.com/start +## SvelteKit -SvelteKit ---------- - -*This API is available since Fedify 1.3.0.* +_This API is available since Fedify 1.3.0._ -[SvelteKit] is a framework for building web applications with [Svelte]. The -*@fedify/sveltekit* package provides a middleware to integrate Fedify with +[SvelteKit] is a framework for building web applications with [Svelte]. The +_@fedify/sveltekit_ package provides a middleware to integrate Fedify with SvelteKit: ::: code-group -~~~~ sh [Deno] +```sh [Deno] deno add jsr:@fedify/sveltekit -~~~~ +``` -~~~~ sh [npm] +```sh [npm] npm add @fedify/sveltekit -~~~~ +``` -~~~~ sh [pnpm] +```sh [pnpm] pnpm add @fedify/sveltekit -~~~~ +``` -~~~~ sh [Yarn] +```sh [Yarn] yarn add @fedify/sveltekit -~~~~ +``` -~~~~ sh [Bun] +```sh [Bun] bun add @fedify/sveltekit -~~~~ +``` ::: -~~~~ typescript +```typescript import { createFederation } from "@fedify/fedify"; import { fedifyHook } from "@fedify/sveltekit"; @@ -402,48 +441,43 @@ const federation = createFederation({ // This is the entry point to the Fedify hook from the SvelteKit framework: export const handle = fedifyHook(federation, (req) => "context data"); -~~~~ +``` [SvelteKit]: https://kit.svelte.dev/ [Svelte]: https://svelte.dev/ +## NestJS -NestJS ------- - -*This API is available since Fedify 1.8.0.* +_This API is available since Fedify 1.8.0._ [NestJS] is a modular, versatile, and scalable framework for building efficient, -reliable, and scalable server-side applications with Node.js and TypeScript. -The *@fedify/nestjs* package provides a middleware to integrate Fedify with -NestJS: +reliable, and scalable server-side applications with Node.js and TypeScript. The +_@fedify/nestjs_ package provides a middleware to integrate Fedify with NestJS: ::: code-group -~~~~ sh [npm] +```sh [npm] npm add @fedify/nestjs -~~~~ +``` -~~~~ sh [pnpm] +```sh [pnpm] pnpm add @fedify/nestjs -~~~~ +``` -~~~~ sh [Yarn] +```sh [Yarn] yarn add @fedify/nestjs -~~~~ +``` -~~~~ sh [Bun] +```sh [Bun] bun add @fedify/nestjs -~~~~ +``` ::: -~~~~ typescript [modules/federation/federation.service.ts] twoslash -import { Injectable, Inject, OnModuleInit } from '@nestjs/common'; -import { - FEDIFY_FEDERATION, -} from '@fedify/nestjs'; -import { Federation } from '@fedify/fedify'; +```typescript [modules/federation/federation.service.ts] twoslash +import { Inject, Injectable, OnModuleInit } from "@nestjs/common"; +import { FEDIFY_FEDERATION } from "@fedify/nestjs"; +import { Federation } from "@fedify/fedify"; @Injectable() export class FederationService implements OnModuleInit { @@ -451,7 +485,7 @@ export class FederationService implements OnModuleInit { constructor( @Inject(FEDIFY_FEDERATION) private federation: Federation, - ) { } + ) {} async onModuleInit() { if (!this.initialized) { @@ -465,7 +499,7 @@ export class FederationService implements OnModuleInit { return { software: { name: "Fedify NestJS sample", - version: "0.0.1" + version: "0.0.1", }, protocols: ["activitypub"], usage: { @@ -478,19 +512,17 @@ export class FederationService implements OnModuleInit { localPosts: 0, localComments: 0, }, - } + }; }); } } -~~~~ +``` -~~~~ typescript [modules/federation/federation.module.ts] twoslash +```typescript [modules/federation/federation.module.ts] twoslash // @noErrors: 2395 2307 -import { Injectable, Inject, OnModuleInit } from '@nestjs/common'; -import { - FEDIFY_FEDERATION, -} from '@fedify/nestjs'; -import { Federation } from '@fedify/fedify'; +import { Inject, Injectable, OnModuleInit } from "@nestjs/common"; +import { FEDIFY_FEDERATION } from "@fedify/nestjs"; +import { Federation } from "@fedify/fedify"; @Injectable() export class FederationService implements OnModuleInit { @@ -498,7 +530,7 @@ export class FederationService implements OnModuleInit { constructor( @Inject(FEDIFY_FEDERATION) private federation: Federation, - ) { } + ) {} async onModuleInit() { if (!this.initialized) { @@ -511,17 +543,17 @@ export class FederationService implements OnModuleInit { } } // ---cut-before--- -import { Module } from '@nestjs/common'; -import { FederationService } from './federation.service'; +import { Module } from "@nestjs/common"; +import { FederationService } from "./federation.service"; @Module({ providers: [FederationService], exports: [FederationService], }) export class FederationModule {} -~~~~ +``` -~~~~ typescript [app.module.ts] twoslash +```typescript [app.module.ts] twoslash // @noErrors: 2307 // ---cut-before--- import { @@ -530,21 +562,25 @@ import { Module, NestModule, RequestMethod, -} from '@nestjs/common'; -import { ConfigModule } from '@nestjs/config'; -import * as express from 'express'; -import { AppController } from './app.controller'; -import { AppService } from './app.service'; -import { DatabaseModule } from './database/database.module'; -import { FederationModule } from './modules/federation/federation.module'; -import { InProcessMessageQueue, MemoryKvStore, Federation } from '@fedify/fedify'; -import process from 'node:process'; +} from "@nestjs/common"; +import { ConfigModule } from "@nestjs/config"; +import * as express from "express"; +import { AppController } from "./app.controller"; +import { AppService } from "./app.service"; +import { DatabaseModule } from "./database/database.module"; +import { FederationModule } from "./modules/federation/federation.module"; +import { + Federation, + InProcessMessageQueue, + MemoryKvStore, +} from "@fedify/fedify"; +import process from "node:process"; import { FEDIFY_FEDERATION, FedifyModule, integrateFederation, -} from '@fedify/nestjs'; +} from "@fedify/nestjs"; @Module({ imports: [ @@ -555,7 +591,7 @@ import { FedifyModule.forRoot({ kv: new MemoryKvStore(), queue: new InProcessMessageQueue(), - origin: process.env.FEDERATION_ORIGIN || 'http://localhost:3000', + origin: process.env.FEDERATION_ORIGIN || "http://localhost:3000", }), FederationModule, ], @@ -565,7 +601,7 @@ import { export class AppModule implements NestModule { constructor( @Inject(FEDIFY_FEDERATION) private federation: Federation, - ) { } + ) {} configure(consumer: MiddlewareConsumer) { const fedifyMiddleware = integrateFederation( @@ -582,54 +618,52 @@ export class AppModule implements NestModule { // Fedify middleware requires the raw request body for HTTP signature verification // so we apply `express.raw()` before `fedifyMiddleware` to preserve the body. consumer.apply( - express.raw({ type: '*/*' }), - fedifyMiddleware - ).forRoutes({ path: '*', method: RequestMethod.ALL }); + express.raw({ type: "*/*" }), + fedifyMiddleware, + ).forRoutes({ path: "*", method: RequestMethod.ALL }); } } -~~~~ +``` [NestJS]: https://nestjs.com/ +## Elysia -Elysia ------- - -*This API is available since Fedify 1.8.0.* +_This API is available since Fedify 1.8.0._ [Elysia] is an ergonomic framework designed for humans, featuring built-in -TypeScript support with end-to-end type safety, type integrity, and -an exceptional developer experience. Powered by Bun, it delivers high -performance and modern tooling. The *@fedify/elysia* package provides -a seamless plugin for integrating Fedify with Elysia: +TypeScript support with end-to-end type safety, type integrity, and an +exceptional developer experience. Powered by Bun, it delivers high performance +and modern tooling. The _@fedify/elysia_ package provides a seamless plugin for +integrating Fedify with Elysia: ::: code-group -~~~~ sh [Bun] +```sh [Bun] bun add @fedify/elysia -~~~~ +``` -~~~~ sh [Deno] +```sh [Deno] deno add npm:@fedify/elysia -~~~~ +``` -~~~~ sh [npm] +```sh [npm] npm add @fedify/elysia -~~~~ +``` -~~~~ sh [pnpm] +```sh [pnpm] pnpm add @fedify/elysia -~~~~ +``` -~~~~ sh [Yarn] +```sh [Yarn] yarn add @fedify/elysia -~~~~ +``` ::: -~~~~ typescript +```typescript import { fedify } from "@fedify/elysia"; -import { federation } from "./federation.ts"; // Your `Federation` instance +import { federation } from "./federation.ts"; // Your `Federation` instance import { Elysia } from "elysia"; const app = new Elysia(); @@ -639,80 +673,78 @@ app .listen(3000); console.log("Elysia App Start!"); -~~~~ +``` [Elysia]: https://elysiajs.com/ +## Next.js -Next.js -------- - -*This API is available since Fedify 1.9.0.* +_This API is available since Fedify 1.9.0._ > [!TIP] -> You can see the example in the `examples/next-integration` directory in -> the [Fedify repository]. You can create a Fedify–Next.js app copying the -> example with the following command: +> You can see the example in the `examples/next-integration` directory in the +> [Fedify repository]. You can create a Fedify–Next.js app copying the example +> with the following command: > > ::: code-group > -> ~~~~ sh [npm] +> ```sh [npm] > npx create-next-app -e https://github.com/fedify-dev/fedify \ > --example-path examples/next-integration -> ~~~~ +> ``` > -> ~~~~ sh [pnpm] +> ```sh [pnpm] > pnpm create next-app -e https://github.com/fedify-dev/fedify \ > --example-path examples/next-integration -> ~~~~ +> ``` > -> ~~~~ sh [Yarn] +> ```sh [Yarn] > yarn create next-app -e https://github.com/fedify-dev/fedify \ > --example-path examples/next-integration -> ~~~~ +> ``` > -> ~~~~ sh [Bun] +> ```sh [Bun] > bun create next-app -e https://github.com/fedify-dev/fedify \ > --example-path examples/next-integration -> ~~~~ +> ``` > > ::: -[Next.js] is a React framework that enables you to build server-rendered -and statically generated web applications. The *@fedify/next* package provides -a middleware to integrate Fedify with Next.js: +[Next.js] is a React framework that enables you to build server-rendered and +statically generated web applications. The _@fedify/next_ package provides a +middleware to integrate Fedify with Next.js: ::: code-group -~~~~ sh [Deno] +```sh [Deno] deno add jsr:@fedify/next -~~~~ +``` -~~~~ sh [npm] +```sh [npm] npm add @fedify/next -~~~~ +``` -~~~~ sh [pnpm] +```sh [pnpm] pnpm add @fedify/next -~~~~ +``` -~~~~ sh [Yarn] +```sh [Yarn] yarn add @fedify/next -~~~~ +``` -~~~~ sh [Bun] +```sh [Bun] bun add @fedify/next -~~~~ +``` ::: Or create an app with the following command using the Fedify CLI: -~~~~ sh +```sh fedify init my-next-app -~~~~ +``` -~~~~ +``` ? Choose the JavaScript runtime to use › Node.js ? Choose the package manager to use › npm ? Choose the web framework to integrate Fedify with › Next.js @@ -720,21 +752,20 @@ fedify init my-next-app ? Choose the message queue to use for background jobs › In-process ✔ Would you like your code inside a `src/` directory? … No ✔ Would you like to customize the import alias (`@/*` by default)? … No -~~~~ +``` -Then you can see the Next.js boilerplate code in the `my-next-app` directory. -If you have created a Next.js app with `create-next-app` before, you'll see -some differences in the code. There is a `middleware.ts` file in the -`my-next-app` directory, which is the entry point to the Fedify middleware -from the Next.js framework. Or, if you just install *@fedify/next* manually, -put the following code in your `middleware.ts` file: +Then you can see the Next.js boilerplate code in the `my-next-app` directory. If +you have created a Next.js app with `create-next-app` before, you'll see some +differences in the code. There is a `middleware.ts` file in the `my-next-app` +directory, which is the entry point to the Fedify middleware from the Next.js +framework. Or, if you just install _@fedify/next_ manually, put the following +code in your `middleware.ts` file: -~~~~ typescript +```typescript import { fedifyWith } from "@fedify/next"; import federation from "./federation"; // Your `Federation` instance -export default fedifyWith(federation)( -/* +export default fedifyWith(federation)(); /* function (request: Request) { // If you need to handle other requests besides federation // requests in middleware, you can do it here. @@ -743,7 +774,6 @@ export default fedifyWith(federation)( return NextResponse.next(); }, */ -) // This config needs because middleware process only requests with the // "Accept" header matching the federation accept regex. @@ -775,24 +805,22 @@ export const config = { { source: "/.well-known/x-nodeinfo2" }, ], }; -~~~~ +``` -As you can see in the comment, you can handle other requests besides -federation requests in the middleware. If you handle only federation requests -in the middleware, you can omit the function argument of `fedifyWith()`. -The `config` object is necessary to let Next.js know that the middleware -should process requests with the [`Accept`] header matching the federation -accept regex. This is because Next.js middleware processes only requests -with the [`Accept`] header matching the regex by default. More details can be -found in the Next.js official documentation [`config` in `middleware.js`]. +As you can see in the comment, you can handle other requests besides federation +requests in the middleware. If you handle only federation requests in the +middleware, you can omit the function argument of `fedifyWith()`. The `config` +object is necessary to let Next.js know that the middleware should process +requests with the [`Accept`] header matching the federation accept regex. This +is because Next.js middleware processes only requests with the [`Accept`] header +matching the regex by default. More details can be found in the Next.js official +documentation [`config` in `middleware.js`]. [Fedify repository]: https://github.com/fedify-dev/fedify [Next.js]: https://nextjs.org/ [`config` in `middleware.js`]: https://nextjs.org/docs/app/api-reference/file-conventions/middleware#config-object-optional - -Astro ------ +## Astro _This API is available since Fedify 2.1.0._ @@ -801,31 +829,31 @@ package provides an integration and middleware to integrate Fedify with Astro: ::: code-group -~~~~ sh [Deno] +```sh [Deno] deno add jsr:@fedify/astro -~~~~ +``` -~~~~ sh [npm] +```sh [npm] npm add @fedify/astro -~~~~ +``` -~~~~ sh [pnpm] +```sh [pnpm] pnpm add @fedify/astro -~~~~ +``` -~~~~ sh [Yarn] +```sh [Yarn] yarn add @fedify/astro -~~~~ +``` -~~~~ sh [Bun] +```sh [Bun] bun add @fedify/astro -~~~~ +``` ::: First, add the Fedify integration to your _astro.config.ts_: -~~~~ typescript +```typescript import { defineConfig } from "astro/config"; import { fedifyIntegration } from "@fedify/astro"; @@ -833,11 +861,11 @@ export default defineConfig({ integrations: [fedifyIntegration()], // [!code highlight] output: "server", }); -~~~~ +``` Then, create your middleware in _src/middleware.ts_: -~~~~ typescript +```typescript import { createFederation } from "@fedify/fedify"; import { fedifyMiddleware } from "@fedify/astro"; @@ -849,7 +877,7 @@ export const onRequest = fedifyMiddleware( // [!code highlight] federation, // [!code highlight] (context) => void 0, // [!code highlight] ); // [!code highlight] -~~~~ +``` [Astro]: https://astro.build/ @@ -858,7 +886,7 @@ export const onRequest = fedifyMiddleware( // [!code highlight] If you are using Deno, you should import `@deno/vite-adapter` in _astro.config.ts_ and use it as the adapter: -~~~~ typescript +```typescript import { defineConfig } from "astro/config"; import { fedifyIntegration } from "@fedify/astro"; import deno from "@deno/astro-adapter"; @@ -868,12 +896,12 @@ export default defineConfig({ output: "server", adapter: deno(), }); -~~~~ +``` And the tasks in _deno.json_ should be updated to use `deno run npm:astro` instead of `astro`: -~~~~ json +```json { "tasks": { "dev": "deno run -A npm:astro dev", @@ -881,55 +909,53 @@ instead of `astro`: "preview": "deno run -A npm:astro preview" } } -~~~~ - +``` -SolidStart ----------- +## SolidStart -*This API is available since Fedify 2.2.0.* +_This API is available since Fedify 2.2.0._ [SolidStart] is a JavaScript framework built on top of [Solid] for building -full-stack web applications. The *@fedify/solidstart* package provides -a middleware to integrate Fedify with SolidStart: +full-stack web applications. The _@fedify/solidstart_ package provides a +middleware to integrate Fedify with SolidStart: ::: code-group -~~~~ sh [Deno] +```sh [Deno] deno add jsr:@fedify/solidstart -~~~~ +``` -~~~~ sh [npm] +```sh [npm] npm add @fedify/solidstart -~~~~ +``` -~~~~ sh [pnpm] +```sh [pnpm] pnpm add @fedify/solidstart -~~~~ +``` -~~~~ sh [Yarn] +```sh [Yarn] yarn add @fedify/solidstart -~~~~ +``` -~~~~ sh [Bun] +```sh [Bun] bun add @fedify/solidstart -~~~~ +``` ::: -First, set up the middleware entry point in your *app.config.ts*: +First, set up the middleware entry point in your _app.config.ts_: -~~~~ typescript +```typescript import { defineConfig } from "@solidjs/start/config"; export default defineConfig({ - middleware: "src/middleware/index.ts", // [!code highlight] + middleware: "src/middleware/index.ts", // [!code highlight] }); -~~~~ +``` -Then, create your middleware in *src/middleware/index.ts*: +Then, create your middleware in _src/middleware/index.ts_: -~~~~ typescript +```typescript import { createFederation } from "@fedify/fedify"; import { fedifyMiddleware } from "@fedify/solidstart"; @@ -937,26 +963,24 @@ const federation = createFederation({ // Omitted for brevity; see the related section for details. }); -export default fedifyMiddleware(federation, (event) => undefined); // [!code highlight] -~~~~ +export default fedifyMiddleware(federation, (event) => undefined); // [!code highlight] +``` [Solid]: https://www.solidjs.com/ +## Fresh -Fresh ------ - -*This API is available since Fedify 2.0.0.* +_This API is available since Fedify 2.0.0._ -[Fresh] is a full stack modern web framework for Deno. Fedify has the -`@fedify/fresh` module that provides a middleware to integrate Fedify -with Fresh. +[Fresh] is a full stack modern web framework for Deno. Fedify has the +`@fedify/fresh` module that provides a middleware to integrate Fedify with +Fresh. ::: code-group -~~~~ sh [Deno] +```sh [Deno] deno add jsr:@fedify/fresh -~~~~ +``` ::: @@ -964,15 +988,15 @@ deno add jsr:@fedify/fresh > The `@fedify/fresh` package only supports Fresh 2.x. > [!NOTE] -> Fresh 2 development mode has been verified with Deno 2.7.7. Deno 2.7.6 had -> an upstream Vite/esbuild regression that caused -> `Callback called multiple times` before Fedify code could run. +> Fresh 2 development mode has been verified with Deno 2.7.7. Deno 2.7.6 had an +> upstream Vite/esbuild regression that caused `Callback called multiple times` +> before Fedify code could run. > [!WARNING] > Due to `@fedify/fedify` use `Temporal` inside, you should add `deno.unstable` > to `compilerOptions.libs` field of `deno.json`. > -> ~~~~ json +> ```json > "compilerOptions": { > "lib": [ > "dom", @@ -982,11 +1006,11 @@ deno add jsr:@fedify/fresh > "deno.unstable" > ], > ... -> ~~~~ +> ``` -Put the following code in your *routes/\_middleware.ts* file: +Put the following code in your _routes/\_middleware.ts_ file: -~~~~ typescript [_middelware.ts] +```typescript [_middelware.ts] import { createFederation } from "@fedify/fedify"; import { integrateHandler } from "@fedify/fresh"; import { define } from "../utils.ts"; @@ -999,12 +1023,12 @@ const federation = createFederation({ export default define.middleware( integrateHandler(federation, () => undefined), ); -~~~~ +``` Or you can use `app.use()` in your `main.ts` to register the middleware globally: -~~~~ typescript [main.ts] +```typescript [main.ts] import { App } from "fresh"; import { createFederation } from "@fedify/fedify"; import { integrateHandler } from "@fedify/fresh"; @@ -1018,37 +1042,35 @@ const fedifyMiddleware = define.middleware( integrateHandler(federation, () => undefined), ); app.use(fedifyMiddleware); -~~~~ +``` [Fresh]: https://fresh.deno.dev/ - -Custom middleware ------------------ +## Custom middleware Even if you are using a web framework that is not officially supported by Fedify, you can still integrate Fedify with the framework by creating a custom middleware (unless the framework does not support middleware). Web frameworks usually provide a way to intercept incoming requests and outgoing -responses in the middle, which is so-called middleware. If your -web framework has a middleware feature, you can use it to intercept +responses in the middle, which is so-called middleware. If your web +framework has a middleware feature, you can use it to intercept federation-related requests and handle them with the `Federation` object. The key is to create a middleware that calls the `Federation.fetch()` method with the incoming request and context data, and then sends the response from -Fedify to the client. At this point, you can use `onNotFound` and +Fedify to the client. At this point, you can use `onNotFound` and `onNotAcceptable` callbacks to forward the request to the next middleware. The following is an example of a custom middleware for a hypothetical web framework: -~~~~ typescript +```typescript import { Federation } from "@fedify/fedify"; export type Middleware = ( request: Request, - next: (request: Request) => Promise + next: (request: Request) => Promise, ) => Promise; export function createFedifyMiddleware( @@ -1079,18 +1101,18 @@ export function createFedifyMiddleware( status: 406, headers: { "Content-Type": "text/plain", - Vary: "Accept" + Vary: "Accept", }, - }) - } + }); + }, }); }; } -~~~~ +``` -In some cases, your web framework may not represent requests and responses -as [`Request`] and [`Response`] objects. In that case, you need to convert -the request and response objects to the appropriate types that the `Federation` +In some cases, your web framework may not represent requests and responses as +[`Request`] and [`Response`] objects. In that case, you need to convert the +request and response objects to the appropriate types that the `Federation` object can handle. [`Request`]: https://developer.mozilla.org/en-US/docs/Web/API/Request diff --git a/examples/adonis/.gitignore b/examples/adonis/.gitignore new file mode 100644 index 000000000..3c3629e64 --- /dev/null +++ b/examples/adonis/.gitignore @@ -0,0 +1 @@ +node_modules diff --git a/examples/adonis/README.md b/examples/adonis/README.md new file mode 100644 index 000000000..d5c3528ec --- /dev/null +++ b/examples/adonis/README.md @@ -0,0 +1,39 @@ +# Fedify–AdonisJS integration example + +This is a simple example of how to integrate Fedify into an [AdonisJS] +application using the `@fedify/adonis` package. + +[AdonisJS]: https://adonisjs.com/ + +## Running the example + +1. Clone the repository: + + ```sh + git clone https://github.com/fedify-dev/fedify.git + cd fedify/examples/adonis + ``` + +2. Install dependencies: + + ```sh + pnpm install + ``` + +3. Start the server: + + ```sh + pnpm dev & pnpx @fedify/cli tunnel 3333 + ``` + +4. Open your browser tunneled URL and start interacting with the app. You can + see your handle such as `@demo@6c10b40c63d9e1ce7da55667ef0ef8b4.serveo.net`. + +5. Access and search your handle and follow. + +6. You can see following list like: + + ``` + This account has the below 1 followers: + https://activitypub.academy/users/beboes_bedoshs + ``` diff --git a/examples/adonis/package.json b/examples/adonis/package.json new file mode 100644 index 000000000..292787083 --- /dev/null +++ b/examples/adonis/package.json @@ -0,0 +1,23 @@ +{ + "name": "fedify-adonis-example", + "version": "0.0.1", + "private": true, + "type": "module", + "description": "Fedify AdonisJS integration example", + "scripts": { + "dev": "tsx src/main.ts", + "test": "true" + }, + "dependencies": { + "@adonisjs/core": ">=6.0.0", + "@fedify/adonis": "workspace:^", + "@fedify/fedify": "workspace:^", + "@fedify/vocab": "workspace:^", + "@logtape/logtape": "catalog:" + }, + "devDependencies": { + "@types/node": "^22.5.1", + "tsx": "^4.19.0", + "typescript": "^5.5.4" + } +} diff --git a/examples/adonis/src/app.ts b/examples/adonis/src/app.ts new file mode 100644 index 000000000..6589e62dd --- /dev/null +++ b/examples/adonis/src/app.ts @@ -0,0 +1,65 @@ +import { type AdonisHttpContext, fedifyMiddleware } from "@fedify/adonis"; +import { + createServer, + type IncomingMessage, + type ServerResponse, +} from "node:http"; +import process from "node:process"; +import federation, { relationStore } from "./federation.ts"; + +const FedifyMiddleware = fedifyMiddleware(federation, () => undefined); +const middleware = new FedifyMiddleware(); + +function createHttpContext( + req: IncomingMessage, + res: ServerResponse, +): AdonisHttpContext { + const host = req.headers.host ?? "localhost"; + return { + request: { + method: () => req.method ?? "GET", + protocol: () => "http", + hostname: () => host.split(":")[0], + url: () => req.url ?? "/", + headers: () => req.headers as Record, + request: req, + }, + response: { + response: res, + }, + }; +} + +export const server = createServer(async (req, res) => { + const ctx = createHttpContext(req, res); + await middleware.handle(ctx, async () => { + const host = req.headers.host ?? "localhost"; + res.writeHead(200, { "Content-Type": "text/plain" }); + res.end(`\ + _____ _ _ __ ____ +| ___|__ __| (_)/ _|_ _ | _ \\ ___ _ __ ___ ___ +| |_ / _ \\/ _\` | | |_| | | | | | | |/ _ \\ '_ \` _ \\ / _ \\ +| _| __/ (_| | | _| |_| | | |_| | __/ | | | | | (_) | +|_| \\___|\\__,_|_|_| \\__, | |____/ \\___|_| |_| |_|\\___/ + |___/ + +This small federated server app is a demo of Fedify with AdonisJS integration. +The only thing it does is to accept follow requests. + +You can follow this demo app via the below handle: + + @demo@${host} + +This account has the below ${relationStore.size} followers: + + ${Array.from(relationStore.values()).join("\n ")} +`); + }); +}); + +export default server; + +const PORT = process.env.PORT ?? 3333; +server.listen(PORT, () => { + console.log(`Server is running on http://localhost:${PORT}`); +}); diff --git a/examples/adonis/src/federation.ts b/examples/adonis/src/federation.ts new file mode 100644 index 000000000..8268f96aa --- /dev/null +++ b/examples/adonis/src/federation.ts @@ -0,0 +1,78 @@ +import { + createFederation, + generateCryptoKeyPair, + MemoryKvStore, +} from "@fedify/fedify"; +import { Accept, Endpoints, Follow, Person, Undo } from "@fedify/vocab"; + +export const keyPairsStore = new Map>(); +export const relationStore = new Map(); + +const federation = createFederation({ + kv: new MemoryKvStore(), +}); + +federation + .setActorDispatcher("/users/{identifier}", async (ctx, identifier) => { + if (identifier !== "demo") return null; + const keyPairs = await ctx.getActorKeyPairs(identifier); + return new Person({ + id: ctx.getActorUri(identifier), + name: "Fedify Demo", + summary: "This is a Fedify Demo account.", + preferredUsername: identifier, + url: new URL("/", ctx.url), + inbox: ctx.getInboxUri(identifier), + endpoints: new Endpoints({ sharedInbox: ctx.getInboxUri() }), + publicKey: keyPairs[0].cryptographicKey, + assertionMethods: keyPairs.map((kp) => kp.multikey), + }); + }) + .setKeyPairsDispatcher(async (_, identifier) => { + if (identifier !== "demo") return []; + const existing = keyPairsStore.get(identifier); + if (existing) return existing; + const { privateKey, publicKey } = await generateCryptoKeyPair(); + keyPairsStore.set(identifier, [{ privateKey, publicKey }]); + return [{ privateKey, publicKey }]; + }); + +federation + .setInboxListeners("/users/{identifier}/inbox", "/inbox") + .on(Follow, async (context, follow) => { + if ( + follow.id == null || + follow.actorId == null || + follow.objectId == null + ) { + return; + } + const result = context.parseUri(follow.objectId); + if (result?.type !== "actor" || result.identifier !== "demo") return; + const follower = await follow.getActor(context); + if (follower?.id == null) throw new Error("follower is null"); + await context.sendActivity( + { identifier: result.identifier }, + follower, + new Accept({ + id: new URL( + `#accepts/${follower.id.href}`, + context.getActorUri("demo"), + ), + actor: follow.objectId, + object: follow, + }), + ); + relationStore.set(follower.id.href, follow.objectId.href); + }) + .on(Undo, async (context, undo) => { + const activity = await undo.getObject(context); + if (activity instanceof Follow) { + if (activity.id == null || undo.actorId == null) return; + relationStore.delete(undo.actorId.href); + } else { + console.debug(undo); + } + }); + +export default federation; diff --git a/examples/adonis/src/logging.ts b/examples/adonis/src/logging.ts new file mode 100644 index 000000000..baa379766 --- /dev/null +++ b/examples/adonis/src/logging.ts @@ -0,0 +1,20 @@ +import { configure, getConsoleSink } from "@logtape/logtape"; + +await configure({ + sinks: { console: getConsoleSink() }, + filters: {}, + loggers: [ + { + category: "fedify", + lowestLevel: "debug", + sinks: ["console"], + filters: [], + }, + { + category: ["logtape", "meta"], + lowestLevel: "warning", + sinks: ["console"], + filters: [], + }, + ], +}); diff --git a/examples/adonis/src/main.ts b/examples/adonis/src/main.ts new file mode 100644 index 000000000..0306a0afa --- /dev/null +++ b/examples/adonis/src/main.ts @@ -0,0 +1,2 @@ +import "./app.ts"; +import "./logging.ts"; diff --git a/examples/adonis/tsconfig.json b/examples/adonis/tsconfig.json new file mode 100644 index 000000000..00da9edd4 --- /dev/null +++ b/examples/adonis/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "target": "ESNext", + "module": "ESNext", + "moduleDetection": "force", + "allowJs": true, + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "noEmit": true, + "strict": true, + "skipLibCheck": true, + "noFallthroughCasesInSwitch": true, + "noUnusedLocals": false, + "noUnusedParameters": false, + "noPropertyAccessFromIndexSignature": false + } +} diff --git a/examples/test-examples/mod.ts b/examples/test-examples/mod.ts index d83dac360..6963257f5 100644 --- a/examples/test-examples/mod.ts +++ b/examples/test-examples/mod.ts @@ -147,6 +147,16 @@ type TestResult = // accepts. const SERVER_EXAMPLES: ServerExample[] = [ + { + // AdonisJS server with @fedify/adonis middleware; + // actor path is /users/{identifier}. + name: "adonis", + dir: "adonis", + startCmd: ["pnpm", "dev"], + port: 3333, + actor: "demo", + readyUrl: "http://localhost:3333/", + }, { // Deno-native Hono server; actor path is /{identifier} but only "sample" // is registered. diff --git a/packages/adonis/README.md b/packages/adonis/README.md new file mode 100644 index 000000000..69261365d --- /dev/null +++ b/packages/adonis/README.md @@ -0,0 +1,80 @@ + + +@fedify/adonis: Integrate Fedify with AdonisJS +=============================================== + +[![JSR][JSR badge]][JSR] +[![npm][npm badge]][npm] +[![Matrix][Matrix badge]][Matrix] +[![Follow @fedify@hollo.social][@fedify@hollo.social badge]][@fedify@hollo.social] + +This package provides a simple way to integrate [Fedify] with [AdonisJS] +(v6 and v7). + +[JSR badge]: https://jsr.io/badges/@fedify/adonis +[JSR]: https://jsr.io/@fedify/adonis +[npm badge]: https://img.shields.io/npm/v/@fedify/adonis?logo=npm +[npm]: https://www.npmjs.com/package/@fedify/adonis +[Matrix badge]: https://img.shields.io/matrix/fedify%3Amatrix.org +[Matrix]: https://matrix.to/#/#fedify:matrix.org +[@fedify@hollo.social badge]: https://fedi-badge.deno.dev/@fedify@hollo.social/followers.svg +[@fedify@hollo.social]: https://hollo.social/@fedify +[Fedify]: https://fedify.dev/ +[AdonisJS]: https://adonisjs.com/ + + +Installation +------------ + +~~~~ bash +npm add @fedify/adonis +# or +pnpm add @fedify/adonis +# or +yarn add @fedify/adonis +# or +bun add @fedify/adonis +~~~~ + + +Usage +----- + +First, create your `Federation` instance in a service file, +e.g., *app/services/federation.ts*: + +~~~~ typescript +import { createFederation, MemoryKvStore } from "@fedify/fedify"; + +const federation = createFederation({ + kv: new MemoryKvStore(), +}); + +// ... configure your federation ... + +export default federation; +~~~~ + +Then, create a middleware file, e.g., *app/middleware/fedify_middleware.ts*: + +~~~~ typescript +import { fedifyMiddleware } from "@fedify/adonis"; +import federation from "#services/federation"; + +export default fedifyMiddleware(federation); +~~~~ + +Finally, register it as a server middleware in *start/kernel.ts*: + +~~~~ typescript +import server from "@adonisjs/core/services/server"; + +server.use([ + () => import("#middleware/fedify_middleware"), + // ... other middleware +]); +~~~~ + +The middleware intercepts incoming requests and delegates federation traffic +(ActivityPub, WebFinger, etc.) to Fedify. All other requests pass through +to your AdonisJS routes. diff --git a/packages/adonis/deno.json b/packages/adonis/deno.json new file mode 100644 index 000000000..51e73837a --- /dev/null +++ b/packages/adonis/deno.json @@ -0,0 +1,21 @@ +{ + "name": "@fedify/adonis", + "version": "2.2.0", + "license": "MIT", + "exports": { + ".": "./src/mod.ts" + }, + "exclude": [ + "dist", + "node_modules" + ], + "publish": { + "exclude": [ + "**/*.test.ts", + "tsdown.config.ts" + ] + }, + "tasks": { + "check": "deno fmt --check && deno lint && deno check src/*.ts" + } +} diff --git a/packages/adonis/package.json b/packages/adonis/package.json new file mode 100644 index 000000000..09cd5533e --- /dev/null +++ b/packages/adonis/package.json @@ -0,0 +1,66 @@ +{ + "name": "@fedify/adonis", + "version": "2.2.0", + "description": "Integrate Fedify with AdonisJS", + "keywords": [ + "Fedify", + "ActivityPub", + "Fediverse", + "AdonisJS" + ], + "author": { + "name": "Hong Minhee", + "email": "hong@minhee.org", + "url": "https://hongminhee.org/" + }, + "homepage": "https://fedify.dev/", + "repository": { + "type": "git", + "url": "git+https://github.com/fedify-dev/fedify.git", + "directory": "packages/adonis" + }, + "license": "MIT", + "bugs": { + "url": "https://github.com/fedify-dev/fedify/issues" + }, + "funding": [ + "https://opencollective.com/fedify", + "https://github.com/sponsors/dahlia" + ], + "type": "module", + "main": "./dist/mod.cjs", + "module": "./dist/mod.js", + "types": "./dist/mod.d.ts", + "exports": { + ".": { + "types": { + "import": "./dist/mod.d.ts", + "require": "./dist/mod.d.cts", + "default": "./dist/mod.d.ts" + }, + "import": "./dist/mod.js", + "require": "./dist/mod.cjs", + "default": "./dist/mod.js" + }, + "./package.json": "./package.json" + }, + "files": [ + "dist/", + "package.json" + ], + "peerDependencies": { + "@fedify/fedify": "workspace:^", + "@adonisjs/core": ">=6.0.0" + }, + "devDependencies": { + "@types/node": "catalog:", + "tsdown": "catalog:", + "typescript": "catalog:" + }, + "scripts": { + "build:self": "tsdown", + "build": "pnpm --filter @fedify/adonis... run build:self", + "prepack": "pnpm build", + "prepublish": "pnpm build" + } +} diff --git a/packages/adonis/src/mod.ts b/packages/adonis/src/mod.ts new file mode 100644 index 000000000..7c54818ff --- /dev/null +++ b/packages/adonis/src/mod.ts @@ -0,0 +1,191 @@ +/** + * Fedify with AdonisJS + * ==================== + * + * This package provides an [AdonisJS] middleware to integrate with Fedify. + * + * [AdonisJS]: https://adonisjs.com/ + * + * @module + */ +import type { Federation } from "@fedify/fedify/federation"; +import { Buffer } from "node:buffer"; +import type { IncomingMessage, ServerResponse } from "node:http"; +import { Readable } from "node:stream"; + +/** + * Minimal interface for the AdonisJS request object. + * Compatible with both AdonisJS v6 and v7. + */ +interface AdonisRequest { + method(): string; + protocol(): string; + hostname(): string | null; + url(): string; + headers(): Record; + request: IncomingMessage; +} + +/** + * Minimal interface for the AdonisJS response object. + * Compatible with both AdonisJS v6 and v7. + */ +interface AdonisResponse { + response: ServerResponse; +} + +/** + * Minimal interface for the AdonisJS HTTP context. + * Compatible with both AdonisJS v6 and v7. + */ +export interface AdonisHttpContext { + request: AdonisRequest; + response: AdonisResponse; +} + +/** + * A factory function to create context data for the {@link Federation} object. + * + * @template TContextData A type of the context data for the {@link Federation} + * object. + * @param ctx An AdonisJS HTTP context object. + * @returns A context data for the {@link Federation} object. + */ +export type ContextDataFactory = ( + ctx: AdonisHttpContext, +) => TContextData | Promise; + +/** + * The interface that the middleware class returned by + * {@link fedifyMiddleware} implements. + */ +export interface FedifyMiddlewareHandler { + handle(ctx: AdonisHttpContext, next: () => Promise): Promise; +} + +/** + * Create an AdonisJS middleware class to integrate with the + * {@link Federation} object. + * + * The returned class can be used as an AdonisJS server middleware: + * + * ```typescript + * // app/middleware/fedify_middleware.ts + * import { fedifyMiddleware } from "@fedify/adonis"; + * import federation from "#services/federation"; + * + * export default fedifyMiddleware(federation); + * ``` + * + * Then register it in `start/kernel.ts`: + * + * ```typescript + * server.use([ + * () => import("#middleware/fedify_middleware"), + * // ... other middleware + * ]); + * ``` + * + * @template TContextData A type of the context data for the {@link Federation} + * object. + * @param federation A {@link Federation} object to integrate with AdonisJS. + * @param contextDataFactory A function to create context data for the + * {@link Federation} object. + * @returns An AdonisJS middleware class. + */ +export function fedifyMiddleware( + federation: Federation, + contextDataFactory: ContextDataFactory = () => + void 0 as TContextData, +): { new (): FedifyMiddlewareHandler } { + return class FedifyMiddleware implements FedifyMiddlewareHandler { + async handle( + ctx: AdonisHttpContext, + next: () => Promise, + ): Promise { + const request = fromAdonisRequest(ctx); + let contextData = contextDataFactory(ctx); + if (contextData instanceof Promise) contextData = await contextData; + + let notFound = false; + let notAcceptable = false; + + const response = await federation.fetch(request, { + contextData, + onNotFound: async () => { + notFound = true; + await next(); + return new Response("Not found", { status: 404 }); + }, + onNotAcceptable: async () => { + notAcceptable = true; + await next(); + return new Response("Not acceptable", { + status: 406, + headers: { + "Content-Type": "text/plain", + Vary: "Accept", + }, + }); + }, + }); + + if (notFound || notAcceptable) return; + await writeResponse(ctx, response); + } + }; +} + +export default fedifyMiddleware; + +function fromAdonisRequest(ctx: AdonisHttpContext): Request { + const allHeaders = ctx.request.headers(); + const host = allHeaders["host"] ?? ctx.request.hostname() ?? "localhost"; + const url = `${ctx.request.protocol()}://${host}${ctx.request.url()}`; + const headers = new Headers(); + for (const [key, value] of Object.entries(allHeaders)) { + if (value == null) continue; + if (Array.isArray(value)) { + for (const v of value) headers.append(key, v); + } else { + headers.append(key, value); + } + } + const method = ctx.request.method(); + return new Request(url, { + method, + headers, + // @ts-ignore: duplex is not supported in Deno, but it is in Node.js + duplex: "half", + body: method === "GET" || method === "HEAD" + ? undefined + : Readable.toWeb(ctx.request.request as unknown as Readable), + }); +} + +async function writeResponse( + ctx: AdonisHttpContext, + response: Response, +): Promise { + const nodeRes = ctx.response.response; + nodeRes.statusCode = response.status; + response.headers.forEach((value, key) => nodeRes.setHeader(key, value)); + if (response.body == null) { + nodeRes.end(); + return; + } + const body = response.body; + const reader = body.getReader(); + return new Promise((resolve) => { + reader.read().then(function read({ done, value }) { + if (done) { + reader.releaseLock(); + nodeRes.end(); + resolve(); + return; + } + nodeRes.write(Buffer.from(value)); + reader.read().then(read); + }); + }); +} diff --git a/packages/adonis/tsdown.config.ts b/packages/adonis/tsdown.config.ts new file mode 100644 index 000000000..0ed4ae9fd --- /dev/null +++ b/packages/adonis/tsdown.config.ts @@ -0,0 +1,14 @@ +import { defineConfig } from "tsdown"; + +export default defineConfig({ + entry: ["src/mod.ts"], + dts: { compilerOptions: { isolatedDeclarations: true, declaration: true } }, + format: ["esm", "cjs"], + platform: "node", + outExtensions({ format }) { + return { + js: format === "cjs" ? ".cjs" : ".js", + dts: format === "cjs" ? ".d.cts" : ".d.ts", + }; + }, +}); diff --git a/packages/fedify/README.md b/packages/fedify/README.md index 53a2d3918..5193e6c17 100644 --- a/packages/fedify/README.md +++ b/packages/fedify/README.md @@ -96,6 +96,7 @@ Here is the list of packages: | [@fedify/fedify](/packages/fedify/) | [JSR] | [npm] | The core framework of Fedify | | [@fedify/cli](/packages/cli/) | [JSR][jsr:@fedify/cli] | [npm][npm:@fedify/cli] | CLI toolchain for testing and debugging | | [@fedify/create](/packages/create/) | | [npm][npm:@fedify/create] | Create a new Fedify project | +| [@fedify/adonis](/packages/adonis/) | [JSR][jsr:@fedify/adonis] | [npm][npm:@fedify/adonis] | AdonisJS integration | | [@fedify/amqp](/packages/amqp/) | [JSR][jsr:@fedify/amqp] | [npm][npm:@fedify/amqp] | AMQP/RabbitMQ driver | | [@fedify/astro](/packages/astro/) | [JSR][jsr:@fedify/astro] | [npm][npm:@fedify/astro] | Astro integration | | [@fedify/cfworkers](/packages/cfworkers/) | [JSR][jsr:@fedify/cfworkers] | [npm][npm:@fedify/cfworkers] | Cloudflare Workers integration | @@ -128,6 +129,8 @@ Here is the list of packages: [jsr:@fedify/cli]: https://jsr.io/@fedify/cli [npm:@fedify/cli]: https://www.npmjs.com/package/@fedify/cli [npm:@fedify/create]: https://www.npmjs.com/package/@fedify/create +[jsr:@fedify/adonis]: https://jsr.io/@fedify/adonis +[npm:@fedify/adonis]: https://www.npmjs.com/package/@fedify/adonis [jsr:@fedify/amqp]: https://jsr.io/@fedify/amqp [npm:@fedify/amqp]: https://www.npmjs.com/package/@fedify/amqp [jsr:@fedify/astro]: https://jsr.io/@fedify/astro diff --git a/packages/init/src/const.ts b/packages/init/src/const.ts index 363922a78..fdd0b12df 100644 --- a/packages/init/src/const.ts +++ b/packages/init/src/const.ts @@ -14,6 +14,7 @@ export const WEB_FRAMEWORK = [ "astro", "express", "solidstart", + "adonis", ] as const; /** All supported message queue backend identifiers. */ export const MESSAGE_QUEUE = Object.keys(mq) as readonly (keyof typeof mq)[]; diff --git a/packages/init/src/json/deps.json b/packages/init/src/json/deps.json index 414ded649..19cda7ab4 100644 --- a/packages/init/src/json/deps.json +++ b/packages/init/src/json/deps.json @@ -1,4 +1,5 @@ { + "npm:@adonisjs/core": "^7.3.0", "@hongminhee/x-forwarded-fetch": "^0.2.0", "@hono/hono": "^4.12.9", "@logtape/logtape": "^2.0.5", diff --git a/packages/init/src/templates/adonis/app.ts.tpl b/packages/init/src/templates/adonis/app.ts.tpl new file mode 100644 index 000000000..a66934992 --- /dev/null +++ b/packages/init/src/templates/adonis/app.ts.tpl @@ -0,0 +1,46 @@ +import { + createServer, + type IncomingMessage, + type ServerResponse, +} from "node:http"; +import { + fedifyMiddleware, + type AdonisHttpContext, +} from "@fedify/adonis"; +import { getLogger } from "@logtape/logtape"; +import federation from "./federation.ts"; + +const logger = getLogger("/* logger */"); + +const FedifyMiddleware = fedifyMiddleware(federation, () => undefined); +const middleware = new FedifyMiddleware(); + +function createHttpContext( + req: IncomingMessage, + res: ServerResponse, +): AdonisHttpContext { + const host = req.headers.host ?? "localhost"; + return { + request: { + method: () => req.method ?? "GET", + protocol: () => "http", + hostname: () => host.split(":")[0], + url: () => req.url ?? "/", + headers: () => req.headers as Record, + request: req, + }, + response: { + response: res, + }, + }; +} + +export const server = createServer(async (req, res) => { + const ctx = createHttpContext(req, res); + await middleware.handle(ctx, async () => { + res.writeHead(200, { "Content-Type": "text/plain" }); + res.end("Hello, Fedify!"); + }); +}); + +export default server; diff --git a/packages/init/src/templates/adonis/index.ts.tpl b/packages/init/src/templates/adonis/index.ts.tpl new file mode 100644 index 000000000..f721bcab5 --- /dev/null +++ b/packages/init/src/templates/adonis/index.ts.tpl @@ -0,0 +1,6 @@ +import server from "./app.ts"; +import "./logging.ts"; + +server.listen(3333, () => { + console.log("Server started at http://localhost:3333"); +}); diff --git a/packages/init/src/test/port.ts b/packages/init/src/test/port.ts index ef63da9f8..67681cecd 100644 --- a/packages/init/src/test/port.ts +++ b/packages/init/src/test/port.ts @@ -94,6 +94,7 @@ export function reservePort(): Promise< } const ENTRY_FILES: Partial> = { + adonis: "src/index.ts", "bare-bones": "src/main.ts", express: "src/index.ts", hono: "src/index.ts", diff --git a/packages/init/src/webframeworks/adonis.ts b/packages/init/src/webframeworks/adonis.ts new file mode 100644 index 000000000..ea5f55c65 --- /dev/null +++ b/packages/init/src/webframeworks/adonis.ts @@ -0,0 +1,65 @@ +import deps from "../json/deps.json" with { type: "json" }; +import { PACKAGE_VERSION, readTemplate } from "../lib.ts"; +import type { WebFrameworkDescription } from "../types.ts"; +import { defaultDevDependencies } from "./const.ts"; +import { getInstruction, pmToRt } from "./utils.ts"; + +const adonisDescription: WebFrameworkDescription = { + label: "AdonisJS", + packageManagers: ["pnpm", "bun", "yarn", "npm"], + defaultPort: 3333, + init: async ({ projectName, packageManager: pm }) => ({ + dependencies: { + "@adonisjs/core": deps["npm:@adonisjs/core"], + "@fedify/adonis": PACKAGE_VERSION, + ...(pmToRt(pm) === "node" && { + "@dotenvx/dotenvx": deps["npm:@dotenvx/dotenvx"], + tsx: deps["npm:tsx"], + }), + }, + devDependencies: { + ...(pm === "bun" + ? { "@types/bun": deps["npm:@types/bun"] } + : { "@types/node": deps["npm:@types/node@22"] }), + ...defaultDevDependencies, + }, + federationFile: "src/federation.ts", + loggingFile: "src/logging.ts", + files: { + "src/app.ts": (await readTemplate("adonis/app.ts")) + .replace(/\/\* logger \*\//, projectName), + "src/index.ts": await readTemplate("adonis/index.ts"), + "eslint.config.ts": await readTemplate("defaults/eslint.config.ts"), + }, + compilerOptions: { + "lib": ["ESNext"], + "target": "ESNext", + "module": "NodeNext", + "moduleResolution": "NodeNext", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "noEmit": true, + "strict": true, + }, + tasks: TASKS[pmToRt(pm)], + instruction: getInstruction(pm, 3333), + }), +}; + +export default adonisDescription; + +const TASKS: Record<"deno" | "bun" | "node", Record> = { + deno: { + dev: "deno run -A --watch ./src/index.ts", + }, + bun: { + dev: "bun run --hot ./src/index.ts", + prod: "bun run ./src/index.ts", + lint: "eslint .", + }, + node: { + dev: "dotenvx run -- tsx watch ./src/index.ts", + prod: "dotenvx run -- node --import tsx ./src/index.ts", + lint: "eslint .", + }, +}; diff --git a/packages/init/src/webframeworks/mod.ts b/packages/init/src/webframeworks/mod.ts index f5baa6855..f9b44d734 100644 --- a/packages/init/src/webframeworks/mod.ts +++ b/packages/init/src/webframeworks/mod.ts @@ -1,4 +1,5 @@ import type { WebFrameworks } from "../types.ts"; +import adonis from "./adonis.ts"; import astro from "./astro.ts"; import bareBones from "./bare-bones.ts"; import elysia from "./elysia.ts"; @@ -17,6 +18,7 @@ import solidstart from "./solidstart.ts"; */ const webFrameworks: WebFrameworks = { "bare-bones": bareBones, + adonis, astro, elysia, express, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 53107c1d5..0e28ba6d6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -356,6 +356,34 @@ importers: specifier: ^0.2.0 version: 0.2.0 + examples/adonis: + dependencies: + '@adonisjs/core': + specifier: '>=6.0.0' + version: 7.3.0(youch@4.1.0) + '@fedify/adonis': + specifier: workspace:^ + version: link:../../packages/adonis + '@fedify/fedify': + specifier: workspace:^ + version: link:../../packages/fedify + '@fedify/vocab': + specifier: workspace:^ + version: link:../../packages/vocab + '@logtape/logtape': + specifier: 'catalog:' + version: 2.0.5 + devDependencies: + '@types/node': + specifier: ^22.5.1 + version: 22.19.1 + tsx: + specifier: ^4.19.0 + version: 4.20.3 + typescript: + specifier: ^5.5.4 + version: 5.9.3 + examples/astro: dependencies: '@astrojs/node': @@ -409,7 +437,7 @@ importers: version: link:../../packages/vocab elysia: specifier: 'catalog:' - version: 1.3.8(exact-mirror@0.1.3(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.9.3) + version: 1.3.8(exact-mirror@0.1.3(@sinclair/typebox@0.34.38))(file-type@21.3.4)(typescript@5.9.3) devDependencies: bun-types: specifier: ^1.2.19 @@ -750,6 +778,25 @@ importers: specifier: ^7.0.4 version: 7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1) + packages/adonis: + dependencies: + '@adonisjs/core': + specifier: '>=6.0.0' + version: 7.3.0(youch@4.1.0) + '@fedify/fedify': + specifier: workspace:^ + version: link:../fedify + devDependencies: + '@types/node': + specifier: 'catalog:' + version: 22.19.1 + tsdown: + specifier: 'catalog:' + version: 0.21.7(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5)(typescript@5.9.3) + typescript: + specifier: 'catalog:' + version: 5.9.3 + packages/amqp: dependencies: '@fedify/fedify': @@ -1018,7 +1065,7 @@ importers: version: link:../fedify elysia: specifier: ^1.3.6 - version: 1.3.8(exact-mirror@0.1.3(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.9.3) + version: 1.3.8(exact-mirror@0.1.3(@sinclair/typebox@0.34.38))(file-type@21.3.4)(typescript@5.9.3) devDependencies: bun-types: specifier: ^1.2.19 @@ -1718,6 +1765,125 @@ importers: packages: + '@adonisjs/ace@14.1.0': + resolution: {integrity: sha512-8N8z1YKePBiXz7wLxHFz/HSqjCRSL/9Vzs4XQt8gk8G17u4PXwNncWt0vSgYEcDrvPAt+QOavY1vMeKOOWe29w==} + engines: {node: '>=24.0.0'} + peerDependencies: + youch: ^4.1.0-beta.11 || ^4.1.0 + + '@adonisjs/application@9.0.0': + resolution: {integrity: sha512-iQpq/JRJsnrqOMHfu72CYjmlkH5FwT28DhUKEOjktccmFh8OLdVZ2Sieb8b2/qNv4c+w8Yo7keOGEzOYUrU+kA==} + engines: {node: '>=24.0.0'} + peerDependencies: + '@adonisjs/assembler': ^8.0.0-next.23 || ^8.0.0 + '@adonisjs/config': ^6.1.0-next.0 || ^6.0.0 + '@adonisjs/fold': ^11.0.0-next.3 || ^11.0.0 + peerDependenciesMeta: + '@adonisjs/assembler': + optional: true + + '@adonisjs/bodyparser@11.0.1': + resolution: {integrity: sha512-RUpkRRSvCSMLmVJcYUyaAwC9Z1tWlThBvVGiIU5bkWwwe5CcbG2f9sifzod04B+hcgJ4xWSs+FF/WNdbwWFwhQ==} + engines: {node: '>=24.0.0'} + peerDependencies: + '@adonisjs/http-server': ^8.0.0-next.17 || ^8.0.0 + + '@adonisjs/config@6.1.0': + resolution: {integrity: sha512-YVDRL8xHCtM6iMnAefOBaz6iXVpojwBPDQWPKxnVSucycYeNGrGitJiLy+cGaeAU7Gjm8al9SJRJt3rRPr5PKg==} + engines: {node: '>=24.0.0'} + + '@adonisjs/core@7.3.0': + resolution: {integrity: sha512-HtjnYq7JhmLggXXSjude4mJyDmgHcFu51FO/k0e1sf5o0UeMQGPc+9iK6GFAorFXBNv/2uKIEKSM0vi53gwaXQ==} + engines: {node: '>=24.0.0'} + hasBin: true + peerDependencies: + '@adonisjs/assembler': ^8.0.0-next.23 || ^8.0.0 + '@vinejs/vine': ^4.0.0 + argon2: ^0.44.0 + bcrypt: ^6.0.0 + edge.js: ^6.2.0 + pino-pretty: ^13.1.3 + youch: ^4.1.0-beta.13 || ^4.1.0 + peerDependenciesMeta: + '@adonisjs/assembler': + optional: true + '@vinejs/vine': + optional: true + argon2: + optional: true + bcrypt: + optional: true + edge.js: + optional: true + pino-pretty: + optional: true + youch: + optional: true + + '@adonisjs/env@7.0.0': + resolution: {integrity: sha512-9lSGONI4B1E7LxyVZiUd1yCH9BOri4Ybp4b9x3ojT9AkKfYwqvj4S2USIvFAlkE7eHUC2WMvPgMLX17342Y3ww==} + engines: {node: '>=24.0.0'} + + '@adonisjs/events@10.2.0': + resolution: {integrity: sha512-SzwzbmTLsybSZd47zZMZ3df7puwhY7D8vZ5Uy79SiHjLKbr2eVzUuKjjoYB6/0pZu6IwK9Qx06dI43sl+tLoDw==} + engines: {node: '>=24.0.0'} + peerDependencies: + '@adonisjs/application': ^9.0.0-next.14 || ^9.0.0 + '@adonisjs/fold': ^11.0.0-next.4 || ^11.0.0 + + '@adonisjs/fold@11.0.0': + resolution: {integrity: sha512-RnmDPWz2imVp/B74xitxCPqTdoP07bZvfJe1bh9CD9Rmia4jjDvehZF67KFyGNMZ24MuKasqs3jOcM1vGJp0GA==} + engines: {node: '>=24.0.0'} + + '@adonisjs/hash@10.1.0': + resolution: {integrity: sha512-lW0lGwpscu9PUo3Sb3PF580jYU29I9wsPn3dIKzZbTVedqkpaNpBK3YKedwZYkDpYmiyYXi08eTTNhdWjiGLQw==} + engines: {node: '>=20.6.0'} + peerDependencies: + argon2: ^0.31.2 || ^0.41.0 || ^0.43.0 || ^0.44.0 + bcrypt: ^5.1.1 || ^6.0.0 + peerDependenciesMeta: + argon2: + optional: true + bcrypt: + optional: true + + '@adonisjs/health@3.1.0': + resolution: {integrity: sha512-m3doBnSwi/l9v1DO79xmjAoSPl9b2XCp+crGwF8QUlhe5CgWgtfnL0SeFNEiZGliD3c4gYdihKz4Pnydctva8A==} + engines: {node: '>=24.0.0'} + + '@adonisjs/http-server@8.1.2': + resolution: {integrity: sha512-dALp+CC86pMWB9yrEi9FPCm8IS/G3TqpdARNgWa5z+UqVM8zDjMmGb0DcQlQopwxD1xgBGJSrWH+2cJ+YEcEOw==} + engines: {node: '>=24.0.0'} + peerDependencies: + '@adonisjs/application': ^9.0.0-next.14 || ^9.0.0 + '@adonisjs/events': ^10.1.0-next.4 || ^10.1.0 + '@adonisjs/fold': ^11.0.0-next.4 || ^11.0.0 + '@adonisjs/logger': ^7.1.0-next.3 || ^7.1.0 + '@boringnode/encryption': ^0.2.0 || ^1.0.0 + youch: ^4.1.0-beta.13 || ^4.1.0 + peerDependenciesMeta: + youch: + optional: true + + '@adonisjs/http-transformers@2.3.1': + resolution: {integrity: sha512-N3gBcKyoPHDeVvVIedTzc+ARSUURwNGTPid/e3iLdM4v/myoSnXd76FL/GGzMmjfqqxegpjI2IEMibG7ylrKSQ==} + engines: {node: '>=24.0.0'} + peerDependencies: + '@adonisjs/fold': ^11.0.0-next.2 + + '@adonisjs/logger@7.1.1': + resolution: {integrity: sha512-MmUlp8xBMT6zZy0+vnQcQjHIlNfU4pUJARlINr7Bqha9BvhIn03QZgJL5QJ+kJe1tl6ZpNAryoRTJUiOk/wINQ==} + engines: {node: '>=24.0.0'} + peerDependencies: + pino-pretty: ^13.1.1 + peerDependenciesMeta: + pino-pretty: + optional: true + + '@adonisjs/repl@5.0.0': + resolution: {integrity: sha512-cPp0w5svYUA3M1gdxQBO2Mx5g+SZfPweqKCAxk7C1Os/Qu67JKgWqXqNnl1q0Tzv/l0L19Ms1C7ivzQxeBNajg==} + engines: {node: '>=24.0.0'} + '@algolia/autocomplete-core@1.17.7': resolution: {integrity: sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q==} @@ -1807,6 +1973,10 @@ packages: '@antfu/utils@8.1.1': resolution: {integrity: sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==} + '@arr/every@1.0.1': + resolution: {integrity: sha512-UQFQ6SgyJ6LX42W8rHCs8KVc0JS0tzVL9ct4XYedJukskYVWTo49tNiMEK9C2HTyarbNiT/RVIRSY82vH+6sTg==} + engines: {node: '>=4'} + '@astrojs/compiler@2.13.1': resolution: {integrity: sha512-f3FN83d2G/v32ipNClRKgYv30onQlMZX1vCeZMjPsMMPl1mDpmbl0+N5BYo4S/ofzqJyS5hvwacEo0CCVDn/Qg==} @@ -1944,6 +2114,13 @@ packages: resolution: {integrity: sha512-mOm5ZrYmphGfqVWoH5YYMTITb3cDXsFgmvFlvkvWDMsR9X8RFnt7a0Wb6yNIdoFsiMO9WjYLq+U/FMtqIYAF8Q==} engines: {node: ^20.19.0 || >=22.12.0} + '@borewit/text-codec@0.2.2': + resolution: {integrity: sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ==} + + '@boringnode/encryption@1.0.0': + resolution: {integrity: sha512-wGGOE7ywA4W6KAVoVC7s1P4ULzFLIQA/JvthGAa41EA0CaH7kGGawkBB5t5tvWopgBNMhOpIg3uxvULxqf2rQw==} + engines: {node: '>=20.6'} + '@braintree/sanitize-url@6.0.4': resolution: {integrity: sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==} @@ -4218,6 +4395,13 @@ packages: resolution: {integrity: sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==} engines: {node: '>= 10.0.0'} + '@phc/format@1.0.0': + resolution: {integrity: sha512-m7X9U6BG2+J+R1lSOdCiITLLrxm+cWlNI3HUFA92oLO77ObGNzaKdh8pMLqdZcshtkKuV84olNNXDfMc4FezBQ==} + engines: {node: '>=10'} + + '@pinojs/redact@0.4.0': + resolution: {integrity: sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -4228,6 +4412,9 @@ packages: '@poppanator/http-constants@1.1.1': resolution: {integrity: sha512-TPPmQ2OsZDsQZqU80XEEO47E3zex/s1x4DYPoD0AXreW1SUqGvJQY71GTa2AiI0PE2OF2lHf18TGAVOck0Ic0w==} + '@poppinss/cliui@6.8.1': + resolution: {integrity: sha512-o/ssbwr+r6woG65rk9eFHnn9dVUphZr/Rk+4+05ENVMBWYpYhTJGdE9RobTG5JLFubvO4gWIyFeNlC+I4EM6eA==} + '@poppinss/colors@4.1.6': resolution: {integrity: sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg==} @@ -4240,6 +4427,44 @@ packages: '@poppinss/exception@1.2.3': resolution: {integrity: sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==} + '@poppinss/hooks@7.3.0': + resolution: {integrity: sha512-/H35z/bWqHg7085QOxWUDYMidx6Kl6b8kIyzIXlRYzWvsk1xm9hQOlXWdWEYch+Gmn8eL7tThx59MBj8BLxDrQ==} + + '@poppinss/macroable@1.1.2': + resolution: {integrity: sha512-FAVBRzzWhYP5mA3lCwLH1A0fKBqq5anyjGet90Z81aRK5c/+LTGUE1zJhZrErjaenBSOOI9BVUs3WVmotneFQA==} + + '@poppinss/matchit@3.2.0': + resolution: {integrity: sha512-9SoMICN+LMO7ZtMj2ja8N7RHlC4mmuv5WwIBXWjabMd2SyXE1dIydh29exlgm+dGMP84PjwvfJH1TmWL4qz1og==} + + '@poppinss/middleware@3.2.7': + resolution: {integrity: sha512-MZC0Z97ozSz+PpfyxUPUy/ImuthpqvBbY7qku7f4Q2maHz+2uXfchfO8OggXLS6zEJ078l+jpAHZ2rDIRdjeVg==} + + '@poppinss/multiparty@3.0.0': + resolution: {integrity: sha512-z9jchUzsv7E+7sa4tWHb0+95Byx7w0ydlPGxg3nzyb7h3QlRdeW8/QkU9SexUY4lsT12do93AfNBAhSuOoVqjA==} + + '@poppinss/object-builder@1.1.0': + resolution: {integrity: sha512-FOrOq52l7u8goR5yncX14+k+Ewi5djnrt1JwXeS/FvnwAPOiveFhiczCDuvXdssAwamtrV2hp5Rw9v+n2T7hQg==} + engines: {node: '>=20.6.0'} + + '@poppinss/prompts@3.1.6': + resolution: {integrity: sha512-cKHfkID6b3wl1kbHJJRC/pznQ3KnRVydyk7CE38NfTV3VS45BDYCxeZZ7bfDin71qMzITh18lKnu8iuLxBngHA==} + + '@poppinss/qs@6.15.0': + resolution: {integrity: sha512-QzfMhxrRB5EPeGz0l8hTwKZ5dFX6ed0aETGbuD369StCO8Ad3SW4wWBYamOK5IKeM/dfOeKaCwUZPTnGcj+jKg==} + engines: {node: '>=0.6'} + + '@poppinss/string@1.7.1': + resolution: {integrity: sha512-OrLzv/nGDU6l6dLXIQHe8nbNSWWfuSbpB/TW5nRpZFf49CLuQlIHlSPN9IdSUv2vG+59yGM6LoibsaHn8B8mDw==} + + '@poppinss/types@1.2.1': + resolution: {integrity: sha512-qUYnzl0m9HJTWsXtr8Xo7CwDx6wcjrvo14bOVbIMIlKJCzKrm3LX55dRTDr1/x4PpSvKVgmxvC6Ly2YiqXKOvQ==} + + '@poppinss/utils@7.0.1': + resolution: {integrity: sha512-mveSvLI2YPC114mK5HCuSYfUtjpClf1wHG1VCqZJCp4U2ypPhIt62Iku5urh0kPAFvnvCVHx2bXBSH14qMTOlQ==} + + '@poppinss/validator-lite@2.1.2': + resolution: {integrity: sha512-UhSG1ouT6r67VbEFHK/8ax3EMZYHioew9PqGmEZjV41G15aPZi6cyhXtBVvF9xqkHMflA5V680k7bQzV0kfD5w==} + '@prisma/instrumentation@5.22.0': resolution: {integrity: sha512-LxccF392NN37ISGxIurUljZSh1YWnphO34V5a0+T7FVQG2u9bhAXRTJpgmQ3483woVhkraQZFF7cbRrpbw/F4Q==} @@ -4774,6 +4999,10 @@ packages: resolution: {integrity: sha512-rO92VvpgMc3kfiTjGT52LEtJ8Yc5kCWhZjLQ3LwlA4pSgPpQO7bVpYXParOD8Jwf+cVQECJo3yP/4I8aZtUQTQ==} engines: {node: '>=18'} + '@sindresorhus/is@7.2.0': + resolution: {integrity: sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==} + engines: {node: '>=18'} + '@sindresorhus/merge-streams@4.0.0': resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} engines: {node: '>=18'} @@ -5044,6 +5273,10 @@ packages: resolution: {integrity: sha512-MADQgmZT1eKjp06jpI2yozxaU9uVs4GzzgSL+uEq7bVcJ9V1ZXQkeGNql1fsSI0gMy1vhvNTNbUqrx+pZfJVmg==} engines: {node: '>=18'} + '@tokenizer/inflate@0.4.1': + resolution: {integrity: sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==} + engines: {node: '>=18'} + '@tokenizer/token@0.3.0': resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} @@ -5221,6 +5454,9 @@ packages: '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + '@types/he@1.2.3': + resolution: {integrity: sha512-q67/qwlxblDzEDvzHhVkwc1gzVWxaNxeyHUBF4xElrvjL11O+Ytze+1fGpBHlr/H9myiBUaUXNnNPmBHxxfAcA==} + '@types/http-assert@1.5.6': resolution: {integrity: sha512-TTEwmtjgVbYAzZYWyeHPrrtWnfVkm8tQkP8P21uQifPgMRgjrow3XDEYqucuC8SKZJT7pUnhU/JymvjggxO9vw==} @@ -5296,6 +5532,9 @@ packages: '@types/pg@8.6.1': resolution: {integrity: sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==} + '@types/pluralize@0.0.33': + resolution: {integrity: sha512-JOqsl+ZoCpP4e8TDke9W79FDcSgPAR0l6pixx2JHkhnRjvShyYiAYw2LVsnA7K08Y6DeOnaU6ujmENO4os/cYg==} + '@types/prop-types@15.7.15': resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} @@ -5917,6 +6156,10 @@ packages: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} + 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'} @@ -5925,6 +6168,10 @@ packages: resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} engines: {node: '>=12'} + 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'} @@ -5933,6 +6180,10 @@ packages: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + ansis@4.2.0: resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==} engines: {node: '>=14'} @@ -6322,6 +6573,10 @@ packages: resolution: {integrity: sha512-F705O3xrsUtgt98j7leetNhTWPe+5S72rlL5O4jA1pKqBVQ/dT1O1D6PFxmSXvc0SUOinWS57DKx0I3CHrXJHQ==} hasBin: true + case-anything@3.1.2: + resolution: {integrity: sha512-wljhAjDDIv/hM2FzgJnYQg90AWmZMNtESCjTeLH680qTzdo0nErlCxOmgzgX4ZsZAtIvqHyD87ES8QyriXB+BQ==} + engines: {node: '>=18'} + ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -6349,6 +6604,10 @@ packages: chardet@2.1.1: resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} + check-disk-space@3.4.0: + resolution: {integrity: sha512-drVkSqfwA+TvuEhFipiR1OC9boEGZL5RrWvVsOthdcvQNXyCCuKkEiTOTXZ7qxSf/GLwq4GvzfrQD/Wz325hgw==} + engines: {node: '>=16'} + check-error@2.1.1: resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} engines: {node: '>= 16'} @@ -6394,6 +6653,10 @@ packages: resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} engines: {node: '>=10'} + cli-boxes@4.0.1: + resolution: {integrity: sha512-5IOn+jcCEHEraYolBPs/sT4BxYCe2nHg374OPiItB1O96KZFseS2gthU4twyYzeDcFew4DaUM/xwc5BQf08JJw==} + engines: {node: '>=18.20 <19 || >=20.10'} + cli-cursor@5.0.0: resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} engines: {node: '>=18'} @@ -6411,6 +6674,10 @@ packages: resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==} engines: {node: 10.* || >= 12.*} + cli-truncate@5.2.0: + resolution: {integrity: sha512-xRwvIOMGrfOAnM1JYtqQImuaNtDEv9v6oIYAs4LIHwTiKee8uwvIi363igssOC0O5U04i4AlENs79LQLu9tEMw==} + engines: {node: '>=20'} + cli-width@4.1.0: resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} engines: {node: '>= 12'} @@ -6507,6 +6774,10 @@ packages: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} + content-disposition@1.1.0: + resolution: {integrity: sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==} + engines: {node: '>=18'} + content-type@1.0.5: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} @@ -7022,6 +7293,10 @@ packages: file-type: '>= 20.0.0' typescript: '>= 5.0.0' + emittery@1.2.1: + resolution: {integrity: sha512-sFz64DCRjirhwHLxofFqxYQm6DCp6o0Ix7jwKQvuCHPn4GMRZNuBZyLPu9Ccmk/QSCAMZt6FOUqA8JZCQvA9fw==} + engines: {node: '>=14.16'} + emoji-regex-xs@1.0.0: resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} @@ -7066,6 +7341,10 @@ packages: resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} engines: {node: '>=0.12'} + environment@1.1.0: + resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} + engines: {node: '>=18'} + error-stack-parser-es@1.0.5: resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==} @@ -7435,6 +7714,10 @@ packages: fast-uri@3.1.0: resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + fastest-levenshtein@1.0.16: + resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} + engines: {node: '>= 4.9.1'} + fastify-plugin@5.1.0: resolution: {integrity: sha512-FAIDA8eovSt5qcDgcBvDuX/v0Cjz0ohGhENZ/wpc3y+oZCY2afZ9Baqql3g/lC+OHRnciQol4ww7tuthOb9idw==} @@ -7483,6 +7766,10 @@ packages: resolution: {integrity: sha512-ek5xNX2YBYlXhiUXui3D/BXa3LdqPmoLJ7rqEx2bKJ7EAUEfmXgW0Das7Dc6Nr9MvqaOnIqiPV0mZk/r/UpNAg==} engines: {node: '>=20'} + file-type@21.3.4: + resolution: {integrity: sha512-Ievi/yy8DS3ygGvT47PjSfdFoX+2isQueoYP1cntFW1JLYAuS4GD7NUPGg4zv2iZfV52uDyk5w5Z0TdpRS6Q1g==} + engines: {node: '>=20'} + file-uri-to-path@1.0.0: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} @@ -7605,6 +7892,10 @@ packages: resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} engines: {node: '>=18'} + get-east-asian-width@1.5.0: + resolution: {integrity: sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==} + engines: {node: '>=18'} + get-intrinsic@1.3.0: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} @@ -7900,6 +8191,10 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} + inflation@2.1.0: + resolution: {integrity: sha512-t54PPJHG1Pp7VQvxyVCJ9mBbjG3Hqryges9bXoOO6GExCPa+//i/d5GSuFtpx3ALLd7lgIAur6zrIlBQyJuMlQ==} + engines: {node: '>= 0.8.0'} + inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. @@ -8017,6 +8312,10 @@ packages: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} + is-fullwidth-code-point@5.1.0: + resolution: {integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==} + engines: {node: '>=18'} + is-generator-function@1.1.0: resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} engines: {node: '>= 0.4'} @@ -8249,6 +8548,9 @@ packages: resolution: {integrity: sha512-pjMIdkXfC1T2wrX9B9i2uXhGdyCmgec3qgMht+TDj+S0qX3bjWMQUfL7NeqEhuRTi8G5ESzmL9uGlST7nzSEWg==} engines: {node: '>=18'} + jsonschema@1.5.0: + resolution: {integrity: sha512-K+A9hhqbn0f3pJX17Q/7H6yQfD/5OXgdrR5UE12gMXCiN9D5Xq2o5mddV2QEcX/bjla99ASsAAQUyMCCRWAEhw==} + jsx-ast-utils@3.3.5: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} @@ -8462,6 +8764,10 @@ packages: resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} engines: {node: '>=18'} + log-update@7.2.0: + resolution: {integrity: sha512-iLs7dGSyjZiUgvrUvuD3FndAxVJk+TywBkkkwUSm9HdYoskJalWg5qVsEiXeufPvRVPbCUmNQewg798rx+sPXg==} + engines: {node: '>=20'} + long@5.3.2: resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} @@ -9158,6 +9464,10 @@ packages: parse-bmfont-xml@1.1.6: resolution: {integrity: sha512-0cEliVMZEhrFDwMh4SxIyVJpqYoOWDJ9P895tFuS+XuNzI5UBmBk5U5O4KuJdTnZpSBI4LFA2+ZiJaiwfSwlMA==} + parse-imports@3.0.0: + resolution: {integrity: sha512-IwiqoJANa4O6M76LBWEvoS2iPIUqBOnKG1lV3/J0oVM6V2XjED+mYAXedEMX5xUglVjfGpZOfaEyuOUjBuUE4g==} + engines: {node: '>= 22'} + parse-latin@7.0.0: resolution: {integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==} @@ -9284,9 +9594,16 @@ packages: pino-abstract-transport@2.0.0: resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==} + pino-abstract-transport@3.0.0: + resolution: {integrity: sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg==} + pino-std-serializers@7.0.0: resolution: {integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==} + pino@10.3.1: + resolution: {integrity: sha512-r34yH/GlQpKZbU1BvFFqOjhISRo1MNx1tWYsYvmj6KIRHSPMT2+yHOEb1SG6NMvRoHRF0a07kCOox/9yakl1vg==} + hasBin: true + pino@9.12.0: resolution: {integrity: sha512-0Gd0OezGvqtqMwgYxpL7P0pSHHzTJ0Lx992h+mNlMtRVfNnqweWmf0JmRWk5gJzHalyd2mxTzKjhiNbGS2Ztfw==} hasBin: true @@ -9316,6 +9633,10 @@ packages: resolution: {integrity: sha512-+KD8hJtqQMYoTuL1bbGOqxb4z+nZkTAwVdNtWwe8Tc2xNbEmdJYIYoc6Qt0uF55e6YW6KuTHw1DjQ18gMhzepw==} engines: {node: '>=16.0.0'} + pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + pngjs@3.4.0: resolution: {integrity: sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==} engines: {node: '>=4.0.0'} @@ -9514,6 +9835,10 @@ packages: resolution: {integrity: sha512-nODzvTiYVRGRqAOvE84Vk5JDPyyxsVk0/fbA/bq7RqlnhksGpset09XTxbpvLTIjoaF7K8Z8DG8yHtKGTPSYRw==} engines: {node: '>=20'} + pretty-hrtime@1.0.3: + resolution: {integrity: sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==} + engines: {node: '>= 0.8'} + printable-characters@1.0.42: resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==} @@ -9607,6 +9932,10 @@ packages: resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} engines: {node: '>= 0.8'} + raw-body@3.0.2: + resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} + engines: {node: '>= 0.10'} + rc9@2.1.2: resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} @@ -10081,9 +10410,20 @@ packages: resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} engines: {node: '>=14.16'} + slashes@3.0.12: + resolution: {integrity: sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA==} + + slice-ansi@8.0.0: + resolution: {integrity: sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg==} + engines: {node: '>=20'} + slow-redact@0.3.0: resolution: {integrity: sha512-cf723wn9JeRIYP9tdtd86GuqoR5937u64Io+CYjlm2i7jvu7g0H+Cp0l0ShAf/4ZL+ISUTVT+8Qzz7RZmp9FjA==} + slugify@1.6.9: + resolution: {integrity: sha512-vZ7rfeehZui7wQs438JXBckYLkIIdfHOXsaVEUMyS5fHo1483l1bMdo0EDSWYclY0yZKFOipDy4KHuKs6ssvdg==} + engines: {node: '>=8.0.0'} + smob@1.6.1: resolution: {integrity: sha512-KAkBqZl3c2GvNgNhcoyJae1aKldDW0LO279wF9bk1PnluRTETKBq0WyzRXxEhoQLk56yHaOY4JCBEKDuJIET5g==} engines: {node: '>=20.0.0'} @@ -10131,6 +10471,10 @@ packages: resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} engines: {node: '>=0.10.0'} + split-lines@3.0.0: + resolution: {integrity: sha512-d0TpRBL/VfKDXsk8JxPF7zgF5pCUDdBMSlEL36xBgVeaX448t+yGXcJaikUyzkoKOJ0l6KpMfygzJU9naIuivw==} + engines: {node: '>=12'} + split2@4.2.0: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} @@ -10208,6 +10552,10 @@ packages: resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} engines: {node: '>=18'} + string-width@8.2.0: + resolution: {integrity: sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw==} + engines: {node: '>=20'} + string.prototype.includes@2.0.1: resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==} engines: {node: '>= 0.4'} @@ -10248,6 +10596,10 @@ packages: resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} engines: {node: '>=12'} + strip-ansi@7.2.0: + resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} + engines: {node: '>=12'} + strip-bom-string@1.0.0: resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} engines: {node: '>=0.10.0'} @@ -10271,6 +10623,10 @@ packages: resolution: {integrity: sha512-or9w505RhhY66+uoe5YOC5QO/bRuATaoim3XTh+pGKx5VMWi/HDhMKuCjDLsLJouU2zg9Hf1nLPcNW7IHv80kQ==} engines: {node: '>=18'} + strtok3@10.3.5: + resolution: {integrity: sha512-ki4hZQfh5rX0QDLLkOCj+h+CVNkqmp/CMf8v8kZpkNVK6jGQooMytqzLZYUVYIZcFZ6yDB70EfD8POcFXiF5oA==} + engines: {node: '>=18'} + strtok3@6.3.0: resolution: {integrity: sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==} engines: {node: '>=10'} @@ -10394,6 +10750,14 @@ packages: teex@1.0.1: resolution: {integrity: sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==} + tempura@0.4.1: + resolution: {integrity: sha512-NQ4Cs23jM6UUp3CcS5vjmyjTC6dtA5EsflBG2cyG0wZvP65AV26tJ920MGvTRYIImCY13RBpOhc7q4/pu+FG5A==} + engines: {node: '>=10'} + + terminal-size@4.0.1: + resolution: {integrity: sha512-avMLDQpUI9I5XFrklECw1ZEUPJhqzcwSWsyyI8blhRLT+8N1jLJWLWWYQpB2q2xthq8xDvjZPISVh53T/+CLYQ==} + engines: {node: '>=18'} + terracotta@1.1.0: resolution: {integrity: sha512-kfQciWUBUBgYkXu7gh3CK3FAJng/iqZslAaY08C+k1Hdx17aVEpcFFb/WPaysxAfcupNH3y53s/pc53xxZauww==} engines: {node: '>=10'} @@ -10421,6 +10785,10 @@ packages: thread-stream@3.1.0: resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} + thread-stream@4.0.0: + resolution: {integrity: sha512-4iMVL6HAINXWf1ZKZjIPcz5wYaOdPhtO8ATvZ+Xqp3BTdaqtAwQkNmKORqcIo5YkQqGXq5cwfswDwMqqQNrpJA==} + engines: {node: '>=20'} + tiny-inflate@1.0.3: resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} @@ -10464,6 +10832,10 @@ packages: resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} engines: {node: '>=14.0.0'} + tmp-cache@1.1.0: + resolution: {integrity: sha512-j040fkL/x+XAZQ9K3bKGEPwgYhOZNBQLa3NXEADUiuno9C+3N2JJA4bVPDREixp604G3/vTXWA3DIPpA9lu1RQ==} + engines: {node: '>=6'} + to-data-view@1.1.0: resolution: {integrity: sha512-1eAdufMg6mwgmlojAx3QeMnzB/BTVp7Tbndi3U7ftcT2zCZadjxkkmLmd97zmaxWi+sgGcgWrokmpEoy0Dn0vQ==} @@ -10491,6 +10863,10 @@ packages: resolution: {integrity: sha512-IKJ6EzuPPWtKtEIEPpIdXv9j5j2LGJEYk0CKY2efgKoYKLBiZdh6iQkLVBow/CB3phyWAWCyk+bZeaimJn6uRQ==} engines: {node: '>=14.16'} + token-types@6.1.2: + resolution: {integrity: sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==} + engines: {node: '>=14.16'} + tokenx@1.1.0: resolution: {integrity: sha512-KCjtiC2niPwTSuz4ktM82Ki5bjqBwYpssiHDsGr5BpejN/B3ksacRvrsdoxljdMIh2nCX78alnDkeemBmYUmTA==} @@ -11255,6 +11631,10 @@ packages: '@cloudflare/workers-types': optional: true + wrap-ansi@10.0.0: + resolution: {integrity: sha512-SGcvg80f0wUy2/fXES19feHMz8E0JoXv2uNgHOu4Dgi2OrCy1lqwFYEJz1BLbDI0exjPMe/ZdzZ/YpGECBG/aQ==} + engines: {node: '>=20'} + wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} @@ -11338,6 +11718,10 @@ packages: 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@16.2.0: resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} engines: {node: '>=10'} @@ -11414,6 +11798,153 @@ packages: snapshots: + '@adonisjs/ace@14.1.0(youch@4.1.0)': + dependencies: + '@poppinss/cliui': 6.8.1 + '@poppinss/hooks': 7.3.0 + '@poppinss/macroable': 1.1.2 + '@poppinss/prompts': 3.1.6 + '@poppinss/utils': 7.0.1 + fastest-levenshtein: 1.0.16 + jsonschema: 1.5.0 + string-width: 8.2.0 + yargs-parser: 22.0.0 + youch: 4.1.0 + + '@adonisjs/application@9.0.0(@adonisjs/config@6.1.0)(@adonisjs/fold@11.0.0)': + dependencies: + '@adonisjs/config': 6.1.0 + '@adonisjs/fold': 11.0.0 + '@poppinss/hooks': 7.3.0 + '@poppinss/macroable': 1.1.2 + '@poppinss/utils': 7.0.1 + glob-parent: 6.0.2 + tempura: 0.4.1 + + '@adonisjs/bodyparser@11.0.1(@adonisjs/http-server@8.1.2(@adonisjs/application@9.0.0(@adonisjs/config@6.1.0)(@adonisjs/fold@11.0.0))(@adonisjs/events@10.2.0(@adonisjs/application@9.0.0(@adonisjs/config@6.1.0)(@adonisjs/fold@11.0.0))(@adonisjs/fold@11.0.0))(@adonisjs/fold@11.0.0)(@adonisjs/logger@7.1.1)(@boringnode/encryption@1.0.0)(youch@4.1.0))': + dependencies: + '@adonisjs/http-server': 8.1.2(@adonisjs/application@9.0.0(@adonisjs/config@6.1.0)(@adonisjs/fold@11.0.0))(@adonisjs/events@10.2.0(@adonisjs/application@9.0.0(@adonisjs/config@6.1.0)(@adonisjs/fold@11.0.0))(@adonisjs/fold@11.0.0))(@adonisjs/fold@11.0.0)(@adonisjs/logger@7.1.1)(@boringnode/encryption@1.0.0)(youch@4.1.0) + '@poppinss/macroable': 1.1.2 + '@poppinss/middleware': 3.2.7 + '@poppinss/multiparty': 3.0.0 + '@poppinss/qs': 6.15.0 + '@poppinss/utils': 7.0.1 + file-type: 21.3.4 + inflation: 2.1.0 + media-typer: 1.1.0 + raw-body: 3.0.2 + transitivePeerDependencies: + - supports-color + + '@adonisjs/config@6.1.0': + dependencies: + '@poppinss/utils': 7.0.1 + + '@adonisjs/core@7.3.0(youch@4.1.0)': + dependencies: + '@adonisjs/ace': 14.1.0(youch@4.1.0) + '@adonisjs/application': 9.0.0(@adonisjs/config@6.1.0)(@adonisjs/fold@11.0.0) + '@adonisjs/bodyparser': 11.0.1(@adonisjs/http-server@8.1.2(@adonisjs/application@9.0.0(@adonisjs/config@6.1.0)(@adonisjs/fold@11.0.0))(@adonisjs/events@10.2.0(@adonisjs/application@9.0.0(@adonisjs/config@6.1.0)(@adonisjs/fold@11.0.0))(@adonisjs/fold@11.0.0))(@adonisjs/fold@11.0.0)(@adonisjs/logger@7.1.1)(@boringnode/encryption@1.0.0)(youch@4.1.0)) + '@adonisjs/config': 6.1.0 + '@adonisjs/env': 7.0.0 + '@adonisjs/events': 10.2.0(@adonisjs/application@9.0.0(@adonisjs/config@6.1.0)(@adonisjs/fold@11.0.0))(@adonisjs/fold@11.0.0) + '@adonisjs/fold': 11.0.0 + '@adonisjs/hash': 10.1.0 + '@adonisjs/health': 3.1.0 + '@adonisjs/http-server': 8.1.2(@adonisjs/application@9.0.0(@adonisjs/config@6.1.0)(@adonisjs/fold@11.0.0))(@adonisjs/events@10.2.0(@adonisjs/application@9.0.0(@adonisjs/config@6.1.0)(@adonisjs/fold@11.0.0))(@adonisjs/fold@11.0.0))(@adonisjs/fold@11.0.0)(@adonisjs/logger@7.1.1)(@boringnode/encryption@1.0.0)(youch@4.1.0) + '@adonisjs/http-transformers': 2.3.1(@adonisjs/fold@11.0.0) + '@adonisjs/logger': 7.1.1 + '@adonisjs/repl': 5.0.0 + '@boringnode/encryption': 1.0.0 + '@poppinss/colors': 4.1.6 + '@poppinss/dumper': 0.7.0 + '@poppinss/macroable': 1.1.2 + '@poppinss/utils': 7.0.1 + '@sindresorhus/is': 7.2.0 + '@types/he': 1.2.3 + error-stack-parser-es: 1.0.5 + he: 1.2.0 + pretty-hrtime: 1.0.3 + string-width: 8.2.0 + optionalDependencies: + youch: 4.1.0 + transitivePeerDependencies: + - supports-color + + '@adonisjs/env@7.0.0': + dependencies: + '@poppinss/utils': 7.0.1 + '@poppinss/validator-lite': 2.1.2 + split-lines: 3.0.0 + + '@adonisjs/events@10.2.0(@adonisjs/application@9.0.0(@adonisjs/config@6.1.0)(@adonisjs/fold@11.0.0))(@adonisjs/fold@11.0.0)': + dependencies: + '@adonisjs/application': 9.0.0(@adonisjs/config@6.1.0)(@adonisjs/fold@11.0.0) + '@adonisjs/fold': 11.0.0 + '@poppinss/utils': 7.0.1 + '@sindresorhus/is': 7.2.0 + emittery: 1.2.1 + + '@adonisjs/fold@11.0.0': + dependencies: + '@poppinss/utils': 7.0.1 + parse-imports: 3.0.0 + + '@adonisjs/hash@10.1.0': + dependencies: + '@phc/format': 1.0.0 + '@poppinss/utils': 7.0.1 + + '@adonisjs/health@3.1.0': + dependencies: + '@poppinss/utils': 7.0.1 + check-disk-space: 3.4.0 + + '@adonisjs/http-server@8.1.2(@adonisjs/application@9.0.0(@adonisjs/config@6.1.0)(@adonisjs/fold@11.0.0))(@adonisjs/events@10.2.0(@adonisjs/application@9.0.0(@adonisjs/config@6.1.0)(@adonisjs/fold@11.0.0))(@adonisjs/fold@11.0.0))(@adonisjs/fold@11.0.0)(@adonisjs/logger@7.1.1)(@boringnode/encryption@1.0.0)(youch@4.1.0)': + dependencies: + '@adonisjs/application': 9.0.0(@adonisjs/config@6.1.0)(@adonisjs/fold@11.0.0) + '@adonisjs/events': 10.2.0(@adonisjs/application@9.0.0(@adonisjs/config@6.1.0)(@adonisjs/fold@11.0.0))(@adonisjs/fold@11.0.0) + '@adonisjs/fold': 11.0.0 + '@adonisjs/logger': 7.1.1 + '@boringnode/encryption': 1.0.0 + '@poppinss/macroable': 1.1.2 + '@poppinss/matchit': 3.2.0 + '@poppinss/middleware': 3.2.7 + '@poppinss/qs': 6.15.0 + '@poppinss/utils': 7.0.1 + '@sindresorhus/is': 7.2.0 + content-disposition: 1.1.0 + cookie-es: 2.0.0 + destroy: 1.2.0 + encodeurl: 2.0.0 + etag: 1.8.1 + fresh: 0.5.2 + mime-types: 3.0.2 + on-finished: 2.4.1 + proxy-addr: 2.0.7 + tmp-cache: 1.1.0 + type-is: 2.0.1 + vary: 1.1.2 + optionalDependencies: + youch: 4.1.0 + + '@adonisjs/http-transformers@2.3.1(@adonisjs/fold@11.0.0)': + dependencies: + '@adonisjs/fold': 11.0.0 + '@poppinss/exception': 1.2.3 + '@poppinss/types': 1.2.1 + + '@adonisjs/logger@7.1.1': + dependencies: + '@poppinss/utils': 7.0.1 + abstract-logging: 2.0.1 + pino: 10.3.1 + + '@adonisjs/repl@5.0.0': + dependencies: + '@poppinss/colors': 4.1.6 + string-width: 8.2.0 + '@algolia/autocomplete-core@1.17.7(@algolia/client-search@5.29.0)(algoliasearch@5.29.0)(search-insights@2.17.3)': dependencies: '@algolia/autocomplete-plugin-algolia-insights': 1.17.7(@algolia/client-search@5.29.0)(algoliasearch@5.29.0)(search-insights@2.17.3) @@ -11535,6 +12066,8 @@ snapshots: '@antfu/utils@8.1.1': {} + '@arr/every@1.0.1': {} + '@astrojs/compiler@2.13.1': {} '@astrojs/internal-helpers@0.7.5': {} @@ -11738,6 +12271,12 @@ snapshots: '@babel/helper-string-parser': 8.0.0-rc.3 '@babel/helper-validator-identifier': 8.0.0-rc.3 + '@borewit/text-codec@0.2.2': {} + + '@boringnode/encryption@1.0.0': + dependencies: + '@poppinss/utils': 7.0.1 + '@braintree/sanitize-url@6.0.4': optional: true @@ -13793,6 +14332,10 @@ snapshots: '@parcel/watcher-win32-ia32': 2.5.6 '@parcel/watcher-win32-x64': 2.5.6 + '@phc/format@1.0.0': {} + + '@pinojs/redact@0.4.0': {} + '@pkgjs/parseargs@0.11.0': optional: true @@ -13800,6 +14343,18 @@ snapshots: '@poppanator/http-constants@1.1.1': {} + '@poppinss/cliui@6.8.1': + dependencies: + '@poppinss/colors': 4.1.6 + cli-boxes: 4.0.1 + cli-table3: 0.6.5 + cli-truncate: 5.2.0 + log-update: 7.2.0 + pretty-hrtime: 1.0.3 + string-width: 8.2.0 + supports-color: 10.2.2 + terminal-size: 4.0.1 + '@poppinss/colors@4.1.6': dependencies: kleur: 4.1.5 @@ -13813,11 +14368,55 @@ snapshots: '@poppinss/dumper@0.7.0': dependencies: '@poppinss/colors': 4.1.6 - '@sindresorhus/is': 7.1.1 + '@sindresorhus/is': 7.2.0 supports-color: 10.2.2 '@poppinss/exception@1.2.3': {} + '@poppinss/hooks@7.3.0': {} + + '@poppinss/macroable@1.1.2': {} + + '@poppinss/matchit@3.2.0': + dependencies: + '@arr/every': 1.0.1 + + '@poppinss/middleware@3.2.7': {} + + '@poppinss/multiparty@3.0.0': + dependencies: + http-errors: 2.0.1 + + '@poppinss/object-builder@1.1.0': {} + + '@poppinss/prompts@3.1.6': + dependencies: + '@poppinss/colors': 4.1.6 + '@poppinss/exception': 1.2.3 + '@poppinss/object-builder': 1.1.0 + enquirer: 2.4.1 + + '@poppinss/qs@6.15.0': {} + + '@poppinss/string@1.7.1': + dependencies: + '@types/pluralize': 0.0.33 + case-anything: 3.1.2 + pluralize: 8.0.0 + slugify: 1.6.9 + + '@poppinss/types@1.2.1': {} + + '@poppinss/utils@7.0.1': + dependencies: + '@poppinss/exception': 1.2.3 + '@poppinss/object-builder': 1.1.0 + '@poppinss/string': 1.7.1 + '@poppinss/types': 1.2.1 + flattie: 1.1.1 + + '@poppinss/validator-lite@2.1.2': {} + '@prisma/instrumentation@5.22.0': dependencies: '@opentelemetry/api': 1.9.0 @@ -14307,6 +14906,8 @@ snapshots: '@sindresorhus/is@7.1.1': {} + '@sindresorhus/is@7.2.0': {} + '@sindresorhus/merge-streams@4.0.0': {} '@solidjs/router@0.15.4(solid-js@1.9.11)': @@ -14601,6 +15202,13 @@ snapshots: transitivePeerDependencies: - supports-color + '@tokenizer/inflate@0.4.1': + dependencies: + debug: 4.4.3 + token-types: 6.1.2 + transitivePeerDependencies: + - supports-color + '@tokenizer/token@0.3.0': {} '@tybys/wasm-util@0.10.1': @@ -14833,6 +15441,8 @@ snapshots: dependencies: '@types/unist': 3.0.3 + '@types/he@1.2.3': {} + '@types/http-assert@1.5.6': {} '@types/http-errors@2.0.5': {} @@ -14921,6 +15531,8 @@ snapshots: pg-protocol: 1.10.3 pg-types: 2.2.0 + '@types/pluralize@0.0.33': {} + '@types/prop-types@15.7.15': {} '@types/qs@6.14.0': {} @@ -15803,16 +16415,24 @@ snapshots: dependencies: type-fest: 0.21.3 + ansi-escapes@7.3.0: + dependencies: + environment: 1.1.0 + ansi-regex@5.0.1: {} ansi-regex@6.1.0: {} + ansi-regex@6.2.2: {} + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 ansi-styles@6.2.1: {} + ansi-styles@6.2.3: {} + ansis@4.2.0: {} any-base@1.1.0: {} @@ -16325,6 +16945,8 @@ snapshots: canonicalize@2.1.0: {} + case-anything@3.1.2: {} + ccount@2.0.1: {} chai@5.3.3: @@ -16350,6 +16972,8 @@ snapshots: chardet@2.1.1: {} + check-disk-space@3.4.0: {} + check-error@2.1.1: {} chevrotain-allstar@0.3.1(chevrotain@11.0.3): @@ -16400,6 +17024,8 @@ snapshots: cli-boxes@3.0.0: {} + cli-boxes@4.0.1: {} + cli-cursor@5.0.0: dependencies: restore-cursor: 5.1.0 @@ -16421,6 +17047,11 @@ snapshots: optionalDependencies: '@colors/colors': 1.5.0 + cli-truncate@5.2.0: + dependencies: + slice-ansi: 8.0.0 + string-width: 8.2.0 + cli-width@4.1.0: {} client-only@0.0.1: {} @@ -16503,6 +17134,8 @@ snapshots: dependencies: safe-buffer: 5.2.1 + content-disposition@1.1.0: {} + content-type@1.0.5: {} convert-source-map@2.0.0: {} @@ -16966,17 +17599,19 @@ snapshots: electron-to-chromium@1.5.307: {} - elysia@1.3.8(exact-mirror@0.1.3(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.9.3): + elysia@1.3.8(exact-mirror@0.1.3(@sinclair/typebox@0.34.38))(file-type@21.3.4)(typescript@5.9.3): dependencies: cookie: 1.0.2 exact-mirror: 0.1.3(@sinclair/typebox@0.34.38) fast-decode-uri-component: 1.0.1 - file-type: 21.0.0 + file-type: 21.3.4 typescript: 5.9.3 optionalDependencies: '@sinclair/typebox': 0.34.38 openapi-types: 12.1.3 + emittery@1.2.1: {} + emoji-regex-xs@1.0.0: {} emoji-regex@10.6.0: {} @@ -17010,6 +17645,8 @@ snapshots: entities@6.0.1: {} + environment@1.1.0: {} + error-stack-parser-es@1.0.5: {} error-stack-parser@2.1.4: @@ -17321,7 +17958,7 @@ snapshots: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.3 eslint: 8.57.1 - get-tsconfig: 4.10.1 + get-tsconfig: 4.13.7 is-bun-module: 2.0.0 stable-hash: 0.0.5 tinyglobby: 0.2.15 @@ -17336,7 +17973,7 @@ snapshots: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.3 eslint: 9.32.0(jiti@2.6.1) - get-tsconfig: 4.10.1 + get-tsconfig: 4.13.7 is-bun-module: 2.0.0 stable-hash: 0.0.5 tinyglobby: 0.2.15 @@ -17840,6 +18477,8 @@ snapshots: fast-uri@3.1.0: {} + fastest-levenshtein@1.0.16: {} + fastify-plugin@5.1.0: {} fastify@5.6.1: @@ -17915,6 +18554,15 @@ snapshots: transitivePeerDependencies: - supports-color + file-type@21.3.4: + dependencies: + '@tokenizer/inflate': 0.4.1 + strtok3: 10.3.5 + token-types: 6.1.2 + uint8array-extras: 1.4.0 + transitivePeerDependencies: + - supports-color + file-uri-to-path@1.0.0: {} fill-range@7.1.1: @@ -18026,6 +18674,8 @@ snapshots: get-east-asian-width@1.4.0: {} + get-east-asian-width@1.5.0: {} + get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 @@ -18435,6 +19085,8 @@ snapshots: imurmurhash@0.1.4: {} + inflation@2.1.0: {} + inflight@1.0.6: dependencies: once: 1.4.0 @@ -18566,6 +19218,10 @@ snapshots: is-fullwidth-code-point@3.0.0: {} + is-fullwidth-code-point@5.1.0: + dependencies: + get-east-asian-width: 1.4.0 + is-generator-function@1.1.0: dependencies: call-bound: 1.0.4 @@ -18793,6 +19449,8 @@ snapshots: lru-cache: 6.0.0 rdf-canonize: 5.0.0 + jsonschema@1.5.0: {} + jsx-ast-utils@3.3.5: dependencies: array-includes: 3.1.9 @@ -19032,6 +19690,14 @@ snapshots: chalk: 5.6.2 is-unicode-supported: 1.3.0 + log-update@7.2.0: + dependencies: + ansi-escapes: 7.3.0 + cli-cursor: 5.0.0 + slice-ansi: 8.0.0 + strip-ansi: 7.2.0 + wrap-ansi: 10.0.0 + long@5.3.2: {} longest-streak@3.1.0: {} @@ -20047,6 +20713,11 @@ snapshots: xml-parse-from-string: 1.0.1 xml2js: 0.5.0 + parse-imports@3.0.0: + dependencies: + es-module-lexer: 1.7.0 + slashes: 3.0.12 + parse-latin@7.0.0: dependencies: '@types/nlcst': 2.0.3 @@ -20144,8 +20815,26 @@ snapshots: dependencies: split2: 4.2.0 + pino-abstract-transport@3.0.0: + dependencies: + split2: 4.2.0 + pino-std-serializers@7.0.0: {} + pino@10.3.1: + dependencies: + '@pinojs/redact': 0.4.0 + atomic-sleep: 1.0.0 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 3.0.0 + pino-std-serializers: 7.0.0 + process-warning: 5.0.0 + quick-format-unescaped: 4.0.4 + real-require: 0.2.0 + safe-stable-stringify: 2.5.0 + sonic-boom: 4.2.0 + thread-stream: 4.0.0 + pino@9.12.0: dependencies: atomic-sleep: 1.0.0 @@ -20197,6 +20886,8 @@ snapshots: pvutils: 1.1.3 tslib: 2.8.1 + pluralize@8.0.0: {} + pngjs@3.4.0: {} pngjs@6.0.0: {} @@ -20306,6 +20997,8 @@ snapshots: pretty-bytes@7.1.0: {} + pretty-hrtime@1.0.3: {} + printable-characters@1.0.42: {} prismjs@1.30.0: {} @@ -20407,6 +21100,13 @@ snapshots: iconv-lite: 0.4.24 unpipe: 1.0.0 + raw-body@3.0.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.1 + iconv-lite: 0.7.2 + unpipe: 1.0.0 + rc9@2.1.2: dependencies: defu: 6.1.4 @@ -21125,8 +21825,17 @@ snapshots: slash@5.1.0: {} + slashes@3.0.12: {} + + slice-ansi@8.0.0: + dependencies: + ansi-styles: 6.2.3 + is-fullwidth-code-point: 5.1.0 + slow-redact@0.3.0: {} + slugify@1.6.9: {} + smob@1.6.1: {} smol-toml@1.6.0: {} @@ -21169,6 +21878,8 @@ snapshots: speakingurl@14.0.1: {} + split-lines@3.0.0: {} + split2@4.2.0: {} sprintf-js@1.0.3: {} @@ -21236,6 +21947,11 @@ snapshots: get-east-asian-width: 1.4.0 strip-ansi: 7.1.0 + string-width@8.2.0: + dependencies: + get-east-asian-width: 1.5.0 + strip-ansi: 7.2.0 + string.prototype.includes@2.0.1: dependencies: call-bind: 1.0.8 @@ -21307,6 +22023,10 @@ snapshots: dependencies: ansi-regex: 6.1.0 + strip-ansi@7.2.0: + dependencies: + ansi-regex: 6.2.2 + strip-bom-string@1.0.0: {} strip-bom@3.0.0: {} @@ -21323,6 +22043,10 @@ snapshots: dependencies: '@tokenizer/token': 0.3.0 + strtok3@10.3.5: + dependencies: + '@tokenizer/token': 0.3.0 + strtok3@6.3.0: dependencies: '@tokenizer/token': 0.3.0 @@ -21485,6 +22209,10 @@ snapshots: - bare-abort-controller - react-native-b4a + tempura@0.4.1: {} + + terminal-size@4.0.1: {} + terracotta@1.1.0(solid-js@1.9.11): dependencies: solid-js: 1.9.11 @@ -21517,6 +22245,10 @@ snapshots: dependencies: real-require: 0.2.0 + thread-stream@4.0.0: + dependencies: + real-require: 0.2.0 + tiny-inflate@1.0.3: {} tiny-invariant@1.3.3: {} @@ -21547,6 +22279,8 @@ snapshots: tinyspy@4.0.4: {} + tmp-cache@1.1.0: {} + to-data-view@1.1.0: {} to-data-view@2.0.0: {} @@ -21569,6 +22303,12 @@ snapshots: '@tokenizer/token': 0.3.0 ieee754: 1.2.1 + token-types@6.1.2: + dependencies: + '@borewit/text-codec': 0.2.2 + '@tokenizer/token': 0.3.0 + ieee754: 1.2.1 + tokenx@1.1.0: {} totalist@3.0.1: {} @@ -22519,6 +23259,12 @@ snapshots: - bufferutil - utf-8-validate + wrap-ansi@10.0.0: + dependencies: + ansi-styles: 6.2.3 + string-width: 8.2.0 + strip-ansi: 7.2.0 + wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 @@ -22578,6 +23324,8 @@ snapshots: yargs-parser@21.1.1: {} + yargs-parser@22.0.0: {} + yargs@16.2.0: dependencies: cliui: 7.0.4 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 59aeedee3..ec548fea0 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,4 +1,5 @@ packages: +- packages/adonis - packages/amqp - packages/astro - packages/cfworkers @@ -30,6 +31,7 @@ packages: - packages/vocab-tools - packages/webfinger - docs +- examples/adonis - examples/astro - examples/cloudflare-workers - examples/elysia From fa4b7ef27e4d9aa7343dab5264506fa50bc08924 Mon Sep 17 00:00:00 2001 From: ChanHaeng Lee <2chanhaeng@gmail.com> Date: Mon, 6 Apr 2026 23:34:48 +0000 Subject: [PATCH 04/10] Add lint and format checks step to create-integration-package skill --- .agents/skills/create-integration-package/SKILL.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.agents/skills/create-integration-package/SKILL.md b/.agents/skills/create-integration-package/SKILL.md index 7b380fd08..591f13ae3 100644 --- a/.agents/skills/create-integration-package/SKILL.md +++ b/.agents/skills/create-integration-package/SKILL.md @@ -22,6 +22,7 @@ Follow these steps in order to implement the integration package. 4. Add to `@fedify/init` 5. Test with `mise test:init` 6. Add an example +7. Lint, format, and final checks Research the web framework @@ -306,3 +307,11 @@ is broken: ~~~~ bash mise test:examples ~~~~ + + +Lint, format, and final checks +------------------------------ + +After implementation, run `mise run fmt && mise check`. +If there are lint or format errors, fix them and run the command again until +there are no errors. From a700647224b7093e4bd53c6eaa6a06b4f39c280b Mon Sep 17 00:00:00 2001 From: ChanHaeng Lee <2chanhaeng@gmail.com> Date: Mon, 6 Apr 2026 23:34:48 +0000 Subject: [PATCH 05/10] Remove unnecessary .gitignore guidance from create-integration-package skill --- .agents/skills/create-integration-package/SKILL.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.agents/skills/create-integration-package/SKILL.md b/.agents/skills/create-integration-package/SKILL.md index 591f13ae3..171ed7bd2 100644 --- a/.agents/skills/create-integration-package/SKILL.md +++ b/.agents/skills/create-integration-package/SKILL.md @@ -280,10 +280,6 @@ Fedify middleware in `src/app.ts`. Import `src/logging.ts` in the entry file to initialize `@logtape/logtape`. When logging is needed, use the `getLogger` function from `@logtape/logtape` to create a logger. -If there are any build files or paths other than those already added to the -root `.gitignore`, define a separate `.gitignore` file within the example path -to prevent git tracking them. - ### Test the example with `mise test:examples` Register the new example in `examples/test-examples/mod.ts`. Read the From b6abc56850736865a21a3c30b03fe6232f4d188d Mon Sep 17 00:00:00 2001 From: ChanHaeng Lee <2chanhaeng@gmail.com> Date: Wed, 8 Apr 2026 06:55:42 +0000 Subject: [PATCH 06/10] Create `@fedify/nuxt` by GPT 5.4 using `/create-integration-package` skill in one-shot The agent did not automatically formatted, so it was manually formatted by a human. No error while `mise test:init`. --- AGENTS.md | 2 +- CHANGES.md | 14 + CONTRIBUTING.md | 1 + deno.json | 1 + deno.lock | 1077 +++-- docs/.vitepress/config.mts | 5 +- docs/manual/integration.md | 491 ++- examples/README.md | 1 + examples/adonis/README.md | 49 +- examples/adonis/src/app.ts | 2 +- examples/nuxt/.gitignore | 4 + examples/nuxt/app/app.vue | 3 + examples/nuxt/app/pages/index.vue | 95 + .../nuxt/app/pages/users/[identifier].vue | 116 + examples/nuxt/nuxt.config.ts | 7 + examples/nuxt/package.json | 22 + examples/nuxt/server/error.ts | 3 + examples/nuxt/server/federation.ts | 132 + examples/nuxt/server/middleware/federation.ts | 4 + examples/nuxt/server/store.ts | 4 + examples/nuxt/tsconfig.json | 3 + examples/test-examples/mod.ts | 12 + packages/adonis/README.md | 6 +- packages/adonis/src/mod.ts | 4 +- packages/fedify/README.md | 3 + packages/init/src/action/templates.ts | 10 +- packages/init/src/const.ts | 1 + .../src/templates/nuxt/nuxt.config.ts.tpl | 7 + .../src/templates/nuxt/server/error.ts.tpl | 3 + .../templates/nuxt/server/federation.ts.tpl | 26 + .../nuxt/server/middleware/federation.ts.tpl | 4 + packages/init/src/test/port.ts | 14 + packages/init/src/types.ts | 2 +- packages/init/src/webframeworks/mod.ts | 2 + packages/init/src/webframeworks/nuxt.ts | 60 + packages/nuxt/README.md | 87 + packages/nuxt/deno.json | 21 + packages/nuxt/package.json | 64 + packages/nuxt/src/index.ts | 120 + packages/nuxt/tsdown.config.ts | 14 + pnpm-lock.yaml | 3557 +++++++++++++++-- pnpm-workspace.yaml | 5 + 42 files changed, 5121 insertions(+), 937 deletions(-) create mode 100644 examples/nuxt/.gitignore create mode 100644 examples/nuxt/app/app.vue create mode 100644 examples/nuxt/app/pages/index.vue create mode 100644 examples/nuxt/app/pages/users/[identifier].vue create mode 100644 examples/nuxt/nuxt.config.ts create mode 100644 examples/nuxt/package.json create mode 100644 examples/nuxt/server/error.ts create mode 100644 examples/nuxt/server/federation.ts create mode 100644 examples/nuxt/server/middleware/federation.ts create mode 100644 examples/nuxt/server/store.ts create mode 100644 examples/nuxt/tsconfig.json create mode 100644 packages/init/src/templates/nuxt/nuxt.config.ts.tpl create mode 100644 packages/init/src/templates/nuxt/server/error.ts.tpl create mode 100644 packages/init/src/templates/nuxt/server/federation.ts.tpl create mode 100644 packages/init/src/templates/nuxt/server/middleware/federation.ts.tpl create mode 100644 packages/init/src/webframeworks/nuxt.ts create mode 100644 packages/nuxt/README.md create mode 100644 packages/nuxt/deno.json create mode 100644 packages/nuxt/package.json create mode 100644 packages/nuxt/src/index.ts create mode 100644 packages/nuxt/tsdown.config.ts diff --git a/AGENTS.md b/AGENTS.md index 020c40f65..25a27be53 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -324,7 +324,7 @@ The monorepo uses different build processes for different packages: 3. **Database adapters and integrations**: Use tsdown for TypeScript compilation: - *packages/amqp/*, *packages/astro/*, *packages/elysia*, - *packages/express/*, *packages/h3/*, + *packages/express/*, *packages/h3/*, *packages/nuxt/*, *packages/mysql/*, *packages/sqlite/*, *packages/postgres/*, *packages/redis/*, *packages/nestjs/* - Built to support Node.js and Bun environments diff --git a/CHANGES.md b/CHANGES.md index d69c38018..58c879ef3 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -53,6 +53,15 @@ To be released. [#601]: https://github.com/fedify-dev/fedify/pull/601 [#652]: https://github.com/fedify-dev/fedify/pull/652 +### @fedify/Nuxt + + - Added `@fedify/nuxt` for integrating Fedify with [Nuxt] through + `server/middleware` and Nitro's `errorHandler`, so Nuxt routes and + ActivityPub endpoints can share the same paths with proper content + negotiation. + +[Nuxt]: https://nuxt.com/ + ### @fedify/init - Fixed errors when using `fedify init` with certain web framework @@ -60,8 +69,13 @@ To be released. Environment variables are now properly loaded at runtime, resolving the `TypeError: Cannot read properties of undefined` from `mysql2`. [[#649], [#656] by ChanHaeng Lee] + - Added Nuxt to `fedify init`, including middleware and Nitro error handler + templates for newly scaffolded projects. + [[#149], [#653] by ChanHaeng Lee] +[#149]: https://github.com/fedify-dev/fedify/issues/149 [#649]: https://github.com/fedify-dev/fedify/issues/649 +[#653]: https://github.com/fedify-dev/fedify/issues/653 [#656]: https://github.com/fedify-dev/fedify/pull/656 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e41f9bbad..33d6c218f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -392,6 +392,7 @@ The repository is organized as a monorepo with the following packages: - *packages/mysql/*: MySQL/MariaDB drivers (@fedify/mysql) for Fedify. - *packages/nestjs/*: NestJS integration (@fedify/nestjs) for Fedify. - *packages/next/*: Next.js integration (@fedify/next) for Fedify. + - *packages/nuxt/*: Nuxt integration (@fedify/nuxt) for Fedify. - *packages/postgres/*: PostgreSQL drivers (@fedify/postgres) for Fedify. - *packages/redis/*: Redis drivers (@fedify/redis) for Fedify. - *packages/relay/*: ActivityPub relay support (@fedify/relay) for Fedify. diff --git a/deno.json b/deno.json index 01ab1218a..6954853e6 100644 --- a/deno.json +++ b/deno.json @@ -22,6 +22,7 @@ "./packages/redis", "./packages/relay", "./packages/solidstart", + "./packages/nuxt", "./packages/sqlite", "./packages/sveltekit", "./packages/testing", diff --git a/deno.lock b/deno.lock index 85f5d4c9f..37536cd4d 100644 --- a/deno.lock +++ b/deno.lock @@ -1,74 +1,106 @@ { "version": "5", "specifiers": { + "jsr:@alinea/suite@~0.6.3": "0.6.3", "jsr:@david/console-static-text@0.3": "0.3.0", "jsr:@david/dax@~0.43.2": "0.43.2", "jsr:@david/path@0.2": "0.2.0", "jsr:@david/which@~0.4.1": "0.4.1", + "jsr:@deno/esbuild-plugin@^1.2.0": "1.2.1", + "jsr:@deno/loader@~0.3.10": "0.3.14", + "jsr:@deno/loader@~0.3.2": "0.3.14", "jsr:@fresh/build-id@1": "1.0.1", - "jsr:@fresh/core@^2.1.4": "2.2.0", + "jsr:@fresh/core@2": "2.2.2", + "jsr:@fresh/core@^2.1.4": "2.2.2", + "jsr:@fresh/core@^2.2.0": "2.2.2", + "jsr:@fresh/plugin-vite@^1.0.7": "1.0.8", "jsr:@hongminhee/localtunnel@0.3": "0.3.0", - "jsr:@hono/hono@^4.8.3": "4.12.4", + "jsr:@hono/hono@^4.7.1": "4.12.12", + "jsr:@hono/hono@^4.8.3": "4.12.12", "jsr:@logtape/file@^2.0.5": "2.0.5", "jsr:@logtape/logtape@^1.0.4": "1.3.7", "jsr:@logtape/logtape@^2.0.5": "2.0.5", "jsr:@optique/config@~0.10.7": "0.10.7", "jsr:@optique/core@~0.10.7": "0.10.7", "jsr:@optique/run@~0.10.7": "0.10.7", + "jsr:@std/assert@0.224": "0.224.0", + "jsr:@std/assert@0.226": "0.226.0", + "jsr:@std/assert@^1.0.13": "1.0.19", + "jsr:@std/async@^1.0.13": "1.2.0", "jsr:@std/bytes@^1.0.6": "1.0.6", + "jsr:@std/dotenv@~0.225.5": "0.225.6", "jsr:@std/encoding@^1.0.10": "1.0.10", + "jsr:@std/fmt@0.224": "0.224.0", "jsr:@std/fmt@1": "1.0.9", + "jsr:@std/fmt@^1.0.7": "1.0.9", "jsr:@std/fmt@^1.0.8": "1.0.9", + "jsr:@std/fs@0.224": "0.224.0", "jsr:@std/fs@1": "1.0.23", "jsr:@std/fs@^1.0.19": "1.0.23", + "jsr:@std/fs@^1.0.3": "1.0.23", "jsr:@std/html@^1.0.5": "1.0.5", "jsr:@std/http@^1.0.21": "1.0.25", + "jsr:@std/internal@0.224": "0.224.0", + "jsr:@std/internal@1": "1.0.12", "jsr:@std/internal@^1.0.12": "1.0.12", "jsr:@std/io@0.225": "0.225.3", + "jsr:@std/json@^1.0.2": "1.0.3", + "jsr:@std/jsonc@^1.0.2": "1.0.2", + "jsr:@std/media-types@^1.1.0": "1.1.0", + "jsr:@std/path@0.224": "0.224.0", "jsr:@std/path@1": "1.1.4", "jsr:@std/path@^1.0.6": "1.1.4", "jsr:@std/path@^1.1.0": "1.1.4", + "jsr:@std/path@^1.1.1": "1.1.4", "jsr:@std/path@^1.1.2": "1.1.4", "jsr:@std/path@^1.1.4": "1.1.4", - "jsr:@valibot/valibot@^1.2.0": "1.2.0", + "jsr:@std/semver@^1.0.6": "1.0.8", + "jsr:@std/testing@0.224": "0.224.0", + "jsr:@std/uuid@^1.0.9": "1.1.0", + "jsr:@valibot/valibot@^1.2.0": "1.3.1", "npm:@alinea/suite@~0.6.3": "0.6.3", - "npm:@astrojs/node@^10.0.3": "10.0.4_astro@5.18.1__@types+node@24.12.0__ioredis@5.10.1__tsx@4.21.0__typescript@6.0.2__yaml@2.8.3_@types+node@24.12.0_ioredis@5.10.1_tsx@4.21.0_typescript@6.0.2_yaml@2.8.3", + "npm:@astrojs/node@^10.0.3": "10.0.4_astro@5.18.1__@types+node@24.12.2__ioredis@5.10.1__tsx@4.21.0__typescript@6.0.2__yaml@2.8.3_@types+node@24.12.2_ioredis@5.10.1_tsx@4.21.0_typescript@6.0.2_yaml@2.8.3", + "npm:@babel/core@^7.28.0": "7.29.0", + "npm:@babel/preset-react@^7.27.1": "7.28.5_@babel+core@7.29.0", "npm:@cfworker/json-schema@^4.1.1": "4.1.1", - "npm:@cloudflare/vitest-pool-workers@~0.8.31": "0.8.71_@vitest+runner@3.2.4_@vitest+snapshot@3.2.4_vitest@3.2.4__@types+node@24.12.0__tsx@4.21.0__yaml@2.8.3_@cloudflare+workers-types@4.20260403.1_@types+node@24.12.0_tsx@4.21.0_yaml@2.8.3", - "npm:@cloudflare/workers-types@^4.20250529.0": "4.20260403.1", - "npm:@cloudflare/workers-types@^4.20250906.0": "4.20260403.1", - "npm:@deno/astro-adapter@~0.3.2": "0.3.2_@opentelemetry+api@1.9.1_astro@5.18.1__@types+node@24.12.0__ioredis@5.10.1__tsx@4.21.0__typescript@6.0.2__yaml@2.8.3_@types+node@24.12.0_ioredis@5.10.1_tsx@4.21.0_typescript@6.0.2_yaml@2.8.3", + "npm:@cloudflare/vitest-pool-workers@~0.8.31": "0.8.71_@vitest+runner@3.2.4_@vitest+snapshot@3.2.4_vitest@3.2.4__@types+node@24.12.2__tsx@4.21.0__yaml@2.8.3_@cloudflare+workers-types@4.20260408.1_@types+node@24.12.2_tsx@4.21.0_yaml@2.8.3", + "npm:@cloudflare/workers-types@^4.20250529.0": "4.20260408.1", + "npm:@cloudflare/workers-types@^4.20250906.0": "4.20260408.1", + "npm:@deno/astro-adapter@~0.3.2": "0.3.2_@opentelemetry+api@1.9.1_astro@5.18.1__@types+node@24.12.2__ioredis@5.10.1__tsx@4.21.0__typescript@6.0.2__yaml@2.8.3_@types+node@24.12.2_ioredis@5.10.1_tsx@4.21.0_typescript@6.0.2_yaml@2.8.3", "npm:@fxts/core@^1.21.1": "1.26.0", "npm:@hongminhee/localtunnel@0.3": "0.3.0", - "npm:@inquirer/prompts@^7.8.4": "7.10.1_@types+node@24.12.0", - "npm:@jimp/core@^1.6.0": "1.6.0", - "npm:@jimp/wasm-webp@^1.6.0": "1.6.0", + "npm:@inquirer/prompts@^7.8.4": "7.10.1_@types+node@24.12.2", + "npm:@jimp/core@^1.6.0": "1.6.1", + "npm:@jimp/wasm-webp@^1.6.0": "1.6.1", "npm:@js-temporal/polyfill@~0.5.1": "0.5.1", "npm:@jsr/std__assert@0.226": "0.226.0", + "npm:@mjackson/node-fetch-server@0.7": "0.7.0", "npm:@multiformats/base-x@^4.0.1": "4.0.1", - "npm:@nestjs/common@^11.0.1": "11.1.17_reflect-metadata@0.2.2_rxjs@7.8.2", + "npm:@nestjs/common@^11.0.1": "11.1.18_reflect-metadata@0.2.2_rxjs@7.8.2", "npm:@opentelemetry/api@^1.9.0": "1.9.1", "npm:@opentelemetry/context-async-hooks@^2.5.0": "2.6.1_@opentelemetry+api@1.9.1", "npm:@opentelemetry/core@^2.5.0": "2.6.1_@opentelemetry+api@1.9.1", "npm:@opentelemetry/sdk-trace-base@^2.5.0": "2.6.1_@opentelemetry+api@1.9.1", "npm:@opentelemetry/semantic-conventions@^1.39.0": "1.40.0", "npm:@poppanator/http-constants@^1.1.1": "1.1.1", - "npm:@preact/signals@^2.2.1": "2.9.0_preact@10.29.0", - "npm:@preact/signals@^2.3.2": "2.9.0_preact@10.29.0", - "npm:@solidjs/start@^1.3.0": "1.3.2_vinxi@0.5.11__@emnapi+core@1.9.2__@emnapi+runtime@1.9.2__@types+node@24.12.0__ioredis@5.10.1__mysql2@3.20.0___@types+node@24.12.0__rolldown@1.0.0-rc.12___@emnapi+core@1.9.2___@emnapi+runtime@1.9.2__tsx@4.21.0__yaml@2.8.3_@emnapi+core@1.9.2_@emnapi+runtime@1.9.2_@types+node@24.12.0_ioredis@5.10.1_mysql2@3.20.0__@types+node@24.12.0_rolldown@1.0.0-rc.12__@emnapi+core@1.9.2__@emnapi+runtime@1.9.2_solid-js@1.9.12_tsx@4.21.0_vite@7.3.1__@types+node@24.12.0__tsx@4.21.0__yaml@2.8.3_yaml@2.8.3", + "npm:@preact/signals@^2.3.2": "2.9.0_preact@10.29.1", + "npm:@preact/signals@^2.5.1": "2.9.0_preact@10.29.1", + "npm:@prefresh/vite@^2.4.8": "2.4.12_preact@10.29.1_vite@7.3.2__@types+node@24.12.2__tsx@4.21.0__yaml@2.8.3", + "npm:@solidjs/start@^1.3.0": "1.3.2_vinxi@0.5.11__@emnapi+core@1.9.2__@emnapi+runtime@1.9.2__@types+node@24.12.2__ioredis@5.10.1__mysql2@3.20.0___@types+node@24.12.2__rolldown@1.0.0-rc.12___@emnapi+core@1.9.2___@emnapi+runtime@1.9.2__tsx@4.21.0__yaml@2.8.3_@emnapi+core@1.9.2_@emnapi+runtime@1.9.2_@types+node@24.12.2_ioredis@5.10.1_mysql2@3.20.0__@types+node@24.12.2_rolldown@1.0.0-rc.12__@emnapi+core@1.9.2__@emnapi+runtime@1.9.2_solid-js@1.9.12_tsx@4.21.0_vite@7.3.2__@types+node@24.12.2__tsx@4.21.0__yaml@2.8.3_yaml@2.8.3", "npm:@standard-schema/spec@^1.1.0": "1.1.0", - "npm:@sveltejs/kit@2": "2.55.0_@opentelemetry+api@1.9.1_@sveltejs+vite-plugin-svelte@7.0.0__svelte@5.55.1__vite@7.3.1___@types+node@24.12.0___tsx@4.21.0___yaml@2.8.3__@types+node@24.12.0__tsx@4.21.0__yaml@2.8.3_svelte@5.55.1_typescript@6.0.2_vite@7.3.1__@types+node@24.12.0__tsx@4.21.0__yaml@2.8.3_@types+node@24.12.0_tsx@4.21.0_yaml@2.8.3", + "npm:@sveltejs/kit@2": "2.57.0_@opentelemetry+api@1.9.1_@sveltejs+vite-plugin-svelte@7.0.0__svelte@5.55.2__vite@7.3.2___@types+node@24.12.2___tsx@4.21.0___yaml@2.8.3__@types+node@24.12.2__tsx@4.21.0__yaml@2.8.3_svelte@5.55.2_typescript@6.0.2_vite@7.3.2__@types+node@24.12.2__tsx@4.21.0__yaml@2.8.3_@types+node@24.12.2_tsx@4.21.0_yaml@2.8.3", + "npm:@types/amqplib@*": "0.10.8", "npm:@types/amqplib@~0.10.7": "0.10.8", "npm:@types/eslint@9": "9.6.1", "npm:@types/estree@^1.0.8": "1.0.8", - "npm:@types/node@^22.16.0": "22.19.15", - "npm:@types/node@^24.2.1": "24.12.0", - "npm:@typescript-eslint/parser@^8.49.0": "8.58.0_eslint@9.39.4_typescript@6.0.2", - "npm:@typescript-eslint/utils@8": "8.58.0_eslint@9.39.4_typescript@6.0.2", + "npm:@types/node@^22.16.0": "22.19.17", + "npm:@types/node@^24.2.1": "24.12.2", + "npm:@typescript-eslint/parser@^8.49.0": "8.58.1_eslint@9.39.4_typescript@6.0.2", + "npm:@typescript-eslint/utils@8": "8.58.1_eslint@9.39.4_typescript@6.0.2", "npm:amqplib@~0.10.9": "0.10.9", "npm:asn1js@^3.0.6": "3.0.7", "npm:asn1js@^3.0.7": "3.0.7", - "npm:astro@^5.17.3": "5.18.1_@types+node@24.12.0_ioredis@5.10.1_tsx@4.21.0_typescript@6.0.2_yaml@2.8.3", + "npm:astro@^5.17.3": "5.18.1_@types+node@24.12.2_ioredis@5.10.1_tsx@4.21.0_typescript@6.0.2_yaml@2.8.3", "npm:byte-encodings@^1.0.11": "1.0.11", "npm:chalk@^5.6.2": "5.6.2", "npm:cli-highlight@^2.1.11": "2.1.11", @@ -80,6 +112,9 @@ "npm:es-toolkit@^1.39.10": "1.45.1", "npm:es-toolkit@^1.42.0": "1.45.1", "npm:es-toolkit@^1.43.0": "1.45.1", + "npm:esbuild-wasm@~0.25.11": "0.25.12", + "npm:esbuild@0.25.7": "0.25.7", + "npm:esbuild@~0.25.5": "0.25.12", "npm:eslint@9": "9.39.4", "npm:express@4": "4.22.1", "npm:fast-check@^3.22.0": "3.23.2", @@ -88,25 +123,28 @@ "npm:fetch-mock@^12.5.2": "12.6.0", "npm:fetch-mock@^12.5.4": "12.6.0", "npm:h3@^1.15.0": "1.15.11", - "npm:hono@^4.8.3": "4.12.10", + "npm:hono@^4.8.3": "4.12.12", "npm:icojs@~0.19.5": "0.19.5_@jimp+custom@0.22.12", "npm:inquirer-toggle@^1.0.1": "1.0.1", - "npm:inquirer@^12.9.4": "12.11.1_@types+node@24.12.0", + "npm:inquirer@^12.9.4": "12.11.1_@types+node@24.12.2", "npm:ioredis@^5.8.2": "5.10.1", - "npm:jimp@^1.6.0": "1.6.0", + "npm:jimp@^1.6.0": "1.6.1", "npm:json-canon@^1.0.1": "1.0.1", "npm:json-preserve-indent@^1.1.3": "1.1.3", "npm:jsonld@9": "9.0.0", "npm:koa@2": "2.16.4", "npm:miniflare@^4.20250523.0": "4.20250906.0", - "npm:mysql2@^3.18.0": "3.20.0_@types+node@24.12.0", + "npm:mysql2@^3.18.0": "3.20.0_@types+node@24.12.2", "npm:ora@^8.2.0": "8.2.0", "npm:pkijs@^3.2.5": "3.4.0", "npm:pkijs@^3.3.3": "3.4.0", - "npm:postgres@^3.4.7": "3.4.8", - "npm:preact-render-to-string@^6.6.3": "6.6.5_preact@10.29.0", + "npm:postgres@^3.4.7": "3.4.9", + "npm:preact-render-to-string@^6.6.3": "6.6.7_preact@10.29.1", "npm:preact@10.19.6": "10.19.6", - "npm:preact@^10.27.2": "10.29.0", + "npm:preact@^10.27.2": "10.29.1", + "npm:preact@^10.28.2": "10.29.1", + "npm:preact@^10.28.3": "10.29.1", + "npm:rollup@^4.50.0": "4.60.1", "npm:shiki@^1.6.4": "1.29.2", "npm:smol-toml@^1.6.0": "1.6.1", "npm:srvx@~0.8.7": "0.8.16", @@ -116,13 +154,17 @@ "npm:uri-template-router@1": "1.0.0", "npm:url-template@^3.1.1": "3.1.1", "npm:valibot@^1.2.0": "1.3.1_typescript@6.0.2", - "npm:vite@^7.1.3": "7.3.1_@types+node@24.12.0_tsx@4.21.0_yaml@2.8.3", - "npm:vitest@3.2": "3.2.4_@types+node@24.12.0_tsx@4.21.0_yaml@2.8.3", - "npm:wrangler@^4.17.0": "4.35.0_@cloudflare+workers-types@4.20260403.1", - "npm:wrangler@^4.21.1": "4.35.0_@cloudflare+workers-types@4.20260403.1", + "npm:vite@^7.1.3": "7.3.2_@types+node@24.12.2_tsx@4.21.0_yaml@2.8.3", + "npm:vite@^7.1.4": "7.3.2_@types+node@24.12.2_tsx@4.21.0_yaml@2.8.3", + "npm:vitest@3.2": "3.2.4_@types+node@24.12.2_tsx@4.21.0_yaml@2.8.3", + "npm:wrangler@^4.17.0": "4.35.0_@cloudflare+workers-types@4.20260408.1", + "npm:wrangler@^4.21.1": "4.35.0_@cloudflare+workers-types@4.20260408.1", "npm:yaml@^2.8.1": "2.8.3" }, "jsr": { + "@alinea/suite@0.6.3": { + "integrity": "7d24a38729663b84d8a263d64ff7e3f8c72ac7cbb1db8ec5f414d0416b6b72e2" + }, "@david/console-static-text@0.3.0": { "integrity": "2dfb46ecee525755f7989f94ece30bba85bd8ffe3e8666abc1bf926e1ee0698d" }, @@ -148,25 +190,62 @@ "@david/which@0.4.1": { "integrity": "896a682b111f92ab866cc70c5b4afab2f5899d2f9bde31ed00203b9c250f225e" }, + "@deno/esbuild-plugin@1.2.1": { + "integrity": "df629467913adc1f960149fdfa3a3430ba8c20381c310fba096db244e6c3c9f6", + "dependencies": [ + "jsr:@deno/loader@~0.3.10", + "jsr:@std/path@^1.1.1", + "npm:esbuild@~0.25.5" + ] + }, + "@deno/loader@0.3.14": { + "integrity": "97bc63a6cc2d27a60bcdc953f588c5213331d866d44212eebb24cebfb9b011ca" + }, "@fresh/build-id@1.0.1": { "integrity": "12a2ec25fd52ae9ec68c26848a5696cd1c9b537f7c983c7e56e4fb1e7e816c20", "dependencies": [ "jsr:@std/encoding" ] }, - "@fresh/core@2.2.0": { - "integrity": "b3c00f82288a2c4c8ec85e4abb67b080b366ec5971860f2f2898eb281ea1a80f", + "@fresh/core@2.2.2": { + "integrity": "c34873df58457720f7b915a65fef6fe5cd7215f237cf4d1064d1925b320de96c", "dependencies": [ + "jsr:@deno/esbuild-plugin", "jsr:@fresh/build-id", + "jsr:@std/encoding", "jsr:@std/fmt@^1.0.8", "jsr:@std/fs@^1.0.19", "jsr:@std/html", "jsr:@std/http", + "jsr:@std/jsonc", + "jsr:@std/media-types", "jsr:@std/path@^1.1.2", + "jsr:@std/semver", + "jsr:@std/uuid", "npm:@opentelemetry/api", - "npm:@preact/signals@^2.2.1", + "npm:@preact/signals@^2.5.1", + "npm:esbuild-wasm", + "npm:esbuild@0.25.7", "npm:preact-render-to-string", - "npm:preact@^10.27.2" + "npm:preact@^10.28.2", + "npm:preact@^10.28.3" + ] + }, + "@fresh/plugin-vite@1.0.8": { + "integrity": "5780d842ed82e4cbccd93dd8ba2d54bf59dff5aee65921134aab15a4cd457c56", + "dependencies": [ + "jsr:@deno/loader@~0.3.2", + "jsr:@fresh/core@2", + "jsr:@fresh/core@^2.2.0", + "jsr:@std/dotenv", + "jsr:@std/fmt@^1.0.7", + "jsr:@std/path@1", + "npm:@babel/core", + "npm:@babel/preset-react", + "npm:@mjackson/node-fetch-server", + "npm:@prefresh/vite", + "npm:rollup", + "npm:vite@^7.1.4" ] }, "@hongminhee/localtunnel@0.3.0": { @@ -175,8 +254,8 @@ "jsr:@logtape/logtape@^1.0.4" ] }, - "@hono/hono@4.12.4": { - "integrity": "3b80b0165bbcaf8ddf23afc593e40416da8e9a27cb3dd460a1f04c7a44583030" + "@hono/hono@4.12.12": { + "integrity": "dc765178d38b5c4619b358062f6aa5514f7205bb0530b2823ff6265bec69c535" }, "@logtape/file@2.0.5": { "integrity": "368621b15b73fd63c137e47ae43411e350627683ce7e0b4492af3ccb159e098b", @@ -207,19 +286,53 @@ "jsr:@optique/core" ] }, + "@std/assert@0.224.0": { + "integrity": "8643233ec7aec38a940a8264a6e3eed9bfa44e7a71cc6b3c8874213ff401967f", + "dependencies": [ + "jsr:@std/fmt@0.224", + "jsr:@std/internal@0.224" + ] + }, + "@std/assert@0.226.0": { + "integrity": "0dfb5f7c7723c18cec118e080fec76ce15b4c31154b15ad2bd74822603ef75b3", + "dependencies": [ + "jsr:@std/internal@1" + ] + }, + "@std/assert@1.0.19": { + "integrity": "eaada96ee120cb980bc47e040f82814d786fe8162ecc53c91d8df60b8755991e", + "dependencies": [ + "jsr:@std/internal@^1.0.12" + ] + }, + "@std/async@1.2.0": { + "integrity": "c059c6f6d95ca7cc012ae8e8d7164d1697113d54b0b679e4372b354b11c2dee5" + }, "@std/bytes@1.0.6": { "integrity": "f6ac6adbd8ccd99314045f5703e23af0a68d7f7e58364b47d2c7f408aeb5820a" }, + "@std/dotenv@0.225.6": { + "integrity": "1d6f9db72f565bd26790fa034c26e45ecb260b5245417be76c2279e5734c421b" + }, "@std/encoding@1.0.10": { "integrity": "8783c6384a2d13abd5e9e87a7ae0520a30e9f56aeeaa3bdf910a3eaaf5c811a1" }, + "@std/fmt@0.224.0": { + "integrity": "e20e9a2312a8b5393272c26191c0a68eda8d2c4b08b046bad1673148f1d69851" + }, "@std/fmt@1.0.9": { "integrity": "2487343e8899fb2be5d0e3d35013e54477ada198854e52dd05ed0422eddcabe0" }, + "@std/fs@0.224.0": { + "integrity": "52a5ec89731ac0ca8f971079339286f88c571a4d61686acf75833f03a89d8e69", + "dependencies": [ + "jsr:@std/path@0.224" + ] + }, "@std/fs@1.0.23": { "integrity": "3ecbae4ce4fee03b180fa710caff36bb5adb66631c46a6460aaad49515565a37", "dependencies": [ - "jsr:@std/internal", + "jsr:@std/internal@^1.0.12", "jsr:@std/path@^1.1.4" ] }, @@ -227,7 +340,16 @@ "integrity": "4e2d693f474cae8c16a920fa5e15a3b72267b94b84667f11a50c6dd1cb18d35e" }, "@std/http@1.0.25": { - "integrity": "577b4252290af1097132812b339fffdd55fb0f4aeb98ff11bdbf67998aa17193" + "integrity": "577b4252290af1097132812b339fffdd55fb0f4aeb98ff11bdbf67998aa17193", + "dependencies": [ + "jsr:@std/encoding" + ] + }, + "@std/internal@0.224.0": { + "integrity": "afc50644f9cdf4495eeb80523a8f6d27226b4b36c45c7c195dfccad4b8509291", + "dependencies": [ + "jsr:@std/fmt@0.224" + ] }, "@std/internal@1.0.12": { "integrity": "972a634fd5bc34b242024402972cd5143eac68d8dffaca5eaa4dba30ce17b027" @@ -238,14 +360,47 @@ "jsr:@std/bytes" ] }, + "@std/json@1.0.3": { + "integrity": "97d5710996293a027b7aa5f0d1f4fa29f246f269e6b5597e08807613f37d426c" + }, + "@std/jsonc@1.0.2": { + "integrity": "909605dae3af22bd75b1cbda8d64a32cf1fd2cf6efa3f9e224aba6d22c0f44c7", + "dependencies": [ + "jsr:@std/json" + ] + }, + "@std/media-types@1.1.0": { + "integrity": "c9d093f0c05c3512932b330e3cc1fe1d627b301db33a4c2c2185c02471d6eaa4" + }, + "@std/path@0.224.0": { + "integrity": "55bca6361e5a6d158b9380e82d4981d82d338ec587de02951e2b7c3a24910ee6" + }, "@std/path@1.1.4": { "integrity": "1d2d43f39efb1b42f0b1882a25486647cb851481862dc7313390b2bb044314b5", "dependencies": [ - "jsr:@std/internal" + "jsr:@std/internal@^1.0.12" + ] + }, + "@std/semver@1.0.8": { + "integrity": "dc830e8b8b6a380c895d53fbfd1258dc253704ca57bbe1629ac65fd7830179b7" + }, + "@std/testing@0.224.0": { + "integrity": "371b8a929aa7132240d5dd766a439be8f780ef5c176ab194e0bcab72370c761e", + "dependencies": [ + "jsr:@std/assert@0.224", + "jsr:@std/fmt@0.224", + "jsr:@std/fs@0.224", + "jsr:@std/path@0.224" + ] + }, + "@std/uuid@1.1.0": { + "integrity": "6268db2ccf172849c9be80763354ca305d49ef4af41fe995623d44fcc3f7457c", + "dependencies": [ + "jsr:@std/bytes" ] }, - "@valibot/valibot@1.2.0": { - "integrity": "61c118a4d027ed55912caf381c78f0a178f335f46ad0c4bcb136498dc1ef2285" + "@valibot/valibot@1.3.1": { + "integrity": "635faaec9d32a25efca7b4614e7a07306cc03937bfd0679e05530d31081bc501" } }, "npm": { @@ -290,7 +445,7 @@ "vfile" ] }, - "@astrojs/node@10.0.4_astro@5.18.1__@types+node@24.12.0__ioredis@5.10.1__tsx@4.21.0__typescript@6.0.2__yaml@2.8.3_@types+node@24.12.0_ioredis@5.10.1_tsx@4.21.0_typescript@6.0.2_yaml@2.8.3": { + "@astrojs/node@10.0.4_astro@5.18.1__@types+node@24.12.2__ioredis@5.10.1__tsx@4.21.0__typescript@6.0.2__yaml@2.8.3_@types+node@24.12.2_ioredis@5.10.1_tsx@4.21.0_typescript@6.0.2_yaml@2.8.3": { "integrity": "sha512-7pVgiVSscQHRC2WqjlXcnbbcKMYp2GXrYpmuvdGg5zgA8J1lFm2vmwVhHZFuZK3Ik5PzoxiDROaEgoDGLbfhLw==", "dependencies": [ "@astrojs/internal-helpers@0.8.0", @@ -377,6 +532,12 @@ "jsesc" ] }, + "@babel/helper-annotate-as-pure@7.27.3": { + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "dependencies": [ + "@babel/types@7.29.0" + ] + }, "@babel/helper-compilation-targets@7.28.6": { "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", "dependencies": [ @@ -465,6 +626,51 @@ "@babel/helper-plugin-utils" ] }, + "@babel/plugin-transform-react-display-name@7.28.0_@babel+core@7.29.0": { + "integrity": "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-react-jsx-development@7.27.1_@babel+core@7.29.0": { + "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==", + "dependencies": [ + "@babel/core", + "@babel/plugin-transform-react-jsx" + ] + }, + "@babel/plugin-transform-react-jsx@7.28.6_@babel+core@7.29.0": { + "integrity": "sha512-61bxqhiRfAACulXSLd/GxqmAedUSrRZIu/cbaT18T1CetkTmtDN15it7i80ru4DVqRK1WMxQhXs+Lf9kajm5Ow==", + "dependencies": [ + "@babel/core", + "@babel/helper-annotate-as-pure", + "@babel/helper-module-imports@7.28.6", + "@babel/helper-plugin-utils", + "@babel/plugin-syntax-jsx", + "@babel/types@7.29.0" + ] + }, + "@babel/plugin-transform-react-pure-annotations@7.27.1_@babel+core@7.29.0": { + "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==", + "dependencies": [ + "@babel/core", + "@babel/helper-annotate-as-pure", + "@babel/helper-plugin-utils" + ] + }, + "@babel/preset-react@7.28.5_@babel+core@7.29.0": { + "integrity": "sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils", + "@babel/helper-validator-option", + "@babel/plugin-transform-react-display-name", + "@babel/plugin-transform-react-jsx", + "@babel/plugin-transform-react-jsx-development", + "@babel/plugin-transform-react-pure-annotations" + ] + }, "@babel/template@7.28.6": { "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", "dependencies": [ @@ -533,7 +739,7 @@ "workerd" ] }, - "@cloudflare/vitest-pool-workers@0.8.71_@vitest+runner@3.2.4_@vitest+snapshot@3.2.4_vitest@3.2.4__@types+node@24.12.0__tsx@4.21.0__yaml@2.8.3_@cloudflare+workers-types@4.20260403.1_@types+node@24.12.0_tsx@4.21.0_yaml@2.8.3": { + "@cloudflare/vitest-pool-workers@0.8.71_@vitest+runner@3.2.4_@vitest+snapshot@3.2.4_vitest@3.2.4__@types+node@24.12.2__tsx@4.21.0__yaml@2.8.3_@cloudflare+workers-types@4.20260408.1_@types+node@24.12.2_tsx@4.21.0_yaml@2.8.3": { "integrity": "sha512-keu2HCLQfRNwbmLBCDXJgCFpANTaYnQpE01fBOo4CNwiWHUT7SZGN7w64RKiSWRHyYppStXBuE5Ng7F42+flpg==", "dependencies": [ "@vitest/runner", @@ -573,8 +779,8 @@ "os": ["win32"], "cpu": ["x64"] }, - "@cloudflare/workers-types@4.20260403.1": { - "integrity": "sha512-p6oSNt3yUwcxSoXZ7qCog7+kgQbkSx1Beoci7TMb/xbRF05VR0cO/p1XUE2SLHZ7IgSIc3tNMpFKa0L0fa3Lzg==" + "@cloudflare/workers-types@4.20260408.1": { + "integrity": "sha512-kE1tKfHUyIldsj3ea2XEqvLRHkDwc83YM7nar6SS5+cj81IoAFR/OZNDwZWHb6vx+pC31PBJGtROlfZzsgxudQ==" }, "@colors/colors@1.5.0": { "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==" @@ -585,7 +791,7 @@ "@jridgewell/trace-mapping@0.3.9" ] }, - "@deno/astro-adapter@0.3.2_@opentelemetry+api@1.9.1_astro@5.18.1__@types+node@24.12.0__ioredis@5.10.1__tsx@4.21.0__typescript@6.0.2__yaml@2.8.3_@types+node@24.12.0_ioredis@5.10.1_tsx@4.21.0_typescript@6.0.2_yaml@2.8.3": { + "@deno/astro-adapter@0.3.2_@opentelemetry+api@1.9.1_astro@5.18.1__@types+node@24.12.2__ioredis@5.10.1__tsx@4.21.0__typescript@6.0.2__yaml@2.8.3_@types+node@24.12.2_ioredis@5.10.1_tsx@4.21.0_typescript@6.0.2_yaml@2.8.3": { "integrity": "sha512-nN0kQGobRs2XE3R+O/DWYQanEWpteJNsIf5TD65787qFEw2CrqkFNcNolZFJiKUF/2Y/TKyOLRjMS3F6auECVg==", "dependencies": [ "@opentelemetry/api", @@ -641,6 +847,11 @@ "os": ["aix"], "cpu": ["ppc64"] }, + "@esbuild/aix-ppc64@0.25.7": { + "integrity": "sha512-uD0kKFHh6ETr8TqEtaAcV+dn/2qnYbH/+8wGEdY70Qf7l1l/jmBUbrmQqwiPKAQE6cOQ7dTj6Xr0HzQDGHyceQ==", + "os": ["aix"], + "cpu": ["ppc64"] + }, "@esbuild/aix-ppc64@0.27.7": { "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==", "os": ["aix"], @@ -656,6 +867,11 @@ "os": ["android"], "cpu": ["arm64"] }, + "@esbuild/android-arm64@0.25.7": { + "integrity": "sha512-p0ohDnwyIbAtztHTNUTzN5EGD/HJLs1bwysrOPgSdlIA6NDnReoVfoCyxG6W1d85jr2X80Uq5KHftyYgaK9LPQ==", + "os": ["android"], + "cpu": ["arm64"] + }, "@esbuild/android-arm64@0.27.7": { "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==", "os": ["android"], @@ -671,6 +887,11 @@ "os": ["android"], "cpu": ["arm"] }, + "@esbuild/android-arm@0.25.7": { + "integrity": "sha512-Jhuet0g1k9rAJHrXGIh7sFknFuT4sfytYZpZpuZl7YKDhnPByVAm5oy2LEBmMbuYf3ejWVYCc2seX81Mk+madA==", + "os": ["android"], + "cpu": ["arm"] + }, "@esbuild/android-arm@0.27.7": { "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==", "os": ["android"], @@ -686,6 +907,11 @@ "os": ["android"], "cpu": ["x64"] }, + "@esbuild/android-x64@0.25.7": { + "integrity": "sha512-mMxIJFlSgVK23HSsII3ZX9T2xKrBCDGyk0qiZnIW10LLFFtZLkFD6imZHu7gUo2wkNZwS9Yj3mOtZD3ZPcjCcw==", + "os": ["android"], + "cpu": ["x64"] + }, "@esbuild/android-x64@0.27.7": { "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==", "os": ["android"], @@ -701,6 +927,11 @@ "os": ["darwin"], "cpu": ["arm64"] }, + "@esbuild/darwin-arm64@0.25.7": { + "integrity": "sha512-jyOFLGP2WwRwxM8F1VpP6gcdIJc8jq2CUrURbbTouJoRO7XCkU8GdnTDFIHdcifVBT45cJlOYsZ1kSlfbKjYUQ==", + "os": ["darwin"], + "cpu": ["arm64"] + }, "@esbuild/darwin-arm64@0.27.7": { "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==", "os": ["darwin"], @@ -716,6 +947,11 @@ "os": ["darwin"], "cpu": ["x64"] }, + "@esbuild/darwin-x64@0.25.7": { + "integrity": "sha512-m9bVWqZCwQ1BthruifvG64hG03zzz9gE2r/vYAhztBna1/+qXiHyP9WgnyZqHgGeXoimJPhAmxfbeU+nMng6ZA==", + "os": ["darwin"], + "cpu": ["x64"] + }, "@esbuild/darwin-x64@0.27.7": { "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==", "os": ["darwin"], @@ -731,6 +967,11 @@ "os": ["freebsd"], "cpu": ["arm64"] }, + "@esbuild/freebsd-arm64@0.25.7": { + "integrity": "sha512-Bss7P4r6uhr3kDzRjPNEnTm/oIBdTPRNQuwaEFWT/uvt6A1YzK/yn5kcx5ZxZ9swOga7LqeYlu7bDIpDoS01bA==", + "os": ["freebsd"], + "cpu": ["arm64"] + }, "@esbuild/freebsd-arm64@0.27.7": { "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==", "os": ["freebsd"], @@ -746,6 +987,11 @@ "os": ["freebsd"], "cpu": ["x64"] }, + "@esbuild/freebsd-x64@0.25.7": { + "integrity": "sha512-S3BFyjW81LXG7Vqmr37ddbThrm3A84yE7ey/ERBlK9dIiaWgrjRlre3pbG7txh1Uaxz8N7wGGQXmC9zV+LIpBQ==", + "os": ["freebsd"], + "cpu": ["x64"] + }, "@esbuild/freebsd-x64@0.27.7": { "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==", "os": ["freebsd"], @@ -761,6 +1007,11 @@ "os": ["linux"], "cpu": ["arm64"] }, + "@esbuild/linux-arm64@0.25.7": { + "integrity": "sha512-HfQZQqrNOfS1Okn7PcsGUqHymL1cWGBslf78dGvtrj8q7cN3FkapFgNA4l/a5lXDwr7BqP2BSO6mz9UremNPbg==", + "os": ["linux"], + "cpu": ["arm64"] + }, "@esbuild/linux-arm64@0.27.7": { "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==", "os": ["linux"], @@ -776,6 +1027,11 @@ "os": ["linux"], "cpu": ["arm"] }, + "@esbuild/linux-arm@0.25.7": { + "integrity": "sha512-JZMIci/1m5vfQuhKoFXogCKVYVfYQmoZJg8vSIMR4TUXbF+0aNlfXH3DGFEFMElT8hOTUF5hisdZhnrZO/bkDw==", + "os": ["linux"], + "cpu": ["arm"] + }, "@esbuild/linux-arm@0.27.7": { "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==", "os": ["linux"], @@ -791,6 +1047,11 @@ "os": ["linux"], "cpu": ["ia32"] }, + "@esbuild/linux-ia32@0.25.7": { + "integrity": "sha512-9Jex4uVpdeofiDxnwHRgen+j6398JlX4/6SCbbEFEXN7oMO2p0ueLN+e+9DdsdPLUdqns607HmzEFnxwr7+5wQ==", + "os": ["linux"], + "cpu": ["ia32"] + }, "@esbuild/linux-ia32@0.27.7": { "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==", "os": ["linux"], @@ -806,6 +1067,11 @@ "os": ["linux"], "cpu": ["loong64"] }, + "@esbuild/linux-loong64@0.25.7": { + "integrity": "sha512-TG1KJqjBlN9IHQjKVUYDB0/mUGgokfhhatlay8aZ/MSORMubEvj/J1CL8YGY4EBcln4z7rKFbsH+HeAv0d471w==", + "os": ["linux"], + "cpu": ["loong64"] + }, "@esbuild/linux-loong64@0.27.7": { "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==", "os": ["linux"], @@ -821,6 +1087,11 @@ "os": ["linux"], "cpu": ["mips64el"] }, + "@esbuild/linux-mips64el@0.25.7": { + "integrity": "sha512-Ty9Hj/lx7ikTnhOfaP7ipEm/ICcBv94i/6/WDg0OZ3BPBHhChsUbQancoWYSO0WNkEiSW5Do4febTTy4x1qYQQ==", + "os": ["linux"], + "cpu": ["mips64el"] + }, "@esbuild/linux-mips64el@0.27.7": { "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==", "os": ["linux"], @@ -836,6 +1107,11 @@ "os": ["linux"], "cpu": ["ppc64"] }, + "@esbuild/linux-ppc64@0.25.7": { + "integrity": "sha512-MrOjirGQWGReJl3BNQ58BLhUBPpWABnKrnq8Q/vZWWwAB1wuLXOIxS2JQ1LT3+5T+3jfPh0tyf5CpbyQHqnWIQ==", + "os": ["linux"], + "cpu": ["ppc64"] + }, "@esbuild/linux-ppc64@0.27.7": { "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==", "os": ["linux"], @@ -851,6 +1127,11 @@ "os": ["linux"], "cpu": ["riscv64"] }, + "@esbuild/linux-riscv64@0.25.7": { + "integrity": "sha512-9pr23/pqzyqIZEZmQXnFyqp3vpa+KBk5TotfkzGMqpw089PGm0AIowkUppHB9derQzqniGn3wVXgck19+oqiOw==", + "os": ["linux"], + "cpu": ["riscv64"] + }, "@esbuild/linux-riscv64@0.27.7": { "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==", "os": ["linux"], @@ -866,6 +1147,11 @@ "os": ["linux"], "cpu": ["s390x"] }, + "@esbuild/linux-s390x@0.25.7": { + "integrity": "sha512-4dP11UVGh9O6Y47m8YvW8eoA3r8qL2toVZUbBKyGta8j6zdw1cn9F/Rt59/Mhv0OgY68pHIMjGXWOUaykCnx+w==", + "os": ["linux"], + "cpu": ["s390x"] + }, "@esbuild/linux-s390x@0.27.7": { "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==", "os": ["linux"], @@ -881,6 +1167,11 @@ "os": ["linux"], "cpu": ["x64"] }, + "@esbuild/linux-x64@0.25.7": { + "integrity": "sha512-ghJMAJTdw/0uhz7e7YnpdX1xVn7VqA0GrWrAO2qKMuqbvgHT2VZiBv1BQ//VcHsPir4wsL3P2oPggfKPzTKoCA==", + "os": ["linux"], + "cpu": ["x64"] + }, "@esbuild/linux-x64@0.27.7": { "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==", "os": ["linux"], @@ -896,6 +1187,11 @@ "os": ["netbsd"], "cpu": ["arm64"] }, + "@esbuild/netbsd-arm64@0.25.7": { + "integrity": "sha512-bwXGEU4ua45+u5Ci/a55B85KWaDSRS8NPOHtxy2e3etDjbz23wlry37Ffzapz69JAGGc4089TBo+dGzydQmydg==", + "os": ["netbsd"], + "cpu": ["arm64"] + }, "@esbuild/netbsd-arm64@0.27.7": { "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==", "os": ["netbsd"], @@ -911,6 +1207,11 @@ "os": ["netbsd"], "cpu": ["x64"] }, + "@esbuild/netbsd-x64@0.25.7": { + "integrity": "sha512-tUZRvLtgLE5OyN46sPSYlgmHoBS5bx2URSrgZdW1L1teWPYVmXh+QN/sKDqkzBo/IHGcKcHLKDhBeVVkO7teEA==", + "os": ["netbsd"], + "cpu": ["x64"] + }, "@esbuild/netbsd-x64@0.27.7": { "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==", "os": ["netbsd"], @@ -926,6 +1227,11 @@ "os": ["openbsd"], "cpu": ["arm64"] }, + "@esbuild/openbsd-arm64@0.25.7": { + "integrity": "sha512-bTJ50aoC+WDlDGBReWYiObpYvQfMjBNlKztqoNUL0iUkYtwLkBQQeEsTq/I1KyjsKA5tyov6VZaPb8UdD6ci6Q==", + "os": ["openbsd"], + "cpu": ["arm64"] + }, "@esbuild/openbsd-arm64@0.27.7": { "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==", "os": ["openbsd"], @@ -941,6 +1247,11 @@ "os": ["openbsd"], "cpu": ["x64"] }, + "@esbuild/openbsd-x64@0.25.7": { + "integrity": "sha512-TA9XfJrgzAipFUU895jd9j2SyDh9bbNkK2I0gHcvqb/o84UeQkBpi/XmYX3cO1q/9hZokdcDqQxIi6uLVrikxg==", + "os": ["openbsd"], + "cpu": ["x64"] + }, "@esbuild/openbsd-x64@0.27.7": { "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==", "os": ["openbsd"], @@ -951,6 +1262,11 @@ "os": ["openharmony"], "cpu": ["arm64"] }, + "@esbuild/openharmony-arm64@0.25.7": { + "integrity": "sha512-5VTtExUrWwHHEUZ/N+rPlHDwVFQ5aME7vRJES8+iQ0xC/bMYckfJ0l2n3yGIfRoXcK/wq4oXSItZAz5wslTKGw==", + "os": ["openharmony"], + "cpu": ["arm64"] + }, "@esbuild/openharmony-arm64@0.27.7": { "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==", "os": ["openharmony"], @@ -966,6 +1282,11 @@ "os": ["sunos"], "cpu": ["x64"] }, + "@esbuild/sunos-x64@0.25.7": { + "integrity": "sha512-umkbn7KTxsexhv2vuuJmj9kggd4AEtL32KodkJgfhNOHMPtQ55RexsaSrMb+0+jp9XL4I4o2y91PZauVN4cH3A==", + "os": ["sunos"], + "cpu": ["x64"] + }, "@esbuild/sunos-x64@0.27.7": { "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==", "os": ["sunos"], @@ -981,6 +1302,11 @@ "os": ["win32"], "cpu": ["arm64"] }, + "@esbuild/win32-arm64@0.25.7": { + "integrity": "sha512-j20JQGP/gz8QDgzl5No5Gr4F6hurAZvtkFxAKhiv2X49yi/ih8ECK4Y35YnjlMogSKJk931iNMcd35BtZ4ghfw==", + "os": ["win32"], + "cpu": ["arm64"] + }, "@esbuild/win32-arm64@0.27.7": { "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==", "os": ["win32"], @@ -996,6 +1322,11 @@ "os": ["win32"], "cpu": ["ia32"] }, + "@esbuild/win32-ia32@0.25.7": { + "integrity": "sha512-4qZ6NUfoiiKZfLAXRsvFkA0hoWVM+1y2bSHXHkpdLAs/+r0LgwqYohmfZCi985c6JWHhiXP30mgZawn/XrqAkQ==", + "os": ["win32"], + "cpu": ["ia32"] + }, "@esbuild/win32-ia32@0.27.7": { "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==", "os": ["win32"], @@ -1011,6 +1342,11 @@ "os": ["win32"], "cpu": ["x64"] }, + "@esbuild/win32-x64@0.25.7": { + "integrity": "sha512-FaPsAHTwm+1Gfvn37Eg3E5HIpfR3i6x1AIcla/MkqAIupD4BW3MrSeUqfoTzwwJhk3WE2/KqUn4/eenEJC76VA==", + "os": ["win32"], + "cpu": ["x64"] + }, "@esbuild/win32-x64@0.27.7": { "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==", "os": ["win32"], @@ -1413,38 +1749,38 @@ "@inquirer/ansi@1.0.2": { "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==" }, - "@inquirer/checkbox@4.3.2_@types+node@24.12.0": { + "@inquirer/checkbox@4.3.2_@types+node@24.12.2": { "integrity": "sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==", "dependencies": [ "@inquirer/ansi", - "@inquirer/core@10.3.2_@types+node@24.12.0", + "@inquirer/core@10.3.2_@types+node@24.12.2", "@inquirer/figures", - "@inquirer/type@3.0.10_@types+node@24.12.0", - "@types/node@24.12.0", + "@inquirer/type@3.0.10_@types+node@24.12.2", + "@types/node@24.12.2", "yoctocolors-cjs" ], "optionalPeers": [ - "@types/node@24.12.0" + "@types/node@24.12.2" ] }, - "@inquirer/confirm@5.1.21_@types+node@24.12.0": { + "@inquirer/confirm@5.1.21_@types+node@24.12.2": { "integrity": "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==", "dependencies": [ - "@inquirer/core@10.3.2_@types+node@24.12.0", - "@inquirer/type@3.0.10_@types+node@24.12.0", - "@types/node@24.12.0" + "@inquirer/core@10.3.2_@types+node@24.12.2", + "@inquirer/type@3.0.10_@types+node@24.12.2", + "@types/node@24.12.2" ], "optionalPeers": [ - "@types/node@24.12.0" + "@types/node@24.12.2" ] }, - "@inquirer/core@10.3.2_@types+node@24.12.0": { + "@inquirer/core@10.3.2_@types+node@24.12.2": { "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", "dependencies": [ "@inquirer/ansi", "@inquirer/figures", - "@inquirer/type@3.0.10_@types+node@24.12.0", - "@types/node@24.12.0", + "@inquirer/type@3.0.10_@types+node@24.12.2", + "@types/node@24.12.2", "cli-width", "mute-stream@2.0.0", "signal-exit", @@ -1452,7 +1788,7 @@ "yoctocolors-cjs" ], "optionalPeers": [ - "@types/node@24.12.0" + "@types/node@24.12.2" ] }, "@inquirer/core@8.2.4": { @@ -1461,7 +1797,7 @@ "@inquirer/figures", "@inquirer/type@1.5.5", "@types/mute-stream", - "@types/node@20.19.37", + "@types/node@20.19.39", "@types/wrap-ansi", "ansi-escapes", "cli-spinners", @@ -1473,79 +1809,79 @@ "wrap-ansi@6.2.0" ] }, - "@inquirer/editor@4.2.23_@types+node@24.12.0": { + "@inquirer/editor@4.2.23_@types+node@24.12.2": { "integrity": "sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==", "dependencies": [ - "@inquirer/core@10.3.2_@types+node@24.12.0", + "@inquirer/core@10.3.2_@types+node@24.12.2", "@inquirer/external-editor", - "@inquirer/type@3.0.10_@types+node@24.12.0", - "@types/node@24.12.0" + "@inquirer/type@3.0.10_@types+node@24.12.2", + "@types/node@24.12.2" ], "optionalPeers": [ - "@types/node@24.12.0" + "@types/node@24.12.2" ] }, - "@inquirer/expand@4.0.23_@types+node@24.12.0": { + "@inquirer/expand@4.0.23_@types+node@24.12.2": { "integrity": "sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==", "dependencies": [ - "@inquirer/core@10.3.2_@types+node@24.12.0", - "@inquirer/type@3.0.10_@types+node@24.12.0", - "@types/node@24.12.0", + "@inquirer/core@10.3.2_@types+node@24.12.2", + "@inquirer/type@3.0.10_@types+node@24.12.2", + "@types/node@24.12.2", "yoctocolors-cjs" ], "optionalPeers": [ - "@types/node@24.12.0" + "@types/node@24.12.2" ] }, - "@inquirer/external-editor@1.0.3_@types+node@24.12.0": { + "@inquirer/external-editor@1.0.3_@types+node@24.12.2": { "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", "dependencies": [ - "@types/node@24.12.0", + "@types/node@24.12.2", "chardet", "iconv-lite@0.7.2" ], "optionalPeers": [ - "@types/node@24.12.0" + "@types/node@24.12.2" ] }, "@inquirer/figures@1.0.15": { "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==" }, - "@inquirer/input@4.3.1_@types+node@24.12.0": { + "@inquirer/input@4.3.1_@types+node@24.12.2": { "integrity": "sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==", "dependencies": [ - "@inquirer/core@10.3.2_@types+node@24.12.0", - "@inquirer/type@3.0.10_@types+node@24.12.0", - "@types/node@24.12.0" + "@inquirer/core@10.3.2_@types+node@24.12.2", + "@inquirer/type@3.0.10_@types+node@24.12.2", + "@types/node@24.12.2" ], "optionalPeers": [ - "@types/node@24.12.0" + "@types/node@24.12.2" ] }, - "@inquirer/number@3.0.23_@types+node@24.12.0": { + "@inquirer/number@3.0.23_@types+node@24.12.2": { "integrity": "sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==", "dependencies": [ - "@inquirer/core@10.3.2_@types+node@24.12.0", - "@inquirer/type@3.0.10_@types+node@24.12.0", - "@types/node@24.12.0" + "@inquirer/core@10.3.2_@types+node@24.12.2", + "@inquirer/type@3.0.10_@types+node@24.12.2", + "@types/node@24.12.2" ], "optionalPeers": [ - "@types/node@24.12.0" + "@types/node@24.12.2" ] }, - "@inquirer/password@4.0.23_@types+node@24.12.0": { + "@inquirer/password@4.0.23_@types+node@24.12.2": { "integrity": "sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==", "dependencies": [ "@inquirer/ansi", - "@inquirer/core@10.3.2_@types+node@24.12.0", - "@inquirer/type@3.0.10_@types+node@24.12.0", - "@types/node@24.12.0" + "@inquirer/core@10.3.2_@types+node@24.12.2", + "@inquirer/type@3.0.10_@types+node@24.12.2", + "@types/node@24.12.2" ], "optionalPeers": [ - "@types/node@24.12.0" + "@types/node@24.12.2" ] }, - "@inquirer/prompts@7.10.1_@types+node@24.12.0": { + "@inquirer/prompts@7.10.1_@types+node@24.12.2": { "integrity": "sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==", "dependencies": [ "@inquirer/checkbox", @@ -1558,49 +1894,49 @@ "@inquirer/rawlist", "@inquirer/search", "@inquirer/select", - "@types/node@24.12.0" + "@types/node@24.12.2" ], "optionalPeers": [ - "@types/node@24.12.0" + "@types/node@24.12.2" ] }, - "@inquirer/rawlist@4.1.11_@types+node@24.12.0": { + "@inquirer/rawlist@4.1.11_@types+node@24.12.2": { "integrity": "sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==", "dependencies": [ - "@inquirer/core@10.3.2_@types+node@24.12.0", - "@inquirer/type@3.0.10_@types+node@24.12.0", - "@types/node@24.12.0", + "@inquirer/core@10.3.2_@types+node@24.12.2", + "@inquirer/type@3.0.10_@types+node@24.12.2", + "@types/node@24.12.2", "yoctocolors-cjs" ], "optionalPeers": [ - "@types/node@24.12.0" + "@types/node@24.12.2" ] }, - "@inquirer/search@3.2.2_@types+node@24.12.0": { + "@inquirer/search@3.2.2_@types+node@24.12.2": { "integrity": "sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==", "dependencies": [ - "@inquirer/core@10.3.2_@types+node@24.12.0", + "@inquirer/core@10.3.2_@types+node@24.12.2", "@inquirer/figures", - "@inquirer/type@3.0.10_@types+node@24.12.0", - "@types/node@24.12.0", + "@inquirer/type@3.0.10_@types+node@24.12.2", + "@types/node@24.12.2", "yoctocolors-cjs" ], "optionalPeers": [ - "@types/node@24.12.0" + "@types/node@24.12.2" ] }, - "@inquirer/select@4.4.2_@types+node@24.12.0": { + "@inquirer/select@4.4.2_@types+node@24.12.2": { "integrity": "sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==", "dependencies": [ "@inquirer/ansi", - "@inquirer/core@10.3.2_@types+node@24.12.0", + "@inquirer/core@10.3.2_@types+node@24.12.2", "@inquirer/figures", - "@inquirer/type@3.0.10_@types+node@24.12.0", - "@types/node@24.12.0", + "@inquirer/type@3.0.10_@types+node@24.12.2", + "@types/node@24.12.2", "yoctocolors-cjs" ], "optionalPeers": [ - "@types/node@24.12.0" + "@types/node@24.12.2" ] }, "@inquirer/type@1.5.5": { @@ -1609,13 +1945,13 @@ "mute-stream@1.0.0" ] }, - "@inquirer/type@3.0.10_@types+node@24.12.0": { + "@inquirer/type@3.0.10_@types+node@24.12.2": { "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", "dependencies": [ - "@types/node@24.12.0" + "@types/node@24.12.2" ], "optionalPeers": [ - "@types/node@24.12.0" + "@types/node@24.12.2" ] }, "@ioredis/commands@1.5.1": { @@ -1659,15 +1995,15 @@ "tinycolor2" ] }, - "@jimp/core@1.6.0": { - "integrity": "sha512-EQQlKU3s9QfdJqiSrZWNTxBs3rKXgO2W+GxNXDtwchF3a4IqxDheFX1ti+Env9hdJXDiYLp2jTRjlxhPthsk8w==", + "@jimp/core@1.6.1": { + "integrity": "sha512-+BoKC5G6hkrSy501zcJ2EpfnllP+avPevcBfRcZe/CW+EwEfY6X1EZ8QWyT7NpDIvEEJb1fdJnMMfUnFkxmw9A==", "dependencies": [ "@jimp/file-ops", "@jimp/types", - "@jimp/utils@1.6.0", + "@jimp/utils@1.6.1", "await-to-js", "exif-parser", - "file-type@16.5.4", + "file-type@21.3.4", "mime@3.0.0" ] }, @@ -1677,155 +2013,155 @@ "@jimp/core@0.22.12" ] }, - "@jimp/diff@1.6.0": { - "integrity": "sha512-+yUAQ5gvRC5D1WHYxjBHZI7JBRusGGSLf8AmPRPCenTzh4PA+wZ1xv2+cYqQwTfQHU5tXYOhA0xDytfHUf1Zyw==", + "@jimp/diff@1.6.1": { + "integrity": "sha512-YkKDPdHjLgo1Api3+Bhc0GLAygldlpt97NfOKoNg1U6IUNXA6X2MgosCjPfSBiSvJvrrz1fsIR+/4cfYXBI/HQ==", "dependencies": [ "@jimp/plugin-resize", "@jimp/types", - "@jimp/utils@1.6.0", + "@jimp/utils@1.6.1", "pixelmatch@5.3.0" ] }, - "@jimp/file-ops@1.6.0": { - "integrity": "sha512-Dx/bVDmgnRe1AlniRpCKrGRm5YvGmUwbDzt+MAkgmLGf+jvBT75hmMEZ003n9HQI/aPnm/YKnXjg/hOpzNCpHQ==" + "@jimp/file-ops@1.6.1": { + "integrity": "sha512-T+gX6osHjprbDRad0/B71Evyre7ZdVY1z/gFGEG9Z8KOtZPKboWvPeP2UjbZYWQLy9UKCPQX1FNAnDiOPkJL7w==" }, - "@jimp/js-bmp@1.6.0": { - "integrity": "sha512-FU6Q5PC/e3yzLyBDXupR3SnL3htU7S3KEs4e6rjDP6gNEOXRFsWs6YD3hXuXd50jd8ummy+q2WSwuGkr8wi+Gw==", + "@jimp/js-bmp@1.6.1": { + "integrity": "sha512-xzWzNT4/u5zGrTT3Tme9sGU7YzIKxi13+BCQwLqACbt5DXf9SAfdzRkopZQnmDko+6In5nqaT89Gjs43/WdnYQ==", "dependencies": [ - "@jimp/core@1.6.0", + "@jimp/core@1.6.1", "@jimp/types", - "@jimp/utils@1.6.0", + "@jimp/utils@1.6.1", "bmp-ts" ] }, - "@jimp/js-gif@1.6.0": { - "integrity": "sha512-N9CZPHOrJTsAUoWkWZstLPpwT5AwJ0wge+47+ix3++SdSL/H2QzyMqxbcDYNFe4MoI5MIhATfb0/dl/wmX221g==", + "@jimp/js-gif@1.6.1": { + "integrity": "sha512-YjY2W26rQa05XhanYhRZ7dingCiNN+T2Ymb1JiigIbABY0B28wHE3v3Cf1/HZPWGu0hOg36ylaKgV5KxF2M58w==", "dependencies": [ - "@jimp/core@1.6.0", + "@jimp/core@1.6.1", "@jimp/types", "gifwrap", "omggif" ] }, - "@jimp/js-jpeg@1.6.0": { - "integrity": "sha512-6vgFDqeusblf5Pok6B2DUiMXplH8RhIKAryj1yn+007SIAQ0khM1Uptxmpku/0MfbClx2r7pnJv9gWpAEJdMVA==", + "@jimp/js-jpeg@1.6.1": { + "integrity": "sha512-HT9H3yOmlOFzYmdI15IYdfy6ggQhSRIaHeA+OTJSEORXBqEo97sUZu/DsgHIcX5NJ7TkJBTgZ9BZXsV6UbsyMg==", "dependencies": [ - "@jimp/core@1.6.0", + "@jimp/core@1.6.1", "@jimp/types", "jpeg-js" ] }, - "@jimp/js-png@1.6.0": { - "integrity": "sha512-AbQHScy3hDDgMRNfG0tPjL88AV6qKAILGReIa3ATpW5QFjBKpisvUaOqhzJ7Reic1oawx3Riyv152gaPfqsBVg==", + "@jimp/js-png@1.6.1": { + "integrity": "sha512-SZ/KVhI5UjcSzzlXsXdIi/LhJ7UShf2NkMOtVrbZQcGzsqNtynAelrOXeoTxcanfVqmNhAoVHg8yR2cYoqrYjA==", "dependencies": [ - "@jimp/core@1.6.0", + "@jimp/core@1.6.1", "@jimp/types", "pngjs@7.0.0" ] }, - "@jimp/js-tiff@1.6.0": { - "integrity": "sha512-zhReR8/7KO+adijj3h0ZQUOiun3mXUv79zYEAKvE0O+rP7EhgtKvWJOZfRzdZSNv0Pu1rKtgM72qgtwe2tFvyw==", + "@jimp/js-tiff@1.6.1": { + "integrity": "sha512-jDG/eJquID1M4MBlKMmDRBmz2TpXMv7TUyu2nIRUxhlUc2ogC82T+VQUkca9GJH1BBJ9dx5sSE5dGkWNjIbZxw==", "dependencies": [ - "@jimp/core@1.6.0", + "@jimp/core@1.6.1", "@jimp/types", "utif2" ] }, - "@jimp/plugin-blit@1.6.0": { - "integrity": "sha512-M+uRWl1csi7qilnSK8uxK4RJMSuVeBiO1AY0+7APnfUbQNZm6hCe0CCFv1Iyw1D/Dhb8ph8fQgm5mwM0eSxgVA==", + "@jimp/plugin-blit@1.6.1": { + "integrity": "sha512-MwnI7C7K81uWddY9FLw1fCOIy6SsPIUftUz36Spt7jisCn8/40DhQMlSxpxTNelnZb/2SnloFimQfRZAmHLOqQ==", "dependencies": [ "@jimp/types", - "@jimp/utils@1.6.0", + "@jimp/utils@1.6.1", "zod@3.25.76" ] }, - "@jimp/plugin-blur@1.6.0": { - "integrity": "sha512-zrM7iic1OTwUCb0g/rN5y+UnmdEsT3IfuCXCJJNs8SZzP0MkZ1eTvuwK9ZidCuMo4+J3xkzCidRwYXB5CyGZTw==", + "@jimp/plugin-blur@1.6.1": { + "integrity": "sha512-lIo7Tzp5jQu30EFFSK/phXANK3citKVEjepDjQ6ljHoIFtuMRrnybnmI2Md24ulvWlDaz+hh3n6qrMb8ydwhZQ==", "dependencies": [ - "@jimp/core@1.6.0", - "@jimp/utils@1.6.0" + "@jimp/core@1.6.1", + "@jimp/utils@1.6.1" ] }, - "@jimp/plugin-circle@1.6.0": { - "integrity": "sha512-xt1Gp+LtdMKAXfDp3HNaG30SPZW6AQ7dtAtTnoRKorRi+5yCJjKqXRgkewS5bvj8DEh87Ko1ydJfzqS3P2tdWw==", + "@jimp/plugin-circle@1.6.1": { + "integrity": "sha512-kK1PavY6cKHNNKce37vdV4Tmpc1/zDKngGoeOV3j+EMatoHFZUinV3s6F9aWryPs3A0xhCLZgdJ6Zeea1d5LCQ==", "dependencies": [ "@jimp/types", "zod@3.25.76" ] }, - "@jimp/plugin-color@1.6.0": { - "integrity": "sha512-J5q8IVCpkBsxIXM+45XOXTrsyfblyMZg3a9eAo0P7VPH4+CrvyNQwaYatbAIamSIN1YzxmO3DkIZXzRjFSz1SA==", + "@jimp/plugin-color@1.6.1": { + "integrity": "sha512-LtUN1vAP+LRlZAtTNVhDRSiXx+26Kbz3zJaG6a5k59gQ95jgT5mknnF8lxkHcqJthM4MEk3/tPxkdJpEybyF/A==", "dependencies": [ - "@jimp/core@1.6.0", + "@jimp/core@1.6.1", "@jimp/types", - "@jimp/utils@1.6.0", + "@jimp/utils@1.6.1", "tinycolor2", "zod@3.25.76" ] }, - "@jimp/plugin-contain@1.6.0": { - "integrity": "sha512-oN/n+Vdq/Qg9bB4yOBOxtY9IPAtEfES8J1n9Ddx+XhGBYT1/QTU/JYkGaAkIGoPnyYvmLEDqMz2SGihqlpqfzQ==", + "@jimp/plugin-contain@1.6.1": { + "integrity": "sha512-m0qhrfA8jkTqretGv4w+T/ADFR4GwBpE0sCOC2uJ0dzr44/ddOMsIdrpi89kabqYiPYIrxkgdCVCLm3zn1Vkkg==", "dependencies": [ - "@jimp/core@1.6.0", + "@jimp/core@1.6.1", "@jimp/plugin-blit", "@jimp/plugin-resize", "@jimp/types", - "@jimp/utils@1.6.0", + "@jimp/utils@1.6.1", "zod@3.25.76" ] }, - "@jimp/plugin-cover@1.6.0": { - "integrity": "sha512-Iow0h6yqSC269YUJ8HC3Q/MpCi2V55sMlbkkTTx4zPvd8mWZlC0ykrNDeAy9IJegrQ7v5E99rJwmQu25lygKLA==", + "@jimp/plugin-cover@1.6.1": { + "integrity": "sha512-hZytnsth0zoll6cPf434BrT+p/v569Wr5tyO6Dp0dH1IDPhzhB5F38sZGMLDo7bzQiN9JFVB3fxkcJ/WYCJ3Mg==", "dependencies": [ - "@jimp/core@1.6.0", + "@jimp/core@1.6.1", "@jimp/plugin-crop", "@jimp/plugin-resize", "@jimp/types", "zod@3.25.76" ] }, - "@jimp/plugin-crop@1.6.0": { - "integrity": "sha512-KqZkEhvs+21USdySCUDI+GFa393eDIzbi1smBqkUPTE+pRwSWMAf01D5OC3ZWB+xZsNla93BDS9iCkLHA8wang==", + "@jimp/plugin-crop@1.6.1": { + "integrity": "sha512-EerRSLlclXyKDnYc/H9w/1amZW7b7v3OGi/VlerPd2M/pAu5X8TkyYWtfqYCXnNp1Ixtd8oCo9zGfY9zoXT4rg==", "dependencies": [ - "@jimp/core@1.6.0", + "@jimp/core@1.6.1", "@jimp/types", - "@jimp/utils@1.6.0", + "@jimp/utils@1.6.1", "zod@3.25.76" ] }, - "@jimp/plugin-displace@1.6.0": { - "integrity": "sha512-4Y10X9qwr5F+Bo5ME356XSACEF55485j5nGdiyJ9hYzjQP9nGgxNJaZ4SAOqpd+k5sFaIeD7SQ0Occ26uIng5Q==", + "@jimp/plugin-displace@1.6.1": { + "integrity": "sha512-K07QVl7xQwIfD6KfxRV/c3E9e7ZBXxUXdWuvoTWcKHL2qV48MOF5Nqbz/aJW4ThnQARIsxvYlZjPFiqkCjlU+g==", "dependencies": [ "@jimp/types", - "@jimp/utils@1.6.0", + "@jimp/utils@1.6.1", "zod@3.25.76" ] }, - "@jimp/plugin-dither@1.6.0": { - "integrity": "sha512-600d1RxY0pKwgyU0tgMahLNKsqEcxGdbgXadCiVCoGd6V6glyCvkNrnnwC0n5aJ56Htkj88PToSdF88tNVZEEQ==", + "@jimp/plugin-dither@1.6.1": { + "integrity": "sha512-+2V+GCV2WycMoX1/z977TkZ8Zq/4MVSKElHYatgUqtwXMi2fDK2gKYU2g9V39IqFvTJsTIsK0+58VFz/ROBVew==", "dependencies": [ "@jimp/types" ] }, - "@jimp/plugin-fisheye@1.6.0": { - "integrity": "sha512-E5QHKWSCBFtpgZarlmN3Q6+rTQxjirFqo44ohoTjzYVrDI6B6beXNnPIThJgPr0Y9GwfzgyarKvQuQuqCnnfbA==", + "@jimp/plugin-fisheye@1.6.1": { + "integrity": "sha512-XtS5ZyoZ0vxZxJ6gkqI63SivhtI58vX95foMPM+cyzYkRsJXMOYCr8DScxF5bp4Xr003NjYm/P+7+08tibwzHA==", "dependencies": [ "@jimp/types", - "@jimp/utils@1.6.0", + "@jimp/utils@1.6.1", "zod@3.25.76" ] }, - "@jimp/plugin-flip@1.6.0": { - "integrity": "sha512-/+rJVDuBIVOgwoyVkBjUFHtP+wmW0r+r5OQ2GpatQofToPVbJw1DdYWXlwviSx7hvixTWLKVgRWQ5Dw862emDg==", + "@jimp/plugin-flip@1.6.1": { + "integrity": "sha512-ws38W/sGj7LobNRayQ83garxiktOyWxM5vO/y4a/2cy9v65SLEUzVkrj+oeAaUSSObdz4HcCEla7XtGlnAGAaA==", "dependencies": [ "@jimp/types", "zod@3.25.76" ] }, - "@jimp/plugin-hash@1.6.0": { - "integrity": "sha512-wWzl0kTpDJgYVbZdajTf+4NBSKvmI3bRI8q6EH9CVeIHps9VWVsUvEyb7rpbcwVLWYuzDtP2R0lTT6WeBNQH9Q==", + "@jimp/plugin-hash@1.6.1": { + "integrity": "sha512-sZt6ZcMX6i8vFWb4GYnw0pR/o9++ef0dTVcboTB5B/g7nrxCODIB4wfEkJ/YqZM5wUvol77K1qeS0/rVO6z21A==", "dependencies": [ - "@jimp/core@1.6.0", + "@jimp/core@1.6.1", "@jimp/js-bmp", "@jimp/js-jpeg", "@jimp/js-png", @@ -1833,21 +2169,21 @@ "@jimp/plugin-color", "@jimp/plugin-resize", "@jimp/types", - "@jimp/utils@1.6.0", + "@jimp/utils@1.6.1", "any-base" ] }, - "@jimp/plugin-mask@1.6.0": { - "integrity": "sha512-Cwy7ExSJMZszvkad8NV8o/Z92X2kFUFM8mcDAhNVxU0Q6tA0op2UKRJY51eoK8r6eds/qak3FQkXakvNabdLnA==", + "@jimp/plugin-mask@1.6.1": { + "integrity": "sha512-SIG0/FcmEj3tkwFxc7fAGLO8o4uNzMpSOdQOhbCgxefQKq5wOVMk9BQx/sdMPBwtMLr9WLq0GzLA/rk6t2v20A==", "dependencies": [ "@jimp/types", "zod@3.25.76" ] }, - "@jimp/plugin-print@1.6.0": { - "integrity": "sha512-zarTIJi8fjoGMSI/M3Xh5yY9T65p03XJmPsuNet19K/Q7mwRU6EV2pfj+28++2PV2NJ+htDF5uecAlnGyxFN2A==", + "@jimp/plugin-print@1.6.1": { + "integrity": "sha512-BYVz/X3Xzv8XYilVeDy11NOp0h7BTDjlOtu0BekIFHP1yHVd24AXNzbOy52XlzYZWQ0Dl36HOHEpl/nSNrzc6w==", "dependencies": [ - "@jimp/core@1.6.0", + "@jimp/core@1.6.1", "@jimp/js-jpeg", "@jimp/js-png", "@jimp/plugin-blit", @@ -1859,45 +2195,45 @@ "zod@3.25.76" ] }, - "@jimp/plugin-quantize@1.6.0": { - "integrity": "sha512-EmzZ/s9StYQwbpG6rUGBCisc3f64JIhSH+ncTJd+iFGtGo0YvSeMdAd+zqgiHpfZoOL54dNavZNjF4otK+mvlg==", + "@jimp/plugin-quantize@1.6.1": { + "integrity": "sha512-J2En9PLURfP+vwYDtuZ9T8yBW6BWYZBScydAjRiPBmJfEhTcNQqiiQODrZf7EqbbX/Sy5H6dAeRiqkgoV9N6Ww==", "dependencies": [ "image-q", "zod@3.25.76" ] }, - "@jimp/plugin-resize@1.6.0": { - "integrity": "sha512-uSUD1mqXN9i1SGSz5ov3keRZ7S9L32/mAQG08wUwZiEi5FpbV0K8A8l1zkazAIZi9IJzLlTauRNU41Mi8IF9fA==", + "@jimp/plugin-resize@1.6.1": { + "integrity": "sha512-CLkrtJoIz2HdWnpYiN6p8KYcPc00rCH/SUu6o+lfZL05Q4uhecJlnvXuj9x+U6mDn3ldPmJj6aZqMHuUJzdVqg==", "dependencies": [ - "@jimp/core@1.6.0", + "@jimp/core@1.6.1", "@jimp/types", "zod@3.25.76" ] }, - "@jimp/plugin-rotate@1.6.0": { - "integrity": "sha512-JagdjBLnUZGSG4xjCLkIpQOZZ3Mjbg8aGCCi4G69qR+OjNpOeGI7N2EQlfK/WE8BEHOW5vdjSyglNqcYbQBWRw==", + "@jimp/plugin-rotate@1.6.1": { + "integrity": "sha512-nOjVjbbj705B02ksysKnh0POAwEBXZtJ9zQ5qC+X7Tavl3JNn+P3BzQovbBxLPSbUSld6XID9z5ijin4PtOAUg==", "dependencies": [ - "@jimp/core@1.6.0", + "@jimp/core@1.6.1", "@jimp/plugin-crop", "@jimp/plugin-resize", "@jimp/types", - "@jimp/utils@1.6.0", + "@jimp/utils@1.6.1", "zod@3.25.76" ] }, - "@jimp/plugin-threshold@1.6.0": { - "integrity": "sha512-M59m5dzLoHOVWdM41O8z9SyySzcDn43xHseOH0HavjsfQsT56GGCC4QzU1banJidbUrePhzoEdS42uFE8Fei8w==", + "@jimp/plugin-threshold@1.6.1": { + "integrity": "sha512-JOKv9F8s6tnVLf4sB/2fF0F339EFnHvgEdFYugO6VhowKLsap0pEZmLyE/DlRnYtIj2RddHZVxVMp/eKJ04l2Q==", "dependencies": [ - "@jimp/core@1.6.0", + "@jimp/core@1.6.1", "@jimp/plugin-color", "@jimp/plugin-hash", "@jimp/types", - "@jimp/utils@1.6.0", + "@jimp/utils@1.6.1", "zod@3.25.76" ] }, - "@jimp/types@1.6.0": { - "integrity": "sha512-7UfRsiKo5GZTAATxm2qQ7jqmUXP0DxTArztllTcYdyw6Xi5oT4RaoXynVtCD4UyLK5gJgkZJcwonoijrhYFKfg==", + "@jimp/types@1.6.1": { + "integrity": "sha512-leI7YbveTNi565m910XgIOwXyuu074H5qazAD1357HImJSv2hqxnWXpwxQbadGWZ7goZRYBDZy5lpqud0p7q5w==", "dependencies": [ "zod@3.25.76" ] @@ -1908,15 +2244,15 @@ "regenerator-runtime" ] }, - "@jimp/utils@1.6.0": { - "integrity": "sha512-gqFTGEosKbOkYF/WFj26jMHOI5OH2jeP1MmC/zbK6BF6VJBf8rIC5898dPfSzZEbSA0wbbV5slbntWVc5PKLFA==", + "@jimp/utils@1.6.1": { + "integrity": "sha512-veFPRd93FCnS7AgmCkPgARVGoDRrJ9cm1ujuNyA+UfQ5VKbED2002sm5XfFLFwTsKC8j04heTrwe+tU1dluXOw==", "dependencies": [ "@jimp/types", "tinycolor2" ] }, - "@jimp/wasm-webp@1.6.0": { - "integrity": "sha512-P0zUpK6n2XIAn8bt0F6rhSn1+FgteBTrL+TBb6Oqw8v5qEDJoNYkd6LlfZYN8YwtRBTBdZ8GFnWsg2Sar+qOkA==", + "@jimp/wasm-webp@1.6.1": { + "integrity": "sha512-t+Wqkde4xQHP/UZ4bDiDo3pbhFz32E7FvQCUkuFdJDmEDl6gPCs6LQiQVBmumUQYTeVLiLtLzlM9j8s7yF0sXQ==", "dependencies": [ "@jsquash/webp", "zod@3.25.76" @@ -2005,6 +2341,9 @@ ], "bin": true }, + "@mjackson/node-fetch-server@0.7.0": { + "integrity": "sha512-un8diyEBKU3BTVj3GzlTPA1kIjCkGdD+AMYQy31Gf9JCkfoZzwgJ79GUtHrF2BN3XPNMLpubbzPcxys+a3uZEw==" + }, "@multiformats/base-x@4.0.1": { "integrity": "sha512-eMk0b9ReBbV23xXU693TAIrLyeO5iTgBZGSJfpqriG8UkYvr/hC9u9pyMlAakDNHWmbhMZCDs6KQO0jzKD8OTw==" }, @@ -2016,10 +2355,10 @@ "@tybys/wasm-util" ] }, - "@nestjs/common@11.1.17_reflect-metadata@0.2.2_rxjs@7.8.2": { - "integrity": "sha512-hLODw5Abp8OQgA+mUO4tHou4krKgDtUcM9j5Ihxncst9XeyxYBTt2bwZm4e4EQr5E352S4Fyy6V3iFx9ggxKAg==", + "@nestjs/common@11.1.18_reflect-metadata@0.2.2_rxjs@7.8.2": { + "integrity": "sha512-0sLq8Z+TIjLnz1Tqp0C/x9BpLbqpt1qEu0VcH4/fkE0y3F5JxhfK1AdKQ/SPbKhKgwqVDoY4gS8GQr2G6ujaWg==", "dependencies": [ - "file-type@21.3.2", + "file-type@21.3.4", "iterare", "load-esm", "reflect-metadata", @@ -2234,11 +2573,35 @@ "@preact/signals-core@1.14.1": { "integrity": "sha512-vxPpfXqrwUe9lpjqfYNjAF/0RF/eFGeLgdJzdmIIZjpOnTmGmAB4BjWone562mJGMRP4frU6iZ6ei3PDsu52Ng==" }, - "@preact/signals@2.9.0_preact@10.29.0": { + "@preact/signals@2.9.0_preact@10.29.1": { "integrity": "sha512-hYrY0KyUqkDgOl1qba/JGn6y81pXnurn21PMaxfcMwdncdZ3M/oVdmpTvEnsGjh48dIwDVc7bjWHqIsngSjYug==", "dependencies": [ "@preact/signals-core", - "preact@10.29.0" + "preact@10.29.1" + ] + }, + "@prefresh/babel-plugin@0.5.3": { + "integrity": "sha512-57LX2SHs4BX2s1IwCjNzTE2OJeEepRCNf1VTEpbNcUyHfMO68eeOWGDIt4ob9aYlW6PEWZ1SuwNikuoIXANDtQ==" + }, + "@prefresh/core@1.5.9_preact@10.29.1": { + "integrity": "sha512-IKBKCPaz34OFVC+adiQ2qaTF5qdztO2/4ZPf4KsRTgjKosWqxVXmEbxCiUydYZRY8GVie+DQlKzQr9gt6HQ+EQ==", + "dependencies": [ + "preact@10.29.1" + ] + }, + "@prefresh/utils@1.2.1": { + "integrity": "sha512-vq/sIuN5nYfYzvyayXI4C2QkprfNaHUQ9ZX+3xLD8nL3rWyzpxOm1+K7RtMbhd+66QcaISViK7amjnheQ/4WZw==" + }, + "@prefresh/vite@2.4.12_preact@10.29.1_vite@7.3.2__@types+node@24.12.2__tsx@4.21.0__yaml@2.8.3": { + "integrity": "sha512-FY1fzXpUjiuosznMV0YM7XAOPZjB5FIdWS0W24+XnlxYkt9hNAwwsiKYn+cuTEoMtD/ZVazS5QVssBr9YhpCQA==", + "dependencies": [ + "@babel/core", + "@prefresh/babel-plugin", + "@prefresh/core", + "@prefresh/utils", + "@rollup/pluginutils@4.2.1", + "preact@10.29.1", + "vite@7.3.2_@types+node@24.12.2_tsx@4.21.0_yaml@2.8.3" ] }, "@quansync/fs@1.0.0": { @@ -2339,7 +2702,7 @@ "@rollup/plugin-commonjs@29.0.2_rollup@4.60.1": { "integrity": "sha512-S/ggWH1LU7jTyi9DxZOKyxpVd4hF/OZ0JrEbeLjXk/DFXwRny0tjD2c992zOUYQobLrVkRVMDdmHP16HKP7GRg==", "dependencies": [ - "@rollup/pluginutils", + "@rollup/pluginutils@5.3.0_rollup@4.60.1", "commondir", "estree-walker@2.0.2", "fdir", @@ -2355,7 +2718,7 @@ "@rollup/plugin-inject@5.0.5_rollup@4.60.1": { "integrity": "sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==", "dependencies": [ - "@rollup/pluginutils", + "@rollup/pluginutils@5.3.0_rollup@4.60.1", "estree-walker@2.0.2", "magic-string", "rollup" @@ -2367,7 +2730,7 @@ "@rollup/plugin-json@6.1.0_rollup@4.60.1": { "integrity": "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==", "dependencies": [ - "@rollup/pluginutils", + "@rollup/pluginutils@5.3.0_rollup@4.60.1", "rollup" ], "optionalPeers": [ @@ -2377,7 +2740,7 @@ "@rollup/plugin-node-resolve@16.0.3_rollup@4.60.1": { "integrity": "sha512-lUYM3UBGuM93CnMPG1YocWu7X802BrNF3jW2zny5gQyLQgRFJhV1Sq0Zi74+dh/6NBx1DxFC4b4GXg9wUCG5Qg==", "dependencies": [ - "@rollup/pluginutils", + "@rollup/pluginutils@5.3.0_rollup@4.60.1", "@types/resolve", "deepmerge", "is-module", @@ -2391,7 +2754,7 @@ "@rollup/plugin-replace@6.0.3_rollup@4.60.1": { "integrity": "sha512-J4RZarRvQAm5IF0/LwUUg+obsm+xZhYnbMXmXROyoSE1ATJe3oXSb9L5MMppdxP2ylNSjv6zFBwKYjcKMucVfA==", "dependencies": [ - "@rollup/pluginutils", + "@rollup/pluginutils@5.3.0_rollup@4.60.1", "magic-string", "rollup" ], @@ -2411,6 +2774,13 @@ "rollup" ] }, + "@rollup/pluginutils@4.2.1": { + "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", + "dependencies": [ + "estree-walker@2.0.2", + "picomatch@2.3.2" + ] + }, "@rollup/pluginutils@5.3.0_rollup@4.60.1": { "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", "dependencies": [ @@ -2648,7 +3018,7 @@ "@sindresorhus/merge-streams@4.0.0": { "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==" }, - "@solidjs/start@1.3.2_vinxi@0.5.11__@emnapi+core@1.9.2__@emnapi+runtime@1.9.2__@types+node@24.12.0__ioredis@5.10.1__mysql2@3.20.0___@types+node@24.12.0__rolldown@1.0.0-rc.12___@emnapi+core@1.9.2___@emnapi+runtime@1.9.2__tsx@4.21.0__yaml@2.8.3_@emnapi+core@1.9.2_@emnapi+runtime@1.9.2_@types+node@24.12.0_ioredis@5.10.1_mysql2@3.20.0__@types+node@24.12.0_rolldown@1.0.0-rc.12__@emnapi+core@1.9.2__@emnapi+runtime@1.9.2_solid-js@1.9.12_tsx@4.21.0_vite@7.3.1__@types+node@24.12.0__tsx@4.21.0__yaml@2.8.3_yaml@2.8.3": { + "@solidjs/start@1.3.2_vinxi@0.5.11__@emnapi+core@1.9.2__@emnapi+runtime@1.9.2__@types+node@24.12.2__ioredis@5.10.1__mysql2@3.20.0___@types+node@24.12.2__rolldown@1.0.0-rc.12___@emnapi+core@1.9.2___@emnapi+runtime@1.9.2__tsx@4.21.0__yaml@2.8.3_@emnapi+core@1.9.2_@emnapi+runtime@1.9.2_@types+node@24.12.2_ioredis@5.10.1_mysql2@3.20.0__@types+node@24.12.2_rolldown@1.0.0-rc.12__@emnapi+core@1.9.2__@emnapi+runtime@1.9.2_solid-js@1.9.12_tsx@4.21.0_vite@7.3.2__@types+node@24.12.2__tsx@4.21.0__yaml@2.8.3_yaml@2.8.3": { "integrity": "sha512-tasDl3utVbtP0rr4InB3ntBIFV2upvEiFrOOCkRrAA3yBfjx9elpxnc94sJQXo65PNYdAAAkPIC6h93vLrtwHg==", "dependencies": [ "@tanstack/server-functions-plugin", @@ -2681,8 +3051,8 @@ "acorn@8.16.0" ] }, - "@sveltejs/kit@2.55.0_@opentelemetry+api@1.9.1_@sveltejs+vite-plugin-svelte@7.0.0__svelte@5.55.1__vite@7.3.1___@types+node@24.12.0___tsx@4.21.0___yaml@2.8.3__@types+node@24.12.0__tsx@4.21.0__yaml@2.8.3_svelte@5.55.1_typescript@6.0.2_vite@7.3.1__@types+node@24.12.0__tsx@4.21.0__yaml@2.8.3_@types+node@24.12.0_tsx@4.21.0_yaml@2.8.3": { - "integrity": "sha512-MdFRjevVxmAknf2NbaUkDF16jSIzXMWd4Nfah0Qp8TtQVoSp3bV4jKt8mX7z7qTUTWvgSaxtR0EG5WJf53gcuA==", + "@sveltejs/kit@2.57.0_@opentelemetry+api@1.9.1_@sveltejs+vite-plugin-svelte@7.0.0__svelte@5.55.2__vite@7.3.2___@types+node@24.12.2___tsx@4.21.0___yaml@2.8.3__@types+node@24.12.2__tsx@4.21.0__yaml@2.8.3_svelte@5.55.2_typescript@6.0.2_vite@7.3.2__@types+node@24.12.2__tsx@4.21.0__yaml@2.8.3_@types+node@24.12.2_tsx@4.21.0_yaml@2.8.3": { + "integrity": "sha512-TMiqCTy9ZW4KBHvmTgeWU/hF6jcFpeMgR+9ekE06uhhGnbUZ7wpIY6l1Uk4ThRzlWYJnCVfzmtVNaHaDjaSiSg==", "dependencies": [ "@opentelemetry/api", "@standard-schema/spec", @@ -2700,7 +3070,7 @@ "sirv", "svelte", "typescript", - "vite@7.3.1_@types+node@24.12.0_tsx@4.21.0_yaml@2.8.3" + "vite@7.3.2_@types+node@24.12.2_tsx@4.21.0_yaml@2.8.3" ], "optionalPeers": [ "@opentelemetry/api", @@ -2708,18 +3078,18 @@ ], "bin": true }, - "@sveltejs/vite-plugin-svelte@7.0.0_svelte@5.55.1_vite@7.3.1__@types+node@24.12.0__tsx@4.21.0__yaml@2.8.3_@types+node@24.12.0_tsx@4.21.0_yaml@2.8.3": { + "@sveltejs/vite-plugin-svelte@7.0.0_svelte@5.55.2_vite@7.3.2__@types+node@24.12.2__tsx@4.21.0__yaml@2.8.3_@types+node@24.12.2_tsx@4.21.0_yaml@2.8.3": { "integrity": "sha512-ILXmxC7HAsnkK2eslgPetrqqW1BKSL7LktsFgqzNj83MaivMGZzluWq32m25j2mDOjmSKX7GGWahePhuEs7P/g==", "dependencies": [ "deepmerge", "magic-string", "obug", "svelte", - "vite@7.3.1_@types+node@24.12.0_tsx@4.21.0_yaml@2.8.3", - "vitefu@1.1.3_vite@7.3.1__@types+node@24.12.0__tsx@4.21.0__yaml@2.8.3_@types+node@24.12.0_tsx@4.21.0_yaml@2.8.3" + "vite@7.3.2_@types+node@24.12.2_tsx@4.21.0_yaml@2.8.3", + "vitefu@1.1.3_vite@7.3.2__@types+node@24.12.2__tsx@4.21.0__yaml@2.8.3_@types+node@24.12.2_tsx@4.21.0_yaml@2.8.3" ] }, - "@tanstack/directive-functions-plugin@1.121.21_vite@7.3.1__@types+node@24.12.0__tsx@4.21.0__yaml@2.8.3_@types+node@24.12.0_tsx@4.21.0_yaml@2.8.3": { + "@tanstack/directive-functions-plugin@1.121.21_vite@7.3.2__@types+node@24.12.2__tsx@4.21.0__yaml@2.8.3_@types+node@24.12.2_tsx@4.21.0_yaml@2.8.3": { "integrity": "sha512-B9z/HbF7gJBaRHieyX7f2uQ4LpLLAVAEutBZipH6w+CYD6RHRJvSVPzECGHF7icFhNWTiJQL2QR6K07s59yzEw==", "dependencies": [ "@babel/code-frame@7.26.2", @@ -2729,7 +3099,7 @@ "@tanstack/router-utils", "babel-dead-code-elimination", "tiny-invariant", - "vite@7.3.1_@types+node@24.12.0_tsx@4.21.0_yaml@2.8.3" + "vite@7.3.2_@types+node@24.12.2_tsx@4.21.0_yaml@2.8.3" ] }, "@tanstack/router-utils@1.161.6": { @@ -2746,7 +3116,7 @@ "tinyglobby" ] }, - "@tanstack/server-functions-plugin@1.121.21_@types+node@24.12.0_tsx@4.21.0_vite@7.3.1__@types+node@24.12.0__tsx@4.21.0__yaml@2.8.3_yaml@2.8.3": { + "@tanstack/server-functions-plugin@1.121.21_@types+node@24.12.2_tsx@4.21.0_vite@7.3.2__@types+node@24.12.2__tsx@4.21.0__yaml@2.8.3_yaml@2.8.3": { "integrity": "sha512-a05fzK+jBGacsSAc1vE8an7lpBh4H0PyIEcivtEyHLomgSeElAJxm9E2It/0nYRZ5Lh23m0okbhzJNaYWZpAOg==", "dependencies": [ "@babel/code-frame@7.26.2", @@ -2780,7 +3150,7 @@ "@types/amqplib@0.10.8": { "integrity": "sha512-vtDp8Pk1wsE/AuQ8/Rgtm6KUZYqcnTgNvEHwzCkX8rL7AGsC6zqAfKAAJhUZXFhM/Pp++tbnUHiam/8vVpPztA==", "dependencies": [ - "@types/node@24.12.0" + "@types/node@24.12.2" ] }, "@types/babel__core@7.20.5": { @@ -2877,7 +3247,7 @@ "@types/mute-stream@0.0.4": { "integrity": "sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==", "dependencies": [ - "@types/node@24.12.0" + "@types/node@24.12.2" ] }, "@types/nlcst@2.0.3": { @@ -2889,20 +3259,20 @@ "@types/node@16.9.1": { "integrity": "sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==" }, - "@types/node@20.19.37": { - "integrity": "sha512-8kzdPJ3FsNsVIurqBs7oodNnCEVbni9yUEkaHbgptDACOPW04jimGagZ51E6+lXUwJjgnBw+hyko/lkFWCldqw==", + "@types/node@20.19.39": { + "integrity": "sha512-orrrD74MBUyK8jOAD/r0+lfa1I2MO6I+vAkmAWzMYbCcgrN4lCrmK52gRFQq/JRxfYPfonkr4b0jcY7Olqdqbw==", "dependencies": [ "undici-types@6.21.0" ] }, - "@types/node@22.19.15": { - "integrity": "sha512-F0R/h2+dsy5wJAUe3tAU6oqa2qbWY5TpNfL/RGmo1y38hiyO1w3x2jPtt76wmuaJI4DQnOBu21cNXQ2STIUUWg==", + "@types/node@22.19.17": { + "integrity": "sha512-wGdMcf+vPYM6jikpS/qhg6WiqSV/OhG+jeeHT/KlVqxYfD40iYJf9/AE1uQxVWFvU7MipKRkRv8NSHiCGgPr8Q==", "dependencies": [ "undici-types@6.21.0" ] }, - "@types/node@24.12.0": { - "integrity": "sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ==", + "@types/node@24.12.2": { + "integrity": "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==", "dependencies": [ "undici-types@7.16.0" ] @@ -2919,8 +3289,8 @@ "@types/wrap-ansi@3.0.0": { "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==" }, - "@typescript-eslint/parser@8.58.0_eslint@9.39.4_typescript@6.0.2": { - "integrity": "sha512-rLoGZIf9afaRBYsPUMtvkDWykwXwUPL60HebR4JgTI8mxfFe2cQTu3AGitANp4b9B2QlVru6WzjgB2IzJKiCSA==", + "@typescript-eslint/parser@8.58.1_eslint@9.39.4_typescript@6.0.2": { + "integrity": "sha512-gGkiNMPqerb2cJSVcruigx9eHBlLG14fSdPdqMoOcBfh+vvn4iCq2C8MzUB89PrxOXk0y3GZ1yIWb9aOzL93bw==", "dependencies": [ "@typescript-eslint/scope-manager", "@typescript-eslint/types", @@ -2931,8 +3301,8 @@ "typescript" ] }, - "@typescript-eslint/project-service@8.58.0_typescript@6.0.2": { - "integrity": "sha512-8Q/wBPWLQP1j16NxoPNIKpDZFMaxl7yWIoqXWYeWO+Bbd2mjgvoF0dxP2jKZg5+x49rgKdf7Ck473M8PC3V9lg==", + "@typescript-eslint/project-service@8.58.1_typescript@6.0.2": { + "integrity": "sha512-gfQ8fk6cxhtptek+/8ZIqw8YrRW5048Gug8Ts5IYcMLCw18iUgrZAEY/D7s4hkI0FxEfGakKuPK/XUMPzPxi5g==", "dependencies": [ "@typescript-eslint/tsconfig-utils", "@typescript-eslint/types", @@ -2940,24 +3310,24 @@ "typescript" ] }, - "@typescript-eslint/scope-manager@8.58.0": { - "integrity": "sha512-W1Lur1oF50FxSnNdGp3Vs6P+yBRSmZiw4IIjEeYxd8UQJwhUF0gDgDD/W/Tgmh73mxgEU3qX0Bzdl/NGuSPEpQ==", + "@typescript-eslint/scope-manager@8.58.1": { + "integrity": "sha512-TPYUEqJK6avLcEjumWsIuTpuYODTTDAtoMdt8ZZa93uWMTX13Nb8L5leSje1NluammvU+oI3QRr5lLXPgihX3w==", "dependencies": [ "@typescript-eslint/types", "@typescript-eslint/visitor-keys" ] }, - "@typescript-eslint/tsconfig-utils@8.58.0_typescript@6.0.2": { - "integrity": "sha512-doNSZEVJsWEu4htiVC+PR6NpM+pa+a4ClH9INRWOWCUzMst/VA9c4gXq92F8GUD1rwhNvRLkgjfYtFXegXQF7A==", + "@typescript-eslint/tsconfig-utils@8.58.1_typescript@6.0.2": { + "integrity": "sha512-JAr2hOIct2Q+qk3G+8YFfqkqi7sC86uNryT+2i5HzMa2MPjw4qNFvtjnw1IiA1rP7QhNKVe21mSSLaSjwA1Olw==", "dependencies": [ "typescript" ] }, - "@typescript-eslint/types@8.58.0": { - "integrity": "sha512-O9CjxypDT89fbHxRfETNoAnHj/i6IpRK0CvbVN3qibxlLdo5p5hcLmUuCCrHMpxiWSwKyI8mCP7qRNYuOJ0Uww==" + "@typescript-eslint/types@8.58.1": { + "integrity": "sha512-io/dV5Aw5ezwzfPBBWLoT+5QfVtP8O7q4Kftjn5azJ88bYyp/ZMCsyW1lpKK46EXJcaYMZ1JtYj+s/7TdzmQMw==" }, - "@typescript-eslint/typescript-estree@8.58.0_typescript@6.0.2": { - "integrity": "sha512-7vv5UWbHqew/dvs+D3e1RvLv1v2eeZ9txRHPnEEBUgSNLx5ghdzjHa0sgLWYVKssH+lYmV0JaWdoubo0ncGYLA==", + "@typescript-eslint/typescript-estree@8.58.1_typescript@6.0.2": { + "integrity": "sha512-w4w7WR7GHOjqqPnvAYbazq+Y5oS68b9CzasGtnd6jIeOIeKUzYzupGTB2T4LTPSv4d+WPeccbxuneTFHYgAAWg==", "dependencies": [ "@typescript-eslint/project-service", "@typescript-eslint/tsconfig-utils", @@ -2971,8 +3341,8 @@ "typescript" ] }, - "@typescript-eslint/utils@8.58.0_eslint@9.39.4_typescript@6.0.2": { - "integrity": "sha512-RfeSqcFeHMHlAWzt4TBjWOAtoW9lnsAGiP3GbaX9uVgTYYrMbVnGONEfUCiSss+xMHFl+eHZiipmA8WkQ7FuNA==", + "@typescript-eslint/utils@8.58.1_eslint@9.39.4_typescript@6.0.2": { + "integrity": "sha512-Ln8R0tmWC7pTtLOzgJzYTXSCjJ9rDNHAqTaVONF4FEi2qwce8mD9iSOxOpLFFvWp/wBFlew0mjM1L1ihYWfBdQ==", "dependencies": [ "@eslint-community/eslint-utils", "@typescript-eslint/scope-manager", @@ -2982,8 +3352,8 @@ "typescript" ] }, - "@typescript-eslint/visitor-keys@8.58.0": { - "integrity": "sha512-XJ9UD9+bbDo4a4epraTwG3TsNPeiB9aShrUneAVXy8q4LuwowN+qu89/6ByLMINqvIMeI9H9hOHQtg/ijrYXzQ==", + "@typescript-eslint/visitor-keys@8.58.1": { + "integrity": "sha512-y+vH7QE8ycjoa0bWciFg7OpFcipUuem1ujhrdLtq1gByKwfbC7bPeKsiny9e0urg93DqwGcHey+bGRKCnF1nZQ==", "dependencies": [ "@typescript-eslint/types", "eslint-visitor-keys@5.0.1" @@ -2996,7 +3366,7 @@ "integrity": "sha512-IWTDeIoWhQ7ZtRO/JRKH+jhmeQvZYhtGPmzw/QGDY+wDCQqfm25P9yIdoAFagu4fWsK4IwZXDFIjrmp5rRm/sA==", "dependencies": [ "@mapbox/node-pre-gyp", - "@rollup/pluginutils", + "@rollup/pluginutils@5.3.0_rollup@4.60.1", "acorn@8.16.0", "acorn-import-attributes", "async-sema", @@ -3033,7 +3403,7 @@ ], "bin": true }, - "@vinxi/plugin-directives@0.5.1_vinxi@0.5.11__@emnapi+core@1.9.2__@emnapi+runtime@1.9.2__@types+node@24.12.0__ioredis@5.10.1__mysql2@3.20.0___@types+node@24.12.0__rolldown@1.0.0-rc.12___@emnapi+core@1.9.2___@emnapi+runtime@1.9.2__tsx@4.21.0__yaml@2.8.3_@emnapi+core@1.9.2_@emnapi+runtime@1.9.2_@types+node@24.12.0_ioredis@5.10.1_mysql2@3.20.0__@types+node@24.12.0_rolldown@1.0.0-rc.12__@emnapi+core@1.9.2__@emnapi+runtime@1.9.2_tsx@4.21.0_yaml@2.8.3": { + "@vinxi/plugin-directives@0.5.1_vinxi@0.5.11__@emnapi+core@1.9.2__@emnapi+runtime@1.9.2__@types+node@24.12.2__ioredis@5.10.1__mysql2@3.20.0___@types+node@24.12.2__rolldown@1.0.0-rc.12___@emnapi+core@1.9.2___@emnapi+runtime@1.9.2__tsx@4.21.0__yaml@2.8.3_@emnapi+core@1.9.2_@emnapi+runtime@1.9.2_@types+node@24.12.2_ioredis@5.10.1_mysql2@3.20.0__@types+node@24.12.2_rolldown@1.0.0-rc.12__@emnapi+core@1.9.2__@emnapi+runtime@1.9.2_tsx@4.21.0_yaml@2.8.3": { "integrity": "sha512-pH/KIVBvBt7z7cXrUH/9uaqcdxjegFC7+zvkZkdOyWzs+kQD5KPf3cl8kC+5ayzXHT+OMlhGhyitytqN3cGmHg==", "dependencies": [ "@babel/parser@7.29.2", @@ -3048,7 +3418,7 @@ "vinxi" ] }, - "@vinxi/server-components@0.5.1_vinxi@0.5.11__@emnapi+core@1.9.2__@emnapi+runtime@1.9.2__@types+node@24.12.0__ioredis@5.10.1__mysql2@3.20.0___@types+node@24.12.0__rolldown@1.0.0-rc.12___@emnapi+core@1.9.2___@emnapi+runtime@1.9.2__tsx@4.21.0__yaml@2.8.3_@emnapi+core@1.9.2_@emnapi+runtime@1.9.2_@types+node@24.12.0_ioredis@5.10.1_mysql2@3.20.0__@types+node@24.12.0_rolldown@1.0.0-rc.12__@emnapi+core@1.9.2__@emnapi+runtime@1.9.2_tsx@4.21.0_yaml@2.8.3": { + "@vinxi/server-components@0.5.1_vinxi@0.5.11__@emnapi+core@1.9.2__@emnapi+runtime@1.9.2__@types+node@24.12.2__ioredis@5.10.1__mysql2@3.20.0___@types+node@24.12.2__rolldown@1.0.0-rc.12___@emnapi+core@1.9.2___@emnapi+runtime@1.9.2__tsx@4.21.0__yaml@2.8.3_@emnapi+core@1.9.2_@emnapi+runtime@1.9.2_@types+node@24.12.2_ioredis@5.10.1_mysql2@3.20.0__@types+node@24.12.2_rolldown@1.0.0-rc.12__@emnapi+core@1.9.2__@emnapi+runtime@1.9.2_tsx@4.21.0_yaml@2.8.3": { "integrity": "sha512-0BsG95qac3dkhfdRZxqzqYWJE4NvPL7ILlV43B6K6ho1etXWB2e5b0IxsUAUbyqpqiXM7mSRivojuXjb2G4OsQ==", "dependencies": [ "@vinxi/plugin-directives", @@ -3071,16 +3441,16 @@ "tinyrainbow" ] }, - "@vitest/mocker@3.2.4_vite@7.3.1__@types+node@24.12.0__tsx@4.21.0__yaml@2.8.3_@types+node@24.12.0_tsx@4.21.0_yaml@2.8.3": { + "@vitest/mocker@3.2.4_vite@7.3.2__@types+node@24.12.2__tsx@4.21.0__yaml@2.8.3_@types+node@24.12.2_tsx@4.21.0_yaml@2.8.3": { "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", "dependencies": [ "@vitest/spy", "estree-walker@3.0.3", "magic-string", - "vite@7.3.1_@types+node@24.12.0_tsx@4.21.0_yaml@2.8.3" + "vite@7.3.2_@types+node@24.12.2_tsx@4.21.0_yaml@2.8.3" ], "optionalPeers": [ - "vite@7.3.1_@types+node@24.12.0_tsx@4.21.0_yaml@2.8.3" + "vite@7.3.2_@types+node@24.12.2_tsx@4.21.0_yaml@2.8.3" ] }, "@vitest/pretty-format@3.2.4": { @@ -3324,7 +3694,7 @@ "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", "bin": true }, - "astro@5.18.1_@types+node@24.12.0_ioredis@5.10.1_tsx@4.21.0_typescript@6.0.2_yaml@2.8.3": { + "astro@5.18.1_@types+node@24.12.2_ioredis@5.10.1_tsx@4.21.0_typescript@6.0.2_yaml@2.8.3": { "integrity": "sha512-m4VWilWZ+Xt6NPoYzC4CgGZim/zQUO7WFL0RHCH0AiEavF1153iC3+me2atDvXpf/yX4PyGUeD8wZLq1cirT3g==", "dependencies": [ "@astrojs/compiler", @@ -3333,7 +3703,7 @@ "@astrojs/telemetry", "@capsizecss/unpack", "@oslojs/encoding", - "@rollup/pluginutils", + "@rollup/pluginutils@5.3.0_rollup@4.60.1", "acorn@8.16.0", "aria-query@5.3.2", "axobject-query", @@ -3374,7 +3744,7 @@ "shiki@3.23.0", "smol-toml", "svgo", - "tinyexec@1.0.4", + "tinyexec@1.1.1", "tinyglobby", "tsconfck", "ultrahtml", @@ -3382,8 +3752,8 @@ "unist-util-visit", "unstorage", "vfile", - "vite@6.4.1_@types+node@24.12.0_tsx@4.21.0_yaml@2.8.3", - "vitefu@1.1.3_vite@6.4.1__@types+node@24.12.0__tsx@4.21.0__yaml@2.8.3_@types+node@24.12.0_tsx@4.21.0_yaml@2.8.3", + "vite@6.4.2_@types+node@24.12.2_tsx@4.21.0_yaml@2.8.3", + "vitefu@1.1.3_vite@6.4.2__@types+node@24.12.2__tsx@4.21.0__yaml@2.8.3_@types+node@24.12.2_tsx@4.21.0_yaml@2.8.3", "xxhash-wasm", "yargs-parser@21.1.1", "yocto-spinner", @@ -3509,8 +3879,8 @@ "base64-js@1.5.1": { "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, - "baseline-browser-mapping@2.10.13": { - "integrity": "sha512-BL2sTuHOdy0YT1lYieUxTw/QMtPBC3pmlJC6xk8BBYVv6vcw3SGdKemQ+Xsx9ik2F/lYDO9tqsFQH1r9PFuHKw==", + "baseline-browser-mapping@2.10.16": { + "integrity": "sha512-Lyf3aK28zpsD1yQMiiHD4RvVb6UdMoo8xzG2XzFIfR9luPzOpcBlAsT/qfB1XWS1bxWT+UtE4WmQgsp297FYOA==", "bin": true }, "bindings@1.5.0": { @@ -3695,8 +4065,8 @@ "camelcase@8.0.0": { "integrity": "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==" }, - "caniuse-lite@1.0.30001784": { - "integrity": "sha512-WU346nBTklUV9YfUl60fqRbU5ZqyXlqvo1SgigE1OAXK5bFL8LL9q1K7aap3N739l4BvNqnkm3YrGHiY9sfUQw==" + "caniuse-lite@1.0.30001787": { + "integrity": "sha512-mNcrMN9KeI68u7muanUpEejSLghOKlVhRqS/Za2IeyGllJ9I9otGpR9g3nsw7n4W378TE/LyIteA0+/FOZm4Kg==" }, "canonicalize@2.1.0": { "integrity": "sha512-F705O3xrsUtgt98j7leetNhTWPe+5S72rlL5O4jA1pKqBVQ/dT1O1D6PFxmSXvc0SUOinWS57DKx0I3CHrXJHQ==", @@ -4028,7 +4398,7 @@ "undici-types@5.28.4" ] }, - "db0@0.3.4_mysql2@3.20.0__@types+node@24.12.0_@types+node@24.12.0": { + "db0@0.3.4_mysql2@3.20.0__@types+node@24.12.2_@types+node@24.12.2": { "integrity": "sha512-RiXXi4WaNzPTHEOu8UPQKMooIbqOEyqA1t7Z6MsdxSCeb8iUC9ko3LcmsLmeUt2SM5bctfArZKkRQggKZz7JNw==", "dependencies": [ "mysql2" @@ -4095,8 +4465,8 @@ "define-lazy-prop@3.0.0": { "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==" }, - "defu@6.1.6": { - "integrity": "sha512-f8mefEW4WIVg4LckePx3mALjQSPQgFlg9U8yaPdlsbdYcHQyj9n2zL2LJEA52smeYxOvmd/nB7TpMtHGMTHcug==" + "defu@6.1.7": { + "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==" }, "delegates@1.0.0": { "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" @@ -4128,8 +4498,8 @@ "base-64" ] }, - "devalue@5.6.4": { - "integrity": "sha512-Gp6rDldRsFh/7XuouDbxMH3Mx8GMCcgzIb1pDTvNyn8pZGQ22u+Wa+lGV9dQCltFQ7uVw0MhRyb8XDskNFOReA==" + "devalue@5.7.0": { + "integrity": "sha512-qCvc8m7cImp1QDCsiY+C2EdSBWSj7Ucfoq87scSdYboDiIKdvMtFbH1U2VReBls6WMhMaUOoK3ZJEDNG/7zm3w==" }, "devlop@1.1.0": { "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", @@ -4174,8 +4544,8 @@ "type-fest@5.5.0" ] }, - "dotenv@17.4.0": { - "integrity": "sha512-kCKF62fwtzwYm0IGBNjRUjtJgMfGapII+FslMHIjMR5KTnwEmBmWLDRSnc3XSNP8bNy34tekgQyDT0hr7pERRQ==" + "dotenv@17.4.1": { + "integrity": "sha512-k8DaKGP6r1G30Lx8V4+pCsLzKr8vLmV2paqEj1Y55GdAgJuIqpRp5FfajGF8KtwMxCz9qJc6wUIJnm053d/WCw==" }, "dset@3.1.4": { "integrity": "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==" @@ -4200,8 +4570,8 @@ "ee-first@1.1.1": { "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, - "electron-to-chromium@1.5.331": { - "integrity": "sha512-IbxXrsTlD3hRodkLnbxAPP4OuJYdWCeM3IOdT+CpcMoIwIoDfCmRpEtSPfwBXxVkg9xmBeY7Lz2Eo2TDn/HC3Q==" + "electron-to-chromium@1.5.333": { + "integrity": "sha512-skNh4FsE+IpCJV7xAQGbQ4eyOGvcEctVBAk7a5KPzxC3alES9rLrT+2IsPRPgeQr8LVxdJr8BHQ9481+TOr0xg==" }, "emoji-regex-xs@1.0.0": { "integrity": "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==" @@ -4264,6 +4634,10 @@ "es-toolkit@1.45.1": { "integrity": "sha512-/jhoOj/Fx+A+IIyDNOvO3TItGmlMKhtX8ISAHKE90c4b/k1tqaqEZ+uUqfpU8DMnW5cgNJv606zS55jGvza0Xw==" }, + "esbuild-wasm@0.25.12": { + "integrity": "sha512-rZqkjL3Y6FwLpSHzLnaEy8Ps6veCNo1kZa9EOfJvmWtBq5dJH4iVjfmOO6Mlkv9B0tt9WFPFmb/VxlgJOnueNg==", + "bin": true + }, "esbuild@0.25.12": { "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", "optionalDependencies": [ @@ -4329,6 +4703,39 @@ "scripts": true, "bin": true }, + "esbuild@0.25.7": { + "integrity": "sha512-daJB0q2dmTzo90L9NjRaohhRWrCzYxWNFTjEi72/h+p5DcY3yn4MacWfDakHmaBaDzDiuLJsCh0+6LK/iX+c+Q==", + "optionalDependencies": [ + "@esbuild/aix-ppc64@0.25.7", + "@esbuild/android-arm@0.25.7", + "@esbuild/android-arm64@0.25.7", + "@esbuild/android-x64@0.25.7", + "@esbuild/darwin-arm64@0.25.7", + "@esbuild/darwin-x64@0.25.7", + "@esbuild/freebsd-arm64@0.25.7", + "@esbuild/freebsd-x64@0.25.7", + "@esbuild/linux-arm@0.25.7", + "@esbuild/linux-arm64@0.25.7", + "@esbuild/linux-ia32@0.25.7", + "@esbuild/linux-loong64@0.25.7", + "@esbuild/linux-mips64el@0.25.7", + "@esbuild/linux-ppc64@0.25.7", + "@esbuild/linux-riscv64@0.25.7", + "@esbuild/linux-s390x@0.25.7", + "@esbuild/linux-x64@0.25.7", + "@esbuild/netbsd-arm64@0.25.7", + "@esbuild/netbsd-x64@0.25.7", + "@esbuild/openbsd-arm64@0.25.7", + "@esbuild/openbsd-x64@0.25.7", + "@esbuild/openharmony-arm64@0.25.7", + "@esbuild/sunos-x64@0.25.7", + "@esbuild/win32-arm64@0.25.7", + "@esbuild/win32-ia32@0.25.7", + "@esbuild/win32-x64@0.25.7" + ], + "scripts": true, + "bin": true + }, "esbuild@0.27.7": { "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==", "optionalDependencies": [ @@ -4686,8 +5093,8 @@ "uint8array-extras" ] }, - "file-type@21.3.2": { - "integrity": "sha512-DLkUvGwep3poOV2wpzbHCOnSKGk1LzyXTv+aHFgN2VFl96wnp8YA9YjO2qPzg5PuL8q/SW9Pdi6WTkYOIh995w==", + "file-type@21.3.4": { + "integrity": "sha512-Ievi/yy8DS3ygGvT47PjSfdFoX+2isQueoYP1cntFW1JLYAuS4GD7NUPGg4zv2iZfV52uDyk5w5Z0TdpRS6Q1g==", "dependencies": [ "@tokenizer/inflate", "strtok3@10.3.5", @@ -5074,8 +5481,8 @@ "highlight.js@10.7.3": { "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==" }, - "hono@4.12.10": { - "integrity": "sha512-mx/p18PLy5og9ufies2GOSUqep98Td9q4i/EF6X7yJgAiIopxqdfIO3jbqsi3jRgTgw88jMDEzVKi+V2EF+27w==" + "hono@4.12.12": { + "integrity": "sha512-p1JfQMKaceuCbpJKAPKVqyqviZdS0eUxH9v82oWo1kb9xjQ5wA6iP3FNVAPDFlz5/p7d45lO+BpSk1tuSZMF4Q==" }, "hookable@5.5.3": { "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==" @@ -5212,20 +5619,20 @@ "@inquirer/core@8.2.4" ] }, - "inquirer@12.11.1_@types+node@24.12.0": { + "inquirer@12.11.1_@types+node@24.12.2": { "integrity": "sha512-9VF7mrY+3OmsAfjH3yKz/pLbJ5z22E23hENKw3/LNSaA/sAt3v49bDRY+Ygct1xwuKT+U+cBfTzjCPySna69Qw==", "dependencies": [ "@inquirer/ansi", - "@inquirer/core@10.3.2_@types+node@24.12.0", + "@inquirer/core@10.3.2_@types+node@24.12.2", "@inquirer/prompts", - "@inquirer/type@3.0.10_@types+node@24.12.0", - "@types/node@24.12.0", + "@inquirer/type@3.0.10_@types+node@24.12.2", + "@types/node@24.12.2", "mute-stream@2.0.0", "run-async", "rxjs" ], "optionalPeers": [ - "@types/node@24.12.0" + "@types/node@24.12.2" ] }, "ioredis@5.10.1": { @@ -5393,10 +5800,10 @@ "@pkgjs/parseargs" ] }, - "jimp@1.6.0": { - "integrity": "sha512-YcwCHw1kiqEeI5xRpDlPPBGL2EOpBKLwO4yIBJcXWHPj5PnA5urGq0jbyhM5KoNpypQ6VboSoxc9D8HyfvngSg==", + "jimp@1.6.1": { + "integrity": "sha512-hNQh6rZtWfSVWSNVmvq87N5BPJsNH7k7I7qyrXf9DOma9xATQk3fsyHazCQe51nCjdkoWdTmh0vD7bjVSLoxxw==", "dependencies": [ - "@jimp/core@1.6.0", + "@jimp/core@1.6.1", "@jimp/diff", "@jimp/js-bmp", "@jimp/js-gif", @@ -5422,7 +5829,7 @@ "@jimp/plugin-rotate", "@jimp/plugin-threshold", "@jimp/types", - "@jimp/utils@1.6.0" + "@jimp/utils@1.6.1" ] }, "jiti@1.21.7": { @@ -5657,8 +6064,8 @@ "lru-cache@10.4.3": { "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" }, - "lru-cache@11.2.7": { - "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==" + "lru-cache@11.3.2": { + "integrity": "sha512-wgWa6FWQ3QRRJbIjbsldRJZxdxYngT/dO0I5Ynmlnin8qy7tC6xYzbcJjtN4wHLXtkbVwHzk0C+OejVw1XM+DQ==" }, "lru-cache@5.1.1": { "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", @@ -6223,10 +6630,10 @@ "mute-stream@2.0.0": { "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==" }, - "mysql2@3.20.0_@types+node@24.12.0": { + "mysql2@3.20.0_@types+node@24.12.2": { "integrity": "sha512-eCLUs7BNbgA6nf/MZXsaBO1SfGs0LtLVrJD3WeWq+jPLDWkSufTD+aGMwykfUVPdZnblaUK1a8G/P63cl9FkKg==", "dependencies": [ - "@types/node@24.12.0", + "@types/node@24.12.2", "aws-ssl-profiles", "denque", "generate-function", @@ -6264,7 +6671,7 @@ "neotraverse@0.6.18": { "integrity": "sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==" }, - "nitropack@2.13.3_@emnapi+core@1.9.2_@emnapi+runtime@1.9.2_@types+node@24.12.0_mysql2@3.20.0__@types+node@24.12.0_rolldown@1.0.0-rc.12__@emnapi+core@1.9.2__@emnapi+runtime@1.9.2": { + "nitropack@2.13.3_@emnapi+core@1.9.2_@emnapi+runtime@1.9.2_@types+node@24.12.2_mysql2@3.20.0__@types+node@24.12.2_rolldown@1.0.0-rc.12__@emnapi+core@1.9.2__@emnapi+runtime@1.9.2": { "integrity": "sha512-C8vO7RxkU0AQ3HbYUumuG6MVM5JjRaBchke/rYFOp3EvrLtTBHZYhDVGECdpa27vNuOYRzm3GtQMn2YDOjDJLA==", "dependencies": [ "@cloudflare/kv-asset-handler@0.4.2", @@ -6605,7 +7012,7 @@ "path-scurry@2.0.2": { "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", "dependencies": [ - "lru-cache@11.2.7", + "lru-cache@11.3.2", "minipass" ] }, @@ -6721,31 +7128,31 @@ "pngjs@7.0.0": { "integrity": "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==" }, - "postcss@8.5.8": { - "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "postcss@8.5.9": { + "integrity": "sha512-7a70Nsot+EMX9fFU3064K/kdHWZqGVY+BADLyXc8Dfv+mTLLVl6JzJpPaCZ2kQL9gIJvKXSLMHhqdRRjwQeFtw==", "dependencies": [ "nanoid", "picocolors", "source-map-js" ] }, - "postgres@3.4.8": { - "integrity": "sha512-d+JFcLM17njZaOLkv6SCev7uoLaBtfK86vMUXhW1Z4glPWh4jozno9APvW/XKFJ3CCxVoC7OL38BqRydtu5nGg==" + "postgres@3.4.9": { + "integrity": "sha512-GD3qdB0x1z9xgFI6cdRD6xu2Sp2WCOEoe3mtnyB5Ee0XrrL5Pe+e4CCnJrRMnL1zYtRDZmQQVbvOttLnKDLnaw==" }, "powershell-utils@0.1.0": { "integrity": "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==" }, - "preact-render-to-string@6.6.5_preact@10.29.0": { - "integrity": "sha512-O6MHzYNIKYaiSX3bOw0gGZfEbOmlIDtDfWwN1JJdc/T3ihzRT6tGGSEWE088dWrEDGa1u7101q+6fzQnO9XCPA==", + "preact-render-to-string@6.6.7_preact@10.29.1": { + "integrity": "sha512-3XdbsX3+vn9dQW+jJI/FsI9rlkgl6dbeUpqLsChak6jp3j3auFqBCkno7VChbMFs5Q8ylBj6DrUkKRwtVN3nvw==", "dependencies": [ - "preact@10.29.0" + "preact@10.29.1" ] }, "preact@10.19.6": { "integrity": "sha512-gympg+T2Z1fG1unB8NH29yHJwnEaCH37Z32diPDku316OTnRPeMbiRV9kTrfZpocXjdfnWuFUl/Mj4BHaf6gnw==" }, - "preact@10.29.0": { - "integrity": "sha512-wSAGyk2bYR1c7t3SZ3jHcM6xy0lcBcDel6lODcs9ME6Th++Dx2KU+6D3HD8wMMKGA8Wpw7OMd3/4RGzYRpzwRg==" + "preact@10.29.1": { + "integrity": "sha512-gQCLc/vWroE8lIpleXtdJhTFDogTdZG9AjMUpVkDf2iTCNwYNWA+u16dL41TqUDJO4gm2IgrcMv3uTpjd4Pwmg==" }, "prelude-ls@1.2.1": { "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" @@ -7299,14 +7706,14 @@ "serialize-javascript@7.0.5": { "integrity": "sha512-F4LcB0UqUl1zErq+1nYEEzSHJnIwb3AF2XWB94b+afhrekOUijwooAYqFyRbjYkm2PAKBabx6oYv/xDxNi8IBw==" }, - "seroval-plugins@1.5.1_seroval@1.5.1": { - "integrity": "sha512-4FbuZ/TMl02sqv0RTFexu0SP6V+ywaIe5bAWCCEik0fk17BhALgwvUDVF7e3Uvf9pxmwCEJsRPmlkUE6HdzLAw==", + "seroval-plugins@1.5.2_seroval@1.5.2": { + "integrity": "sha512-qpY0Cl+fKYFn4GOf3cMiq6l72CpuVaawb6ILjubOQ+diJ54LfOWaSSPsaswN8DRPIPW4Yq+tE1k5aKd7ILyaFg==", "dependencies": [ "seroval" ] }, - "seroval@1.5.1": { - "integrity": "sha512-OwrZRZAfhHww0WEnKHDY8OM0U/Qs8OTfIDWhUD4BLpNJUfXK4cGmjiagGze086m+mhI+V2nD0gfbHEnJjb9STA==" + "seroval@1.5.2": { + "integrity": "sha512-xcRN39BdsnO9Tf+VzsE7b3JyTJASItIV1FVFewJKCFcW4s4haIKS3e6vj8PGB9qBwC7tnuOywQMdv5N4qkzi7Q==" }, "serve-placeholder@2.0.2": { "integrity": "sha512-/TMG8SboeiQbZJWRlfTCqMs2DD3SZgWp0kDQePz9yUuCnDfDh/92gf7/PxGhzXTKBIPASIHxFcZndoNbp6QOLQ==", @@ -7495,8 +7902,8 @@ "is-arrayish" ] }, - "simple-xml-to-json@1.2.4": { - "integrity": "sha512-3MY16e0ocMHL7N1ufpdObURGyX+lCo0T/A+y6VCwosLdH1HSda4QZl1Sdt/O+2qWp48WFi26XEp5rF0LoaL0Dg==" + "simple-xml-to-json@1.2.7": { + "integrity": "sha512-mz9VXphOxQWX3eQ/uXCtm6upltoN0DLx8Zb5T4TFC4FHB7S9FDPGre8CfLWqPWQQH/GrQYd2AXhhVM5LDpYx6Q==" }, "sirv@3.0.2": { "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", @@ -7713,8 +8120,8 @@ "supports-preserve-symlinks-flag@1.0.0": { "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" }, - "svelte@5.55.1": { - "integrity": "sha512-QjvU7EFemf6mRzdMGlAFttMWtAAVXrax61SZYHdkD6yoVGQ89VeyKfZD4H1JrV1WLmJBxWhFch9H6ig/87VGjw==", + "svelte@5.55.2": { + "integrity": "sha512-z41M/hi0ZPTzrwVKLvB/R1/Oo08gL1uIib8HZ+FncqxxtY9MLb01emg2fqk+WLZ/lNrrtNDFh7BZLDxAHvMgLw==", "dependencies": [ "@jridgewell/remapping", "@jridgewell/sourcemap-codec", @@ -7837,11 +8244,11 @@ "tinyexec@0.3.2": { "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==" }, - "tinyexec@1.0.4": { - "integrity": "sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==" + "tinyexec@1.1.1": { + "integrity": "sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg==" }, - "tinyglobby@0.2.15": { - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "tinyglobby@0.2.16": { + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", "dependencies": [ "fdir", "picomatch@4.0.4" @@ -7935,7 +8342,7 @@ "rolldown", "rolldown-plugin-dts", "semver@7.7.4", - "tinyexec@1.0.4", + "tinyexec@1.1.1", "tinyglobby", "tree-kill", "typescript", @@ -8204,7 +8611,7 @@ ], "bin": true }, - "unstorage@1.17.5_db0@0.3.4__mysql2@3.20.0___@types+node@24.12.0__@types+node@24.12.0_ioredis@5.10.1_@types+node@24.12.0_mysql2@3.20.0__@types+node@24.12.0": { + "unstorage@1.17.5_db0@0.3.4__mysql2@3.20.0___@types+node@24.12.2__@types+node@24.12.2_ioredis@5.10.1_@types+node@24.12.2_mysql2@3.20.0__@types+node@24.12.2": { "integrity": "sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg==", "dependencies": [ "anymatch", @@ -8213,7 +8620,7 @@ "destr", "h3@1.15.11", "ioredis", - "lru-cache@11.2.7", + "lru-cache@11.3.2", "node-fetch-native", "ofetch", "ufo" @@ -8330,7 +8737,7 @@ "vfile-message" ] }, - "vinxi@0.5.11_@emnapi+core@1.9.2_@emnapi+runtime@1.9.2_@types+node@24.12.0_ioredis@5.10.1_mysql2@3.20.0__@types+node@24.12.0_rolldown@1.0.0-rc.12__@emnapi+core@1.9.2__@emnapi+runtime@1.9.2_tsx@4.21.0_yaml@2.8.3": { + "vinxi@0.5.11_@emnapi+core@1.9.2_@emnapi+runtime@1.9.2_@types+node@24.12.2_ioredis@5.10.1_mysql2@3.20.0__@types+node@24.12.2_rolldown@1.0.0-rc.12__@emnapi+core@1.9.2__@emnapi+runtime@1.9.2_tsx@4.21.0_yaml@2.8.3": { "integrity": "sha512-82Qm+EG/b2PRFBvXBbz1lgWBGcd9totIL6SJhnrZYfakjloTVG9+5l6gfO6dbCCtztm5pqWFzLY0qpZ3H3ww/w==", "dependencies": [ "@babel/core", @@ -8365,24 +8772,24 @@ "unctx", "unenv@1.10.0", "unstorage", - "vite@6.4.1_@types+node@24.12.0_tsx@4.21.0_yaml@2.8.3", + "vite@6.4.2_@types+node@24.12.2_tsx@4.21.0_yaml@2.8.3", "zod@4.3.6" ], "bin": true }, - "vite-node@3.2.4_@types+node@24.12.0_tsx@4.21.0_yaml@2.8.3": { + "vite-node@3.2.4_@types+node@24.12.2_tsx@4.21.0_yaml@2.8.3": { "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", "dependencies": [ "cac@6.7.14", "debug@4.4.3", "es-module-lexer", "pathe@2.0.3", - "vite@7.3.1_@types+node@24.12.0_tsx@4.21.0_yaml@2.8.3" + "vite@7.3.2_@types+node@24.12.2_tsx@4.21.0_yaml@2.8.3" ], "bin": true }, - "vite-plugin-solid@2.11.11_solid-js@1.9.12_vite@7.3.1__@types+node@24.12.0__tsx@4.21.0__yaml@2.8.3_@types+node@24.12.0_tsx@4.21.0_yaml@2.8.3": { - "integrity": "sha512-YMZCXsLw9kyuvQFEdwLP27fuTQJLmjNoHy90AOJnbRuJ6DwShUxKFo38gdFrWn9v11hnGicKCZEaeI/TFs6JKw==", + "vite-plugin-solid@2.11.12_solid-js@1.9.12_vite@7.3.2__@types+node@24.12.2__tsx@4.21.0__yaml@2.8.3_@types+node@24.12.2_tsx@4.21.0_yaml@2.8.3": { + "integrity": "sha512-FgjPcx2OwX9h6f28jli7A4bG7PP3te8uyakE5iqsmpq3Jqi1TWLgSroC9N6cMfGRU2zXsl4Q6ISvTr2VL0QHpA==", "dependencies": [ "@babel/core", "@types/babel__core", @@ -8390,14 +8797,14 @@ "merge-anything", "solid-js", "solid-refresh", - "vite@7.3.1_@types+node@24.12.0_tsx@4.21.0_yaml@2.8.3", - "vitefu@1.1.3_vite@7.3.1__@types+node@24.12.0__tsx@4.21.0__yaml@2.8.3_@types+node@24.12.0_tsx@4.21.0_yaml@2.8.3" + "vite@7.3.2_@types+node@24.12.2_tsx@4.21.0_yaml@2.8.3", + "vitefu@1.1.3_vite@7.3.2__@types+node@24.12.2__tsx@4.21.0__yaml@2.8.3_@types+node@24.12.2_tsx@4.21.0_yaml@2.8.3" ] }, - "vite@6.4.1_@types+node@24.12.0_tsx@4.21.0_yaml@2.8.3": { - "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", + "vite@6.4.2_@types+node@24.12.2_tsx@4.21.0_yaml@2.8.3": { + "integrity": "sha512-2N/55r4JDJ4gdrCvGgINMy+HH3iRpNIz8K6SFwVsA+JbQScLiC+clmAxBgwiSPgcG9U15QmvqCGWzMbqda5zGQ==", "dependencies": [ - "@types/node@24.12.0", + "@types/node@24.12.2", "esbuild@0.25.12", "fdir", "picomatch@4.0.4", @@ -8411,16 +8818,16 @@ "fsevents" ], "optionalPeers": [ - "@types/node@24.12.0", + "@types/node@24.12.2", "tsx", "yaml" ], "bin": true }, - "vite@7.3.1_@types+node@24.12.0_tsx@4.21.0_yaml@2.8.3": { - "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", + "vite@7.3.2_@types+node@24.12.2_tsx@4.21.0_yaml@2.8.3": { + "integrity": "sha512-Bby3NOsna2jsjfLVOHKes8sGwgl4TT0E6vvpYgnAYDIF/tie7MRaFthmKuHx1NSXjiTueXH3do80FMQgvEktRg==", "dependencies": [ - "@types/node@24.12.0", + "@types/node@24.12.2", "esbuild@0.27.7", "fdir", "picomatch@4.0.4", @@ -8434,29 +8841,29 @@ "fsevents" ], "optionalPeers": [ - "@types/node@24.12.0", + "@types/node@24.12.2", "tsx", "yaml" ], "bin": true }, - "vitefu@1.1.3_vite@6.4.1__@types+node@24.12.0__tsx@4.21.0__yaml@2.8.3_@types+node@24.12.0_tsx@4.21.0_yaml@2.8.3": { + "vitefu@1.1.3_vite@6.4.2__@types+node@24.12.2__tsx@4.21.0__yaml@2.8.3_@types+node@24.12.2_tsx@4.21.0_yaml@2.8.3": { "integrity": "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==" }, - "vitefu@1.1.3_vite@7.3.1__@types+node@24.12.0__tsx@4.21.0__yaml@2.8.3_@types+node@24.12.0_tsx@4.21.0_yaml@2.8.3": { + "vitefu@1.1.3_vite@7.3.2__@types+node@24.12.2__tsx@4.21.0__yaml@2.8.3_@types+node@24.12.2_tsx@4.21.0_yaml@2.8.3": { "integrity": "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==", "dependencies": [ - "vite@7.3.1_@types+node@24.12.0_tsx@4.21.0_yaml@2.8.3" + "vite@7.3.2_@types+node@24.12.2_tsx@4.21.0_yaml@2.8.3" ], "optionalPeers": [ - "vite@7.3.1_@types+node@24.12.0_tsx@4.21.0_yaml@2.8.3" + "vite@7.3.2_@types+node@24.12.2_tsx@4.21.0_yaml@2.8.3" ] }, - "vitest@3.2.4_@types+node@24.12.0_tsx@4.21.0_yaml@2.8.3": { + "vitest@3.2.4_@types+node@24.12.2_tsx@4.21.0_yaml@2.8.3": { "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", "dependencies": [ "@types/chai", - "@types/node@24.12.0", + "@types/node@24.12.2", "@vitest/expect", "@vitest/mocker", "@vitest/pretty-format", @@ -8476,12 +8883,12 @@ "tinyglobby", "tinypool", "tinyrainbow", - "vite@7.3.1_@types+node@24.12.0_tsx@4.21.0_yaml@2.8.3", + "vite@7.3.2_@types+node@24.12.2_tsx@4.21.0_yaml@2.8.3", "vite-node", "why-is-node-running" ], "optionalPeers": [ - "@types/node@24.12.0" + "@types/node@24.12.2" ], "bin": true }, @@ -8553,7 +8960,7 @@ "scripts": true, "bin": true }, - "wrangler@4.35.0_@cloudflare+workers-types@4.20260403.1": { + "wrangler@4.35.0_@cloudflare+workers-types@4.20260408.1": { "integrity": "sha512-HbyXtbrh4Fi3mU8ussY85tVdQ74qpVS1vctUgaPc+bPrXBTqfDLkZ6VRtHAVF/eBhz4SFmhJtCQpN1caY2Ak8A==", "dependencies": [ "@cloudflare/kv-asset-handler@0.4.0", diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts index be227c9d7..24b6adf3b 100644 --- a/docs/.vitepress/config.mts +++ b/docs/.vitepress/config.mts @@ -62,7 +62,10 @@ function getReferenceItems(): { text: string; link: string }[] { const names = new Set(); for (const workspaceEntry of rootDenoConfig.workspace ?? []) { if (!workspaceEntry.startsWith("./packages/")) continue; - const packageDenoJsonUrl = new URL(`${workspaceEntry}/deno.json`, repoRootUrl); + const packageDenoJsonUrl = new URL( + `${workspaceEntry}/deno.json`, + repoRootUrl, + ); const packageDenoConfig = JSON.parse( readFileSync(packageDenoJsonUrl, "utf-8"), ) as PackageDenoConfig; diff --git a/docs/manual/integration.md b/docs/manual/integration.md index 00edfbd4c..d450e17be 100644 --- a/docs/manual/integration.md +++ b/docs/manual/integration.md @@ -4,12 +4,17 @@ description: >- explains how to integrate Fedify with web frameworks. --- -# Integration + + +Integration +=========== Fedify is designed to be used together with web frameworks. This document explains how to integrate Fedify with web frameworks. -## How it works + +How it works +------------ Usually, Fedify behaves as a middleware that wraps around the web framework's request handler. The middleware intercepts the incoming HTTP requests and @@ -28,7 +33,7 @@ request to the appropriate actor dispatcher. Here is a diagram that illustrates the architecture: -```mermaid +~~~~ mermaid sequenceDiagram participant Client participant Fedify @@ -47,7 +52,7 @@ sequenceDiagram Fedify ->> WF: GET /users/alice WF -->> Fedify: 200 OK Fedify -->> Client: 200 OK -``` +~~~~ > [!NOTE] > @@ -65,7 +70,9 @@ sequenceDiagram [`Accept`]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept [content negotiation]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Content_negotiation -## AdonisJS + +Adonisjs +-------- [AdonisJS] is a batteries-included TypeScript framework for building full-stack web applications on Node.js. The _@fedify/adonis_ package provides a middleware @@ -73,27 +80,27 @@ to integrate Fedify with AdonisJS: ::: code-group -```sh [npm] +~~~~ sh [npm] npm add @fedify/adonis -``` +~~~~ -```sh [pnpm] +~~~~ sh [pnpm] pnpm add @fedify/adonis -``` +~~~~ -```sh [Yarn] +~~~~ sh [Yarn] yarn add @fedify/adonis -``` +~~~~ -```sh [Bun] +~~~~ sh [Bun] bun add @fedify/adonis -``` +~~~~ ::: Create a middleware file and register it as a server middleware: -```typescript +~~~~ typescript // app/middleware/fedify_middleware.ts import { fedifyMiddleware } from "@fedify/adonis"; import { createFederation } from "@fedify/fedify"; @@ -103,9 +110,9 @@ export const federation = createFederation({ }); export default fedifyMiddleware(federation); -``` +~~~~ -```typescript +~~~~ typescript // start/kernel.ts import server from "@adonisjs/core/services/server"; @@ -113,7 +120,7 @@ server.use([ () => import("#middleware/fedify_middleware"), // ... other middleware ]); -``` +~~~~ > [!TIP] > Register the Fedify middleware before the body parser middleware so that @@ -121,7 +128,9 @@ server.use([ [AdonisJS]: https://adonisjs.com/ -## Express + +Express +------- [Express] is a fast, unopinionated, minimalist web framework for Node.js. The _@fedify/express_ package provides a middleware to integrate Fedify with @@ -129,29 +138,29 @@ Express: ::: code-group -```sh [Deno] +~~~~ sh [Deno] deno add jsr:@fedify/express -``` +~~~~ -```sh [npm] +~~~~ sh [npm] npm add @fedify/express -``` +~~~~ -```sh [pnpm] +~~~~ sh [pnpm] pnpm add @fedify/express -``` +~~~~ -```sh [Yarn] +~~~~ sh [Yarn] yarn add @fedify/express -``` +~~~~ -```sh [Bun] +~~~~ sh [Bun] bun add @fedify/express -``` +~~~~ ::: -```typescript twoslash +~~~~ typescript twoslash // @noErrors: 2345 import express from "express"; import { integrateFederation } from "@fedify/express"; @@ -166,7 +175,7 @@ export const app = express(); app.set("trust proxy", true); app.use(integrateFederation(federation, (req) => "context data goes here")); // [!code highlight] -``` +~~~~ > [!NOTE] > If your application uses Express 4.x behind a reverse proxy with a @@ -182,7 +191,9 @@ app.use(integrateFederation(federation, (req) => "context data goes here")); // [Express]: https://expressjs.com/ [trust proxy]: https://expressjs.com/en/guide/behind-proxies.html -## Fastify + +Fastify +------- _This API is available since Fedify 1.9.0._ @@ -192,25 +203,25 @@ provides a plugin to integrate Fedify with Fastify: ::: code-group -```sh [npm] +~~~~ sh [npm] npm add @fedify/fastify -``` +~~~~ -```sh [pnpm] +~~~~ sh [pnpm] pnpm add @fedify/fastify -``` +~~~~ -```sh [Yarn] +~~~~ sh [Yarn] yarn add @fedify/fastify -``` +~~~~ -```sh [Bun] +~~~~ sh [Bun] bun add @fedify/fastify -``` +~~~~ ::: -```typescript twoslash +~~~~ typescript twoslash // @noErrors: 2345 import Fastify from "fastify"; import { fedifyPlugin } from "@fedify/fastify"; @@ -229,11 +240,13 @@ await fastify.register(fedifyPlugin, { // [!code highlight] }); // [!code highlight] fastify.listen({ port: 3000 }); -``` +~~~~ [Fastify]: https://fastify.dev/ -## Koa + +Koa +--- _This API is available since Fedify 1.9.0._ @@ -244,29 +257,29 @@ to integrate Fedify with Koa: ::: code-group -```sh [Deno] +~~~~ sh [Deno] deno add jsr:@fedify/koa -``` +~~~~ -```sh [npm] +~~~~ sh [npm] npm add @fedify/koa -``` +~~~~ -```sh [pnpm] +~~~~ sh [pnpm] pnpm add @fedify/koa -``` +~~~~ -```sh [Yarn] +~~~~ sh [Yarn] yarn add @fedify/koa -``` +~~~~ -```sh [Bun] +~~~~ sh [Bun] bun add @fedify/koa -``` +~~~~ ::: -```typescript twoslash +~~~~ typescript twoslash // @noErrors: 2345 import Koa from "koa"; import { createMiddleware } from "@fedify/koa"; @@ -281,14 +294,16 @@ export const app = new Koa(); app.proxy = true; // trust proxy headers app.use(createMiddleware(federation, (ctx) => "context data goes here")); // [!code highlight] -``` +~~~~ > [!NOTE] > The `@fedify/koa` package supports both Koa v2.x and v3.x. [Koa]: https://koajs.com/ -## Hono + +Hono +---- _This API is available since Fedify 1.9.0._ @@ -298,29 +313,29 @@ with Hono: ::: code-group -```sh [Deno] +~~~~ sh [Deno] deno add jsr:@fedify/hono -``` +~~~~ -```sh [npm] +~~~~ sh [npm] npm add @fedify/hono -``` +~~~~ -```sh [pnpm] +~~~~ sh [pnpm] pnpm add @fedify/hono -``` +~~~~ -```sh [Yarn] +~~~~ sh [Yarn] yarn add @fedify/hono -``` +~~~~ -```sh [Bun] +~~~~ sh [Bun] bun add @fedify/hono -``` +~~~~ ::: -```typescript +~~~~ typescript import { createFederation } from "@fedify/fedify"; import { federation } from "@fedify/hono"; import { Hono } from "hono"; @@ -331,11 +346,13 @@ const fedi = createFederation({ const app = new Hono(); app.use(federation(fedi, (ctx) => "context data")); // [!code highlight] -``` +~~~~ [Hono]: https://hono.dev/ -## h3 + +h3 +-- [h3] is an HTTP server framework behind [Nitro], [Analog], [Vinxi], [SolidStart], [TanStack Start], and other many web frameworks. The _@fedify/h3_ @@ -343,29 +360,29 @@ package provides a middleware to integrate Fedify with h3: ::: code-group -```sh [Deno] +~~~~ sh [Deno] deno add jsr:@fedify/h3 -``` +~~~~ -```sh [npm] +~~~~ sh [npm] npm add @fedify/h3 -``` +~~~~ -```sh [pnpm] +~~~~ sh [pnpm] pnpm add @fedify/h3 -``` +~~~~ -```sh [Yarn] +~~~~ sh [Yarn] yarn add @fedify/h3 -``` +~~~~ -```sh [Bun] +~~~~ sh [Bun] bun add @fedify/h3 -``` +~~~~ ::: -```typescript {9-15} twoslash +~~~~ typescript {9-15} twoslash // @noErrors: 2345 import { createApp, createRouter } from "h3"; import { createFederation } from "@fedify/fedify"; @@ -385,7 +402,7 @@ app.use( const router = createRouter(); app.use(router); -``` +~~~~ > [!NOTE] > Your app has to configure `onError` to let Fedify negotiate content types. If @@ -399,7 +416,9 @@ app.use(router); [SolidStart]: https://start.solidjs.com/ [TanStack Start]: https://tanstack.com/start -## SvelteKit + +SvelteKit +--------- _This API is available since Fedify 1.3.0._ @@ -409,29 +428,29 @@ SvelteKit: ::: code-group -```sh [Deno] +~~~~ sh [Deno] deno add jsr:@fedify/sveltekit -``` +~~~~ -```sh [npm] +~~~~ sh [npm] npm add @fedify/sveltekit -``` +~~~~ -```sh [pnpm] +~~~~ sh [pnpm] pnpm add @fedify/sveltekit -``` +~~~~ -```sh [Yarn] +~~~~ sh [Yarn] yarn add @fedify/sveltekit -``` +~~~~ -```sh [Bun] +~~~~ sh [Bun] bun add @fedify/sveltekit -``` +~~~~ ::: -```typescript +~~~~ typescript import { createFederation } from "@fedify/fedify"; import { fedifyHook } from "@fedify/sveltekit"; @@ -441,12 +460,14 @@ const federation = createFederation({ // This is the entry point to the Fedify hook from the SvelteKit framework: export const handle = fedifyHook(federation, (req) => "context data"); -``` +~~~~ [SvelteKit]: https://kit.svelte.dev/ [Svelte]: https://svelte.dev/ -## NestJS + +NestJS +------ _This API is available since Fedify 1.8.0._ @@ -456,25 +477,25 @@ _@fedify/nestjs_ package provides a middleware to integrate Fedify with NestJS: ::: code-group -```sh [npm] +~~~~ sh [npm] npm add @fedify/nestjs -``` +~~~~ -```sh [pnpm] +~~~~ sh [pnpm] pnpm add @fedify/nestjs -``` +~~~~ -```sh [Yarn] +~~~~ sh [Yarn] yarn add @fedify/nestjs -``` +~~~~ -```sh [Bun] +~~~~ sh [Bun] bun add @fedify/nestjs -``` +~~~~ ::: -```typescript [modules/federation/federation.service.ts] twoslash +~~~~ typescript [modules/federation/federation.service.ts] twoslash import { Inject, Injectable, OnModuleInit } from "@nestjs/common"; import { FEDIFY_FEDERATION } from "@fedify/nestjs"; import { Federation } from "@fedify/fedify"; @@ -516,9 +537,9 @@ export class FederationService implements OnModuleInit { }); } } -``` +~~~~ -```typescript [modules/federation/federation.module.ts] twoslash +~~~~ typescript [modules/federation/federation.module.ts] twoslash // @noErrors: 2395 2307 import { Inject, Injectable, OnModuleInit } from "@nestjs/common"; import { FEDIFY_FEDERATION } from "@fedify/nestjs"; @@ -551,9 +572,9 @@ import { FederationService } from "./federation.service"; exports: [FederationService], }) export class FederationModule {} -``` +~~~~ -```typescript [app.module.ts] twoslash +~~~~ typescript [app.module.ts] twoslash // @noErrors: 2307 // ---cut-before--- import { @@ -623,11 +644,13 @@ export class AppModule implements NestModule { ).forRoutes({ path: "*", method: RequestMethod.ALL }); } } -``` +~~~~ [NestJS]: https://nestjs.com/ -## Elysia + +Elysia +------ _This API is available since Fedify 1.8.0._ @@ -639,29 +662,29 @@ integrating Fedify with Elysia: ::: code-group -```sh [Bun] +~~~~ sh [Bun] bun add @fedify/elysia -``` +~~~~ -```sh [Deno] +~~~~ sh [Deno] deno add npm:@fedify/elysia -``` +~~~~ -```sh [npm] +~~~~ sh [npm] npm add @fedify/elysia -``` +~~~~ -```sh [pnpm] +~~~~ sh [pnpm] pnpm add @fedify/elysia -``` +~~~~ -```sh [Yarn] +~~~~ sh [Yarn] yarn add @fedify/elysia -``` +~~~~ ::: -```typescript +~~~~ typescript import { fedify } from "@fedify/elysia"; import { federation } from "./federation.ts"; // Your `Federation` instance import { Elysia } from "elysia"; @@ -673,11 +696,13 @@ app .listen(3000); console.log("Elysia App Start!"); -``` +~~~~ [Elysia]: https://elysiajs.com/ -## Next.js + +Next.js +------- _This API is available since Fedify 1.9.0._ @@ -688,25 +713,25 @@ _This API is available since Fedify 1.9.0._ > > ::: code-group > -> ```sh [npm] +> ~~~~ sh [npm] > npx create-next-app -e https://github.com/fedify-dev/fedify \ > --example-path examples/next-integration -> ``` +> ~~~~ > -> ```sh [pnpm] +> ~~~~ sh [pnpm] > pnpm create next-app -e https://github.com/fedify-dev/fedify \ > --example-path examples/next-integration -> ``` +> ~~~~ > -> ```sh [Yarn] +> ~~~~ sh [Yarn] > yarn create next-app -e https://github.com/fedify-dev/fedify \ > --example-path examples/next-integration -> ``` +> ~~~~ > -> ```sh [Bun] +> ~~~~ sh [Bun] > bun create next-app -e https://github.com/fedify-dev/fedify \ > --example-path examples/next-integration -> ``` +> ~~~~ > > ::: @@ -716,35 +741,35 @@ middleware to integrate Fedify with Next.js: ::: code-group -```sh [Deno] +~~~~ sh [Deno] deno add jsr:@fedify/next -``` +~~~~ -```sh [npm] +~~~~ sh [npm] npm add @fedify/next -``` +~~~~ -```sh [pnpm] +~~~~ sh [pnpm] pnpm add @fedify/next -``` +~~~~ -```sh [Yarn] +~~~~ sh [Yarn] yarn add @fedify/next -``` +~~~~ -```sh [Bun] +~~~~ sh [Bun] bun add @fedify/next -``` +~~~~ ::: Or create an app with the following command using the Fedify CLI: -```sh +~~~~ sh fedify init my-next-app -``` +~~~~ -``` +~~~~ ? Choose the JavaScript runtime to use › Node.js ? Choose the package manager to use › npm ? Choose the web framework to integrate Fedify with › Next.js @@ -752,7 +777,7 @@ fedify init my-next-app ? Choose the message queue to use for background jobs › In-process ✔ Would you like your code inside a `src/` directory? … No ✔ Would you like to customize the import alias (`@/*` by default)? … No -``` +~~~~ Then you can see the Next.js boilerplate code in the `my-next-app` directory. If you have created a Next.js app with `create-next-app` before, you'll see some @@ -761,7 +786,7 @@ directory, which is the entry point to the Fedify middleware from the Next.js framework. Or, if you just install _@fedify/next_ manually, put the following code in your `middleware.ts` file: -```typescript +~~~~ typescript import { fedifyWith } from "@fedify/next"; import federation from "./federation"; // Your `Federation` instance @@ -805,7 +830,7 @@ export const config = { { source: "/.well-known/x-nodeinfo2" }, ], }; -``` +~~~~ As you can see in the comment, you can handle other requests besides federation requests in the middleware. If you handle only federation requests in the @@ -820,7 +845,83 @@ documentation [`config` in `middleware.js`]. [Next.js]: https://nextjs.org/ [`config` in `middleware.js`]: https://nextjs.org/docs/app/api-reference/file-conventions/middleware#config-object-optional -## Astro + +Nuxt +---- + +_This API is available since Fedify 2.2.0._ + +[Nuxt] is a full-stack framework built on top of Vue, Nitro, and h3. The +_@fedify/nuxt_ package provides a server handler for `server/middleware` and an +error handler for Nitro so that Nuxt pages and Fedify endpoints can share the +same routes with content negotiation: + +::: code-group + +~~~~ sh [Deno] +deno add jsr:@fedify/nuxt +~~~~ + +~~~~ sh [npm] +npm add @fedify/nuxt +~~~~ + +~~~~ sh [pnpm] +pnpm add @fedify/nuxt +~~~~ + +~~~~ sh [Yarn] +yarn add @fedify/nuxt +~~~~ + +~~~~ sh [Bun] +bun add @fedify/nuxt +~~~~ + +::: + +First, configure Nitro's error handler in _nuxt.config.ts_: + +~~~~ typescript +export default defineNuxtConfig({ + nitro: { + errorHandler: "./server/error", // [!code highlight] + }, +}); +~~~~ + +Then, create _server/error.ts_: + +~~~~ typescript +import { fedifyErrorHandler } from "@fedify/nuxt"; + +export default fedifyErrorHandler; // [!code highlight] +~~~~ + +Finally, add the Fedify middleware in _server/middleware/federation.ts_: + +~~~~ typescript +import { createFederation } from "@fedify/fedify"; +import { fedifyHandler } from "@fedify/nuxt"; + +const federation = createFederation({ + // Omitted for brevity; see the related section for details. +}); + +export default fedifyHandler( // [!code highlight] + federation, // [!code highlight] + (event, request) => void 0, // [!code highlight] +); // [!code highlight] +~~~~ + +If you create a Nuxt project through `fedify init`, the initializer writes all +three files for you and configures Nitro's error handler automatically. + +[Nuxt]: https://nuxt.com/ + + +Astro +----- _This API is available since Fedify 2.1.0._ @@ -829,31 +930,31 @@ package provides an integration and middleware to integrate Fedify with Astro: ::: code-group -```sh [Deno] +~~~~ sh [Deno] deno add jsr:@fedify/astro -``` +~~~~ -```sh [npm] +~~~~ sh [npm] npm add @fedify/astro -``` +~~~~ -```sh [pnpm] +~~~~ sh [pnpm] pnpm add @fedify/astro -``` +~~~~ -```sh [Yarn] +~~~~ sh [Yarn] yarn add @fedify/astro -``` +~~~~ -```sh [Bun] +~~~~ sh [Bun] bun add @fedify/astro -``` +~~~~ ::: First, add the Fedify integration to your _astro.config.ts_: -```typescript +~~~~ typescript import { defineConfig } from "astro/config"; import { fedifyIntegration } from "@fedify/astro"; @@ -861,11 +962,11 @@ export default defineConfig({ integrations: [fedifyIntegration()], // [!code highlight] output: "server", }); -``` +~~~~ Then, create your middleware in _src/middleware.ts_: -```typescript +~~~~ typescript import { createFederation } from "@fedify/fedify"; import { fedifyMiddleware } from "@fedify/astro"; @@ -877,7 +978,7 @@ export const onRequest = fedifyMiddleware( // [!code highlight] federation, // [!code highlight] (context) => void 0, // [!code highlight] ); // [!code highlight] -``` +~~~~ [Astro]: https://astro.build/ @@ -886,7 +987,7 @@ export const onRequest = fedifyMiddleware( // [!code highlight] If you are using Deno, you should import `@deno/vite-adapter` in _astro.config.ts_ and use it as the adapter: -```typescript +~~~~ typescript import { defineConfig } from "astro/config"; import { fedifyIntegration } from "@fedify/astro"; import deno from "@deno/astro-adapter"; @@ -896,12 +997,12 @@ export default defineConfig({ output: "server", adapter: deno(), }); -``` +~~~~ And the tasks in _deno.json_ should be updated to use `deno run npm:astro` instead of `astro`: -```json +~~~~ json { "tasks": { "dev": "deno run -A npm:astro dev", @@ -909,9 +1010,11 @@ instead of `astro`: "preview": "deno run -A npm:astro preview" } } -``` +~~~~ -## SolidStart + +SolidStart +---------- _This API is available since Fedify 2.2.0._ @@ -921,41 +1024,41 @@ middleware to integrate Fedify with SolidStart: ::: code-group -```sh [Deno] +~~~~ sh [Deno] deno add jsr:@fedify/solidstart -``` +~~~~ -```sh [npm] +~~~~ sh [npm] npm add @fedify/solidstart -``` +~~~~ -```sh [pnpm] +~~~~ sh [pnpm] pnpm add @fedify/solidstart -``` +~~~~ -```sh [Yarn] +~~~~ sh [Yarn] yarn add @fedify/solidstart -``` +~~~~ -```sh [Bun] +~~~~ sh [Bun] bun add @fedify/solidstart -``` +~~~~ ::: First, set up the middleware entry point in your _app.config.ts_: -```typescript +~~~~ typescript import { defineConfig } from "@solidjs/start/config"; export default defineConfig({ middleware: "src/middleware/index.ts", // [!code highlight] }); -``` +~~~~ Then, create your middleware in _src/middleware/index.ts_: -```typescript +~~~~ typescript import { createFederation } from "@fedify/fedify"; import { fedifyMiddleware } from "@fedify/solidstart"; @@ -964,11 +1067,13 @@ const federation = createFederation({ }); export default fedifyMiddleware(federation, (event) => undefined); // [!code highlight] -``` +~~~~ [Solid]: https://www.solidjs.com/ -## Fresh + +Fresh +----- _This API is available since Fedify 2.0.0._ @@ -978,9 +1083,9 @@ Fresh. ::: code-group -```sh [Deno] +~~~~ sh [Deno] deno add jsr:@fedify/fresh -``` +~~~~ ::: @@ -996,7 +1101,7 @@ deno add jsr:@fedify/fresh > Due to `@fedify/fedify` use `Temporal` inside, you should add `deno.unstable` > to `compilerOptions.libs` field of `deno.json`. > -> ```json +> ~~~~ json > "compilerOptions": { > "lib": [ > "dom", @@ -1006,11 +1111,11 @@ deno add jsr:@fedify/fresh > "deno.unstable" > ], > ... -> ``` +> ~~~~ Put the following code in your _routes/\_middleware.ts_ file: -```typescript [_middelware.ts] +~~~~ typescript [_middelware.ts] import { createFederation } from "@fedify/fedify"; import { integrateHandler } from "@fedify/fresh"; import { define } from "../utils.ts"; @@ -1023,12 +1128,12 @@ const federation = createFederation({ export default define.middleware( integrateHandler(federation, () => undefined), ); -``` +~~~~ Or you can use `app.use()` in your `main.ts` to register the middleware globally: -```typescript [main.ts] +~~~~ typescript [main.ts] import { App } from "fresh"; import { createFederation } from "@fedify/fedify"; import { integrateHandler } from "@fedify/fresh"; @@ -1042,11 +1147,13 @@ const fedifyMiddleware = define.middleware( integrateHandler(federation, () => undefined), ); app.use(fedifyMiddleware); -``` +~~~~ [Fresh]: https://fresh.deno.dev/ -## Custom middleware + +Custom middleware +----------------- Even if you are using a web framework that is not officially supported by Fedify, you can still integrate Fedify with the framework by creating a custom @@ -1065,7 +1172,7 @@ Fedify to the client. At this point, you can use `onNotFound` and The following is an example of a custom middleware for a hypothetical web framework: -```typescript +~~~~ typescript import { Federation } from "@fedify/fedify"; export type Middleware = ( @@ -1108,7 +1215,7 @@ export function createFedifyMiddleware( }); }; } -``` +~~~~ In some cases, your web framework may not represent requests and responses as [`Request`] and [`Response`] objects. In that case, you need to convert the diff --git a/examples/README.md b/examples/README.md index a0de84ab8..f2a1ffd40 100644 --- a/examples/README.md +++ b/examples/README.md @@ -20,6 +20,7 @@ added in the future.[^1] - [Fedify–Next.js integration example using `@fedify/next`](./next-integration/) - [Fedify–Next.js 14 integration example](./next14-app-router/) - [Fedify–Next.js 15 integration example](./next15-app-router/) + - [Fedify–Nuxt integration example](./nuxt/) - [Fedify–SolidStart integration example](./solidstart/) - [Fedify on Cloudflare Workers example](./cloudflare-workers/) diff --git a/examples/adonis/README.md b/examples/adonis/README.md index d5c3528ec..3eb83f560 100644 --- a/examples/adonis/README.md +++ b/examples/adonis/README.md @@ -1,39 +1,42 @@ -# Fedify–AdonisJS integration example +Fedify–Adonisjs integration example +=================================== This is a simple example of how to integrate Fedify into an [AdonisJS] application using the `@fedify/adonis` package. [AdonisJS]: https://adonisjs.com/ -## Running the example -1. Clone the repository: +Running the example +------------------- - ```sh - git clone https://github.com/fedify-dev/fedify.git - cd fedify/examples/adonis - ``` +1. Clone the repository: -2. Install dependencies: + ~~~~ sh + git clone https://github.com/fedify-dev/fedify.git + cd fedify/examples/adonis + ~~~~ - ```sh - pnpm install - ``` +2. Install dependencies: -3. Start the server: + ~~~~ sh + pnpm install + ~~~~ - ```sh - pnpm dev & pnpx @fedify/cli tunnel 3333 - ``` +3. Start the server: -4. Open your browser tunneled URL and start interacting with the app. You can - see your handle such as `@demo@6c10b40c63d9e1ce7da55667ef0ef8b4.serveo.net`. + ~~~~ sh + pnpm dev & pnpx @fedify/cli tunnel 3333 + ~~~~ -5. Access and search your handle and follow. +4. Open your browser tunneled URL and start interacting with the app. You can + see your handle such as `@demo@6c10b40c63d9e1ce7da55667ef0ef8b4.serveo.net`. -6. You can see following list like: +5. Access and search your handle and follow. - ``` - This account has the below 1 followers: - https://activitypub.academy/users/beboes_bedoshs - ``` +6. You can see following list like: + + ~~~~ + This account has the below 1 followers: + https://activitypub.academy/users/beboes_bedoshs + ~~~~ diff --git a/examples/adonis/src/app.ts b/examples/adonis/src/app.ts index 6589e62dd..a8f55e825 100644 --- a/examples/adonis/src/app.ts +++ b/examples/adonis/src/app.ts @@ -32,7 +32,7 @@ function createHttpContext( export const server = createServer(async (req, res) => { const ctx = createHttpContext(req, res); - await middleware.handle(ctx, async () => { + await middleware.handle(ctx, () => { const host = req.headers.host ?? "localhost"; res.writeHead(200, { "Content-Type": "text/plain" }); res.end(`\ diff --git a/examples/nuxt/.gitignore b/examples/nuxt/.gitignore new file mode 100644 index 000000000..56efb2882 --- /dev/null +++ b/examples/nuxt/.gitignore @@ -0,0 +1,4 @@ +.nuxt +.output +dist +node_modules \ No newline at end of file diff --git a/examples/nuxt/app/app.vue b/examples/nuxt/app/app.vue new file mode 100644 index 000000000..16d886ad3 --- /dev/null +++ b/examples/nuxt/app/app.vue @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/examples/nuxt/app/pages/index.vue b/examples/nuxt/app/pages/index.vue new file mode 100644 index 000000000..f5cb0b911 --- /dev/null +++ b/examples/nuxt/app/pages/index.vue @@ -0,0 +1,95 @@ + + + \ No newline at end of file diff --git a/examples/nuxt/app/pages/users/[identifier].vue b/examples/nuxt/app/pages/users/[identifier].vue new file mode 100644 index 000000000..81b09448a --- /dev/null +++ b/examples/nuxt/app/pages/users/[identifier].vue @@ -0,0 +1,116 @@ + + + + + \ No newline at end of file diff --git a/examples/nuxt/nuxt.config.ts b/examples/nuxt/nuxt.config.ts new file mode 100644 index 000000000..f0c7a1645 --- /dev/null +++ b/examples/nuxt/nuxt.config.ts @@ -0,0 +1,7 @@ +export default defineNuxtConfig({ + compatibilityDate: "2025-07-15", + devtools: { enabled: true }, + nitro: { + errorHandler: "./server/error", + }, +}); diff --git a/examples/nuxt/package.json b/examples/nuxt/package.json new file mode 100644 index 000000000..03c72ee05 --- /dev/null +++ b/examples/nuxt/package.json @@ -0,0 +1,22 @@ +{ + "name": "nuxt-example", + "private": true, + "type": "module", + "scripts": { + "dev": "nuxt dev", + "build": "nuxt build", + "preview": "nuxt preview", + "postinstall": "nuxt prepare" + }, + "dependencies": { + "@fedify/fedify": "workspace:^", + "@fedify/nuxt": "workspace:^", + "@fedify/vocab": "workspace:^", + "nuxt": "catalog:", + "vue": "catalog:", + "vue-router": "catalog:" + }, + "devDependencies": { + "typescript": "catalog:" + } +} diff --git a/examples/nuxt/server/error.ts b/examples/nuxt/server/error.ts new file mode 100644 index 000000000..4f5be49ff --- /dev/null +++ b/examples/nuxt/server/error.ts @@ -0,0 +1,3 @@ +import { fedifyErrorHandler } from "@fedify/nuxt"; + +export default fedifyErrorHandler; diff --git a/examples/nuxt/server/federation.ts b/examples/nuxt/server/federation.ts new file mode 100644 index 000000000..a9122582f --- /dev/null +++ b/examples/nuxt/server/federation.ts @@ -0,0 +1,132 @@ +import { + createFederation, + generateCryptoKeyPair, + MemoryKvStore, +} from "@fedify/fedify"; +import { + Accept, + Endpoints, + Follow, + Note, + Person, + type Recipient, + Undo, +} from "@fedify/vocab"; +import { keyPairsStore, relationStore } from "./store"; + +const federation = createFederation({ + kv: new MemoryKvStore(), +}); + +const IDENTIFIER = "demo"; + +federation.setNodeInfoDispatcher("/nodeinfo/2.1", (_ctx) => ({ + software: { + name: "fedify-nuxt", + version: "0.0.1", + }, + protocols: ["activitypub"], + usage: { + users: { total: 1, activeHalfyear: 1, activeMonth: 1 }, + localPosts: 0, + localComments: 0, + }, +})); + +federation + .setActorDispatcher("/users/{identifier}", async (context, identifier) => { + if (identifier !== IDENTIFIER) { + return null; + } + const keyPairs = await context.getActorKeyPairs(identifier); + return new Person({ + id: context.getActorUri(identifier), + name: "Fedify Demo", + summary: "This is a Fedify demo account on Nuxt.", + preferredUsername: identifier, + url: new URL(`/users/${identifier}`, context.url), + inbox: context.getInboxUri(identifier), + endpoints: new Endpoints({ sharedInbox: context.getInboxUri() }), + publicKey: keyPairs[0].cryptographicKey, + assertionMethods: keyPairs.map((keyPair) => keyPair.multikey), + }); + }) + .setKeyPairsDispatcher(async (_, identifier) => { + if (identifier !== IDENTIFIER) { + return []; + } + const keyPairs = keyPairsStore.get(identifier); + if (keyPairs != null) { + return keyPairs.map(({ privateKey, publicKey }) => ({ + privateKey, + publicKey, + })); + } + const { privateKey, publicKey } = await generateCryptoKeyPair(); + const generated = [{ privateKey, publicKey }]; + keyPairsStore.set(identifier, generated); + return generated; + }); + +federation + .setInboxListeners("/users/{identifier}/inbox", "/inbox") + .on(Follow, async (context, follow) => { + if ( + follow.id == null || + follow.actorId == null || + follow.objectId == null + ) { + return; + } + const result = context.parseUri(follow.objectId); + if (result?.type !== "actor" || result.identifier !== IDENTIFIER) { + return; + } + const follower = await follow.getActor(context); + if (!(follower instanceof Person) || follower.id == null) { + throw new Error("follower is null"); + } + await context.sendActivity( + { identifier: result.identifier }, + follower, + new Accept({ + id: new URL( + `#accepts/${follower.id.href}`, + context.getActorUri(IDENTIFIER), + ), + actor: follow.objectId, + object: follow, + }), + ); + relationStore.set(follower.id.href, follower); + }) + .on(Undo, async (_context, undo) => { + const activity = await undo.getObject(); + if (!(activity instanceof Follow) || undo.actorId == null) { + return; + } + relationStore.delete(undo.actorId.href); + }); + +federation.setObjectDispatcher( + Note, + "/users/{identifier}/posts/{id}", + (context, values) => + new Note({ + id: context.getObjectUri(Note, values), + attribution: context.getActorUri(values.identifier), + name: values.id, + }), +); + +federation.setFollowersDispatcher("/users/{identifier}/followers", () => { + const followers = Array.from(relationStore.values()); + const items: Recipient[] = followers.map((follower) => ({ + id: follower.id, + inboxId: follower.inboxId, + endpoints: follower.endpoints, + })); + return { items }; +}); + +export default federation; diff --git a/examples/nuxt/server/middleware/federation.ts b/examples/nuxt/server/middleware/federation.ts new file mode 100644 index 000000000..013ea4c94 --- /dev/null +++ b/examples/nuxt/server/middleware/federation.ts @@ -0,0 +1,4 @@ +import { fedifyHandler } from "@fedify/nuxt"; +import federation from "../federation"; + +export default fedifyHandler(federation); diff --git a/examples/nuxt/server/store.ts b/examples/nuxt/server/store.ts new file mode 100644 index 000000000..b7394ca05 --- /dev/null +++ b/examples/nuxt/server/store.ts @@ -0,0 +1,4 @@ +import type { Person } from "@fedify/vocab"; + +export const keyPairsStore = new Map(); +export const relationStore = new Map(); diff --git a/examples/nuxt/tsconfig.json b/examples/nuxt/tsconfig.json new file mode 100644 index 000000000..4b34df157 --- /dev/null +++ b/examples/nuxt/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "./.nuxt/tsconfig.json" +} diff --git a/examples/test-examples/mod.ts b/examples/test-examples/mod.ts index 6963257f5..14f9bdd4d 100644 --- a/examples/test-examples/mod.ts +++ b/examples/test-examples/mod.ts @@ -257,6 +257,18 @@ const SERVER_EXAMPLES: ServerExample[] = [ readyUrl: "http://localhost:3000/", readyTimeout: 30_000, }, + { + // Nuxt app using @fedify/nuxt server middleware and Nitro error handler. + // Requires a build step before starting. + name: "nuxt", + dir: "nuxt", + buildCmd: ["pnpm", "build"], + startCmd: ["pnpm", "preview"], + port: 3000, + actor: "demo", + readyUrl: "http://localhost:3000/", + readyTimeout: 30_000, + }, { // SvelteKit sample using @fedify/sveltekit; actor path is /users/{identifier}. // Built with vite; served with vite preview on port 4173. diff --git a/packages/adonis/README.md b/packages/adonis/README.md index 69261365d..dfde360a4 100644 --- a/packages/adonis/README.md +++ b/packages/adonis/README.md @@ -1,7 +1,7 @@ -@fedify/adonis: Integrate Fedify with AdonisJS -=============================================== +@fedify/adonis: Integrate Fedify with adonisjs +============================================== [![JSR][JSR badge]][JSR] [![npm][npm badge]][npm] @@ -55,7 +55,7 @@ const federation = createFederation({ export default federation; ~~~~ -Then, create a middleware file, e.g., *app/middleware/fedify_middleware.ts*: +Then, create a middleware file, e.g., *app/middleware/fedify\_middleware.ts*: ~~~~ typescript import { fedifyMiddleware } from "@fedify/adonis"; diff --git a/packages/adonis/src/mod.ts b/packages/adonis/src/mod.ts index 7c54818ff..98ba7a31b 100644 --- a/packages/adonis/src/mod.ts +++ b/packages/adonis/src/mod.ts @@ -163,7 +163,7 @@ function fromAdonisRequest(ctx: AdonisHttpContext): Request { }); } -async function writeResponse( +function writeResponse( ctx: AdonisHttpContext, response: Response, ): Promise { @@ -172,7 +172,7 @@ async function writeResponse( response.headers.forEach((value, key) => nodeRes.setHeader(key, value)); if (response.body == null) { nodeRes.end(); - return; + return Promise.resolve(); } const body = response.body; const reader = body.getReader(); diff --git a/packages/fedify/README.md b/packages/fedify/README.md index 5193e6c17..b4559ba89 100644 --- a/packages/fedify/README.md +++ b/packages/fedify/README.md @@ -113,6 +113,7 @@ Here is the list of packages: | [@fedify/lint](/packages/lint/) | [JSR][jsr:@fedify/lint] | [npm][npm:@fedify/lint] | Linting utilities | | [@fedify/nestjs](/packages/nestjs/) | | [npm][npm:@fedify/nestjs] | NestJS integration | | [@fedify/next](/packages/next/) | | [npm][npm:@fedify/next] | Next.js integration | +| [@fedify/nuxt](/packages/nuxt/) | [JSR][jsr:@fedify/nuxt] | [npm][npm:@fedify/nuxt] | Nuxt integration | | [@fedify/mysql](/packages/mysql/) | [JSR][jsr:@fedify/mysql] | [npm][npm:@fedify/mysql] | MySQL/MariaDB driver | | [@fedify/postgres](/packages/postgres/) | [JSR][jsr:@fedify/postgres] | [npm][npm:@fedify/postgres] | PostgreSQL driver | | [@fedify/redis](/packages/redis/) | [JSR][jsr:@fedify/redis] | [npm][npm:@fedify/redis] | Redis driver | @@ -158,6 +159,8 @@ Here is the list of packages: [npm:@fedify/lint]: https://www.npmjs.com/package/@fedify/lint [npm:@fedify/nestjs]: https://www.npmjs.com/package/@fedify/nestjs [npm:@fedify/next]: https://www.npmjs.com/package/@fedify/next +[jsr:@fedify/nuxt]: https://jsr.io/@fedify/nuxt +[npm:@fedify/nuxt]: https://www.npmjs.com/package/@fedify/nuxt [jsr:@fedify/mysql]: https://jsr.io/@fedify/mysql [npm:@fedify/mysql]: https://www.npmjs.com/package/@fedify/mysql [jsr:@fedify/postgres]: https://jsr.io/@fedify/postgres diff --git a/packages/init/src/action/templates.ts b/packages/init/src/action/templates.ts index 8e489c11e..72051dee7 100644 --- a/packages/init/src/action/templates.ts +++ b/packages/init/src/action/templates.ts @@ -21,10 +21,15 @@ export const loadFederation = async ( kv, mq, packageManager, + webFramework, }: InitCommandData & { imports: string }, ) => pipe( - await readTemplate("defaults/federation.ts"), + await readTemplate( + webFramework === "nuxt" && hasTopLevelAwait(kv.object, mq.object) + ? "nuxt/server/federation.ts" + : "defaults/federation.ts", + ), replace(/\/\* imports \*\//, imports), replace(/\/\* logger \*\//, JSON.stringify(projectName)), replace(/\/\* kv \*\//, convertEnv(kv.object, packageManager)), @@ -111,3 +116,6 @@ export const convertEnv = (obj: string, pm: PackageManager) => pm === "deno" && ENV_REG_EXP.test(obj) ? obj.replaceAll(ENV_REG_EXP, (_, g1) => `Deno.env.get("${g1}")`) : obj; + +const hasTopLevelAwait = (...values: string[]) => + values.some((value) => /\bawait\b/.test(value)); diff --git a/packages/init/src/const.ts b/packages/init/src/const.ts index fdd0b12df..f2970557e 100644 --- a/packages/init/src/const.ts +++ b/packages/init/src/const.ts @@ -14,6 +14,7 @@ export const WEB_FRAMEWORK = [ "astro", "express", "solidstart", + "nuxt", "adonis", ] as const; /** All supported message queue backend identifiers. */ diff --git a/packages/init/src/templates/nuxt/nuxt.config.ts.tpl b/packages/init/src/templates/nuxt/nuxt.config.ts.tpl new file mode 100644 index 000000000..ccccb78c1 --- /dev/null +++ b/packages/init/src/templates/nuxt/nuxt.config.ts.tpl @@ -0,0 +1,7 @@ +export default defineNuxtConfig({ + compatibilityDate: "2025-07-15", + devtools: { enabled: true }, + nitro: { + errorHandler: "./server/error", + }, +}); \ No newline at end of file diff --git a/packages/init/src/templates/nuxt/server/error.ts.tpl b/packages/init/src/templates/nuxt/server/error.ts.tpl new file mode 100644 index 000000000..a3223616d --- /dev/null +++ b/packages/init/src/templates/nuxt/server/error.ts.tpl @@ -0,0 +1,3 @@ +import { fedifyErrorHandler } from "@fedify/nuxt"; + +export default fedifyErrorHandler; \ No newline at end of file diff --git a/packages/init/src/templates/nuxt/server/federation.ts.tpl b/packages/init/src/templates/nuxt/server/federation.ts.tpl new file mode 100644 index 000000000..8f004172c --- /dev/null +++ b/packages/init/src/templates/nuxt/server/federation.ts.tpl @@ -0,0 +1,26 @@ +import { createFederation } from "@fedify/fedify"; +import { Person } from "@fedify/vocab"; +import { getLogger } from "@logtape/logtape"; +/* imports */ + +const logger = getLogger(/* logger */); + +export default (async () => { + const federation = createFederation({ + kv: /* kv */, + queue: /* queue */, + }); + + federation.setActorDispatcher( + "/users/{identifier}", + async (ctx, identifier) => { + return new Person({ + id: ctx.getActorUri(identifier), + preferredUsername: identifier, + name: identifier, + }); + }, + ); + + return federation; +})(); \ No newline at end of file diff --git a/packages/init/src/templates/nuxt/server/middleware/federation.ts.tpl b/packages/init/src/templates/nuxt/server/middleware/federation.ts.tpl new file mode 100644 index 000000000..d6bf4f0ed --- /dev/null +++ b/packages/init/src/templates/nuxt/server/middleware/federation.ts.tpl @@ -0,0 +1,4 @@ +import { fedifyHandler } from "@fedify/nuxt"; +import federation from "../federation"; + +export default fedifyHandler(federation); \ No newline at end of file diff --git a/packages/init/src/test/port.ts b/packages/init/src/test/port.ts index 67681cecd..924ac69e2 100644 --- a/packages/init/src/test/port.ts +++ b/packages/init/src/test/port.ts @@ -146,6 +146,20 @@ export async function replacePortInApp( return; } + if (wf === "nuxt") { + // Insert devServer.port into the Nuxt config + const configPath = join(dir, "nuxt.config.ts"); + const content = await readFile(configPath, "utf8"); + await writeFile( + configPath, + content.replace( + "defineNuxtConfig({", + `defineNuxtConfig({\n devServer: { port: ${newPort} },`, + ), + ); + return; + } + printErrorMessage`Unknown framework ${wf} — cannot replace port.`; } diff --git a/packages/init/src/types.ts b/packages/init/src/types.ts index fb46c9f0e..885a8ecde 100644 --- a/packages/init/src/types.ts +++ b/packages/init/src/types.ts @@ -11,7 +11,7 @@ import type { RequiredNotNull } from "./utils.ts"; /** Supported package manager identifiers: `"deno"`, `"pnpm"`, `"bun"`, `"yarn"`, `"npm"`. */ export type PackageManager = typeof PACKAGE_MANAGER[number]; -/** Supported web framework identifiers: `"hono"`, `"nitro"`, `"next"`, `"elysia"`, `"astro"`, `"express"`. */ +/** Supported web framework identifiers: `"hono"`, `"nitro"`, `"next"`, `"elysia"`, `"astro"`, `"express"`, `"solidstart"`, `"nuxt"`. */ export type WebFramework = typeof WEB_FRAMEWORK[number]; /** Supported message queue identifiers: `"denokv"`, `"redis"`, `"postgres"`, `"amqp"`. */ diff --git a/packages/init/src/webframeworks/mod.ts b/packages/init/src/webframeworks/mod.ts index f9b44d734..02ec9ebef 100644 --- a/packages/init/src/webframeworks/mod.ts +++ b/packages/init/src/webframeworks/mod.ts @@ -7,6 +7,7 @@ import express from "./express.ts"; import hono from "./hono.ts"; import next from "./next.ts"; import nitro from "./nitro.ts"; +import nuxt from "./nuxt.ts"; import solidstart from "./solidstart.ts"; /** @@ -25,6 +26,7 @@ const webFrameworks: WebFrameworks = { hono, next, nitro, + nuxt, solidstart, } as const; diff --git a/packages/init/src/webframeworks/nuxt.ts b/packages/init/src/webframeworks/nuxt.ts new file mode 100644 index 000000000..e5ffaa459 --- /dev/null +++ b/packages/init/src/webframeworks/nuxt.ts @@ -0,0 +1,60 @@ +import { PACKAGE_VERSION, readTemplate } from "../lib.ts"; +import type { PackageManager, WebFrameworkDescription } from "../types.ts"; +import { getInstruction } from "./utils.ts"; + +const SUPPORTED_PACKAGE_MANAGERS = [ + "pnpm", + "bun", + "yarn", + "npm", +] as const satisfies readonly PackageManager[]; + +const nuxtDescription: WebFrameworkDescription = { + label: "Nuxt", + packageManagers: SUPPORTED_PACKAGE_MANAGERS, + defaultPort: 3000, + init: async ({ packageManager: pm }) => ({ + command: getNuxtInitCommand(pm), + dependencies: { + "@fedify/nuxt": PACKAGE_VERSION, + }, + federationFile: "server/federation.ts", + loggingFile: "server/logging.ts", + files: { + "nuxt.config.ts": await readTemplate("nuxt/nuxt.config.ts"), + "server/error.ts": await readTemplate("nuxt/server/error.ts"), + "server/middleware/federation.ts": await readTemplate( + "nuxt/server/middleware/federation.ts", + ), + }, + instruction: getInstruction(pm, 3000), + }), +}; + +export default nuxtDescription; + +const getNuxtInitCommand = (pm: PackageManager): string[] => [ + "env", + "CI=1", + ...createNuxtAppCommand(pm), + ".", + "--template", + "minimal", + "--force", + "--no-install", + "--packageManager", + pm, + "--gitInit=false", + "&&", + "rm", + "nuxt.config.ts", +]; + +const createNuxtAppCommand = (pm: PackageManager): string[] => + pm === "bun" + ? ["bunx", "nuxi@latest", "init"] + : pm === "npm" + ? ["npx", "nuxi@latest", "init"] + : pm === "pnpm" + ? ["pnpm", "dlx", "nuxi@latest", "init"] + : ["yarn", "dlx", "nuxi@latest", "init"]; diff --git a/packages/nuxt/README.md b/packages/nuxt/README.md new file mode 100644 index 000000000..a6530a777 --- /dev/null +++ b/packages/nuxt/README.md @@ -0,0 +1,87 @@ + + +@fedify/Nuxt: Integrate Fedify with Nuxt +======================================== + +[![JSR][JSR badge]][JSR] +[![npm][npm badge]][npm] +[![Matrix][Matrix badge]][Matrix] +[![Follow @fedify@hollo.social][@fedify@hollo.social badge]][@fedify@hollo.social] + +This package provides a simple way to integrate [Fedify] with [Nuxt] 4.x. +It installs a server middleware handler that lets Nuxt and Fedify share the +same routes with content negotiation, and it also provides an error handler +for the final 406 fallback when Nuxt cannot serve HTML for the same path. + +[JSR badge]: https://jsr.io/badges/@fedify/nuxt +[JSR]: https://jsr.io/@fedify/nuxt +[npm badge]: https://img.shields.io/npm/v/@fedify/nuxt?logo=npm +[npm]: https://www.npmjs.com/package/@fedify/nuxt +[Matrix badge]: https://img.shields.io/matrix/fedify%3Amatrix.org +[Matrix]: https://matrix.to/#/#fedify:matrix.org +[@fedify@hollo.social badge]: https://fedi-badge.deno.dev/@fedify@hollo.social/followers.svg +[@fedify@hollo.social]: https://hollo.social/@fedify +[Fedify]: https://fedify.dev/ +[Nuxt]: https://nuxt.com/ + + +Installation +------------ + +::: code-group + +~~~~ sh [Deno] +deno add jsr:@fedify/nuxt +~~~~ + +~~~~ sh [npm] +npm add @fedify/nuxt +~~~~ + +~~~~ sh [pnpm] +pnpm add @fedify/nuxt +~~~~ + +~~~~ sh [Yarn] +yarn add @fedify/nuxt +~~~~ + +~~~~ sh [Bun] +bun add @fedify/nuxt +~~~~ + +::: + + +Usage +----- + +Configure Nuxt's Nitro error handler in *nuxt.config.ts*: + +~~~~ typescript +export default defineNuxtConfig({ + nitro: { + errorHandler: "./server/error", + }, +}); +~~~~ + +Then create *server/error.ts*: + +~~~~ typescript +import { fedifyErrorHandler } from "@fedify/nuxt"; + +export default fedifyErrorHandler; +~~~~ + +Finally, add the Fedify middleware in *server/middleware/federation.ts*: + +~~~~ typescript +import federation from "../federation"; +import { fedifyHandler } from "@fedify/nuxt"; + +export default fedifyHandler( + federation, + (event, request) => undefined, +); +~~~~ diff --git a/packages/nuxt/deno.json b/packages/nuxt/deno.json new file mode 100644 index 000000000..6b5f1d986 --- /dev/null +++ b/packages/nuxt/deno.json @@ -0,0 +1,21 @@ +{ + "name": "@fedify/nuxt", + "version": "2.2.0", + "license": "MIT", + "exports": { + ".": "./src/index.ts" + }, + "exclude": [ + "dist", + "node_modules" + ], + "publish": { + "exclude": [ + "**/*.test.ts", + "tsdown.config.ts" + ] + }, + "tasks": { + "check": "deno fmt --check && deno lint && deno check src/*.ts" + } +} diff --git a/packages/nuxt/package.json b/packages/nuxt/package.json new file mode 100644 index 000000000..1cf7e64a2 --- /dev/null +++ b/packages/nuxt/package.json @@ -0,0 +1,64 @@ +{ + "name": "@fedify/nuxt", + "version": "2.2.0", + "description": "Integrate Fedify with Nuxt", + "keywords": [ + "Fedify", + "ActivityPub", + "Fediverse", + "Nuxt", + "Nitro" + ], + "homepage": "https://fedify.dev/", + "repository": { + "type": "git", + "url": "git+https://github.com/fedify-dev/fedify.git", + "directory": "packages/nuxt" + }, + "license": "MIT", + "bugs": { + "url": "https://github.com/fedify-dev/fedify/issues" + }, + "funding": [ + "https://opencollective.com/fedify", + "https://github.com/sponsors/dahlia" + ], + "type": "module", + "module": "dist/index.js", + "main": "dist/index.cjs", + "types": "dist/index.d.ts", + "exports": { + ".": { + "types": { + "import": "./dist/index.d.ts", + "require": "./dist/index.d.cts", + "default": "./dist/index.d.ts" + }, + "import": "./dist/index.js", + "require": "./dist/index.cjs", + "default": "./dist/index.js" + }, + "./package.json": "./package.json" + }, + "files": [ + "dist/", + "package.json" + ], + "dependencies": { + "h3": "catalog:" + }, + "peerDependencies": { + "@fedify/fedify": "workspace:^", + "nuxt": "catalog:" + }, + "devDependencies": { + "tsdown": "catalog:", + "typescript": "catalog:" + }, + "scripts": { + "build:self": "tsdown", + "build": "pnpm --filter @fedify/nuxt... run build:self", + "prepack": "pnpm build", + "prepublish": "pnpm build" + } +} diff --git a/packages/nuxt/src/index.ts b/packages/nuxt/src/index.ts new file mode 100644 index 000000000..7458b8f67 --- /dev/null +++ b/packages/nuxt/src/index.ts @@ -0,0 +1,120 @@ +/** + * Fedify with Nuxt + * ================ + * + * This package provides a [Nuxt] server handler to integrate with Fedify. + * + * [Nuxt]: https://nuxt.com/ + * + * @module + * @since 2.2.0 + */ + +import type { Federation } from "@fedify/fedify/federation"; +import { + defineEventHandler, + type EventHandler, + type EventHandlerRequest, + type EventHandlerResponse, + type H3Error, + type H3Event, + toWebRequest, +} from "h3"; + +/** + * A factory function that creates the context data that will be passed to the + * {@link Federation} instance. + * + * @template TContextData The type of the context data. + * @param event The Nuxt/Nitro event for the current request. + * @param request The Web API request converted from the event. + * @returns The context data, or a promise resolving to the context data. + * @since 2.2.0 + */ +export type ContextDataFactory = ( + event: H3Event, + request: Request, +) => Promise | TContextData; + +/** + * Create a Nuxt server handler to integrate with the {@link Federation} + * object. + * + * This handler is intended to be used from a file under + * *server/middleware/*. When Fedify does not own the route, it delegates to + * the rest of the Nuxt request pipeline. When content negotiation fails, it + * stores the 406 response so that {@link fedifyErrorHandler} can return it if + * Nuxt later resolves the same request to a 404. + * + * @example server/middleware/federation.ts + * ``` typescript + * import federation from "../federation"; + * import { fedifyHandler } from "@fedify/nuxt"; + * + * export default fedifyHandler(federation); + * ``` + * + * @template TContextData A type of the context data for the + * {@link Federation} object. + * @param federation A {@link Federation} object to integrate with Nuxt. + * @param contextDataFactory A function to create context data for the + * {@link Federation} object. + * @returns A Nuxt-compatible event handler. + * @since 2.2.0 + */ +export function fedifyHandler( + federation: Federation | Promise>, + contextDataFactory: ContextDataFactory = () => + undefined as TContextData, +): EventHandler { + return defineEventHandler({ + async handler(event) { + const resolvedFederation = await federation; + const request = toWebRequest(event); + const response = await resolvedFederation.fetch(request, { + contextData: await contextDataFactory(event, request), + }); + if (response.status === 404) return; + if (response.status === 406) { + event.context[NOT_ACCEPTABLE_RESPONSE_KEY] = response; + return; + } + await event.respondWith(response); + }, + }); +} + +/** + * A Nitro error handler that finalizes Fedify content negotiation for Nuxt. + * + * Configure this as `nitro.errorHandler` in *nuxt.config.ts*. If + * {@link fedifyHandler} stored a 406 response and Nuxt later resolves the same + * request to a 404, this handler returns the stored 406 instead. + * + * @example server/error.ts + * ``` typescript + * import { fedifyErrorHandler } from "@fedify/nuxt"; + * + * export default fedifyErrorHandler; + * ``` + * + * @param error The H3 error raised by Nitro. + * @param event The H3 event for the request. + * @returns Nothing. The response is written directly to the event when + * needed. + * @since 2.2.0 + */ +export async function fedifyErrorHandler( + error: H3Error, + event: H3Event, +): Promise { + if ( + NOT_ACCEPTABLE_RESPONSE_KEY in event.context && + event.context[NOT_ACCEPTABLE_RESPONSE_KEY] instanceof Response && + error.statusCode === 404 + ) { + await event.respondWith(event.context[NOT_ACCEPTABLE_RESPONSE_KEY]); + } +} + +const NOT_ACCEPTABLE_RESPONSE_KEY = "__fedify_response__"; diff --git a/packages/nuxt/tsdown.config.ts b/packages/nuxt/tsdown.config.ts new file mode 100644 index 000000000..4c38656b6 --- /dev/null +++ b/packages/nuxt/tsdown.config.ts @@ -0,0 +1,14 @@ +import { defineConfig } from "tsdown"; + +export default defineConfig({ + entry: ["src/index.ts"], + dts: { compilerOptions: { isolatedDeclarations: true, declaration: true } }, + format: ["esm", "cjs"], + platform: "neutral", + outExtensions({ format }) { + return { + js: format === "cjs" ? ".cjs" : ".js", + dts: format === "cjs" ? ".d.cts" : ".d.ts", + }; + }, +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0e28ba6d6..3c9873084 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -138,6 +138,9 @@ catalogs: next: specifier: ^15.4.6 version: 15.5.0 + nuxt: + specifier: ^4.1.3 + version: 4.4.2 pkijs: specifier: ^3.3.3 version: 3.3.3 @@ -153,6 +156,12 @@ catalogs: urlpattern-polyfill: specifier: ^10.1.0 version: 10.1.0 + vue: + specifier: ^3.5.17 + version: 3.5.17 + vue-router: + specifier: ^4.5.1 + version: 4.6.4 importers: @@ -342,16 +351,16 @@ importers: version: 5.9.3 vitepress: specifier: ^1.6.3 - version: 1.6.3(@algolia/client-search@5.29.0)(@types/node@22.19.1)(@types/react@18.3.23)(lightningcss@1.30.1)(postcss@8.5.6)(search-insights@2.17.3)(terser@5.46.0)(typescript@5.9.3) + version: 1.6.3(@algolia/client-search@5.29.0)(@types/node@22.19.1)(@types/react@18.3.23)(fuse.js@7.3.0)(lightningcss@1.30.1)(postcss@8.5.9)(search-insights@2.17.3)(terser@5.46.0)(typescript@5.9.3) vitepress-plugin-group-icons: specifier: ^1.3.5 - version: 1.6.1(markdown-it@14.1.0)(vite@7.1.3(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 1.6.1(markdown-it@14.1.0)(vite@7.3.2(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3)) vitepress-plugin-llms: specifier: ^1.1.0 version: 1.6.0 vitepress-plugin-mermaid: specifier: ^2.0.17 - version: 2.0.17(mermaid@11.7.0)(vitepress@1.6.3(@algolia/client-search@5.29.0)(@types/node@22.19.1)(@types/react@18.3.23)(lightningcss@1.30.1)(postcss@8.5.6)(search-insights@2.17.3)(terser@5.46.0)(typescript@5.9.3)) + version: 2.0.17(mermaid@11.7.0)(vitepress@1.6.3(@algolia/client-search@5.29.0)(@types/node@22.19.1)(@types/react@18.3.23)(fuse.js@7.3.0)(lightningcss@1.30.1)(postcss@8.5.9)(search-insights@2.17.3)(terser@5.46.0)(typescript@5.9.3)) x-forwarded-fetch: specifier: ^0.2.0 version: 0.2.0 @@ -388,10 +397,10 @@ importers: dependencies: '@astrojs/node': specifier: ^10.0.3 - version: 10.0.4(astro@5.17.3(@types/node@24.3.0)(db0@0.3.4(mysql2@3.18.2(@types/node@24.3.0)))(ioredis@5.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(rollup@4.59.0)(terser@5.46.0)(tsx@4.20.3)(typescript@5.9.3)(yaml@2.8.1)) + version: 10.0.4(astro@5.17.3(@types/node@24.3.0)(db0@0.3.4(mysql2@3.18.2(@types/node@24.3.0)))(ioredis@5.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(rollup@4.59.0)(terser@5.46.0)(tsx@4.20.3)(typescript@5.9.3)(yaml@2.8.3)) '@deno/astro-adapter': specifier: ^0.3.2 - version: 0.3.2(@opentelemetry/api@1.9.0)(astro@5.17.3(@types/node@24.3.0)(db0@0.3.4(mysql2@3.18.2(@types/node@24.3.0)))(ioredis@5.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(rollup@4.59.0)(terser@5.46.0)(tsx@4.20.3)(typescript@5.9.3)(yaml@2.8.1)) + version: 0.3.2(@opentelemetry/api@1.9.0)(astro@5.17.3(@types/node@24.3.0)(db0@0.3.4(mysql2@3.18.2(@types/node@24.3.0)))(ioredis@5.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(rollup@4.59.0)(terser@5.46.0)(tsx@4.20.3)(typescript@5.9.3)(yaml@2.8.3)) '@fedify/astro': specifier: workspace:^ version: link:../../packages/astro @@ -403,7 +412,7 @@ importers: version: link:../../packages/vocab astro: specifier: 'catalog:' - version: 5.17.3(@types/node@24.3.0)(db0@0.3.4(mysql2@3.18.2(@types/node@24.3.0)))(ioredis@5.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(rollup@4.59.0)(terser@5.46.0)(tsx@4.20.3)(typescript@5.9.3)(yaml@2.8.1) + version: 5.17.3(@types/node@24.3.0)(db0@0.3.4(mysql2@3.18.2(@types/node@24.3.0)))(ioredis@5.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(rollup@4.59.0)(terser@5.46.0)(tsx@4.20.3)(typescript@5.9.3)(yaml@2.8.3) examples/cloudflare-workers: dependencies: @@ -677,6 +686,31 @@ importers: specifier: 'catalog:' version: 5.9.3 + examples/nuxt: + dependencies: + '@fedify/fedify': + specifier: workspace:^ + version: link:../../packages/fedify + '@fedify/nuxt': + specifier: workspace:^ + version: link:../../packages/nuxt + '@fedify/vocab': + specifier: workspace:^ + version: link:../../packages/vocab + nuxt: + specifier: 'catalog:' + version: 4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5)(@parcel/watcher@2.5.6)(@types/node@24.3.0)(@vue/compiler-sfc@3.5.32)(cac@6.7.14)(db0@0.3.4(mysql2@3.18.2(@types/node@24.3.0)))(ioredis@5.10.0)(lightningcss@1.30.1)(magicast@0.5.2)(mysql2@3.18.2(@types/node@24.3.0))(optionator@0.9.4)(rolldown@1.0.0-rc.12(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5))(rollup-plugin-visualizer@6.0.11(rolldown@1.0.0-rc.12(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5))(rollup@4.59.0))(rollup@4.59.0)(terser@5.46.0)(tsx@4.20.3)(typescript@5.9.3)(vite@7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3))(yaml@2.8.3) + vue: + specifier: 'catalog:' + version: 3.5.17(typescript@5.9.3) + vue-router: + specifier: 'catalog:' + version: 4.6.4(vue@3.5.17(typescript@5.9.3)) + devDependencies: + typescript: + specifier: 'catalog:' + version: 5.9.3 + examples/solidstart: dependencies: '@fedify/fedify': @@ -693,13 +727,13 @@ importers: version: 0.15.4(solid-js@1.9.11) '@solidjs/start': specifier: ^1.3.2 - version: 1.3.2(solid-js@1.9.11)(vinxi@0.5.11(@types/node@24.3.0)(db0@0.3.4(mysql2@3.18.2(@types/node@24.3.0)))(ioredis@5.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(mysql2@3.18.2(@types/node@24.3.0))(rolldown@1.0.0-rc.12(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5))(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1))(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 1.3.2(solid-js@1.9.11)(vinxi@0.5.11(@types/node@24.3.0)(db0@0.3.4(mysql2@3.18.2(@types/node@24.3.0)))(ioredis@5.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(mysql2@3.18.2(@types/node@24.3.0))(rolldown@1.0.0-rc.12(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5))(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3))(vite@7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3)) solid-js: specifier: ^1.9.11 version: 1.9.11 vinxi: specifier: ^0.5.11 - version: 0.5.11(@types/node@24.3.0)(db0@0.3.4(mysql2@3.18.2(@types/node@24.3.0)))(ioredis@5.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(mysql2@3.18.2(@types/node@24.3.0))(rolldown@1.0.0-rc.12(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5))(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1) + version: 0.5.11(@types/node@24.3.0)(db0@0.3.4(mysql2@3.18.2(@types/node@24.3.0)))(ioredis@5.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(mysql2@3.18.2(@types/node@24.3.0))(rolldown@1.0.0-rc.12(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5))(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3) devDependencies: typescript: specifier: ^5.5.4 @@ -728,16 +762,16 @@ importers: version: 9.32.0 '@sveltejs/adapter-auto': specifier: ^6.0.0 - version: 6.1.0(@sveltejs/kit@2.36.2(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.1.3(svelte@5.38.3)(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1)))(svelte@5.38.3)(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1))) + version: 6.1.0(@sveltejs/kit@2.36.2(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.1.3(svelte@5.38.3)(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3)))(svelte@5.38.3)(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3))) '@sveltejs/kit': specifier: ^2.22.0 - version: 2.36.2(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.1.3(svelte@5.38.3)(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1)))(svelte@5.38.3)(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.36.2(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.1.3(svelte@5.38.3)(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3)))(svelte@5.38.3)(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3)) '@sveltejs/vite-plugin-svelte': specifier: ^6.0.0 - version: 6.1.3(svelte@5.38.3)(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 6.1.3(svelte@5.38.3)(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3)) '@tailwindcss/vite': specifier: ^4.0.0 - version: 4.1.12(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.12(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3)) eslint: specifier: ^9.18.0 version: 9.32.0(jiti@2.6.1) @@ -776,7 +810,7 @@ importers: version: 8.41.0(eslint@9.32.0(jiti@2.6.1))(typescript@5.9.2) vite: specifier: ^7.0.4 - version: 7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3) packages/adonis: dependencies: @@ -838,7 +872,7 @@ importers: version: link:../fedify astro: specifier: 'catalog:' - version: 5.17.3(@types/node@24.3.0)(db0@0.3.4(mysql2@3.18.2(@types/node@24.3.0)))(ioredis@5.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(rollup@4.59.0)(terser@5.46.0)(tsx@4.20.3)(typescript@5.9.3)(yaml@2.8.1) + version: 5.17.3(@types/node@24.3.0)(db0@0.3.4(mysql2@3.18.2(@types/node@24.3.0)))(ioredis@5.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(rollup@4.59.0)(terser@5.46.0)(tsx@4.20.3)(typescript@5.9.3)(yaml@2.8.3) devDependencies: tsdown: specifier: 'catalog:' @@ -858,7 +892,7 @@ importers: devDependencies: '@cloudflare/vitest-pool-workers': specifier: ^0.8.31 - version: 0.8.71(@cloudflare/workers-types@4.20251221.0)(@vitest/runner@3.2.4)(@vitest/snapshot@3.2.4)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 0.8.71(@cloudflare/workers-types@4.20251221.0)(@vitest/runner@3.2.4)(@vitest/snapshot@3.2.4)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3)) tsdown: specifier: 'catalog:' version: 0.21.7(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5)(typescript@5.9.3) @@ -867,7 +901,7 @@ importers: version: 5.9.3 vitest: specifier: ~3.2.0 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3) wrangler: specifier: ^4.21.1 version: 4.22.0(@cloudflare/workers-types@4.20251221.0) @@ -1434,6 +1468,25 @@ importers: specifier: 'catalog:' version: 5.9.3 + packages/nuxt: + dependencies: + '@fedify/fedify': + specifier: workspace:^ + version: link:../fedify + h3: + specifier: 'catalog:' + version: 1.15.3 + nuxt: + specifier: 'catalog:' + version: 4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5)(@parcel/watcher@2.5.6)(@types/node@24.3.0)(@vue/compiler-sfc@3.5.32)(cac@6.7.14)(db0@0.3.4(mysql2@3.18.2(@types/node@24.3.0)))(ioredis@5.10.0)(lightningcss@1.30.1)(magicast@0.5.2)(mysql2@3.18.2(@types/node@24.3.0))(optionator@0.9.4)(rolldown@1.0.0-rc.12(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5))(rollup-plugin-visualizer@6.0.11(rolldown@1.0.0-rc.12(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5))(rollup@4.59.0))(rollup@4.59.0)(terser@5.46.0)(tsx@4.20.3)(typescript@5.9.3)(vite@7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3))(yaml@2.8.3) + devDependencies: + tsdown: + specifier: 'catalog:' + version: 0.21.7(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5)(typescript@5.9.3) + typescript: + specifier: 'catalog:' + version: 5.9.3 + packages/postgres: dependencies: '@fedify/fedify': @@ -1534,7 +1587,7 @@ importers: version: link:../fedify '@solidjs/start': specifier: ^1.3.0 - version: 1.3.2(solid-js@1.9.11)(vinxi@0.5.11(@types/node@24.3.0)(db0@0.3.4(mysql2@3.18.2(@types/node@24.3.0)))(ioredis@5.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(mysql2@3.18.2(@types/node@24.3.0))(rolldown@1.0.0-rc.12(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5))(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1))(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 1.3.2(solid-js@1.9.11)(vinxi@0.5.11(@types/node@24.3.0)(db0@0.3.4(mysql2@3.18.2(@types/node@24.3.0)))(ioredis@5.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(mysql2@3.18.2(@types/node@24.3.0))(rolldown@1.0.0-rc.12(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5))(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3))(vite@7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3)) devDependencies: tsdown: specifier: 'catalog:' @@ -1578,7 +1631,7 @@ importers: version: link:../fedify '@sveltejs/kit': specifier: 'catalog:' - version: 2.36.2(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.1.3(svelte@5.38.3)(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1)))(svelte@5.38.3)(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.36.2(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.1.3(svelte@5.38.3)(vite@7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3)))(svelte@5.38.3)(vite@7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3)) devDependencies: tsdown: specifier: 'catalog:' @@ -2026,14 +2079,28 @@ packages: resolution: {integrity: sha512-em37/13/nR320G4jab/nIIHZgc2Wz2y/D39lxnTyxB4/D/omPQncl/lSdlnJY1OhQcRGugTSIF2l/69o31C9dA==} engines: {node: ^20.19.0 || >=22.12.0} + '@babel/helper-annotate-as-pure@7.27.3': + resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} + engines: {node: '>=6.9.0'} + '@babel/helper-compilation-targets@7.28.6': resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} engines: {node: '>=6.9.0'} + '@babel/helper-create-class-features-plugin@7.28.6': + resolution: {integrity: sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@babel/helper-globals@7.28.0': resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} engines: {node: '>=6.9.0'} + '@babel/helper-member-expression-to-functions@7.28.5': + resolution: {integrity: sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==} + engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.18.6': resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} engines: {node: '>=6.9.0'} @@ -2048,10 +2115,24 @@ packages: peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-optimise-call-expression@7.27.1': + resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} + engines: {node: '>=6.9.0'} + '@babel/helper-plugin-utils@7.28.6': resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} engines: {node: '>=6.9.0'} + '@babel/helper-replace-supers@7.28.6': + resolution: {integrity: sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} + engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.27.1': resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} @@ -2081,6 +2162,11 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@7.29.2': + resolution: {integrity: sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/parser@8.0.0-rc.3': resolution: {integrity: sha512-B20dvP3MfNc/XS5KKCHy/oyWl5IA6Cn9YjXRdDlCjNmUFrjvLXMNUfQq/QUy9fnG2gYkKKcrto2YaF9B32ToOQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2098,6 +2184,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-typescript@7.28.6': + resolution: {integrity: sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/template@7.28.6': resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} engines: {node: '>=6.9.0'} @@ -2114,6 +2206,21 @@ packages: resolution: {integrity: sha512-mOm5ZrYmphGfqVWoH5YYMTITb3cDXsFgmvFlvkvWDMsR9X8RFnt7a0Wb6yNIdoFsiMO9WjYLq+U/FMtqIYAF8Q==} engines: {node: ^20.19.0 || >=22.12.0} + '@bomb.sh/tab@0.0.14': + resolution: {integrity: sha512-cHMk2LI430MVoX1unTt9oK1iZzQS4CYDz97MSxKLNErW69T43Z2QLFTpdS/3jVOIKrIADWfuxQ+nQNJkNV7E4w==} + hasBin: true + peerDependencies: + cac: ^6.7.14 + citty: ^0.1.6 || ^0.2.0 + commander: ^13.1.0 + peerDependenciesMeta: + cac: + optional: true + citty: + optional: true + commander: + optional: true + '@borewit/text-codec@0.2.2': resolution: {integrity: sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ==} @@ -2152,6 +2259,12 @@ packages: '@chevrotain/utils@11.0.3': resolution: {integrity: sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==} + '@clack/core@1.2.0': + resolution: {integrity: sha512-qfxof/3T3t9DPU/Rj3OmcFyZInceqj/NVtO9rwIuJqCUgh32gwPjpFQQp/ben07qKlhpwq7GzfWpST4qdJ5Drg==} + + '@clack/prompts@1.2.0': + resolution: {integrity: sha512-4jmztR9fMqPMjz6H/UZXj0zEmE43ha1euENwkckKKel4XpSfokExPo5AiVStdHSAlHekz4d0CA/r45Ok1E4D3w==} + '@cloudflare/kv-asset-handler@0.4.0': resolution: {integrity: sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA==} engines: {node: '>=18.0.0'} @@ -2248,6 +2361,9 @@ packages: '@cloudflare/workers-types@4.20251221.0': resolution: {integrity: sha512-VVTEhY29TtwIwjBjpRrdT51Oqu0JlXijc5TiEKFCjwouUSn+5VhzoTSaz7UBjVOu4vfvcQmjqt/dzwBUR7c95w==} + '@colordx/core@5.0.3': + resolution: {integrity: sha512-xBQ0MYRTNNxW3mS2sJtlQTT7C3Sasqgh1/PsHva7fyDb5uqYY+gv9V0utDdX8X80mqzbGz3u/IDJdn2d/uW09g==} + '@colors/colors@1.5.0': resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} engines: {node: '>=0.1.90'} @@ -2328,6 +2444,14 @@ packages: search-insights: optional: true + '@dxup/nuxt@0.4.0': + resolution: {integrity: sha512-28LDotpr9G2knUse3cQYsOo6NJq5yhABv4ByRVRYJUmzf9Q31DI7rpRek4POlKy1aAcYyKgu5J2616pyqLohYg==} + peerDependencies: + typescript: '*' + + '@dxup/unimport@0.1.2': + resolution: {integrity: sha512-/B8YJGPzaYq1NbsQmwgP8EZqg40NpTw4ZB3suuI0TplbxKHeK94jeaawLmVhCv+YwUnOpiWEz9U6SeThku/8JQ==} + '@emnapi/core@1.4.3': resolution: {integrity: sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==} @@ -3626,6 +3750,9 @@ packages: '@jridgewell/trace-mapping@0.3.28': resolution: {integrity: sha512-KNNHHwW3EIp4EDYOvYFGyIFfx36R2dNJYH4knnZlF8T5jdbD5Wx8xmSaQ2gP9URkJ04LGEtlcCtwArKcmFcwKw==} + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} @@ -3654,6 +3781,12 @@ packages: '@jsr/std__path@1.1.0': resolution: {integrity: sha512-rnxGg/nJGfDbJO+xIJ9YEzLD7dCzjr3NHShf4dbnlt44WEYNwMjg+TcDO6F2NPHBnn/6iUFwbnNzysrZvyD1Og==, tarball: https://npm.jsr.io/~/11/@jsr/std__path/1.1.0.tgz} + '@kwsites/file-exists@1.1.1': + resolution: {integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==} + + '@kwsites/promise-deferred@1.1.1': + resolution: {integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==} + '@logtape/file@2.0.5': resolution: {integrity: sha512-SJ2UZ00IJptilqDMFwPIGmZLMTYNZbP7k4+7aBfP5DoLVifSmQoaxP2HtXMdExXhGP4/JrFepLE86ryPBUKB/Q==} peerDependencies: @@ -3893,6 +4026,86 @@ packages: resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} engines: {node: '>=12.4.0'} + '@nuxt/cli@3.34.0': + resolution: {integrity: sha512-KVI4xSo96UtUUbmxr9ouWTytbj1LzTw5alsM4vC/gSY/l8kPMRAlq0XpNSAVTDJyALzLY70WhaIMX24LJLpdFw==} + engines: {node: ^16.14.0 || >=18.0.0} + hasBin: true + peerDependencies: + '@nuxt/schema': ^4.3.1 + peerDependenciesMeta: + '@nuxt/schema': + optional: true + + '@nuxt/devalue@2.0.2': + resolution: {integrity: sha512-GBzP8zOc7CGWyFQS6dv1lQz8VVpz5C2yRszbXufwG/9zhStTIH50EtD87NmWbTMwXDvZLNg8GIpb1UFdH93JCA==} + + '@nuxt/devtools-kit@3.2.4': + resolution: {integrity: sha512-Yxy2Xgmq5hf3dQy983V0xh0OJV2mYwRZz9eVIGc3EaribdFGPDNGMMbYqX9qCty3Pbxn/bCF3J0UyPaNlHVayQ==} + peerDependencies: + vite: '>=6.0' + + '@nuxt/devtools-wizard@3.2.4': + resolution: {integrity: sha512-5tu2+Quu9XTxwtpzM8CUN0UKn/bzZIfJcoGd+at5Yy1RiUQJ4E52tRK0idW1rMSUDkbkvX3dSnu8Tpj7SAtWdQ==} + hasBin: true + + '@nuxt/devtools@3.2.4': + resolution: {integrity: sha512-VPbFy7hlPzWpEZk4BsuVpNuHq1ZYGV9xezjb7/NGuePuNLqeNn74YZugU+PCtva7OwKhEeTXmMK0Mqo/6+nwNA==} + hasBin: true + peerDependencies: + '@vitejs/devtools': '*' + vite: '>=6.0' + peerDependenciesMeta: + '@vitejs/devtools': + optional: true + + '@nuxt/kit@4.4.2': + resolution: {integrity: sha512-5+IPRNX2CjkBhuWUwz0hBuLqiaJPRoKzQ+SvcdrQDbAyE+VDeFt74VpSFr5/R0ujrK4b+XnSHUJWdS72w6hsog==} + engines: {node: '>=18.12.0'} + + '@nuxt/nitro-server@4.4.2': + resolution: {integrity: sha512-iMTfraWcpA0MuEnnEI8JFK/4DODY4ss1CfB8m3sBVOqW9jpY1Z6hikxzrtN+CadtepW2aOI5d8TdX5hab+Sb4Q==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + '@babel/plugin-proposal-decorators': ^7.25.0 + '@rollup/plugin-babel': ^6.0.0 || ^7.0.0 + nuxt: ^4.4.2 + peerDependenciesMeta: + '@babel/plugin-proposal-decorators': + optional: true + '@rollup/plugin-babel': + optional: true + + '@nuxt/schema@4.4.2': + resolution: {integrity: sha512-/q6C7Qhiricgi+PKR7ovBnJlKTL0memCbA1CzRT+itCW/oeYzUfeMdQ35mGntlBoyRPNrMXbzuSUhfDbSCU57w==} + engines: {node: ^14.18.0 || >=16.10.0} + + '@nuxt/telemetry@2.8.0': + resolution: {integrity: sha512-zAwXY24KYvpLTmiV+osagd2EHkfs5IF+7oDZYTQoit5r0kPlwaCNlzHp5I/wUAWT4LBw6lG8gZ6bWidAdv/erQ==} + engines: {node: '>=18.12.0'} + hasBin: true + peerDependencies: + '@nuxt/kit': '>=3.0.0' + + '@nuxt/vite-builder@4.4.2': + resolution: {integrity: sha512-fJaIwMA8ID6BU5EqmoDvnhq4qYDJeWjdHk4jfqy8D3Nm7CoUW0BvX7Ee92XoO05rtUiClGlk/NQ1Ii8hs3ZIbw==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + '@babel/plugin-proposal-decorators': ^7.25.0 + '@babel/plugin-syntax-jsx': ^7.25.0 + nuxt: 4.4.2 + rolldown: ^1.0.0-beta.38 + rollup-plugin-visualizer: ^6.0.0 || ^7.0.1 + vue: ^3.3.4 + peerDependenciesMeta: + '@babel/plugin-proposal-decorators': + optional: true + '@babel/plugin-syntax-jsx': + optional: true + rolldown: + optional: true + rollup-plugin-visualizer: + optional: true + '@opentelemetry/api-logs@0.211.0': resolution: {integrity: sha512-swFdZq8MCdmdR22jTVGQDhwqDzcI4M10nhjXkLr1EsIzXgZBqm4ZlmmcWsg3TSNf+3mzgOiqveXmBLZuDi2Lgg==} engines: {node: '>=8.0.0'} @@ -4298,134 +4511,494 @@ packages: '@oslojs/encoding@1.1.0': resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} - '@oxc-project/types@0.122.0': - resolution: {integrity: sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA==} + '@oxc-minify/binding-android-arm-eabi@0.117.0': + resolution: {integrity: sha512-5Hf2KsGRjxp3HnPU/mse7cQJa5tWfMFUPZQcgSMVsv2JZnGFFOIDzA0Oja2KDD+VPJqMpEJKc2dCHAGZgJxsGg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] - '@parcel/watcher-android-arm64@2.5.6': - resolution: {integrity: sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==} - engines: {node: '>= 10.0.0'} + '@oxc-minify/binding-android-arm64@0.117.0': + resolution: {integrity: sha512-uuxGwxA5J4Sap+gz4nxyM/rer6q2A4X1Oe8HpE0CZQyb5cSBULQ15btZiVG3xOBctI5O+c2dwR1aZAP4oGKcLw==} + engines: {node: ^20.19.0 || >=22.12.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'} + '@oxc-minify/binding-darwin-arm64@0.117.0': + resolution: {integrity: sha512-lLBf75cxUSLydumToKtGTwbLqO/1urScblJ33Vx0uF38M2ZbL2x51AybBV5vlfLjYNrxvQ8ov0Bj/OhsVO/biA==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@parcel/watcher-darwin-x64@2.5.6': - resolution: {integrity: sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==} - engines: {node: '>= 10.0.0'} + '@oxc-minify/binding-darwin-x64@0.117.0': + resolution: {integrity: sha512-wBWwP1voLZMuN4hpe1HRtkPBd4/o/1qan5XssmmI/hewBvGHEHkyvVLS0zu+cKqXDxYzYvb/p+EqU+xSXhEl4A==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@parcel/watcher-freebsd-x64@2.5.6': - resolution: {integrity: sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==} - engines: {node: '>= 10.0.0'} + '@oxc-minify/binding-freebsd-x64@0.117.0': + resolution: {integrity: sha512-pYSacHw698oH2vb70iP1cHk6x0zhvAuOvdskvNtEqvfziu8MSjKXa699vA9Cx72+DH5rwVuj1I3f+7no2fWglA==} + engines: {node: ^20.19.0 || >=22.12.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'} + '@oxc-minify/binding-linux-arm-gnueabihf@0.117.0': + resolution: {integrity: sha512-Ugm4Qj7F2+bccjhHCjjnSNHBDPyvjPXWrntID4WJpSrPqt+Az/o0EGdty9sWOjQXRZiTVpa80uqCWZQUn94yTA==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@parcel/watcher-linux-arm-musl@2.5.6': - resolution: {integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==} - engines: {node: '>= 10.0.0'} + '@oxc-minify/binding-linux-arm-musleabihf@0.117.0': + resolution: {integrity: sha512-qrY6ZviO9wVRI/jl4nRZO4B9os8jaJQemMeWIyFInZNk3lhqihId8iBqMKibJnRaf+JRxLM9j68atXkFRhOHrg==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@parcel/watcher-linux-arm64-glibc@2.5.6': - resolution: {integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==} - engines: {node: '>= 10.0.0'} + '@oxc-minify/binding-linux-arm64-gnu@0.117.0': + resolution: {integrity: sha512-2VLJHKEFBRhCihT/8uesuDPhXpbWu1OlHCxqQ7pdFVqKik1Maj5E9oSDcYzxqfaCRStvTHkmLVWJBK5CVcIadg==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - '@parcel/watcher-linux-arm64-musl@2.5.6': - resolution: {integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==} - engines: {node: '>= 10.0.0'} + '@oxc-minify/binding-linux-arm64-musl@0.117.0': + resolution: {integrity: sha512-C3zapJconWpl2Y7LR3GkRkH6jxpuV2iVUfkFcHT5Ffn4Zu7l88mZa2dhcfdULZDybN1Phka/P34YUzuskUUrXw==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - '@parcel/watcher-linux-x64-glibc@2.5.6': - resolution: {integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==} - engines: {node: '>= 10.0.0'} + '@oxc-minify/binding-linux-ppc64-gnu@0.117.0': + resolution: {integrity: sha512-2T/Bm+3/qTfuNS4gKSzL8qbiYk+ErHW2122CtDx+ilZAzvWcJ8IbqdZIbEWOlwwe03lESTxPwTBLFqVgQU2OeQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + + '@oxc-minify/binding-linux-riscv64-gnu@0.117.0': + resolution: {integrity: sha512-MKLjpldYkeoB4T+yAi4aIAb0waifxUjLcKkCUDmYAY3RqBJTvWK34KtfaKZL0IBMIXfD92CbKkcxQirDUS9Xcg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxc-minify/binding-linux-riscv64-musl@0.117.0': + resolution: {integrity: sha512-UFVcbPvKUStry6JffriobBp8BHtjmLLPl4bCY+JMxIn/Q3pykCpZzRwFTcDurG/kY8tm+uSNfKKdRNa5Nh9A7g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxc-minify/binding-linux-s390x-gnu@0.117.0': + resolution: {integrity: sha512-B9GyPQ1NKbvpETVAMyJMfRlD3c6UJ7kiuFUAlx9LTYiQL+YIyT6vpuRlq1zgsXxavZluVrfeJv6x0owV4KDx4Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + + '@oxc-minify/binding-linux-x64-gnu@0.117.0': + resolution: {integrity: sha512-fXfhtr+WWBGNy4M5GjAF5vu/lpulR4Me34FjTyaK9nDrTZs7LM595UDsP1wliksqp4hD/KdoqHGmbCrC+6d4vA==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - '@parcel/watcher-linux-x64-musl@2.5.6': - resolution: {integrity: sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==} - engines: {node: '>= 10.0.0'} + '@oxc-minify/binding-linux-x64-musl@0.117.0': + resolution: {integrity: sha512-jFBgGbx1oLadb83ntJmy1dWlAHSQanXTS21G4PgkxyONmxZdZ/UMKr7KsADzMuoPsd2YhJHxzRpwJd9U+4BFBw==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - '@parcel/watcher-wasm@2.3.0': - resolution: {integrity: sha512-ejBAX8H0ZGsD8lSICDNyMbSEtPMWgDL0WFCt/0z7hyf5v8Imz4rAM8xY379mBsECkq/Wdqa5WEDLqtjZ+6NxfA==} - engines: {node: '>= 10.0.0'} - bundledDependencies: - - napi-wasm + '@oxc-minify/binding-openharmony-arm64@0.117.0': + resolution: {integrity: sha512-nxPd9vx1vYz8IlIMdl9HFdOK/ood1H5hzbSFsyO8JU55tkcJoBL8TLCbuFf9pHpOy27l2gcPyV6z3p4eAcTH5Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] - '@parcel/watcher-wasm@2.5.6': - resolution: {integrity: sha512-byAiBZ1t3tXQvc8dMD/eoyE7lTXYorhn+6uVW5AC+JGI1KtJC/LvDche5cfUE+qiefH+Ybq0bUCJU0aB1cSHUA==} - engines: {node: '>= 10.0.0'} - bundledDependencies: - - napi-wasm + '@oxc-minify/binding-wasm32-wasi@0.117.0': + resolution: {integrity: sha512-pSvjJ6cCCfEXSteWSiVfZhdRzvpmS3tLhlXrXTYiuTDFrkRCobRP39SRwAzK23rE9i/m2JAaES2xPEW6+xu85g==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] - '@parcel/watcher-win32-arm64@2.5.6': - resolution: {integrity: sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==} - engines: {node: '>= 10.0.0'} + '@oxc-minify/binding-win32-arm64-msvc@0.117.0': + resolution: {integrity: sha512-9NoT9baFrWPdJRIZVQ1jzPZW9TjPT2sbzQyDdoK7uD1V8JXCe1L2y7sp9k2ldZZheaIcmtNwHc7jyD7kYz/0XQ==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@parcel/watcher-win32-ia32@2.5.6': - resolution: {integrity: sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==} - engines: {node: '>= 10.0.0'} + '@oxc-minify/binding-win32-ia32-msvc@0.117.0': + resolution: {integrity: sha512-E51LTjkRei5u2dpFiYSObuh+e43xg45qlmilSTd0XDGFdYJCOv62Q0MEn61TR+efQYPNleYwWdTS9t+tp9p/4w==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@parcel/watcher-win32-x64@2.5.6': - resolution: {integrity: sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==} - engines: {node: '>= 10.0.0'} + '@oxc-minify/binding-win32-x64-msvc@0.117.0': + resolution: {integrity: sha512-I8vniPOxWQdxfIbXNvQLaJ1n8SrnqES6wuiAX10CU72sKsizkds9kDaJ1KzWvDy39RKhTBmD1cJsU2uxPFgizQ==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@parcel/watcher@2.5.6': - resolution: {integrity: sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==} - engines: {node: '>= 10.0.0'} - - '@phc/format@1.0.0': - resolution: {integrity: sha512-m7X9U6BG2+J+R1lSOdCiITLLrxm+cWlNI3HUFA92oLO77ObGNzaKdh8pMLqdZcshtkKuV84olNNXDfMc4FezBQ==} - engines: {node: '>=10'} + '@oxc-parser/binding-android-arm-eabi@0.117.0': + resolution: {integrity: sha512-XarGPJpaobgKjfm7xRfCGWWszuPbm/OeP91NdMhxtcLZ/qLTmWF0P0z0gqmr0Uysi1F1v1BNtcST11THMrcEOw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] - '@pinojs/redact@0.4.0': - resolution: {integrity: sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==} + '@oxc-parser/binding-android-arm64@0.117.0': + resolution: {integrity: sha512-EPTs2EBijGmyhPso4rXAL0NSpECXER9IaVKFZEv83YcA6h4uhKW47kmYt+OZcSp130zhHx+lTWILDQ/LDkCRNA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} + '@oxc-parser/binding-darwin-arm64@0.117.0': + resolution: {integrity: sha512-3bAEpyih6r/Kb+Xzn1em1qBMClOS7NsVWgF86k95jpysR5ix/HlKFKSy7cax6PcS96HeHR4kjlME20n/XK1zNg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] - '@polka/url@1.0.0-next.29': - resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} + '@oxc-parser/binding-darwin-x64@0.117.0': + resolution: {integrity: sha512-W7S99zFwVZhSbCxvjfZkioStFU249DBc4TJw/kK6kfKwx2Zew+jvizX5Y3ZPkAh7fBVUSNOdSeOqLBHLiP50tw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] - '@poppanator/http-constants@1.1.1': - resolution: {integrity: sha512-TPPmQ2OsZDsQZqU80XEEO47E3zex/s1x4DYPoD0AXreW1SUqGvJQY71GTa2AiI0PE2OF2lHf18TGAVOck0Ic0w==} + '@oxc-parser/binding-freebsd-x64@0.117.0': + resolution: {integrity: sha512-xH76lqSdjCSY0KUMPwLXlvQ3YEm3FFVEQmgiOCGNf+stZ6E4Mo3nC102Bo8yKd7aW0foIPAFLYsHgj7vVI/axw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] - '@poppinss/cliui@6.8.1': - resolution: {integrity: sha512-o/ssbwr+r6woG65rk9eFHnn9dVUphZr/Rk+4+05ENVMBWYpYhTJGdE9RobTG5JLFubvO4gWIyFeNlC+I4EM6eA==} + '@oxc-parser/binding-linux-arm-gnueabihf@0.117.0': + resolution: {integrity: sha512-9Hdm1imzrn4RdMYnQKKcy+7p7QsSPIrgVIZmpGSJT02nYDuBWLdG1pdYMPFoEo46yiXry3tS3RoHIpNbT1IiyQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] - '@poppinss/colors@4.1.6': - resolution: {integrity: sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg==} + '@oxc-parser/binding-linux-arm-musleabihf@0.117.0': + resolution: {integrity: sha512-Itszer/VCeYhYVJLcuKnHktlY8QyGnVxapltP68S1XRGlV6IsM9HQAElJRMwQhT6/GkMjOhANmkv2Qu/9v44lw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] - '@poppinss/dumper@0.6.5': - resolution: {integrity: sha512-NBdYIb90J7LfOI32dOewKI1r7wnkiH6m920puQ3qHUeZkxNkQiFnXVWoE6YtFSv6QOiPPf7ys6i+HWWecDz7sw==} + '@oxc-parser/binding-linux-arm64-gnu@0.117.0': + resolution: {integrity: sha512-jBxD7DtlHQ36ivjjZdH0noQJgWNouenzpLmXNKnYaCsBfo3jY95m5iyjYQEiWkvkhJ3TJUAs7tQ1/kEpY7x/Kg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] - '@poppinss/dumper@0.7.0': - resolution: {integrity: sha512-0UTYalzk2t6S4rA2uHOz5bSSW2CHdv4vggJI6Alg90yvl0UgXs6XSXpH96OH+bRkX4J/06djv29pqXJ0lq5Kag==} + '@oxc-parser/binding-linux-arm64-musl@0.117.0': + resolution: {integrity: sha512-QagKTDF4lrz8bCXbUi39Uq5xs7C7itAseKm51f33U+Dyar9eJY/zGKqfME9mKLOiahX7Fc1J3xMWVS0AdDXLPg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] - '@poppinss/exception@1.2.3': - resolution: {integrity: sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==} + '@oxc-parser/binding-linux-ppc64-gnu@0.117.0': + resolution: {integrity: sha512-RPddpcE/0xxWaommWy0c5i/JdrXcXAkxBS2GOrAUh5LKmyCh03hpJedOAWszG4ADsKQwoUQQ1/tZVGRhZIWtKA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + + '@oxc-parser/binding-linux-riscv64-gnu@0.117.0': + resolution: {integrity: sha512-ur/WVZF9FSOiZGxyP+nfxZzuv6r5OJDYoVxJnUR7fM/hhXLh4V/be6rjbzm9KLCDBRwYCEKJtt+XXNccwd06IA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxc-parser/binding-linux-riscv64-musl@0.117.0': + resolution: {integrity: sha512-ujGcAx8xAMvhy7X5sBFi3GXML1EtyORuJZ5z2T6UV3U416WgDX/4OCi3GnoteeenvxIf6JgP45B+YTHpt71vpA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxc-parser/binding-linux-s390x-gnu@0.117.0': + resolution: {integrity: sha512-hbsfKjUwRjcMZZvvmpZSc+qS0bHcHRu8aV/I3Ikn9BzOA0ZAgUE7ctPtce5zCU7bM8dnTLi4sJ1Pi9YHdx6Urw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + + '@oxc-parser/binding-linux-x64-gnu@0.117.0': + resolution: {integrity: sha512-1QrTrf8rige7UPJrYuDKJLQOuJlgkt+nRSJLBMHWNm9TdivzP48HaK3f4q18EjNlglKtn03lgjMu4fryDm8X4A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxc-parser/binding-linux-x64-musl@0.117.0': + resolution: {integrity: sha512-gRvK6HPzF5ITRL68fqb2WYYs/hGviPIbkV84HWCgiJX+LkaOpp+HIHQl3zVZdyKHwopXToTbXbtx/oFjDjl8pg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxc-parser/binding-openharmony-arm64@0.117.0': + resolution: {integrity: sha512-QPJvFbnnDZZY7xc+xpbIBWLThcGBakwaYA9vKV8b3+oS5MGfAZUoTFJcix5+Zg2Ri46sOfrUim6Y6jsKNcssAQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxc-parser/binding-wasm32-wasi@0.117.0': + resolution: {integrity: sha512-+XRSNA0xt3pk/6CUHM7pykVe7M8SdifJk8LX1+fIp/zefvR3HBieZCbwG5un8gogNgh7srLycoh/cQA9uozv5g==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@oxc-parser/binding-win32-arm64-msvc@0.117.0': + resolution: {integrity: sha512-GpxeGS+Vo030DsrXeRPc7OSJOQIyAHkM3mzwBcnQjg/79XnOIDDMXJ5X6/aNdkVt/+Pv35pqKzGA4TQau97x8w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxc-parser/binding-win32-ia32-msvc@0.117.0': + resolution: {integrity: sha512-tchWEYiso1+objTZirmlR+w3fcIel6PVBOJ8NuC2Jr30dxBOiKUfFLovJLANwHg1+TzeD6pVSLIIIEf2T5o5lQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxc-parser/binding-win32-x64-msvc@0.117.0': + resolution: {integrity: sha512-ysRJAjIbB4e5y+t9PZs7TwbgOV/GVT//s30AORLCT/pedYwpYzHq6ApXK7is9fvyfZtgT3anNir8+esurmyaDw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@oxc-project/types@0.117.0': + resolution: {integrity: sha512-C/kPXBphID44fXdsa2xSOCuzX8fKZiFxPsvucJ6Yfkr6CJlMA+kNLPNKyLoI+l9XlDsNxBrz6h7IIjKU8pB69w==} + + '@oxc-project/types@0.122.0': + resolution: {integrity: sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA==} + + '@oxc-transform/binding-android-arm-eabi@0.117.0': + resolution: {integrity: sha512-17giX7h5VR9Eodru4OoSCFdgwLFIaUxeEn8JWe0vMZrAuRbT9NiDTy5dXdbGQBoO8aXPkbGS38FGlvbi31aujw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxc-transform/binding-android-arm64@0.117.0': + resolution: {integrity: sha512-1LrDd1CPochtLx04pAafdah6QtOQQj0/Evttevi+0u8rCI5FKucIG7pqBHkIQi/y7pycFYIj+GebhET80maeUg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxc-transform/binding-darwin-arm64@0.117.0': + resolution: {integrity: sha512-K1Xo52xJOvFfHSkz2ax9X5Qsku23RCfTIPbHZWdUCAQ1TQooI+sFcewSubhVUJ4DVK12/tYT//XXboumin+FHA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxc-transform/binding-darwin-x64@0.117.0': + resolution: {integrity: sha512-ftFT/8Laolfq49mRRWLkIhd1AbJ0MI5bW3LwddvdoAg9zXwkx4qhzTYyBPRZhvXWftts+NjlHfHsXCOqI4tPtw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxc-transform/binding-freebsd-x64@0.117.0': + resolution: {integrity: sha512-QDRyw0atg9BMnwOwnJeW6REzWPLEjiWtsCc2Sj612F1hCdvP+n0L3o8sHinEWM+BiOkOYtUxHA69WjUslc3G+g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxc-transform/binding-linux-arm-gnueabihf@0.117.0': + resolution: {integrity: sha512-UvpvOjyQVgiIJahIpMT0qAsLJT8O1ibHTBgXGOsZkQgw1xmjARPQ07dpRcucPPn6cqCF3wrxfbqtr2vFHaMkdA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxc-transform/binding-linux-arm-musleabihf@0.117.0': + resolution: {integrity: sha512-cIhztGFjKk8ngP+/7EPkEhzWMGr2neezxgWirSn/f/MirjH234oHHGJ2diKIbGQEsy0aOuJMTkL9NLfzfmH51A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxc-transform/binding-linux-arm64-gnu@0.117.0': + resolution: {integrity: sha512-mXbDfvDN0RZVg7v4LohNzU0kK3fMAZgkUKTkpFVgxEvzibEG5VpSznkypUwHI4a8U8pz+K6mGaLetX3Xt+CvvA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxc-transform/binding-linux-arm64-musl@0.117.0': + resolution: {integrity: sha512-ykxpPQp0eAcSmhy0Y3qKvdanHY4d8THPonDfmCoktUXb6r0X6qnjpJB3V+taN1wevW55bOEZd97kxtjTKjqhmg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxc-transform/binding-linux-ppc64-gnu@0.117.0': + resolution: {integrity: sha512-Rvspti4Kr7eq6zSrURK5WjscfWQPvmy/KjJZV45neRKW8RLonE3r9+NgrwSLGoHvQ3F24fbqlkplox1RtlhH5A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + + '@oxc-transform/binding-linux-riscv64-gnu@0.117.0': + resolution: {integrity: sha512-Dr2ZW9ZZ4l1eQ5JUEUY3smBh4JFPCPuybWaDZTLn3ADZjyd8ZtNXEjeMT8rQbbhbgSL9hEgbwaqraole3FNThQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxc-transform/binding-linux-riscv64-musl@0.117.0': + resolution: {integrity: sha512-oD1Bnes1bIC3LVBSrWEoSUBj6fvatESPwAVWfJVGVQlqWuOs/ZBn1e4Nmbipo3KGPHK7DJY75r/j7CQCxhrOFQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxc-transform/binding-linux-s390x-gnu@0.117.0': + resolution: {integrity: sha512-qT//IAPLvse844t99Kff5j055qEbXfwzWgvCMb0FyjisnB8foy25iHZxZIocNBe6qwrCYWUP1M8rNrB/WyfS1Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + + '@oxc-transform/binding-linux-x64-gnu@0.117.0': + resolution: {integrity: sha512-2YEO5X+KgNzFqRVO5dAkhjcI5gwxus4NSWVl/+cs2sI6P0MNPjqE3VWPawl4RTC11LvetiiZdHcujUCPM8aaUw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxc-transform/binding-linux-x64-musl@0.117.0': + resolution: {integrity: sha512-3wqWbTSaIFZvDr1aqmTul4cg8PRWYh6VC52E8bLI7ytgS/BwJLW+sDUU2YaGIds4sAf/1yKeJRmudRCDPW9INg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxc-transform/binding-openharmony-arm64@0.117.0': + resolution: {integrity: sha512-Ebxx6NPqhzlrjvx4+PdSqbOq+li0f7X59XtJljDghkbJsbnkHvhLmPR09ifHt5X32UlZN63ekjwcg/nbmHLLlA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxc-transform/binding-wasm32-wasi@0.117.0': + resolution: {integrity: sha512-Nn8mmcBiQ0XKHLTb05QBlH+CDkn7jf5YDVv9FtKhy4zJT0NEU9y3dXVbfcurOpsVrG9me4ktzDQNCaAoJjUQyw==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@oxc-transform/binding-win32-arm64-msvc@0.117.0': + resolution: {integrity: sha512-15cbsF8diXWGnHrTsVgVeabETiT/KdMAfRAcot99xsaVecJs3pITNNjC6Qj+/TPNpehbgIFjlhhxOVSbQsTBgg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxc-transform/binding-win32-ia32-msvc@0.117.0': + resolution: {integrity: sha512-I6DkhCuFX6p9rckdWiLuZfBWrrYUC7sNX+zLaCfa5zvrPNwo1/29KkefvqXVxu3AWT/6oZAbtc0A8/mqhETJPQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxc-transform/binding-win32-x64-msvc@0.117.0': + resolution: {integrity: sha512-V7YzavQnYcRJBeJkp0qpb3FKrlm5I57XJetCYB4jsjStuboQmnFMZ/XQH55Szlf/kVyeU9ddQwv72gJJ5BrGjQ==} + 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] + + '@parcel/watcher-linux-arm-musl@2.5.6': + resolution: {integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm64-glibc@2.5.6': + resolution: {integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-arm64-musl@2.5.6': + resolution: {integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-x64-glibc@2.5.6': + resolution: {integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@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] + + '@parcel/watcher-wasm@2.3.0': + resolution: {integrity: sha512-ejBAX8H0ZGsD8lSICDNyMbSEtPMWgDL0WFCt/0z7hyf5v8Imz4rAM8xY379mBsECkq/Wdqa5WEDLqtjZ+6NxfA==} + engines: {node: '>= 10.0.0'} + bundledDependencies: + - napi-wasm + + '@parcel/watcher-wasm@2.5.6': + resolution: {integrity: sha512-byAiBZ1t3tXQvc8dMD/eoyE7lTXYorhn+6uVW5AC+JGI1KtJC/LvDche5cfUE+qiefH+Ybq0bUCJU0aB1cSHUA==} + engines: {node: '>= 10.0.0'} + bundledDependencies: + - napi-wasm + + '@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'} + + '@phc/format@1.0.0': + resolution: {integrity: sha512-m7X9U6BG2+J+R1lSOdCiITLLrxm+cWlNI3HUFA92oLO77ObGNzaKdh8pMLqdZcshtkKuV84olNNXDfMc4FezBQ==} + engines: {node: '>=10'} + + '@pinojs/redact@0.4.0': + resolution: {integrity: sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@polka/url@1.0.0-next.29': + resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} + + '@poppanator/http-constants@1.1.1': + resolution: {integrity: sha512-TPPmQ2OsZDsQZqU80XEEO47E3zex/s1x4DYPoD0AXreW1SUqGvJQY71GTa2AiI0PE2OF2lHf18TGAVOck0Ic0w==} + + '@poppinss/cliui@6.8.1': + resolution: {integrity: sha512-o/ssbwr+r6woG65rk9eFHnn9dVUphZr/Rk+4+05ENVMBWYpYhTJGdE9RobTG5JLFubvO4gWIyFeNlC+I4EM6eA==} + + '@poppinss/colors@4.1.6': + resolution: {integrity: sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg==} + + '@poppinss/dumper@0.6.5': + resolution: {integrity: sha512-NBdYIb90J7LfOI32dOewKI1r7wnkiH6m920puQ3qHUeZkxNkQiFnXVWoE6YtFSv6QOiPPf7ys6i+HWWecDz7sw==} + + '@poppinss/dumper@0.7.0': + resolution: {integrity: sha512-0UTYalzk2t6S4rA2uHOz5bSSW2CHdv4vggJI6Alg90yvl0UgXs6XSXpH96OH+bRkX4J/06djv29pqXJ0lq5Kag==} + + '@poppinss/exception@1.2.3': + resolution: {integrity: sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==} '@poppinss/hooks@7.3.0': resolution: {integrity: sha512-/H35z/bWqHg7085QOxWUDYMidx6Kl6b8kIyzIXlRYzWvsk1xm9hQOlXWdWEYch+Gmn8eL7tThx59MBj8BLxDrQ==} @@ -4593,6 +5166,9 @@ packages: '@rolldown/pluginutils@1.0.0-rc.12': resolution: {integrity: sha512-HHMwmarRKvoFsJorqYlFeFRzXZqCt2ETQlEDOb9aqssrnVBB1/+xgTGtuTrIk5vzLNX1MjMtTf7W9z3tsSbrxw==} + '@rolldown/pluginutils@1.0.0-rc.2': + resolution: {integrity: sha512-izyXV/v+cHiRfozX62W9htOAvwMo4/bXKDrQ+vom1L1qRuexPock/7VZDAhnpHCLNejd3NJ6hiab+tO0D44Rgw==} + '@rollup/plugin-alias@6.0.0': resolution: {integrity: sha512-tPCzJOtS7uuVZd+xPhoy5W4vThe6KWXNmsFCNktaAh5RTqcLiSfT4huPQIXkgJ6YCOjJHvecOAzQxLFhPxKr+g==} engines: {node: '>=20.19.0'} @@ -4992,13 +5568,15 @@ packages: '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + '@simple-git/args-pathspec@1.0.2': + resolution: {integrity: sha512-nEFVejViHUoL8wU8GTcwqrvqfUG40S5ts6S4fr1u1Ki5CklXlRDYThPVA/qurTmCYFGnaX3XpVUmICLHdvhLaA==} + + '@simple-git/argv-parser@1.0.3': + resolution: {integrity: sha512-NMKv9sJcSN2VvnPT9Ja7eKfGy8Q8mMFLwPTCcuZMtv3+mYcLIZflg31S/tp2XCCyiY7YAx6cgBHQ0fwA2fWHpQ==} + '@sinclair/typebox@0.34.38': resolution: {integrity: sha512-HpkxMmc2XmZKhvaKIZZThlHmx1L0I/V1hWK1NubtlFnr6ZqdiOpV72TKudZUNQjZNsyDBay72qFEhEvb+bcwcA==} - '@sindresorhus/is@7.1.1': - resolution: {integrity: sha512-rO92VvpgMc3kfiTjGT52LEtJ8Yc5kCWhZjLQ3LwlA4pSgPpQO7bVpYXParOD8Jwf+cVQECJo3yP/4I8aZtUQTQ==} - engines: {node: '>=18'} - '@sindresorhus/is@7.2.0': resolution: {integrity: sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==} engines: {node: '>=18'} @@ -5017,9 +5595,6 @@ packages: peerDependencies: vinxi: ^0.5.7 - '@speed-highlight/core@1.2.12': - resolution: {integrity: sha512-uilwrK0Ygyri5dToHYdZSjcvpS2ZwX0w5aSt3GCEN9hrjxWCoeV4Z2DTXuxjwbntaLQIEEAlCeNQss5SoHvAEA==} - '@speed-highlight/core@1.2.14': resolution: {integrity: sha512-G4ewlBNhUtlLvrJTb88d2mdy2KRijzs4UhnlrOSRT4bmjh/IqNElZa3zkrZ+TC47TwtlDWzVLFADljF1Ijp5hA==} @@ -5808,6 +6383,11 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + '@unhead/vue@2.1.13': + resolution: {integrity: sha512-HYy0shaHRnLNW9r85gppO8IiGz0ONWVV3zGdlT8CQ0tbTwixznJCIiyqV4BSV1aIF1jJIye0pd1p/k6Eab8Z/A==} + peerDependencies: + vue: '>=3.5.18' + '@unrs/resolver-binding-android-arm-eabi@1.11.1': resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} cpu: [arm] @@ -5922,6 +6502,13 @@ packages: peerDependencies: vinxi: ^0.5.5 + '@vitejs/plugin-vue-jsx@5.1.5': + resolution: {integrity: sha512-jIAsvHOEtWpslLOI2MeElGFxH7M8pM83BU/Tor4RLyiwH0FM4nUW3xdvbw20EeU9wc5IspQwMq225K3CMnJEpA==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + vue: ^3.0.0 + '@vitejs/plugin-vue@5.2.4': resolution: {integrity: sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==} engines: {node: ^18.0.0 || >=20.0.0} @@ -5929,6 +6516,13 @@ packages: vite: ^5.0.0 || ^6.0.0 vue: ^3.2.25 + '@vitejs/plugin-vue@6.0.5': + resolution: {integrity: sha512-bL3AxKuQySfk1iGcBsQnoRVexTPJq0Z/ixFVM8OhVJAP6ZXXXLtM7NFKWhLl30Kg7uTBqIaPXbh+nuQCuBDedg==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + vue: ^3.2.25 + '@vitest/expect@3.2.4': resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} @@ -5964,30 +6558,84 @@ packages: '@volar/source-map@2.4.15': resolution: {integrity: sha512-CPbMWlUN6hVZJYGcU/GSoHu4EnCHiLaXI9n8c9la6RaI9W5JHX+NqG+GSQcB0JdC2FIBLdZJwGsfKyBB71VlTg==} + '@vue-macros/common@3.1.2': + resolution: {integrity: sha512-h9t4ArDdniO9ekYHAD95t9AZcAbb19lEGK+26iAjUODOIJKmObDNBSe4+6ELQAA3vtYiFPPBtHh7+cQCKi3Dng==} + engines: {node: '>=20.19.0'} + peerDependencies: + vue: ^2.7.0 || ^3.2.25 + peerDependenciesMeta: + vue: + optional: true + + '@vue/babel-helper-vue-transform-on@2.0.1': + resolution: {integrity: sha512-uZ66EaFbnnZSYqYEyplWvn46GhZ1KuYSThdT68p+am7MgBNbQ3hphTL9L+xSIsWkdktwhPYLwPgVWqo96jDdRA==} + + '@vue/babel-plugin-jsx@2.0.1': + resolution: {integrity: sha512-a8CaLQjD/s4PVdhrLD/zT574ZNPnZBOY+IhdtKWRB4HRZ0I2tXBi5ne7d9eCfaYwp5gU5+4KIyFTV1W1YL9xZA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + peerDependenciesMeta: + '@babel/core': + optional: true + + '@vue/babel-plugin-resolve-type@2.0.1': + resolution: {integrity: sha512-ybwgIuRGRRBhOU37GImDoWQoz+TlSqap65qVI6iwg/J7FfLTLmMf97TS7xQH9I7Qtr/gp161kYVdhr1ZMraSYQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@vue/compiler-core@3.5.17': resolution: {integrity: sha512-Xe+AittLbAyV0pabcN7cP7/BenRBNcteM4aSDCtRvGw0d9OL+HG1u/XHLY/kt1q4fyMeZYXyIYrsHuPSiDPosA==} + '@vue/compiler-core@3.5.32': + resolution: {integrity: sha512-4x74Tbtqnda8s/NSD6e1Dr5p1c8HdMU5RWSjMSUzb8RTcUQqevDCxVAitcLBKT+ie3o0Dl9crc/S/opJM7qBGQ==} + '@vue/compiler-dom@3.5.17': resolution: {integrity: sha512-+2UgfLKoaNLhgfhV5Ihnk6wB4ljyW1/7wUIog2puUqajiC29Lp5R/IKDdkebh9jTbTogTbsgB+OY9cEWzG95JQ==} + '@vue/compiler-dom@3.5.32': + resolution: {integrity: sha512-ybHAu70NtiEI1fvAUz3oXZqkUYEe5J98GjMDpTGl5iHb0T15wQYLR4wE3h9xfuTNA+Cm2f4czfe8B4s+CCH57Q==} + '@vue/compiler-sfc@3.5.17': resolution: {integrity: sha512-rQQxbRJMgTqwRugtjw0cnyQv9cP4/4BxWfTdRBkqsTfLOHWykLzbOc3C4GGzAmdMDxhzU/1Ija5bTjMVrddqww==} + '@vue/compiler-sfc@3.5.32': + resolution: {integrity: sha512-8UYUYo71cP/0YHMO814TRZlPuUUw3oifHuMR7Wp9SNoRSrxRQnhMLNlCeaODNn6kNTJsjFoQ/kqIj4qGvya4Xg==} + '@vue/compiler-ssr@3.5.17': resolution: {integrity: sha512-hkDbA0Q20ZzGgpj5uZjb9rBzQtIHLS78mMilwrlpWk2Ep37DYntUz0PonQ6kr113vfOEdM+zTBuJDaceNIW0tQ==} + '@vue/compiler-ssr@3.5.32': + resolution: {integrity: sha512-Gp4gTs22T3DgRotZ8aA/6m2jMR+GMztvBXUBEUOYOcST+giyGWJ4WvFd7QLHBkzTxkfOt8IELKNdpzITLbA2rw==} + '@vue/compiler-vue2@2.7.16': resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} + '@vue/devtools-api@6.6.4': + resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} + '@vue/devtools-api@7.7.7': resolution: {integrity: sha512-lwOnNBH2e7x1fIIbVT7yF5D+YWhqELm55/4ZKf45R9T8r9dE2AIOy8HKjfqzGsoTHFbWbr337O4E0A0QADnjBg==} + '@vue/devtools-api@8.1.1': + resolution: {integrity: sha512-bsDMJ07b3GN1puVwJb/fyFnj/U2imyswK5UQVLZwVl7O05jDrt6BHxeG5XffmOOdasOj/bOmIjxJvGPxU7pcqw==} + + '@vue/devtools-core@8.1.1': + resolution: {integrity: sha512-bCCsSABp1/ot4j8xJEycM6Mtt2wbuucfByr6hMgjbYhrtlscOJypZKvy8f1FyWLYrLTchB5Qz216Lm92wfbq0A==} + peerDependencies: + vue: ^3.0.0 + '@vue/devtools-kit@7.7.7': resolution: {integrity: sha512-wgoZtxcTta65cnZ1Q6MbAfePVFxfM+gq0saaeytoph7nEa7yMXoi6sCPy4ufO111B9msnw0VOWjPEFCXuAKRHA==} + '@vue/devtools-kit@8.1.1': + resolution: {integrity: sha512-gVBaBv++i+adg4JpH71k9ppl4soyR7Y2McEqO5YNgv0BI1kMZ7BDX5gnwkZ5COYgiCyhejZG+yGNrBAjj6Coqg==} + '@vue/devtools-shared@7.7.7': resolution: {integrity: sha512-+udSj47aRl5aKb0memBvcUG9koarqnxNM5yjuREvqwK6T3ap4mn3Zqqc17QrBFTqSMjr3HK1cvStEZpMDpfdyw==} + '@vue/devtools-shared@8.1.1': + resolution: {integrity: sha512-+h4ttmJYl/txpxHKaoZcaKpC+pvckgLzIDiSQlaQ7kKthKh8KuwoLW2D8hPJEnqKzXOvu15UHEoGyngAXCz0EQ==} + '@vue/language-core@2.1.10': resolution: {integrity: sha512-DAI289d0K3AB5TUG3xDp9OuQ71CnrujQwJrQnfuZDwo6eGNf0UoRlPuaVNO+Zrn65PC3j0oB2i7mNmVPggeGeQ==} peerDependencies: @@ -5999,20 +6647,37 @@ packages: '@vue/reactivity@3.5.17': resolution: {integrity: sha512-l/rmw2STIscWi7SNJp708FK4Kofs97zc/5aEPQh4bOsReD/8ICuBcEmS7KGwDj5ODQLYWVN2lNibKJL1z5b+Lw==} + '@vue/reactivity@3.5.32': + resolution: {integrity: sha512-/ORasxSGvZ6MN5gc+uE364SxFdJ0+WqVG0CENXaGW58TOCdrAW76WWaplDtECeS1qphvtBZtR+3/o1g1zL4xPQ==} + '@vue/runtime-core@3.5.17': resolution: {integrity: sha512-QQLXa20dHg1R0ri4bjKeGFKEkJA7MMBxrKo2G+gJikmumRS7PTD4BOU9FKrDQWMKowz7frJJGqBffYMgQYS96Q==} + '@vue/runtime-core@3.5.32': + resolution: {integrity: sha512-pDrXCejn4UpFDFmMd27AcJEbHaLemaE5o4pbb7sLk79SRIhc6/t34BQA7SGNgYtbMnvbF/HHOftYBgFJtUoJUQ==} + '@vue/runtime-dom@3.5.17': resolution: {integrity: sha512-8El0M60TcwZ1QMz4/os2MdlQECgGoVHPuLnQBU3m9h3gdNRW9xRmI8iLS4t/22OQlOE6aJvNNlBiCzPHur4H9g==} + '@vue/runtime-dom@3.5.32': + resolution: {integrity: sha512-1CDVv7tv/IV13V8Nip1k/aaObVbWqRlVCVezTwx3K07p7Vxossp5JU1dcPNhJk3w347gonIUT9jQOGutyJrSVQ==} + '@vue/server-renderer@3.5.17': resolution: {integrity: sha512-BOHhm8HalujY6lmC3DbqF6uXN/K00uWiEeF22LfEsm9Q93XeJ/plHTepGwf6tqFcF7GA5oGSSAAUock3VvzaCA==} peerDependencies: vue: 3.5.17 + '@vue/server-renderer@3.5.32': + resolution: {integrity: sha512-IOjm2+JQwRFS7W28HNuJeXQle9KdZbODFY7hFGVtnnghF51ta20EWAZJHX+zLGtsHhaU6uC9BGPV52KVpYryMQ==} + peerDependencies: + vue: 3.5.32 + '@vue/shared@3.5.17': resolution: {integrity: sha512-CabR+UN630VnsJO/jHWYBC1YVXyMq94KKp6iF5MQgZJs5I8cmjw6oVMO1oDbtBkENSHSSn/UadWlW/OAgdmKrg==} + '@vue/shared@3.5.32': + resolution: {integrity: sha512-ksNyrmRQzWJJ8n3cRDuSF7zNNontuJg1YHnmWRJd2AMu8Ij2bqwiiri2lH5rHtYPZjj4STkNcgcmiQqlOjiYGg==} + '@vueuse/core@12.8.2': resolution: {integrity: sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==} @@ -6164,10 +6829,6 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.1.0: - resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} - engines: {node: '>=12'} - ansi-regex@6.2.2: resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} engines: {node: '>=12'} @@ -6176,10 +6837,6 @@ packages: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} - ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - ansi-styles@6.2.3: resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} @@ -6272,6 +6929,10 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} + ast-kit@2.2.0: + resolution: {integrity: sha512-m1Q/RaVOnTp9JxPX+F+Zn7IcLYMzM8kZofDImfsKZd8MbR+ikdOzTeztStWqfrqIxZnYWryyI9ePm3NGjnZgGw==} + engines: {node: '>=20.19.0'} + ast-kit@3.0.0-beta.1: resolution: {integrity: sha512-trmleAnZ2PxN/loHWVhhx1qeOHSRXq4TDsBBxq3GqeJitfk3+jTQ+v/C1km/KYq9M7wKqCewMh+/NAvVH7m+bw==} engines: {node: '>=20.19.0'} @@ -6283,6 +6944,10 @@ packages: resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} engines: {node: '>=4'} + ast-walker-scope@0.8.3: + resolution: {integrity: sha512-cbdCP0PGOBq0ASG+sjnKIoYkWMKhhz+F/h9pRexUdX2Hd38+WOlBkRKlqkGOSm0YQpcFMQBJeK4WspUAkwsEdg==} + engines: {node: '>=20.19.0'} + astring@1.9.0: resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} hasBin: true @@ -6306,6 +6971,13 @@ packages: resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} engines: {node: '>=8.0.0'} + autoprefixer@10.4.27: + resolution: {integrity: sha512-NP9APE+tO+LuJGn7/9+cohklunJsXWiaWEfV3si4Gi/XHDwVNgkwr1J3RQYFIvPy76GmJ9/bW8vyoU1LcxwKHA==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + available-typed-arrays@1.0.7: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} @@ -6426,6 +7098,9 @@ packages: birpc@2.4.0: resolution: {integrity: sha512-5IdNxTyhXHv2UlgnPHQ0h+5ypVmkrYHzL8QT+DwFZ//2N/oNV8Ch+BCRmTJ3x6/z9Axo/cXYBc9eprsUVK/Jsg==} + birpc@2.9.0: + resolution: {integrity: sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==} + birpc@4.0.0: resolution: {integrity: sha512-LShSxJP0KTmd101b6DRyGBj57LZxSDYWKitQNW/mi8GRMvZb078Uf9+pveax1DrVL89vm7mWe+TovdI/UDOuPw==} @@ -6495,6 +7170,10 @@ packages: bun-types@1.3.3: resolution: {integrity: sha512-z3Xwlg7j2l9JY27x5Qn3Wlyos8YAp0kKRlrePAOjgjMGS5IG6E7Jnlx736vH9UVI4wUICwwhC9anYL++XeOgTQ==} + bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + busboy@1.6.0: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} engines: {node: '>=10.16.0'} @@ -6563,6 +7242,9 @@ packages: resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} engines: {node: '>=16'} + caniuse-api@3.0.0: + resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} + caniuse-lite@1.0.30001727: resolution: {integrity: sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==} @@ -6766,6 +7448,9 @@ packages: confbox@0.2.2: resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} + confbox@0.2.4: + resolution: {integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==} + consola@3.4.2: resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} engines: {node: ^14.18.0 || >=16.10.0} @@ -6788,6 +7473,9 @@ packages: cookie-es@1.2.2: resolution: {integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==} + cookie-es@1.2.3: + resolution: {integrity: sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==} + cookie-es@2.0.0: resolution: {integrity: sha512-RAj4E421UYRgqokKUmotqAwuplYw15qtdXfY+hGzgCJ/MBjCVZcSoHK/kH9kocfjRjcDME7IiDWR/1WX1TM2Pg==} @@ -6851,6 +7539,12 @@ packages: crossws@0.3.5: resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} + css-declaration-sorter@7.4.0: + resolution: {integrity: sha512-LTuzjPoyA2vMGKKcaOqKSp7Ub2eGrNfKiZH4LpezxpNrsICGCSFvsQOI29psISxNZtaXibkC2CXzrQ5enMeGGw==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.0.9 + css-select@5.2.2: resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} @@ -6871,6 +7565,24 @@ packages: engines: {node: '>=4'} hasBin: true + cssnano-preset-default@7.0.12: + resolution: {integrity: sha512-B3Eoouzw/sl2zANI0AL9KbacummJTCww+fkHaDBMZad/xuVx8bUduPLly6hKVQAlrmvYkS1jB1CVQEKm3gn0AA==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + cssnano-utils@5.0.1: + resolution: {integrity: sha512-ZIP71eQgG9JwjVZsTPSqhc6GHgEr53uJ7tK5///VfyWj6Xp2DBmixWHqJgPno+PqATzn48pL42ww9x5SSGmhZg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + cssnano@7.1.4: + resolution: {integrity: sha512-T9PNS7y+5Nc9Qmu9mRONqfxG1RVY7Vuvky0XN6MZ+9hqplesTEwnj9r0ROtVuSwUVfaDhVlavuzWIVLUgm4hkQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + 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'} @@ -6878,6 +7590,9 @@ packages: csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + cytoscape-cose-bilkent@4.1.0: resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} peerDependencies: @@ -7147,6 +7862,14 @@ packages: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} + default-browser-id@5.0.1: + resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==} + engines: {node: '>=18'} + + default-browser@5.5.0: + resolution: {integrity: sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==} + engines: {node: '>=18'} + define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} @@ -7155,6 +7878,10 @@ packages: resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} engines: {node: '>=8'} + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + define-properties@1.2.1: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} @@ -7162,6 +7889,9 @@ packages: defu@6.1.4: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + defu@6.1.7: + resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} + delaunator@5.0.1: resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} @@ -7341,6 +8071,10 @@ packages: resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} engines: {node: '>=0.12'} + entities@7.0.1: + resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} + engines: {node: '>=0.12'} + environment@1.1.0: resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} engines: {node: '>=18'} @@ -7351,6 +8085,9 @@ packages: error-stack-parser@2.1.4: resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} + errx@0.1.0: + resolution: {integrity: sha512-fZmsRiDNv07K6s2KkKFTiD2aIvECa7++PKyD5NC32tpRw46qZA3sOz+aM+/V9V0GDHxVTKLziveV4JhzBHDp9Q==} + es-abstract@1.24.0: resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} engines: {node: '>= 0.4'} @@ -7370,6 +8107,9 @@ packages: es-module-lexer@1.7.0: resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + es-module-lexer@2.0.0: + resolution: {integrity: sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==} + es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} @@ -7665,9 +8405,6 @@ packages: resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} engines: {node: '>= 0.10.0'} - exsolve@1.0.7: - resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==} - exsolve@1.0.8: resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==} @@ -7708,12 +8445,25 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fast-npm-meta@1.4.2: + resolution: {integrity: sha512-XXyd9d3ie/JeIIjm6WeKalvapGGFI4ShAjPJM78vgUFYzoEsuNSjvvVTuht0XZcwbVdOnEEGzhxwguRbxkIcDg==} + hasBin: true + fast-querystring@1.1.2: resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==} + fast-string-truncated-width@1.2.1: + resolution: {integrity: sha512-Q9acT/+Uu3GwGj+5w/zsGuQjh9O1TyywhIwAxHudtWrgF09nHOPrvTLhQevPbttcxjr/SNN7mJmfOw/B1bXgow==} + + fast-string-width@1.1.0: + resolution: {integrity: sha512-O3fwIVIH5gKB38QNbdg+3760ZmGz0SZMgvwJbA1b2TGXceKE6A2cOlfogh1iw8lr049zPyd7YADHy+B7U4W9bQ==} + fast-uri@3.1.0: resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + fast-wrap-ansi@0.1.6: + resolution: {integrity: sha512-HlUwET7a5gqjURj70D5jl7aC3Zmy4weA1SHUfM0JFI0Ptq987NH2TwbBFLoERhfwk+E+eaq4EK3jXoT+R3yp3w==} + fastest-levenshtein@1.0.16: resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} engines: {node: '>= 4.9.1'} @@ -7851,6 +8601,9 @@ packages: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} + fraction.js@5.3.4: + resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} + fresh@0.5.2: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} @@ -7877,6 +8630,13 @@ packages: functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + fuse.js@7.3.0: + resolution: {integrity: sha512-plz8RVjfcDedTGfVngWH1jmJvBvAwi1v2jecfDerbEnMcmOYUEEwKFTHbNoCiYyzaK2Ws8lABkTCcRSqCY1q4w==} + engines: {node: '>=10'} + + fzf@0.5.2: + resolution: {integrity: sha512-Tt4kuxLXFKHy8KT40zwsUPUkg1CrsgY25FxA2U/j/0WgEDCk3ddc/zLTCCcbSHX9FcKtLuVaDGtGE/STWC+j3Q==} + generate-function@2.3.1: resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==} @@ -7935,6 +8695,10 @@ packages: resolution: {integrity: sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==} hasBin: true + giget@3.2.0: + resolution: {integrity: sha512-GvHTWcykIR/fP8cj8dMpuMMkvaeJfPvYnhq0oW+chSeIr+ldX21ifU2Ms6KBoyKZQZmVaUAAhQ2EZ68KJF8a7A==} + hasBin: true + github-slugger@2.0.0: resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} @@ -7951,6 +8715,7 @@ packages: glob@10.4.5: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true glob@13.0.6: @@ -7959,7 +8724,11 @@ packages: glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + + global-directory@4.0.1: + resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} + engines: {node: '>=18'} globals@13.24.0: resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} @@ -8007,6 +8776,9 @@ packages: resolution: {integrity: sha512-O1Ld7Dr+nqPnmGpdhzLmMTQ4vAsD+rHwMm1NLUmoUFFymBOMKxCCrtDxqdBRYXdeEPEi3SyoR4TizJLQrnKBNA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + h3@1.15.11: + resolution: {integrity: sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==} + h3@1.15.3: resolution: {integrity: sha512-z6GknHqyX0h9aQaTx22VZDf6QyZn+0Nh+Ym8O/u0SGSkyF5cuTJYKlc8MkzW3Nzf9LE1ivcpmYC3FUGpywhuUQ==} @@ -8167,6 +8939,9 @@ packages: resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} engines: {node: '>= 4'} + image-meta@0.2.2: + resolution: {integrity: sha512-3MOLanc3sb3LNGWQl1RlQlNWURE5g32aUphrDyFeCsxBTk08iE3VNe4CwsUZ0Qs1X+EfX0+r29Sxdpza4B+yRA==} + image-q@4.0.0: resolution: {integrity: sha512-PfJGVgIfKQJuq3s0tTDOKtztksibuUEbJQIYT3by6wctQo+Rdlh7ef4evJ5NCdxY4CfMbvFkocEwbl4BF8RlJw==} @@ -8187,6 +8962,9 @@ packages: resolution: {integrity: sha512-B6Lc2s6yApwnD2/pMzFh/d5AVjdsDXjgkeJ766FmFuJELIGHNycKRj+l3A39yZPM4CchqNCB4RITEAYB1KUM6A==} engines: {node: '>=20.19.0'} + impound@1.1.5: + resolution: {integrity: sha512-5AUn+QE0UofqNHu5f2Skf6Svukdg4ehOIq8O0EtqIx4jta0CDZYBPqpIHt0zrlUTiFVYlLpeH39DoikXBjPKpA==} + imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} @@ -8202,6 +8980,10 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + ini@4.1.1: + resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + inquirer-toggle@1.0.1: resolution: {integrity: sha512-0cReq29SpyO4JnoVmGBZJPoBv8sBzsGXw3MDjNxilOzhAFxIvC8mOFj34bCMtlFYKfkBKNYVLmmnP/qmrVuVMg==} @@ -8329,6 +9111,10 @@ packages: engines: {node: '>=14.16'} hasBin: true + is-installed-globally@1.0.0: + resolution: {integrity: sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ==} + engines: {node: '>=18'} + is-interactive@2.0.0: resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} engines: {node: '>=12'} @@ -8458,6 +9244,10 @@ packages: resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} engines: {node: '>=16'} + isexe@4.0.0: + resolution: {integrity: sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==} + engines: {node: '>=20'} + isomorphic-fetch@3.0.0: resolution: {integrity: sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==} @@ -8480,10 +9270,6 @@ packages: resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} hasBin: true - jiti@2.5.1: - resolution: {integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==} - hasBin: true - jiti@2.6.1: resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true @@ -8624,6 +9410,9 @@ packages: resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} engines: {node: '>=0.10'} + launch-editor@2.13.2: + resolution: {integrity: sha512-4VVDnbOpLXy/s8rdRCSXb+zfMeFR0WlJWpET1iA9CQdlZDfwyLjUuGQzXU4VeOoey6AicSAluWan7Etga6Kcmg==} + layout-base@1.0.2: resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} @@ -8727,10 +9516,6 @@ packages: resolution: {integrity: sha512-nVAvWk/jeyrWyXEAs84mpQCYccxRqgKY4OznLuJhJCa0XsPSfdOIr2zvBZEj3IHEHbX97jjscKRRV539bW0Gpw==} engines: {node: '>=13.2.0'} - local-pkg@1.1.1: - resolution: {integrity: sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==} - engines: {node: '>=14'} - local-pkg@1.1.2: resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==} engines: {node: '>=14'} @@ -8754,9 +9539,15 @@ packages: lodash.isarguments@3.1.0: resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} + lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + lodash@4.17.23: resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} @@ -8799,6 +9590,13 @@ packages: resolution: {integrity: sha512-DqC6n3QQ77zdFpCMASA1a3Jlb64Hv2N2DciFGkO/4L9+q/IpIAuRlKOvCXabtRW6cQf8usbmM6BE/TOPysCdIA==} engines: {bun: '>=1.0.0', deno: '>=1.30.0', node: '>=8.0.0'} + magic-regexp@0.10.0: + resolution: {integrity: sha512-Uly1Bu4lO1hwHUW0CQeSWuRtzCMNO00CmXtS8N6fyvB3B979GOEEeAkiTUDsmbYLAbvpUS/Kt5c4ibosAzVyVg==} + + magic-string-ast@1.0.3: + resolution: {integrity: sha512-CvkkH1i81zl7mmb94DsRiFeG9V2fR2JeuK8yDgS8oiZSFa++wWLEgZ5ufEOyLHbvSbD1gTRKv9NdX69Rnvr9JA==} + engines: {node: '>=20.19.0'} + magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} @@ -9096,10 +9894,6 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} - engines: {node: '>=16 || 14 >=14.17'} - minipass@7.1.3: resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} engines: {node: '>=16 || 14 >=14.17'} @@ -9119,12 +9913,12 @@ packages: engines: {node: '>=10'} hasBin: true - mlly@1.7.4: - resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} - mlly@1.8.1: resolution: {integrity: sha512-SnL6sNutTwRWWR/vcmCYHSADjiEesp5TGQQ0pXyLhW5IoeibRlF/CbSLailbB3CNqJUk9cVJ9dUDnbD7GrcHBQ==} + mocked-exports@0.1.1: + resolution: {integrity: sha512-aF7yRQr/Q0O2/4pIXm6PZ5G+jAd7QS4Yu8m+WEeEHGnbo+7mE36CbLSDQiXYV8bVL3NfmdeqPJct0tUlnjVSnA==} + module-details-from-path@1.0.4: resolution: {integrity: sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==} @@ -9175,6 +9969,9 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + nanotar@0.3.0: + resolution: {integrity: sha512-Kv2JYYiCzt16Kt5QwAc9BFG89xfPNBx+oQL4GQXD9nLqPkZBiNaqaCWtwnbk/q7UVsTYevvM1b0UF8zmEI4pCg==} + napi-postinstall@0.3.2: resolution: {integrity: sha512-tWVJxJHmBWLy69PvO96TZMZDrzmw5KeiZBz3RHmiM2XZ9grBJ2WgMAFVVg25nqp3ZjTFUs2Ftw1JhscL3Teliw==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} @@ -9288,9 +10085,6 @@ packages: resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} hasBin: true - node-mock-http@1.0.1: - resolution: {integrity: sha512-0gJJgENizp4ghds/Ywu2FCmcRsgBTmRQzYPZm61wy+Em2sBarSka0OhQS5huLBg6od1zkNpnWMCZloQDFVvOMQ==} - node-mock-http@1.0.4: resolution: {integrity: sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==} @@ -9313,9 +10107,26 @@ packages: resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + npm-run-path@6.0.0: + resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} + engines: {node: '>=18'} + nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + nuxt@4.4.2: + resolution: {integrity: sha512-iWVFpr/YEqVU/CenqIHMnIkvb2HE/9f+q8oxZ+pj2et+60NljGRClCgnmbvGPdmNFE0F1bEhoBCYfqbDOCim3Q==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@parcel/watcher': ^2.1.0 + '@types/node': '>=18.12.0' + peerDependenciesMeta: + '@parcel/watcher': + optional: true + '@types/node': + optional: true + nypm@0.6.5: resolution: {integrity: sha512-K6AJy1GMVyfyMXRVB88700BJqNUkByijGJM8kEHpLdcAt+vSQAVfkWWHYzuRXHSY6xA2sNc5RjTj0p9rE2izVQ==} engines: {node: '>=18'} @@ -9363,12 +10174,19 @@ packages: ofetch@1.5.1: resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==} + ofetch@2.0.0-alpha.3: + resolution: {integrity: sha512-zpYTCs2byOuft65vI3z43Dd6iSdFbOZZLb9/d21aCpx2rGastVU9dOCv0lu4ykc1Ur1anAYjDi3SUvR0vq50JA==} + ohash@2.0.11: resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} omggif@1.0.10: resolution: {integrity: sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==} + on-change@6.0.2: + resolution: {integrity: sha512-08+12qcOVEA0fS9g/VxKS27HaT94nRutUT77J2dr8zv/unzXopvhBuF8tNLWsoLQ5IgrQ6eptGeGqUYat82U1w==} + engines: {node: '>=20'} + on-exit-leak-free@2.1.2: resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} engines: {node: '>=14.0.0'} @@ -9403,6 +10221,10 @@ packages: only@0.0.2: resolution: {integrity: sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==} + open@10.2.0: + resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} + engines: {node: '>=18'} + open@8.4.2: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} @@ -9422,6 +10244,23 @@ packages: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} + oxc-minify@0.117.0: + resolution: {integrity: sha512-JHsv/b+bmBJkAzkHXgTN7RThloVxLHPT0ojHfjqxVeHuQB7LPpLUbJ2qfwz37sto9stZ9+AVwUP4b3gtR7p/Tw==} + engines: {node: ^20.19.0 || >=22.12.0} + + oxc-parser@0.117.0: + resolution: {integrity: sha512-l3cbgK5wUvWDVNWM/JFU77qDdGZK1wudnLsFcrRyNo/bL1CyU8pC25vDhMHikVY29lbK2InTWsX42RxVSutUdQ==} + engines: {node: ^20.19.0 || >=22.12.0} + + oxc-transform@0.117.0: + resolution: {integrity: sha512-u1Stl2uhDh9bFuOGjGXQIqx46IRUNMyHQkq59LayXNGS2flNv7RpZpRSWs5S5deuNP6jJZ12gtMBze+m4dOhmw==} + engines: {node: ^20.19.0 || >=22.12.0} + + oxc-walker@0.7.0: + resolution: {integrity: sha512-54B4KUhrzbzc4sKvKwVYm7E2PgeROpGba0/2nlNZMqfDyca+yOor5IMb4WLGBatGDT0nkzYdYuzylg7n3YfB7A==} + peerDependencies: + oxc-parser: '>=0.98.0' + p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -9623,9 +10462,6 @@ packages: pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} - pkg-types@2.2.0: - resolution: {integrity: sha512-2SM/GZGAEkPp3KWORxQZns4M+WSeXbC2HEvmOIJe3Cmiv6ieAJvdVhDldtHqM5J1Y7MrR1XhkBT/rMlhh9FdqQ==} - pkg-types@2.3.0: resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} @@ -9659,6 +10495,48 @@ packages: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} + postcss-calc@10.1.1: + resolution: {integrity: sha512-NYEsLHh8DgG/PRH2+G9BTuUdtf9ViS+vdoQ0YA5OQdGsfN4ztiwtDWNtBl9EKeqNMFnIu8IKZ0cLxEQ5r5KVMw==} + engines: {node: ^18.12 || ^20.9 || >=22.0} + peerDependencies: + postcss: ^8.4.38 + + postcss-colormin@7.0.7: + resolution: {integrity: sha512-sBQ628lSj3VQpDquQel8Pen5mmjFPsO4pH9lDLaHB1AVkMRHtkl0pRB5DCWznc9upWsxint/kV+AveSj7W1tew==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-convert-values@7.0.9: + resolution: {integrity: sha512-l6uATQATZaCa0bckHV+r6dLXfWtUBKXxO3jK+AtxxJJtgMPD+VhhPCCx51I4/5w8U5uHV67g3w7PXj+V3wlMlg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-discard-comments@7.0.6: + resolution: {integrity: sha512-Sq+Fzj1Eg5/CPf1ERb0wS1Im5cvE2gDXCE+si4HCn1sf+jpQZxDI4DXEp8t77B/ImzDceWE2ebJQFXdqZ6GRJw==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-discard-duplicates@7.0.2: + resolution: {integrity: sha512-eTonaQvPZ/3i1ASDHOKkYwAybiM45zFIc7KXils4mQmHLqIswXD9XNOKEVxtTFnsmwYzF66u4LMgSr0abDlh5w==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-discard-empty@7.0.1: + resolution: {integrity: sha512-cFrJKZvcg/uxB6Ijr4l6qmn3pXQBna9zyrPC+sK0zjbkDUZew+6xDltSF7OeB7rAtzaaMVYSdbod+sZOCWnMOg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-discard-overridden@7.0.1: + resolution: {integrity: sha512-7c3MMjjSZ/qYrx3uc1940GSOzN1Iqjtlqe8uoSg+qdVPYyRb0TILSqqmtlSFuE4mTDECwsm397Ya7iXGzfF7lg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + postcss-import@15.1.0: resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} engines: {node: '>=14.0.0'} @@ -9695,12 +10573,120 @@ packages: ts-node: optional: true + postcss-merge-longhand@7.0.5: + resolution: {integrity: sha512-Kpu5v4Ys6QI59FxmxtNB/iHUVDn9Y9sYw66D6+SZoIk4QTz1prC4aYkhIESu+ieG1iylod1f8MILMs1Em3mmIw==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-merge-rules@7.0.8: + resolution: {integrity: sha512-BOR1iAM8jnr7zoQSlpeBmCsWV5Uudi/+5j7k05D0O/WP3+OFMPD86c1j/20xiuRtyt45bhxw/7hnhZNhW2mNFA==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-minify-font-values@7.0.1: + resolution: {integrity: sha512-2m1uiuJeTplll+tq4ENOQSzB8LRnSUChBv7oSyFLsJRtUgAAJGP6LLz0/8lkinTgxrmJSPOEhgY1bMXOQ4ZXhQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-minify-gradients@7.0.2: + resolution: {integrity: sha512-fVY3AB8Um7SJR5usHqTY2Ngf9qh8IRN+FFzrBP0ONJy6yYXsP7xyjK2BvSAIrpgs1cST+H91V0TXi3diHLYJtw==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-minify-params@7.0.6: + resolution: {integrity: sha512-YOn02gC68JijlaXVuKvFSCvQOhTpblkcfDre2hb/Aaa58r2BIaK4AtE/cyZf2wV7YKAG+UlP9DT+By0ry1E4VQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-minify-selectors@7.0.6: + resolution: {integrity: sha512-lIbC0jy3AAwDxEgciZlBullDiMBeBCT+fz5G8RcA9MWqh/hfUkpOI3vNDUNEZHgokaoiv0juB9Y8fGcON7rU/A==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + postcss-nested@6.2.0: resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} engines: {node: '>=12.0'} peerDependencies: postcss: ^8.2.14 + postcss-normalize-charset@7.0.1: + resolution: {integrity: sha512-sn413ofhSQHlZFae//m9FTOfkmiZ+YQXsbosqOWRiVQncU2BA3daX3n0VF3cG6rGLSFVc5Di/yns0dFfh8NFgQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-normalize-display-values@7.0.1: + resolution: {integrity: sha512-E5nnB26XjSYz/mGITm6JgiDpAbVuAkzXwLzRZtts19jHDUBFxZ0BkXAehy0uimrOjYJbocby4FVswA/5noOxrQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-normalize-positions@7.0.1: + resolution: {integrity: sha512-pB/SzrIP2l50ZIYu+yQZyMNmnAcwyYb9R1fVWPRxm4zcUFCY2ign7rcntGFuMXDdd9L2pPNUgoODDk91PzRZuQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-normalize-repeat-style@7.0.1: + resolution: {integrity: sha512-NsSQJ8zj8TIDiF0ig44Byo3Jk9e4gNt9x2VIlJudnQQ5DhWAHJPF4Tr1ITwyHio2BUi/I6Iv0HRO7beHYOloYQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-normalize-string@7.0.1: + resolution: {integrity: sha512-QByrI7hAhsoze992kpbMlJSbZ8FuCEc1OT9EFbZ6HldXNpsdpZr+YXC5di3UEv0+jeZlHbZcoCADgb7a+lPmmQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-normalize-timing-functions@7.0.1: + resolution: {integrity: sha512-bHifyuuSNdKKsnNJ0s8fmfLMlvsQwYVxIoUBnowIVl2ZAdrkYQNGVB4RxjfpvkMjipqvbz0u7feBZybkl/6NJg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-normalize-unicode@7.0.6: + resolution: {integrity: sha512-z6bwTV84YW6ZvvNoaNLuzRW4/uWxDKYI1iIDrzk6D2YTL7hICApy+Q1LP6vBEsljX8FM7YSuV9qI79XESd4ddQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-normalize-url@7.0.1: + resolution: {integrity: sha512-sUcD2cWtyK1AOL/82Fwy1aIVm/wwj5SdZkgZ3QiUzSzQQofrbq15jWJ3BA7Z+yVRwamCjJgZJN0I9IS7c6tgeQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-normalize-whitespace@7.0.1: + resolution: {integrity: sha512-vsbgFHMFQrJBJKrUFJNZ2pgBeBkC2IvvoHjz1to0/0Xk7sII24T0qFOiJzG6Fu3zJoq/0yI4rKWi7WhApW+EFA==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-ordered-values@7.0.2: + resolution: {integrity: sha512-AMJjt1ECBffF7CEON/Y0rekRLS6KsePU6PRP08UqYW4UGFRnTXNrByUzYK1h8AC7UWTZdQ9O3Oq9kFIhm0SFEw==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-reduce-initial@7.0.6: + resolution: {integrity: sha512-G6ZyK68AmrPdMB6wyeA37ejnnRG2S8xinJrZJnOv+IaRKf6koPAVbQsiC7MfkmXaGmF1UO+QCijb27wfpxuRNg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-reduce-transforms@7.0.1: + resolution: {integrity: sha512-MhyEbfrm+Mlp/36hvZ9mT9DaO7dbncU0CvWI8V93LRkY6IYlu38OPg3FObnuKTUxJ4qA8HpurdQOo5CyqqO76g==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + postcss-safe-parser@7.0.1: resolution: {integrity: sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==} engines: {node: '>=18.0'} @@ -9721,6 +10707,22 @@ packages: resolution: {integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==} engines: {node: '>=4'} + postcss-selector-parser@7.1.1: + resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} + engines: {node: '>=4'} + + postcss-svgo@7.1.1: + resolution: {integrity: sha512-zU9H9oEDrUFKa0JB7w+IYL7Qs9ey1mZyjhbf0KLxwJDdDRtoPvCmaEfknzqfHj44QS9VD6c5sJnBAVYTLRg/Sg==} + engines: {node: ^18.12.0 || ^20.9.0 || >= 18} + peerDependencies: + postcss: ^8.4.32 + + postcss-unique-selectors@7.0.5: + resolution: {integrity: sha512-3QoYmEt4qg/rUWDn6Tc8+ZVPmbp4G1hXDtCNWDx0st8SjtCbRcxRXDDM1QrEiXGG3A45zscSJFb4QH90LViyxg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} @@ -9732,6 +10734,10 @@ packages: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} + postcss@8.5.9: + resolution: {integrity: sha512-7a70Nsot+EMX9fFU3064K/kdHWZqGVY+BADLyXc8Dfv+mTLLVl6JzJpPaCZ2kQL9gIJvKXSLMHhqdRRjwQeFtw==} + engines: {node: ^10 || ^12 || >=14} + postgres-array@2.0.0: resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} engines: {node: '>=4'} @@ -9939,6 +10945,9 @@ packages: rc9@2.1.2: resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} + rc9@3.0.1: + resolution: {integrity: sha512-gMDyleLWVE+i6Sgtc0QbbY6pEKqYs97NGi6isHQPqYlLemPoO8dxQ3uGi0f4NiP98c+jMW6cG1Kx9dDwfvqARQ==} + rdf-canonize@5.0.0: resolution: {integrity: sha512-g8OUrgMXAR9ys/ZuJVfBr05sPPoMA7nHIVs8VEvg9QwM5W4GR2qSFEEHjsyHF1eWlBaf8Ev40WNjQFQ+nJTO3w==} engines: {node: '>=18'} @@ -10034,6 +11043,10 @@ packages: regex@6.0.1: resolution: {integrity: sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==} + regexp-tree@0.1.27: + resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} + hasBin: true + regexp.prototype.flags@1.5.4: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} @@ -10197,9 +11210,16 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + rou3@0.8.1: + resolution: {integrity: sha512-ePa+XGk00/3HuCqrEnK3LxJW7I0SdNg6EFzKUJG73hMAdDcOUC/i/aSz7LSDwLrGr33kal/rqOGydzwl6U7zBA==} + roughjs@4.6.6: resolution: {integrity: sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==} + run-applescript@7.1.0: + resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} + engines: {node: '>=18'} + run-async@4.0.6: resolution: {integrity: sha512-IoDlSLTs3Yq593mb3ZoKWKXMNu3UpObxhgA/Xuid5p4bbfi2jdY1Hj0m1K+0/tEuQTxIGMhQDqGjKb7RuxGpAQ==} engines: {node: '>=0.12.0'} @@ -10248,6 +11268,10 @@ packages: sax@1.4.3: resolution: {integrity: sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ==} + sax@1.6.0: + resolution: {integrity: sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==} + engines: {node: '>=11.0.0'} + scheduler@0.25.0-rc-7771d3a7-20240827: resolution: {integrity: sha512-n4nHmAoerbIOSrH24w0+fcdCUwQ4Npm7yXfsrn09FL01OWIaxpuo4P0rj3qPyLFgsJDbn18sWvLVB/e/KPnR+A==} @@ -10302,6 +11326,10 @@ packages: resolution: {integrity: sha512-OE4cvmJ1uSPrKorFIH9/w/Qwuvi/IMcGbv5RKgcJ/zjA/IohDLU6SVaxFN9FwajbP7nsX0dQqMDes1whk3y+yw==} engines: {node: '>=10'} + seroval@1.5.2: + resolution: {integrity: sha512-xcRN39BdsnO9Tf+VzsE7b3JyTJASItIV1FVFewJKCFcW4s4haIKS3e6vj8PGB9qBwC7tnuOywQMdv5N4qkzi7Q==} + engines: {node: '>=10'} + serve-placeholder@2.0.2: resolution: {integrity: sha512-/TMG8SboeiQbZJWRlfTCqMs2DD3SZgWp0kDQePz9yUuCnDfDh/92gf7/PxGhzXTKBIPASIHxFcZndoNbp6QOLQ==} @@ -10353,6 +11381,10 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + shell-quote@1.8.3: + resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} + engines: {node: '>= 0.4'} + shiki@1.29.2: resolution: {integrity: sha512-njXuliz/cP+67jU2hukkxCNuH1yUi4QfdZZY+sMr5PPrIyXSu5iTb/qYC4BiWWB0vZ+7TbdvYUCeL23zpwCfbg==} @@ -10388,6 +11420,9 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + simple-git@3.35.2: + resolution: {integrity: sha512-ZMjl06lzTm1EScxEGuM6+mEX+NQd14h/B3x0vWU+YOXAMF8sicyi1K4cjTfj5is+35ChJEHDl1EjypzYFWH2FA==} + simple-swizzle@0.2.2: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} @@ -10399,6 +11434,10 @@ packages: resolution: {integrity: sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==} engines: {node: '>=18'} + sirv@3.0.2: + resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} + engines: {node: '>=18'} + sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} @@ -10486,6 +11525,11 @@ packages: resolution: {integrity: sha512-BsTCV265VpTp8tm1wyIm1xqQCS+Q9NHx2Sr+WcnUrgLrQ6yiDIvHYJV5gHxsj1lMBy2zm5twLaZao8Jd+S8JJw==} engines: {bun: '>=1.0.0', deno: '>=2.0.0', node: '>=12.0.0'} + srvx@0.11.15: + resolution: {integrity: sha512-iXsux0UcOjdvs0LCMa2Ws3WwcDUozA3JN3BquNXkaFPP7TpRqgunKdEgoZ/uwb1J6xaYHfxtz9Twlh6yzwM6Tg==} + engines: {node: '>=20.16.0'} + hasBin: true + srvx@0.8.16: resolution: {integrity: sha512-hmcGW4CgroeSmzgF1Ihwgl+Ths0JqAJ7HwjP2X7e3JzY7u4IydLMcdnlqGQiQGUswz+PO9oh/KtCpOISIvs9QQ==} engines: {node: '>=20.16.0'} @@ -10521,6 +11565,9 @@ packages: std-env@3.10.0: resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + std-env@4.0.0: + resolution: {integrity: sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ==} + stdin-discarder@0.2.2: resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} engines: {node: '>=18'} @@ -10635,6 +11682,9 @@ packages: resolution: {integrity: sha512-FhwotcEqjr241ZbjFzjlIYg6c5/L/s4yBGWSMvJ9UoExiSqL+FnFA/CaeZx17WGaZMS/4SOZp8wH18jSS4R4lw==} engines: {node: '>=16'} + structured-clone-es@2.0.0: + resolution: {integrity: sha512-5UuAHmBLXYPCl22xWJrFuGmIhBKQzxISPVz6E7nmTmTcAOpUzlbjKJsRrCE4vADmMQ0dzeCnlWn9XufnAGf76Q==} + structured-field-values@2.0.4: resolution: {integrity: sha512-5zpJXYLPwW3WYUD/D58tQjIBs10l3Yx64jZfcKGs/RH79E2t9Xm/b9+ydwdMNVSksnsIY+HR/2IlQmgo0AcTAg==} @@ -10664,6 +11714,12 @@ packages: babel-plugin-macros: optional: true + stylehacks@7.0.8: + resolution: {integrity: sha512-I3f053GBLIiS5Fg6OMFhq/c+yW+5Hc2+1fgq7gElDMMSqwlRb3tBf2ef6ucLStYRpId4q//bQO1FjcyNyy4yDQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + stylis@4.3.6: resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==} @@ -10714,6 +11770,11 @@ packages: engines: {node: '>=16'} hasBin: true + svgo@4.0.1: + resolution: {integrity: sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w==} + engines: {node: '>=16'} + hasBin: true + system-architecture@0.1.0: resolution: {integrity: sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==} engines: {node: '>=18'} @@ -10746,6 +11807,7 @@ packages: tar@7.4.3: resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} engines: {node: '>=18'} + deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me teex@1.0.1: resolution: {integrity: sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==} @@ -10798,6 +11860,10 @@ packages: 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} + tinycolor2@1.6.0: resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} @@ -11008,6 +12074,9 @@ packages: resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} engines: {node: '>= 0.6'} + type-level-regexp@0.1.17: + resolution: {integrity: sha512-wTk4DH3cxwk196uGLK/E9pE45aLfeKJacKmcEgEOA/q5dnPGNxXt0cfYdFxb57L+sEpf1oJH4Dnx/pnRcku9jg==} + typed-array-buffer@1.0.3: resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} engines: {node: '>= 0.4'} @@ -11049,9 +12118,6 @@ packages: uc.micro@2.1.0: resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} - ufo@1.6.1: - resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} - ufo@1.6.3: resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} @@ -11112,6 +12178,13 @@ packages: unenv@2.0.0-rc.24: resolution: {integrity: sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==} + unhead@2.1.13: + resolution: {integrity: sha512-jO9M1sI6b2h/1KpIu4Jeu+ptumLmUKboRRLxys5pYHFeT+lqTzfNHbYUX9bxVDhC1FBszAGuWcUVlmvIPsah8Q==} + + unicorn-magic@0.3.0: + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} + engines: {node: '>=18'} + unicorn-magic@0.4.0: resolution: {integrity: sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw==} engines: {node: '>=20'} @@ -11126,6 +12199,10 @@ packages: resolution: {integrity: sha512-njnL6sp8lEA8QQbZrt+52p/g4X0rw3bnGGmUcJnt1jeG8+iiqO779aGz0PirCtydAIVcuTBRlJ52F0u46z309Q==} engines: {node: '>=18.12.0'} + unimport@6.0.2: + resolution: {integrity: sha512-ZSOkrDw380w+KIPniY3smyXh2h7H9v2MNr9zejDuh239o5sdea44DRAYrv+rfUi2QGT186P2h0GPGKvy8avQ5g==} + engines: {node: '>=18.12.0'} + unist-util-find-after@5.0.0: resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} @@ -11168,6 +12245,13 @@ packages: resolution: {integrity: sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==} engines: {node: '>=18.12.0'} + unplugin@3.0.0: + resolution: {integrity: sha512-0Mqk3AT2TZCXWKdcoaufeXNukv2mTrEZExeXlHIOZXdqYoHHr4n51pymnwV8x2BOVxwXbK2HLlI7usrqMpycdg==} + engines: {node: ^20.19.0 || >=22.12.0} + + unrouting@0.1.7: + resolution: {integrity: sha512-+0hfD+CVWtD636rc5Fn9VEjjTEDhdqgMpbwAuVoUmydSHDaMNiFW93SJG4LV++RoGSEAyvQN5uABAscYpDphpQ==} + unrs-resolver@1.11.1: resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==} @@ -11318,28 +12402,96 @@ packages: resolution: {integrity: sha512-82Qm+EG/b2PRFBvXBbz1lgWBGcd9totIL6SJhnrZYfakjloTVG9+5l6gfO6dbCCtztm5pqWFzLY0qpZ3H3ww/w==} hasBin: true + vite-dev-rpc@1.1.0: + resolution: {integrity: sha512-pKXZlgoXGoE8sEKiKJSng4hI1sQ4wi5YT24FCrwrLt6opmkjlqPPVmiPWWJn8M8byMxRGzp1CrFuqQs4M/Z39A==} + peerDependencies: + vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.1 || ^7.0.0-0 + + vite-hot-client@2.1.0: + resolution: {integrity: sha512-7SpgZmU7R+dDnSmvXE1mfDtnHLHQSisdySVR7lO8ceAXvM0otZeuQQ6C8LrS5d/aYyP/QZ0hI0L+dIPrm4YlFQ==} + peerDependencies: + vite: ^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0 + vite-node@3.2.4: resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true - vite-plugin-solid@2.11.10: - resolution: {integrity: sha512-Yr1dQybmtDtDAHkii6hXuc1oVH9CPcS/Zb2jN/P36qqcrkNnVPsMTzQ06jyzFPFjj3U1IYKMVt/9ZqcwGCEbjw==} + vite-node@5.3.0: + resolution: {integrity: sha512-8f20COPYJujc3OKPX6OuyBy3ZIv2det4eRRU4GY1y2MjbeGSUmPjedxg1b72KnTagCofwvZ65ThzjxDW2AtQFQ==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + vite-plugin-checker@0.12.0: + resolution: {integrity: sha512-CmdZdDOGss7kdQwv73UyVgLPv0FVYe5czAgnmRX2oKljgEvSrODGuClaV3PDR2+3ou7N/OKGauDDBjy2MB07Rg==} + engines: {node: '>=16.11'} peerDependencies: - '@testing-library/jest-dom': ^5.16.6 || ^5.17.0 || ^6.* - solid-js: ^1.7.2 - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + '@biomejs/biome': '>=1.7' + eslint: '>=9.39.1' + meow: ^13.2.0 + optionator: ^0.9.4 + oxlint: '>=1' + stylelint: '>=16' + typescript: '*' + vite: '>=5.4.21' + vls: '*' + vti: '*' + vue-tsc: ~2.2.10 || ^3.0.0 peerDependenciesMeta: - '@testing-library/jest-dom': + '@biomejs/biome': optional: true - - vite@5.4.19: - resolution: {integrity: sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 - less: '*' + eslint: + optional: true + meow: + optional: true + optionator: + optional: true + oxlint: + optional: true + stylelint: + optional: true + typescript: + optional: true + vls: + optional: true + vti: + optional: true + vue-tsc: + optional: true + + vite-plugin-inspect@11.3.3: + resolution: {integrity: sha512-u2eV5La99oHoYPHE6UvbwgEqKKOQGz86wMg40CCosP6q8BkB6e5xPneZfYagK4ojPJSj5anHCrnvC20DpwVdRA==} + engines: {node: '>=14'} + peerDependencies: + '@nuxt/kit': '*' + vite: ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + '@nuxt/kit': + optional: true + + vite-plugin-solid@2.11.10: + resolution: {integrity: sha512-Yr1dQybmtDtDAHkii6hXuc1oVH9CPcS/Zb2jN/P36qqcrkNnVPsMTzQ06jyzFPFjj3U1IYKMVt/9ZqcwGCEbjw==} + peerDependencies: + '@testing-library/jest-dom': ^5.16.6 || ^5.17.0 || ^6.* + solid-js: ^1.7.2 + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + peerDependenciesMeta: + '@testing-library/jest-dom': + optional: true + + vite-plugin-vue-tracer@1.3.0: + resolution: {integrity: sha512-Cgfce6VikzOw5MUJTpeg50s5rRjzU1Vr61ZjuHunVVHLjZZ5AUlgyExHthZ3r59vtoz9W2rDt23FYG81avYBKw==} + peerDependencies: + vite: ^6.0.0 || ^7.0.0 + vue: ^3.5.0 + + vite@5.4.19: + resolution: {integrity: sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' lightningcss: ^1.21.0 sass: '*' sass-embedded: '*' @@ -11444,6 +12596,46 @@ packages: yaml: optional: true + vite@7.3.2: + resolution: {integrity: sha512-Bby3NOsna2jsjfLVOHKes8sGwgl4TT0E6vvpYgnAYDIF/tie7MRaFthmKuHx1NSXjiTueXH3do80FMQgvEktRg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.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' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + vitefu@1.1.1: resolution: {integrity: sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==} peerDependencies: @@ -11527,11 +12719,40 @@ packages: vscode-uri@3.0.8: resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + vscode-uri@3.1.0: + resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} + + vue-bundle-renderer@2.2.0: + resolution: {integrity: sha512-sz/0WEdYH1KfaOm0XaBmRZOWgYTEvUDt6yPYaUzl4E52qzgWLlknaPPTTZmp6benaPTlQAI/hN1x3tAzZygycg==} + + vue-devtools-stub@0.1.0: + resolution: {integrity: sha512-RutnB7X8c5hjq39NceArgXg28WZtZpGc3+J16ljMiYnFhKvd8hITxSWQSQ5bvldxMDU6gG5mkxl1MTQLXckVSQ==} + vue-resize@2.0.0-alpha.1: resolution: {integrity: sha512-7+iqOueLU7uc9NrMfrzbG8hwMqchfVfSzpVlCMeJQe4pyibqyoifDNbKTZvwxZKDvGkB+PdFeKvnGZMoEb8esg==} peerDependencies: vue: ^3.0.0 + vue-router@4.6.4: + resolution: {integrity: sha512-Hz9q5sa33Yhduglwz6g9skT8OBPii+4bFn88w6J+J4MfEo4KRRpmiNG/hHHkdbRFlLBOqxN8y8gf2Fb0MTUgVg==} + peerDependencies: + vue: ^3.5.0 + + vue-router@5.0.4: + resolution: {integrity: sha512-lCqDLCI2+fKVRl2OzXuzdSWmxXFLQRxQbmHugnRpTMyYiT+hNaycV0faqG5FBHDXoYrZ6MQcX87BvbY8mQ20Bg==} + peerDependencies: + '@pinia/colada': '>=0.21.2' + '@vue/compiler-sfc': ^3.5.17 + pinia: ^3.0.4 + vue: ^3.5.0 + peerDependenciesMeta: + '@pinia/colada': + optional: true + '@vue/compiler-sfc': + optional: true + pinia: + optional: true + vue@3.5.17: resolution: {integrity: sha512-LbHV3xPN9BeljML+Xctq4lbz2lVHCR6DtbpTf5XIO6gugpXUN49j2QQPcMj086r9+AkJ0FfUT8xjulKKBkkr9g==} peerDependencies: @@ -11540,6 +12761,14 @@ packages: typescript: optional: true + vue@3.5.32: + resolution: {integrity: sha512-vM4z4Q9tTafVfMAK7IVzmxg34rSzTFMyIe0UUEijUCkn9+23lj0WRfA83dg7eQZIUlgOSGrkViIaCfqSAUXsMw==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + wasm-feature-detect@1.8.0: resolution: {integrity: sha512-zksaLKM2fVlnB5jQQDqKXXwYHLQUVH9es+5TOOHwGOVJOCeRBCiPjwSg+3tN2AdTCzjgli4jijCH290kXb/zWQ==} @@ -11588,6 +12817,11 @@ packages: engines: {node: ^16.13.0 || >=18.0.0} hasBin: true + which@6.0.1: + resolution: {integrity: sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==} + engines: {node: ^20.17.0 || >=22.9.0} + hasBin: true + why-is-node-running@2.3.0: resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} engines: {node: '>=8'} @@ -11666,6 +12900,22 @@ packages: utf-8-validate: optional: true + ws@8.20.0: + resolution: {integrity: sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + wsl-utils@0.1.0: + resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} + engines: {node: '>=18'} + x-forwarded-fetch@0.2.0: resolution: {integrity: sha512-2qsguQrLHFvP3/rnvxSSaw3DlK9eOOx9iyL+Qv+1YH8jzq6nbRk+P6gyFFNdWanyusyCHuE3/CnX3+gmLeYEeg==} @@ -11710,6 +12960,11 @@ packages: engines: {node: '>= 14.6'} hasBin: true + yaml@2.8.3: + resolution: {integrity: sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==} + engines: {node: '>= 14.6'} + hasBin: true + yargs-parser@20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} @@ -12102,10 +13357,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/node@10.0.4(astro@5.17.3(@types/node@24.3.0)(db0@0.3.4(mysql2@3.18.2(@types/node@24.3.0)))(ioredis@5.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(rollup@4.59.0)(terser@5.46.0)(tsx@4.20.3)(typescript@5.9.3)(yaml@2.8.1))': + '@astrojs/node@10.0.4(astro@5.17.3(@types/node@24.3.0)(db0@0.3.4(mysql2@3.18.2(@types/node@24.3.0)))(ioredis@5.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(rollup@4.59.0)(terser@5.46.0)(tsx@4.20.3)(typescript@5.9.3)(yaml@2.8.3))': dependencies: '@astrojs/internal-helpers': 0.8.0 - astro: 5.17.3(@types/node@24.3.0)(db0@0.3.4(mysql2@3.18.2(@types/node@24.3.0)))(ioredis@5.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(rollup@4.59.0)(terser@5.46.0)(tsx@4.20.3)(typescript@5.9.3)(yaml@2.8.1) + astro: 5.17.3(@types/node@24.3.0)(db0@0.3.4(mysql2@3.18.2(@types/node@24.3.0)))(ioredis@5.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(rollup@4.59.0)(terser@5.46.0)(tsx@4.20.3)(typescript@5.9.3)(yaml@2.8.3) send: 1.2.1 server-destroy: 1.0.1 transitivePeerDependencies: @@ -12178,6 +13433,10 @@ snapshots: '@types/jsesc': 2.5.1 jsesc: 3.1.0 + '@babel/helper-annotate-as-pure@7.27.3': + dependencies: + '@babel/types': 7.29.0 + '@babel/helper-compilation-targets@7.28.6': dependencies: '@babel/compat-data': 7.29.0 @@ -12186,8 +13445,28 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 + '@babel/helper-create-class-features-plugin@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-member-expression-to-functions': 7.28.5 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.28.6(@babel/core@7.29.0) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.29.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + '@babel/helper-globals@7.28.0': {} + '@babel/helper-member-expression-to-functions@7.28.5': + dependencies: + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + transitivePeerDependencies: + - supports-color + '@babel/helper-module-imports@7.18.6': dependencies: '@babel/types': 7.29.0 @@ -12208,8 +13487,28 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-optimise-call-expression@7.27.1': + dependencies: + '@babel/types': 7.29.0 + '@babel/helper-plugin-utils@7.28.6': {} + '@babel/helper-replace-supers@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-member-expression-to-functions': 7.28.5 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + dependencies: + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + transitivePeerDependencies: + - supports-color + '@babel/helper-string-parser@7.27.1': {} '@babel/helper-string-parser@8.0.0-rc.3': {} @@ -12229,6 +13528,10 @@ snapshots: dependencies: '@babel/types': 7.29.0 + '@babel/parser@7.29.2': + dependencies: + '@babel/types': 7.29.0 + '@babel/parser@8.0.0-rc.3': dependencies: '@babel/types': 8.0.0-rc.3 @@ -12243,6 +13546,17 @@ snapshots: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-typescript@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) + transitivePeerDependencies: + - supports-color + '@babel/template@7.28.6': dependencies: '@babel/code-frame': 7.29.0 @@ -12271,6 +13585,11 @@ snapshots: '@babel/helper-string-parser': 8.0.0-rc.3 '@babel/helper-validator-identifier': 8.0.0-rc.3 + '@bomb.sh/tab@0.0.14(cac@6.7.14)(citty@0.2.1)': + optionalDependencies: + cac: 6.7.14 + citty: 0.2.1 + '@borewit/text-codec@0.2.2': {} '@boringnode/encryption@1.0.0': @@ -12307,6 +13626,18 @@ snapshots: '@chevrotain/utils@11.0.3': {} + '@clack/core@1.2.0': + dependencies: + fast-wrap-ansi: 0.1.6 + sisteransi: 1.0.5 + + '@clack/prompts@1.2.0': + dependencies: + '@clack/core': 1.2.0 + fast-string-width: 1.1.0 + fast-wrap-ansi: 0.1.6 + sisteransi: 1.0.5 + '@cloudflare/kv-asset-handler@0.4.0': dependencies: mime: 3.0.0 @@ -12325,7 +13656,7 @@ snapshots: optionalDependencies: workerd: 1.20250906.0 - '@cloudflare/vitest-pool-workers@0.8.71(@cloudflare/workers-types@4.20251221.0)(@vitest/runner@3.2.4)(@vitest/snapshot@3.2.4)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1))': + '@cloudflare/vitest-pool-workers@0.8.71(@cloudflare/workers-types@4.20251221.0)(@vitest/runner@3.2.4)(@vitest/snapshot@3.2.4)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3))': dependencies: '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -12334,7 +13665,7 @@ snapshots: devalue: 5.6.1 miniflare: 4.20250906.0 semver: 7.7.2 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3) wrangler: 4.35.0(@cloudflare/workers-types@4.20251221.0) zod: 3.22.3 transitivePeerDependencies: @@ -12374,6 +13705,8 @@ snapshots: '@cloudflare/workers-types@4.20251221.0': {} + '@colordx/core@5.0.3': {} + '@colors/colors@1.5.0': optional: true @@ -12381,9 +13714,9 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@deno/astro-adapter@0.3.2(@opentelemetry/api@1.9.0)(astro@5.17.3(@types/node@24.3.0)(db0@0.3.4(mysql2@3.18.2(@types/node@24.3.0)))(ioredis@5.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(rollup@4.59.0)(terser@5.46.0)(tsx@4.20.3)(typescript@5.9.3)(yaml@2.8.1))': + '@deno/astro-adapter@0.3.2(@opentelemetry/api@1.9.0)(astro@5.17.3(@types/node@24.3.0)(db0@0.3.4(mysql2@3.18.2(@types/node@24.3.0)))(ioredis@5.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(rollup@4.59.0)(terser@5.46.0)(tsx@4.20.3)(typescript@5.9.3)(yaml@2.8.3))': dependencies: - astro: 5.17.3(@types/node@24.3.0)(db0@0.3.4(mysql2@3.18.2(@types/node@24.3.0)))(ioredis@5.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(rollup@4.59.0)(terser@5.46.0)(tsx@4.20.3)(typescript@5.9.3)(yaml@2.8.1) + astro: 5.17.3(@types/node@24.3.0)(db0@0.3.4(mysql2@3.18.2(@types/node@24.3.0)))(ioredis@5.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(rollup@4.59.0)(terser@5.46.0)(tsx@4.20.3)(typescript@5.9.3)(yaml@2.8.3) optionalDependencies: '@opentelemetry/api': 1.9.0 @@ -12448,6 +13781,19 @@ snapshots: transitivePeerDependencies: - '@algolia/client-search' + '@dxup/nuxt@0.4.0(magicast@0.5.2)(typescript@5.9.3)': + dependencies: + '@dxup/unimport': 0.1.2 + '@nuxt/kit': 4.4.2(magicast@0.5.2) + chokidar: 5.0.0 + pathe: 2.0.3 + tinyglobby: 0.2.15 + typescript: 5.9.3 + transitivePeerDependencies: + - magicast + + '@dxup/unimport@0.1.2': {} + '@emnapi/core@1.4.3': dependencies: '@emnapi/wasi-threads': 1.0.2 @@ -12934,8 +14280,8 @@ snapshots: debug: 4.4.3 globals: 15.15.0 kolorist: 1.8.0 - local-pkg: 1.1.1 - mlly: 1.7.4 + local-pkg: 1.1.2 + mlly: 1.8.1 transitivePeerDependencies: - supports-color @@ -13259,14 +14605,14 @@ snapshots: dependencies: string-width: 5.1.2 string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.0 + strip-ansi: 7.2.0 strip-ansi-cjs: strip-ansi@6.0.1 wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 '@isaacs/fs-minipass@4.0.1': dependencies: - minipass: 7.1.2 + minipass: 7.1.3 '@jimp/bmp@0.22.12(@jimp/custom@0.22.12)': dependencies: @@ -13517,6 +14863,11 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping@0.3.9': dependencies: '@jridgewell/resolve-uri': 3.1.2 @@ -13546,6 +14897,14 @@ snapshots: '@jsr/std__path@1.1.0': {} + '@kwsites/file-exists@1.1.1': + dependencies: + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@kwsites/promise-deferred@1.1.1': {} + '@logtape/file@2.0.5(@logtape/logtape@2.0.5)': dependencies: '@logtape/logtape': 2.0.5 @@ -13721,6 +15080,278 @@ snapshots: '@nolyfill/is-core-module@1.0.39': {} + '@nuxt/cli@3.34.0(@nuxt/schema@4.4.2)(cac@6.7.14)(magicast@0.5.2)': + dependencies: + '@bomb.sh/tab': 0.0.14(cac@6.7.14)(citty@0.2.1) + '@clack/prompts': 1.2.0 + c12: 3.3.3(magicast@0.5.2) + citty: 0.2.1 + confbox: 0.2.4 + consola: 3.4.2 + debug: 4.4.3 + defu: 6.1.4 + exsolve: 1.0.8 + fuse.js: 7.3.0 + fzf: 0.5.2 + giget: 3.2.0 + jiti: 2.6.1 + listhen: 1.9.0 + nypm: 0.6.5 + ofetch: 1.5.1 + ohash: 2.0.11 + pathe: 2.0.3 + perfect-debounce: 2.1.0 + pkg-types: 2.3.0 + scule: 1.3.0 + semver: 7.7.4 + srvx: 0.11.15 + std-env: 3.10.0 + tinyclip: 0.1.12 + tinyexec: 1.0.4 + ufo: 1.6.3 + youch: 4.1.0 + optionalDependencies: + '@nuxt/schema': 4.4.2 + transitivePeerDependencies: + - cac + - commander + - magicast + - supports-color + + '@nuxt/devalue@2.0.2': {} + + '@nuxt/devtools-kit@3.2.4(magicast@0.5.2)(vite@7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3))': + dependencies: + '@nuxt/kit': 4.4.2(magicast@0.5.2) + execa: 8.0.1 + vite: 7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3) + transitivePeerDependencies: + - magicast + + '@nuxt/devtools-wizard@3.2.4': + dependencies: + '@clack/prompts': 1.2.0 + consola: 3.4.2 + diff: 8.0.3 + execa: 8.0.1 + magicast: 0.5.2 + pathe: 2.0.3 + pkg-types: 2.3.0 + semver: 7.7.4 + + '@nuxt/devtools@3.2.4(vite@7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3))(vue@3.5.32(typescript@5.9.3))': + dependencies: + '@nuxt/devtools-kit': 3.2.4(magicast@0.5.2)(vite@7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3)) + '@nuxt/devtools-wizard': 3.2.4 + '@nuxt/kit': 4.4.2(magicast@0.5.2) + '@vue/devtools-core': 8.1.1(vue@3.5.32(typescript@5.9.3)) + '@vue/devtools-kit': 8.1.1 + birpc: 4.0.0 + consola: 3.4.2 + destr: 2.0.5 + error-stack-parser-es: 1.0.5 + execa: 8.0.1 + fast-npm-meta: 1.4.2 + get-port-please: 3.2.0 + hookable: 6.1.0 + image-meta: 0.2.2 + is-installed-globally: 1.0.0 + launch-editor: 2.13.2 + local-pkg: 1.1.2 + magicast: 0.5.2 + nypm: 0.6.5 + ohash: 2.0.11 + pathe: 2.0.3 + perfect-debounce: 2.1.0 + pkg-types: 2.3.0 + semver: 7.7.4 + simple-git: 3.35.2 + sirv: 3.0.2 + structured-clone-es: 2.0.0 + tinyglobby: 0.2.15 + vite: 7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3) + vite-plugin-inspect: 11.3.3(@nuxt/kit@4.4.2(magicast@0.5.2))(vite@7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3)) + vite-plugin-vue-tracer: 1.3.0(vite@7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3))(vue@3.5.32(typescript@5.9.3)) + which: 6.0.1 + ws: 8.20.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + - vue + + '@nuxt/kit@4.4.2(magicast@0.5.2)': + dependencies: + c12: 3.3.3(magicast@0.5.2) + consola: 3.4.2 + defu: 6.1.4 + destr: 2.0.5 + errx: 0.1.0 + exsolve: 1.0.8 + ignore: 7.0.5 + jiti: 2.6.1 + klona: 2.0.6 + mlly: 1.8.1 + ohash: 2.0.11 + pathe: 2.0.3 + pkg-types: 2.3.0 + rc9: 3.0.1 + scule: 1.3.0 + semver: 7.7.4 + tinyglobby: 0.2.15 + ufo: 1.6.3 + unctx: 2.5.0 + untyped: 2.0.0 + transitivePeerDependencies: + - magicast + + '@nuxt/nitro-server@4.4.2(@babel/core@7.29.0)(db0@0.3.4(mysql2@3.18.2(@types/node@24.3.0)))(ioredis@5.10.0)(magicast@0.5.2)(mysql2@3.18.2(@types/node@24.3.0))(nuxt@4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5)(@parcel/watcher@2.5.6)(@types/node@24.3.0)(@vue/compiler-sfc@3.5.32)(cac@6.7.14)(db0@0.3.4(mysql2@3.18.2(@types/node@24.3.0)))(ioredis@5.10.0)(lightningcss@1.30.1)(magicast@0.5.2)(mysql2@3.18.2(@types/node@24.3.0))(optionator@0.9.4)(rolldown@1.0.0-rc.12(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5))(rollup-plugin-visualizer@6.0.11(rolldown@1.0.0-rc.12(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5))(rollup@4.59.0))(rollup@4.59.0)(terser@5.46.0)(tsx@4.20.3)(typescript@5.9.3)(vite@7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3))(yaml@2.8.3))(rolldown@1.0.0-rc.12(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5))(typescript@5.9.3)': + dependencies: + '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) + '@nuxt/devalue': 2.0.2 + '@nuxt/kit': 4.4.2(magicast@0.5.2) + '@unhead/vue': 2.1.13(vue@3.5.32(typescript@5.9.3)) + '@vue/shared': 3.5.32 + consola: 3.4.2 + defu: 6.1.4 + destr: 2.0.5 + devalue: 5.6.3 + errx: 0.1.0 + escape-string-regexp: 5.0.0 + exsolve: 1.0.8 + h3: 1.15.11 + impound: 1.1.5 + klona: 2.0.6 + mocked-exports: 0.1.1 + nitropack: 2.13.1(mysql2@3.18.2(@types/node@24.3.0))(rolldown@1.0.0-rc.12(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5)) + nuxt: 4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5)(@parcel/watcher@2.5.6)(@types/node@24.3.0)(@vue/compiler-sfc@3.5.32)(cac@6.7.14)(db0@0.3.4(mysql2@3.18.2(@types/node@24.3.0)))(ioredis@5.10.0)(lightningcss@1.30.1)(magicast@0.5.2)(mysql2@3.18.2(@types/node@24.3.0))(optionator@0.9.4)(rolldown@1.0.0-rc.12(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5))(rollup-plugin-visualizer@6.0.11(rolldown@1.0.0-rc.12(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5))(rollup@4.59.0))(rollup@4.59.0)(terser@5.46.0)(tsx@4.20.3)(typescript@5.9.3)(vite@7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3))(yaml@2.8.3) + nypm: 0.6.5 + ohash: 2.0.11 + pathe: 2.0.3 + pkg-types: 2.3.0 + rou3: 0.8.1 + std-env: 4.0.0 + ufo: 1.6.3 + unctx: 2.5.0 + unstorage: 1.17.4(db0@0.3.4(mysql2@3.18.2(@types/node@24.3.0)))(ioredis@5.10.0) + vue: 3.5.32(typescript@5.9.3) + vue-bundle-renderer: 2.2.0 + vue-devtools-stub: 0.1.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@babel/core' + - '@capacitor/preferences' + - '@deno/kv' + - '@electric-sql/pglite' + - '@libsql/client' + - '@netlify/blobs' + - '@planetscale/database' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bare-abort-controller + - bare-buffer + - better-sqlite3 + - db0 + - drizzle-orm + - encoding + - idb-keyval + - ioredis + - magicast + - mysql2 + - react-native-b4a + - rolldown + - sqlite3 + - supports-color + - typescript + - uploadthing + - xml2js + + '@nuxt/schema@4.4.2': + dependencies: + '@vue/shared': 3.5.32 + defu: 6.1.4 + pathe: 2.0.3 + pkg-types: 2.3.0 + std-env: 4.0.0 + + '@nuxt/telemetry@2.8.0(@nuxt/kit@4.4.2(magicast@0.5.2))': + dependencies: + '@nuxt/kit': 4.4.2(magicast@0.5.2) + citty: 0.2.1 + consola: 3.4.2 + ofetch: 2.0.0-alpha.3 + rc9: 3.0.1 + std-env: 4.0.0 + + '@nuxt/vite-builder@4.4.2(6665f5c81513a7b45d22969d069e1cae)': + dependencies: + '@nuxt/kit': 4.4.2(magicast@0.5.2) + '@rollup/plugin-replace': 6.0.3(rollup@4.59.0) + '@vitejs/plugin-vue': 6.0.5(vite@7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3))(vue@3.5.32(typescript@5.9.3)) + '@vitejs/plugin-vue-jsx': 5.1.5(vite@7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3))(vue@3.5.32(typescript@5.9.3)) + autoprefixer: 10.4.27(postcss@8.5.9) + consola: 3.4.2 + cssnano: 7.1.4(postcss@8.5.9) + defu: 6.1.4 + escape-string-regexp: 5.0.0 + exsolve: 1.0.8 + get-port-please: 3.2.0 + jiti: 2.6.1 + knitwork: 1.3.0 + magic-string: 0.30.21 + mlly: 1.8.1 + mocked-exports: 0.1.1 + nuxt: 4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5)(@parcel/watcher@2.5.6)(@types/node@24.3.0)(@vue/compiler-sfc@3.5.32)(cac@6.7.14)(db0@0.3.4(mysql2@3.18.2(@types/node@24.3.0)))(ioredis@5.10.0)(lightningcss@1.30.1)(magicast@0.5.2)(mysql2@3.18.2(@types/node@24.3.0))(optionator@0.9.4)(rolldown@1.0.0-rc.12(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5))(rollup-plugin-visualizer@6.0.11(rolldown@1.0.0-rc.12(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5))(rollup@4.59.0))(rollup@4.59.0)(terser@5.46.0)(tsx@4.20.3)(typescript@5.9.3)(vite@7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3))(yaml@2.8.3) + nypm: 0.6.5 + pathe: 2.0.3 + pkg-types: 2.3.0 + postcss: 8.5.9 + seroval: 1.5.2 + std-env: 4.0.0 + ufo: 1.6.3 + unenv: 2.0.0-rc.24 + vite: 7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3) + vite-node: 5.3.0(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3) + vite-plugin-checker: 0.12.0(optionator@0.9.4)(typescript@5.9.3)(vite@7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3)) + vue: 3.5.32(typescript@5.9.3) + vue-bundle-renderer: 2.2.0 + optionalDependencies: + '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) + rolldown: 1.0.0-rc.12(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5) + rollup-plugin-visualizer: 6.0.11(rolldown@1.0.0-rc.12(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5))(rollup@4.59.0) + transitivePeerDependencies: + - '@biomejs/biome' + - '@types/node' + - eslint + - less + - lightningcss + - magicast + - meow + - optionator + - oxlint + - rollup + - sass + - sass-embedded + - stylelint + - stylus + - sugarss + - supports-color + - terser + - tsx + - typescript + - vls + - vti + - vue-tsc + - yaml + '@opentelemetry/api-logs@0.211.0': dependencies: '@opentelemetry/api': 1.9.0 @@ -14213,54 +15844,251 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.28.0 + '@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.28.0 + + '@opentelemetry/sdk-trace-base@2.5.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.5.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.5.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.34.0 + + '@opentelemetry/sdk-trace-node@2.5.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/context-async-hooks': 2.5.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.5.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.5.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/semantic-conventions@1.27.0': {} + + '@opentelemetry/semantic-conventions@1.28.0': {} + + '@opentelemetry/semantic-conventions@1.34.0': {} + + '@opentelemetry/semantic-conventions@1.39.0': {} + + '@opentelemetry/sql-common@0.40.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + + '@optique/config@0.10.7(@standard-schema/spec@1.0.0)': + dependencies: + '@optique/core': 0.10.7 + '@standard-schema/spec': 1.0.0 + + '@optique/core@0.10.7': {} + + '@optique/run@0.10.7': + dependencies: + '@optique/core': 0.10.7 + + '@oslojs/encoding@1.1.0': {} + + '@oxc-minify/binding-android-arm-eabi@0.117.0': + optional: true + + '@oxc-minify/binding-android-arm64@0.117.0': + optional: true + + '@oxc-minify/binding-darwin-arm64@0.117.0': + optional: true + + '@oxc-minify/binding-darwin-x64@0.117.0': + optional: true + + '@oxc-minify/binding-freebsd-x64@0.117.0': + optional: true + + '@oxc-minify/binding-linux-arm-gnueabihf@0.117.0': + optional: true + + '@oxc-minify/binding-linux-arm-musleabihf@0.117.0': + optional: true + + '@oxc-minify/binding-linux-arm64-gnu@0.117.0': + optional: true + + '@oxc-minify/binding-linux-arm64-musl@0.117.0': + optional: true + + '@oxc-minify/binding-linux-ppc64-gnu@0.117.0': + optional: true + + '@oxc-minify/binding-linux-riscv64-gnu@0.117.0': + optional: true + + '@oxc-minify/binding-linux-riscv64-musl@0.117.0': + optional: true + + '@oxc-minify/binding-linux-s390x-gnu@0.117.0': + optional: true + + '@oxc-minify/binding-linux-x64-gnu@0.117.0': + optional: true + + '@oxc-minify/binding-linux-x64-musl@0.117.0': + optional: true + + '@oxc-minify/binding-openharmony-arm64@0.117.0': + optional: true + + '@oxc-minify/binding-wasm32-wasi@0.117.0(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5)': + dependencies: + '@napi-rs/wasm-runtime': 1.1.2(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5) + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' + optional: true + + '@oxc-minify/binding-win32-arm64-msvc@0.117.0': + optional: true + + '@oxc-minify/binding-win32-ia32-msvc@0.117.0': + optional: true + + '@oxc-minify/binding-win32-x64-msvc@0.117.0': + optional: true + + '@oxc-parser/binding-android-arm-eabi@0.117.0': + optional: true + + '@oxc-parser/binding-android-arm64@0.117.0': + optional: true + + '@oxc-parser/binding-darwin-arm64@0.117.0': + optional: true + + '@oxc-parser/binding-darwin-x64@0.117.0': + optional: true + + '@oxc-parser/binding-freebsd-x64@0.117.0': + optional: true + + '@oxc-parser/binding-linux-arm-gnueabihf@0.117.0': + optional: true + + '@oxc-parser/binding-linux-arm-musleabihf@0.117.0': + optional: true + + '@oxc-parser/binding-linux-arm64-gnu@0.117.0': + optional: true + + '@oxc-parser/binding-linux-arm64-musl@0.117.0': + optional: true + + '@oxc-parser/binding-linux-ppc64-gnu@0.117.0': + optional: true + + '@oxc-parser/binding-linux-riscv64-gnu@0.117.0': + optional: true + + '@oxc-parser/binding-linux-riscv64-musl@0.117.0': + optional: true + + '@oxc-parser/binding-linux-s390x-gnu@0.117.0': + optional: true + + '@oxc-parser/binding-linux-x64-gnu@0.117.0': + optional: true + + '@oxc-parser/binding-linux-x64-musl@0.117.0': + optional: true + + '@oxc-parser/binding-openharmony-arm64@0.117.0': + optional: true + + '@oxc-parser/binding-wasm32-wasi@0.117.0(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5)': + dependencies: + '@napi-rs/wasm-runtime': 1.1.2(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5) + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' + optional: true + + '@oxc-parser/binding-win32-arm64-msvc@0.117.0': + optional: true + + '@oxc-parser/binding-win32-ia32-msvc@0.117.0': + optional: true + + '@oxc-parser/binding-win32-x64-msvc@0.117.0': + optional: true + + '@oxc-project/types@0.117.0': {} + + '@oxc-project/types@0.122.0': {} + + '@oxc-transform/binding-android-arm-eabi@0.117.0': + optional: true + + '@oxc-transform/binding-android-arm64@0.117.0': + optional: true - '@opentelemetry/sdk-trace-base@2.5.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.5.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.5.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.34.0 + '@oxc-transform/binding-darwin-arm64@0.117.0': + optional: true - '@opentelemetry/sdk-trace-node@2.5.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/context-async-hooks': 2.5.0(@opentelemetry/api@1.9.0) - '@opentelemetry/core': 2.5.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.5.0(@opentelemetry/api@1.9.0) + '@oxc-transform/binding-darwin-x64@0.117.0': + optional: true - '@opentelemetry/semantic-conventions@1.27.0': {} + '@oxc-transform/binding-freebsd-x64@0.117.0': + optional: true - '@opentelemetry/semantic-conventions@1.28.0': {} + '@oxc-transform/binding-linux-arm-gnueabihf@0.117.0': + optional: true - '@opentelemetry/semantic-conventions@1.34.0': {} + '@oxc-transform/binding-linux-arm-musleabihf@0.117.0': + optional: true - '@opentelemetry/semantic-conventions@1.39.0': {} + '@oxc-transform/binding-linux-arm64-gnu@0.117.0': + optional: true - '@opentelemetry/sql-common@0.40.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@oxc-transform/binding-linux-arm64-musl@0.117.0': + optional: true - '@optique/config@0.10.7(@standard-schema/spec@1.0.0)': - dependencies: - '@optique/core': 0.10.7 - '@standard-schema/spec': 1.0.0 + '@oxc-transform/binding-linux-ppc64-gnu@0.117.0': + optional: true - '@optique/core@0.10.7': {} + '@oxc-transform/binding-linux-riscv64-gnu@0.117.0': + optional: true - '@optique/run@0.10.7': + '@oxc-transform/binding-linux-riscv64-musl@0.117.0': + optional: true + + '@oxc-transform/binding-linux-s390x-gnu@0.117.0': + optional: true + + '@oxc-transform/binding-linux-x64-gnu@0.117.0': + optional: true + + '@oxc-transform/binding-linux-x64-musl@0.117.0': + optional: true + + '@oxc-transform/binding-openharmony-arm64@0.117.0': + optional: true + + '@oxc-transform/binding-wasm32-wasi@0.117.0(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5)': dependencies: - '@optique/core': 0.10.7 + '@napi-rs/wasm-runtime': 1.1.2(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5) + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' + optional: true - '@oslojs/encoding@1.1.0': {} + '@oxc-transform/binding-win32-arm64-msvc@0.117.0': + optional: true - '@oxc-project/types@0.122.0': {} + '@oxc-transform/binding-win32-ia32-msvc@0.117.0': + optional: true + + '@oxc-transform/binding-win32-x64-msvc@0.117.0': + optional: true '@parcel/watcher-android-arm64@2.5.6': optional: true @@ -14362,7 +16190,7 @@ snapshots: '@poppinss/dumper@0.6.5': dependencies: '@poppinss/colors': 4.1.6 - '@sindresorhus/is': 7.1.1 + '@sindresorhus/is': 7.2.0 supports-color: 10.2.2 '@poppinss/dumper@0.7.0': @@ -14504,6 +16332,8 @@ snapshots: '@rolldown/pluginutils@1.0.0-rc.12': {} + '@rolldown/pluginutils@1.0.0-rc.2': {} + '@rollup/plugin-alias@6.0.0(rollup@4.59.0)': optionalDependencies: rollup: 4.59.0 @@ -14901,11 +16731,15 @@ snapshots: '@shikijs/vscode-textmate@10.0.2': {} + '@simple-git/args-pathspec@1.0.2': {} + + '@simple-git/argv-parser@1.0.3': + dependencies: + '@simple-git/args-pathspec': 1.0.2 + '@sinclair/typebox@0.34.38': optional: true - '@sindresorhus/is@7.1.1': {} - '@sindresorhus/is@7.2.0': {} '@sindresorhus/merge-streams@4.0.0': {} @@ -14914,11 +16748,11 @@ snapshots: dependencies: solid-js: 1.9.11 - '@solidjs/start@1.3.2(solid-js@1.9.11)(vinxi@0.5.11(@types/node@24.3.0)(db0@0.3.4(mysql2@3.18.2(@types/node@24.3.0)))(ioredis@5.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(mysql2@3.18.2(@types/node@24.3.0))(rolldown@1.0.0-rc.12(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5))(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1))(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1))': + '@solidjs/start@1.3.2(solid-js@1.9.11)(vinxi@0.5.11(@types/node@24.3.0)(db0@0.3.4(mysql2@3.18.2(@types/node@24.3.0)))(ioredis@5.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(mysql2@3.18.2(@types/node@24.3.0))(rolldown@1.0.0-rc.12(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5))(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3))(vite@7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3))': dependencies: - '@tanstack/server-functions-plugin': 1.121.21(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1)) - '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.11(@types/node@24.3.0)(db0@0.3.4(mysql2@3.18.2(@types/node@24.3.0)))(ioredis@5.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(mysql2@3.18.2(@types/node@24.3.0))(rolldown@1.0.0-rc.12(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5))(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1)) - '@vinxi/server-components': 0.5.1(vinxi@0.5.11(@types/node@24.3.0)(db0@0.3.4(mysql2@3.18.2(@types/node@24.3.0)))(ioredis@5.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(mysql2@3.18.2(@types/node@24.3.0))(rolldown@1.0.0-rc.12(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5))(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1)) + '@tanstack/server-functions-plugin': 1.121.21(vite@7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3)) + '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.11(@types/node@24.3.0)(db0@0.3.4(mysql2@3.18.2(@types/node@24.3.0)))(ioredis@5.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(mysql2@3.18.2(@types/node@24.3.0))(rolldown@1.0.0-rc.12(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5))(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3)) + '@vinxi/server-components': 0.5.1(vinxi@0.5.11(@types/node@24.3.0)(db0@0.3.4(mysql2@3.18.2(@types/node@24.3.0)))(ioredis@5.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(mysql2@3.18.2(@types/node@24.3.0))(rolldown@1.0.0-rc.12(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5))(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3)) cookie-es: 2.0.0 defu: 6.1.4 error-stack-parser: 2.1.4 @@ -14930,16 +16764,14 @@ snapshots: source-map-js: 1.2.1 terracotta: 1.1.0(solid-js@1.9.11) tinyglobby: 0.2.15 - vinxi: 0.5.11(@types/node@24.3.0)(db0@0.3.4(mysql2@3.18.2(@types/node@24.3.0)))(ioredis@5.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(mysql2@3.18.2(@types/node@24.3.0))(rolldown@1.0.0-rc.12(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5))(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1) - vite-plugin-solid: 2.11.10(solid-js@1.9.11)(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1)) + vinxi: 0.5.11(@types/node@24.3.0)(db0@0.3.4(mysql2@3.18.2(@types/node@24.3.0)))(ioredis@5.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(mysql2@3.18.2(@types/node@24.3.0))(rolldown@1.0.0-rc.12(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5))(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3) + vite-plugin-solid: 2.11.10(solid-js@1.9.11)(vite@7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3)) transitivePeerDependencies: - '@testing-library/jest-dom' - solid-js - supports-color - vite - '@speed-highlight/core@1.2.12': {} - '@speed-highlight/core@1.2.14': {} '@standard-schema/spec@1.0.0': {} @@ -14948,15 +16780,36 @@ snapshots: dependencies: acorn: 8.15.0 - '@sveltejs/adapter-auto@6.1.0(@sveltejs/kit@2.36.2(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.1.3(svelte@5.38.3)(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1)))(svelte@5.38.3)(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1)))': + '@sveltejs/adapter-auto@6.1.0(@sveltejs/kit@2.36.2(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.1.3(svelte@5.38.3)(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3)))(svelte@5.38.3)(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3)))': dependencies: - '@sveltejs/kit': 2.36.2(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.1.3(svelte@5.38.3)(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1)))(svelte@5.38.3)(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1)) + '@sveltejs/kit': 2.36.2(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.1.3(svelte@5.38.3)(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3)))(svelte@5.38.3)(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3)) + + '@sveltejs/kit@2.36.2(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.1.3(svelte@5.38.3)(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3)))(svelte@5.38.3)(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3))': + dependencies: + '@standard-schema/spec': 1.0.0 + '@sveltejs/acorn-typescript': 1.0.5(acorn@8.15.0) + '@sveltejs/vite-plugin-svelte': 6.1.3(svelte@5.38.3)(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3)) + '@types/cookie': 0.6.0 + acorn: 8.15.0 + cookie: 0.6.0 + devalue: 5.1.1 + esm-env: 1.2.2 + kleur: 4.1.5 + magic-string: 0.30.17 + mrmime: 2.0.1 + sade: 1.8.1 + set-cookie-parser: 2.7.1 + sirv: 3.0.1 + svelte: 5.38.3 + vite: 7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3) + optionalDependencies: + '@opentelemetry/api': 1.9.0 - '@sveltejs/kit@2.36.2(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.1.3(svelte@5.38.3)(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1)))(svelte@5.38.3)(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1))': + '@sveltejs/kit@2.36.2(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.1.3(svelte@5.38.3)(vite@7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3)))(svelte@5.38.3)(vite@7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3))': dependencies: '@standard-schema/spec': 1.0.0 '@sveltejs/acorn-typescript': 1.0.5(acorn@8.15.0) - '@sveltejs/vite-plugin-svelte': 6.1.3(svelte@5.38.3)(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1)) + '@sveltejs/vite-plugin-svelte': 6.1.3(svelte@5.38.3)(vite@7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3)) '@types/cookie': 0.6.0 acorn: 8.15.0 cookie: 0.6.0 @@ -14969,29 +16822,51 @@ snapshots: set-cookie-parser: 2.7.1 sirv: 3.0.1 svelte: 5.38.3 - vite: 7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1) + vite: 7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3) optionalDependencies: '@opentelemetry/api': 1.9.0 - '@sveltejs/vite-plugin-svelte-inspector@5.0.1(@sveltejs/vite-plugin-svelte@6.1.3(svelte@5.38.3)(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1)))(svelte@5.38.3)(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1))': + '@sveltejs/vite-plugin-svelte-inspector@5.0.1(@sveltejs/vite-plugin-svelte@6.1.3(svelte@5.38.3)(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3)))(svelte@5.38.3)(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3))': + dependencies: + '@sveltejs/vite-plugin-svelte': 6.1.3(svelte@5.38.3)(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3)) + debug: 4.4.3 + svelte: 5.38.3 + vite: 7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3) + transitivePeerDependencies: + - supports-color + + '@sveltejs/vite-plugin-svelte-inspector@5.0.1(@sveltejs/vite-plugin-svelte@6.1.3(svelte@5.38.3)(vite@7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3)))(svelte@5.38.3)(vite@7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3))': dependencies: - '@sveltejs/vite-plugin-svelte': 6.1.3(svelte@5.38.3)(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1)) + '@sveltejs/vite-plugin-svelte': 6.1.3(svelte@5.38.3)(vite@7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3)) debug: 4.4.3 svelte: 5.38.3 - vite: 7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1) + vite: 7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@6.1.3(svelte@5.38.3)(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1))': + '@sveltejs/vite-plugin-svelte@6.1.3(svelte@5.38.3)(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 5.0.1(@sveltejs/vite-plugin-svelte@6.1.3(svelte@5.38.3)(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1)))(svelte@5.38.3)(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1)) + '@sveltejs/vite-plugin-svelte-inspector': 5.0.1(@sveltejs/vite-plugin-svelte@6.1.3(svelte@5.38.3)(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3)))(svelte@5.38.3)(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3)) debug: 4.4.1 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.17 svelte: 5.38.3 - vite: 7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1) - vitefu: 1.1.1(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1)) + vite: 7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3) + vitefu: 1.1.1(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3)) + transitivePeerDependencies: + - supports-color + + '@sveltejs/vite-plugin-svelte@6.1.3(svelte@5.38.3)(vite@7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3))': + dependencies: + '@sveltejs/vite-plugin-svelte-inspector': 5.0.1(@sveltejs/vite-plugin-svelte@6.1.3(svelte@5.38.3)(vite@7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3)))(svelte@5.38.3)(vite@7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3)) + debug: 4.4.1 + deepmerge: 4.3.1 + kleur: 4.1.5 + magic-string: 0.30.17 + svelte: 5.38.3 + vite: 7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3) + vitefu: 1.1.1(vite@7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3)) transitivePeerDependencies: - supports-color @@ -15010,7 +16885,7 @@ snapshots: dependencies: '@ampproject/remapping': 2.3.0 enhanced-resolve: 5.18.2 - jiti: 2.5.1 + jiti: 2.6.1 lightningcss: 1.30.1 magic-string: 0.30.21 source-map-js: 1.2.1 @@ -15142,14 +17017,14 @@ snapshots: postcss: 8.5.6 tailwindcss: 4.1.11 - '@tailwindcss/vite@4.1.12(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1))': + '@tailwindcss/vite@4.1.12(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3))': dependencies: '@tailwindcss/node': 4.1.12 '@tailwindcss/oxide': 4.1.12 tailwindcss: 4.1.12 - vite: 7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1) + vite: 7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3) - '@tanstack/directive-functions-plugin@1.121.21(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1))': + '@tanstack/directive-functions-plugin@1.121.21(vite@7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3))': dependencies: '@babel/code-frame': 7.26.2 '@babel/core': 7.29.0 @@ -15158,7 +17033,7 @@ snapshots: '@tanstack/router-utils': 1.161.4 babel-dead-code-elimination: 1.0.12 tiny-invariant: 1.3.3 - vite: 7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1) + vite: 7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3) transitivePeerDependencies: - supports-color @@ -15176,7 +17051,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/server-functions-plugin@1.121.21(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1))': + '@tanstack/server-functions-plugin@1.121.21(vite@7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3))': dependencies: '@babel/code-frame': 7.26.2 '@babel/core': 7.29.0 @@ -15185,7 +17060,7 @@ snapshots: '@babel/template': 7.28.6 '@babel/traverse': 7.29.0 '@babel/types': 7.29.0 - '@tanstack/directive-functions-plugin': 1.121.21(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1)) + '@tanstack/directive-functions-plugin': 1.121.21(vite@7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3)) babel-dead-code-elimination: 1.0.12 tiny-invariant: 1.3.3 transitivePeerDependencies: @@ -16033,6 +17908,12 @@ snapshots: '@ungap/structured-clone@1.3.0': {} + '@unhead/vue@2.1.13(vue@3.5.32(typescript@5.9.3))': + dependencies: + hookable: 6.1.0 + unhead: 2.1.13 + vue: 3.5.32(typescript@5.9.3) + '@unrs/resolver-binding-android-arm-eabi@1.11.1': optional: true @@ -16096,8 +17977,8 @@ snapshots: dependencies: '@mapbox/node-pre-gyp': 2.0.3 '@rollup/pluginutils': 5.3.0(rollup@4.59.0) - acorn: 8.15.0 - acorn-import-attributes: 1.9.5(acorn@8.15.0) + acorn: 8.16.0 + acorn-import-attributes: 1.9.5(acorn@8.16.0) async-sema: 3.1.1 bindings: 1.5.0 estree-walker: 2.0.2 @@ -16123,7 +18004,7 @@ snapshots: h3: 1.15.5 http-shutdown: 1.2.2 jiti: 1.21.7 - mlly: 1.7.4 + mlly: 1.8.1 node-forge: 1.3.3 pathe: 1.1.2 std-env: 3.10.0 @@ -16131,35 +18012,53 @@ snapshots: untun: 0.1.3 uqr: 0.1.2 - '@vinxi/plugin-directives@0.5.1(vinxi@0.5.11(@types/node@24.3.0)(db0@0.3.4(mysql2@3.18.2(@types/node@24.3.0)))(ioredis@5.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(mysql2@3.18.2(@types/node@24.3.0))(rolldown@1.0.0-rc.12(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5))(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1))': + '@vinxi/plugin-directives@0.5.1(vinxi@0.5.11(@types/node@24.3.0)(db0@0.3.4(mysql2@3.18.2(@types/node@24.3.0)))(ioredis@5.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(mysql2@3.18.2(@types/node@24.3.0))(rolldown@1.0.0-rc.12(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5))(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3))': dependencies: '@babel/parser': 7.29.0 - acorn: 8.15.0 - acorn-jsx: 5.3.2(acorn@8.15.0) + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) acorn-loose: 8.5.2 - acorn-typescript: 1.4.13(acorn@8.15.0) + acorn-typescript: 1.4.13(acorn@8.16.0) astring: 1.9.0 magicast: 0.2.11 recast: 0.23.11 tslib: 2.8.1 - vinxi: 0.5.11(@types/node@24.3.0)(db0@0.3.4(mysql2@3.18.2(@types/node@24.3.0)))(ioredis@5.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(mysql2@3.18.2(@types/node@24.3.0))(rolldown@1.0.0-rc.12(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5))(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1) + vinxi: 0.5.11(@types/node@24.3.0)(db0@0.3.4(mysql2@3.18.2(@types/node@24.3.0)))(ioredis@5.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(mysql2@3.18.2(@types/node@24.3.0))(rolldown@1.0.0-rc.12(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5))(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3) - '@vinxi/server-components@0.5.1(vinxi@0.5.11(@types/node@24.3.0)(db0@0.3.4(mysql2@3.18.2(@types/node@24.3.0)))(ioredis@5.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(mysql2@3.18.2(@types/node@24.3.0))(rolldown@1.0.0-rc.12(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5))(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1))': + '@vinxi/server-components@0.5.1(vinxi@0.5.11(@types/node@24.3.0)(db0@0.3.4(mysql2@3.18.2(@types/node@24.3.0)))(ioredis@5.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(mysql2@3.18.2(@types/node@24.3.0))(rolldown@1.0.0-rc.12(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5))(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3))': dependencies: - '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.11(@types/node@24.3.0)(db0@0.3.4(mysql2@3.18.2(@types/node@24.3.0)))(ioredis@5.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(mysql2@3.18.2(@types/node@24.3.0))(rolldown@1.0.0-rc.12(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5))(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1)) - acorn: 8.15.0 + '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.11(@types/node@24.3.0)(db0@0.3.4(mysql2@3.18.2(@types/node@24.3.0)))(ioredis@5.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(mysql2@3.18.2(@types/node@24.3.0))(rolldown@1.0.0-rc.12(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5))(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3)) + acorn: 8.16.0 acorn-loose: 8.5.2 - acorn-typescript: 1.4.13(acorn@8.15.0) + acorn-typescript: 1.4.13(acorn@8.16.0) astring: 1.9.0 magicast: 0.2.11 recast: 0.23.11 - vinxi: 0.5.11(@types/node@24.3.0)(db0@0.3.4(mysql2@3.18.2(@types/node@24.3.0)))(ioredis@5.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(mysql2@3.18.2(@types/node@24.3.0))(rolldown@1.0.0-rc.12(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5))(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1) + vinxi: 0.5.11(@types/node@24.3.0)(db0@0.3.4(mysql2@3.18.2(@types/node@24.3.0)))(ioredis@5.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(mysql2@3.18.2(@types/node@24.3.0))(rolldown@1.0.0-rc.12(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5))(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3) + + '@vitejs/plugin-vue-jsx@5.1.5(vite@7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3))(vue@3.5.32(typescript@5.9.3))': + dependencies: + '@babel/core': 7.29.0 + '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-typescript': 7.28.6(@babel/core@7.29.0) + '@rolldown/pluginutils': 1.0.0-rc.12 + '@vue/babel-plugin-jsx': 2.0.1(@babel/core@7.29.0) + vite: 7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3) + vue: 3.5.32(typescript@5.9.3) + transitivePeerDependencies: + - supports-color '@vitejs/plugin-vue@5.2.4(vite@5.4.19(@types/node@22.19.1)(lightningcss@1.30.1)(terser@5.46.0))(vue@3.5.17(typescript@5.9.3))': dependencies: vite: 5.4.19(@types/node@22.19.1)(lightningcss@1.30.1)(terser@5.46.0) vue: 3.5.17(typescript@5.9.3) + '@vitejs/plugin-vue@6.0.5(vite@7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3))(vue@3.5.32(typescript@5.9.3))': + dependencies: + '@rolldown/pluginutils': 1.0.0-rc.2 + vite: 7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3) + vue: 3.5.32(typescript@5.9.3) + '@vitest/expect@3.2.4': dependencies: '@types/chai': 5.2.3 @@ -16168,13 +18067,13 @@ snapshots: chai: 5.3.3 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1))': + '@vitest/mocker@3.2.4(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1) + vite: 7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3) '@vitest/pretty-format@3.2.4': dependencies: @@ -16208,6 +18107,45 @@ snapshots: '@volar/source-map@2.4.15': {} + '@vue-macros/common@3.1.2(vue@3.5.32(typescript@5.9.3))': + dependencies: + '@vue/compiler-sfc': 3.5.32 + ast-kit: 2.2.0 + local-pkg: 1.1.2 + magic-string-ast: 1.0.3 + unplugin-utils: 0.3.1 + optionalDependencies: + vue: 3.5.32(typescript@5.9.3) + + '@vue/babel-helper-vue-transform-on@2.0.1': {} + + '@vue/babel-plugin-jsx@2.0.1(@babel/core@7.29.0)': + dependencies: + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + '@vue/babel-helper-vue-transform-on': 2.0.1 + '@vue/babel-plugin-resolve-type': 2.0.1(@babel/core@7.29.0) + '@vue/shared': 3.5.32 + optionalDependencies: + '@babel/core': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@vue/babel-plugin-resolve-type@2.0.1(@babel/core@7.29.0)': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/core': 7.29.0 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/parser': 7.29.0 + '@vue/compiler-sfc': 3.5.32 + transitivePeerDependencies: + - supports-color + '@vue/compiler-core@3.5.17': dependencies: '@babel/parser': 7.29.0 @@ -16216,11 +18154,24 @@ snapshots: estree-walker: 2.0.2 source-map-js: 1.2.1 + '@vue/compiler-core@3.5.32': + dependencies: + '@babel/parser': 7.29.2 + '@vue/shared': 3.5.32 + entities: 7.0.1 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + '@vue/compiler-dom@3.5.17': dependencies: '@vue/compiler-core': 3.5.17 '@vue/shared': 3.5.17 + '@vue/compiler-dom@3.5.32': + dependencies: + '@vue/compiler-core': 3.5.32 + '@vue/shared': 3.5.32 + '@vue/compiler-sfc@3.5.17': dependencies: '@babel/parser': 7.29.0 @@ -16233,20 +18184,49 @@ snapshots: postcss: 8.5.6 source-map-js: 1.2.1 + '@vue/compiler-sfc@3.5.32': + dependencies: + '@babel/parser': 7.29.2 + '@vue/compiler-core': 3.5.32 + '@vue/compiler-dom': 3.5.32 + '@vue/compiler-ssr': 3.5.32 + '@vue/shared': 3.5.32 + estree-walker: 2.0.2 + magic-string: 0.30.21 + postcss: 8.5.9 + source-map-js: 1.2.1 + '@vue/compiler-ssr@3.5.17': dependencies: '@vue/compiler-dom': 3.5.17 '@vue/shared': 3.5.17 + '@vue/compiler-ssr@3.5.32': + dependencies: + '@vue/compiler-dom': 3.5.32 + '@vue/shared': 3.5.32 + '@vue/compiler-vue2@2.7.16': dependencies: de-indent: 1.0.2 he: 1.2.0 + '@vue/devtools-api@6.6.4': {} + '@vue/devtools-api@7.7.7': dependencies: '@vue/devtools-kit': 7.7.7 + '@vue/devtools-api@8.1.1': + dependencies: + '@vue/devtools-kit': 8.1.1 + + '@vue/devtools-core@8.1.1(vue@3.5.32(typescript@5.9.3))': + dependencies: + '@vue/devtools-kit': 8.1.1 + '@vue/devtools-shared': 8.1.1 + vue: 3.5.32(typescript@5.9.3) + '@vue/devtools-kit@7.7.7': dependencies: '@vue/devtools-shared': 7.7.7 @@ -16257,10 +18237,19 @@ snapshots: speakingurl: 14.0.1 superjson: 2.2.2 + '@vue/devtools-kit@8.1.1': + dependencies: + '@vue/devtools-shared': 8.1.1 + birpc: 2.9.0 + hookable: 5.5.3 + perfect-debounce: 2.1.0 + '@vue/devtools-shared@7.7.7': dependencies: rfdc: 1.4.1 + '@vue/devtools-shared@8.1.1': {} + '@vue/language-core@2.1.10(typescript@5.9.3)': dependencies: '@volar/language-core': 2.4.15 @@ -16278,11 +18267,20 @@ snapshots: dependencies: '@vue/shared': 3.5.17 + '@vue/reactivity@3.5.32': + dependencies: + '@vue/shared': 3.5.32 + '@vue/runtime-core@3.5.17': dependencies: '@vue/reactivity': 3.5.17 '@vue/shared': 3.5.17 + '@vue/runtime-core@3.5.32': + dependencies: + '@vue/reactivity': 3.5.32 + '@vue/shared': 3.5.32 + '@vue/runtime-dom@3.5.17': dependencies: '@vue/reactivity': 3.5.17 @@ -16290,14 +18288,29 @@ snapshots: '@vue/shared': 3.5.17 csstype: 3.1.3 + '@vue/runtime-dom@3.5.32': + dependencies: + '@vue/reactivity': 3.5.32 + '@vue/runtime-core': 3.5.32 + '@vue/shared': 3.5.32 + csstype: 3.2.3 + '@vue/server-renderer@3.5.17(vue@3.5.17(typescript@5.9.3))': dependencies: '@vue/compiler-ssr': 3.5.17 '@vue/shared': 3.5.17 vue: 3.5.17(typescript@5.9.3) + '@vue/server-renderer@3.5.32(vue@3.5.32(typescript@5.9.3))': + dependencies: + '@vue/compiler-ssr': 3.5.32 + '@vue/shared': 3.5.32 + vue: 3.5.32(typescript@5.9.3) + '@vue/shared@3.5.17': {} + '@vue/shared@3.5.32': {} + '@vueuse/core@12.8.2(typescript@5.9.3)': dependencies: '@types/web-bluetooth': 0.0.21 @@ -16307,13 +18320,14 @@ snapshots: transitivePeerDependencies: - typescript - '@vueuse/integrations@12.8.2(focus-trap@7.6.5)(typescript@5.9.3)': + '@vueuse/integrations@12.8.2(focus-trap@7.6.5)(fuse.js@7.3.0)(typescript@5.9.3)': dependencies: '@vueuse/core': 12.8.2(typescript@5.9.3) '@vueuse/shared': 12.8.2(typescript@5.9.3) vue: 3.5.17(typescript@5.9.3) optionalDependencies: focus-trap: 7.6.5 + fuse.js: 7.3.0 transitivePeerDependencies: - typescript @@ -16338,21 +18352,21 @@ snapshots: mime-types: 2.1.35 negotiator: 0.6.3 - acorn-import-attributes@1.9.5(acorn@8.15.0): + acorn-import-attributes@1.9.5(acorn@8.16.0): dependencies: - acorn: 8.15.0 + acorn: 8.16.0 - acorn-jsx@5.3.2(acorn@8.15.0): + acorn-jsx@5.3.2(acorn@8.16.0): dependencies: - acorn: 8.15.0 + acorn: 8.16.0 acorn-loose@8.5.2: dependencies: - acorn: 8.15.0 + acorn: 8.16.0 - acorn-typescript@1.4.13(acorn@8.15.0): + acorn-typescript@1.4.13(acorn@8.16.0): dependencies: - acorn: 8.15.0 + acorn: 8.16.0 acorn-walk@8.3.2: {} @@ -16421,16 +18435,12 @@ snapshots: ansi-regex@5.0.1: {} - ansi-regex@6.1.0: {} - ansi-regex@6.2.2: {} ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 - ansi-styles@6.2.1: {} - ansi-styles@6.2.3: {} ansis@4.2.0: {} @@ -16563,6 +18573,11 @@ snapshots: assertion-error@2.0.1: {} + ast-kit@2.2.0: + dependencies: + '@babel/parser': 7.29.0 + pathe: 2.0.3 + ast-kit@3.0.0-beta.1: dependencies: '@babel/parser': 8.0.0-rc.3 @@ -16575,9 +18590,14 @@ snapshots: dependencies: tslib: 2.8.1 + ast-walker-scope@0.8.3: + dependencies: + '@babel/parser': 7.29.0 + ast-kit: 2.2.0 + astring@1.9.0: {} - astro@5.17.3(@types/node@24.3.0)(db0@0.3.4(mysql2@3.18.2(@types/node@24.3.0)))(ioredis@5.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(rollup@4.59.0)(terser@5.46.0)(tsx@4.20.3)(typescript@5.9.3)(yaml@2.8.1): + astro@5.17.3(@types/node@24.3.0)(db0@0.3.4(mysql2@3.18.2(@types/node@24.3.0)))(ioredis@5.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(rollup@4.59.0)(terser@5.46.0)(tsx@4.20.3)(typescript@5.9.3)(yaml@2.8.3): dependencies: '@astrojs/compiler': 2.13.1 '@astrojs/internal-helpers': 0.7.5 @@ -16634,8 +18654,8 @@ snapshots: unist-util-visit: 5.0.0 unstorage: 1.17.4(db0@0.3.4(mysql2@3.18.2(@types/node@24.3.0)))(ioredis@5.10.0) vfile: 6.0.3 - vite: 6.4.1(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1) - vitefu: 1.1.1(vite@6.4.1(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1)) + vite: 6.4.1(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3) + vitefu: 1.1.1(vite@6.4.1(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3)) xxhash-wasm: 1.1.0 yargs-parser: 21.1.1 yocto-spinner: 0.2.3 @@ -16687,6 +18707,15 @@ snapshots: atomic-sleep@1.0.0: {} + autoprefixer@10.4.27(postcss@8.5.9): + dependencies: + browserslist: 4.28.1 + caniuse-lite: 1.0.30001776 + fraction.js: 5.3.4 + picocolors: 1.1.1 + postcss: 8.5.9 + postcss-value-parser: 4.2.0 + available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.1.0 @@ -16786,6 +18815,8 @@ snapshots: birpc@2.4.0: {} + birpc@2.9.0: {} + birpc@4.0.0: {} blake3-wasm@2.1.5: {} @@ -16878,6 +18909,10 @@ snapshots: dependencies: '@types/node': 24.3.0 + bundle-name@4.1.0: + dependencies: + run-applescript: 7.1.0 + busboy@1.6.0: dependencies: streamsearch: 1.1.0 @@ -16939,6 +18974,13 @@ snapshots: camelcase@8.0.0: {} + caniuse-api@3.0.0: + dependencies: + browserslist: 4.28.1 + caniuse-lite: 1.0.30001776 + lodash.memoize: 4.1.2 + lodash.uniq: 4.5.0 + caniuse-lite@1.0.30001727: {} caniuse-lite@1.0.30001776: {} @@ -17128,6 +19170,8 @@ snapshots: confbox@0.2.2: {} + confbox@0.2.4: {} + consola@3.4.2: {} content-disposition@0.5.4: @@ -17142,6 +19186,8 @@ snapshots: cookie-es@1.2.2: {} + cookie-es@1.2.3: {} + cookie-es@2.0.0: {} cookie-signature@1.0.6: {} @@ -17194,6 +19240,10 @@ snapshots: dependencies: uncrypto: 0.1.3 + css-declaration-sorter@7.4.0(postcss@8.5.9): + dependencies: + postcss: 8.5.9 + css-select@5.2.2: dependencies: boolbase: 1.0.0 @@ -17216,12 +19266,58 @@ snapshots: cssesc@3.0.0: {} + cssnano-preset-default@7.0.12(postcss@8.5.9): + dependencies: + browserslist: 4.28.1 + css-declaration-sorter: 7.4.0(postcss@8.5.9) + cssnano-utils: 5.0.1(postcss@8.5.9) + postcss: 8.5.9 + postcss-calc: 10.1.1(postcss@8.5.9) + postcss-colormin: 7.0.7(postcss@8.5.9) + postcss-convert-values: 7.0.9(postcss@8.5.9) + postcss-discard-comments: 7.0.6(postcss@8.5.9) + postcss-discard-duplicates: 7.0.2(postcss@8.5.9) + postcss-discard-empty: 7.0.1(postcss@8.5.9) + postcss-discard-overridden: 7.0.1(postcss@8.5.9) + postcss-merge-longhand: 7.0.5(postcss@8.5.9) + postcss-merge-rules: 7.0.8(postcss@8.5.9) + postcss-minify-font-values: 7.0.1(postcss@8.5.9) + postcss-minify-gradients: 7.0.2(postcss@8.5.9) + postcss-minify-params: 7.0.6(postcss@8.5.9) + postcss-minify-selectors: 7.0.6(postcss@8.5.9) + postcss-normalize-charset: 7.0.1(postcss@8.5.9) + postcss-normalize-display-values: 7.0.1(postcss@8.5.9) + postcss-normalize-positions: 7.0.1(postcss@8.5.9) + postcss-normalize-repeat-style: 7.0.1(postcss@8.5.9) + postcss-normalize-string: 7.0.1(postcss@8.5.9) + postcss-normalize-timing-functions: 7.0.1(postcss@8.5.9) + postcss-normalize-unicode: 7.0.6(postcss@8.5.9) + postcss-normalize-url: 7.0.1(postcss@8.5.9) + postcss-normalize-whitespace: 7.0.1(postcss@8.5.9) + postcss-ordered-values: 7.0.2(postcss@8.5.9) + postcss-reduce-initial: 7.0.6(postcss@8.5.9) + postcss-reduce-transforms: 7.0.1(postcss@8.5.9) + postcss-svgo: 7.1.1(postcss@8.5.9) + postcss-unique-selectors: 7.0.5(postcss@8.5.9) + + cssnano-utils@5.0.1(postcss@8.5.9): + dependencies: + postcss: 8.5.9 + + cssnano@7.1.4(postcss@8.5.9): + dependencies: + cssnano-preset-default: 7.0.12(postcss@8.5.9) + lilconfig: 3.1.3 + postcss: 8.5.9 + csso@5.0.5: dependencies: css-tree: 2.2.1 csstype@3.1.3: {} + csstype@3.2.3: {} + cytoscape-cose-bilkent@4.1.0(cytoscape@3.32.0): dependencies: cose-base: 1.0.3 @@ -17485,6 +19581,13 @@ snapshots: deepmerge@4.3.1: {} + default-browser-id@5.0.1: {} + + default-browser@5.5.0: + dependencies: + bundle-name: 4.1.0 + default-browser-id: 5.0.1 + define-data-property@1.1.4: dependencies: es-define-property: 1.0.1 @@ -17493,6 +19596,8 @@ snapshots: define-lazy-prop@2.0.0: {} + define-lazy-prop@3.0.0: {} + define-properties@1.2.1: dependencies: define-data-property: 1.1.4 @@ -17501,6 +19606,8 @@ snapshots: defu@6.1.4: {} + defu@6.1.7: {} + delaunator@5.0.1: dependencies: robust-predicates: 3.0.2 @@ -17645,6 +19752,8 @@ snapshots: entities@6.0.1: {} + entities@7.0.1: {} + environment@1.1.0: {} error-stack-parser-es@1.0.5: {} @@ -17653,6 +19762,8 @@ snapshots: dependencies: stackframe: 1.3.4 + errx@0.1.0: {} + es-abstract@1.24.0: dependencies: array-buffer-byte-length: 1.0.2 @@ -17735,6 +19846,8 @@ snapshots: es-module-lexer@1.7.0: {} + es-module-lexer@2.0.0: {} + es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 @@ -18314,14 +20427,14 @@ snapshots: espree@10.4.0: dependencies: - acorn: 8.15.0 - acorn-jsx: 5.3.2(acorn@8.15.0) + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) eslint-visitor-keys: 4.2.1 espree@9.6.1: dependencies: - acorn: 8.15.0 - acorn-jsx: 5.3.2(acorn@8.15.0) + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) eslint-visitor-keys: 3.4.3 esprima@4.0.1: {} @@ -18422,8 +20535,6 @@ snapshots: transitivePeerDependencies: - supports-color - exsolve@1.0.7: {} - exsolve@1.0.8: {} extend-shallow@2.0.1: @@ -18471,12 +20582,24 @@ snapshots: fast-levenshtein@2.0.6: {} + fast-npm-meta@1.4.2: {} + fast-querystring@1.1.2: dependencies: fast-decode-uri-component: 1.0.1 + fast-string-truncated-width@1.2.1: {} + + fast-string-width@1.1.0: + dependencies: + fast-string-truncated-width: 1.2.1 + fast-uri@3.1.0: {} + fast-wrap-ansi@0.1.6: + dependencies: + fast-string-width: 1.1.0 + fastest-levenshtein@1.0.16: {} fastify-plugin@5.1.0: {} @@ -18642,6 +20765,8 @@ snapshots: forwarded@0.2.0: {} + fraction.js@5.3.4: {} + fresh@0.5.2: {} fresh@2.0.0: {} @@ -18664,6 +20789,10 @@ snapshots: functions-have-names@1.2.3: {} + fuse.js@7.3.0: {} + + fzf@0.5.2: {} + generate-function@2.3.1: dependencies: is-property: 1.0.2 @@ -18736,6 +20865,8 @@ snapshots: nypm: 0.6.5 pathe: 2.0.3 + giget@3.2.0: {} + github-slugger@2.0.0: {} glob-parent@5.1.2: @@ -18753,7 +20884,7 @@ snapshots: foreground-child: 3.3.1 jackspeak: 3.4.3 minimatch: 9.0.5 - minipass: 7.1.2 + minipass: 7.1.3 package-json-from-dist: 1.0.1 path-scurry: 1.11.1 @@ -18772,6 +20903,10 @@ snapshots: once: 1.4.0 path-is-absolute: 1.0.1 + global-directory@4.0.1: + dependencies: + ini: 4.1.1 + globals@13.24.0: dependencies: type-fest: 0.20.2 @@ -18822,6 +20957,18 @@ snapshots: dependencies: duplexer: 0.1.2 + h3@1.15.11: + dependencies: + cookie-es: 1.2.3 + crossws: 0.3.5 + defu: 6.1.7 + 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 + h3@1.15.3: dependencies: cookie-es: 1.2.2 @@ -18829,9 +20976,9 @@ snapshots: defu: 6.1.4 destr: 2.0.5 iron-webcrypto: 1.2.1 - node-mock-http: 1.0.1 + node-mock-http: 1.0.4 radix3: 1.1.2 - ufo: 1.6.1 + ufo: 1.6.3 uncrypto: 0.1.3 h3@1.15.5: @@ -19056,6 +21203,8 @@ snapshots: ignore@7.0.5: {} + image-meta@0.2.2: {} + image-q@4.0.0: dependencies: '@types/node': 16.9.1 @@ -19067,15 +21216,15 @@ snapshots: import-in-the-middle@1.14.2: dependencies: - acorn: 8.15.0 - acorn-import-attributes: 1.9.5(acorn@8.15.0) + acorn: 8.16.0 + acorn-import-attributes: 1.9.5(acorn@8.16.0) cjs-module-lexer: 1.4.3 module-details-from-path: 1.0.4 import-in-the-middle@2.0.1: dependencies: - acorn: 8.15.0 - acorn-import-attributes: 1.9.5(acorn@8.15.0) + acorn: 8.16.0 + acorn-import-attributes: 1.9.5(acorn@8.16.0) cjs-module-lexer: 1.4.3 module-details-from-path: 1.0.4 @@ -19083,6 +21232,14 @@ snapshots: import-without-cache@0.2.5: {} + impound@1.1.5: + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + es-module-lexer: 2.0.0 + pathe: 2.0.3 + unplugin: 3.0.0 + unplugin-utils: 0.3.1 + imurmurhash@0.1.4: {} inflation@2.1.0: {} @@ -19094,6 +21251,8 @@ snapshots: inherits@2.0.4: {} + ini@4.1.1: {} + inquirer-toggle@1.0.1: dependencies: '@inquirer/core': 8.2.4 @@ -19237,6 +21396,11 @@ snapshots: dependencies: is-docker: 3.0.0 + is-installed-globally@1.0.0: + dependencies: + global-directory: 4.0.1 + is-path-inside: 4.0.0 + is-interactive@2.0.0: {} is-map@2.0.3: {} @@ -19339,6 +21503,8 @@ snapshots: isexe@3.1.1: {} + isexe@4.0.0: {} + isomorphic-fetch@3.0.0: dependencies: node-fetch: 2.7.0 @@ -19395,8 +21561,6 @@ snapshots: jiti@1.21.7: {} - jiti@2.5.1: {} - jiti@2.6.1: {} jpeg-js@0.4.4: {} @@ -19558,6 +21722,11 @@ snapshots: dependencies: language-subtag-registry: 0.3.23 + launch-editor@2.13.2: + dependencies: + picocolors: 1.1.1 + shell-quote: 1.8.3 + layout-base@1.0.2: {} layout-base@2.0.1: {} @@ -19655,12 +21824,6 @@ snapshots: load-esm@1.0.2: {} - local-pkg@1.1.1: - dependencies: - mlly: 1.7.4 - pkg-types: 2.2.0 - quansync: 0.2.11 - local-pkg@1.1.2: dependencies: mlly: 1.8.1 @@ -19681,8 +21844,12 @@ snapshots: lodash.isarguments@3.1.0: {} + lodash.memoize@4.1.2: {} + lodash.merge@4.6.2: {} + lodash.uniq@4.5.0: {} + lodash@4.17.23: {} log-symbols@6.0.0: @@ -19722,6 +21889,20 @@ snapshots: lru.min@1.1.4: {} + magic-regexp@0.10.0: + dependencies: + estree-walker: 3.0.3 + magic-string: 0.30.21 + mlly: 1.8.1 + regexp-tree: 0.1.27 + type-level-regexp: 0.1.17 + ufo: 1.6.3 + unplugin: 2.3.11 + + magic-string-ast@1.0.3: + dependencies: + magic-string: 0.30.21 + magic-string@0.30.17: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -20241,27 +22422,18 @@ snapshots: minimist@1.2.8: {} - minipass@7.1.2: {} - minipass@7.1.3: {} minisearch@7.1.2: {} minizlib@3.0.2: dependencies: - minipass: 7.1.2 + minipass: 7.1.3 mitt@3.0.1: {} mkdirp@3.0.1: {} - mlly@1.7.4: - dependencies: - acorn: 8.15.0 - pathe: 2.0.3 - pkg-types: 1.3.1 - ufo: 1.6.3 - mlly@1.8.1: dependencies: acorn: 8.16.0 @@ -20269,6 +22441,8 @@ snapshots: pkg-types: 1.3.1 ufo: 1.6.3 + mocked-exports@0.1.1: {} + module-details-from-path@1.0.4: {} mri@1.2.0: {} @@ -20311,6 +22485,8 @@ snapshots: nanoid@3.3.11: {} + nanotar@0.3.0: {} + napi-postinstall@0.3.2: {} natural-compare@1.4.0: {} @@ -20426,7 +22602,7 @@ snapshots: exsolve: 1.0.8 globby: 16.1.1 gzip-size: 7.0.0 - h3: 1.15.5 + h3: 1.15.11 hookable: 5.5.3 httpxy: 0.1.7 ioredis: 5.10.0 @@ -20514,8 +22690,6 @@ snapshots: node-gyp-build@4.8.4: {} - node-mock-http@1.0.1: {} - node-mock-http@1.0.4: {} node-releases@2.0.36: {} @@ -20533,10 +22707,147 @@ snapshots: dependencies: path-key: 4.0.0 + npm-run-path@6.0.0: + dependencies: + path-key: 4.0.0 + unicorn-magic: 0.3.0 + nth-check@2.1.1: dependencies: boolbase: 1.0.0 + nuxt@4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5)(@parcel/watcher@2.5.6)(@types/node@24.3.0)(@vue/compiler-sfc@3.5.32)(cac@6.7.14)(db0@0.3.4(mysql2@3.18.2(@types/node@24.3.0)))(ioredis@5.10.0)(lightningcss@1.30.1)(magicast@0.5.2)(mysql2@3.18.2(@types/node@24.3.0))(optionator@0.9.4)(rolldown@1.0.0-rc.12(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5))(rollup-plugin-visualizer@6.0.11(rolldown@1.0.0-rc.12(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5))(rollup@4.59.0))(rollup@4.59.0)(terser@5.46.0)(tsx@4.20.3)(typescript@5.9.3)(vite@7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3))(yaml@2.8.3): + dependencies: + '@dxup/nuxt': 0.4.0(magicast@0.5.2)(typescript@5.9.3) + '@nuxt/cli': 3.34.0(@nuxt/schema@4.4.2)(cac@6.7.14)(magicast@0.5.2) + '@nuxt/devtools': 3.2.4(vite@7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3))(vue@3.5.32(typescript@5.9.3)) + '@nuxt/kit': 4.4.2(magicast@0.5.2) + '@nuxt/nitro-server': 4.4.2(@babel/core@7.29.0)(db0@0.3.4(mysql2@3.18.2(@types/node@24.3.0)))(ioredis@5.10.0)(magicast@0.5.2)(mysql2@3.18.2(@types/node@24.3.0))(nuxt@4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5)(@parcel/watcher@2.5.6)(@types/node@24.3.0)(@vue/compiler-sfc@3.5.32)(cac@6.7.14)(db0@0.3.4(mysql2@3.18.2(@types/node@24.3.0)))(ioredis@5.10.0)(lightningcss@1.30.1)(magicast@0.5.2)(mysql2@3.18.2(@types/node@24.3.0))(optionator@0.9.4)(rolldown@1.0.0-rc.12(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5))(rollup-plugin-visualizer@6.0.11(rolldown@1.0.0-rc.12(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5))(rollup@4.59.0))(rollup@4.59.0)(terser@5.46.0)(tsx@4.20.3)(typescript@5.9.3)(vite@7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3))(yaml@2.8.3))(rolldown@1.0.0-rc.12(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5))(typescript@5.9.3) + '@nuxt/schema': 4.4.2 + '@nuxt/telemetry': 2.8.0(@nuxt/kit@4.4.2(magicast@0.5.2)) + '@nuxt/vite-builder': 4.4.2(6665f5c81513a7b45d22969d069e1cae) + '@unhead/vue': 2.1.13(vue@3.5.32(typescript@5.9.3)) + '@vue/shared': 3.5.32 + c12: 3.3.3(magicast@0.5.2) + chokidar: 5.0.0 + compatx: 0.2.0 + consola: 3.4.2 + cookie-es: 2.0.0 + defu: 6.1.4 + devalue: 5.6.3 + errx: 0.1.0 + escape-string-regexp: 5.0.0 + exsolve: 1.0.8 + hookable: 6.1.0 + ignore: 7.0.5 + impound: 1.1.5 + jiti: 2.6.1 + klona: 2.0.6 + knitwork: 1.3.0 + magic-string: 0.30.21 + mlly: 1.8.1 + nanotar: 0.3.0 + nypm: 0.6.5 + ofetch: 1.5.1 + ohash: 2.0.11 + on-change: 6.0.2 + oxc-minify: 0.117.0(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5) + oxc-parser: 0.117.0(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5) + oxc-transform: 0.117.0(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5) + oxc-walker: 0.7.0(oxc-parser@0.117.0(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5)) + pathe: 2.0.3 + perfect-debounce: 2.1.0 + picomatch: 4.0.4 + pkg-types: 2.3.0 + rou3: 0.8.1 + scule: 1.3.0 + semver: 7.7.4 + std-env: 4.0.0 + tinyglobby: 0.2.15 + ufo: 1.6.3 + ultrahtml: 1.6.0 + uncrypto: 0.1.3 + unctx: 2.5.0 + unimport: 6.0.2 + unplugin: 3.0.0 + unrouting: 0.1.7 + untyped: 2.0.0 + vue: 3.5.32(typescript@5.9.3) + vue-router: 5.0.4(@vue/compiler-sfc@3.5.32)(vue@3.5.32(typescript@5.9.3)) + optionalDependencies: + '@parcel/watcher': 2.5.6 + '@types/node': 24.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@babel/core' + - '@babel/plugin-proposal-decorators' + - '@babel/plugin-syntax-jsx' + - '@biomejs/biome' + - '@capacitor/preferences' + - '@deno/kv' + - '@electric-sql/pglite' + - '@emnapi/core' + - '@emnapi/runtime' + - '@libsql/client' + - '@netlify/blobs' + - '@pinia/colada' + - '@planetscale/database' + - '@rollup/plugin-babel' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - '@vitejs/devtools' + - '@vue/compiler-sfc' + - aws4fetch + - bare-abort-controller + - bare-buffer + - better-sqlite3 + - bufferutil + - cac + - commander + - db0 + - drizzle-orm + - encoding + - eslint + - idb-keyval + - ioredis + - less + - lightningcss + - magicast + - meow + - mysql2 + - optionator + - oxlint + - pinia + - react-native-b4a + - rolldown + - rollup + - rollup-plugin-visualizer + - sass + - sass-embedded + - sqlite3 + - stylelint + - stylus + - sugarss + - supports-color + - terser + - tsx + - typescript + - uploadthing + - utf-8-validate + - vite + - vls + - vti + - vue-tsc + - xml2js + - yaml + nypm@0.6.5: dependencies: citty: 0.2.1 @@ -20595,10 +22906,14 @@ snapshots: node-fetch-native: 1.6.7 ufo: 1.6.3 + ofetch@2.0.0-alpha.3: {} + ohash@2.0.11: {} omggif@1.0.10: {} + on-change@6.0.2: {} + on-exit-leak-free@2.1.2: {} on-finished@2.4.1: @@ -20639,6 +22954,13 @@ snapshots: only@0.0.2: {} + open@10.2.0: + dependencies: + default-browser: 5.5.0 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + wsl-utils: 0.1.0 + open@8.4.2: dependencies: define-lazy-prop: 2.0.0 @@ -20675,6 +22997,91 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 + oxc-minify@0.117.0(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5): + optionalDependencies: + '@oxc-minify/binding-android-arm-eabi': 0.117.0 + '@oxc-minify/binding-android-arm64': 0.117.0 + '@oxc-minify/binding-darwin-arm64': 0.117.0 + '@oxc-minify/binding-darwin-x64': 0.117.0 + '@oxc-minify/binding-freebsd-x64': 0.117.0 + '@oxc-minify/binding-linux-arm-gnueabihf': 0.117.0 + '@oxc-minify/binding-linux-arm-musleabihf': 0.117.0 + '@oxc-minify/binding-linux-arm64-gnu': 0.117.0 + '@oxc-minify/binding-linux-arm64-musl': 0.117.0 + '@oxc-minify/binding-linux-ppc64-gnu': 0.117.0 + '@oxc-minify/binding-linux-riscv64-gnu': 0.117.0 + '@oxc-minify/binding-linux-riscv64-musl': 0.117.0 + '@oxc-minify/binding-linux-s390x-gnu': 0.117.0 + '@oxc-minify/binding-linux-x64-gnu': 0.117.0 + '@oxc-minify/binding-linux-x64-musl': 0.117.0 + '@oxc-minify/binding-openharmony-arm64': 0.117.0 + '@oxc-minify/binding-wasm32-wasi': 0.117.0(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5) + '@oxc-minify/binding-win32-arm64-msvc': 0.117.0 + '@oxc-minify/binding-win32-ia32-msvc': 0.117.0 + '@oxc-minify/binding-win32-x64-msvc': 0.117.0 + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' + + oxc-parser@0.117.0(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5): + dependencies: + '@oxc-project/types': 0.117.0 + optionalDependencies: + '@oxc-parser/binding-android-arm-eabi': 0.117.0 + '@oxc-parser/binding-android-arm64': 0.117.0 + '@oxc-parser/binding-darwin-arm64': 0.117.0 + '@oxc-parser/binding-darwin-x64': 0.117.0 + '@oxc-parser/binding-freebsd-x64': 0.117.0 + '@oxc-parser/binding-linux-arm-gnueabihf': 0.117.0 + '@oxc-parser/binding-linux-arm-musleabihf': 0.117.0 + '@oxc-parser/binding-linux-arm64-gnu': 0.117.0 + '@oxc-parser/binding-linux-arm64-musl': 0.117.0 + '@oxc-parser/binding-linux-ppc64-gnu': 0.117.0 + '@oxc-parser/binding-linux-riscv64-gnu': 0.117.0 + '@oxc-parser/binding-linux-riscv64-musl': 0.117.0 + '@oxc-parser/binding-linux-s390x-gnu': 0.117.0 + '@oxc-parser/binding-linux-x64-gnu': 0.117.0 + '@oxc-parser/binding-linux-x64-musl': 0.117.0 + '@oxc-parser/binding-openharmony-arm64': 0.117.0 + '@oxc-parser/binding-wasm32-wasi': 0.117.0(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5) + '@oxc-parser/binding-win32-arm64-msvc': 0.117.0 + '@oxc-parser/binding-win32-ia32-msvc': 0.117.0 + '@oxc-parser/binding-win32-x64-msvc': 0.117.0 + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' + + oxc-transform@0.117.0(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5): + optionalDependencies: + '@oxc-transform/binding-android-arm-eabi': 0.117.0 + '@oxc-transform/binding-android-arm64': 0.117.0 + '@oxc-transform/binding-darwin-arm64': 0.117.0 + '@oxc-transform/binding-darwin-x64': 0.117.0 + '@oxc-transform/binding-freebsd-x64': 0.117.0 + '@oxc-transform/binding-linux-arm-gnueabihf': 0.117.0 + '@oxc-transform/binding-linux-arm-musleabihf': 0.117.0 + '@oxc-transform/binding-linux-arm64-gnu': 0.117.0 + '@oxc-transform/binding-linux-arm64-musl': 0.117.0 + '@oxc-transform/binding-linux-ppc64-gnu': 0.117.0 + '@oxc-transform/binding-linux-riscv64-gnu': 0.117.0 + '@oxc-transform/binding-linux-riscv64-musl': 0.117.0 + '@oxc-transform/binding-linux-s390x-gnu': 0.117.0 + '@oxc-transform/binding-linux-x64-gnu': 0.117.0 + '@oxc-transform/binding-linux-x64-musl': 0.117.0 + '@oxc-transform/binding-openharmony-arm64': 0.117.0 + '@oxc-transform/binding-wasm32-wasi': 0.117.0(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5) + '@oxc-transform/binding-win32-arm64-msvc': 0.117.0 + '@oxc-transform/binding-win32-ia32-msvc': 0.117.0 + '@oxc-transform/binding-win32-x64-msvc': 0.117.0 + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' + + oxc-walker@0.7.0(oxc-parser@0.117.0(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5)): + dependencies: + magic-regexp: 0.10.0 + oxc-parser: 0.117.0(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5) + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 @@ -20758,7 +23165,7 @@ snapshots: path-scurry@1.11.1: dependencies: lru-cache: 10.4.3 - minipass: 7.1.2 + minipass: 7.1.3 path-scurry@2.0.2: dependencies: @@ -20862,13 +23269,7 @@ snapshots: pkg-types@1.3.1: dependencies: confbox: 0.1.8 - mlly: 1.7.4 - pathe: 2.0.3 - - pkg-types@2.2.0: - dependencies: - confbox: 0.2.2 - exsolve: 1.0.7 + mlly: 1.8.1 pathe: 2.0.3 pkg-types@2.3.0: @@ -20894,45 +23295,183 @@ snapshots: pngjs@7.0.0: {} - points-on-curve@0.2.0: {} + points-on-curve@0.2.0: {} + + points-on-path@0.2.1: + dependencies: + path-data-parser: 0.1.0 + points-on-curve: 0.2.0 + + possible-typed-array-names@1.1.0: {} + + postcss-calc@10.1.1(postcss@8.5.9): + dependencies: + postcss: 8.5.9 + postcss-selector-parser: 7.1.0 + postcss-value-parser: 4.2.0 + + postcss-colormin@7.0.7(postcss@8.5.9): + dependencies: + '@colordx/core': 5.0.3 + browserslist: 4.28.1 + caniuse-api: 3.0.0 + postcss: 8.5.9 + postcss-value-parser: 4.2.0 + + postcss-convert-values@7.0.9(postcss@8.5.9): + dependencies: + browserslist: 4.28.1 + postcss: 8.5.9 + postcss-value-parser: 4.2.0 + + postcss-discard-comments@7.0.6(postcss@8.5.9): + dependencies: + postcss: 8.5.9 + postcss-selector-parser: 7.1.1 + + postcss-discard-duplicates@7.0.2(postcss@8.5.9): + dependencies: + postcss: 8.5.9 + + postcss-discard-empty@7.0.1(postcss@8.5.9): + dependencies: + postcss: 8.5.9 + + postcss-discard-overridden@7.0.1(postcss@8.5.9): + dependencies: + postcss: 8.5.9 + + postcss-import@15.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.10 + + postcss-js@4.0.1(postcss@8.5.6): + dependencies: + camelcase-css: 2.0.1 + postcss: 8.5.6 + + postcss-load-config@3.1.4(postcss@8.5.6): + dependencies: + lilconfig: 2.1.0 + yaml: 1.10.2 + optionalDependencies: + postcss: 8.5.6 + + postcss-load-config@4.0.2(postcss@8.5.6): + dependencies: + lilconfig: 3.1.3 + yaml: 2.8.1 + optionalDependencies: + postcss: 8.5.6 + + postcss-merge-longhand@7.0.5(postcss@8.5.9): + dependencies: + postcss: 8.5.9 + postcss-value-parser: 4.2.0 + stylehacks: 7.0.8(postcss@8.5.9) + + postcss-merge-rules@7.0.8(postcss@8.5.9): + dependencies: + browserslist: 4.28.1 + caniuse-api: 3.0.0 + cssnano-utils: 5.0.1(postcss@8.5.9) + postcss: 8.5.9 + postcss-selector-parser: 7.1.1 + + postcss-minify-font-values@7.0.1(postcss@8.5.9): + dependencies: + postcss: 8.5.9 + postcss-value-parser: 4.2.0 + + postcss-minify-gradients@7.0.2(postcss@8.5.9): + dependencies: + '@colordx/core': 5.0.3 + cssnano-utils: 5.0.1(postcss@8.5.9) + postcss: 8.5.9 + postcss-value-parser: 4.2.0 + + postcss-minify-params@7.0.6(postcss@8.5.9): + dependencies: + browserslist: 4.28.1 + cssnano-utils: 5.0.1(postcss@8.5.9) + postcss: 8.5.9 + postcss-value-parser: 4.2.0 + + postcss-minify-selectors@7.0.6(postcss@8.5.9): + dependencies: + cssesc: 3.0.0 + postcss: 8.5.9 + postcss-selector-parser: 7.1.1 + + postcss-nested@6.2.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 6.1.2 + + postcss-normalize-charset@7.0.1(postcss@8.5.9): + dependencies: + postcss: 8.5.9 + + postcss-normalize-display-values@7.0.1(postcss@8.5.9): + dependencies: + postcss: 8.5.9 + postcss-value-parser: 4.2.0 + + postcss-normalize-positions@7.0.1(postcss@8.5.9): + dependencies: + postcss: 8.5.9 + postcss-value-parser: 4.2.0 + + postcss-normalize-repeat-style@7.0.1(postcss@8.5.9): + dependencies: + postcss: 8.5.9 + postcss-value-parser: 4.2.0 + + postcss-normalize-string@7.0.1(postcss@8.5.9): + dependencies: + postcss: 8.5.9 + postcss-value-parser: 4.2.0 - points-on-path@0.2.1: + postcss-normalize-timing-functions@7.0.1(postcss@8.5.9): dependencies: - path-data-parser: 0.1.0 - points-on-curve: 0.2.0 + postcss: 8.5.9 + postcss-value-parser: 4.2.0 - possible-typed-array-names@1.1.0: {} + postcss-normalize-unicode@7.0.6(postcss@8.5.9): + dependencies: + browserslist: 4.28.1 + postcss: 8.5.9 + postcss-value-parser: 4.2.0 - postcss-import@15.1.0(postcss@8.5.6): + postcss-normalize-url@7.0.1(postcss@8.5.9): dependencies: - postcss: 8.5.6 + postcss: 8.5.9 postcss-value-parser: 4.2.0 - read-cache: 1.0.0 - resolve: 1.22.10 - postcss-js@4.0.1(postcss@8.5.6): + postcss-normalize-whitespace@7.0.1(postcss@8.5.9): dependencies: - camelcase-css: 2.0.1 - postcss: 8.5.6 + postcss: 8.5.9 + postcss-value-parser: 4.2.0 - postcss-load-config@3.1.4(postcss@8.5.6): + postcss-ordered-values@7.0.2(postcss@8.5.9): dependencies: - lilconfig: 2.1.0 - yaml: 1.10.2 - optionalDependencies: - postcss: 8.5.6 + cssnano-utils: 5.0.1(postcss@8.5.9) + postcss: 8.5.9 + postcss-value-parser: 4.2.0 - postcss-load-config@4.0.2(postcss@8.5.6): + postcss-reduce-initial@7.0.6(postcss@8.5.9): dependencies: - lilconfig: 3.1.3 - yaml: 2.8.1 - optionalDependencies: - postcss: 8.5.6 + browserslist: 4.28.1 + caniuse-api: 3.0.0 + postcss: 8.5.9 - postcss-nested@6.2.0(postcss@8.5.6): + postcss-reduce-transforms@7.0.1(postcss@8.5.9): dependencies: - postcss: 8.5.6 - postcss-selector-parser: 6.1.2 + postcss: 8.5.9 + postcss-value-parser: 4.2.0 postcss-safe-parser@7.0.1(postcss@8.5.6): dependencies: @@ -20952,6 +23491,22 @@ snapshots: cssesc: 3.0.0 util-deprecate: 1.0.2 + postcss-selector-parser@7.1.1: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-svgo@7.1.1(postcss@8.5.9): + dependencies: + postcss: 8.5.9 + postcss-value-parser: 4.2.0 + svgo: 4.0.1 + + postcss-unique-selectors@7.0.5(postcss@8.5.9): + dependencies: + postcss: 8.5.9 + postcss-selector-parser: 7.1.1 + postcss-value-parser@4.2.0: {} postcss@8.4.31: @@ -20966,6 +23521,12 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + postcss@8.5.9: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + postgres-array@2.0.0: {} postgres-bytea@1.0.0: {} @@ -21112,6 +23673,11 @@ snapshots: defu: 6.1.4 destr: 2.0.5 + rc9@3.0.1: + dependencies: + defu: 6.1.7 + destr: 2.0.5 + rdf-canonize@5.0.0: dependencies: setimmediate: 1.0.5 @@ -21220,6 +23786,8 @@ snapshots: dependencies: regex-utilities: 2.3.0 + regexp-tree@0.1.27: {} + regexp.prototype.flags@1.5.4: dependencies: call-bind: 1.0.8 @@ -21505,6 +24073,8 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.59.0 fsevents: 2.3.3 + rou3@0.8.1: {} + roughjs@4.6.6: dependencies: hachure-fill: 0.5.2 @@ -21512,6 +24082,8 @@ snapshots: points-on-curve: 0.2.0 points-on-path: 0.2.1 + run-applescript@7.1.0: {} + run-async@4.0.6: {} run-parallel@1.2.0: @@ -21561,6 +24133,8 @@ snapshots: sax@1.4.3: {} + sax@1.6.0: {} + scheduler@0.25.0-rc-7771d3a7-20240827: {} scheduler@0.26.0: {} @@ -21626,6 +24200,8 @@ snapshots: seroval@1.5.0: {} + seroval@1.5.2: {} + serve-placeholder@2.0.2: dependencies: defu: 6.1.4 @@ -21740,6 +24316,8 @@ snapshots: shebang-regex@3.0.0: {} + shell-quote@1.8.3: {} + shiki@1.29.2: dependencies: '@shikijs/core': 1.29.2 @@ -21807,6 +24385,16 @@ snapshots: signal-exit@4.1.0: {} + simple-git@3.35.2: + dependencies: + '@kwsites/file-exists': 1.1.1 + '@kwsites/promise-deferred': 1.1.1 + '@simple-git/args-pathspec': 1.0.2 + '@simple-git/argv-parser': 1.0.3 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + simple-swizzle@0.2.2: dependencies: is-arrayish: 0.3.2 @@ -21819,6 +24407,12 @@ snapshots: mrmime: 2.0.1 totalist: 3.0.1 + sirv@3.0.2: + dependencies: + '@polka/url': 1.0.0-next.29 + mrmime: 2.0.1 + totalist: 3.0.1 + sisteransi@1.0.5: {} slash@3.0.0: {} @@ -21886,6 +24480,8 @@ snapshots: sql-escaper@1.3.3: {} + srvx@0.11.15: {} + srvx@0.8.16: {} stable-hash@0.0.5: {} @@ -21909,6 +24505,8 @@ snapshots: std-env@3.10.0: {} + std-env@4.0.0: {} + stdin-discarder@0.2.2: {} stop-iteration-iterator@1.1.0: @@ -21939,13 +24537,13 @@ snapshots: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 - strip-ansi: 7.1.0 + strip-ansi: 7.2.0 string-width@7.2.0: dependencies: emoji-regex: 10.6.0 get-east-asian-width: 1.4.0 - strip-ansi: 7.1.0 + strip-ansi: 7.2.0 string-width@8.2.0: dependencies: @@ -22021,7 +24619,7 @@ snapshots: strip-ansi@7.1.0: dependencies: - ansi-regex: 6.1.0 + ansi-regex: 6.2.2 strip-ansi@7.2.0: dependencies: @@ -22057,6 +24655,8 @@ snapshots: '@tokenizer/token': 0.3.0 peek-readable: 5.4.2 + structured-clone-es@2.0.0: {} + structured-field-values@2.0.4: {} styled-jsx@5.1.1(react@19.0.0-rc-7771d3a7-20240827): @@ -22069,6 +24669,12 @@ snapshots: client-only: 0.0.1 react: 19.1.0 + stylehacks@7.0.8(postcss@8.5.9): + dependencies: + browserslist: 4.28.1 + postcss: 8.5.9 + postcss-selector-parser: 7.1.1 + stylis@4.3.6: {} sucrase@3.35.0: @@ -22143,6 +24749,16 @@ snapshots: picocolors: 1.1.1 sax: 1.4.3 + svgo@4.0.1: + dependencies: + commander: 11.1.0 + css-select: 5.2.2 + css-tree: 3.1.0 + css-what: 6.2.2 + csso: 5.0.5 + picocolors: 1.1.1 + sax: 1.6.0 + system-architecture@0.1.0: {} tabbable@6.2.0: {} @@ -22197,7 +24813,7 @@ snapshots: dependencies: '@isaacs/fs-minipass': 4.0.1 chownr: 3.0.0 - minipass: 7.1.2 + minipass: 7.1.3 minizlib: 3.0.2 mkdirp: 3.0.1 yallist: 5.0.0 @@ -22221,7 +24837,7 @@ snapshots: terser@5.46.0: dependencies: '@jridgewell/source-map': 0.3.11 - acorn: 8.15.0 + acorn: 8.16.0 commander: 2.20.3 source-map-support: 0.5.21 @@ -22255,6 +24871,8 @@ snapshots: tinybench@2.9.0: {} + tinyclip@0.1.12: {} + tinycolor2@1.6.0: {} tinyexec@0.3.2: {} @@ -22442,6 +25060,8 @@ snapshots: media-typer: 1.1.0 mime-types: 3.0.2 + type-level-regexp@0.1.17: {} + typed-array-buffer@1.0.3: dependencies: call-bound: 1.0.4 @@ -22494,8 +25114,6 @@ snapshots: uc.micro@2.1.0: {} - ufo@1.6.1: {} - ufo@1.6.3: {} uid@2.0.2: @@ -22522,7 +25140,7 @@ snapshots: unctx@2.5.0: dependencies: - acorn: 8.15.0 + acorn: 8.16.0 estree-walker: 3.0.3 magic-string: 0.30.21 unplugin: 2.3.11 @@ -22552,7 +25170,7 @@ snapshots: unenv@2.0.0-rc.17: dependencies: defu: 6.1.4 - exsolve: 1.0.7 + exsolve: 1.0.8 ohash: 2.0.11 pathe: 2.0.3 ufo: 1.6.3 @@ -22560,7 +25178,7 @@ snapshots: unenv@2.0.0-rc.21: dependencies: defu: 6.1.4 - exsolve: 1.0.7 + exsolve: 1.0.8 ohash: 2.0.11 pathe: 2.0.3 ufo: 1.6.3 @@ -22569,6 +25187,12 @@ snapshots: dependencies: pathe: 2.0.3 + unhead@2.1.13: + dependencies: + hookable: 6.1.0 + + unicorn-magic@0.3.0: {} + unicorn-magic@0.4.0: {} unified@11.0.5: @@ -22604,6 +25228,23 @@ snapshots: unplugin: 2.3.11 unplugin-utils: 0.3.1 + unimport@6.0.2: + dependencies: + acorn: 8.16.0 + escape-string-regexp: 5.0.0 + estree-walker: 3.0.3 + local-pkg: 1.1.2 + magic-string: 0.30.21 + mlly: 1.8.1 + pathe: 2.0.3 + picomatch: 4.0.4 + pkg-types: 2.3.0 + scule: 1.3.0 + strip-literal: 3.1.0 + tinyglobby: 0.2.15 + unplugin: 3.0.0 + unplugin-utils: 0.3.1 + unist-util-find-after@5.0.0: dependencies: '@types/unist': 3.0.3 @@ -22662,10 +25303,21 @@ snapshots: unplugin@2.3.11: dependencies: '@jridgewell/remapping': 2.3.5 - acorn: 8.15.0 + acorn: 8.16.0 + picomatch: 4.0.4 + webpack-virtual-modules: 0.6.2 + + unplugin@3.0.0: + dependencies: + '@jridgewell/remapping': 2.3.5 picomatch: 4.0.4 webpack-virtual-modules: 0.6.2 + unrouting@0.1.7: + dependencies: + escape-string-regexp: 5.0.0 + ufo: 1.6.3 + unrs-resolver@1.11.1: dependencies: napi-postinstall: 0.3.2 @@ -22702,7 +25354,7 @@ snapshots: anymatch: 3.1.3 chokidar: 5.0.0 destr: 2.0.5 - h3: 1.15.5 + h3: 1.15.11 lru-cache: 11.2.6 node-fetch-native: 1.6.7 ofetch: 1.5.1 @@ -22788,7 +25440,7 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vinxi@0.5.11(@types/node@24.3.0)(db0@0.3.4(mysql2@3.18.2(@types/node@24.3.0)))(ioredis@5.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(mysql2@3.18.2(@types/node@24.3.0))(rolldown@1.0.0-rc.12(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5))(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1): + vinxi@0.5.11(@types/node@24.3.0)(db0@0.3.4(mysql2@3.18.2(@types/node@24.3.0)))(ioredis@5.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(mysql2@3.18.2(@types/node@24.3.0))(rolldown@1.0.0-rc.12(@emnapi/core@1.4.3)(@emnapi/runtime@1.4.5))(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3): dependencies: '@babel/core': 7.29.0 '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) @@ -22822,7 +25474,7 @@ snapshots: unctx: 2.5.0 unenv: 1.10.0 unstorage: 1.17.4(db0@0.3.4(mysql2@3.18.2(@types/node@24.3.0)))(ioredis@5.10.0) - vite: 6.4.1(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1) + vite: 6.4.1(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3) zod: 4.3.6 transitivePeerDependencies: - '@azure/app-configuration' @@ -22870,13 +25522,23 @@ snapshots: - xml2js - yaml - vite-node@3.2.4(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1): + vite-dev-rpc@1.1.0(vite@7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3)): + dependencies: + birpc: 2.4.0 + vite: 7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3) + vite-hot-client: 2.1.0(vite@7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3)) + + vite-hot-client@2.1.0(vite@7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3)): + dependencies: + vite: 7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3) + + vite-node@3.2.4(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3): dependencies: cac: 6.7.14 debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1) + vite: 7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3) transitivePeerDependencies: - '@types/node' - jiti @@ -22891,7 +25553,59 @@ snapshots: - tsx - yaml - vite-plugin-solid@2.11.10(solid-js@1.9.11)(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1)): + vite-node@5.3.0(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3): + dependencies: + cac: 6.7.14 + es-module-lexer: 2.0.0 + obug: 2.1.1 + pathe: 2.0.3 + vite: 7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3) + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - terser + - tsx + - yaml + + vite-plugin-checker@0.12.0(optionator@0.9.4)(typescript@5.9.3)(vite@7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3)): + dependencies: + '@babel/code-frame': 7.29.0 + chokidar: 4.0.3 + npm-run-path: 6.0.0 + picocolors: 1.1.1 + picomatch: 4.0.4 + tiny-invariant: 1.3.3 + tinyglobby: 0.2.15 + vite: 7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3) + vscode-uri: 3.1.0 + optionalDependencies: + optionator: 0.9.4 + typescript: 5.9.3 + + vite-plugin-inspect@11.3.3(@nuxt/kit@4.4.2(magicast@0.5.2))(vite@7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3)): + dependencies: + ansis: 4.2.0 + debug: 4.4.3 + error-stack-parser-es: 1.0.5 + ohash: 2.0.11 + open: 10.2.0 + perfect-debounce: 2.1.0 + sirv: 3.0.2 + unplugin-utils: 0.3.1 + vite: 7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3) + vite-dev-rpc: 1.1.0(vite@7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3)) + optionalDependencies: + '@nuxt/kit': 4.4.2(magicast@0.5.2) + transitivePeerDependencies: + - supports-color + + vite-plugin-solid@2.11.10(solid-js@1.9.11)(vite@7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3)): dependencies: '@babel/core': 7.29.0 '@types/babel__core': 7.20.5 @@ -22899,29 +25613,39 @@ snapshots: merge-anything: 5.1.7 solid-js: 1.9.11 solid-refresh: 0.6.3(solid-js@1.9.11) - vite: 7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1) - vitefu: 1.1.1(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1)) + vite: 7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3) + vitefu: 1.1.1(vite@7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3)) transitivePeerDependencies: - supports-color + vite-plugin-vue-tracer@1.3.0(vite@7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3))(vue@3.5.32(typescript@5.9.3)): + dependencies: + estree-walker: 3.0.3 + exsolve: 1.0.8 + magic-string: 0.30.21 + pathe: 2.0.3 + source-map-js: 1.2.1 + vite: 7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3) + vue: 3.5.32(typescript@5.9.3) + vite@5.4.19(@types/node@22.19.1)(lightningcss@1.30.1)(terser@5.46.0): dependencies: esbuild: 0.21.5 postcss: 8.5.6 - rollup: 4.44.1 + rollup: 4.59.0 optionalDependencies: '@types/node': 22.19.1 fsevents: 2.3.3 lightningcss: 1.30.1 terser: 5.46.0 - vite@6.4.1(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1): + vite@6.4.1(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3): dependencies: esbuild: 0.25.5 fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 postcss: 8.5.6 - rollup: 4.44.1 + rollup: 4.59.0 tinyglobby: 0.2.15 optionalDependencies: '@types/node': 24.3.0 @@ -22930,9 +25654,9 @@ snapshots: lightningcss: 1.30.1 terser: 5.46.0 tsx: 4.20.3 - yaml: 2.8.1 + yaml: 2.8.3 - vite@7.1.3(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1): + vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3): dependencies: esbuild: 0.25.5 fdir: 6.5.0(picomatch@4.0.3) @@ -22940,6 +25664,23 @@ snapshots: postcss: 8.5.6 rollup: 4.44.1 tinyglobby: 0.2.14 + optionalDependencies: + '@types/node': 24.3.0 + fsevents: 2.3.3 + jiti: 2.6.1 + lightningcss: 1.30.1 + terser: 5.46.0 + tsx: 4.20.3 + yaml: 2.8.3 + + vite@7.3.2(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3): + dependencies: + esbuild: 0.27.3 + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + postcss: 8.5.9 + rollup: 4.59.0 + tinyglobby: 0.2.15 optionalDependencies: '@types/node': 22.19.1 fsevents: 2.3.3 @@ -22947,16 +25688,16 @@ snapshots: lightningcss: 1.30.1 terser: 5.46.0 tsx: 4.20.3 - yaml: 2.8.1 + yaml: 2.8.3 - vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1): + vite@7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3): dependencies: - esbuild: 0.25.5 - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 - postcss: 8.5.6 - rollup: 4.44.1 - tinyglobby: 0.2.14 + esbuild: 0.27.3 + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + postcss: 8.5.9 + rollup: 4.59.0 + tinyglobby: 0.2.15 optionalDependencies: '@types/node': 24.3.0 fsevents: 2.3.3 @@ -22964,23 +25705,27 @@ snapshots: lightningcss: 1.30.1 terser: 5.46.0 tsx: 4.20.3 - yaml: 2.8.1 + yaml: 2.8.3 - vitefu@1.1.1(vite@6.4.1(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1)): + vitefu@1.1.1(vite@6.4.1(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3)): optionalDependencies: - vite: 6.4.1(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1) + vite: 6.4.1(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3) - vitefu@1.1.1(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1)): + vitefu@1.1.1(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3)): optionalDependencies: - vite: 7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1) + vite: 7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3) - vitepress-plugin-group-icons@1.6.1(markdown-it@14.1.0)(vite@7.1.3(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1)): + vitefu@1.1.1(vite@7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3)): + optionalDependencies: + vite: 7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3) + + vitepress-plugin-group-icons@1.6.1(markdown-it@14.1.0)(vite@7.3.2(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3)): dependencies: '@iconify-json/logos': 1.2.4 '@iconify-json/vscode-icons': 1.2.23 '@iconify/utils': 2.3.0 markdown-it: 14.1.0 - vite: 7.1.3(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1) + vite: 7.3.2(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3) transitivePeerDependencies: - supports-color @@ -23003,14 +25748,14 @@ snapshots: - '@75lb/nature' - supports-color - vitepress-plugin-mermaid@2.0.17(mermaid@11.7.0)(vitepress@1.6.3(@algolia/client-search@5.29.0)(@types/node@22.19.1)(@types/react@18.3.23)(lightningcss@1.30.1)(postcss@8.5.6)(search-insights@2.17.3)(terser@5.46.0)(typescript@5.9.3)): + vitepress-plugin-mermaid@2.0.17(mermaid@11.7.0)(vitepress@1.6.3(@algolia/client-search@5.29.0)(@types/node@22.19.1)(@types/react@18.3.23)(fuse.js@7.3.0)(lightningcss@1.30.1)(postcss@8.5.9)(search-insights@2.17.3)(terser@5.46.0)(typescript@5.9.3)): dependencies: mermaid: 11.7.0 - vitepress: 1.6.3(@algolia/client-search@5.29.0)(@types/node@22.19.1)(@types/react@18.3.23)(lightningcss@1.30.1)(postcss@8.5.6)(search-insights@2.17.3)(terser@5.46.0)(typescript@5.9.3) + vitepress: 1.6.3(@algolia/client-search@5.29.0)(@types/node@22.19.1)(@types/react@18.3.23)(fuse.js@7.3.0)(lightningcss@1.30.1)(postcss@8.5.9)(search-insights@2.17.3)(terser@5.46.0)(typescript@5.9.3) optionalDependencies: '@mermaid-js/mermaid-mindmap': 9.3.0 - vitepress@1.6.3(@algolia/client-search@5.29.0)(@types/node@22.19.1)(@types/react@18.3.23)(lightningcss@1.30.1)(postcss@8.5.6)(search-insights@2.17.3)(terser@5.46.0)(typescript@5.9.3): + vitepress@1.6.3(@algolia/client-search@5.29.0)(@types/node@22.19.1)(@types/react@18.3.23)(fuse.js@7.3.0)(lightningcss@1.30.1)(postcss@8.5.9)(search-insights@2.17.3)(terser@5.46.0)(typescript@5.9.3): dependencies: '@docsearch/css': 3.8.2 '@docsearch/js': 3.8.2(@algolia/client-search@5.29.0)(@types/react@18.3.23)(search-insights@2.17.3) @@ -23023,7 +25768,7 @@ snapshots: '@vue/devtools-api': 7.7.7 '@vue/shared': 3.5.17 '@vueuse/core': 12.8.2(typescript@5.9.3) - '@vueuse/integrations': 12.8.2(focus-trap@7.6.5)(typescript@5.9.3) + '@vueuse/integrations': 12.8.2(focus-trap@7.6.5)(fuse.js@7.3.0)(typescript@5.9.3) focus-trap: 7.6.5 mark.js: 8.11.1 minisearch: 7.1.2 @@ -23031,7 +25776,7 @@ snapshots: vite: 5.4.19(@types/node@22.19.1)(lightningcss@1.30.1)(terser@5.46.0) vue: 3.5.17(typescript@5.9.3) optionalDependencies: - postcss: 8.5.6 + postcss: 8.5.9 transitivePeerDependencies: - '@algolia/client-search' - '@types/node' @@ -23059,11 +25804,11 @@ snapshots: - typescript - universal-cookie - vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3): dependencies: '@types/chai': 5.2.3 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1)) + '@vitest/mocker': 3.2.4(vite@7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -23081,8 +25826,8 @@ snapshots: tinyglobby: 0.2.14 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1) - vite-node: 3.2.4(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.1) + vite: 7.1.3(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3) + vite-node: 3.2.4(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.0)(tsx@4.20.3)(yaml@2.8.3) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 @@ -23118,10 +25863,46 @@ snapshots: vscode-uri@3.0.8: {} + vscode-uri@3.1.0: {} + + vue-bundle-renderer@2.2.0: + dependencies: + ufo: 1.6.3 + + vue-devtools-stub@0.1.0: {} + vue-resize@2.0.0-alpha.1(vue@3.5.17(typescript@5.9.3)): dependencies: vue: 3.5.17(typescript@5.9.3) + vue-router@4.6.4(vue@3.5.17(typescript@5.9.3)): + dependencies: + '@vue/devtools-api': 6.6.4 + vue: 3.5.17(typescript@5.9.3) + + vue-router@5.0.4(@vue/compiler-sfc@3.5.32)(vue@3.5.32(typescript@5.9.3)): + dependencies: + '@babel/generator': 7.29.1 + '@vue-macros/common': 3.1.2(vue@3.5.32(typescript@5.9.3)) + '@vue/devtools-api': 8.1.1 + ast-walker-scope: 0.8.3 + chokidar: 5.0.0 + json5: 2.2.3 + local-pkg: 1.1.2 + magic-string: 0.30.21 + mlly: 1.8.1 + muggle-string: 0.4.1 + pathe: 2.0.3 + picomatch: 4.0.4 + scule: 1.3.0 + tinyglobby: 0.2.15 + unplugin: 3.0.0 + unplugin-utils: 0.3.1 + vue: 3.5.32(typescript@5.9.3) + yaml: 2.8.3 + optionalDependencies: + '@vue/compiler-sfc': 3.5.32 + vue@3.5.17(typescript@5.9.3): dependencies: '@vue/compiler-dom': 3.5.17 @@ -23132,6 +25913,16 @@ snapshots: optionalDependencies: typescript: 5.9.3 + vue@3.5.32(typescript@5.9.3): + dependencies: + '@vue/compiler-dom': 3.5.32 + '@vue/compiler-sfc': 3.5.32 + '@vue/runtime-dom': 3.5.32 + '@vue/server-renderer': 3.5.32(vue@3.5.32(typescript@5.9.3)) + '@vue/shared': 3.5.32 + optionalDependencies: + typescript: 5.9.3 + wasm-feature-detect@1.8.0: {} web-namespaces@2.0.1: {} @@ -23198,6 +25989,10 @@ snapshots: dependencies: isexe: 3.1.1 + which@6.0.1: + dependencies: + isexe: 4.0.0 + why-is-node-running@2.3.0: dependencies: siginfo: 2.0.0 @@ -23279,20 +26074,26 @@ snapshots: wrap-ansi@8.1.0: dependencies: - ansi-styles: 6.2.1 + ansi-styles: 6.2.3 string-width: 5.1.2 - strip-ansi: 7.1.0 + strip-ansi: 7.2.0 wrap-ansi@9.0.2: dependencies: - ansi-styles: 6.2.1 + ansi-styles: 6.2.3 string-width: 7.2.0 - strip-ansi: 7.1.0 + strip-ansi: 7.2.0 wrappy@1.0.2: {} ws@8.18.0: {} + ws@8.20.0: {} + + wsl-utils@0.1.0: + dependencies: + is-wsl: 3.1.1 + x-forwarded-fetch@0.2.0: {} xml-parse-from-string@1.0.1: {} @@ -23320,6 +26121,8 @@ snapshots: yaml@2.8.1: {} + yaml@2.8.3: {} + yargs-parser@20.2.9: {} yargs-parser@21.1.1: {} @@ -23383,7 +26186,7 @@ snapshots: dependencies: '@poppinss/colors': 4.1.6 '@poppinss/dumper': 0.6.5 - '@speed-highlight/core': 1.2.12 + '@speed-highlight/core': 1.2.14 cookie: 1.1.1 youch-core: 0.3.3 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index ec548fea0..a9ccf34fa 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -19,6 +19,7 @@ packages: - packages/mysql - packages/nestjs - packages/next +- packages/nuxt - packages/postgres - packages/redis - packages/relay @@ -41,6 +42,7 @@ packages: - examples/fastify - examples/next14-app-router - examples/next15-app-router +- examples/nuxt - examples/solidstart - examples/sveltekit-sample @@ -88,9 +90,12 @@ catalog: ioredis: ^5.8.2 koa: ^2.16.0 next: ^15.4.6 + nuxt: ^4.1.3 pkijs: ^3.3.3 mysql2: ^3.18.0 postgres: ^3.4.7 tsdown: ^0.21.6 typescript: ^5.9.2 urlpattern-polyfill: "^10.1.0" + vue: ^3.5.17 + vue-router: ^4.5.1 From 96907f85f21f649167990a8859837e89ed79441a Mon Sep 17 00:00:00 2001 From: ChanHaeng Lee <2chanhaeng@gmail.com> Date: Thu, 9 Apr 2026 07:09:34 +0000 Subject: [PATCH 07/10] Format docs --- .hongdown.toml | 1 + CHANGES.md | 2 +- cspell.json | 2 ++ packages/nuxt/README.md | 2 +- 4 files changed, 5 insertions(+), 2 deletions(-) diff --git a/.hongdown.toml b/.hongdown.toml index 3357c8eec..780604a05 100644 --- a/.hongdown.toml +++ b/.hongdown.toml @@ -27,6 +27,7 @@ proper_nouns = [ "@fedify/hono", "@fedify/koa", "@fedify/mysql", + "@fedify/nuxt", "@fedify/nestjs", "@fedify/postgres", "@fedify/redis", diff --git a/CHANGES.md b/CHANGES.md index 58c879ef3..44b6261ff 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -53,7 +53,7 @@ To be released. [#601]: https://github.com/fedify-dev/fedify/pull/601 [#652]: https://github.com/fedify-dev/fedify/pull/652 -### @fedify/Nuxt +### @fedify/nuxt - Added `@fedify/nuxt` for integrating Fedify with [Nuxt] through `server/middleware` and Nitro's `errorHandler`, so Nuxt routes and diff --git a/cspell.json b/cspell.json index 1f22276ec..67ea9a788 100644 --- a/cspell.json +++ b/cspell.json @@ -34,6 +34,7 @@ "elysia", "elysiajs", "fanout", + "fastify", "federatable", "Federatable", "fedi", @@ -77,6 +78,7 @@ "multitenancy", "Nexkey", "nodeinfo", + "nuxt", "optique", "phensley", "Pico", diff --git a/packages/nuxt/README.md b/packages/nuxt/README.md index a6530a777..b9464ecfa 100644 --- a/packages/nuxt/README.md +++ b/packages/nuxt/README.md @@ -1,6 +1,6 @@ -@fedify/Nuxt: Integrate Fedify with Nuxt +@fedify/nuxt: Integrate Fedify with Nuxt ======================================== [![JSR][JSR badge]][JSR] From be76269506f18cd56c46b81ff61f4d73d7bebe4e Mon Sep 17 00:00:00 2001 From: ChanHaeng Lee <2chanhaeng@gmail.com> Date: Thu, 9 Apr 2026 10:01:14 +0000 Subject: [PATCH 08/10] Update SKILL.md to include testing prerequisites and linting instructions --- .agents/skills/create-integration-package/SKILL.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.agents/skills/create-integration-package/SKILL.md b/.agents/skills/create-integration-package/SKILL.md index 171ed7bd2..32173ddbd 100644 --- a/.agents/skills/create-integration-package/SKILL.md +++ b/.agents/skills/create-integration-package/SKILL.md @@ -287,6 +287,11 @@ comments above the example registry arrays in that file to determine which array is appropriate and what fields are required. Follow the patterns of existing entries. +Before running the tests, ensure that the tunneling service is usable. +The tests use the tunneling service `pinggy.io` to make the example app +accessible to the test suite. If the tunneling service is not usable, +the tests may not finish forever or may fail due to a connection error. + While developing the example, run only the new example to iterate quickly: @@ -308,6 +313,10 @@ mise test:examples Lint, format, and final checks ------------------------------ +Add keywords related to the framework in `.hongdown.toml` and `cspell.json` in +root path. Especially, the package name `@fedify/framework` should be added to +the `.hongdown.toml`. + After implementation, run `mise run fmt && mise check`. If there are lint or format errors, fix them and run the command again until there are no errors. From e4180b64c2f144066167ec210c50db0c960613fb Mon Sep 17 00:00:00 2001 From: ChanHaeng Lee <2chanhaeng@gmail.com> Date: Thu, 9 Apr 2026 12:07:03 +0000 Subject: [PATCH 09/10] Update SKILL.md to publish package on both JSR and NPM --- .agents/skills/create-integration-package/SKILL.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.agents/skills/create-integration-package/SKILL.md b/.agents/skills/create-integration-package/SKILL.md index 32173ddbd..63ef17e9c 100644 --- a/.agents/skills/create-integration-package/SKILL.md +++ b/.agents/skills/create-integration-package/SKILL.md @@ -48,6 +48,9 @@ Implement the package the package integrates smoothly with the framework so users do not experience friction when connecting it. +Unless there are significant hurdles, please set up the package to publish +on both JSR and NPM. + Create the package directory inside the `packages/` directory. For example, if the framework is named “framework”, create the directory `packages/framework/`. From 06ed6ca32de209754699bde59377fa9b869dc014 Mon Sep 17 00:00:00 2001 From: ChanHaeng Lee <2chanhaeng@gmail.com> Date: Thu, 9 Apr 2026 12:49:10 +0000 Subject: [PATCH 10/10] Add CHANGES.md to PR link --- CHANGES.md | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 44b6261ff..f992e862e 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -38,8 +38,11 @@ To be released. ### @fedify/adonis - Added `@fedify/adonis` package for integrating Fedify with [AdonisJS]. + [[#139], [#671] by ChanHaeng Lee] [AdonisJS]: https://adonisjs.com/ +[#139]: https://github.com/fedify-dev/fedify/issues/139 +[#671]: https://github.com/fedify-dev/fedify/pull/671 ### @fedify/solidstart @@ -59,8 +62,10 @@ To be released. `server/middleware` and Nitro's `errorHandler`, so Nuxt routes and ActivityPub endpoints can share the same paths with proper content negotiation. + [[#149], [#671] by ChanHaeng Lee] [Nuxt]: https://nuxt.com/ +[#149]: https://github.com/fedify-dev/fedify/issues/149 ### @fedify/init @@ -69,11 +74,13 @@ To be released. Environment variables are now properly loaded at runtime, resolving the `TypeError: Cannot read properties of undefined` from `mysql2`. [[#649], [#656] by ChanHaeng Lee] + - Added AdonisJS to `fedify init`, including middleware registration + templates for newly scaffolded projects. + [[#139], [#653], [#671] by ChanHaeng Lee] - Added Nuxt to `fedify init`, including middleware and Nitro error handler templates for newly scaffolded projects. - [[#149], [#653] by ChanHaeng Lee] + [[#149], [#653], [#671] by ChanHaeng Lee] -[#149]: https://github.com/fedify-dev/fedify/issues/149 [#649]: https://github.com/fedify-dev/fedify/issues/649 [#653]: https://github.com/fedify-dev/fedify/issues/653 [#656]: https://github.com/fedify-dev/fedify/pull/656