From f3b3fab59aca06ffa223b3a6dcf67e65ba1f9cec Mon Sep 17 00:00:00 2001
From: fretchen
Date: Thu, 15 Oct 2026 07:43:44 +0200
Subject: [PATCH 1/6] new tool for train search
---
website/components/AssistantChat.tsx | 136 +-
website/locales/de.ts | 16 +
website/locales/en.ts | 16 +
website/prompts/tool-contract.md | 3 +-
website/test/AssistantChat.test.tsx | 153 +-
website/test/fixtures/transitous/geocode.json | 554 ++++++
website/test/fixtures/transitous/plan.json | 1757 +++++++++++++++++
.../test/fixtures/transitous/stoptimes.json | 830 ++++++++
website/test/prompts.test.ts | 1 +
website/test/transitous.test.ts | 207 ++
website/tools/transitous.ts | 310 +++
11 files changed, 3980 insertions(+), 3 deletions(-)
create mode 100644 website/test/fixtures/transitous/geocode.json
create mode 100644 website/test/fixtures/transitous/plan.json
create mode 100644 website/test/fixtures/transitous/stoptimes.json
create mode 100644 website/test/transitous.test.ts
create mode 100644 website/tools/transitous.ts
diff --git a/website/components/AssistantChat.tsx b/website/components/AssistantChat.tsx
index 66efb4398..be7f99662 100644
--- a/website/components/AssistantChat.tsx
+++ b/website/components/AssistantChat.tsx
@@ -36,6 +36,18 @@ import {
fetchFailed,
type BundestaktResult,
} from "../tools/bundestakt";
+import {
+ searchStopTool,
+ planJourneyTool,
+ getDeparturesTool,
+ fetchGeocode,
+ fetchStoptimes,
+ fetchPlan,
+ selectStops,
+ selectBoard,
+ selectJourneys,
+ type TransitousResult,
+} from "../tools/transitous";
import {
getAnalyticsTool,
fetchStats,
@@ -95,7 +107,7 @@ import { PaymentError, readChargedTotal } from "../utils/x402PaidFetch";
* requirement; analytics is about honesty — a figure about this site should say it was looked up
* rather than read as something the model knew.
*/
-type ToolSource = "bundestakt" | "analytics" | "brave";
+type ToolSource = "bundestakt" | "transitous" | "analytics" | "brave";
/**
* Everything offered to the model, with what the chat loop needs to know about a tool besides its
@@ -161,6 +173,41 @@ export const TOOL_REGISTRY = [
paid: false,
source: "bundestakt",
},
+ // Transitous, the same UX decision as the Bundestakt pair above: three tools and schemas
+ // the model calls separately, one shared row for the visitor (labelled by the group key's
+ // locale value, "Mit Zug & Bus"/"Train & bus" — modes, not the project name, which says
+ // nothing to a visitor), collapsed by `group`. The row's description comes from the first
+ // member (see `toolSelectorOptions`), so `searchStopTool`'s pair below stands for all three.
+ {
+ tool: searchStopTool,
+ label: "assistent.toolTransitSearch",
+ description: "assistent.toolTransitSearchDesc",
+ group: "assistent.capTransitous",
+ ownerScope: null,
+ defaultAgentOnly: false,
+ paid: false,
+ source: "transitous",
+ },
+ {
+ tool: planJourneyTool,
+ label: "assistent.toolTransitPlan",
+ description: "assistent.toolTransitPlanDesc",
+ group: "assistent.capTransitous",
+ ownerScope: null,
+ defaultAgentOnly: false,
+ paid: false,
+ source: "transitous",
+ },
+ {
+ tool: getDeparturesTool,
+ label: "assistent.toolTransitDepartures",
+ description: "assistent.toolTransitDeparturesDesc",
+ group: "assistent.capTransitous",
+ ownerScope: null,
+ defaultAgentOnly: false,
+ paid: false,
+ source: "transitous",
+ },
{
tool: getPageTool,
label: "assistent.toolSiteContent",
@@ -466,9 +513,12 @@ export function AssistantChat() {
const bundestaktSourceLabel = useLocale({ label: "assistent.bundestaktSource" });
const analyticsSourceLabel = useLocale({ label: "assistent.analyticsSource" });
const braveSourceLabel = useLocale({ label: "assistent.braveSource" });
+ const transitousSourceLabel = useLocale({ label: "assistent.transitousSource" });
// Here rather than at module scope because the labels are translated per render.
const sourceLinks: Record = {
bundestakt: { href: "https://www.bundestakt.de", label: bundestaktSourceLabel },
+ // Transitous's usage policy asks for visible attribution — this citation line is it.
+ transitous: { href: "https://transitous.org", label: transitousSourceLabel },
analytics: { href: "/analytics", label: analyticsSourceLabel },
brave: { href: "https://search.brave.com", label: braveSourceLabel },
};
@@ -812,6 +862,87 @@ export function AssistantChat() {
}
}
+ /**
+ * Fetches and projects one Transitous endpoint (stop search, departure board, routing).
+ * `tools/transitous.ts` is stateless, so the caching policy lives here: geocode answers
+ * change rarely (24 h), a board goes stale within a minute (60 s), routing answers are
+ * keyed by the exact query (5 min) — politeness, not latency, since Transitous answers in
+ * well under a second. Unlike Bundestakt's `not_found`, a stop search without hits is
+ * still `status: "ok"` (empty list), so the tool stays on offer for a corrected spelling.
+ */
+ /**
+ * A tool argument the model sent as a non-string (or omitted) coerces to the empty string
+ * rather than to "[object Object]" — the empty-argument guards below turn that into a
+ * correctable bad_query answer instead of a request for a nonsense name.
+ */
+ const argString = (v: unknown): string => (typeof v === "string" ? v : "");
+
+ async function loadTransitous(kind: "geocode" | "stoptimes" | "plan", args: Record): Promise {
+ // An empty required argument is an answer the model can act on, not a malfunction: fetching
+ // anyway would 4xx at the API, `fetch_failed` would withdraw the tool for the rest of the
+ // turn, and with it the one thing that fixes the mistake — a corrected query, a real stop
+ // id from search_stop. `recoverable` keeps the tool on offer for the retry.
+ if (kind === "geocode" && !argString(args.query)) {
+ return {
+ result: { status: "bad_query", reason: "search_stop needs a non-empty stop or station name to search for." },
+ recoverable: true,
+ };
+ }
+ if (kind === "stoptimes" && !argString(args.stop_id)) {
+ return {
+ result: { status: "bad_query", reason: "get_departures needs a stop id from search_stop." },
+ recoverable: true,
+ };
+ }
+ if (kind === "plan" && (!argString(args.from) || !argString(args.to))) {
+ return {
+ result: { status: "bad_query", reason: "plan_journey needs from and to stop ids from search_stop." },
+ recoverable: true,
+ };
+ }
+ try {
+ let result: TransitousResult;
+ if (kind === "geocode") {
+ const query = argString(args.query);
+ const raw = await queryClient.fetchQuery({
+ queryKey: ["transitous", "geocode", query],
+ queryFn: () => fetchGeocode(query),
+ staleTime: 24 * 60 * 60_000,
+ retry: 0,
+ });
+ result = selectStops(raw);
+ } else if (kind === "stoptimes") {
+ const stopId = argString(args.stop_id);
+ const time = typeof args.time === "string" ? args.time : undefined;
+ const raw = await queryClient.fetchQuery({
+ queryKey: ["transitous", "stoptimes", stopId, time ?? null],
+ queryFn: () => fetchStoptimes(stopId, undefined, time),
+ staleTime: 60_000,
+ retry: 0,
+ });
+ result = selectBoard(raw);
+ } else {
+ const from = argString(args.from);
+ const to = argString(args.to);
+ const departure = typeof args.departure === "string" ? args.departure : undefined;
+ const arriveBy = args.arrive_by === true;
+ const railOnly = args.rail_only === true;
+ const raw = await queryClient.fetchQuery({
+ queryKey: ["transitous", "plan", from, to, departure ?? null, arriveBy, railOnly],
+ queryFn: () =>
+ fetchPlan({ from, to, time: departure, arriveBy, transitModes: railOnly ? "RAIL" : undefined }),
+ staleTime: 5 * 60_000,
+ retry: 0,
+ });
+ result = selectJourneys(raw);
+ }
+ return { result };
+ } catch (err) {
+ // fetchQuery rethrows the fetcher's error; the module owns the wire-level failure shape.
+ return { result: fetchFailed(err) };
+ }
+ }
+
/**
* Reads the site's own traffic figures. `GET /stats` takes no range and always returns the
* trailing year, so it is fetched once and every `range` is a local slice of that one payload.
@@ -987,6 +1118,9 @@ export function AssistantChat() {
toolRunners[generateImageTool.function.name] = runImageToolHere;
toolRunners[getSitzungenTool.function.name] = (args) => loadBundestakt("sitzungen", args);
toolRunners[searchClaimsTool.function.name] = (args) => loadBundestakt("claims", args);
+ toolRunners[searchStopTool.function.name] = (args) => loadTransitous("geocode", args);
+ toolRunners[planJourneyTool.function.name] = (args) => loadTransitous("plan", args);
+ toolRunners[getDeparturesTool.function.name] = (args) => loadTransitous("stoptimes", args);
toolRunners[getPageTool.function.name] = loadPage;
toolRunners[searchWebTool.function.name] = loadSearch;
toolRunners[fetchUrlTool.function.name] = loadFetch;
diff --git a/website/locales/de.ts b/website/locales/de.ts
index 4e46bba65..da1d61866 100644
--- a/website/locales/de.ts
+++ b/website/locales/de.ts
@@ -98,6 +98,9 @@ export default {
toolWebSearch: "Im Web suchen",
toolFetchUrl: "Links öffnen",
toolSiteAnalytics: "Website-Statistik",
+ toolTransitSearch: "Haltestellen suchen",
+ toolTransitPlan: "Verbindungen planen",
+ toolTransitDepartures: "Abfahrten",
// Eine Zeile pro Fähigkeit — der Anlass war ein Test, in dem jemand nicht wusste, was
// "Bundestagssitzungen" bedeutet. Kurz und konkret, keine Fachbegriffe ohne Erklärung.
toolImageGenerationDesc: "Erstellt ein Bild aus deiner Beschreibung.",
@@ -110,10 +113,22 @@ export default {
toolWebSearchDesc: "Sucht aktuelle Informationen im Internet.",
toolFetchUrlDesc: "Liest eine Seite, die du verlinkst.",
toolSiteAnalyticsDesc: "Wie oft diese Website besucht wird.",
+ // Die hier ist die, die tatsächlich angezeigt wird: die zusammengefasste Fahrplan-Zeile
+ // in ToolSelector kommt vom ersten Eintrag der Gruppe (siehe TOOL_REGISTRY), und das
+ // ist dieser — sie beschreibt deshalb die ganze Fähigkeit und nennt die Verkehrsmittel,
+ // weil das Zeilenlabel ("Fahrplan") bewusst gattungsneutral bleibt.
+ toolTransitSearchDesc: "Züge, Busse und Fähren in ganz Europa – Verbindungen und Abfahrten, mit Echtzeit, wo Betreiber sie liefern.",
+ toolTransitPlanDesc: "Plant eine Verbindung von Tür zu Tür – Züge, Busse, Fähren.",
+ toolTransitDeparturesDesc: "Die nächsten Abfahrten einer Haltestelle.",
// Zeilentitel für die zusammengefasste Zeile in ToolSelector (get_sitzungen +
// search_claims). Eigener Name statt "Bundestagssitzungen": kurz, ein Eigenname, den
// niemand nachschlagen muss — die Beschreibung darunter erklärt, was es tut.
capBundestag: "Bundestag",
+ // Zeilentitel für die zusammengefasste Zeile (search_stop + plan_journey +
+ // get_departures). Bewusst kein Eigenname wie bei capBundestag ("Bundestag" kennt jeder,
+ // "Transitous" niemand) und auch nicht "Fahrplan" — ein Zeitplan ist auch das Konzert-
+ // Programm; "Mit Zug & Bus" nennt die Verkehrsmittel, die Fähre nennt die Beschreibung.
+ capTransitous: "Mit Zug & Bus",
emptyState: "Starte eine Unterhaltung, indem du unten eine Nachricht eingibst.",
doorIntro: "Hallo — ich bin der KI-Assistent dieser Website.",
doorCan:
@@ -161,6 +176,7 @@ export default {
bundestaktSource: "Quelle: Bundestakt",
analyticsSource: "Quelle: Analytics",
braveSource: "Quelle: Brave Search",
+ transitousSource: "Quelle: Transitous",
errorPrefix: "Fehler:",
unknownError: "Unbekannter Fehler",
loading: "Lädt...",
diff --git a/website/locales/en.ts b/website/locales/en.ts
index 451a7ba63..a5303751a 100644
--- a/website/locales/en.ts
+++ b/website/locales/en.ts
@@ -99,6 +99,9 @@ export default {
toolWebSearch: "Web search",
toolFetchUrl: "Fetch URL",
toolSiteAnalytics: "Site analytics",
+ toolTransitSearch: "Find stops",
+ toolTransitPlan: "Plan journeys",
+ toolTransitDepartures: "Departures",
toolImageGenerationDesc: "Creates a picture from your description.",
// The one actually shown: the grouped Bundestag row's description comes from the first
// entry in that group (see TOOL_REGISTRY), and that is this one.
@@ -108,7 +111,19 @@ export default {
toolWebSearchDesc: "Looks up current information on the web.",
toolFetchUrlDesc: "Reads a page you link.",
toolSiteAnalyticsDesc: "How often this website is visited.",
+ // The one actually shown: the grouped timetable row's description comes from the first
+ // entry in that group (see TOOL_REGISTRY), so this describes the whole capability and
+ // names the modes — the row label stays deliberately generic.
+ toolTransitSearchDesc: "Trains, buses and ferries across Europe — journeys and departures, with live times where operators publish them.",
+ toolTransitPlanDesc: "Plans a door-to-door journey — trains, buses, ferries.",
+ toolTransitDeparturesDesc: "The next departures from a stop.",
capBundestag: "Bundestag",
+ // Row title for the collapsed timetable row (search_stop + plan_journey +
+ // get_departures). Deliberately not a proper name like capBundestag ("Bundestag" needs
+ // no lookup, "Transitous" needs one for everyone) and not "Timetables" either — a
+ // schedule is also a concert programme; "Train & bus" names the modes, the ferry is
+ // named by the description. The citation names the data source.
+ capTransitous: "Train & bus",
emptyState: "Start a conversation by typing a message below.",
// The greeting a first-time visitor sees from the default agent: what this is, what it
// assumes and costs, where it can be wrong (IDENTITY.md → welcoming, honest).
@@ -152,6 +167,7 @@ export default {
bundestaktSource: "Source: Bundestakt",
analyticsSource: "Source: Analytics",
braveSource: "Source: Brave Search",
+ transitousSource: "Source: Transitous",
errorPrefix: "Error:",
unknownError: "Unknown error",
loading: "Loading...",
diff --git a/website/prompts/tool-contract.md b/website/prompts/tool-contract.md
index 1095513a6..db23a56c4 100644
--- a/website/prompts/tool-contract.md
+++ b/website/prompts/tool-contract.md
@@ -1,6 +1,6 @@
---
name: tool-contract
-description: The assistant's base system prompt — the tool contract. Routing rules for the Bundestakt, analytics, site-content and web-research tools, the fetch_url injection defence, and date-relative questions.
+description: The assistant's base system prompt — the tool contract. Routing rules for the Bundestakt, transit, analytics, site-content and web-research tools, the fetch_url injection defence, and date-relative questions.
---
You are a helpful assistant. You answer from live tool data wherever a tool exists for it, and you say so plainly whenever it does not.
@@ -8,6 +8,7 @@ You are a helpful assistant. You answer from live tool data wherever a tool exis
## Tool routing
- **Bundestag sessions, speaking time, fact-checks of MP statements** — use `get_sitzungen` and `search_claims`. Call `get_sitzungen` without a slug first to find the right session, then again with its slug for the details. That data comes from bundestakt.de, an AI-assisted analysis of official transcripts and not an official record itself. Always link the `url` from the tool result in your answer.
+- **Journeys, departures and connections in Europe** — use `search_stop` first to resolve a named place to a stop id, then `plan_journey` or `get_departures` with that id. If several stops match, take the obvious hub or ask the user. All times come back in UTC — convert them to the user's local timezone before presenting. When a result has `realTime=false`, present its times as scheduled and say so. That data comes from transitous.org, schedules only: prices and booking are out of scope.
- **How this site or one of its posts is doing** — visitors, most-read pages, trends — use `get_analytics`. When its result sets `hasHistoric`, the window reaches into figures backfilled from a different tool that counted differently; say so instead of comparing the two eras as one number.
- **What this site itself says** — a blog post, a lecture, a project page — use `get_page`. Call it with the url when you already know it, such as /blog/36/, and otherwise without arguments first to list the pages. If that result sets `truncated`, call once more with a heading from its outline.
- **Anything current or off this site** — news, other people's writing, documentation — use `search_web`, and link the url of every result you rely on. To read one of those results in full, or a link the user gives you, use `fetch_url`.
diff --git a/website/test/AssistantChat.test.tsx b/website/test/AssistantChat.test.tsx
index 252fc6314..5eb1beefc 100644
--- a/website/test/AssistantChat.test.tsx
+++ b/website/test/AssistantChat.test.tsx
@@ -22,6 +22,9 @@ const mockGenerateImage = vi.fn();
const {
mockFetchSitzungen,
mockFetchClaims,
+ mockFetchGeocode,
+ mockFetchStoptimes,
+ mockFetchPlan,
mockFetchStats,
mockFetchContentIndex,
mockFetchPageHtml,
@@ -31,6 +34,9 @@ const {
} = vi.hoisted(() => ({
mockFetchSitzungen: vi.fn(),
mockFetchClaims: vi.fn(),
+ mockFetchGeocode: vi.fn(),
+ mockFetchStoptimes: vi.fn(),
+ mockFetchPlan: vi.fn(),
mockFetchStats: vi.fn(),
mockFetchContentIndex: vi.fn(),
mockFetchPageHtml: vi.fn(),
@@ -125,6 +131,17 @@ vi.mock("../tools/bundestakt", async (importOriginal) => {
return { ...actual, fetchSitzungen: mockFetchSitzungen, fetchClaims: mockFetchClaims };
});
+// Same for transitous: real selectors, stubbed fetchers.
+vi.mock("../tools/transitous", async (importOriginal) => {
+ const actual = await importOriginal();
+ return {
+ ...actual,
+ fetchGeocode: mockFetchGeocode,
+ fetchStoptimes: mockFetchStoptimes,
+ fetchPlan: mockFetchPlan,
+ };
+});
+
// Same treatment for analytics: real selector, stubbed fetcher.
vi.mock("../tools/analytics", async (importOriginal) => {
const actual = await importOriginal();
@@ -156,6 +173,9 @@ import { useWalletConnection } from "../hooks/useWalletConnection";
import { useAutoNetwork } from "../hooks/useAutoNetwork";
import sitzungenFixture from "./fixtures/bundestakt/sitzungen.json";
import claimsFixture from "./fixtures/bundestakt/claims.json";
+import transitousGeocodeFixture from "./fixtures/transitous/geocode.json";
+import transitousStoptimesFixture from "./fixtures/transitous/stoptimes.json";
+import transitousPlanFixture from "./fixtures/transitous/plan.json";
import { OWNER_SCOPES } from "../utils/getChain";
import { PaymentError } from "../utils/x402PaidFetch";
import { MAX_HOPS } from "../utils/toolLoop";
@@ -222,6 +242,9 @@ describe("AssistantChat", () => {
mockSwitchImageIfNeeded.mockResolvedValue(true);
mockFetchSitzungen.mockResolvedValue(sitzungenFixture);
mockFetchClaims.mockResolvedValue(claimsFixture);
+ mockFetchGeocode.mockResolvedValue(transitousGeocodeFixture);
+ mockFetchStoptimes.mockResolvedValue(transitousStoptimesFixture);
+ mockFetchPlan.mockResolvedValue(transitousPlanFixture);
mockFetchStats.mockResolvedValue(statsFixture());
mockFetchContentIndex.mockResolvedValue([{ url: "/blog/36/", title: "My static site got a tool loop" }]);
mockFetchSearch.mockResolvedValue({
@@ -777,6 +800,126 @@ describe("AssistantChat", () => {
expect(mockFetchSitzungen).toHaveBeenCalledTimes(1);
});
+ it("runs the Transitous search-then-plan chain silently and feeds the projection back", async () => {
+ // Free and read-only, like the Bundestakt lookups: no confirm card, no wallet gate.
+ mockSendMessage
+ .mockResolvedValueOnce(toolCallResponse("search_stop", { query: "Heidelberg Hbf" }))
+ .mockResolvedValueOnce(
+ toolCallResponse("plan_journey", { from: "de-DELFI_de:08221:1160", to: "it-trenitalia_01700:station" }),
+ )
+ .mockResolvedValueOnce(textResponse("The direct EC to Milano leaves at 20:07."));
+
+ renderWithQuery();
+ sendUserMessage("How do I get from Heidelberg Hbf to Milano Centrale tomorrow?");
+
+ await waitFor(() => expect(mockSendMessage).toHaveBeenCalledTimes(3));
+ expect(screen.queryByRole("button", { name: /assistent\.toolConfirmGenerate/ })).not.toBeInTheDocument();
+ expect(mockFetchGeocode).toHaveBeenCalledTimes(1);
+ expect(mockFetchPlan).toHaveBeenCalledTimes(1);
+
+ // The tool turns carry the projected answers, not MOTIS's raw multi-hundred-KB reply.
+ const thirdConvo = mockSendMessage.mock.calls[2][0] as { role: string; content: string }[];
+ const toolResults = thirdConvo.filter((m) => m.role === "tool");
+ expect(toolResults).toHaveLength(2);
+ const stops = JSON.parse(toolResults[0].content) as { status: string; stops: { id: string }[] };
+ expect(stops.status).toBe("ok");
+ expect(stops.stops.length).toBeGreaterThan(0);
+ const journeys = JSON.parse(toolResults[1].content) as {
+ status: string;
+ itineraries: { legs: Record[] }[];
+ };
+ expect(journeys.status).toBe("ok");
+ expect(journeys.itineraries.length).toBeGreaterThan(0);
+ for (const leg of journeys.itineraries.flatMap((it) => it.legs)) {
+ expect(leg.legGeometry).toBeUndefined();
+ }
+ });
+
+ it("withdraws a failed Transitous tool but keeps its siblings on offer", async () => {
+ mockFetchPlan.mockRejectedValue(new Error("Failed to fetch"));
+ mockSendMessage
+ .mockResolvedValueOnce(toolCallResponse("plan_journey", { from: "a", to: "b" }))
+ .mockResolvedValueOnce(textResponse("I could not reach the timetable."));
+
+ renderWithQuery();
+ sendUserMessage("How do I get to Milano?");
+
+ await waitFor(() => expect(mockSendMessage).toHaveBeenCalledTimes(2));
+ const offered = (mockSendMessage.mock.calls[1][1] as { tools: { function: { name: string } }[] }).tools;
+ const names = offered.map((t) => t.function.name);
+ expect(names).not.toContain("plan_journey");
+ expect(names).toContain("search_stop");
+ expect(names).toContain("get_departures");
+ });
+
+ it("answers an empty Transitous argument with a recoverable bad_query, not a withdrawal", async () => {
+ // An empty required argument is the model's mistake to correct, not a malfunction of the
+ // tool: withdrawing search_stop would take away the one thing that fixes the next call.
+ mockSendMessage
+ .mockResolvedValueOnce(toolCallResponse("search_stop", {}))
+ .mockResolvedValueOnce(textResponse("Which station did you mean?"));
+
+ renderWithQuery();
+ sendUserMessage("When does the next train leave?");
+
+ await waitFor(() => expect(mockSendMessage).toHaveBeenCalledTimes(2));
+ expect(mockFetchGeocode).not.toHaveBeenCalled();
+
+ const secondConvo = mockSendMessage.mock.calls[1][0] as { role: string; content: string }[];
+ const toolResult = secondConvo.find((m) => m.role === "tool");
+ expect(JSON.parse(toolResult!.content)).toMatchObject({ status: "bad_query" });
+
+ const offered = (mockSendMessage.mock.calls[1][1] as { tools: { function: { name: string } }[] }).tools;
+ expect(offered.map((t) => t.function.name)).toContain("search_stop");
+ });
+
+ it("credits Transitous after a successful lookup, but not after a failed one", async () => {
+ // Transitous's usage policy asks for visible attribution, so this line is an obligation,
+ // and equally one not to show when nothing was actually retrieved.
+ mockSendMessage
+ .mockResolvedValueOnce(toolCallResponse("search_stop", { query: "Heidelberg Hbf" }))
+ .mockResolvedValueOnce(textResponse("Heidelberg Hbf is Heidelberg's main station."));
+
+ const { unmount } = renderWithQuery();
+ sendUserMessage("Where is Heidelberg Hbf?");
+ await waitFor(() => expect(screen.getByText("assistent.transitousSource")).toBeInTheDocument());
+ unmount();
+
+ vi.clearAllMocks();
+ mockSwitchIfNeeded.mockResolvedValue(true);
+ mockFetchGeocode.mockRejectedValue(new Error("Failed to fetch"));
+ mockSendMessage
+ .mockResolvedValueOnce(toolCallResponse("search_stop", { query: "Heidelberg Hbf" }))
+ .mockResolvedValueOnce(textResponse("I could not reach the timetable."));
+
+ renderWithQuery();
+ sendUserMessage("Where is Heidelberg Hbf?");
+
+ await waitFor(() => expect(screen.getByText("I could not reach the timetable.")).toBeInTheDocument());
+ expect(screen.queryByText("assistent.transitousSource")).not.toBeInTheDocument();
+ });
+
+ it("switching the Transitous row off persists and reaches the next request", async () => {
+ renderWithQuery();
+
+ // search_stop, plan_journey and get_departures present as one merged "Train & bus" row
+ // (TOOL_REGISTRY's `group`, whose locale value is the row label), so one click
+ // switches off all three wire names at once.
+ fireEvent.click(screen.getAllByLabelText("Train & bus")[0]);
+ expect(window.localStorage.getItem("x402-chat-disabled-tools")).toBe(
+ "search_stop,plan_journey,get_departures",
+ );
+
+ sendUserMessage("Hi");
+ await waitFor(() => expect(mockSendMessage).toHaveBeenCalledOnce());
+ const names = (mockSendMessage.mock.calls[0][1] as { tools: { function: { name: string } }[] }).tools.map(
+ (t) => t.function.name,
+ );
+ expect(names).not.toContain("search_stop");
+ expect(names).not.toContain("plan_journey");
+ expect(names).not.toContain("get_departures");
+ });
+
it("keeps the image tool on offer when a Bundestakt lookup fails", async () => {
// The regression this guards: a single shared `toolFailed` flag would have disabled
// generate_image for the rest of the turn because an unrelated, free lookup failed.
@@ -801,13 +944,18 @@ describe("AssistantChat", () => {
// be sent as `tools: []`. "Nothing left to offer" has to mean the key is absent.
mockFetchSitzungen.mockRejectedValue(new Error("down"));
mockFetchClaims.mockRejectedValue(new Error("down"));
+ mockFetchGeocode.mockRejectedValue(new Error("down"));
+ mockFetchStoptimes.mockRejectedValue(new Error("down"));
+ mockFetchPlan.mockRejectedValue(new Error("down"));
// get_page, search_web and fetch_url are switched off rather than failed: every one of their
// failures is recoverable by design — a different url, a different query, a different section
// — so they are never withdrawn, and "everything on offer has failed" can only be reached
// with them off the table to begin with.
window.localStorage.setItem("x402-chat-disabled-tools", "get_page,search_web,fetch_url");
- // All three in one hop: the two lookups fail on their own, the image tool via a cancel.
+ // All six in one hop: the five lookups fail on their own, the image tool via a cancel.
+ // The Transitous calls carry well-formed arguments, because an empty one would be a
+ // recoverable bad_query answer, not a failure — and the tool would stay on offer.
mockSendMessage.mockResolvedValue({
choices: [
{
@@ -818,6 +966,9 @@ describe("AssistantChat", () => {
{ id: "a", type: "function", function: { name: "get_sitzungen", arguments: "{}" } },
{ id: "b", type: "function", function: { name: "search_claims", arguments: "{}" } },
{ id: "c", type: "function", function: { name: "generate_image", arguments: "{}" } },
+ { id: "d", type: "function", function: { name: "search_stop", arguments: '{"query":"x"}' } },
+ { id: "e", type: "function", function: { name: "plan_journey", arguments: '{"from":"a","to":"b"}' } },
+ { id: "f", type: "function", function: { name: "get_departures", arguments: '{"stop_id":"x"}' } },
],
},
finish_reason: "tool_calls",
diff --git a/website/test/fixtures/transitous/geocode.json b/website/test/fixtures/transitous/geocode.json
new file mode 100644
index 000000000..c9b4bb187
--- /dev/null
+++ b/website/test/fixtures/transitous/geocode.json
@@ -0,0 +1,554 @@
+[
+ {
+ "type": "STOP",
+ "name": "Heidelberg Hbf",
+ "id": "de-DELFI_de:08221:1160",
+ "lat": 49.40357,
+ "lon": 8.675442000000002,
+ "country": "DE",
+ "zip": "69115",
+ "tz": "Europe/Berlin",
+ "areas": [
+ {
+ "name": "Deutschland",
+ "adminLevel": 2,
+ "matched": false,
+ "unique": false,
+ "default": false
+ },
+ {
+ "name": "Baden-Württemberg",
+ "adminLevel": 4,
+ "matched": false,
+ "unique": false,
+ "default": false
+ },
+ {
+ "name": "Regierungsbezirk Karlsruhe",
+ "adminLevel": 5,
+ "matched": false,
+ "unique": false,
+ "default": false
+ },
+ {
+ "name": "Heidelberg",
+ "adminLevel": 6,
+ "matched": false,
+ "unique": true,
+ "default": true
+ },
+ {
+ "name": "Weststadt",
+ "adminLevel": 9,
+ "matched": false,
+ "unique": false,
+ "default": false
+ }
+ ],
+ "score": -32.124732971191406,
+ "modes": [
+ "HIGHSPEED_RAIL",
+ "LONG_DISTANCE",
+ "COACH",
+ "RIDE_SHARING",
+ "REGIONAL_RAIL",
+ "SUBURBAN",
+ "TRAM",
+ "BUS",
+ "ODM"
+ ],
+ "importance": 0.003857618197798729
+ },
+ {
+ "type": "PLACE",
+ "category": "hotel_16",
+ "name": "ibis Heidelberg Hauptbahnhof",
+ "id": "way/[87645977]",
+ "lat": 49.4036051,
+ "lon": 8.6767446,
+ "country": "DE",
+ "zip": "69115",
+ "tz": "Europe/Berlin",
+ "areas": [
+ {
+ "name": "Deutschland",
+ "adminLevel": 2,
+ "matched": false,
+ "unique": false,
+ "default": false
+ },
+ {
+ "name": "Baden-Württemberg",
+ "adminLevel": 4,
+ "matched": false,
+ "unique": false,
+ "default": false
+ },
+ {
+ "name": "Regierungsbezirk Karlsruhe",
+ "adminLevel": 5,
+ "matched": false,
+ "unique": false,
+ "default": false
+ },
+ {
+ "name": "Heidelberg",
+ "adminLevel": 6,
+ "matched": false,
+ "unique": true,
+ "default": true
+ },
+ {
+ "name": "Weststadt",
+ "adminLevel": 9,
+ "matched": false,
+ "unique": false,
+ "default": false
+ }
+ ],
+ "score": -27.5
+ },
+ {
+ "type": "STOP",
+ "name": "Bahnstadt, Hauptbahnhof Süd",
+ "id": "de-DELFI_de:08221:4272:1:TrRiO",
+ "lat": 49.40181,
+ "lon": 8.674195,
+ "country": "DE",
+ "zip": "69115",
+ "tz": "Europe/Berlin",
+ "areas": [
+ {
+ "name": "Deutschland",
+ "adminLevel": 2,
+ "matched": false,
+ "unique": false,
+ "default": false
+ },
+ {
+ "name": "Baden-Württemberg",
+ "adminLevel": 4,
+ "matched": false,
+ "unique": false,
+ "default": false
+ },
+ {
+ "name": "Regierungsbezirk Karlsruhe",
+ "adminLevel": 5,
+ "matched": false,
+ "unique": false,
+ "default": false
+ },
+ {
+ "name": "Heidelberg",
+ "adminLevel": 6,
+ "matched": true,
+ "unique": true,
+ "default": true
+ },
+ {
+ "name": "Bahnstadt",
+ "adminLevel": 9,
+ "matched": false,
+ "unique": false,
+ "default": false
+ }
+ ],
+ "score": -26.631120681762695,
+ "modes": [
+ "TRAM",
+ "BUS"
+ ],
+ "importance": 0.000045373457396635786
+ },
+ {
+ "type": "PLACE",
+ "category": "hotel_16",
+ "name": "Meininger Heidelberg Hauptbahnhof",
+ "id": "way/[753509904]",
+ "lat": 49.3987481,
+ "lon": 8.677719,
+ "country": "DE",
+ "zip": "69115",
+ "tz": "Europe/Berlin",
+ "areas": [
+ {
+ "name": "Deutschland",
+ "adminLevel": 2,
+ "matched": false,
+ "unique": false,
+ "default": false
+ },
+ {
+ "name": "Baden-Württemberg",
+ "adminLevel": 4,
+ "matched": false,
+ "unique": false,
+ "default": false
+ },
+ {
+ "name": "Regierungsbezirk Karlsruhe",
+ "adminLevel": 5,
+ "matched": false,
+ "unique": false,
+ "default": false
+ },
+ {
+ "name": "Heidelberg",
+ "adminLevel": 6,
+ "matched": false,
+ "unique": true,
+ "default": true
+ },
+ {
+ "name": "Weststadt",
+ "adminLevel": 9,
+ "matched": false,
+ "unique": false,
+ "default": false
+ }
+ ],
+ "score": -26.25
+ },
+ {
+ "type": "PLACE",
+ "category": "none",
+ "name": "Heidelberg Hauptbahnhof Ost",
+ "id": "node/[5795035409]",
+ "lat": 49.4044187,
+ "lon": 8.6780409,
+ "country": "DE",
+ "zip": "69115",
+ "tz": "Europe/Berlin",
+ "areas": [
+ {
+ "name": "Deutschland",
+ "adminLevel": 2,
+ "matched": false,
+ "unique": false,
+ "default": false
+ },
+ {
+ "name": "Baden-Württemberg",
+ "adminLevel": 4,
+ "matched": false,
+ "unique": false,
+ "default": false
+ },
+ {
+ "name": "Regierungsbezirk Karlsruhe",
+ "adminLevel": 5,
+ "matched": false,
+ "unique": false,
+ "default": false
+ },
+ {
+ "name": "Heidelberg",
+ "adminLevel": 6,
+ "matched": false,
+ "unique": true,
+ "default": true
+ },
+ {
+ "name": "Bergheim",
+ "adminLevel": 9,
+ "matched": false,
+ "unique": false,
+ "default": false
+ }
+ ],
+ "score": -24.75
+ },
+ {
+ "type": "STOP",
+ "name": "Hauptbahnhof Süd",
+ "id": "at-Railway-Current-Reference-Data-2026_de:09162:100:11:11",
+ "lat": 48.13988,
+ "lon": 11.557491,
+ "country": "DE",
+ "zip": "80335",
+ "tz": "Europe/Berlin",
+ "areas": [
+ {
+ "name": "Deutschland",
+ "adminLevel": 2,
+ "matched": false,
+ "unique": false,
+ "default": false
+ },
+ {
+ "name": "Bayern",
+ "adminLevel": 4,
+ "matched": false,
+ "unique": false,
+ "default": false
+ },
+ {
+ "name": "Oberbayern",
+ "adminLevel": 5,
+ "matched": false,
+ "unique": false,
+ "default": false
+ },
+ {
+ "name": "München",
+ "adminLevel": 6,
+ "matched": false,
+ "unique": true,
+ "default": true
+ },
+ {
+ "name": "Ludwigsvorstadt-Isarvorstadt",
+ "adminLevel": 9,
+ "matched": false,
+ "unique": false,
+ "default": false
+ }
+ ],
+ "score": -18.81806755065918,
+ "modes": [
+ "HIGHSPEED_RAIL",
+ "LONG_DISTANCE",
+ "NIGHT_RAIL",
+ "REGIONAL_RAIL",
+ "SUBURBAN",
+ "SUBWAY",
+ "TRAM",
+ "BUS"
+ ],
+ "importance": 0.021757638081908226
+ },
+ {
+ "type": "STOP",
+ "name": "Hauptbahnhof/ZOB",
+ "id": "at-Railway-Current-Reference-Data-2026_de:02000:10950:11:1",
+ "lat": 53.552475,
+ "lon": 10.008094999999999,
+ "level": -1,
+ "country": "DE",
+ "zip": "20099",
+ "tz": "Europe/Berlin",
+ "areas": [
+ {
+ "name": "Deutschland",
+ "adminLevel": 2,
+ "matched": false,
+ "unique": false,
+ "default": false
+ },
+ {
+ "name": "Hamburg",
+ "adminLevel": 4,
+ "matched": false,
+ "unique": true,
+ "default": true
+ },
+ {
+ "name": "Hamburg-Mitte",
+ "adminLevel": 9,
+ "matched": false,
+ "unique": false,
+ "default": false
+ },
+ {
+ "name": "St. Georg",
+ "adminLevel": 10,
+ "matched": false,
+ "unique": false,
+ "default": false
+ }
+ ],
+ "score": -18.813016891479492,
+ "modes": [
+ "HIGHSPEED_RAIL",
+ "LONG_DISTANCE",
+ "COACH",
+ "NIGHT_RAIL",
+ "REGIONAL_RAIL",
+ "SUBURBAN",
+ "SUBWAY",
+ "BUS"
+ ],
+ "importance": 0.021419377997517586
+ },
+ {
+ "type": "STOP",
+ "name": "Hauptbahnhof (tief)",
+ "id": "at-Railway-Current-Reference-Data-2026_de:08111:6115:1:1",
+ "lat": 48.784748,
+ "lon": 9.183216999999999,
+ "country": "DE",
+ "zip": "70173",
+ "tz": "Europe/Berlin",
+ "areas": [
+ {
+ "name": "Deutschland",
+ "adminLevel": 2,
+ "matched": false,
+ "unique": false,
+ "default": false
+ },
+ {
+ "name": "Baden-Württemberg",
+ "adminLevel": 4,
+ "matched": false,
+ "unique": false,
+ "default": false
+ },
+ {
+ "name": "Regierungsbezirk Stuttgart",
+ "adminLevel": 5,
+ "matched": false,
+ "unique": false,
+ "default": false
+ },
+ {
+ "name": "Stuttgart",
+ "adminLevel": 6,
+ "matched": false,
+ "unique": true,
+ "default": true
+ },
+ {
+ "name": "Stuttgart-Mitte",
+ "adminLevel": 9,
+ "matched": false,
+ "unique": false,
+ "default": false
+ },
+ {
+ "name": "Hauptbahnhof",
+ "adminLevel": 10,
+ "matched": false,
+ "unique": false,
+ "default": false
+ }
+ ],
+ "score": -18.504125595092773,
+ "modes": [
+ "HIGHSPEED_RAIL",
+ "LONG_DISTANCE",
+ "NIGHT_RAIL",
+ "RIDE_SHARING",
+ "REGIONAL_RAIL",
+ "SUBURBAN",
+ "SUBWAY",
+ "TRAM",
+ "BUS"
+ ],
+ "importance": 0.019253002479672432
+ },
+ {
+ "type": "STOP",
+ "name": "Wien Hauptbahnhof",
+ "id": "at-Railway-Current-Reference-Data-2026_Pat:49:1349",
+ "lat": 48.185190000000006,
+ "lon": 16.376413,
+ "level": 1,
+ "country": "AT",
+ "zip": "1100",
+ "tz": "Europe/Vienna",
+ "areas": [
+ {
+ "name": "Österreich",
+ "adminLevel": 2,
+ "matched": false,
+ "unique": false,
+ "default": false
+ },
+ {
+ "name": "Wien",
+ "adminLevel": 4,
+ "matched": false,
+ "unique": true,
+ "default": true
+ },
+ {
+ "name": "Favoriten",
+ "adminLevel": 9,
+ "matched": false,
+ "unique": false,
+ "default": false
+ },
+ {
+ "name": "Katastralgemeinde Favoriten",
+ "adminLevel": 10,
+ "matched": false,
+ "unique": false,
+ "default": false
+ }
+ ],
+ "score": -18.438060760498047,
+ "modes": [
+ "HIGHSPEED_RAIL",
+ "LONG_DISTANCE",
+ "COACH",
+ "NIGHT_RAIL",
+ "REGIONAL_RAIL",
+ "SUBURBAN",
+ "SUBWAY",
+ "TRAM",
+ "BUS"
+ ],
+ "importance": 0.017061332240700722
+ },
+ {
+ "type": "STOP",
+ "name": "Ulm Hauptbahnhof",
+ "id": "at-Railway-Current-Reference-Data-2026_de:08421:1008:31:1",
+ "lat": 48.399345000000004,
+ "lon": 9.982933000000001,
+ "country": "DE",
+ "zip": "89073",
+ "tz": "Europe/Berlin",
+ "areas": [
+ {
+ "name": "Deutschland",
+ "adminLevel": 2,
+ "matched": false,
+ "unique": false,
+ "default": false
+ },
+ {
+ "name": "Baden-Württemberg",
+ "adminLevel": 4,
+ "matched": false,
+ "unique": false,
+ "default": false
+ },
+ {
+ "name": "Regierungsbezirk Tübingen",
+ "adminLevel": 5,
+ "matched": false,
+ "unique": false,
+ "default": false
+ },
+ {
+ "name": "Ulm",
+ "adminLevel": 6,
+ "matched": false,
+ "unique": true,
+ "default": true
+ },
+ {
+ "name": "Mitte",
+ "adminLevel": 10,
+ "matched": false,
+ "unique": false,
+ "default": false
+ }
+ ],
+ "score": -18.104284286499023,
+ "modes": [
+ "HIGHSPEED_RAIL",
+ "LONG_DISTANCE",
+ "COACH",
+ "NIGHT_RAIL",
+ "RIDE_SHARING",
+ "REGIONAL_RAIL",
+ "TRAM",
+ "BUS"
+ ],
+ "importance": 0.005886611994355917
+ }
+]
\ No newline at end of file
diff --git a/website/test/fixtures/transitous/plan.json b/website/test/fixtures/transitous/plan.json
new file mode 100644
index 000000000..d109ec472
--- /dev/null
+++ b/website/test/fixtures/transitous/plan.json
@@ -0,0 +1,1757 @@
+{
+ "requestParameters": {},
+ "from": {
+ "name": "Heidelberg, Hauptbahnhof",
+ "stopId": "de-DELFI_de:08221:1160",
+ "importance": 0.003857618197798729,
+ "lat": 49.40357,
+ "lon": 8.675442000000002,
+ "level": 0,
+ "tz": "Europe/Berlin",
+ "vertexType": "TRANSIT",
+ "modes": [
+ "HIGHSPEED_RAIL",
+ "LONG_DISTANCE",
+ "COACH",
+ "RIDE_SHARING",
+ "REGIONAL_RAIL",
+ "SUBURBAN",
+ "TRAM",
+ "BUS",
+ "ODM"
+ ]
+ },
+ "to": {
+ "name": "MILANO CENTRALE",
+ "stopId": "it-trenitalia_01700:station",
+ "importance": 0.010967501439154148,
+ "lat": 45.486340999999996,
+ "lon": 9.204544,
+ "level": 2,
+ "tz": "Europe/Rome",
+ "vertexType": "TRANSIT",
+ "modes": [
+ "HIGHSPEED_RAIL",
+ "LONG_DISTANCE",
+ "NIGHT_RAIL",
+ "REGIONAL_RAIL",
+ "SUBURBAN",
+ "TRAM",
+ "BUS"
+ ]
+ },
+ "direct": [],
+ "itineraries": [
+ {
+ "duration": 27420,
+ "startTime": "2026-10-15T05:13:00Z",
+ "endTime": "2026-10-15T12:50:00Z",
+ "transfers": 2,
+ "id": "Cq4BCgJTMxIiMjAyNjEwMTVfMDY6MjFfZGUtREVMRklfMzQ0MDQ3ODQyMhoaZGUtREVMRklfZGU6MDgyMjE6MTE2MDozOjMh+NueILGzSEAp3pIcsKtZIUAyGmRlLURFTEZJX2RlOjA4MjIyOjI0MTc6MToxOT3QCgxZvUhAQeMBZVOu8CBASNzBwdYGUJzJwdYGWghTVUJVUkJBTmABaQAAAAAAAPC/cQAAAAAAAAAACoIBGhpkZS1ERUxGSV9kZTowODIyMjoyNDE3OjE6MSE90AoMWb1IQCnjAWVTrvAgQDIaZGUtREVMRklfZGU6MDgyMjI6MjQxNzo1OjQ5NSbEXFK9SEBBcQM+P4zwIEBIlMrB1gZQjMvB1gZaBFdBTEtgAWkAAAAAAAAAAHEAAAAAAAAAAAq3AQoHSUNFIDI3NRIiMjAyNjEwMTVfMDY6NTBfZGUtREVMRklfMzQ0MDY3OTgyMxoaZGUtREVMRklfZGU6MDgyMjI6MjQxNzo1OjQhNSbEXFK9SEApcQM+P4zwIEAyGGRlLURFTEZJX2NoOjE6c2xvaWQ6MzAwMDmKCP8iaLBHQEFB0NGqlhQhQEj8zMHWBlDErcLWBloOSElHSFNQRUVEX1JBSUxgAWkAAAAAAAAAAHEAAAAAAAAAAAp9GhhkZS1ERUxGSV9jaDoxOnNsb2lkOjMwMDAhigj/ImiwR0ApQdDRqpYUIUAyF2l0LXRyZW5pdGFsaWFfODUwMDAzMDAwOT4HliNksEdAQRSuR+F6FCFASJCswtYGULyuwtYGWgRXQUxLYAFpAAAAAAAAAABxAAAAAAAAAAAK0gEKAkVDEksyMDI2MTAxNV8xMTozM19pdC10cmVuaXRhbGlhXzAwODNfNjAwODNfMF92XzYtMTktNEEyRS0wMDgzX3ZfNi0xOS00QTJFLTAwODMaF2l0LXRyZW5pdGFsaWFfODUwMDAzMDAwIT4HliNksEdAKRSuR+F6FCFAMhNpdC10cmVuaXRhbGlhXzAxNzAwORraAGxAvkZAQaEvvf25aCJASMy7wtYGUPiXw9YGWg1MT05HX0RJU1RBTkNFYAFpAAAAAAAAAABxAAAAAAAAAEA=",
+ "legs": [
+ {
+ "mode": "METRO",
+ "from": {
+ "name": "Heidelberg, Hauptbahnhof",
+ "stopId": "de-DELFI_de:08221:1160:3:3",
+ "parentId": "de-DELFI_de:08221:1160_G",
+ "importance": 0.003857618197798729,
+ "lat": 49.403842999999995,
+ "lon": 8.675138,
+ "level": -1,
+ "tz": "Europe/Berlin",
+ "departure": "2026-10-15T05:13:00Z",
+ "scheduledDeparture": "2026-10-15T05:13:00Z",
+ "scheduledTrack": "3",
+ "track": "3",
+ "description": "Gleis 2, Gleis 3",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "HIGHSPEED_RAIL",
+ "LONG_DISTANCE",
+ "COACH",
+ "RIDE_SHARING",
+ "REGIONAL_RAIL",
+ "SUBURBAN",
+ "TRAM",
+ "BUS",
+ "ODM"
+ ]
+ },
+ "to": {
+ "name": "Mannheim, Hauptbahnhof",
+ "stopId": "de-DELFI_de:08222:2417:1:1",
+ "parentId": "de-DELFI_de:08222:2417",
+ "importance": 0.0067779431119561195,
+ "lat": 49.479279999999996,
+ "lon": 8.470080000000001,
+ "level": 0,
+ "tz": "Europe/Berlin",
+ "arrival": "2026-10-15T05:31:00Z",
+ "scheduledArrival": "2026-10-15T05:29:00Z",
+ "scheduledTrack": "1",
+ "track": "1",
+ "description": "Gleis 1",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "HIGHSPEED_RAIL",
+ "LONG_DISTANCE",
+ "COACH",
+ "NIGHT_RAIL",
+ "RIDE_SHARING",
+ "REGIONAL_RAIL",
+ "SUBURBAN",
+ "TRAM",
+ "BUS"
+ ]
+ },
+ "duration": 1080,
+ "startTime": "2026-10-15T05:13:00Z",
+ "endTime": "2026-10-15T05:31:00Z",
+ "scheduledStartTime": "2026-10-15T05:13:00Z",
+ "scheduledEndTime": "2026-10-15T05:29:00Z",
+ "realTime": true,
+ "scheduled": true,
+ "interlineWithPreviousLeg": false,
+ "headsign": "Mannheim Hbf",
+ "tripFrom": {
+ "name": "Karlsruhe Hauptbahnhof",
+ "stopId": "de-DELFI_de:08212:90:4:6",
+ "parentId": "de-DELFI_de:08212:90",
+ "importance": 0.010275337845087051,
+ "lat": 48.993366,
+ "lon": 8.401277999999998,
+ "level": 0,
+ "tz": "Europe/Berlin",
+ "departure": "2026-10-15T04:21:00Z",
+ "scheduledDeparture": "2026-10-15T04:21:00Z",
+ "scheduledTrack": "6",
+ "track": "6",
+ "description": "Gleis 5+6",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "HIGHSPEED_RAIL",
+ "LONG_DISTANCE",
+ "COACH",
+ "NIGHT_RAIL",
+ "RIDE_SHARING",
+ "REGIONAL_RAIL",
+ "SUBURBAN",
+ "TRAM",
+ "BUS"
+ ]
+ },
+ "tripTo": {
+ "name": "Germersheim",
+ "stopId": "de-DELFI_de:07334:32637:4:5",
+ "importance": 0.0008799014030955732,
+ "lat": 49.225640000000006,
+ "lon": 8.364806000000002,
+ "level": 0,
+ "tz": "Europe/Berlin",
+ "arrival": "2026-10-15T06:12:00Z",
+ "scheduledArrival": "2026-10-15T06:12:00Z",
+ "scheduledTrack": "5",
+ "track": "5",
+ "description": "Gleis 4+5",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "REGIONAL_RAIL",
+ "SUBURBAN",
+ "BUS"
+ ]
+ },
+ "routeId": "de-DELFI_de:rlp:s3:_109",
+ "routeUrl": "",
+ "directionId": "1",
+ "routeColor": "fddd04",
+ "routeTextColor": "231f20",
+ "routeType": 109,
+ "agencyName": "DB Regio AG Mitte Region Südwest",
+ "agencyUrl": "",
+ "agencyFareUrl": "",
+ "agencyId": "10449",
+ "tripId": "20261015_06:21_de-DELFI_3440478422",
+ "routeShortName": "S3",
+ "routeLongName": "",
+ "tripShortName": "038310",
+ "displayName": "S3",
+ "cancelled": false,
+ "source": "de_DELFI.gtfs.zip/stop_times.txt:40919793:40919824",
+ "intermediateStops": [
+ {
+ "name": "HD-Pfaffengrund/Wieblingen",
+ "stopId": "de-DELFI_de:08221:1454:1:1",
+ "parentId": "de-DELFI_de:08221:1454",
+ "importance": 0.000958796648774296,
+ "lat": 49.41197,
+ "lon": 8.641532999999999,
+ "level": 0,
+ "tz": "Europe/Berlin",
+ "arrival": "2026-10-15T05:16:00Z",
+ "departure": "2026-10-15T05:17:00Z",
+ "scheduledArrival": "2026-10-15T05:16:00Z",
+ "scheduledDeparture": "2026-10-15T05:17:00Z",
+ "scheduledTrack": "1",
+ "track": "1",
+ "description": "Gleis 1",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "REGIONAL_RAIL",
+ "SUBURBAN",
+ "BUS",
+ "ODM"
+ ]
+ },
+ {
+ "name": "MA-Friedrichsfeld, Südbahnhof",
+ "stopId": "de-DELFI_de:08222:2334:1:1",
+ "parentId": "de-DELFI_de:08222:2334",
+ "importance": 0.000713150657247752,
+ "lat": 49.438103000000005,
+ "lon": 8.572569000000001,
+ "level": 0,
+ "tz": "Europe/Berlin",
+ "arrival": "2026-10-15T05:21:00Z",
+ "departure": "2026-10-15T05:22:00Z",
+ "scheduledArrival": "2026-10-15T05:21:00Z",
+ "scheduledDeparture": "2026-10-15T05:22:00Z",
+ "scheduledTrack": "1",
+ "track": "1",
+ "description": "Zug->Mannheim",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "SUBURBAN",
+ "BUS",
+ "ODM"
+ ]
+ }
+ ],
+ "legGeometry": {
+ "points": "u~sqF}dceAu@"
+ },
+ "bikesAllowed": false,
+ "wheelchairAccessible": "NOT_ACCESSIBLE",
+ "reservation": "NONE",
+ "alternatives": [],
+ "steps": []
+ },
+ {
+ "mode": "WALK",
+ "from": {
+ "name": "Mannheim, Hauptbahnhof",
+ "stopId": "de-DELFI_de:08222:2417:1:1",
+ "parentId": "de-DELFI_de:08222:2417",
+ "importance": 0.0067779431119561195,
+ "lat": 49.479279999999996,
+ "lon": 8.470080000000001,
+ "level": 0,
+ "tz": "Europe/Berlin",
+ "arrival": "2026-10-15T05:31:00Z",
+ "departure": "2026-10-15T05:31:00Z",
+ "scheduledArrival": "2026-10-15T05:29:00Z",
+ "scheduledDeparture": "2026-10-15T05:31:00Z",
+ "scheduledTrack": "1",
+ "track": "1",
+ "description": "Gleis 1",
+ "vertexType": "TRANSIT",
+ "cancelled": false,
+ "modes": [
+ "HIGHSPEED_RAIL",
+ "LONG_DISTANCE",
+ "COACH",
+ "NIGHT_RAIL",
+ "RIDE_SHARING",
+ "REGIONAL_RAIL",
+ "SUBURBAN",
+ "TRAM",
+ "BUS"
+ ]
+ },
+ "to": {
+ "name": "Mannheim, Hauptbahnhof",
+ "stopId": "de-DELFI_de:08222:2417:5:4",
+ "parentId": "de-DELFI_de:08222:2417",
+ "importance": 0.0067779431119561195,
+ "lat": 49.479076,
+ "lon": 8.46982,
+ "level": 0,
+ "tz": "Europe/Berlin",
+ "arrival": "2026-10-15T05:33:00Z",
+ "scheduledArrival": "2026-10-15T05:33:00Z",
+ "scheduledTrack": "4",
+ "track": "4",
+ "description": "Gleis 4, Gleis 5",
+ "vertexType": "TRANSIT",
+ "modes": [
+ "HIGHSPEED_RAIL",
+ "LONG_DISTANCE",
+ "COACH",
+ "NIGHT_RAIL",
+ "RIDE_SHARING",
+ "REGIONAL_RAIL",
+ "SUBURBAN",
+ "TRAM",
+ "BUS"
+ ]
+ },
+ "duration": 120,
+ "startTime": "2026-10-15T05:31:00Z",
+ "endTime": "2026-10-15T05:33:00Z",
+ "scheduledStartTime": "2026-10-15T05:31:00Z",
+ "scheduledEndTime": "2026-10-15T05:33:00Z",
+ "realTime": false,
+ "scheduled": false,
+ "distance": 77,
+ "legGeometry": {
+ "points": "u~sqF}dceAu@"
+ },
+ "steps": [],
+ "intermediateStops": []
+ },
+ {
+ "mode": "HIGHSPEED_RAIL",
+ "from": {
+ "name": "Mannheim, Hauptbahnhof",
+ "stopId": "de-DELFI_de:08222:2417:5:4",
+ "parentId": "de-DELFI_de:08222:2417",
+ "importance": 0.0067779431119561195,
+ "lat": 49.479076,
+ "lon": 8.46982,
+ "level": 0,
+ "tz": "Europe/Berlin",
+ "departure": "2026-10-15T05:37:00Z",
+ "scheduledDeparture": "2026-10-15T05:37:00Z",
+ "scheduledTrack": "4",
+ "track": "4",
+ "description": "Gleis 4, Gleis 5",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "HIGHSPEED_RAIL",
+ "LONG_DISTANCE",
+ "COACH",
+ "NIGHT_RAIL",
+ "RIDE_SHARING",
+ "REGIONAL_RAIL",
+ "SUBURBAN",
+ "TRAM",
+ "BUS"
+ ]
+ },
+ "to": {
+ "name": "Zürich HB",
+ "stopId": "de-DELFI_ch:1:sloid:3000",
+ "importance": 0.07083380967378616,
+ "lat": 47.378178000000005,
+ "lon": 8.540211999999999,
+ "level": 0,
+ "tz": "Europe/Zurich",
+ "arrival": "2026-10-15T09:00:00Z",
+ "scheduledArrival": "2026-10-15T09:03:00Z",
+ "track": "10",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "HIGHSPEED_RAIL",
+ "LONG_DISTANCE",
+ "NIGHT_RAIL",
+ "REGIONAL_RAIL",
+ "SUBURBAN"
+ ]
+ },
+ "duration": 12180,
+ "startTime": "2026-10-15T05:37:00Z",
+ "endTime": "2026-10-15T09:00:00Z",
+ "scheduledStartTime": "2026-10-15T05:37:00Z",
+ "scheduledEndTime": "2026-10-15T09:03:00Z",
+ "realTime": true,
+ "scheduled": true,
+ "interlineWithPreviousLeg": false,
+ "headsign": "Zürich HB",
+ "tripFrom": {
+ "name": "Basel SBB",
+ "stopId": "de-DELFI_ch:1:sloid:10",
+ "importance": 0.03557715564966202,
+ "lat": 47.547413,
+ "lon": 7.589563000000001,
+ "level": 0,
+ "tz": "Europe/Zurich",
+ "departure": "2026-10-15T08:07:00Z",
+ "scheduledDeparture": "2026-10-15T08:07:00Z",
+ "track": "4",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "HIGHSPEED_RAIL",
+ "LONG_DISTANCE",
+ "NIGHT_RAIL",
+ "REGIONAL_RAIL",
+ "SUBURBAN",
+ "TRAM",
+ "BUS"
+ ]
+ },
+ "tripTo": {
+ "name": "Basel SBB",
+ "stopId": "de-DELFI_ch:1:sloid:10",
+ "importance": 0.03557715564966202,
+ "lat": 47.547413,
+ "lon": 7.589563000000001,
+ "level": 0,
+ "tz": "Europe/Zurich",
+ "arrival": "2026-10-15T07:47:00Z",
+ "scheduledArrival": "2026-10-15T07:48:00Z",
+ "track": "4",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "HIGHSPEED_RAIL",
+ "LONG_DISTANCE",
+ "NIGHT_RAIL",
+ "REGIONAL_RAIL",
+ "SUBURBAN",
+ "TRAM",
+ "BUS"
+ ]
+ },
+ "routeId": "de-DELFI_162290_101",
+ "routeUrl": "",
+ "directionId": "1",
+ "routeType": 101,
+ "agencyName": "DB Fernverkehr AG",
+ "agencyUrl": "",
+ "agencyFareUrl": "",
+ "agencyId": "12681",
+ "tripId": "20261015_06:50_de-DELFI_3440679823",
+ "routeShortName": "ICE 275",
+ "routeLongName": "",
+ "tripShortName": "ICE 275",
+ "displayName": "ICE 275",
+ "cancelled": false,
+ "source": "de_DELFI.gtfs.zip/stop_times.txt:39893110:39893116",
+ "intermediateStops": [
+ {
+ "name": "Karlsruhe Hauptbahnhof",
+ "stopId": "de-DELFI_de:08212:90:2:2",
+ "parentId": "de-DELFI_de:08212:90",
+ "importance": 0.010275337845087051,
+ "lat": 48.99373200000001,
+ "lon": 8.401070999999998,
+ "level": 1,
+ "tz": "Europe/Berlin",
+ "arrival": "2026-10-15T05:59:00Z",
+ "departure": "2026-10-15T06:01:00Z",
+ "scheduledArrival": "2026-10-15T05:59:00Z",
+ "scheduledDeparture": "2026-10-15T06:01:00Z",
+ "scheduledTrack": "2",
+ "track": "2",
+ "description": "Gleis 1+2",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "HIGHSPEED_RAIL",
+ "LONG_DISTANCE",
+ "COACH",
+ "NIGHT_RAIL",
+ "RIDE_SHARING",
+ "REGIONAL_RAIL",
+ "SUBURBAN",
+ "TRAM",
+ "BUS"
+ ]
+ },
+ {
+ "name": "Offenburg Bahnhof",
+ "stopId": "de-DELFI_de:08317:14506:1:1",
+ "parentId": "de-DELFI_de:08317:14506",
+ "importance": 0.002785325516015291,
+ "lat": 48.47649,
+ "lon": 7.946129000000001,
+ "level": 0,
+ "tz": "Europe/Berlin",
+ "arrival": "2026-10-15T06:29:00Z",
+ "departure": "2026-10-15T06:30:00Z",
+ "scheduledArrival": "2026-10-15T06:29:00Z",
+ "scheduledDeparture": "2026-10-15T06:30:00Z",
+ "scheduledTrack": "1",
+ "track": "1",
+ "description": "Gleis 1+2",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "HIGHSPEED_RAIL",
+ "LONG_DISTANCE",
+ "NIGHT_RAIL",
+ "REGIONAL_RAIL",
+ "BUS"
+ ]
+ }
+ ],
+ "legGeometry": {
+ "points": "u~sqF}dceAu@"
+ },
+ "bikesAllowed": false,
+ "wheelchairAccessible": "NOT_ACCESSIBLE",
+ "reservation": "NONE",
+ "alternatives": [],
+ "steps": []
+ },
+ {
+ "mode": "WALK",
+ "from": {
+ "name": "Zürich HB",
+ "stopId": "de-DELFI_ch:1:sloid:3000",
+ "importance": 0.07083380967378616,
+ "lat": 47.378178000000005,
+ "lon": 8.540211999999999,
+ "level": 0,
+ "tz": "Europe/Zurich",
+ "arrival": "2026-10-15T09:00:00Z",
+ "departure": "2026-10-15T09:00:00Z",
+ "scheduledArrival": "2026-10-15T09:03:00Z",
+ "scheduledDeparture": "2026-10-15T09:00:00Z",
+ "track": "10",
+ "vertexType": "TRANSIT",
+ "cancelled": false,
+ "modes": [
+ "HIGHSPEED_RAIL",
+ "LONG_DISTANCE",
+ "NIGHT_RAIL",
+ "REGIONAL_RAIL",
+ "SUBURBAN"
+ ]
+ },
+ "to": {
+ "name": "ZUERICH HB",
+ "stopId": "it-trenitalia_850003000",
+ "parentId": "it-trenitalia_850003000:station",
+ "importance": 0.07083380967378616,
+ "lat": 47.378056,
+ "lon": 8.54,
+ "level": 0,
+ "tz": "Europe/Zurich",
+ "arrival": "2026-10-15T09:05:00Z",
+ "scheduledArrival": "2026-10-15T09:05:00Z",
+ "vertexType": "TRANSIT",
+ "modes": [
+ "HIGHSPEED_RAIL",
+ "LONG_DISTANCE",
+ "NIGHT_RAIL",
+ "REGIONAL_RAIL",
+ "SUBURBAN"
+ ]
+ },
+ "duration": 300,
+ "startTime": "2026-10-15T09:00:00Z",
+ "endTime": "2026-10-15T09:05:00Z",
+ "scheduledStartTime": "2026-10-15T09:00:00Z",
+ "scheduledEndTime": "2026-10-15T09:05:00Z",
+ "realTime": false,
+ "scheduled": false,
+ "distance": 117,
+ "legGeometry": {
+ "points": "u~sqF}dceAu@"
+ },
+ "steps": [],
+ "intermediateStops": []
+ },
+ {
+ "mode": "LONG_DISTANCE",
+ "from": {
+ "name": "ZUERICH HB",
+ "stopId": "it-trenitalia_850003000",
+ "parentId": "it-trenitalia_850003000:station",
+ "importance": 0.07083380967378616,
+ "lat": 47.378056,
+ "lon": 8.54,
+ "level": 0,
+ "tz": "Europe/Zurich",
+ "departure": "2026-10-15T09:33:00Z",
+ "scheduledDeparture": "2026-10-15T09:33:00Z",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "HIGHSPEED_RAIL",
+ "LONG_DISTANCE",
+ "NIGHT_RAIL",
+ "REGIONAL_RAIL",
+ "SUBURBAN"
+ ]
+ },
+ "to": {
+ "name": "MILANO CENTRALE",
+ "stopId": "it-trenitalia_01700",
+ "parentId": "it-trenitalia_01700:station",
+ "importance": 0.010967501439154148,
+ "lat": 45.486340999999996,
+ "lon": 9.204544,
+ "level": 2,
+ "tz": "Europe/Rome",
+ "arrival": "2026-10-15T12:50:00Z",
+ "scheduledArrival": "2026-10-15T12:50:00Z",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "HIGHSPEED_RAIL",
+ "LONG_DISTANCE",
+ "NIGHT_RAIL",
+ "REGIONAL_RAIL",
+ "SUBURBAN",
+ "TRAM",
+ "BUS"
+ ]
+ },
+ "duration": 11820,
+ "startTime": "2026-10-15T09:33:00Z",
+ "endTime": "2026-10-15T12:50:00Z",
+ "scheduledStartTime": "2026-10-15T09:33:00Z",
+ "scheduledEndTime": "2026-10-15T12:50:00Z",
+ "realTime": false,
+ "scheduled": true,
+ "interlineWithPreviousLeg": false,
+ "headsign": "MILANO CENTRALE",
+ "tripFrom": {
+ "name": "ZUERICH HB",
+ "stopId": "it-trenitalia_850003000",
+ "parentId": "it-trenitalia_850003000:station",
+ "importance": 0.07083380967378616,
+ "lat": 47.378056,
+ "lon": 8.54,
+ "level": 0,
+ "tz": "Europe/Zurich",
+ "departure": "2026-10-15T09:33:00Z",
+ "scheduledDeparture": "2026-10-15T09:33:00Z",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "HIGHSPEED_RAIL",
+ "LONG_DISTANCE",
+ "NIGHT_RAIL",
+ "REGIONAL_RAIL",
+ "SUBURBAN"
+ ]
+ },
+ "tripTo": {
+ "name": "MILANO CENTRALE",
+ "stopId": "it-trenitalia_01700",
+ "parentId": "it-trenitalia_01700:station",
+ "importance": 0.010967501439154148,
+ "lat": 45.486340999999996,
+ "lon": 9.204544,
+ "level": 2,
+ "tz": "Europe/Rome",
+ "arrival": "2026-10-15T12:50:00Z",
+ "scheduledArrival": "2026-10-15T12:50:00Z",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "HIGHSPEED_RAIL",
+ "LONG_DISTANCE",
+ "NIGHT_RAIL",
+ "REGIONAL_RAIL",
+ "SUBURBAN",
+ "TRAM",
+ "BUS"
+ ]
+ },
+ "routeId": "it-trenitalia_60083_7cf9622d2ca9dab7",
+ "routeUrl": "",
+ "directionId": "1",
+ "routeColor": "1f6fb2",
+ "routeTextColor": "ffffff",
+ "routeType": 102,
+ "agencyName": "TRENITALIA",
+ "agencyUrl": "http://www.trenitalia.com",
+ "agencyFareUrl": "",
+ "agencyId": "TRENITALIA",
+ "tripId": "20261015_11:33_it-trenitalia_0083_60083_0_v_6-19-4A2E-0083_v_6-19-4A2E-0083",
+ "routeShortName": "EC",
+ "routeLongName": "Eurocity",
+ "tripShortName": "19",
+ "displayName": "EC",
+ "cancelled": false,
+ "source": "it_trenitalia.gtfs.zip/stop_times.txt:116621:116628",
+ "intermediateStops": [
+ {
+ "name": "ZUG(CH)",
+ "stopId": "it-trenitalia_850002204",
+ "parentId": "it-trenitalia_850002204:station",
+ "importance": 0.0008505891892127693,
+ "lat": 47.173611,
+ "lon": 8.515277999999999,
+ "level": 1,
+ "tz": "Europe/Zurich",
+ "arrival": "2026-10-15T09:59:00Z",
+ "departure": "2026-10-15T10:00:00Z",
+ "scheduledArrival": "2026-10-15T09:59:00Z",
+ "scheduledDeparture": "2026-10-15T10:00:00Z",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "LONG_DISTANCE",
+ "REGIONAL_RAIL"
+ ]
+ },
+ {
+ "name": "ARTH-GOLDAU",
+ "stopId": "it-trenitalia_850005004",
+ "parentId": "it-trenitalia_850005004:station",
+ "importance": 0.010756864212453365,
+ "lat": 47.048888999999996,
+ "lon": 8.549444000000001,
+ "level": 0,
+ "tz": "Europe/Zurich",
+ "arrival": "2026-10-15T10:16:00Z",
+ "departure": "2026-10-15T10:18:00Z",
+ "scheduledArrival": "2026-10-15T10:16:00Z",
+ "scheduledDeparture": "2026-10-15T10:18:00Z",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "LONG_DISTANCE",
+ "NIGHT_RAIL",
+ "REGIONAL_RAIL",
+ "SUBURBAN",
+ "BUS",
+ "FUNICULAR"
+ ]
+ }
+ ],
+ "legGeometry": {
+ "points": "u~sqF}dceAu@"
+ },
+ "bikesAllowed": false,
+ "wheelchairAccessible": "NOT_ACCESSIBLE",
+ "reservation": "NONE",
+ "alternatives": [],
+ "steps": []
+ }
+ ]
+ },
+ {
+ "duration": 25440,
+ "startTime": "2026-10-15T05:13:00Z",
+ "endTime": "2026-10-15T12:17:00Z",
+ "transfers": 3,
+ "id": "Cq4BCgJTMxIiMjAyNjEwMTVfMDY6MjFfZGUtREVMRklfMzQ0MDQ3ODQyMhoaZGUtREVMRklfZGU6MDgyMjE6MTE2MDozOjMh+NueILGzSEAp3pIcsKtZIUAyGmRlLURFTEZJX2RlOjA4MjIyOjI0MTc6MToxOT3QCgxZvUhAQeMBZVOu8CBASNzBwdYGUJzJwdYGWghTVUJVUkJBTmABaQAAAAAAAPC/cQAAAAAAAAAACoIBGhpkZS1ERUxGSV9kZTowODIyMjoyNDE3OjE6MSE90AoMWb1IQCnjAWVTrvAgQDIaZGUtREVMRklfZGU6MDgyMjI6MjQxNzo1OjQ5NSbEXFK9SEBBcQM+P4zwIEBIlMrB1gZQjMvB1gZaBFdBTEtgAWkAAAAAAAAAAHEAAAAAAAAAAAq3AQoHSUNFIDI3NRIiMjAyNjEwMTVfMDY6NTBfZGUtREVMRklfMzQ0MDY3OTgyMxoaZGUtREVMRklfZGU6MDgyMjI6MjQxNzo1OjQhNSbEXFK9SEApcQM+P4zwIEAyGGRlLURFTEZJX2NoOjE6c2xvaWQ6MzAwMDmKCP8iaLBHQEFB0NGqlhQhQEj8zMHWBlDErcLWBloOSElHSFNQRUVEX1JBSUxgAWkAAAAAAAAAAHEAAAAAAAAAAAqVARoYZGUtREVMRklfY2g6MTpzbG9pZDozMDAwIYoI/yJosEdAKUHQ0aqWFCFAMi9jaC1vcGVudHJhbnNwb3J0ZGF0YXN3aXNzMjZfY2g6MTpzbG9pZDozMDAwOjU6ODmwHCEDebBHQEGBQGfSphIhQEiQrMLWBlC8rsLWBloEV0FMS2ABaQAAAAAAAAAAcQAAAAAAAAAACvYBCgNJQzISQzIwMjYxMDE1XzExOjA1X2NoLW9wZW50cmFuc3BvcnRkYXRhc3dpc3MyNl8ub2pwLTkxLTItRy4xLlRBLjE2NC5qMjYaL2NoLW9wZW50cmFuc3BvcnRkYXRhc3dpc3MyNl9jaDoxOnNsb2lkOjMwMDA6NTo4IbAcIQN5sEdAKYFAZ9KmEiFAMi9jaC1vcGVudHJhbnNwb3J0ZGF0YXN3aXNzMjZfY2g6MTpzbG9pZDo1MzAwOjI6Mjkq/1peuQBHQEEff2lRn+QhQEi8rsLWBlC448LWBloNTE9OR19ESVNUQU5DRWABaQAAAAAAAAAACpoBGi9jaC1vcGVudHJhbnNwb3J0ZGF0YXN3aXNzMjZfY2g6MTpzbG9pZDo1MzAwOjI6MiEq/1peuQBHQCkff2lRn+QhQDIvY2gtb3BlbnRyYW5zcG9ydGRhdGFzd2lzczI2X2NoOjE6c2xvaWQ6NTMwMDoxOjE5ct9qnbgAR0BBSMfVyK7kIUBIuOPC1gZQqOXC1gZaBFdBTEtgAQrqAQoEUkU4MBJCMjAyNjEwMTVfMTI6MjJfY2gtb3BlbnRyYW5zcG9ydGRhdGFzd2lzczI2Xy5vanAtOTEtODAuMS5UQS45MTUuajI2Gi9jaC1vcGVudHJhbnNwb3J0ZGF0YXN3aXNzMjZfY2g6MTpzbG9pZDo1MzAwOjE6MSFy32qduABHQClIx9XIruQhQDIjY2gtb3BlbnRyYW5zcG9ydGRhdGFzd2lzczI2XzgzMDE3MDA59dVVgVq+RkBBqwDfbd5oIkBIqOXC1gZQvIjD1gZaDVJFR0lPTkFMX1JBSUxgAXEAAAAAAAAAQA==",
+ "legs": [
+ {
+ "mode": "METRO",
+ "from": {
+ "name": "Heidelberg, Hauptbahnhof",
+ "stopId": "de-DELFI_de:08221:1160:3:3",
+ "parentId": "de-DELFI_de:08221:1160_G",
+ "importance": 0.003857618197798729,
+ "lat": 49.403842999999995,
+ "lon": 8.675138,
+ "level": -1,
+ "tz": "Europe/Berlin",
+ "departure": "2026-10-15T05:13:00Z",
+ "scheduledDeparture": "2026-10-15T05:13:00Z",
+ "scheduledTrack": "3",
+ "track": "3",
+ "description": "Gleis 2, Gleis 3",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "HIGHSPEED_RAIL",
+ "LONG_DISTANCE",
+ "COACH",
+ "RIDE_SHARING",
+ "REGIONAL_RAIL",
+ "SUBURBAN",
+ "TRAM",
+ "BUS",
+ "ODM"
+ ]
+ },
+ "to": {
+ "name": "Mannheim, Hauptbahnhof",
+ "stopId": "de-DELFI_de:08222:2417:1:1",
+ "parentId": "de-DELFI_de:08222:2417",
+ "importance": 0.0067779431119561195,
+ "lat": 49.479279999999996,
+ "lon": 8.470080000000001,
+ "level": 0,
+ "tz": "Europe/Berlin",
+ "arrival": "2026-10-15T05:31:00Z",
+ "scheduledArrival": "2026-10-15T05:29:00Z",
+ "scheduledTrack": "1",
+ "track": "1",
+ "description": "Gleis 1",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "HIGHSPEED_RAIL",
+ "LONG_DISTANCE",
+ "COACH",
+ "NIGHT_RAIL",
+ "RIDE_SHARING",
+ "REGIONAL_RAIL",
+ "SUBURBAN",
+ "TRAM",
+ "BUS"
+ ]
+ },
+ "duration": 1080,
+ "startTime": "2026-10-15T05:13:00Z",
+ "endTime": "2026-10-15T05:31:00Z",
+ "scheduledStartTime": "2026-10-15T05:13:00Z",
+ "scheduledEndTime": "2026-10-15T05:29:00Z",
+ "realTime": true,
+ "scheduled": true,
+ "interlineWithPreviousLeg": false,
+ "headsign": "Mannheim Hbf",
+ "tripFrom": {
+ "name": "Karlsruhe Hauptbahnhof",
+ "stopId": "de-DELFI_de:08212:90:4:6",
+ "parentId": "de-DELFI_de:08212:90",
+ "importance": 0.010275337845087051,
+ "lat": 48.993366,
+ "lon": 8.401277999999998,
+ "level": 0,
+ "tz": "Europe/Berlin",
+ "departure": "2026-10-15T04:21:00Z",
+ "scheduledDeparture": "2026-10-15T04:21:00Z",
+ "scheduledTrack": "6",
+ "track": "6",
+ "description": "Gleis 5+6",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "HIGHSPEED_RAIL",
+ "LONG_DISTANCE",
+ "COACH",
+ "NIGHT_RAIL",
+ "RIDE_SHARING",
+ "REGIONAL_RAIL",
+ "SUBURBAN",
+ "TRAM",
+ "BUS"
+ ]
+ },
+ "tripTo": {
+ "name": "Germersheim",
+ "stopId": "de-DELFI_de:07334:32637:4:5",
+ "importance": 0.0008799014030955732,
+ "lat": 49.225640000000006,
+ "lon": 8.364806000000002,
+ "level": 0,
+ "tz": "Europe/Berlin",
+ "arrival": "2026-10-15T06:12:00Z",
+ "scheduledArrival": "2026-10-15T06:12:00Z",
+ "scheduledTrack": "5",
+ "track": "5",
+ "description": "Gleis 4+5",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "REGIONAL_RAIL",
+ "SUBURBAN",
+ "BUS"
+ ]
+ },
+ "routeId": "de-DELFI_de:rlp:s3:_109",
+ "routeUrl": "",
+ "directionId": "1",
+ "routeColor": "fddd04",
+ "routeTextColor": "231f20",
+ "routeType": 109,
+ "agencyName": "DB Regio AG Mitte Region Südwest",
+ "agencyUrl": "",
+ "agencyFareUrl": "",
+ "agencyId": "10449",
+ "tripId": "20261015_06:21_de-DELFI_3440478422",
+ "routeShortName": "S3",
+ "routeLongName": "",
+ "tripShortName": "038310",
+ "displayName": "S3",
+ "cancelled": false,
+ "source": "de_DELFI.gtfs.zip/stop_times.txt:40919793:40919824",
+ "intermediateStops": [
+ {
+ "name": "HD-Pfaffengrund/Wieblingen",
+ "stopId": "de-DELFI_de:08221:1454:1:1",
+ "parentId": "de-DELFI_de:08221:1454",
+ "importance": 0.000958796648774296,
+ "lat": 49.41197,
+ "lon": 8.641532999999999,
+ "level": 0,
+ "tz": "Europe/Berlin",
+ "arrival": "2026-10-15T05:16:00Z",
+ "departure": "2026-10-15T05:17:00Z",
+ "scheduledArrival": "2026-10-15T05:16:00Z",
+ "scheduledDeparture": "2026-10-15T05:17:00Z",
+ "scheduledTrack": "1",
+ "track": "1",
+ "description": "Gleis 1",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "REGIONAL_RAIL",
+ "SUBURBAN",
+ "BUS",
+ "ODM"
+ ]
+ },
+ {
+ "name": "MA-Friedrichsfeld, Südbahnhof",
+ "stopId": "de-DELFI_de:08222:2334:1:1",
+ "parentId": "de-DELFI_de:08222:2334",
+ "importance": 0.000713150657247752,
+ "lat": 49.438103000000005,
+ "lon": 8.572569000000001,
+ "level": 0,
+ "tz": "Europe/Berlin",
+ "arrival": "2026-10-15T05:21:00Z",
+ "departure": "2026-10-15T05:22:00Z",
+ "scheduledArrival": "2026-10-15T05:21:00Z",
+ "scheduledDeparture": "2026-10-15T05:22:00Z",
+ "scheduledTrack": "1",
+ "track": "1",
+ "description": "Zug->Mannheim",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "SUBURBAN",
+ "BUS",
+ "ODM"
+ ]
+ }
+ ],
+ "legGeometry": {
+ "points": "u~sqF}dceAu@"
+ },
+ "bikesAllowed": false,
+ "wheelchairAccessible": "NOT_ACCESSIBLE",
+ "reservation": "NONE",
+ "alternatives": [],
+ "steps": []
+ },
+ {
+ "mode": "WALK",
+ "from": {
+ "name": "Mannheim, Hauptbahnhof",
+ "stopId": "de-DELFI_de:08222:2417:1:1",
+ "parentId": "de-DELFI_de:08222:2417",
+ "importance": 0.0067779431119561195,
+ "lat": 49.479279999999996,
+ "lon": 8.470080000000001,
+ "level": 0,
+ "tz": "Europe/Berlin",
+ "arrival": "2026-10-15T05:31:00Z",
+ "departure": "2026-10-15T05:31:00Z",
+ "scheduledArrival": "2026-10-15T05:29:00Z",
+ "scheduledDeparture": "2026-10-15T05:31:00Z",
+ "scheduledTrack": "1",
+ "track": "1",
+ "description": "Gleis 1",
+ "vertexType": "TRANSIT",
+ "cancelled": false,
+ "modes": [
+ "HIGHSPEED_RAIL",
+ "LONG_DISTANCE",
+ "COACH",
+ "NIGHT_RAIL",
+ "RIDE_SHARING",
+ "REGIONAL_RAIL",
+ "SUBURBAN",
+ "TRAM",
+ "BUS"
+ ]
+ },
+ "to": {
+ "name": "Mannheim, Hauptbahnhof",
+ "stopId": "de-DELFI_de:08222:2417:5:4",
+ "parentId": "de-DELFI_de:08222:2417",
+ "importance": 0.0067779431119561195,
+ "lat": 49.479076,
+ "lon": 8.46982,
+ "level": 0,
+ "tz": "Europe/Berlin",
+ "arrival": "2026-10-15T05:33:00Z",
+ "scheduledArrival": "2026-10-15T05:33:00Z",
+ "scheduledTrack": "4",
+ "track": "4",
+ "description": "Gleis 4, Gleis 5",
+ "vertexType": "TRANSIT",
+ "modes": [
+ "HIGHSPEED_RAIL",
+ "LONG_DISTANCE",
+ "COACH",
+ "NIGHT_RAIL",
+ "RIDE_SHARING",
+ "REGIONAL_RAIL",
+ "SUBURBAN",
+ "TRAM",
+ "BUS"
+ ]
+ },
+ "duration": 120,
+ "startTime": "2026-10-15T05:31:00Z",
+ "endTime": "2026-10-15T05:33:00Z",
+ "scheduledStartTime": "2026-10-15T05:31:00Z",
+ "scheduledEndTime": "2026-10-15T05:33:00Z",
+ "realTime": false,
+ "scheduled": false,
+ "distance": 77,
+ "legGeometry": {
+ "points": "u~sqF}dceAu@"
+ },
+ "steps": [],
+ "intermediateStops": []
+ },
+ {
+ "mode": "HIGHSPEED_RAIL",
+ "from": {
+ "name": "Mannheim, Hauptbahnhof",
+ "stopId": "de-DELFI_de:08222:2417:5:4",
+ "parentId": "de-DELFI_de:08222:2417",
+ "importance": 0.0067779431119561195,
+ "lat": 49.479076,
+ "lon": 8.46982,
+ "level": 0,
+ "tz": "Europe/Berlin",
+ "departure": "2026-10-15T05:37:00Z",
+ "scheduledDeparture": "2026-10-15T05:37:00Z",
+ "scheduledTrack": "4",
+ "track": "4",
+ "description": "Gleis 4, Gleis 5",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "HIGHSPEED_RAIL",
+ "LONG_DISTANCE",
+ "COACH",
+ "NIGHT_RAIL",
+ "RIDE_SHARING",
+ "REGIONAL_RAIL",
+ "SUBURBAN",
+ "TRAM",
+ "BUS"
+ ]
+ },
+ "to": {
+ "name": "Zürich HB",
+ "stopId": "de-DELFI_ch:1:sloid:3000",
+ "importance": 0.07083380967378616,
+ "lat": 47.378178000000005,
+ "lon": 8.540211999999999,
+ "level": 0,
+ "tz": "Europe/Zurich",
+ "arrival": "2026-10-15T09:00:00Z",
+ "scheduledArrival": "2026-10-15T09:03:00Z",
+ "track": "10",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "HIGHSPEED_RAIL",
+ "LONG_DISTANCE",
+ "NIGHT_RAIL",
+ "REGIONAL_RAIL",
+ "SUBURBAN"
+ ]
+ },
+ "duration": 12180,
+ "startTime": "2026-10-15T05:37:00Z",
+ "endTime": "2026-10-15T09:00:00Z",
+ "scheduledStartTime": "2026-10-15T05:37:00Z",
+ "scheduledEndTime": "2026-10-15T09:03:00Z",
+ "realTime": true,
+ "scheduled": true,
+ "interlineWithPreviousLeg": false,
+ "headsign": "Zürich HB",
+ "tripFrom": {
+ "name": "Basel SBB",
+ "stopId": "de-DELFI_ch:1:sloid:10",
+ "importance": 0.03557715564966202,
+ "lat": 47.547413,
+ "lon": 7.589563000000001,
+ "level": 0,
+ "tz": "Europe/Zurich",
+ "departure": "2026-10-15T08:07:00Z",
+ "scheduledDeparture": "2026-10-15T08:07:00Z",
+ "track": "4",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "HIGHSPEED_RAIL",
+ "LONG_DISTANCE",
+ "NIGHT_RAIL",
+ "REGIONAL_RAIL",
+ "SUBURBAN",
+ "TRAM",
+ "BUS"
+ ]
+ },
+ "tripTo": {
+ "name": "Basel SBB",
+ "stopId": "de-DELFI_ch:1:sloid:10",
+ "importance": 0.03557715564966202,
+ "lat": 47.547413,
+ "lon": 7.589563000000001,
+ "level": 0,
+ "tz": "Europe/Zurich",
+ "arrival": "2026-10-15T07:47:00Z",
+ "scheduledArrival": "2026-10-15T07:48:00Z",
+ "track": "4",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "HIGHSPEED_RAIL",
+ "LONG_DISTANCE",
+ "NIGHT_RAIL",
+ "REGIONAL_RAIL",
+ "SUBURBAN",
+ "TRAM",
+ "BUS"
+ ]
+ },
+ "routeId": "de-DELFI_162290_101",
+ "routeUrl": "",
+ "directionId": "1",
+ "routeType": 101,
+ "agencyName": "DB Fernverkehr AG",
+ "agencyUrl": "",
+ "agencyFareUrl": "",
+ "agencyId": "12681",
+ "tripId": "20261015_06:50_de-DELFI_3440679823",
+ "routeShortName": "ICE 275",
+ "routeLongName": "",
+ "tripShortName": "ICE 275",
+ "displayName": "ICE 275",
+ "cancelled": false,
+ "source": "de_DELFI.gtfs.zip/stop_times.txt:39893110:39893116",
+ "intermediateStops": [
+ {
+ "name": "Karlsruhe Hauptbahnhof",
+ "stopId": "de-DELFI_de:08212:90:2:2",
+ "parentId": "de-DELFI_de:08212:90",
+ "importance": 0.010275337845087051,
+ "lat": 48.99373200000001,
+ "lon": 8.401070999999998,
+ "level": 1,
+ "tz": "Europe/Berlin",
+ "arrival": "2026-10-15T05:59:00Z",
+ "departure": "2026-10-15T06:01:00Z",
+ "scheduledArrival": "2026-10-15T05:59:00Z",
+ "scheduledDeparture": "2026-10-15T06:01:00Z",
+ "scheduledTrack": "2",
+ "track": "2",
+ "description": "Gleis 1+2",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "HIGHSPEED_RAIL",
+ "LONG_DISTANCE",
+ "COACH",
+ "NIGHT_RAIL",
+ "RIDE_SHARING",
+ "REGIONAL_RAIL",
+ "SUBURBAN",
+ "TRAM",
+ "BUS"
+ ]
+ },
+ {
+ "name": "Offenburg Bahnhof",
+ "stopId": "de-DELFI_de:08317:14506:1:1",
+ "parentId": "de-DELFI_de:08317:14506",
+ "importance": 0.002785325516015291,
+ "lat": 48.47649,
+ "lon": 7.946129000000001,
+ "level": 0,
+ "tz": "Europe/Berlin",
+ "arrival": "2026-10-15T06:29:00Z",
+ "departure": "2026-10-15T06:30:00Z",
+ "scheduledArrival": "2026-10-15T06:29:00Z",
+ "scheduledDeparture": "2026-10-15T06:30:00Z",
+ "scheduledTrack": "1",
+ "track": "1",
+ "description": "Gleis 1+2",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "HIGHSPEED_RAIL",
+ "LONG_DISTANCE",
+ "NIGHT_RAIL",
+ "REGIONAL_RAIL",
+ "BUS"
+ ]
+ }
+ ],
+ "legGeometry": {
+ "points": "u~sqF}dceAu@"
+ },
+ "bikesAllowed": false,
+ "wheelchairAccessible": "NOT_ACCESSIBLE",
+ "reservation": "NONE",
+ "alternatives": [],
+ "steps": []
+ },
+ {
+ "mode": "WALK",
+ "from": {
+ "name": "Zürich HB",
+ "stopId": "de-DELFI_ch:1:sloid:3000",
+ "importance": 0.07083380967378616,
+ "lat": 47.378178000000005,
+ "lon": 8.540211999999999,
+ "level": 0,
+ "tz": "Europe/Zurich",
+ "arrival": "2026-10-15T09:00:00Z",
+ "departure": "2026-10-15T09:00:00Z",
+ "scheduledArrival": "2026-10-15T09:03:00Z",
+ "scheduledDeparture": "2026-10-15T09:00:00Z",
+ "track": "10",
+ "vertexType": "TRANSIT",
+ "cancelled": false,
+ "modes": [
+ "HIGHSPEED_RAIL",
+ "LONG_DISTANCE",
+ "NIGHT_RAIL",
+ "REGIONAL_RAIL",
+ "SUBURBAN"
+ ]
+ },
+ "to": {
+ "name": "Zürich HB",
+ "stopId": "ch-opentransportdataswiss26_ch:1:sloid:3000:5:8",
+ "parentId": "ch-opentransportdataswiss26_Parentch:1:sloid:3000",
+ "importance": 0.07083380967378616,
+ "lat": 47.378693,
+ "lon": 8.536429,
+ "level": 0,
+ "tz": "Europe/Zurich",
+ "arrival": "2026-10-15T09:05:00Z",
+ "scheduledArrival": "2026-10-15T09:05:00Z",
+ "scheduledTrack": "8",
+ "track": "8",
+ "vertexType": "TRANSIT",
+ "modes": [
+ "HIGHSPEED_RAIL",
+ "LONG_DISTANCE",
+ "NIGHT_RAIL",
+ "REGIONAL_RAIL",
+ "SUBURBAN"
+ ]
+ },
+ "duration": 300,
+ "startTime": "2026-10-15T09:00:00Z",
+ "endTime": "2026-10-15T09:05:00Z",
+ "scheduledStartTime": "2026-10-15T09:00:00Z",
+ "scheduledEndTime": "2026-10-15T09:05:00Z",
+ "realTime": false,
+ "scheduled": false,
+ "distance": 421,
+ "legGeometry": {
+ "points": "u~sqF}dceAu@"
+ },
+ "steps": [],
+ "intermediateStops": []
+ },
+ {
+ "mode": "LONG_DISTANCE",
+ "from": {
+ "name": "Zürich HB",
+ "stopId": "ch-opentransportdataswiss26_ch:1:sloid:3000:5:8",
+ "parentId": "ch-opentransportdataswiss26_Parentch:1:sloid:3000",
+ "importance": 0.07083380967378616,
+ "lat": 47.378693,
+ "lon": 8.536429,
+ "level": 0,
+ "tz": "Europe/Zurich",
+ "departure": "2026-10-15T09:05:00Z",
+ "scheduledDeparture": "2026-10-15T09:05:00Z",
+ "scheduledTrack": "8",
+ "track": "8",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "HIGHSPEED_RAIL",
+ "LONG_DISTANCE",
+ "NIGHT_RAIL",
+ "REGIONAL_RAIL",
+ "SUBURBAN"
+ ]
+ },
+ "to": {
+ "name": "Lugano",
+ "stopId": "ch-opentransportdataswiss26_ch:1:sloid:5300:2:2",
+ "parentId": "ch-opentransportdataswiss26_Parentch:1:sloid:5300",
+ "importance": 0.013114487752318382,
+ "lat": 46.005657,
+ "lon": 8.946527999999999,
+ "level": 0,
+ "tz": "Europe/Zurich",
+ "arrival": "2026-10-15T10:58:00Z",
+ "scheduledArrival": "2026-10-15T10:58:00Z",
+ "scheduledTrack": "2",
+ "track": "2",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "LONG_DISTANCE",
+ "NIGHT_RAIL",
+ "REGIONAL_RAIL",
+ "SUBURBAN"
+ ]
+ },
+ "duration": 6780,
+ "startTime": "2026-10-15T09:05:00Z",
+ "endTime": "2026-10-15T10:58:00Z",
+ "scheduledStartTime": "2026-10-15T09:05:00Z",
+ "scheduledEndTime": "2026-10-15T10:58:00Z",
+ "realTime": false,
+ "scheduled": true,
+ "interlineWithPreviousLeg": false,
+ "headsign": "Lugano",
+ "tripFrom": {
+ "name": "Zürich HB",
+ "stopId": "ch-opentransportdataswiss26_ch:1:sloid:3000:5:8",
+ "parentId": "ch-opentransportdataswiss26_Parentch:1:sloid:3000",
+ "importance": 0.07083380967378616,
+ "lat": 47.378693,
+ "lon": 8.536429,
+ "level": 0,
+ "tz": "Europe/Zurich",
+ "departure": "2026-10-15T09:05:00Z",
+ "scheduledDeparture": "2026-10-15T09:05:00Z",
+ "scheduledTrack": "8",
+ "track": "8",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "HIGHSPEED_RAIL",
+ "LONG_DISTANCE",
+ "NIGHT_RAIL",
+ "REGIONAL_RAIL",
+ "SUBURBAN"
+ ]
+ },
+ "tripTo": {
+ "name": "Lugano",
+ "stopId": "ch-opentransportdataswiss26_ch:1:sloid:5300:2:2",
+ "parentId": "ch-opentransportdataswiss26_Parentch:1:sloid:5300",
+ "importance": 0.013114487752318382,
+ "lat": 46.005657,
+ "lon": 8.946527999999999,
+ "level": 0,
+ "tz": "Europe/Zurich",
+ "arrival": "2026-10-15T10:58:00Z",
+ "scheduledArrival": "2026-10-15T10:58:00Z",
+ "scheduledTrack": "2",
+ "track": "2",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "LONG_DISTANCE",
+ "NIGHT_RAIL",
+ "REGIONAL_RAIL",
+ "SUBURBAN"
+ ]
+ },
+ "routeId": "ch-opentransportdataswiss26_91-2-G-j26-1",
+ "routeUrl": "",
+ "directionId": "0",
+ "routeType": 102,
+ "agencyName": "Schweizerische Bundesbahnen SBB",
+ "agencyUrl": "https://sbb.ch",
+ "agencyFareUrl": "",
+ "agencyId": "11",
+ "tripId": "20261015_11:05_ch-opentransportdataswiss26_.ojp-91-2-G.1.TA.164.j26",
+ "routeShortName": "IC2",
+ "routeLongName": "",
+ "tripShortName": "869",
+ "displayName": "IC2",
+ "cancelled": false,
+ "source": "ch_opentransportdataswiss26.gtfs.zip/stop_times.txt:108396:108401",
+ "intermediateStops": [
+ {
+ "name": "Zug",
+ "stopId": "ch-opentransportdataswiss26_ch:1:sloid:2204:1:2",
+ "parentId": "ch-opentransportdataswiss26_Parentch:1:sloid:2204",
+ "importance": 0.014396363869309425,
+ "lat": 47.174859999999995,
+ "lon": 8.515957,
+ "level": 1,
+ "tz": "Europe/Zurich",
+ "arrival": "2026-10-15T09:29:00Z",
+ "departure": "2026-10-15T09:30:00Z",
+ "scheduledArrival": "2026-10-15T09:29:00Z",
+ "scheduledDeparture": "2026-10-15T09:30:00Z",
+ "scheduledTrack": "2",
+ "track": "2",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "LONG_DISTANCE",
+ "REGIONAL_RAIL",
+ "SUBURBAN"
+ ]
+ },
+ {
+ "name": "Arth-Goldau",
+ "stopId": "ch-opentransportdataswiss26_ch:1:sloid:5004:2:4",
+ "parentId": "ch-opentransportdataswiss26_Parentch:1:sloid:5004",
+ "importance": 0.010756864212453365,
+ "lat": 47.049150000000004,
+ "lon": 8.550308,
+ "level": 0,
+ "tz": "Europe/Zurich",
+ "arrival": "2026-10-15T09:45:00Z",
+ "departure": "2026-10-15T09:49:00Z",
+ "scheduledArrival": "2026-10-15T09:45:00Z",
+ "scheduledDeparture": "2026-10-15T09:49:00Z",
+ "scheduledTrack": "4",
+ "track": "4",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "LONG_DISTANCE",
+ "NIGHT_RAIL",
+ "REGIONAL_RAIL",
+ "SUBURBAN",
+ "BUS",
+ "FUNICULAR"
+ ]
+ }
+ ],
+ "legGeometry": {
+ "points": "u~sqF}dceAu@"
+ },
+ "bikesAllowed": false,
+ "wheelchairAccessible": "NOT_ACCESSIBLE",
+ "reservation": "NONE",
+ "alternatives": [],
+ "steps": []
+ },
+ {
+ "mode": "WALK",
+ "from": {
+ "name": "Lugano",
+ "stopId": "ch-opentransportdataswiss26_ch:1:sloid:5300:2:2",
+ "parentId": "ch-opentransportdataswiss26_Parentch:1:sloid:5300",
+ "importance": 0.013114487752318382,
+ "lat": 46.005657,
+ "lon": 8.946527999999999,
+ "level": 0,
+ "tz": "Europe/Zurich",
+ "arrival": "2026-10-15T10:58:00Z",
+ "departure": "2026-10-15T10:58:00Z",
+ "scheduledArrival": "2026-10-15T10:58:00Z",
+ "scheduledDeparture": "2026-10-15T10:58:00Z",
+ "scheduledTrack": "2",
+ "track": "2",
+ "vertexType": "TRANSIT",
+ "cancelled": false,
+ "modes": [
+ "LONG_DISTANCE",
+ "NIGHT_RAIL",
+ "REGIONAL_RAIL",
+ "SUBURBAN"
+ ]
+ },
+ "to": {
+ "name": "Lugano",
+ "stopId": "ch-opentransportdataswiss26_ch:1:sloid:5300:1:1",
+ "parentId": "ch-opentransportdataswiss26_Parentch:1:sloid:5300",
+ "importance": 0.013114487752318382,
+ "lat": 46.005634,
+ "lon": 8.946646000000001,
+ "level": 0,
+ "tz": "Europe/Zurich",
+ "arrival": "2026-10-15T11:02:00Z",
+ "scheduledArrival": "2026-10-15T11:02:00Z",
+ "scheduledTrack": "1",
+ "track": "1",
+ "vertexType": "TRANSIT",
+ "modes": [
+ "LONG_DISTANCE",
+ "NIGHT_RAIL",
+ "REGIONAL_RAIL",
+ "SUBURBAN"
+ ]
+ },
+ "duration": 240,
+ "startTime": "2026-10-15T10:58:00Z",
+ "endTime": "2026-10-15T11:02:00Z",
+ "scheduledStartTime": "2026-10-15T10:58:00Z",
+ "scheduledEndTime": "2026-10-15T11:02:00Z",
+ "realTime": false,
+ "scheduled": false,
+ "distance": 461,
+ "legGeometry": {
+ "points": "u~sqF}dceAu@"
+ },
+ "steps": [],
+ "intermediateStops": []
+ },
+ {
+ "mode": "REGIONAL_RAIL",
+ "from": {
+ "name": "Lugano",
+ "stopId": "ch-opentransportdataswiss26_ch:1:sloid:5300:1:1",
+ "parentId": "ch-opentransportdataswiss26_Parentch:1:sloid:5300",
+ "importance": 0.013114487752318382,
+ "lat": 46.005634,
+ "lon": 8.946646000000001,
+ "level": 0,
+ "tz": "Europe/Zurich",
+ "departure": "2026-10-15T11:02:00Z",
+ "scheduledDeparture": "2026-10-15T11:02:00Z",
+ "scheduledTrack": "1",
+ "track": "1",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "LONG_DISTANCE",
+ "NIGHT_RAIL",
+ "REGIONAL_RAIL",
+ "SUBURBAN"
+ ]
+ },
+ "to": {
+ "name": "Milano Centrale",
+ "stopId": "ch-opentransportdataswiss26_8301700",
+ "parentId": "ch-opentransportdataswiss26_Parent8301700",
+ "importance": 0.010967501439154148,
+ "lat": 45.487137,
+ "lon": 9.204821999999998,
+ "level": 2,
+ "tz": "Europe/Rome",
+ "arrival": "2026-10-15T12:17:00Z",
+ "scheduledArrival": "2026-10-15T12:17:00Z",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "HIGHSPEED_RAIL",
+ "LONG_DISTANCE",
+ "NIGHT_RAIL",
+ "REGIONAL_RAIL",
+ "SUBURBAN",
+ "TRAM",
+ "BUS"
+ ]
+ },
+ "duration": 4500,
+ "startTime": "2026-10-15T11:02:00Z",
+ "endTime": "2026-10-15T12:17:00Z",
+ "scheduledStartTime": "2026-10-15T11:02:00Z",
+ "scheduledEndTime": "2026-10-15T12:17:00Z",
+ "realTime": false,
+ "scheduled": true,
+ "interlineWithPreviousLeg": false,
+ "headsign": "Milano Centrale",
+ "tripFrom": {
+ "name": "Locarno",
+ "stopId": "ch-opentransportdataswiss26_ch:1:sloid:5400:1:1",
+ "parentId": "ch-opentransportdataswiss26_Parentch:1:sloid:5400",
+ "importance": 0.004943060223013163,
+ "lat": 46.17233300000001,
+ "lon": 8.802816000000002,
+ "level": 0,
+ "tz": "Europe/Zurich",
+ "departure": "2026-10-15T10:22:00Z",
+ "scheduledDeparture": "2026-10-15T10:22:00Z",
+ "scheduledTrack": "1",
+ "track": "1",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "LONG_DISTANCE",
+ "REGIONAL_RAIL",
+ "SUBURBAN"
+ ]
+ },
+ "tripTo": {
+ "name": "Milano Centrale",
+ "stopId": "ch-opentransportdataswiss26_8301700",
+ "parentId": "ch-opentransportdataswiss26_Parent8301700",
+ "importance": 0.010967501439154148,
+ "lat": 45.487137,
+ "lon": 9.204821999999998,
+ "level": 2,
+ "tz": "Europe/Rome",
+ "arrival": "2026-10-15T12:17:00Z",
+ "scheduledArrival": "2026-10-15T12:17:00Z",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "HIGHSPEED_RAIL",
+ "LONG_DISTANCE",
+ "NIGHT_RAIL",
+ "REGIONAL_RAIL",
+ "SUBURBAN",
+ "TRAM",
+ "BUS"
+ ]
+ },
+ "routeId": "ch-opentransportdataswiss26_91-80-j26-1",
+ "routeUrl": "",
+ "directionId": "0",
+ "routeType": 106,
+ "agencyName": "Schweizerische Bundesbahnen SBB",
+ "agencyUrl": "https://sbb.ch",
+ "agencyFareUrl": "",
+ "agencyId": "11",
+ "tripId": "20261015_12:22_ch-opentransportdataswiss26_.ojp-91-80.1.TA.915.j26",
+ "routeShortName": "RE80",
+ "routeLongName": "",
+ "tripShortName": "25521",
+ "displayName": "RE80",
+ "cancelled": false,
+ "source": "ch_opentransportdataswiss26.gtfs.zip/stop_times.txt:925419:925434",
+ "intermediateStops": [
+ {
+ "name": "Paradiso",
+ "stopId": "ch-opentransportdataswiss26_ch:1:sloid:5301:1:1",
+ "parentId": "ch-opentransportdataswiss26_Parentch:1:sloid:5301",
+ "importance": 0.005389102268964052,
+ "lat": 45.98940699999999,
+ "lon": 8.946888,
+ "level": 0,
+ "tz": "Europe/Zurich",
+ "arrival": "2026-10-15T11:05:00Z",
+ "departure": "2026-10-15T11:05:00Z",
+ "scheduledArrival": "2026-10-15T11:05:00Z",
+ "scheduledDeparture": "2026-10-15T11:05:00Z",
+ "scheduledTrack": "1",
+ "track": "1",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "REGIONAL_RAIL",
+ "SUBURBAN"
+ ]
+ },
+ {
+ "name": "Mendrisio",
+ "stopId": "ch-opentransportdataswiss26_ch:1:sloid:5305:2:2",
+ "parentId": "ch-opentransportdataswiss26_Parentch:1:sloid:5305",
+ "importance": 0.0074639697559177876,
+ "lat": 45.869205,
+ "lon": 8.978509,
+ "level": 0,
+ "tz": "Europe/Zurich",
+ "arrival": "2026-10-15T11:18:00Z",
+ "departure": "2026-10-15T11:18:00Z",
+ "scheduledArrival": "2026-10-15T11:18:00Z",
+ "scheduledDeparture": "2026-10-15T11:18:00Z",
+ "scheduledTrack": "2",
+ "track": "2",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "LONG_DISTANCE",
+ "REGIONAL_RAIL",
+ "SUBURBAN"
+ ]
+ }
+ ],
+ "legGeometry": {
+ "points": "u~sqF}dceAu@"
+ },
+ "bikesAllowed": false,
+ "wheelchairAccessible": "NOT_ACCESSIBLE",
+ "reservation": "NONE",
+ "alternatives": [],
+ "steps": []
+ }
+ ]
+ }
+ ],
+ "previousPageCursor": "EARLIER|1792038420",
+ "nextPageCursor": "LATER|1792045500"
+}
\ No newline at end of file
diff --git a/website/test/fixtures/transitous/stoptimes.json b/website/test/fixtures/transitous/stoptimes.json
new file mode 100644
index 000000000..474b7d95b
--- /dev/null
+++ b/website/test/fixtures/transitous/stoptimes.json
@@ -0,0 +1,830 @@
+{
+ "stopTimes": [
+ {
+ "place": {
+ "name": "Heidelberg, Hauptbahnhof",
+ "stopId": "de-DELFI_de:08221:1160:1:D",
+ "importance": 0.003857618197798729,
+ "lat": 49.404906999999994,
+ "lon": 8.675713,
+ "level": 0,
+ "tz": "Europe/Berlin",
+ "arrival": "2026-10-15T04:26:00Z",
+ "departure": "2026-10-15T04:27:00Z",
+ "scheduledArrival": "2026-10-15T04:26:00Z",
+ "scheduledDeparture": "2026-10-15T04:27:00Z",
+ "scheduledTrack": "D",
+ "track": "D",
+ "description": "Tram/Bus",
+ "vertexType": "TRANSIT",
+ "pickupType": "NOT_ALLOWED",
+ "dropoffType": "NOT_ALLOWED",
+ "cancelled": true,
+ "modes": [
+ "HIGHSPEED_RAIL",
+ "LONG_DISTANCE",
+ "COACH",
+ "RIDE_SHARING",
+ "REGIONAL_RAIL",
+ "SUBURBAN",
+ "TRAM",
+ "BUS",
+ "ODM"
+ ]
+ },
+ "mode": "TRAM",
+ "realTime": true,
+ "headsign": "Edingen",
+ "tripFrom": {
+ "name": "Käfertal, Bahnhof (RNV)",
+ "stopId": "de-DELFI_de:08222:5547:1:3",
+ "importance": 0.00008580861322116107,
+ "lat": 49.510146999999996,
+ "lon": 8.518570999999998,
+ "level": 0,
+ "tz": "Europe/Berlin",
+ "scheduledTrack": "G1",
+ "track": "G4",
+ "description": "Tram",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "TRAM",
+ "BUS"
+ ]
+ },
+ "tripTo": {
+ "name": "Viernheim, Bahnhof",
+ "stopId": "de-DELFI_de:06431:3851:2:TrRiO",
+ "importance": 0.00004391103720990941,
+ "lat": 49.535397,
+ "lon": 8.582630000000002,
+ "level": 0,
+ "tz": "Europe/Berlin",
+ "scheduledTrack": "3",
+ "track": "3",
+ "description": "Tram",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "TRAM",
+ "BUS",
+ "ODM"
+ ]
+ },
+ "agencyId": "7911",
+ "agencyName": "RNV HD-MA-Weinheim (Strab)",
+ "agencyUrl": "",
+ "routeId": "de-DELFI_de:vrn:02005:_0",
+ "routeUrl": "",
+ "directionId": "1",
+ "routeColor": "00965e",
+ "routeTextColor": "ffffff",
+ "tripId": "20261015_05:41_de-DELFI_3436853287",
+ "routeType": 0,
+ "routeShortName": "RNV 5",
+ "routeLongName": "",
+ "tripShortName": "5200093",
+ "displayName": "RNV 5",
+ "pickupDropoffType": "NOT_ALLOWED",
+ "cancelled": true,
+ "tripCancelled": false,
+ "bikesAllowed": false,
+ "wheelchairAccessible": "NOT_ACCESSIBLE",
+ "reservation": "NONE",
+ "source": "de_DELFI.gtfs.zip/stop_times.txt:5163314:5163355"
+ },
+ {
+ "place": {
+ "name": "Heidelberg, Hauptbahnhof",
+ "stopId": "de-DELFI_de:08221:1160:1:P",
+ "importance": 0.003857618197798729,
+ "lat": 49.404163,
+ "lon": 8.677789,
+ "level": 0,
+ "tz": "Europe/Berlin",
+ "arrival": "2026-10-15T04:26:00Z",
+ "departure": "2026-10-15T04:27:00Z",
+ "scheduledArrival": "2026-10-15T04:26:00Z",
+ "scheduledDeparture": "2026-10-15T04:27:00Z",
+ "scheduledTrack": "P",
+ "track": "P",
+ "description": "Bus Ost",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "HIGHSPEED_RAIL",
+ "LONG_DISTANCE",
+ "COACH",
+ "RIDE_SHARING",
+ "REGIONAL_RAIL",
+ "SUBURBAN",
+ "TRAM",
+ "BUS",
+ "ODM"
+ ]
+ },
+ "mode": "BUS",
+ "realTime": true,
+ "headsign": "Heidelberg, Universitätsplatz",
+ "tripFrom": {
+ "name": "Emmertsgrund, Endstelle",
+ "stopId": "de-DELFI_de:08221:1127:0:11",
+ "importance": 0.00002280418630107306,
+ "lat": 49.358936,
+ "lon": 8.704378999999998,
+ "level": 0,
+ "tz": "Europe/Berlin",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "BUS"
+ ]
+ },
+ "tripTo": {
+ "name": "Heidelberg, Universitätsplatz",
+ "stopId": "de-DELFI_de:08221:1198:0:11",
+ "importance": 0.00001679499473539181,
+ "lat": 49.4111,
+ "lon": 8.705789000000001,
+ "level": 0,
+ "tz": "Europe/Berlin",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "BUS"
+ ]
+ },
+ "agencyId": "7915",
+ "agencyName": "RNV Heidelberg (Bus)",
+ "agencyUrl": "",
+ "routeId": "de-DELFI_de:vrn:02033:_3",
+ "routeUrl": "",
+ "directionId": "1",
+ "routeColor": "e3000b",
+ "routeTextColor": "ffffff",
+ "tripId": "20261015_05:48_de-DELFI_3429190890",
+ "routeType": 3,
+ "routeShortName": "RNV 33",
+ "routeLongName": "",
+ "tripShortName": "2200057",
+ "displayName": "RNV 33",
+ "pickupDropoffType": "NORMAL",
+ "cancelled": false,
+ "tripCancelled": false,
+ "bikesAllowed": false,
+ "wheelchairAccessible": "NOT_ACCESSIBLE",
+ "reservation": "NONE",
+ "source": "de_DELFI.gtfs.zip/stop_times.txt:21177333:21177365"
+ },
+ {
+ "place": {
+ "name": "Heidelberg, Hauptbahnhof",
+ "stopId": "de-DELFI_de:08221:1160:1:P",
+ "importance": 0.003857618197798729,
+ "lat": 49.404163,
+ "lon": 8.677789,
+ "level": 0,
+ "tz": "Europe/Berlin",
+ "arrival": "2026-10-15T04:28:00Z",
+ "departure": "2026-10-15T04:28:00Z",
+ "scheduledArrival": "2026-10-15T04:30:00Z",
+ "scheduledDeparture": "2026-10-15T04:30:00Z",
+ "scheduledTrack": "P",
+ "track": "P",
+ "description": "Bus Ost",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "HIGHSPEED_RAIL",
+ "LONG_DISTANCE",
+ "COACH",
+ "RIDE_SHARING",
+ "REGIONAL_RAIL",
+ "SUBURBAN",
+ "TRAM",
+ "BUS",
+ "ODM"
+ ]
+ },
+ "mode": "BUS",
+ "realTime": true,
+ "headsign": "Neuenheim, Schwimmbad",
+ "tripFrom": {
+ "name": "Emmertsgrund, Mombertplatz",
+ "stopId": "de-DELFI_de:08221:1130:0:A",
+ "importance": 0.00003534605275490321,
+ "lat": 49.369510000000005,
+ "lon": 8.704046,
+ "level": 0,
+ "tz": "Europe/Berlin",
+ "scheduledTrack": "A",
+ "track": "A",
+ "description": "Bus",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "BUS"
+ ]
+ },
+ "tripTo": {
+ "name": "Neuenheim, Schwimmbad",
+ "stopId": "de-DELFI_de:08221:1240:0:12",
+ "importance": 0.00001845390215748921,
+ "lat": 49.420383,
+ "lon": 8.659337,
+ "level": 0,
+ "tz": "Europe/Berlin",
+ "scheduledTrack": "B",
+ "track": "B",
+ "description": "Neuenheim, Schwimmbad",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "BUS"
+ ]
+ },
+ "agencyId": "7915",
+ "agencyName": "RNV Heidelberg (Bus)",
+ "agencyUrl": "",
+ "routeId": "de-DELFI_de:vrn:02028:_3",
+ "routeUrl": "",
+ "directionId": "1",
+ "routeColor": "b09fcd",
+ "routeTextColor": "ffffff",
+ "tripId": "20261015_06:00_de-DELFI_3436862110",
+ "routeType": 3,
+ "routeShortName": "RNV 28",
+ "routeLongName": "",
+ "tripShortName": "4200024",
+ "displayName": "RNV 28",
+ "pickupDropoffType": "NORMAL",
+ "cancelled": false,
+ "tripCancelled": false,
+ "bikesAllowed": false,
+ "wheelchairAccessible": "NOT_ACCESSIBLE",
+ "reservation": "NONE",
+ "source": "de_DELFI.gtfs.zip/stop_times.txt:28457739:28457763"
+ },
+ {
+ "place": {
+ "name": "Heidelberg, Hauptbahnhof",
+ "stopId": "de-DELFI_de:08221:1160:2:Ri NW",
+ "importance": 0.003857618197798729,
+ "lat": 49.404635999999996,
+ "lon": 8.676513,
+ "level": 0,
+ "tz": "Europe/Berlin",
+ "arrival": "2026-10-15T04:28:00Z",
+ "departure": "2026-10-15T04:29:00Z",
+ "scheduledArrival": "2026-10-15T04:27:00Z",
+ "scheduledDeparture": "2026-10-15T04:28:00Z",
+ "scheduledTrack": "B",
+ "track": "B",
+ "description": "Tram/Bus",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "HIGHSPEED_RAIL",
+ "LONG_DISTANCE",
+ "COACH",
+ "RIDE_SHARING",
+ "REGIONAL_RAIL",
+ "SUBURBAN",
+ "TRAM",
+ "BUS",
+ "ODM"
+ ]
+ },
+ "mode": "TRAM",
+ "realTime": true,
+ "headsign": "Heidelberg Bismarckplatz",
+ "tripFrom": {
+ "name": "Weinheim, Alter OEG-Bahnhof",
+ "stopId": "de-DELFI_de:08226:4146:1:TrRiN",
+ "importance": 0.00001689577584329527,
+ "lat": 49.549206,
+ "lon": 8.665032000000002,
+ "level": 0,
+ "tz": "Europe/Berlin",
+ "scheduledTrack": "TrRiN",
+ "track": "TrRiN",
+ "description": "TrRiN Bahnhof DB",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "RIDE_SHARING",
+ "TRAM",
+ "BUS",
+ "ODM"
+ ]
+ },
+ "tripTo": {
+ "name": "Weinheim, Alter OEG-Bahnhof",
+ "stopId": "de-DELFI_de:08226:4146:1:TrRiN",
+ "importance": 0.00001689577584329527,
+ "lat": 49.549206,
+ "lon": 8.665032000000002,
+ "level": 0,
+ "tz": "Europe/Berlin",
+ "scheduledTrack": "TrRiN",
+ "track": "TrRiN",
+ "description": "TrRiN Bahnhof DB",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "RIDE_SHARING",
+ "TRAM",
+ "BUS",
+ "ODM"
+ ]
+ },
+ "agencyId": "7911",
+ "agencyName": "RNV HD-MA-Weinheim (Strab)",
+ "agencyUrl": "",
+ "routeId": "de-DELFI_de:vrn:02005:_0",
+ "routeUrl": "",
+ "directionId": "0",
+ "routeColor": "00965e",
+ "routeTextColor": "ffffff",
+ "tripId": "20261015_04:55_de-DELFI_3436853968",
+ "routeType": 0,
+ "routeShortName": "RNV 5",
+ "routeLongName": "",
+ "tripShortName": "5200068",
+ "displayName": "RNV 5",
+ "pickupDropoffType": "NORMAL",
+ "cancelled": false,
+ "tripCancelled": false,
+ "bikesAllowed": false,
+ "wheelchairAccessible": "NOT_ACCESSIBLE",
+ "reservation": "NONE",
+ "source": "de_DELFI.gtfs.zip/stop_times.txt:5190985:5191057"
+ },
+ {
+ "place": {
+ "name": "Heidelberg, Hauptbahnhof",
+ "stopId": "de-DELFI_de:08221:1160:6:BusO1",
+ "importance": 0.003857618197798729,
+ "lat": 49.40441,
+ "lon": 8.676772999999999,
+ "level": 0,
+ "tz": "Europe/Berlin",
+ "departure": "2026-10-15T04:29:00Z",
+ "scheduledDeparture": "2026-10-15T04:29:00Z",
+ "scheduledTrack": "K",
+ "track": "K",
+ "description": "Bus W.-Brandt-Pl.",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "HIGHSPEED_RAIL",
+ "LONG_DISTANCE",
+ "COACH",
+ "RIDE_SHARING",
+ "REGIONAL_RAIL",
+ "SUBURBAN",
+ "TRAM",
+ "BUS",
+ "ODM"
+ ]
+ },
+ "mode": "BUS",
+ "realTime": true,
+ "headsign": "Schatthausen, Kirche",
+ "tripFrom": {
+ "name": "Heidelberg, Hauptbahnhof",
+ "stopId": "de-DELFI_de:08221:1160:6:BusO1",
+ "importance": 0.003857618197798729,
+ "lat": 49.40441,
+ "lon": 8.676772999999999,
+ "level": 0,
+ "tz": "Europe/Berlin",
+ "scheduledTrack": "K",
+ "track": "K",
+ "description": "Bus W.-Brandt-Pl.",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "HIGHSPEED_RAIL",
+ "LONG_DISTANCE",
+ "COACH",
+ "RIDE_SHARING",
+ "REGIONAL_RAIL",
+ "SUBURBAN",
+ "TRAM",
+ "BUS",
+ "ODM"
+ ]
+ },
+ "tripTo": {
+ "name": "Schatthausen, Kirche",
+ "stopId": "de-DELFI_de:08226:4247:0:RiN",
+ "importance": 0.000016631132893962786,
+ "lat": 49.31796599999999,
+ "lon": 8.757945,
+ "level": 0,
+ "tz": "Europe/Berlin",
+ "scheduledTrack": "RiO",
+ "track": "RiO",
+ "description": "Schatthausen, Kirche",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "BUS",
+ "ODM"
+ ]
+ },
+ "agencyId": "7927",
+ "agencyName": "Busverkehr-Rhein-Neckar",
+ "agencyUrl": "",
+ "routeId": "de-DELFI_de:vrn:02757:_3",
+ "routeUrl": "",
+ "directionId": "0",
+ "routeColor": "6c91a7",
+ "routeTextColor": "ffffff",
+ "tripId": "20261015_06:29_de-DELFI_3429202375",
+ "routeType": 3,
+ "routeShortName": "757",
+ "routeLongName": "",
+ "tripShortName": "3200101",
+ "displayName": "757",
+ "pickupDropoffType": "NORMAL",
+ "cancelled": false,
+ "tripCancelled": false,
+ "bikesAllowed": false,
+ "wheelchairAccessible": "NOT_ACCESSIBLE",
+ "reservation": "NONE",
+ "source": "de_DELFI.gtfs.zip/stop_times.txt:33185171:33185190"
+ },
+ {
+ "place": {
+ "name": "Heidelberg, Hauptbahnhof",
+ "stopId": "de-DELFI_de:08221:1160:8:10",
+ "parentId": "de-DELFI_de:08221:1160_G",
+ "importance": 0.003857618197798729,
+ "lat": 49.403503,
+ "lon": 8.674374999999998,
+ "level": -1,
+ "tz": "Europe/Berlin",
+ "arrival": "2026-10-15T04:31:00Z",
+ "departure": "2026-10-15T04:32:00Z",
+ "scheduledArrival": "2026-10-15T04:30:00Z",
+ "scheduledDeparture": "2026-10-15T04:31:00Z",
+ "scheduledTrack": "10",
+ "track": "10",
+ "description": "Gleis 9, Gleis 10",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "HIGHSPEED_RAIL",
+ "LONG_DISTANCE",
+ "COACH",
+ "RIDE_SHARING",
+ "REGIONAL_RAIL",
+ "SUBURBAN",
+ "TRAM",
+ "BUS",
+ "ODM"
+ ]
+ },
+ "mode": "METRO",
+ "realTime": true,
+ "headsign": "Karlsruhe Hauptbahnhof",
+ "tripFrom": {
+ "name": "Kaiserslautern, Hbf",
+ "stopId": "de-DELFI_de:07312:9035:4:5",
+ "parentId": "de-DELFI_de:07312:9035",
+ "importance": 0.0021683480590581894,
+ "lat": 49.43573800000001,
+ "lon": 7.768622000000001,
+ "level": 0,
+ "tz": "Europe/Berlin",
+ "scheduledTrack": "5",
+ "track": "5",
+ "description": "Gl4/5",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "HIGHSPEED_RAIL",
+ "COACH",
+ "REGIONAL_RAIL",
+ "SUBURBAN",
+ "BUS",
+ "ODM"
+ ]
+ },
+ "tripTo": {
+ "name": "Karlsruhe Hauptbahnhof",
+ "stopId": "de-DELFI_de:08212:90:4:6",
+ "parentId": "de-DELFI_de:08212:90",
+ "importance": 0.010275337845087051,
+ "lat": 48.993366,
+ "lon": 8.401277999999998,
+ "level": 0,
+ "tz": "Europe/Berlin",
+ "scheduledTrack": "6",
+ "track": "6",
+ "description": "Gleis 5+6",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "HIGHSPEED_RAIL",
+ "LONG_DISTANCE",
+ "COACH",
+ "NIGHT_RAIL",
+ "RIDE_SHARING",
+ "REGIONAL_RAIL",
+ "SUBURBAN",
+ "TRAM",
+ "BUS"
+ ]
+ },
+ "agencyId": "10449",
+ "agencyName": "DB Regio AG Mitte Region Südwest",
+ "agencyUrl": "",
+ "routeId": "de-DELFI_de:rlp:s3:_109",
+ "routeUrl": "",
+ "directionId": "0",
+ "routeColor": "fddd04",
+ "routeTextColor": "231f20",
+ "tripId": "20261015_04:55_de-DELFI_3440478632",
+ "routeType": 109,
+ "routeShortName": "S3",
+ "routeLongName": "",
+ "tripShortName": "038315",
+ "displayName": "S3",
+ "pickupDropoffType": "NORMAL",
+ "cancelled": false,
+ "tripCancelled": false,
+ "bikesAllowed": false,
+ "wheelchairAccessible": "NOT_ACCESSIBLE",
+ "reservation": "NONE",
+ "source": "de_DELFI.gtfs.zip/stop_times.txt:41039226:41039260"
+ },
+ {
+ "place": {
+ "name": "Heidelberg, Hauptbahnhof",
+ "stopId": "de-DELFI_de:08221:1160:2:RiO",
+ "importance": 0.003857618197798729,
+ "lat": 49.40467999999999,
+ "lon": 8.676531,
+ "level": 0,
+ "tz": "Europe/Berlin",
+ "arrival": "2026-10-15T04:31:00Z",
+ "departure": "2026-10-15T04:32:00Z",
+ "scheduledArrival": "2026-10-15T04:31:00Z",
+ "scheduledDeparture": "2026-10-15T04:32:00Z",
+ "scheduledTrack": "C",
+ "track": "C",
+ "description": "Tram/Bus",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "HIGHSPEED_RAIL",
+ "LONG_DISTANCE",
+ "COACH",
+ "RIDE_SHARING",
+ "REGIONAL_RAIL",
+ "SUBURBAN",
+ "TRAM",
+ "BUS",
+ "ODM"
+ ]
+ },
+ "mode": "TRAM",
+ "realTime": true,
+ "headsign": "Rohrbach, Süd",
+ "tripFrom": {
+ "name": "Handschuh., Heiligenbergschule",
+ "stopId": "de-DELFI_de:08221:1333:1:Tram",
+ "importance": 0.0000730760584701784,
+ "lat": 49.423320000000004,
+ "lon": 8.678964999999998,
+ "level": 0,
+ "tz": "Europe/Berlin",
+ "scheduledTrack": "A",
+ "track": "A",
+ "description": "Ri Technologie",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "TRAM"
+ ]
+ },
+ "tripTo": {
+ "name": "Rohrbach, Süd",
+ "stopId": "de-DELFI_de:08221:1278:1:TrRiS",
+ "importance": 0.00008212682587327436,
+ "lat": 49.365837,
+ "lon": 8.688694,
+ "level": 0,
+ "tz": "Europe/Berlin",
+ "scheduledTrack": "A",
+ "track": "A",
+ "description": "Tram",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "TRAM",
+ "BUS"
+ ]
+ },
+ "agencyId": "7910",
+ "agencyName": "RNV Heidelberg (Strab)",
+ "agencyUrl": "",
+ "routeId": "de-DELFI_de:vrn:02024:_0",
+ "routeUrl": "",
+ "directionId": "0",
+ "routeColor": "8c1d75",
+ "routeTextColor": "ffffff",
+ "tripId": "20261015_06:23_de-DELFI_3429231255",
+ "routeType": 0,
+ "routeShortName": "RNV 24",
+ "routeLongName": "",
+ "tripShortName": "1200102",
+ "displayName": "RNV 24",
+ "pickupDropoffType": "NORMAL",
+ "cancelled": false,
+ "tripCancelled": false,
+ "bikesAllowed": false,
+ "wheelchairAccessible": "NOT_ACCESSIBLE",
+ "reservation": "NONE",
+ "source": "de_DELFI.gtfs.zip/stop_times.txt:4428863:4428881"
+ },
+ {
+ "place": {
+ "name": "Heidelberg, Hauptbahnhof",
+ "stopId": "de-DELFI_de:08221:1160:4:5",
+ "parentId": "de-DELFI_de:08221:1160_G",
+ "importance": 0.003857618197798729,
+ "lat": 49.403819999999996,
+ "lon": 8.674716,
+ "level": -1,
+ "tz": "Europe/Berlin",
+ "arrival": "2026-10-15T04:31:00Z",
+ "departure": "2026-10-15T04:33:00Z",
+ "scheduledArrival": "2026-10-15T04:28:00Z",
+ "scheduledDeparture": "2026-10-15T04:31:00Z",
+ "scheduledTrack": "5",
+ "track": "5",
+ "description": "Gleis 4, Gleis 5",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "HIGHSPEED_RAIL",
+ "LONG_DISTANCE",
+ "COACH",
+ "RIDE_SHARING",
+ "REGIONAL_RAIL",
+ "SUBURBAN",
+ "TRAM",
+ "BUS",
+ "ODM"
+ ]
+ },
+ "mode": "METRO",
+ "realTime": true,
+ "headsign": "Kaiserslautern, Hbf",
+ "tripFrom": {
+ "name": "Karlsruhe Hauptbahnhof",
+ "stopId": "de-DELFI_de:08212:90:4:6",
+ "parentId": "de-DELFI_de:08212:90",
+ "importance": 0.010275337845087051,
+ "lat": 48.993366,
+ "lon": 8.401277999999998,
+ "level": 0,
+ "tz": "Europe/Berlin",
+ "scheduledTrack": "6",
+ "track": "6",
+ "description": "Gleis 5+6",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "HIGHSPEED_RAIL",
+ "LONG_DISTANCE",
+ "COACH",
+ "NIGHT_RAIL",
+ "RIDE_SHARING",
+ "REGIONAL_RAIL",
+ "SUBURBAN",
+ "TRAM",
+ "BUS"
+ ]
+ },
+ "tripTo": {
+ "name": "Kaiserslautern, Hbf",
+ "stopId": "de-DELFI_de:07312:9035:3:3",
+ "parentId": "de-DELFI_de:07312:9035",
+ "importance": 0.0021683480590581894,
+ "lat": 49.435905000000005,
+ "lon": 7.7685319999999995,
+ "level": 0,
+ "tz": "Europe/Berlin",
+ "scheduledTrack": "3",
+ "track": "3",
+ "description": "Gl2/3",
+ "vertexType": "TRANSIT",
+ "pickupType": "NORMAL",
+ "dropoffType": "NORMAL",
+ "cancelled": false,
+ "modes": [
+ "HIGHSPEED_RAIL",
+ "COACH",
+ "REGIONAL_RAIL",
+ "SUBURBAN",
+ "BUS",
+ "ODM"
+ ]
+ },
+ "agencyId": "10449",
+ "agencyName": "DB Regio AG Mitte Region Südwest",
+ "agencyUrl": "",
+ "routeId": "de-DELFI_de:rlp:s2:_109",
+ "routeUrl": "",
+ "directionId": "1",
+ "routeColor": "1575c5",
+ "routeTextColor": "ffffff",
+ "tripId": "20261015_05:40_de-DELFI_3440478785",
+ "routeType": 109,
+ "routeShortName": "S2",
+ "routeLongName": "",
+ "tripShortName": "038204",
+ "displayName": "S2",
+ "pickupDropoffType": "NORMAL",
+ "cancelled": false,
+ "tripCancelled": false,
+ "bikesAllowed": false,
+ "wheelchairAccessible": "NOT_ACCESSIBLE",
+ "reservation": "NONE",
+ "source": "de_DELFI.gtfs.zip/stop_times.txt:41033856:41033888"
+ }
+ ],
+ "place": {
+ "name": "Heidelberg, Hauptbahnhof",
+ "stopId": "de-DELFI_de:08221:1160",
+ "importance": 0.003857618197798729,
+ "lat": 49.40357,
+ "lon": 8.675442000000002,
+ "level": 0,
+ "tz": "Europe/Berlin",
+ "vertexType": "TRANSIT",
+ "modes": [
+ "HIGHSPEED_RAIL",
+ "LONG_DISTANCE",
+ "COACH",
+ "RIDE_SHARING",
+ "REGIONAL_RAIL",
+ "SUBURBAN",
+ "TRAM",
+ "BUS",
+ "ODM"
+ ]
+ },
+ "previousPageCursor": "EARLIER|1792038360",
+ "nextPageCursor": "LATER|1792038840"
+}
\ No newline at end of file
diff --git a/website/test/prompts.test.ts b/website/test/prompts.test.ts
index cffd68f17..a4506f2aa 100644
--- a/website/test/prompts.test.ts
+++ b/website/test/prompts.test.ts
@@ -20,6 +20,7 @@ describe("prompt files", () => {
it("carries the tool contract's known content", () => {
// A stable marker per prompt, so a file/getter mix-up cannot pass silently.
expect(toolContractPrompt.body).toContain("bundestakt.de");
+ expect(toolContractPrompt.body).toContain("transitous.org");
expect(teenPrompt.body).toContain("teenagers");
expect(researchPrompt.body).toContain("note_findings");
});
diff --git a/website/test/transitous.test.ts b/website/test/transitous.test.ts
new file mode 100644
index 000000000..f4bf21077
--- /dev/null
+++ b/website/test/transitous.test.ts
@@ -0,0 +1,207 @@
+/**
+ * Fixtures are literal copies of the live API responses, captured 2026-10-13 against
+ * api.transitous.org — see tools/transitous.ts's header. Trimmed only where a field is
+ * unbounded per leg (intermediateStops cut to 2 entries; legGeometry/steps kept but
+ * minimal, so the selectors' dropping them is asserted against a response that really
+ * carries them). Most tests here are pure function tests against them: no fetch mocking,
+ * no cache to reset, because the module has neither.
+ */
+import { describe, it, expect, vi, afterEach } from "vitest";
+import {
+ selectStops,
+ selectBoard,
+ selectJourneys,
+ fetchGeocode,
+ fetchStoptimes,
+ fetchPlan,
+ fetchFailed,
+ type TransitousResult,
+} from "../tools/transitous";
+import geocodeFixture from "./fixtures/transitous/geocode.json";
+import stoptimesFixture from "./fixtures/transitous/stoptimes.json";
+import planFixture from "./fixtures/transitous/plan.json";
+
+afterEach(() => {
+ vi.unstubAllGlobals();
+});
+
+/** Narrows the result union to its "ok" shape, asserting that status along the way. */
+function assertOk(result: TransitousResult): asserts result is { status: "ok" } & T {
+ expect(result.status).toBe("ok");
+}
+
+/** Fixture rows carry 7 STOP and 3 PLACE entries, so filter and cap are both exercised. */
+describe("selectStops", () => {
+ it("keeps only STOP entries and caps the list at six", () => {
+ const result = selectStops(geocodeFixture);
+ assertOk<{ stops: { id: string; type?: string }[] }>(result);
+
+ expect(result.stops).toHaveLength(6);
+ for (const stop of result.stops) {
+ expect(typeof stop.id).toBe("string");
+ expect(stop.type).toBeUndefined();
+ }
+ });
+
+ it("projects each stop to exactly name, id and modes", () => {
+ const result = selectStops(geocodeFixture);
+ assertOk<{ stops: Record[] }>(result);
+
+ expect(Object.keys(result.stops[0]).sort()).toEqual(["id", "modes", "name"]);
+ });
+
+ it("returns an empty list, not an error, when nothing matches", () => {
+ const result = selectStops([{ type: "PLACE", name: "Somewhere", id: "node/1", modes: [] }]);
+
+ expect(result).toEqual({ status: "ok", stops: [] });
+ });
+});
+
+describe("selectBoard", () => {
+ it("projects each departure to the board row and drops the stop name the API does not send", () => {
+ const result = selectBoard(stoptimesFixture);
+ assertOk<{ departures: Record[]; stop?: unknown }>(result);
+
+ expect(result.stop).toBeUndefined();
+ expect(result.departures).toHaveLength(8);
+ expect(Object.keys(result.departures[0]).sort()).toEqual([
+ "cancelled",
+ "delayMin",
+ "headsign",
+ "line",
+ "realTime",
+ "time",
+ "track",
+ "train",
+ ]);
+ });
+
+ it("keeps the delay's sign: late is positive, early is negative", () => {
+ const result = selectBoard(stoptimesFixture);
+ assertOk<{ departures: { delayMin: number; realTime: boolean }[] }>(result);
+
+ // The fixture board has a delayed S2 (+2), a delayed S3 (+1) and an early RNV 28 (-2).
+ expect(result.departures.some((d) => d.delayMin > 0)).toBe(true);
+ expect(result.departures.some((d) => d.delayMin < 0)).toBe(true);
+ expect(result.departures.some((d) => d.realTime)).toBe(true);
+ });
+
+ it("projects the whole board inside the byte budget of a tool result", () => {
+ const result = selectBoard(stoptimesFixture);
+
+ expect(new TextEncoder().encode(JSON.stringify(result)).length).toBeLessThanOrEqual(2048);
+ });
+});
+
+describe("selectJourneys", () => {
+ it("caps the itinerary list at three", () => {
+ const raw = { itineraries: [...planFixture.itineraries, ...planFixture.itineraries, ...planFixture.itineraries] };
+ const result = selectJourneys(raw);
+ assertOk<{ itineraries: unknown[] }>(result);
+
+ expect(result.itineraries).toHaveLength(3);
+ });
+
+ it("projects an itinerary to start, end, durationMin, transfers, realTime and legs", () => {
+ const result = selectJourneys(planFixture);
+ assertOk<{ itineraries: Record[] }>(result);
+
+ expect(result.itineraries).toHaveLength(2);
+ expect(Object.keys(result.itineraries[0]).sort()).toEqual([
+ "durationMin",
+ "end",
+ "legs",
+ "realTime",
+ "start",
+ "transfers",
+ ]);
+ expect(typeof result.itineraries[0].transfers).toBe("number");
+ expect(result.itineraries[0].realTime).toBe(true);
+ });
+
+ it("aggregates realTime over transit legs only", () => {
+ const raw = JSON.parse(JSON.stringify(planFixture));
+ for (const itinerary of raw.itineraries) {
+ for (const leg of itinerary.legs) leg.realTime = false;
+ }
+ const result = selectJourneys(raw);
+ assertOk<{ itineraries: { realTime: boolean }[] }>(result);
+
+ expect(result.itineraries.every((it) => it.realTime === false)).toBe(true);
+ });
+
+ it("renders WALK legs as a single walkMin field", () => {
+ const result = selectJourneys(planFixture);
+ assertOk<{ itineraries: { legs: Record[] }[] }>(result);
+
+ const walkLegs = result.itineraries.flatMap((it) => it.legs).filter((leg) => leg.walkMin !== undefined);
+ expect(walkLegs.length).toBeGreaterThan(0);
+ for (const leg of walkLegs) expect(Object.keys(leg)).toEqual(["walkMin"]);
+ });
+
+ it("drops the per-leg baggage the model must not pay for", () => {
+ const result = selectJourneys(planFixture);
+ assertOk<{ itineraries: { legs: Record[] }[] }>(result);
+
+ const transitLegs = result.itineraries.flatMap((it) => it.legs).filter((leg) => leg.mode !== undefined);
+ expect(transitLegs.length).toBeGreaterThan(0);
+ for (const leg of transitLegs) {
+ expect(Object.keys(leg).sort()).toEqual([
+ "agency",
+ "cancelled",
+ "from",
+ "headsign",
+ "line",
+ "mode",
+ "realTime",
+ "to",
+ "train",
+ ]);
+ expect(leg.intermediateStops).toBeUndefined();
+ expect(leg.legGeometry).toBeUndefined();
+ expect(leg.steps).toBeUndefined();
+ }
+ });
+
+ it("projects the whole plan inside the byte budget of a tool result", () => {
+ const result = selectJourneys(planFixture);
+
+ expect(new TextEncoder().encode(JSON.stringify(result)).length).toBeLessThanOrEqual(4096);
+ });
+});
+
+describe("fetchers", () => {
+ it("throw a TransitousError with the HTTP status when the API answers non-OK", async () => {
+ vi.stubGlobal("fetch", vi.fn().mockResolvedValue({ ok: false, status: 503 }));
+
+ await expect(fetchGeocode("Heidelberg Hbf")).rejects.toMatchObject({ name: "TransitousError", status: 503 });
+ await expect(fetchStoptimes("de-DELFI_de:08221:1160")).rejects.toMatchObject({ status: 503 });
+ await expect(fetchPlan({ from: "a", to: "b" })).rejects.toMatchObject({ status: 503 });
+ });
+
+ it("sends the query as URL parameters and reads the JSON body", async () => {
+ const mockFetch = vi.fn().mockResolvedValue({ ok: true, json: () => Promise.resolve({ stopTimes: [] }) });
+ vi.stubGlobal("fetch", mockFetch);
+
+ await fetchGeocode("Heidelberg Hbf");
+
+ const url = new URL(vi.mocked(mockFetch).mock.calls[0][0] as string);
+ expect(url).toMatchObject({ origin: "https://api.transitous.org", pathname: "/api/v1/geocode" });
+ expect(url.searchParams.get("text")).toBe("Heidelberg Hbf");
+
+ await fetchStoptimes("de-DELFI_de:08221:1160", undefined, "2026-10-16T08:00:00Z");
+
+ const boardUrl = new URL(vi.mocked(mockFetch).mock.calls[1][0] as string);
+ expect(boardUrl.pathname).toBe("/api/v1/stoptimes");
+ expect(boardUrl.searchParams.get("stopId")).toBe("de-DELFI_de:08221:1160");
+ expect(boardUrl.searchParams.get("n")).toBe("8");
+ expect(boardUrl.searchParams.get("time")).toBe("2026-10-16T08:00:00Z");
+ });
+
+ it("exports the shared failure shape for the runner's catch", () => {
+ expect(fetchFailed(new Error("Transitous answered 503"))).toEqual({
+ status: "fetch_failed",
+ reason: "Transitous answered 503",
+ });
+ });
+});
diff --git a/website/tools/transitous.ts b/website/tools/transitous.ts
new file mode 100644
index 000000000..696abb820
--- /dev/null
+++ b/website/tools/transitous.ts
@@ -0,0 +1,310 @@
+import type { X402Tool } from "../types/x402";
+
+/**
+ * Transitous (api.transitous.org, MOTIS 2 API) as tools for the chat model — stop search,
+ * departure boards and journey planning across Europe. Free, keyless, open CORS. Verified
+ * live against the API on 2026-10-13: an empty User-Agent gets a 403, but a browser's own
+ * UA is accepted — and browsers cannot set the header anyway (it is a forbidden header name
+ * in fetch, silently dropped), so no attempt is made here. The usage policy's identifiability
+ * intent is met by the Origin/Referer of the requests plus the visible citation line
+ * (`source: "transitous"` in AssistantChat's `sourceLinks`); it also asks for a heads-up in
+ * their Matrix channel before regular use of the routing endpoint, which is a merge
+ * precondition rather than a code concern.
+ *
+ * Deliberately stateless and React-free — see the fetch/select split below — so a future MCP
+ * server can import the fetchers and selectors directly and bring its own caching policy,
+ * instead of duplicating this logic or inheriting caching it doesn't want.
+ *
+ * `fetchGeocode`/`fetchStoptimes`/`fetchPlan` are dumb fetch wrappers that throw;
+ * `selectStops`/`selectBoard`/`selectJourneys` are pure functions over already-parsed JSON.
+ * The wiring lives in AssistantChat.tsx via `queryClient.fetchQuery` for caching and dedup —
+ * this module has no cache of its own.
+ */
+
+const BASE = "https://api.transitous.org/api";
+
+// Tool results are input tokens on every later hop of a metered chat endpoint, so projection
+// is mandatory, not a nicety: a raw single-itinerary /v1/plan response measures ~232 KB
+// (legGeometry, steps, intermediateStops); the projected result is ~1 KB. Coordinates are
+// dropped everywhere — maps are out of scope, and they are the single biggest token sink in
+// MOTIS responses after the per-leg baggage.
+const MAX_STOPS = 6;
+const MAX_ITINERARIES = 3;
+const MAX_LEGS = 8;
+const MAX_BOARD_ROWS = 8;
+const MAX_NAME_CHARS = 60;
+
+// --- Tool definitions (OpenAI function-calling shape) -------------------------------------
+
+export const searchStopTool: X402Tool = {
+ type: "function",
+ function: {
+ name: "search_stop",
+ description:
+ "Find stops and stations by name (Transitous, Europe-wide). Call this first when a " +
+ "journey or board request names a place, then pass a returned stop id to plan_journey " +
+ "or get_departures. If several stops match, pick with the user or take the obvious " +
+ "hub (e.g. 'Milano Centrale' over 'Milano Romolo').",
+ parameters: {
+ type: "object",
+ properties: {
+ query: {
+ type: "string",
+ description: "Stop or station name, e.g. 'Heidelberg Hbf', 'Milano Centrale'.",
+ },
+ },
+ required: ["query"],
+ },
+ },
+};
+
+export const planJourneyTool: X402Tool = {
+ type: "function",
+ function: {
+ name: "plan_journey",
+ description:
+ "Plan door-to-door journeys between two European stops (Transitous/MOTIS) by train, " +
+ "bus, coach, ferry or a mix; rail_only restricts to trains. from and to are stop ids " +
+ "from search_stop. Returns up to 3 itineraries with legs and live delays where " +
+ "operators publish them. All times are UTC ISO — convert to the user's local timezone " +
+ "before presenting. Schedules only: prices and booking are out of scope; when an " +
+ "itinerary has realTime=false, present times as scheduled and say so.",
+ parameters: {
+ type: "object",
+ properties: {
+ from: { type: "string", description: "Departure stop id from search_stop." },
+ to: { type: "string", description: "Arrival stop id from search_stop." },
+ departure: { type: "string", description: "ISO datetime; omit for 'now'." },
+ arrive_by: {
+ type: "boolean",
+ description: "Treat `departure` as the required arrival time instead of the departure time.",
+ },
+ rail_only: {
+ type: "boolean",
+ description: "Trains only, excludes buses and long-distance coaches. Default false.",
+ },
+ },
+ required: ["from", "to"],
+ },
+ },
+};
+
+export const getDeparturesTool: X402Tool = {
+ type: "function",
+ function: {
+ name: "get_departures",
+ description:
+ "Next departures from a stop with live delays (Transitous/MOTIS). Use for questions " +
+ "like 'what leaves from X in the next hour', or from a later moment ('tomorrow " +
+ "morning') by passing `time`. stop_id comes from search_stop. All times are UTC ISO " +
+ "— convert to the user's local timezone before presenting.",
+ parameters: {
+ type: "object",
+ properties: {
+ stop_id: { type: "string", description: "Stop id from search_stop." },
+ time: {
+ type: "string",
+ description: "ISO datetime the board starts from; omit for 'now'.",
+ },
+ },
+ required: ["stop_id"],
+ },
+ },
+};
+
+// --- Wire shapes (only the fields we read) -------------------------------------------------
+
+interface RawGeocodeRow {
+ type?: string;
+ name?: string;
+ id?: string;
+ modes?: string[];
+}
+
+interface RawPlace {
+ name?: string;
+ arrival?: string;
+ departure?: string;
+ scheduledArrival?: string;
+ scheduledDeparture?: string;
+ track?: string;
+ scheduledTrack?: string;
+}
+
+interface RawStoptime {
+ place?: RawPlace;
+ routeShortName?: string;
+ displayName?: string;
+ tripShortName?: string;
+ headsign?: string;
+ cancelled?: boolean;
+ realTime?: boolean;
+}
+
+interface RawStoptimesResponse {
+ stopTimes?: RawStoptime[];
+}
+
+interface RawLeg {
+ mode?: string;
+ duration?: number;
+ routeShortName?: string;
+ displayName?: string;
+ tripShortName?: string;
+ headsign?: string;
+ agencyName?: string;
+ from?: RawPlace;
+ to?: RawPlace;
+ cancelled?: boolean;
+ realTime?: boolean;
+}
+
+interface RawItinerary {
+ startTime?: string;
+ endTime?: string;
+ duration?: number;
+ transfers?: number;
+ legs?: RawLeg[];
+}
+
+interface RawPlanResponse {
+ itineraries?: RawItinerary[];
+}
+
+// --- Result contract ------------------------------------------------------------------------
+
+export type TransitousResult =
+ | { status: "ok"; [key: string]: unknown }
+ | { status: "bad_query"; reason: string }
+ | { status: "fetch_failed"; reason: string };
+
+/** Turns a fetch-time error (thrown by the fetchers) into a result. */
+export { fetchFailed } from "./failure";
+
+// --- Fetchers: plain fetch, no cache, throw on failure ---------------------------------------
+
+export class TransitousError extends Error {
+ constructor(message: string, readonly status: number | null = null) {
+ super(message);
+ this.name = "TransitousError";
+ }
+}
+
+async function get(path: string, params: Record): Promise {
+ const q = new URLSearchParams();
+ for (const [k, v] of Object.entries(params)) if (v) q.set(k, v);
+ const res = await fetch(`${BASE}${path}?${q}`, { headers: { accept: "application/json" } });
+ if (!res.ok) throw new TransitousError(`Transitous answered ${res.status}`, res.status);
+ return res.json() as Promise;
+}
+
+export const fetchGeocode = (query: string): Promise =>
+ get("/v1/geocode", { text: query });
+
+export const fetchStoptimes = (stopId: string, n = MAX_BOARD_ROWS, time?: string): Promise =>
+ get("/v1/stoptimes", { stopId, n: String(n), time });
+
+export const fetchPlan = (args: {
+ from: string;
+ to: string;
+ time?: string;
+ arriveBy?: boolean;
+ transitModes?: string;
+}): Promise =>
+ get("/v1/plan", {
+ fromPlace: args.from,
+ toPlace: args.to,
+ numItineraries: String(MAX_ITINERARIES),
+ time: args.time,
+ arriveBy: args.arriveBy ? "true" : undefined,
+ transitModes: args.transitModes,
+ });
+
+// --- Selectors: pure, synchronous, operate on already-parsed JSON ---------------------------
+
+const minutesBetween = (a?: string, b?: string) =>
+ a && b ? Math.round((Date.parse(a) - Date.parse(b)) / 60000) : 0;
+
+const clip = (s: unknown, n = MAX_NAME_CHARS): string | null => {
+ if (typeof s !== "string" || !s) return null;
+ return s.length > n ? s.slice(0, n - 1) + "…" : s;
+};
+
+/** One board/leg endpoint: name, the live time, the delay in minutes and the track. */
+const place = (p: RawPlace = {}) => {
+ const time = p.departure ?? p.arrival;
+ const scheduled = p.scheduledDeparture ?? p.scheduledArrival;
+ return {
+ name: clip(p.name),
+ time: time ?? null,
+ // The one number users act on. Positive = late; the sign must survive projection.
+ delayMin: minutesBetween(time, scheduled),
+ track: clip(p.track ?? p.scheduledTrack, 8),
+ };
+};
+
+/** [{name, id, modes}] — ids survive because the next call needs them. */
+export function selectStops(raw: unknown): TransitousResult {
+ const rows = (Array.isArray(raw) ? raw : []) as RawGeocodeRow[];
+ return {
+ status: "ok",
+ stops: rows
+ .filter((r) => r?.type === "STOP")
+ .slice(0, MAX_STOPS)
+ .map((r) => ({ name: clip(r.name), id: r.id, modes: r.modes ?? [] })),
+ };
+}
+
+/** Board rows only, no stop name: /v1/stoptimes has no top-level place field, and the model
+ * already knows the stop — it picked the id via search_stop. */
+export function selectBoard(raw: unknown): TransitousResult {
+ const board = (raw as RawStoptimesResponse | null) ?? {};
+ return {
+ status: "ok",
+ departures: (board.stopTimes ?? []).slice(0, MAX_BOARD_ROWS).map((s) => ({
+ line: clip(s.routeShortName ?? s.displayName, 16),
+ train: clip(s.tripShortName, 12),
+ headsign: clip(s.headsign),
+ time: s.place?.departure ?? null,
+ delayMin: minutesBetween(s.place?.departure, s.place?.scheduledDeparture),
+ track: clip(s.place?.track ?? s.place?.scheduledTrack, 8),
+ cancelled: !!s.cancelled,
+ // false = the operator publishes no live feed for this trip; the schedule is all we have.
+ realTime: !!s.realTime,
+ })),
+ };
+}
+
+export function selectJourneys(raw: unknown): TransitousResult {
+ const plan = (raw as RawPlanResponse | null) ?? {};
+ return {
+ status: "ok",
+ itineraries: (plan.itineraries ?? []).slice(0, MAX_ITINERARIES).map((it) => {
+ const legs = (it.legs ?? []).slice(0, MAX_LEGS).map((l) =>
+ l.mode === "WALK"
+ ? { walkMin: Math.round((l.duration ?? 0) / 60) }
+ : {
+ mode: l.mode ?? null,
+ line: clip(l.routeShortName ?? l.displayName, 16),
+ train: clip(l.tripShortName, 12),
+ headsign: clip(l.headsign),
+ agency: clip(l.agencyName, 30),
+ from: place(l.from),
+ to: place(l.to),
+ cancelled: !!l.cancelled,
+ realTime: !!l.realTime,
+ },
+ );
+ const rides = (it.legs ?? []).filter((l) => l.mode !== "WALK");
+ return {
+ start: it.startTime ?? null,
+ end: it.endTime ?? null,
+ durationMin: Math.round((it.duration ?? 0) / 60),
+ transfers: it.transfers ?? Math.max(0, rides.length - 1),
+ // No live feed anywhere on the route -> the model must say "scheduled times".
+ realTime: rides.some((l) => l.realTime),
+ legs,
+ };
+ }),
+ };
+}
From 51c2ed617f010a0740189c961ce3efbbecdd823a Mon Sep 17 00:00:00 2001
From: fretchen
Date: Thu, 15 Oct 2026 07:46:38 +0200
Subject: [PATCH 2/6] prettier
---
website/components/AssistantChat.tsx | 5 +-
website/locales/de.ts | 3 +-
website/locales/en.ts | 3 +-
website/test/AssistantChat.test.tsx | 4 +-
website/test/fixtures/transitous/geocode.json | 40 +--
website/test/fixtures/transitous/plan.json | 307 +++---------------
.../test/fixtures/transitous/stoptimes.json | 75 +----
website/tools/transitous.ts | 11 +-
8 files changed, 74 insertions(+), 374 deletions(-)
diff --git a/website/components/AssistantChat.tsx b/website/components/AssistantChat.tsx
index be7f99662..44b2ac115 100644
--- a/website/components/AssistantChat.tsx
+++ b/website/components/AssistantChat.tsx
@@ -877,7 +877,10 @@ export function AssistantChat() {
*/
const argString = (v: unknown): string => (typeof v === "string" ? v : "");
- async function loadTransitous(kind: "geocode" | "stoptimes" | "plan", args: Record): Promise {
+ async function loadTransitous(
+ kind: "geocode" | "stoptimes" | "plan",
+ args: Record,
+ ): Promise {
// An empty required argument is an answer the model can act on, not a malfunction: fetching
// anyway would 4xx at the API, `fetch_failed` would withdraw the tool for the rest of the
// turn, and with it the one thing that fixes the mistake — a corrected query, a real stop
diff --git a/website/locales/de.ts b/website/locales/de.ts
index da1d61866..04357b6a9 100644
--- a/website/locales/de.ts
+++ b/website/locales/de.ts
@@ -117,7 +117,8 @@ export default {
// in ToolSelector kommt vom ersten Eintrag der Gruppe (siehe TOOL_REGISTRY), und das
// ist dieser — sie beschreibt deshalb die ganze Fähigkeit und nennt die Verkehrsmittel,
// weil das Zeilenlabel ("Fahrplan") bewusst gattungsneutral bleibt.
- toolTransitSearchDesc: "Züge, Busse und Fähren in ganz Europa – Verbindungen und Abfahrten, mit Echtzeit, wo Betreiber sie liefern.",
+ toolTransitSearchDesc:
+ "Züge, Busse und Fähren in ganz Europa – Verbindungen und Abfahrten, mit Echtzeit, wo Betreiber sie liefern.",
toolTransitPlanDesc: "Plant eine Verbindung von Tür zu Tür – Züge, Busse, Fähren.",
toolTransitDeparturesDesc: "Die nächsten Abfahrten einer Haltestelle.",
// Zeilentitel für die zusammengefasste Zeile in ToolSelector (get_sitzungen +
diff --git a/website/locales/en.ts b/website/locales/en.ts
index a5303751a..a55a24d34 100644
--- a/website/locales/en.ts
+++ b/website/locales/en.ts
@@ -114,7 +114,8 @@ export default {
// The one actually shown: the grouped timetable row's description comes from the first
// entry in that group (see TOOL_REGISTRY), so this describes the whole capability and
// names the modes — the row label stays deliberately generic.
- toolTransitSearchDesc: "Trains, buses and ferries across Europe — journeys and departures, with live times where operators publish them.",
+ toolTransitSearchDesc:
+ "Trains, buses and ferries across Europe — journeys and departures, with live times where operators publish them.",
toolTransitPlanDesc: "Plans a door-to-door journey — trains, buses, ferries.",
toolTransitDeparturesDesc: "The next departures from a stop.",
capBundestag: "Bundestag",
diff --git a/website/test/AssistantChat.test.tsx b/website/test/AssistantChat.test.tsx
index 5eb1beefc..205ba1839 100644
--- a/website/test/AssistantChat.test.tsx
+++ b/website/test/AssistantChat.test.tsx
@@ -906,9 +906,7 @@ describe("AssistantChat", () => {
// (TOOL_REGISTRY's `group`, whose locale value is the row label), so one click
// switches off all three wire names at once.
fireEvent.click(screen.getAllByLabelText("Train & bus")[0]);
- expect(window.localStorage.getItem("x402-chat-disabled-tools")).toBe(
- "search_stop,plan_journey,get_departures",
- );
+ expect(window.localStorage.getItem("x402-chat-disabled-tools")).toBe("search_stop,plan_journey,get_departures");
sendUserMessage("Hi");
await waitFor(() => expect(mockSendMessage).toHaveBeenCalledOnce());
diff --git a/website/test/fixtures/transitous/geocode.json b/website/test/fixtures/transitous/geocode.json
index c9b4bb187..5399171c2 100644
--- a/website/test/fixtures/transitous/geocode.json
+++ b/website/test/fixtures/transitous/geocode.json
@@ -155,10 +155,7 @@
}
],
"score": -26.631120681762695,
- "modes": [
- "TRAM",
- "BUS"
- ],
+ "modes": ["TRAM", "BUS"],
"importance": 0.000045373457396635786
},
{
@@ -306,16 +303,7 @@
}
],
"score": -18.81806755065918,
- "modes": [
- "HIGHSPEED_RAIL",
- "LONG_DISTANCE",
- "NIGHT_RAIL",
- "REGIONAL_RAIL",
- "SUBURBAN",
- "SUBWAY",
- "TRAM",
- "BUS"
- ],
+ "modes": ["HIGHSPEED_RAIL", "LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "SUBURBAN", "SUBWAY", "TRAM", "BUS"],
"importance": 0.021757638081908226
},
{
@@ -359,16 +347,7 @@
}
],
"score": -18.813016891479492,
- "modes": [
- "HIGHSPEED_RAIL",
- "LONG_DISTANCE",
- "COACH",
- "NIGHT_RAIL",
- "REGIONAL_RAIL",
- "SUBURBAN",
- "SUBWAY",
- "BUS"
- ],
+ "modes": ["HIGHSPEED_RAIL", "LONG_DISTANCE", "COACH", "NIGHT_RAIL", "REGIONAL_RAIL", "SUBURBAN", "SUBWAY", "BUS"],
"importance": 0.021419377997517586
},
{
@@ -539,16 +518,7 @@
}
],
"score": -18.104284286499023,
- "modes": [
- "HIGHSPEED_RAIL",
- "LONG_DISTANCE",
- "COACH",
- "NIGHT_RAIL",
- "RIDE_SHARING",
- "REGIONAL_RAIL",
- "TRAM",
- "BUS"
- ],
+ "modes": ["HIGHSPEED_RAIL", "LONG_DISTANCE", "COACH", "NIGHT_RAIL", "RIDE_SHARING", "REGIONAL_RAIL", "TRAM", "BUS"],
"importance": 0.005886611994355917
}
-]
\ No newline at end of file
+]
diff --git a/website/test/fixtures/transitous/plan.json b/website/test/fixtures/transitous/plan.json
index d109ec472..a66f0ca97 100644
--- a/website/test/fixtures/transitous/plan.json
+++ b/website/test/fixtures/transitous/plan.json
@@ -30,15 +30,7 @@
"level": 2,
"tz": "Europe/Rome",
"vertexType": "TRANSIT",
- "modes": [
- "HIGHSPEED_RAIL",
- "LONG_DISTANCE",
- "NIGHT_RAIL",
- "REGIONAL_RAIL",
- "SUBURBAN",
- "TRAM",
- "BUS"
- ]
+ "modes": ["HIGHSPEED_RAIL", "LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "SUBURBAN", "TRAM", "BUS"]
},
"direct": [],
"itineraries": [
@@ -167,11 +159,7 @@
"pickupType": "NORMAL",
"dropoffType": "NORMAL",
"cancelled": false,
- "modes": [
- "REGIONAL_RAIL",
- "SUBURBAN",
- "BUS"
- ]
+ "modes": ["REGIONAL_RAIL", "SUBURBAN", "BUS"]
},
"routeId": "de-DELFI_de:rlp:s3:_109",
"routeUrl": "",
@@ -211,12 +199,7 @@
"pickupType": "NORMAL",
"dropoffType": "NORMAL",
"cancelled": false,
- "modes": [
- "REGIONAL_RAIL",
- "SUBURBAN",
- "BUS",
- "ODM"
- ]
+ "modes": ["REGIONAL_RAIL", "SUBURBAN", "BUS", "ODM"]
},
{
"name": "MA-Friedrichsfeld, Südbahnhof",
@@ -238,11 +221,7 @@
"pickupType": "NORMAL",
"dropoffType": "NORMAL",
"cancelled": false,
- "modes": [
- "SUBURBAN",
- "BUS",
- "ODM"
- ]
+ "modes": ["SUBURBAN", "BUS", "ODM"]
}
],
"legGeometry": {
@@ -374,13 +353,7 @@
"pickupType": "NORMAL",
"dropoffType": "NORMAL",
"cancelled": false,
- "modes": [
- "HIGHSPEED_RAIL",
- "LONG_DISTANCE",
- "NIGHT_RAIL",
- "REGIONAL_RAIL",
- "SUBURBAN"
- ]
+ "modes": ["HIGHSPEED_RAIL", "LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "SUBURBAN"]
},
"duration": 12180,
"startTime": "2026-10-15T05:37:00Z",
@@ -406,15 +379,7 @@
"pickupType": "NORMAL",
"dropoffType": "NORMAL",
"cancelled": false,
- "modes": [
- "HIGHSPEED_RAIL",
- "LONG_DISTANCE",
- "NIGHT_RAIL",
- "REGIONAL_RAIL",
- "SUBURBAN",
- "TRAM",
- "BUS"
- ]
+ "modes": ["HIGHSPEED_RAIL", "LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "SUBURBAN", "TRAM", "BUS"]
},
"tripTo": {
"name": "Basel SBB",
@@ -431,15 +396,7 @@
"pickupType": "NORMAL",
"dropoffType": "NORMAL",
"cancelled": false,
- "modes": [
- "HIGHSPEED_RAIL",
- "LONG_DISTANCE",
- "NIGHT_RAIL",
- "REGIONAL_RAIL",
- "SUBURBAN",
- "TRAM",
- "BUS"
- ]
+ "modes": ["HIGHSPEED_RAIL", "LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "SUBURBAN", "TRAM", "BUS"]
},
"routeId": "de-DELFI_162290_101",
"routeUrl": "",
@@ -509,13 +466,7 @@
"pickupType": "NORMAL",
"dropoffType": "NORMAL",
"cancelled": false,
- "modes": [
- "HIGHSPEED_RAIL",
- "LONG_DISTANCE",
- "NIGHT_RAIL",
- "REGIONAL_RAIL",
- "BUS"
- ]
+ "modes": ["HIGHSPEED_RAIL", "LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "BUS"]
}
],
"legGeometry": {
@@ -544,13 +495,7 @@
"track": "10",
"vertexType": "TRANSIT",
"cancelled": false,
- "modes": [
- "HIGHSPEED_RAIL",
- "LONG_DISTANCE",
- "NIGHT_RAIL",
- "REGIONAL_RAIL",
- "SUBURBAN"
- ]
+ "modes": ["HIGHSPEED_RAIL", "LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "SUBURBAN"]
},
"to": {
"name": "ZUERICH HB",
@@ -564,13 +509,7 @@
"arrival": "2026-10-15T09:05:00Z",
"scheduledArrival": "2026-10-15T09:05:00Z",
"vertexType": "TRANSIT",
- "modes": [
- "HIGHSPEED_RAIL",
- "LONG_DISTANCE",
- "NIGHT_RAIL",
- "REGIONAL_RAIL",
- "SUBURBAN"
- ]
+ "modes": ["HIGHSPEED_RAIL", "LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "SUBURBAN"]
},
"duration": 300,
"startTime": "2026-10-15T09:00:00Z",
@@ -603,13 +542,7 @@
"pickupType": "NORMAL",
"dropoffType": "NORMAL",
"cancelled": false,
- "modes": [
- "HIGHSPEED_RAIL",
- "LONG_DISTANCE",
- "NIGHT_RAIL",
- "REGIONAL_RAIL",
- "SUBURBAN"
- ]
+ "modes": ["HIGHSPEED_RAIL", "LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "SUBURBAN"]
},
"to": {
"name": "MILANO CENTRALE",
@@ -626,15 +559,7 @@
"pickupType": "NORMAL",
"dropoffType": "NORMAL",
"cancelled": false,
- "modes": [
- "HIGHSPEED_RAIL",
- "LONG_DISTANCE",
- "NIGHT_RAIL",
- "REGIONAL_RAIL",
- "SUBURBAN",
- "TRAM",
- "BUS"
- ]
+ "modes": ["HIGHSPEED_RAIL", "LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "SUBURBAN", "TRAM", "BUS"]
},
"duration": 11820,
"startTime": "2026-10-15T09:33:00Z",
@@ -660,13 +585,7 @@
"pickupType": "NORMAL",
"dropoffType": "NORMAL",
"cancelled": false,
- "modes": [
- "HIGHSPEED_RAIL",
- "LONG_DISTANCE",
- "NIGHT_RAIL",
- "REGIONAL_RAIL",
- "SUBURBAN"
- ]
+ "modes": ["HIGHSPEED_RAIL", "LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "SUBURBAN"]
},
"tripTo": {
"name": "MILANO CENTRALE",
@@ -683,15 +602,7 @@
"pickupType": "NORMAL",
"dropoffType": "NORMAL",
"cancelled": false,
- "modes": [
- "HIGHSPEED_RAIL",
- "LONG_DISTANCE",
- "NIGHT_RAIL",
- "REGIONAL_RAIL",
- "SUBURBAN",
- "TRAM",
- "BUS"
- ]
+ "modes": ["HIGHSPEED_RAIL", "LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "SUBURBAN", "TRAM", "BUS"]
},
"routeId": "it-trenitalia_60083_7cf9622d2ca9dab7",
"routeUrl": "",
@@ -728,10 +639,7 @@
"pickupType": "NORMAL",
"dropoffType": "NORMAL",
"cancelled": false,
- "modes": [
- "LONG_DISTANCE",
- "REGIONAL_RAIL"
- ]
+ "modes": ["LONG_DISTANCE", "REGIONAL_RAIL"]
},
{
"name": "ARTH-GOLDAU",
@@ -750,14 +658,7 @@
"pickupType": "NORMAL",
"dropoffType": "NORMAL",
"cancelled": false,
- "modes": [
- "LONG_DISTANCE",
- "NIGHT_RAIL",
- "REGIONAL_RAIL",
- "SUBURBAN",
- "BUS",
- "FUNICULAR"
- ]
+ "modes": ["LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "SUBURBAN", "BUS", "FUNICULAR"]
}
],
"legGeometry": {
@@ -896,11 +797,7 @@
"pickupType": "NORMAL",
"dropoffType": "NORMAL",
"cancelled": false,
- "modes": [
- "REGIONAL_RAIL",
- "SUBURBAN",
- "BUS"
- ]
+ "modes": ["REGIONAL_RAIL", "SUBURBAN", "BUS"]
},
"routeId": "de-DELFI_de:rlp:s3:_109",
"routeUrl": "",
@@ -940,12 +837,7 @@
"pickupType": "NORMAL",
"dropoffType": "NORMAL",
"cancelled": false,
- "modes": [
- "REGIONAL_RAIL",
- "SUBURBAN",
- "BUS",
- "ODM"
- ]
+ "modes": ["REGIONAL_RAIL", "SUBURBAN", "BUS", "ODM"]
},
{
"name": "MA-Friedrichsfeld, Südbahnhof",
@@ -967,11 +859,7 @@
"pickupType": "NORMAL",
"dropoffType": "NORMAL",
"cancelled": false,
- "modes": [
- "SUBURBAN",
- "BUS",
- "ODM"
- ]
+ "modes": ["SUBURBAN", "BUS", "ODM"]
}
],
"legGeometry": {
@@ -1103,13 +991,7 @@
"pickupType": "NORMAL",
"dropoffType": "NORMAL",
"cancelled": false,
- "modes": [
- "HIGHSPEED_RAIL",
- "LONG_DISTANCE",
- "NIGHT_RAIL",
- "REGIONAL_RAIL",
- "SUBURBAN"
- ]
+ "modes": ["HIGHSPEED_RAIL", "LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "SUBURBAN"]
},
"duration": 12180,
"startTime": "2026-10-15T05:37:00Z",
@@ -1135,15 +1017,7 @@
"pickupType": "NORMAL",
"dropoffType": "NORMAL",
"cancelled": false,
- "modes": [
- "HIGHSPEED_RAIL",
- "LONG_DISTANCE",
- "NIGHT_RAIL",
- "REGIONAL_RAIL",
- "SUBURBAN",
- "TRAM",
- "BUS"
- ]
+ "modes": ["HIGHSPEED_RAIL", "LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "SUBURBAN", "TRAM", "BUS"]
},
"tripTo": {
"name": "Basel SBB",
@@ -1160,15 +1034,7 @@
"pickupType": "NORMAL",
"dropoffType": "NORMAL",
"cancelled": false,
- "modes": [
- "HIGHSPEED_RAIL",
- "LONG_DISTANCE",
- "NIGHT_RAIL",
- "REGIONAL_RAIL",
- "SUBURBAN",
- "TRAM",
- "BUS"
- ]
+ "modes": ["HIGHSPEED_RAIL", "LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "SUBURBAN", "TRAM", "BUS"]
},
"routeId": "de-DELFI_162290_101",
"routeUrl": "",
@@ -1238,13 +1104,7 @@
"pickupType": "NORMAL",
"dropoffType": "NORMAL",
"cancelled": false,
- "modes": [
- "HIGHSPEED_RAIL",
- "LONG_DISTANCE",
- "NIGHT_RAIL",
- "REGIONAL_RAIL",
- "BUS"
- ]
+ "modes": ["HIGHSPEED_RAIL", "LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "BUS"]
}
],
"legGeometry": {
@@ -1273,13 +1133,7 @@
"track": "10",
"vertexType": "TRANSIT",
"cancelled": false,
- "modes": [
- "HIGHSPEED_RAIL",
- "LONG_DISTANCE",
- "NIGHT_RAIL",
- "REGIONAL_RAIL",
- "SUBURBAN"
- ]
+ "modes": ["HIGHSPEED_RAIL", "LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "SUBURBAN"]
},
"to": {
"name": "Zürich HB",
@@ -1295,13 +1149,7 @@
"scheduledTrack": "8",
"track": "8",
"vertexType": "TRANSIT",
- "modes": [
- "HIGHSPEED_RAIL",
- "LONG_DISTANCE",
- "NIGHT_RAIL",
- "REGIONAL_RAIL",
- "SUBURBAN"
- ]
+ "modes": ["HIGHSPEED_RAIL", "LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "SUBURBAN"]
},
"duration": 300,
"startTime": "2026-10-15T09:00:00Z",
@@ -1336,13 +1184,7 @@
"pickupType": "NORMAL",
"dropoffType": "NORMAL",
"cancelled": false,
- "modes": [
- "HIGHSPEED_RAIL",
- "LONG_DISTANCE",
- "NIGHT_RAIL",
- "REGIONAL_RAIL",
- "SUBURBAN"
- ]
+ "modes": ["HIGHSPEED_RAIL", "LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "SUBURBAN"]
},
"to": {
"name": "Lugano",
@@ -1361,12 +1203,7 @@
"pickupType": "NORMAL",
"dropoffType": "NORMAL",
"cancelled": false,
- "modes": [
- "LONG_DISTANCE",
- "NIGHT_RAIL",
- "REGIONAL_RAIL",
- "SUBURBAN"
- ]
+ "modes": ["LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "SUBURBAN"]
},
"duration": 6780,
"startTime": "2026-10-15T09:05:00Z",
@@ -1394,13 +1231,7 @@
"pickupType": "NORMAL",
"dropoffType": "NORMAL",
"cancelled": false,
- "modes": [
- "HIGHSPEED_RAIL",
- "LONG_DISTANCE",
- "NIGHT_RAIL",
- "REGIONAL_RAIL",
- "SUBURBAN"
- ]
+ "modes": ["HIGHSPEED_RAIL", "LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "SUBURBAN"]
},
"tripTo": {
"name": "Lugano",
@@ -1419,12 +1250,7 @@
"pickupType": "NORMAL",
"dropoffType": "NORMAL",
"cancelled": false,
- "modes": [
- "LONG_DISTANCE",
- "NIGHT_RAIL",
- "REGIONAL_RAIL",
- "SUBURBAN"
- ]
+ "modes": ["LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "SUBURBAN"]
},
"routeId": "ch-opentransportdataswiss26_91-2-G-j26-1",
"routeUrl": "",
@@ -1461,11 +1287,7 @@
"pickupType": "NORMAL",
"dropoffType": "NORMAL",
"cancelled": false,
- "modes": [
- "LONG_DISTANCE",
- "REGIONAL_RAIL",
- "SUBURBAN"
- ]
+ "modes": ["LONG_DISTANCE", "REGIONAL_RAIL", "SUBURBAN"]
},
{
"name": "Arth-Goldau",
@@ -1486,14 +1308,7 @@
"pickupType": "NORMAL",
"dropoffType": "NORMAL",
"cancelled": false,
- "modes": [
- "LONG_DISTANCE",
- "NIGHT_RAIL",
- "REGIONAL_RAIL",
- "SUBURBAN",
- "BUS",
- "FUNICULAR"
- ]
+ "modes": ["LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "SUBURBAN", "BUS", "FUNICULAR"]
}
],
"legGeometry": {
@@ -1524,12 +1339,7 @@
"track": "2",
"vertexType": "TRANSIT",
"cancelled": false,
- "modes": [
- "LONG_DISTANCE",
- "NIGHT_RAIL",
- "REGIONAL_RAIL",
- "SUBURBAN"
- ]
+ "modes": ["LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "SUBURBAN"]
},
"to": {
"name": "Lugano",
@@ -1545,12 +1355,7 @@
"scheduledTrack": "1",
"track": "1",
"vertexType": "TRANSIT",
- "modes": [
- "LONG_DISTANCE",
- "NIGHT_RAIL",
- "REGIONAL_RAIL",
- "SUBURBAN"
- ]
+ "modes": ["LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "SUBURBAN"]
},
"duration": 240,
"startTime": "2026-10-15T10:58:00Z",
@@ -1585,12 +1390,7 @@
"pickupType": "NORMAL",
"dropoffType": "NORMAL",
"cancelled": false,
- "modes": [
- "LONG_DISTANCE",
- "NIGHT_RAIL",
- "REGIONAL_RAIL",
- "SUBURBAN"
- ]
+ "modes": ["LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "SUBURBAN"]
},
"to": {
"name": "Milano Centrale",
@@ -1607,15 +1407,7 @@
"pickupType": "NORMAL",
"dropoffType": "NORMAL",
"cancelled": false,
- "modes": [
- "HIGHSPEED_RAIL",
- "LONG_DISTANCE",
- "NIGHT_RAIL",
- "REGIONAL_RAIL",
- "SUBURBAN",
- "TRAM",
- "BUS"
- ]
+ "modes": ["HIGHSPEED_RAIL", "LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "SUBURBAN", "TRAM", "BUS"]
},
"duration": 4500,
"startTime": "2026-10-15T11:02:00Z",
@@ -1643,11 +1435,7 @@
"pickupType": "NORMAL",
"dropoffType": "NORMAL",
"cancelled": false,
- "modes": [
- "LONG_DISTANCE",
- "REGIONAL_RAIL",
- "SUBURBAN"
- ]
+ "modes": ["LONG_DISTANCE", "REGIONAL_RAIL", "SUBURBAN"]
},
"tripTo": {
"name": "Milano Centrale",
@@ -1664,15 +1452,7 @@
"pickupType": "NORMAL",
"dropoffType": "NORMAL",
"cancelled": false,
- "modes": [
- "HIGHSPEED_RAIL",
- "LONG_DISTANCE",
- "NIGHT_RAIL",
- "REGIONAL_RAIL",
- "SUBURBAN",
- "TRAM",
- "BUS"
- ]
+ "modes": ["HIGHSPEED_RAIL", "LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "SUBURBAN", "TRAM", "BUS"]
},
"routeId": "ch-opentransportdataswiss26_91-80-j26-1",
"routeUrl": "",
@@ -1709,10 +1489,7 @@
"pickupType": "NORMAL",
"dropoffType": "NORMAL",
"cancelled": false,
- "modes": [
- "REGIONAL_RAIL",
- "SUBURBAN"
- ]
+ "modes": ["REGIONAL_RAIL", "SUBURBAN"]
},
{
"name": "Mendrisio",
@@ -1733,11 +1510,7 @@
"pickupType": "NORMAL",
"dropoffType": "NORMAL",
"cancelled": false,
- "modes": [
- "LONG_DISTANCE",
- "REGIONAL_RAIL",
- "SUBURBAN"
- ]
+ "modes": ["LONG_DISTANCE", "REGIONAL_RAIL", "SUBURBAN"]
}
],
"legGeometry": {
@@ -1754,4 +1527,4 @@
],
"previousPageCursor": "EARLIER|1792038420",
"nextPageCursor": "LATER|1792045500"
-}
\ No newline at end of file
+}
diff --git a/website/test/fixtures/transitous/stoptimes.json b/website/test/fixtures/transitous/stoptimes.json
index 474b7d95b..36cfe919b 100644
--- a/website/test/fixtures/transitous/stoptimes.json
+++ b/website/test/fixtures/transitous/stoptimes.json
@@ -50,10 +50,7 @@
"pickupType": "NORMAL",
"dropoffType": "NORMAL",
"cancelled": false,
- "modes": [
- "TRAM",
- "BUS"
- ]
+ "modes": ["TRAM", "BUS"]
},
"tripTo": {
"name": "Viernheim, Bahnhof",
@@ -70,11 +67,7 @@
"pickupType": "NORMAL",
"dropoffType": "NORMAL",
"cancelled": false,
- "modes": [
- "TRAM",
- "BUS",
- "ODM"
- ]
+ "modes": ["TRAM", "BUS", "ODM"]
},
"agencyId": "7911",
"agencyName": "RNV HD-MA-Weinheim (Strab)",
@@ -145,9 +138,7 @@
"pickupType": "NORMAL",
"dropoffType": "NORMAL",
"cancelled": false,
- "modes": [
- "BUS"
- ]
+ "modes": ["BUS"]
},
"tripTo": {
"name": "Heidelberg, Universitätsplatz",
@@ -161,9 +152,7 @@
"pickupType": "NORMAL",
"dropoffType": "NORMAL",
"cancelled": false,
- "modes": [
- "BUS"
- ]
+ "modes": ["BUS"]
},
"agencyId": "7915",
"agencyName": "RNV Heidelberg (Bus)",
@@ -237,9 +226,7 @@
"pickupType": "NORMAL",
"dropoffType": "NORMAL",
"cancelled": false,
- "modes": [
- "BUS"
- ]
+ "modes": ["BUS"]
},
"tripTo": {
"name": "Neuenheim, Schwimmbad",
@@ -256,9 +243,7 @@
"pickupType": "NORMAL",
"dropoffType": "NORMAL",
"cancelled": false,
- "modes": [
- "BUS"
- ]
+ "modes": ["BUS"]
},
"agencyId": "7915",
"agencyName": "RNV Heidelberg (Bus)",
@@ -332,12 +317,7 @@
"pickupType": "NORMAL",
"dropoffType": "NORMAL",
"cancelled": false,
- "modes": [
- "RIDE_SHARING",
- "TRAM",
- "BUS",
- "ODM"
- ]
+ "modes": ["RIDE_SHARING", "TRAM", "BUS", "ODM"]
},
"tripTo": {
"name": "Weinheim, Alter OEG-Bahnhof",
@@ -354,12 +334,7 @@
"pickupType": "NORMAL",
"dropoffType": "NORMAL",
"cancelled": false,
- "modes": [
- "RIDE_SHARING",
- "TRAM",
- "BUS",
- "ODM"
- ]
+ "modes": ["RIDE_SHARING", "TRAM", "BUS", "ODM"]
},
"agencyId": "7911",
"agencyName": "RNV HD-MA-Weinheim (Strab)",
@@ -458,10 +433,7 @@
"pickupType": "NORMAL",
"dropoffType": "NORMAL",
"cancelled": false,
- "modes": [
- "BUS",
- "ODM"
- ]
+ "modes": ["BUS", "ODM"]
},
"agencyId": "7927",
"agencyName": "Busverkehr-Rhein-Neckar",
@@ -537,14 +509,7 @@
"pickupType": "NORMAL",
"dropoffType": "NORMAL",
"cancelled": false,
- "modes": [
- "HIGHSPEED_RAIL",
- "COACH",
- "REGIONAL_RAIL",
- "SUBURBAN",
- "BUS",
- "ODM"
- ]
+ "modes": ["HIGHSPEED_RAIL", "COACH", "REGIONAL_RAIL", "SUBURBAN", "BUS", "ODM"]
},
"tripTo": {
"name": "Karlsruhe Hauptbahnhof",
@@ -646,9 +611,7 @@
"pickupType": "NORMAL",
"dropoffType": "NORMAL",
"cancelled": false,
- "modes": [
- "TRAM"
- ]
+ "modes": ["TRAM"]
},
"tripTo": {
"name": "Rohrbach, Süd",
@@ -665,10 +628,7 @@
"pickupType": "NORMAL",
"dropoffType": "NORMAL",
"cancelled": false,
- "modes": [
- "TRAM",
- "BUS"
- ]
+ "modes": ["TRAM", "BUS"]
},
"agencyId": "7910",
"agencyName": "RNV Heidelberg (Strab)",
@@ -772,14 +732,7 @@
"pickupType": "NORMAL",
"dropoffType": "NORMAL",
"cancelled": false,
- "modes": [
- "HIGHSPEED_RAIL",
- "COACH",
- "REGIONAL_RAIL",
- "SUBURBAN",
- "BUS",
- "ODM"
- ]
+ "modes": ["HIGHSPEED_RAIL", "COACH", "REGIONAL_RAIL", "SUBURBAN", "BUS", "ODM"]
},
"agencyId": "10449",
"agencyName": "DB Regio AG Mitte Region Südwest",
@@ -827,4 +780,4 @@
},
"previousPageCursor": "EARLIER|1792038360",
"nextPageCursor": "LATER|1792038840"
-}
\ No newline at end of file
+}
diff --git a/website/tools/transitous.ts b/website/tools/transitous.ts
index 696abb820..dd75cdd22 100644
--- a/website/tools/transitous.ts
+++ b/website/tools/transitous.ts
@@ -184,7 +184,10 @@ export { fetchFailed } from "./failure";
// --- Fetchers: plain fetch, no cache, throw on failure ---------------------------------------
export class TransitousError extends Error {
- constructor(message: string, readonly status: number | null = null) {
+ constructor(
+ message: string,
+ readonly status: number | null = null,
+ ) {
super(message);
this.name = "TransitousError";
}
@@ -198,8 +201,7 @@ async function get(path: string, params: Record):
return res.json() as Promise;
}
-export const fetchGeocode = (query: string): Promise =>
- get("/v1/geocode", { text: query });
+export const fetchGeocode = (query: string): Promise => get("/v1/geocode", { text: query });
export const fetchStoptimes = (stopId: string, n = MAX_BOARD_ROWS, time?: string): Promise =>
get("/v1/stoptimes", { stopId, n: String(n), time });
@@ -222,8 +224,7 @@ export const fetchPlan = (args: {
// --- Selectors: pure, synchronous, operate on already-parsed JSON ---------------------------
-const minutesBetween = (a?: string, b?: string) =>
- a && b ? Math.round((Date.parse(a) - Date.parse(b)) / 60000) : 0;
+const minutesBetween = (a?: string, b?: string) => (a && b ? Math.round((Date.parse(a) - Date.parse(b)) / 60000) : 0);
const clip = (s: unknown, n = MAX_NAME_CHARS): string | null => {
if (typeof s !== "string" || !s) return null;
From 218d82aaf09db15afe9bc082636e1a74b2c8dac4 Mon Sep 17 00:00:00 2001
From: fretchen
Date: Fri, 16 Oct 2026 18:05:32 +0200
Subject: [PATCH 3/6] first round of changes
---
website/components/AssistantChat.tsx | 22 +++-
website/hooks/useX402Chat.ts | 55 ++++++++--
website/hooks/x402Currency.ts | 44 ++++++++
website/locales/de.ts | 4 +
website/locales/en.ts | 4 +
website/test/AssistantChat.test.tsx | 39 ++++++-
website/test/failure.test.ts | 3 +
website/test/useX402Chat.test.ts | 149 +++++++++++++++++++++++++++
website/test/x402Currency.test.ts | 56 ++++++++++
website/test/x402PaidFetch.test.ts | 49 +++++++++
website/utils/x402PaidFetch.ts | 61 ++++++++++-
11 files changed, 472 insertions(+), 14 deletions(-)
diff --git a/website/components/AssistantChat.tsx b/website/components/AssistantChat.tsx
index 44b2ac115..3e0b360e5 100644
--- a/website/components/AssistantChat.tsx
+++ b/website/components/AssistantChat.tsx
@@ -554,6 +554,10 @@ export function AssistantChat() {
const networkFallbackLabel = useLocale({ label: "assistent.networkFallback" });
const eurcBaseOnlyLabel = useLocale({ label: "payment.eurcBaseOnly" });
const currencyFallbackLabel = useLocale({ label: "payment.currencyFallback" });
+ // The wallet-side note: guarded-B fell back to a token the wallet can fund. Named apart from
+ // `payment.currencyFallback` (the agent-side note below) because the reasons differ — "the
+ // agent doesn't take it" and "your wallet holds none of it" must not share a sentence.
+ const walletFallbackLabel = useLocale({ label: "assistent.walletFallback" });
// Mobile detection
React.useEffect(() => {
@@ -704,6 +708,7 @@ export function AssistantChat() {
paymentReceipt,
paymentNetwork,
paymentCurrency,
+ currencyFallback,
status: chatStatus,
} = useX402Chat(desiredNetwork, agentUrl, currency);
const { network, switchIfNeeded, getSwitchError } = useAutoNetwork([paymentNetwork]);
@@ -1413,8 +1418,10 @@ export function AssistantChat() {
)}
{/* Separately from the network fallback above: the agent may accept the negotiated
- network but only in the other currency (e.g. USDC-only on Base). */}
- {paymentCurrency !== currency && (
+ network but only in the other currency (e.g. USDC-only on Base). Suppressed when
+ the wallet note is active — then the deviation is the wallet's, not the agent's,
+ and the wrong attribution would be worse than silence. */}
+ {paymentCurrency !== currency && !currencyFallback && (
{currencyFallbackLabel} {paymentCurrency}.
@@ -1599,6 +1606,17 @@ export function AssistantChat() {
))
)}
+ {currencyFallback && (
+ // One honest line when the send switched token: the deviation is announced, the
+ // stored preference stays untouched (the hook never persists a fallback), and
+ // the line quietly teaches where the currency setting lives.
+
+ {walletFallbackLabel
+ .replaceAll("{used}", currencyFallback.used)
+ .replaceAll("{preferred}", currencyFallback.preferred)}
+
+ )}
+
{isLoading && (
{isDefaultAgent &&
}
diff --git a/website/hooks/useX402Chat.ts b/website/hooks/useX402Chat.ts
index 542a19b5f..a09f5a2e0 100644
--- a/website/hooks/useX402Chat.ts
+++ b/website/hooks/useX402Chat.ts
@@ -17,8 +17,8 @@ import { useWalletClient } from "wagmi";
import { getConfiguredPublicClient } from "./useConfiguredPublicClient";
import { useIsWalletConnected } from "./useIsWalletConnected";
import { probeAccepts, negotiateNetwork, LLM_V1_FLOOR } from "./x402Discovery";
-import { DEFAULT_CURRENCY, offeredCurrency, type PaymentCurrency } from "./x402Currency";
-import { createPaidFetch, type PaidFetch } from "../utils/x402PaidFetch";
+import { DEFAULT_CURRENCY, offeredCurrency, offeredCurrencies, selectFundedCurrency, type PaymentCurrency } from "./x402Currency";
+import { createPaidFetch, readFundableTokens, type PaidFetch } from "../utils/x402PaidFetch";
import type {
X402ChatMessage,
X402ChatResponse,
@@ -68,6 +68,14 @@ export interface UseX402ChatResult {
* `currency` until the agent has been probed.
*/
paymentCurrency: PaymentCurrency;
+ /**
+ * When the token this send would have paid in could not fund its deposit and another
+ * token the wallet holds and the agent offers was used instead: `{ preferred, used }`,
+ * per-payment and never persisted (the stored preference stays the user's alone). Null
+ * on every send that paid in the negotiated currency. The component announces it; the
+ * deposit signature was the consent gate.
+ */
+ currencyFallback: { preferred: PaymentCurrency; used: PaymentCurrency } | null;
}
/**
@@ -101,6 +109,11 @@ export function useX402Chat(
network: string;
paid: PaymentCurrency;
} | null>(null);
+ // The guarded-B fallback of the most recent send, or null — set per send, never persisted.
+ const [currencyFallback, setCurrencyFallback] = useState<{
+ preferred: PaymentCurrency;
+ used: PaymentCurrency;
+ } | null>(null);
const isCurrent =
negotiated?.agentUrl === agentUrl && negotiated?.preferred === network && negotiated?.currency === currency;
const paymentNetwork = isCurrent ? negotiated.network : network;
@@ -155,10 +168,6 @@ export function useX402Chat(
// that — proceed on the preferred network and let the real 402 be the judge.
const payNetwork = resolved ?? network;
const paid = offeredCurrency(accepts, payNetwork, currency) ?? currency;
- setNegotiated({ agentUrl, preferred: network, currency, network: payNetwork, paid });
- // Synchronously, unlike the state above: this turn's tool calls read it during the very
- // loop this send belongs to, long before a re-render could deliver the state.
- payRef.current = { network: payNetwork, currency };
// A readContract-capable client is required: batch-settlement's corrective-402
// recovery reads channel state on-chain, unlike the exact scheme. Resolved here, not
@@ -168,6 +177,27 @@ export function useX402Chat(
throw new Error(`No public client for network ${payNetwork}`);
}
+ // Guarded-B currency fallback (selectFundedCurrency in x402Currency.ts): when the
+ // token this send would pay in cannot fund its deposit floor, pay in a token the
+ // wallet actually holds and the agent actually offers. `paid` is passed, not the raw
+ // preference, so the seller-side negotiation runs first — a fallback can only replace
+ // a token that could not pay anyway, and never chooses among funded options. The
+ // switch is never persisted, the deposit signature stays the consent gate, and the
+ // component announces the deviation via `currencyFallback`.
+ const candidates = offeredCurrencies(accepts, payNetwork);
+ const fundable =
+ candidates.length > 0
+ ? await readFundableTokens(walletClient.account.address, publicClient, payNetwork)
+ : () => false;
+ const effective = selectFundedCurrency(paid, candidates, fundable);
+ setCurrencyFallback(effective.fellBack ? { preferred: paid, used: effective.currency } : null);
+ setNegotiated({ agentUrl, preferred: network, currency, network: payNetwork, paid: effective.currency });
+ // Synchronously, unlike the state above: this turn's tool calls read it during the very
+ // loop this send belongs to, long before a re-render could deliver the state. The
+ // effective currency, not the preference — the tools must spend on the channel this
+ // turn actually opened.
+ payRef.current = { network: payNetwork, currency: effective.currency };
+
setStatus("awaiting-signature");
setError(null);
// Don't clear paymentReceipt here: it represents the currently-open channel's
@@ -269,7 +299,18 @@ export function useX402Chat(
setPaymentReceipt(null);
}, []);
- return { sendMessage, paidFetch, status, error, paymentReceipt, reset, isReady, paymentNetwork, paymentCurrency };
+ return {
+ sendMessage,
+ paidFetch,
+ status,
+ error,
+ paymentReceipt,
+ reset,
+ isReady,
+ paymentNetwork,
+ paymentCurrency,
+ currencyFallback,
+ };
}
export default useX402Chat;
diff --git a/website/hooks/x402Currency.ts b/website/hooks/x402Currency.ts
index 8b603f11d..f44738730 100644
--- a/website/hooks/x402Currency.ts
+++ b/website/hooks/x402Currency.ts
@@ -108,3 +108,47 @@ export function offeredCurrency(
const first = onNetwork[0];
return first ? currencyOf(first) : null;
}
+
+/**
+ * The settlement currencies the agent offers on `network`, in `PAYMENT_CURRENCIES` order —
+ * the candidate list for `selectFundedCurrency`. A fallback is only ever chosen from what
+ * the seller actually takes, so a funded token it does not offer is never picked. Empty for
+ * an unreadable offer (`accepts === null`): with no candidates the fallback cannot fire,
+ * and the send proceeds exactly as before.
+ */
+export function offeredCurrencies(accepts: AcceptsEntry[] | null, network: string): PaymentCurrency[] {
+ if (!accepts) return [];
+ const onNetwork = accepts.filter((entry) => entry.network === network);
+ return PAYMENT_CURRENCIES.filter((currency) => onNetwork.some((entry) => currencyOf(entry) === currency));
+}
+
+/**
+ * The guarded-B currency fallback: pay in a token the wallet can actually fund, when the
+ * token the send would pay in cannot cover its deposit floor.
+ *
+ * Pure on purpose — the caller gathers the facts, this only decides:
+ * - `paid` is what the send would pay in after seller-side negotiation (`offeredCurrency`),
+ * not the raw user preference.
+ * - `candidates` are the tokens the seller offers on the pay network, in
+ * `PAYMENT_CURRENCIES` order (euro-first), so among two funded alternatives EURC beats USDC.
+ * - `fundable` answers "can the wallet balance cover this token's deposit floor".
+ *
+ * The rules, each of which is a guard agreed in the plan: the paid currency always wins when
+ * it can fund the deposit; a fallback is only ever chosen from what the seller actually offers
+ * (a fundable preference the seller does not take is unusable by construction); and when
+ * nothing is fundable the paid currency stands unchanged — the send then fails with a message
+ * that is honest exactly because this fallback ran first ("recharge" is only correct advice
+ * when no held token could fund it). A fallback never persists: the stored preference is the
+ * user's alone, and the deposit signature remains the consent gate for the new token.
+ */
+export function selectFundedCurrency(
+ paid: PaymentCurrency,
+ candidates: readonly PaymentCurrency[],
+ fundable: (currency: PaymentCurrency) => boolean,
+): { currency: PaymentCurrency; fellBack: boolean } {
+ if (candidates.includes(paid) && fundable(paid)) {
+ return { currency: paid, fellBack: false };
+ }
+ const funded = candidates.find((candidate) => fundable(candidate));
+ return funded ? { currency: funded, fellBack: true } : { currency: paid, fellBack: false };
+}
diff --git a/website/locales/de.ts b/website/locales/de.ts
index 04357b6a9..f5cca6918 100644
--- a/website/locales/de.ts
+++ b/website/locales/de.ts
@@ -178,6 +178,10 @@ export default {
analyticsSource: "Quelle: Analytics",
braveSource: "Quelle: Brave Search",
transitousSource: "Quelle: Transitous",
+ // Guarded-B: wenn die bevorzugte Währung die Einzahlung nicht decken kann, zahlt der Chat
+ // automatisch mit einer, die die Wallet hält — und sagt es hier, statt zu behaupten, man
+ // müsse erst EURe kaufen. Die Wallet-Signatur bleibt der Moment der Zustimmung.
+ walletFallback: "Mit {used} gezahlt — deine Wallet hält kein {preferred}. Umstellen unter Erweitert.",
errorPrefix: "Fehler:",
unknownError: "Unbekannter Fehler",
loading: "Lädt...",
diff --git a/website/locales/en.ts b/website/locales/en.ts
index a55a24d34..726ff43eb 100644
--- a/website/locales/en.ts
+++ b/website/locales/en.ts
@@ -169,6 +169,10 @@ export default {
analyticsSource: "Source: Analytics",
braveSource: "Source: Brave Search",
transitousSource: "Source: Transitous",
+ // Guarded-B: when the preferred currency cannot fund the deposit, the chat pays with one
+ // the wallet holds — and says so here, instead of claiming you need to buy EURe first.
+ // The wallet signature remains the moment of consent.
+ walletFallback: "Paid with {used} — your wallet holds no {preferred}. Switch under Advanced.",
errorPrefix: "Error:",
unknownError: "Unknown error",
loading: "Loading...",
diff --git a/website/test/AssistantChat.test.tsx b/website/test/AssistantChat.test.tsx
index 205ba1839..7bc5d8edc 100644
--- a/website/test/AssistantChat.test.tsx
+++ b/website/test/AssistantChat.test.tsx
@@ -58,6 +58,7 @@ vi.mock("../hooks/useX402Chat", () => ({
isReady: true,
paymentNetwork: "eip155:10",
paymentCurrency: "USDC",
+ currencyFallback: null,
})),
DEFAULT_LLM_AGENT_URL: "https://llm-agent.fretchen.eu",
}));
@@ -280,6 +281,7 @@ describe("AssistantChat", () => {
isReady: true,
paymentNetwork: "eip155:10",
paymentCurrency: "USDC",
+ currencyFallback: null,
});
vi.mocked(useWalletConnection).mockReturnValue({
address: "0x1234567890123456789012345678901234567890",
@@ -410,6 +412,7 @@ describe("AssistantChat", () => {
isReady: true,
paymentNetwork: "eip155:10",
paymentCurrency: "USDC",
+ currencyFallback: null,
});
mockSendMessage.mockImplementation(() => new Promise(() => {})); // never resolves: stay loading
@@ -494,6 +497,7 @@ describe("AssistantChat", () => {
isReady: true,
paymentNetwork: "eip155:8453",
paymentCurrency: "EURC",
+ currencyFallback: null,
});
renderWithQuery(
);
@@ -571,6 +575,7 @@ describe("AssistantChat", () => {
isReady: true,
paymentNetwork: "eip155:8453",
paymentCurrency: "EURC",
+ currencyFallback: null,
});
mockSendMessage.mockRejectedValueOnce(
new PaymentError(402, JSON.stringify({ error: "insufficient_balance" }), "EURC"),
@@ -918,6 +923,34 @@ describe("AssistantChat", () => {
expect(names).not.toContain("get_departures");
});
+ it("announces a wallet-driven currency switch, and does not blame the agent for it", () => {
+ const { unmount } = renderWithQuery(
);
+ expect(screen.queryByText(/assistent\.walletFallback/)).not.toBeInTheDocument();
+ unmount();
+
+ // EURe preferred, the wallet could only fund USDC — the hook fell back and reports it.
+ // paymentCurrency differs from the preference too, which alone would trigger the
+ // agent-side note; the wallet note must supersede it, or the UI would attribute the
+ // switch to the agent when it was the wallet.
+ vi.mocked(useX402Chat).mockReturnValue({
+ sendMessage: mockSendMessage,
+ paidFetch: mockPaidFetch,
+ status: "idle",
+ error: null,
+ paymentReceipt: null,
+ reset: vi.fn(),
+ isReady: true,
+ paymentNetwork: "eip155:10",
+ paymentCurrency: "USDC",
+ currencyFallback: { preferred: "EURe", used: "USDC" },
+ });
+
+ renderWithQuery(
);
+
+ expect(screen.getByText(/assistent\.walletFallback/)).toBeInTheDocument();
+ expect(screen.queryByText(/payment\.currencyFallback/)).not.toBeInTheDocument();
+ });
+
it("keeps the image tool on offer when a Bundestakt lookup fails", async () => {
// The regression this guards: a single shared `toolFailed` flag would have disabled
// generate_image for the rest of the turn because an unrelated, free lookup failed.
@@ -1532,7 +1565,8 @@ describe("AssistantChat", () => {
isReady: true,
paymentNetwork: "eip155:8453",
paymentCurrency: "USDC",
- });
+ currencyFallback: null,
+ });
renderWithQuery(
);
@@ -1555,7 +1589,8 @@ describe("AssistantChat", () => {
isReady: true,
paymentNetwork: "eip155:8453",
paymentCurrency: "USDC",
- });
+ currencyFallback: null,
+ });
renderWithQuery(
);
diff --git a/website/test/failure.test.ts b/website/test/failure.test.ts
index 10483d9e4..40e5cf2c2 100644
--- a/website/test/failure.test.ts
+++ b/website/test/failure.test.ts
@@ -20,6 +20,9 @@ describe("paymentFailed", () => {
expect(result?.status).toBe("payment_failed");
expect(result?.reason).toMatch(/USDC/i);
+ // The model's advice must point at the in-chat switch, not at buying the missing token —
+ // the guarded-B fallback makes this error a race-era residue, and the switch is the fix.
+ expect(result?.reason).toMatch(/switch the payment currency in the assistant's advanced settings/i);
});
/**
diff --git a/website/test/useX402Chat.test.ts b/website/test/useX402Chat.test.ts
index 699205531..4b089b60c 100644
--- a/website/test/useX402Chat.test.ts
+++ b/website/test/useX402Chat.test.ts
@@ -58,6 +58,16 @@ vi.mock("@x402/evm/batch-settlement/client", () => ({
mockReadChannelBalanceAndTotalClaimed(signer, channelId),
}));
+// The funding-facts reader is unit-tested in x402PaidFetch.test.ts; here its answer is
+// injected, so these tests cover exactly the wiring: candidates, selection, announcement
+// state, and what reaches createPaidFetch. vi.hoisted because the factory below spreads
+// this in immediately — a plain const is still uninitialised when the hoisted vi.mock runs.
+const mockReadFundableTokens = vi.hoisted(() => vi.fn());
+vi.mock("../utils/x402PaidFetch", async (importOriginal) => {
+ const actual = await importOriginal
();
+ return { ...actual, readFundableTokens: mockReadFundableTokens };
+});
+
const NETWORK = "eip155:84532";
const mockWalletClient = {
account: { address: "0x1234567890123456789012345678901234567890" },
@@ -71,6 +81,9 @@ describe("useX402Chat", () => {
// Every case here probes the same agent URL; a cached hit would serve the previous case's
// accepts[] and silently defeat the per-case fetch mocks.
resetAcceptsCache();
+ // The default: everything fundable, so the paid currency always wins and the existing
+ // cases see today's behavior. Tests that need a fallback override this themselves.
+ mockReadFundableTokens.mockResolvedValue(() => true);
mockGetPaymentSettleResponse.mockReturnValue({
success: true,
transaction: "0xdeposit",
@@ -952,6 +965,142 @@ describe("useX402Chat", () => {
afterEach(() => {
vi.unstubAllGlobals();
});
+
+ describe("guarded-B currency fallback", () => {
+ // LLM_V1_FLOOR is mainnet-only, and mainnet Base is the one network carrying all three
+ // settlement tokens — so this describe negotiates on eip155:8453, not the Sepolia NETWORK
+ // the rest of the file uses.
+ const PAY_BASE = "eip155:8453";
+ // Base Sepolia's registered settlement tokens (chain-utils' own addresses) — the asset
+ // field is what maps an accepts entry to a currency the site can pay with.
+ const BASE_EURE = "0xbf6e2966A9C3D99C9E4D069E04f7Bdb9C8aa762C";
+ const BASE_EURC = "0x60a3E35Cc302bFA44Cb288Bc5a4F316Fdb1adb42";
+ const BASE_USDC = "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913";
+
+ const isProbe = (init?: RequestInit) => {
+ try {
+ return (JSON.parse(init?.body as string) as { model?: string }).model === "probe";
+ } catch {
+ return false;
+ }
+ };
+
+ /** An agent that 402s the probe with all three tokens offered on NETWORK, then succeeds. */
+ function stubAgentOfferingAllTokens() {
+ const accepts = [
+ { scheme: "batch-settlement", network: PAY_BASE, payTo: "0xabc", asset: BASE_EURE },
+ { scheme: "batch-settlement", network: PAY_BASE, payTo: "0xabc", asset: BASE_EURC },
+ { scheme: "batch-settlement", network: PAY_BASE, payTo: "0xabc", asset: BASE_USDC },
+ ];
+ const header = btoa(JSON.stringify({ accepts }));
+ vi.stubGlobal(
+ "fetch",
+ vi.fn((_input: string, init?: RequestInit) =>
+ Promise.resolve(
+ isProbe(init)
+ ? new Response("{}", { status: 402, headers: { "Payment-Required": header } })
+ : new Response(JSON.stringify({ content: "hi" }), { status: 200 }),
+ ),
+ ),
+ );
+ }
+
+ beforeEach(() => {
+ vi.mocked(useWalletClient).mockReturnValue(buildWalletClientData({ data: mockWalletClient }));
+ vi.mocked(useAccount).mockReturnValue(buildAccountData({ isConnected: true }));
+ });
+
+ it("keeps the paid currency and reports no fallback when it can fund the deposit", async () => {
+ stubAgentOfferingAllTokens();
+
+ const { result } = renderHook(() => useX402Chat(PAY_BASE));
+ await act(async () => {
+ await result.current.sendMessage([{ role: "user", content: "Hi" }]);
+ });
+
+ expect(result.current.paymentCurrency).toBe("EURe");
+ expect(result.current.currencyFallback).toBeNull();
+ });
+
+ it("falls back to the first funded candidate and reports the deviation", async () => {
+ stubAgentOfferingAllTokens();
+ // EURe (the default and the paid currency) is unfunded; both EURC and USDC are funded,
+ // so the registry order picks EURC — the euro-first candidate.
+ mockReadFundableTokens.mockResolvedValue((c: string) => c === "EURC" || c === "USDC");
+
+ const { result } = renderHook(() => useX402Chat(PAY_BASE));
+ await act(async () => {
+ await result.current.sendMessage([{ role: "user", content: "Hi" }]);
+ });
+
+ expect(result.current.paymentCurrency).toBe("EURC");
+ expect(result.current.currencyFallback).toEqual({ preferred: "EURe", used: "EURC" });
+ });
+
+ it("keeps today's behavior when nothing is fundable — the failure wording is then honest advice", async () => {
+ stubAgentOfferingAllTokens();
+ mockReadFundableTokens.mockResolvedValue(() => false);
+
+ const { result } = renderHook(() => useX402Chat(PAY_BASE));
+ await act(async () => {
+ await result.current.sendMessage([{ role: "user", content: "Hi" }]);
+ });
+
+ expect(result.current.paymentCurrency).toBe("EURe");
+ expect(result.current.currencyFallback).toBeNull();
+ });
+
+ it("never reads balances when the agent offer is unreadable — unknown must not switch tokens", async () => {
+ // No 402 on the probe: accepts is null, candidates are empty, and the read is skipped.
+ vi.stubGlobal(
+ "fetch",
+ vi.fn((_input: string, init?: RequestInit) =>
+ Promise.resolve(
+ isProbe(init)
+ ? new Response("{}", { status: 200 })
+ : new Response(JSON.stringify({ content: "hi" }), { status: 200 }),
+ ),
+ ),
+ );
+
+ const { result } = renderHook(() => useX402Chat(PAY_BASE));
+ await act(async () => {
+ await result.current.sendMessage([{ role: "user", content: "Hi" }]);
+ });
+
+ expect(mockReadFundableTokens).not.toHaveBeenCalled();
+ expect(result.current.paymentCurrency).toBe("EURe");
+ expect(result.current.currencyFallback).toBeNull();
+ });
+
+ it("does not fall back to a token the agent does not offer, even when it is the only funded one", async () => {
+ // The agent offers EURe and USDC only; EURC is funded but unofferable.
+ const accepts = [
+ { scheme: "batch-settlement", network: PAY_BASE, payTo: "0xabc", asset: BASE_EURE },
+ { scheme: "batch-settlement", network: PAY_BASE, payTo: "0xabc", asset: BASE_USDC },
+ ];
+ const header = btoa(JSON.stringify({ accepts }));
+ vi.stubGlobal(
+ "fetch",
+ vi.fn((_input: string, init?: RequestInit) =>
+ Promise.resolve(
+ isProbe(init)
+ ? new Response("{}", { status: 402, headers: { "Payment-Required": header } })
+ : new Response(JSON.stringify({ content: "hi" }), { status: 200 }),
+ ),
+ ),
+ );
+ mockReadFundableTokens.mockResolvedValue((c: string) => c === "EURC");
+
+ const { result } = renderHook(() => useX402Chat(PAY_BASE));
+ await act(async () => {
+ await result.current.sendMessage([{ role: "user", content: "Hi" }]);
+ });
+
+ expect(result.current.paymentCurrency).toBe("EURe");
+ expect(result.current.currencyFallback).toBeNull();
+ });
+ });
});
describe("WebStorageClientChannelStorage", () => {
diff --git a/website/test/x402Currency.test.ts b/website/test/x402Currency.test.ts
index c86aaae6b..ca0ff8a56 100644
--- a/website/test/x402Currency.test.ts
+++ b/website/test/x402Currency.test.ts
@@ -9,9 +9,12 @@ import {
DEFAULT_CURRENCY,
PAYMENT_CURRENCIES,
networksForCurrency,
+ offeredCurrencies,
preferCurrency,
readCurrency,
+ selectFundedCurrency,
storeCurrency,
+ type PaymentCurrency,
} from "../hooks/x402Currency";
const BASE_EURE = "0xbf6e2966A9C3D99C9E4D069E04f7Bdb9C8aa762C" as const;
@@ -97,3 +100,56 @@ describe("preferCurrency selector", () => {
expect(paid).toBe("EURe");
});
});
+
+describe("selectFundedCurrency", () => {
+ /** `fundable` answers "can this token's wallet balance cover the deposit floor". */
+ const funded = (...held: PaymentCurrency[]) => (c: PaymentCurrency) => held.includes(c);
+ const all = ["EURe", "EURC", "USDC"] as const;
+
+ it("keeps the paid currency when it can fund the deposit", () => {
+ expect(selectFundedCurrency("EURe", all, () => true)).toEqual({ currency: "EURe", fellBack: false });
+ });
+
+ it("falls back to the first funded candidate in preference order — EURC before USDC", () => {
+ expect(selectFundedCurrency("EURe", all, funded("EURC", "USDC"))).toEqual({ currency: "EURC", fellBack: true });
+ });
+
+ it("skips an unfunded candidate to the next funded one", () => {
+ expect(selectFundedCurrency("EURe", all, funded("USDC"))).toEqual({ currency: "USDC", fellBack: true });
+ });
+
+ it("keeps today's behavior when nothing is fundable — the failure wording is then honest advice", () => {
+ expect(selectFundedCurrency("EURe", all, () => false)).toEqual({ currency: "EURe", fellBack: false });
+ });
+
+ it("keeps the paid currency when no candidates are offered", () => {
+ expect(selectFundedCurrency("USDC", [], () => true)).toEqual({ currency: "USDC", fellBack: false });
+ });
+
+ it("never picks a currency the seller does not offer, even when its balance would fund it", () => {
+ expect(selectFundedCurrency("EURe", ["USDC"], funded("EURe", "USDC"))).toEqual({ currency: "USDC", fellBack: true });
+ });
+});
+
+describe("offeredCurrencies", () => {
+ it("lists the seller's offered tokens on the network, in preference order", () => {
+ const accepts = [
+ accept("eip155:8453", BASE_USDC),
+ accept("eip155:8453", BASE_EURE),
+ accept("eip155:8453", BASE_EURC),
+ ];
+ expect(offeredCurrencies(accepts, "eip155:8453")).toEqual(["EURe", "EURC", "USDC"]);
+ });
+
+ it("ignores offers on other networks and tokens this site does not pay with", () => {
+ const accepts = [
+ accept("eip155:10", BASE_USDC),
+ accept("eip155:8453", "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85"), // not a settlement token
+ ];
+ expect(offeredCurrencies(accepts, "eip155:8453")).toEqual([]);
+ });
+
+ it("is empty for an unreadable offer — no candidates, no fallback", () => {
+ expect(offeredCurrencies(null, "eip155:8453")).toEqual([]);
+ });
+});
diff --git a/website/test/x402PaidFetch.test.ts b/website/test/x402PaidFetch.test.ts
index 40031c472..bad777f38 100644
--- a/website/test/x402PaidFetch.test.ts
+++ b/website/test/x402PaidFetch.test.ts
@@ -45,6 +45,7 @@ import {
PaymentError,
WebStorageClientChannelStorage,
readChargedTotal,
+ readFundableTokens,
} from "../utils/x402PaidFetch";
import { formatSpend } from "../utils/x402Prices";
@@ -355,3 +356,51 @@ describe("formatSpend", () => {
expect(formatSpend(1_000n, "EURC")).toBe("€0.001 EURC");
});
});
+
+describe("readFundableTokens", () => {
+ // Base carries all three settlement tokens; the addresses are chain-utils' own.
+ const BASE_EURE = "0xbf6e2966A9C3D99C9E4D069E04f7Bdb9C8aa762C";
+ const BASE_EURC = "0x60a3E35Cc302bFA44Cb288Bc5a4F316Fdb1adb42";
+ const BASE_USDC = "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913";
+ const wallet = "0x1234567890123456789012345678901234567890" as `0x${string}`;
+
+ /** A public client that answers `balanceOf` from a per-address table. */
+ function clientWith(balances: Record) {
+ return {
+ readContract: vi.fn(async ({ address }: { address: string }) => {
+ const balance = balances[address];
+ if (balance === "boom") throw new Error("RPC down");
+ return balance;
+ }),
+ };
+ }
+
+ it("funds only the tokens whose wallet balance covers the deposit floor", async () => {
+ // 0 EURe, 1.00 EURC (>= 0.50), 0.10 USDC (< 0.50).
+ const client = clientWith({
+ [BASE_EURE]: 0n,
+ [BASE_EURC]: 1_000_000n,
+ [BASE_USDC]: 100_000n,
+ });
+
+ const fundable = await readFundableTokens(wallet, client, "eip155:8453");
+
+ expect(fundable("EURe")).toBe(false);
+ expect(fundable("EURC")).toBe(true);
+ expect(fundable("USDC")).toBe(false);
+ });
+
+ it("treats a failing read as unfunded — unknown must not trigger a fallback", async () => {
+ const client = clientWith({
+ [BASE_EURE]: "boom",
+ [BASE_EURC]: "boom",
+ [BASE_USDC]: "boom",
+ });
+
+ const fundable = await readFundableTokens(wallet, client, "eip155:8453");
+
+ expect(fundable("EURe")).toBe(false);
+ expect(fundable("EURC")).toBe(false);
+ expect(fundable("USDC")).toBe(false);
+ });
+});
diff --git a/website/utils/x402PaidFetch.ts b/website/utils/x402PaidFetch.ts
index 739791c3d..0fe69c531 100644
--- a/website/utils/x402PaidFetch.ts
+++ b/website/utils/x402PaidFetch.ts
@@ -1,4 +1,5 @@
import { privateKeyToAccount, generatePrivateKey } from "viem/accounts";
+import { getSettlementTokens } from "@fretchen/chain-utils";
import { buildStablecoinAllowedAssets } from "../hooks/x402SpendControls";
import { CURRENCY_DECIMALS, preferCurrency, type PaymentCurrency } from "../hooks/x402Currency";
// Type-only import — erased at compile time, so no @x402 runtime is pulled into SSR.
@@ -215,6 +216,53 @@ export function minimumDepositAtomic(currency: PaymentCurrency): bigint {
return 5n * 10n ** BigInt(CURRENCY_DECIMALS[currency] - 1);
}
+/**
+ * Which settlement tokens this wallet could fund a *new* channel deposit in — the funding
+ * facts behind `selectFundedCurrency` (hooks/x402Currency.ts). Reads `balanceOf` for every
+ * token registered on `network` (three parallel reads), and a token counts as fundable when
+ * the balance covers its `minimumDepositAtomic` floor — the same 0.50 the deposit itself
+ * would move, so the answer cannot drift from what the SDK will actually ask for.
+ *
+ * A failing read (RPC down, unknown token) counts as *unfunded*, never as "try another":
+ * "unknown" must not trigger a currency fallback, or a flaky RPC would silently switch the
+ * token the user chose. Per-call state by design — balances are read fresh at send time,
+ * never cached, matching the "in context of the action" rule of the chain switch.
+ *
+ * `publicClient` is `unknown` and cast inside, the file's own convention: viem's generic
+ * `readContract` cannot be matched structurally, and `createPaidFetch` casts the same value
+ * for the same reason (see the call at `toClientEvmSigner`).
+ */
+export async function readFundableTokens(
+ walletAddress: `0x${string}`,
+ // Unknown, cast below to the minimal shape actually called: viem's generic readContract
+ // cannot be matched structurally, and `createPaidFetch` accepts the same value as unknown
+ // for the same reason. The cast keeps this function any-free.
+ publicClient: unknown,
+ network: string,
+): Promise<(currency: PaymentCurrency) => boolean> {
+ const client = publicClient as { readContract: (call: unknown) => Promise };
+ const tokens = getSettlementTokens(network);
+ const held = new Map();
+ await Promise.all(
+ tokens.map(async (token) => {
+ try {
+ const balance = await client.readContract({
+ address: token.address,
+ functionName: "balanceOf",
+ args: [walletAddress],
+ });
+ held.set(token.symbol, typeof balance === "bigint" ? balance : null);
+ } catch {
+ held.set(token.symbol, null);
+ }
+ }),
+ );
+ return (currency) => {
+ const balance = held.get(currency);
+ return balance !== undefined && balance !== null && balance >= minimumDepositAtomic(currency);
+ };
+}
+
/**
* Custom deposit sizing: always deposit/top-up to at least `minimumDepositAtomic(currency)`,
* regardless of the SDK's default multiplier-of-ceiling formula — see that function's
@@ -274,10 +322,17 @@ function describePaymentError(status: number, body: string, currency: PaymentCur
return DRAINED_CHANNEL_MESSAGE.chat;
}
if (errorCode?.includes("insufficient_balance")) {
- // The USDC.e note is USDC's alone: bridged EURC is not a thing people end up holding by accident.
+ // The switch hint is the actionable advice: the guarded-B fallback (useX402Chat) has
+ // already moved the send to a funded token when one exists, so reaching this message
+ // means either a race between the balance read and the deposit, or nothing funded — and
+ // the hint points at the one in-chat fix either way, instead of "go buy ".
+ // Both variants are written to fit `describeFailure`'s 200-char cap: the hint is the part
+ // the model must not lose, and the USDC.e note is shortened, not the hint.
+ // (USDC's note is USDC's alone: bridged EURC is not a thing people end up holding by accident.)
+ const switchHint = "Alternatively, switch the payment currency in the assistant's advanced settings.";
return currency === "USDC"
- ? "Not enough USDC in your wallet to fund the payment channel. Note that only native USDC works — a bridged variant such as USDC.e cannot be used."
- : `Not enough ${currency} in your wallet to fund the payment channel.`;
+ ? `Not enough USDC in your wallet to fund the payment channel. Note that only native USDC works, not USDC.e. ${switchHint}`
+ : `Not enough ${currency} in your wallet to fund the payment channel. ${switchHint}`;
}
return `Request failed: ${status} - ${body}`;
}
From ddb083d03e027b1b1e6be265e895649321e0a9a1 Mon Sep 17 00:00:00 2001
From: fretchen
Date: Fri, 16 Oct 2026 18:14:40 +0200
Subject: [PATCH 4/6] fix names
---
website/components/AssistantChat.tsx | 3 ++-
website/pages/assistent/+description.ts | 2 +-
website/pages/assistent/+title.ts | 2 +-
website/pages/lab/+Page.tsx | 2 +-
4 files changed, 5 insertions(+), 4 deletions(-)
diff --git a/website/components/AssistantChat.tsx b/website/components/AssistantChat.tsx
index 3e0b360e5..bb094f0b8 100644
--- a/website/components/AssistantChat.tsx
+++ b/website/components/AssistantChat.tsx
@@ -1,6 +1,7 @@
/**
* AssistantChat — the interactive core of the x402 batch-settlement chat assistant
- * (`/assistent`). Pays per message via `useX402Chat` (USDC payment channels): the
+ * (`/assistent`). Pays per message via `useX402Chat` (stablecoin payment channels —
+ * EURe by default, EURC and USDC one toggle away): the
* first message opens a channel (one wallet-signed deposit), later messages are
* off-chain voucher signatures reusing the open channel.
*/
diff --git a/website/pages/assistent/+description.ts b/website/pages/assistent/+description.ts
index 5100894f7..e69288f1b 100644
--- a/website/pages/assistent/+description.ts
+++ b/website/pages/assistent/+description.ts
@@ -1,3 +1,3 @@
export function description() {
- return "An AI assistant that pays per message with x402 batch-settlement USDC payment channels — no prepaid balance, no subscription. The channel opens on your first message; each message after is a cheap off-chain voucher.";
+ return "An AI assistant that pays per message with x402 batch-settlement stablecoin payment channels — no prepaid balance, no subscription. The channel opens on your first message; each message after is a cheap off-chain voucher.";
}
diff --git a/website/pages/assistent/+title.ts b/website/pages/assistent/+title.ts
index 25d4e49a7..e2eb64ccb 100644
--- a/website/pages/assistent/+title.ts
+++ b/website/pages/assistent/+title.ts
@@ -1,3 +1,3 @@
export function title() {
- return "AI Assistant with USDC Payment Channels | fretchen.eu";
+ return "AI Assistant with Stablecoin Payment Channels | fretchen.eu";
}
diff --git a/website/pages/lab/+Page.tsx b/website/pages/lab/+Page.tsx
index 08d6ca68b..f805d2673 100644
--- a/website/pages/lab/+Page.tsx
+++ b/website/pages/lab/+Page.tsx
@@ -21,7 +21,7 @@ const LabPage: React.FC = () => {
From a6379b6b686efb2cd7ab429c41b799020ec3b189 Mon Sep 17 00:00:00 2001
From: fretchen
Date: Fri, 16 Oct 2026 21:21:46 +0200
Subject: [PATCH 5/6] make it prettier
---
website/hooks/useX402Chat.ts | 8 +++++++-
website/test/AssistantChat.test.tsx | 4 ++--
website/test/x402Currency.test.ts | 10 ++++++++--
3 files changed, 17 insertions(+), 5 deletions(-)
diff --git a/website/hooks/useX402Chat.ts b/website/hooks/useX402Chat.ts
index a09f5a2e0..8857126fc 100644
--- a/website/hooks/useX402Chat.ts
+++ b/website/hooks/useX402Chat.ts
@@ -17,7 +17,13 @@ import { useWalletClient } from "wagmi";
import { getConfiguredPublicClient } from "./useConfiguredPublicClient";
import { useIsWalletConnected } from "./useIsWalletConnected";
import { probeAccepts, negotiateNetwork, LLM_V1_FLOOR } from "./x402Discovery";
-import { DEFAULT_CURRENCY, offeredCurrency, offeredCurrencies, selectFundedCurrency, type PaymentCurrency } from "./x402Currency";
+import {
+ DEFAULT_CURRENCY,
+ offeredCurrency,
+ offeredCurrencies,
+ selectFundedCurrency,
+ type PaymentCurrency,
+} from "./x402Currency";
import { createPaidFetch, readFundableTokens, type PaidFetch } from "../utils/x402PaidFetch";
import type {
X402ChatMessage,
diff --git a/website/test/AssistantChat.test.tsx b/website/test/AssistantChat.test.tsx
index 7bc5d8edc..86d983fe7 100644
--- a/website/test/AssistantChat.test.tsx
+++ b/website/test/AssistantChat.test.tsx
@@ -1566,7 +1566,7 @@ describe("AssistantChat", () => {
paymentNetwork: "eip155:8453",
paymentCurrency: "USDC",
currencyFallback: null,
- });
+ });
renderWithQuery();
@@ -1590,7 +1590,7 @@ describe("AssistantChat", () => {
paymentNetwork: "eip155:8453",
paymentCurrency: "USDC",
currencyFallback: null,
- });
+ });
renderWithQuery();
diff --git a/website/test/x402Currency.test.ts b/website/test/x402Currency.test.ts
index ca0ff8a56..087b216b5 100644
--- a/website/test/x402Currency.test.ts
+++ b/website/test/x402Currency.test.ts
@@ -103,7 +103,10 @@ describe("preferCurrency selector", () => {
describe("selectFundedCurrency", () => {
/** `fundable` answers "can this token's wallet balance cover the deposit floor". */
- const funded = (...held: PaymentCurrency[]) => (c: PaymentCurrency) => held.includes(c);
+ const funded =
+ (...held: PaymentCurrency[]) =>
+ (c: PaymentCurrency) =>
+ held.includes(c);
const all = ["EURe", "EURC", "USDC"] as const;
it("keeps the paid currency when it can fund the deposit", () => {
@@ -127,7 +130,10 @@ describe("selectFundedCurrency", () => {
});
it("never picks a currency the seller does not offer, even when its balance would fund it", () => {
- expect(selectFundedCurrency("EURe", ["USDC"], funded("EURe", "USDC"))).toEqual({ currency: "USDC", fellBack: true });
+ expect(selectFundedCurrency("EURe", ["USDC"], funded("EURe", "USDC"))).toEqual({
+ currency: "USDC",
+ fellBack: true,
+ });
});
});
From 966394423398274e8e604c2dae6c08dfbc407f8b Mon Sep 17 00:00:00 2001
From: fretchen
Date: Fri, 16 Oct 2026 22:12:12 +0200
Subject: [PATCH 6/6] clean up tsup
---
.github/CVE_TRIAGE.md | 2 +-
analytics/README.md | 2 +-
analytics/package-lock.json | 1332 ++++----
analytics/package.json | 4 +-
analytics/tsdown.config.ts | 39 +
analytics/tsup.config.js | 37 -
comment_service/README.md | 2 +-
comment_service/package-lock.json | 2806 ++++++-----------
comment_service/package.json | 4 +-
comment_service/tsdown.config.ts | 24 +
comment_service/tsup.config.js | 19 -
scw_js/dev_server_genimg.ts | 2 +-
scw_js/dev_server_llm.ts | 2 +-
scw_js/dev_server_mcp.ts | 2 +-
scw_js/package-lock.json | 2201 +++++--------
scw_js/package.json | 4 +-
scw_js/scripts/openapi-codegen.ts | 2 +-
scw_js/test/handler_purity.test.ts | 2 +-
scw_js/tsdown.config.ts | 33 +
scw_js/tsup.config.js | 31 -
x402_facilitator/package-lock.json | 1294 +++-----
x402_facilitator/package.json | 4 +-
x402_facilitator/serverless.yml | 2 +-
x402_facilitator/test/no_stray_js.test.ts | 1 -
x402_facilitator/tsdown.config.ts | 28 +
x402_facilitator/tsup.config.js | 26 -
x402_facilitator/x402_splitter_facilitator.js | 2 +-
x402_facilitator/x402_splitter_settle.js | 2 +-
x402_facilitator/x402_splitter_supported.js | 2 +-
x402_facilitator/x402_splitter_verify.js | 2 +-
30 files changed, 2942 insertions(+), 4971 deletions(-)
create mode 100644 analytics/tsdown.config.ts
delete mode 100644 analytics/tsup.config.js
create mode 100644 comment_service/tsdown.config.ts
delete mode 100644 comment_service/tsup.config.js
create mode 100644 scw_js/tsdown.config.ts
delete mode 100644 scw_js/tsup.config.js
create mode 100644 x402_facilitator/tsdown.config.ts
delete mode 100644 x402_facilitator/tsup.config.js
diff --git a/.github/CVE_TRIAGE.md b/.github/CVE_TRIAGE.md
index 6c2911829..1b9fb23f7 100644
--- a/.github/CVE_TRIAGE.md
+++ b/.github/CVE_TRIAGE.md
@@ -32,7 +32,7 @@ Look up the manifest path and package name in the tier table below. Most triage
| `pino` | scw_js / x402_facilitator prod dep | **T3** |
| `dotenv` | serverless prod dep | **T3** |
| `undici` | transitive dep in `eth/` (Hardhat) | **T4** |
-| `vite`, `vitest`, `tsup`, `eslint`, `typescript` | devDependencies everywhere | **T4** |
+| `vite`, `vitest`, `tsdown`, `eslint`, `typescript` | devDependencies everywhere | **T4** |
| `hardhat` and all `@nomicfoundation/*` | `eth/` devDependencies | **T4** |
| `jupyterlab`, `jupyter-server` | `notebooks/` local only | **T4** |
| `growth-agent` pip deps | cron container, no public surface | **T4** |
diff --git a/analytics/README.md b/analytics/README.md
index a17657eca..8b085eaed 100644
--- a/analytics/README.md
+++ b/analytics/README.md
@@ -159,7 +159,7 @@ npm install
npm test # run tests (vitest)
npm run test:coverage # with coverage report
npm run lint # eslint
-npm run build # tsup → dist/
+npm run build # tsdown → dist/
```
### Local servers
diff --git a/analytics/package-lock.json b/analytics/package-lock.json
index 69b21cf57..fbdd92206 100644
--- a/analytics/package-lock.json
+++ b/analytics/package-lock.json
@@ -23,7 +23,7 @@
"eslint": "^10.0.0",
"prettier": "^3.0.0",
"serverless-scaleway-functions": ">=0.4.16",
- "tsup": "^9.0.0",
+ "tsdown": "^0.23.1",
"tsx": "^4.23.5",
"typescript": "^5.9.3",
"typescript-eslint": "^8.60.0",
@@ -974,17 +974,6 @@
}
}
},
- "node_modules/@jridgewell/gen-mapping": {
- "version": "0.3.13",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
- "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/sourcemap-codec": "^1.5.0",
- "@jridgewell/trace-mapping": "^0.3.24"
- }
- },
"node_modules/@jridgewell/resolve-uri": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
@@ -1095,26 +1084,6 @@
"semver": "bin/semver.js"
}
},
- "node_modules/@napi-rs/lzma-linux-x64-gnu": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz",
- "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "libc": [
- "glibc"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^22.20 || ^24.12 || >=25"
- }
- },
"node_modules/@noble/ciphers": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz",
@@ -1247,6 +1216,19 @@
"dev": true,
"license": "BSD-3-Clause"
},
+ "node_modules/@quansync/fs": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@quansync/fs/-/fs-1.1.0.tgz",
+ "integrity": "sha512-qAPG/t3HqML1TlN7sY/pTbEjzFVAKsMjNNMGheyDosro+kT4iw2KCUoHcVdmliwWjorm4elZbgNQyU2eD97eDg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "quansync": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sxzz"
+ }
+ },
"node_modules/@rolldown/binding-android-arm-eabi": {
"version": "1.2.13",
"resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.13.tgz",
@@ -1498,414 +1480,15 @@
"optional": true,
"os": [
"win32"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-win32-x64-msvc": {
- "version": "1.2.13",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.13.tgz",
- "integrity": "sha512-UKhFaZTeTcbKrb3iU82m17jVcPEAoqDkCN5MBqgPyZSwp/cQmib21crTS0DdH7T1B7wZRWEI89YQAOJMet5yhg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/pluginutils": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz",
- "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@rollup/rollup-android-arm-eabi": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.64.7.tgz",
- "integrity": "sha512-GFF2tHk0NqYVObrK0+/ps/LEXsV/v2q6Lyiy7mZr+Ej24fpQScvqK2ziz9NHeEQYnKWKym38Ml7dZbPtC9tuAw==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ]
- },
- "node_modules/@rollup/rollup-android-arm64": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.64.7.tgz",
- "integrity": "sha512-BOymcXJFYYXqluDidj6sLelNjXruC3u1BqVxLn2OPCXH9xaPSOTH+MS4uychsGI1NU7tJoiv9KvqijDHFe+hhQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ]
- },
- "node_modules/@rollup/rollup-darwin-arm64": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.64.7.tgz",
- "integrity": "sha512-jgVpGweIbls2H5jfBB70tnX52abMd5pJr3xmtoDILx6JdmGl+Un+tMb9R+MbHPVB46tTBpY8emtn7M71SnQhEQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ]
- },
- "node_modules/@rollup/rollup-darwin-x64": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.64.7.tgz",
- "integrity": "sha512-AVMpt94mrXH7WjyWKmd9nT4RC5yM0AN3Lt6A89xVIsuLDi3dDX6dxMytLbW36FlppY9JsoqUoS3LUUpUrYxiMQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ]
- },
- "node_modules/@rollup/rollup-freebsd-arm64": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.64.7.tgz",
- "integrity": "sha512-Nje29c/MyajxRNFGU05oyeTDS6SWdMg/wWMSlZSBTBju5BKz2NVc0kFiFSQGzRELNiB+CBk/ZvAVsWsENgjGag==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ]
- },
- "node_modules/@rollup/rollup-freebsd-x64": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.64.7.tgz",
- "integrity": "sha512-xxgN5/kMzCNz/NYJ4t49B0/WS6InNlWv6xvgwUQqNnWM9WJMMwMUGWrAxdNEgYWdHL0sMnuh8I87StGrIMTA+w==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.64.7.tgz",
- "integrity": "sha512-5U/9gVn/X657I8+NHoHO9Wnfyd0lEXwqbslobRoB9TC8SwYzOitcIr6TLE7531Q/NWs3L4mb+YOGzlf3vHIeYw==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "libc": [
- "glibc"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm-musleabihf": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.64.7.tgz",
- "integrity": "sha512-hcDS0a/Y8ggM3dcOfzH7UpSaogCViWTtNDSl0EXpWIj8g8/r86ITqptjil2hayTXS0Umzb+Yt3mjgpQVFVf2+A==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "libc": [
- "musl"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm64-gnu": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.64.7.tgz",
- "integrity": "sha512-awbAr4N7Qd/yjZAQBEEPzgcPveYG2Gi5L6gq1/Bp+3SMRjn5F68Wv1zKsntzvvoioBR6yKvhLtWqu11am1TsxA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "libc": [
- "glibc"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm64-musl": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.64.7.tgz",
- "integrity": "sha512-Ut7xQJfeLhzu2yN3rHzVvL9ccyPJvN4aCdP1V7hJ5lGxX/eCzgB9SiMk/Md3J+rWWZgvoYsDW4BUFggJr32pBA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "libc": [
- "musl"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-loong64-gnu": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.64.7.tgz",
- "integrity": "sha512-trqoni/vHkuM5oo5iQhoKPh6fjjD7E80pMgCXWgGxU8vSRPUlwvG8GeYvEEcB6eJAxNa99WH9iVHPHelgtKiHA==",
- "cpu": [
- "loong64"
- ],
- "dev": true,
- "libc": [
- "glibc"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-loong64-musl": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.64.7.tgz",
- "integrity": "sha512-gvlUy0XFIwtUWiQmhc+4GT2Knm3KosinpUVhr7CtTFA78gFDnE5NWwMPzHrJsYpKkh2LlY7yvBIboN1FAV6Xeg==",
- "cpu": [
- "loong64"
- ],
- "dev": true,
- "libc": [
- "musl"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-ppc64-gnu": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.64.7.tgz",
- "integrity": "sha512-8yS/kSXTJ/47Z62JW+C2AJ3vd/8zZw016vFjtNpZwmZlwJumLua4s1i78dkYuSSqQ+0aIMxJcBp/4uIwp2ehjA==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
- "libc": [
- "glibc"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-ppc64-musl": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.64.7.tgz",
- "integrity": "sha512-mxVSKvvty0hOP1AFo/l4Kpv3i3HK0zx4rYUrirZDToYlWhS3xzmIkq3vUJ7rtrM2cPyXveDyDT6M1FfXZ9hTRA==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
- "libc": [
- "musl"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-riscv64-gnu": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.64.7.tgz",
- "integrity": "sha512-lEse1zra1CagM+uHH2bl28GInDsZZ45NJzHei2OMaXQFzZWKBO1hFo07rS0xB6ayV4WU360UrSmPDSyCMpYsUQ==",
- "cpu": [
- "riscv64"
- ],
- "dev": true,
- "libc": [
- "glibc"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-riscv64-musl": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.64.7.tgz",
- "integrity": "sha512-d/cqCoiG9WMZ5VuJZ5Qdlv9g97QyoGwnmvHccvGhKSacTy7xFrAS+jMcJSBdMNOw1oacSkl6p7K6O/DRYTKL3g==",
- "cpu": [
- "riscv64"
- ],
- "dev": true,
- "libc": [
- "musl"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-s390x-gnu": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.64.7.tgz",
- "integrity": "sha512-kVEA//CeDOZZP1XCH2JBgqXb9+ALlwuA/4civaazMVdgzaSQC9WM38w65zG/LLk0lA7F9Od19CSBZW7J9mCbNg==",
- "cpu": [
- "s390x"
- ],
- "dev": true,
- "libc": [
- "glibc"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-x64-gnu": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.64.7.tgz",
- "integrity": "sha512-14oLfDsOSr0TSntT/34jRg/V8B2XW/Jomh9zX9CjIM9gwwNlI1OCymS/GVn0DV32h67eRf7U0GGem0rvfXgNwQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "libc": [
- "glibc"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-x64-musl": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.64.7.tgz",
- "integrity": "sha512-dFVtPfjZqAnUPpPY4Bfg+87yo1IBW9HiY8iCFtg49Pn46MfZTebSHZh8PL6SOsgyt9LQP8Nj/sE6jm3aWpySmQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "libc": [
- "musl"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-openbsd-x64": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.64.7.tgz",
- "integrity": "sha512-Dm9CZ2SM3u2NgvBj4awW/gGqkOwzH8f6MSYIJE6+bKcKLI+T0+LhpD6vtetTfrIIx+rLXDf5RJqBP6v7V5O+wg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "openbsd"
- ]
- },
- "node_modules/@rollup/rollup-openharmony-arm64": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.64.7.tgz",
- "integrity": "sha512-oaxsvS2mL6+78741CT2HCORBvy1USg3Wqpt5qvZwy3aMXRMl4zxyDo8maeFRWJkF3dp0Wbi71fKH5Gr9YI3vYA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "openharmony"
- ]
- },
- "node_modules/@rollup/rollup-win32-arm64-msvc": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.64.7.tgz",
- "integrity": "sha512-UKZz1Y4mxUqkWh60uH7B1aZn6UcAimPk4ipRktpb3wfZq7JrzZYyAXTwiafkb3T+kd5P3Sf+vzcRdsDks4WtjQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@rollup/rollup-win32-ia32-msvc": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.64.7.tgz",
- "integrity": "sha512-WWkSuC1J+mZJnsDh0mRaCAFSWfQdl6y3fDjZeWElI6zHo8CcOSG5lY3yurKJjEq+FrX0WD60sFrVVpbHqzMmrw==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@rollup/rollup-win32-x64-gnu": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.64.7.tgz",
- "integrity": "sha512-u9bp2yXCI3/BUjUxY6uWknAY32pfvvDCPysyUTySotx0dj3ydlFHrRQYfn/b/kZgnfjyEwySMtI7Ga054uiysQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ]
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
},
- "node_modules/@rollup/rollup-win32-x64-msvc": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.64.7.tgz",
- "integrity": "sha512-EhX6N3XPMEnVU5cRfNgzPOKcSucsbu3nNNWuoAaEuKIqmddBKHN5b9d4rPe65T1I+FaOT176JKiZNsUBp3rqbA==",
+ "node_modules/@rolldown/binding-win32-x64-msvc": {
+ "version": "1.2.13",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.13.tgz",
+ "integrity": "sha512-UKhFaZTeTcbKrb3iU82m17jVcPEAoqDkCN5MBqgPyZSwp/cQmib21crTS0DdH7T1B7wZRWEI89YQAOJMet5yhg==",
"cpu": [
"x64"
],
@@ -1914,7 +1497,17 @@
"optional": true,
"os": [
"win32"
- ]
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/pluginutils": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz",
+ "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/@scaleway/serverless-functions": {
"version": "1.1.2",
@@ -2545,6 +2138,199 @@
"url": "https://opencollective.com/vitest"
}
},
+ "node_modules/@yuku-core/binding-android-arm64": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/@yuku-core/binding-android-arm64/-/binding-android-arm64-0.19.0.tgz",
+ "integrity": "sha512-wdL2XmTiZixAOaHk9Z0JJZ8u9Qm8d333Zjpc6gaxXFX+UR5BlsfxZ7a2+2Rm71pamppsPYGUGFq2oVLbh6DISw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@yuku-core/binding-darwin-arm64": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/@yuku-core/binding-darwin-arm64/-/binding-darwin-arm64-0.19.0.tgz",
+ "integrity": "sha512-7sNJa6XJhyetnTy64jw3NEi4YgUcezHk1G5GH9FSvXAuC8wIlbaOwT9lgq5qo5sspjrZJQlBR1TWflP49uRpMw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@yuku-core/binding-darwin-x64": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/@yuku-core/binding-darwin-x64/-/binding-darwin-x64-0.19.0.tgz",
+ "integrity": "sha512-pTC7dYEc59isdyizc3nsuyFNBu2LU5wMYZ1be6UMr59PY/AJNtO1aBLWV0MgL/z7C1nv/2sX4TNjGgKLoeevJw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@yuku-core/binding-freebsd-x64": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/@yuku-core/binding-freebsd-x64/-/binding-freebsd-x64-0.19.0.tgz",
+ "integrity": "sha512-xrZjF6XOEwyLOiDIfrwDdRCS6ghxcJeirNC1KivQhVcUwlRonaU79S3/Uiyx3lBylPnT8qKJ3/aMT+H52nGTJQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@yuku-core/binding-linux-arm-gnu": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/@yuku-core/binding-linux-arm-gnu/-/binding-linux-arm-gnu-0.19.0.tgz",
+ "integrity": "sha512-0OyIH53C0I1CbADHn9FSdCfX5qbpeLwJhmOVhonFJNYheybOnkSJ50qGMfTJIb8y5zrwqvLs7FVBvz6Fk8maZg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@yuku-core/binding-linux-arm-musl": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/@yuku-core/binding-linux-arm-musl/-/binding-linux-arm-musl-0.19.0.tgz",
+ "integrity": "sha512-z/iPfkCOCSXE34VXNt0uP1ORSW+4mEa9b5CiJcWZeqZH08g49bFU/jRM2T04f+Wpw5mJ6HIzNBiojxeAbrHjeg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@yuku-core/binding-linux-arm64-gnu": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/@yuku-core/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.19.0.tgz",
+ "integrity": "sha512-jLNTi+gzaRwBJ+gwhCJ+rDb5dmx/8hEBx93UWd7hjMSqPTL1D1wvVSvXVAldV5kALvju7b0/m51EHEhs4+I1fA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@yuku-core/binding-linux-arm64-musl": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/@yuku-core/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.19.0.tgz",
+ "integrity": "sha512-YwyPIdW/rN2Fmv0MTFWi47FaB3F9g+2b+sJISyAw83Yd60RWH4T3Nx6XkAHHVN+uKJNBAd6So7/BVihSiFYvuQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@yuku-core/binding-linux-x64-gnu": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/@yuku-core/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.19.0.tgz",
+ "integrity": "sha512-/vskaAXVX3ESR43FiTdfiYS7z1b9uoQJwVQ/0RgUHgN2sWoAyCZs+aX4CgU7eKGIHTVfp9VFwv+c+2XchYiEtQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@yuku-core/binding-linux-x64-musl": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/@yuku-core/binding-linux-x64-musl/-/binding-linux-x64-musl-0.19.0.tgz",
+ "integrity": "sha512-FuXL5igeSKib9Rye02TdH+D6SQezTyGxIATMu1Qsn/QywrzwpGl35OLpS2C1x5vpGLeVE2XgiLd5mVPFHmIglQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@yuku-core/binding-win32-arm64": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/@yuku-core/binding-win32-arm64/-/binding-win32-arm64-0.19.0.tgz",
+ "integrity": "sha512-YuJAe7zEKT1Xa7LuHlhGJpPnYQeVtvo0rZvNjJRqkH0hQGOw4C8QeP30Tg5VKGzZfo2x8CjhjEhKt4TmLwfmdg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@yuku-core/binding-win32-x64": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/@yuku-core/binding-win32-x64/-/binding-win32-x64-0.19.0.tgz",
+ "integrity": "sha512-o8iY/mXwlRkedp0LNTr4+TEfXTPQwoNZmv6k+1WIAd1ZXEn8xJJTBCtB0osaVvdZo/x/cNmV16UrWrrGpM5Mvw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@yuku-toolchain/types": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/@yuku-toolchain/types/-/types-0.19.0.tgz",
+ "integrity": "sha512-tFkNbsP4WXX9UMUC5syJGdK9dPMLK0PPaIuXCcCYH75sZ8MrebfBZ2XvCILRTw8AgLivSSCfDa4R67iYBDa4Kg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/abbrev": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
@@ -2747,13 +2533,6 @@
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "node_modules/any-promise": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
- "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/aproba": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/aproba/-/aproba-2.1.0.tgz",
@@ -3067,22 +2846,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/bundle-require": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.1.0.tgz",
- "integrity": "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "load-tsconfig": "^0.2.3"
- },
- "engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
- },
- "peerDependencies": {
- "esbuild": ">=0.18"
- }
- },
"node_modules/cac": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/cac/-/cac-7.1.0.tgz",
@@ -3246,22 +3009,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/chokidar": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz",
- "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "readdirp": "^5.0.0"
- },
- "engines": {
- "node": ">= 20.19.0"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
- }
- },
"node_modules/chownr": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
@@ -3512,23 +3259,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/confbox": {
- "version": "0.1.8",
- "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz",
- "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/consola": {
- "version": "3.4.2",
- "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz",
- "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "^14.18.0 || >=16.10.0"
- }
- },
"node_modules/console-control-strings": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
@@ -3896,6 +3626,13 @@
"node": ">=8"
}
},
+ "node_modules/defu": {
+ "version": "6.1.7",
+ "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz",
+ "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
@@ -3986,6 +3723,27 @@
"url": "https://dotenvx.com"
}
},
+ "node_modules/dts-resolver": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/dts-resolver/-/dts-resolver-3.0.0.tgz",
+ "integrity": "sha512-1T1f+z+4tl9XD+m+0HBgWoL/nm0bOIffyWaUuUSBlFg/86IWvfx+wjNaO/ybU0AJzG9/Mi5hBUgGV6zCmWEN7Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^22.18.0 || >=24.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sxzz"
+ },
+ "peerDependencies": {
+ "oxc-resolver": ">=11.0.0"
+ },
+ "peerDependenciesMeta": {
+ "oxc-resolver": {
+ "optional": true
+ }
+ }
+ },
"node_modules/dunder-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
@@ -4019,6 +3777,16 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/empathic": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/empathic/-/empathic-2.1.0.tgz",
+ "integrity": "sha512-AnfC1ATldl49/cvZdLPDjBfrRNwbDO05aibiOtzQu3qtlbJtomNLhF30HEtn/7iBz50dlMECqATo3fG0LrdEgw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ }
+ },
"node_modules/end-of-stream": {
"version": "1.4.5",
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz",
@@ -4838,18 +4606,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/fix-dts-default-cjs-exports": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/fix-dts-default-cjs-exports/-/fix-dts-default-cjs-exports-1.0.1.tgz",
- "integrity": "sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "magic-string": "^0.30.17",
- "mlly": "^1.7.4",
- "rollup": "^4.34.8"
- }
- },
"node_modules/flat-cache": {
"version": "6.1.23",
"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.23.tgz",
@@ -5102,6 +4858,22 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/get-tsconfig": {
+ "version": "5.0.0-beta.6",
+ "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-5.0.0-beta.6.tgz",
+ "integrity": "sha512-X6fBC0pmImC70gvX2zm56go9hx0MyoGVdG0tUCkg/D+Xnh5TJsOZ7iDbOdI3PvmtrDxnu1YdDufpK2QJX1Meqw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "resolve-pkg-maps": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=20.20.0"
+ },
+ "funding": {
+ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1"
+ }
+ },
"node_modules/glob": {
"version": "7.2.3",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
@@ -5299,6 +5071,13 @@
"node": ">= 0.4"
}
},
+ "node_modules/hookable": {
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/hookable/-/hookable-6.1.2.tgz",
+ "integrity": "sha512-+abwxtiEA52GCVIsQqut3S/uKTbUwYIp4Pe/vv+6py5XiXBCqMZHg6pA6Y5qhgLSEys0/cYuPbO0z1QFj5ZCmg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/hookified": {
"version": "1.15.1",
"resolved": "https://registry.npmjs.org/hookified/-/hookified-1.15.1.tgz",
@@ -5396,6 +5175,19 @@
"node": ">= 4"
}
},
+ "node_modules/import-without-cache": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/import-without-cache/-/import-without-cache-0.4.1.tgz",
+ "integrity": "sha512-vXoV9PjKHEednCUu01e98TkImxy67e3BJXbTIOmIq4Hyzw3IAwYRcuPkfeTzJzwyyts4kjuA73x+pWJLc4f86A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^22.18.0 || >=24.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sxzz"
+ }
+ },
"node_modules/imurmurhash": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
@@ -5680,21 +5472,11 @@
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {
- "html-escaper": "^2.0.0",
- "istanbul-lib-report": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/joycon": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz",
- "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==",
- "dev": true,
- "license": "MIT",
+ "html-escaper": "^2.0.0",
+ "istanbul-lib-report": "^3.0.0"
+ },
"engines": {
- "node": ">=10"
+ "node": ">=8"
}
},
"node_modules/js-tokens": {
@@ -6074,36 +5856,6 @@
"url": "https://opencollective.com/parcel"
}
},
- "node_modules/lilconfig": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
- "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/sponsors/antonk52"
- }
- },
- "node_modules/lines-and-columns": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
- "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/load-tsconfig": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz",
- "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
- }
- },
"node_modules/locate-path": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
@@ -6430,19 +6182,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/mlly": {
- "version": "1.8.2",
- "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz",
- "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "acorn": "^8.16.0",
- "pathe": "^2.0.3",
- "pkg-types": "^1.3.1",
- "ufo": "^1.6.3"
- }
- },
"node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
@@ -6457,18 +6196,6 @@
"dev": true,
"license": "ISC"
},
- "node_modules/mz": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
- "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "any-promise": "^1.0.0",
- "object-assign": "^4.0.1",
- "thenify-all": "^1.0.0"
- }
- },
"node_modules/nan": {
"version": "2.29.0",
"resolved": "https://registry.npmjs.org/nan/-/nan-2.29.0.tgz",
@@ -6997,28 +6724,6 @@
],
"license": "MIT"
},
- "node_modules/pirates": {
- "version": "4.0.7",
- "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz",
- "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/pkg-types": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz",
- "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "confbox": "^0.1.8",
- "mlly": "^1.7.4",
- "pathe": "^2.0.1"
- }
- },
"node_modules/possible-typed-array-names": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz",
@@ -7058,49 +6763,6 @@
"node": "^10 || ^12 || >=14"
}
},
- "node_modules/postcss-load-config": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz",
- "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "lilconfig": "^3.1.1"
- },
- "engines": {
- "node": ">= 18"
- },
- "peerDependencies": {
- "jiti": ">=1.21.0",
- "postcss": ">=8.0.9",
- "tsx": "^4.8.1",
- "yaml": "^2.4.2"
- },
- "peerDependenciesMeta": {
- "jiti": {
- "optional": true
- },
- "postcss": {
- "optional": true
- },
- "tsx": {
- "optional": true
- },
- "yaml": {
- "optional": true
- }
- }
- },
"node_modules/prelude-ls": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
@@ -7260,6 +6922,23 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/quansync": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/quansync/-/quansync-1.0.0.tgz",
+ "integrity": "sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/antfu"
+ },
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/sxzz"
+ }
+ ],
+ "license": "MIT"
+ },
"node_modules/quick-format-unescaped": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz",
@@ -7354,20 +7033,6 @@
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
}
},
- "node_modules/readdirp": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz",
- "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 20.19.0"
- },
- "funding": {
- "type": "individual",
- "url": "https://paulmillr.com/funding/"
- }
- },
"node_modules/real-require": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz",
@@ -7405,14 +7070,14 @@
"dev": true,
"license": "MIT"
},
- "node_modules/resolve-from": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
- "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "node_modules/resolve-pkg-maps": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz",
+ "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==",
"dev": true,
"license": "MIT",
- "engines": {
- "node": ">=8"
+ "funding": {
+ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1"
}
},
"node_modules/responselike": {
@@ -7521,50 +7186,64 @@
"@rolldown/binding-win32-x64-msvc": "1.2.13"
}
},
- "node_modules/rollup": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.64.7.tgz",
- "integrity": "sha512-aCiJONoZp0lNGJ6sYqspLkh6UXaWEey/7Ko2TZyXQ4kgzAhDUxAgbt/oulXKmD+zFHXw1k+RF6ZZWOrjp7DZnQ==",
+ "node_modules/rolldown-plugin-dts": {
+ "version": "0.28.8",
+ "resolved": "https://registry.npmjs.org/rolldown-plugin-dts/-/rolldown-plugin-dts-0.28.8.tgz",
+ "integrity": "sha512-FVhfqxorCWcc20BVT5eVRfRjzLLl6mgzjcMR4gSBf0K4oQMXT0qoHhhzfXy0L7y83fQy7Ug5ZDNk90xM3/LiCQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@types/estree": "1.0.9"
- },
- "bin": {
- "rollup": "dist/bin/rollup"
+ "dts-resolver": "^3.0.0",
+ "get-tsconfig": "5.0.0-beta.6",
+ "obug": "^3.0.0",
+ "yuku-ast": "^0.19.0",
+ "yuku-codegen": "^0.19.0",
+ "yuku-parser": "^0.19.0"
},
"engines": {
- "node": ">=18.0.0",
- "npm": ">=8.0.0"
+ "node": "^22.18.0 || ^24.11.0 || >=26.0.0"
},
- "optionalDependencies": {
- "@napi-rs/lzma-linux-x64-gnu": "1.5.1",
- "@rollup/rollup-android-arm-eabi": "4.64.7",
- "@rollup/rollup-android-arm64": "4.64.7",
- "@rollup/rollup-darwin-arm64": "4.64.7",
- "@rollup/rollup-darwin-x64": "4.64.7",
- "@rollup/rollup-freebsd-arm64": "4.64.7",
- "@rollup/rollup-freebsd-x64": "4.64.7",
- "@rollup/rollup-linux-arm-gnueabihf": "4.64.7",
- "@rollup/rollup-linux-arm-musleabihf": "4.64.7",
- "@rollup/rollup-linux-arm64-gnu": "4.64.7",
- "@rollup/rollup-linux-arm64-musl": "4.64.7",
- "@rollup/rollup-linux-loong64-gnu": "4.64.7",
- "@rollup/rollup-linux-loong64-musl": "4.64.7",
- "@rollup/rollup-linux-ppc64-gnu": "4.64.7",
- "@rollup/rollup-linux-ppc64-musl": "4.64.7",
- "@rollup/rollup-linux-riscv64-gnu": "4.64.7",
- "@rollup/rollup-linux-riscv64-musl": "4.64.7",
- "@rollup/rollup-linux-s390x-gnu": "4.64.7",
- "@rollup/rollup-linux-x64-gnu": "4.64.7",
- "@rollup/rollup-linux-x64-musl": "4.64.7",
- "@rollup/rollup-openbsd-x64": "4.64.7",
- "@rollup/rollup-openharmony-arm64": "4.64.7",
- "@rollup/rollup-win32-arm64-msvc": "4.64.7",
- "@rollup/rollup-win32-ia32-msvc": "4.64.7",
- "@rollup/rollup-win32-x64-gnu": "4.64.7",
- "@rollup/rollup-win32-x64-msvc": "4.64.7",
- "fsevents": "~2.3.2"
+ "funding": {
+ "url": "https://github.com/sponsors/sxzz"
+ },
+ "peerDependencies": {
+ "@typescript/native-preview": "*",
+ "@volar/typescript": "~2.4.0",
+ "@vue/language-core": "~3.2.0 || ~3.3.0",
+ "rolldown": "^1.2.0",
+ "typescript": "^5.0.0 || ^6.0.0 || ~7.0.0",
+ "vue-tsc": "~3.2.0 || ~3.3.0"
+ },
+ "peerDependenciesMeta": {
+ "@typescript/native-preview": {
+ "optional": true
+ },
+ "@volar/typescript": {
+ "optional": true
+ },
+ "@vue/language-core": {
+ "optional": true
+ },
+ "typescript": {
+ "optional": true
+ },
+ "vue-tsc": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/rolldown-plugin-dts/node_modules/obug": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/obug/-/obug-3.0.0.tgz",
+ "integrity": "sha512-5vvB5+W7ePv+p3uqxi+RcW1XAzLW0/hxt3/4X4Lc4qHudzOhmBiBwOY6DRob4WnanAEGvNcLjF+KNOufrUoEQw==",
+ "dev": true,
+ "funding": [
+ "https://github.com/sponsors/sxzz",
+ "https://opencollective.com/debug"
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.20.0"
}
},
"node_modules/run-async": {
@@ -7950,39 +7629,6 @@
"url": "https://github.com/sponsors/Borewit"
}
},
- "node_modules/sucrase": {
- "version": "3.35.1",
- "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz",
- "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/gen-mapping": "^0.3.2",
- "commander": "^4.0.0",
- "lines-and-columns": "^1.1.6",
- "mz": "^2.7.0",
- "pirates": "^4.0.1",
- "tinyglobby": "^0.2.11",
- "ts-interface-checker": "^0.1.9"
- },
- "bin": {
- "sucrase": "bin/sucrase",
- "sucrase-node": "bin/sucrase-node"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
- }
- },
- "node_modules/sucrase/node_modules/commander": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
- "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 6"
- }
- },
"node_modules/supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
@@ -8122,29 +7768,6 @@
"safe-buffer": "~5.1.0"
}
},
- "node_modules/thenify": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
- "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "any-promise": "^1.0.0"
- }
- },
- "node_modules/thenify-all": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
- "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "thenify": ">= 3.1.0 < 4"
- },
- "engines": {
- "node": ">=0.8"
- }
- },
"node_modules/thread-stream": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.2.0.tgz",
@@ -8316,74 +7939,79 @@
"typescript": ">=4.8.4"
}
},
- "node_modules/ts-interface-checker": {
- "version": "0.1.13",
- "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
- "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
- "dev": true,
- "license": "Apache-2.0"
- },
- "node_modules/tslib": {
- "version": "2.8.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
- "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
- "dev": true,
- "license": "0BSD"
- },
- "node_modules/tsup": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/tsup/-/tsup-9.0.0.tgz",
- "integrity": "sha512-DHgb0bfo2gFKybOa8dRFMiHSqzWWhMkfNK0f902VVquWQtDBWExNgidHszjjDKaFd12pWPgzumpWf9nGr3gzFg==",
+ "node_modules/tsdown": {
+ "version": "0.23.1",
+ "resolved": "https://registry.npmjs.org/tsdown/-/tsdown-0.23.1.tgz",
+ "integrity": "sha512-MSC2WSOts3in95J334/VIS7KPfor3eCSvndJ6KdoVj9Aak9Kh1aNfz9ws5owhdukuTNSXRdfkPEzA/ihpDD6SA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "bundle-require": "^5.1.0",
- "cac": "^7.1.0",
- "chokidar": "^5.0.0",
- "consola": "^3.4.2",
- "esbuild": "^0.28.2",
- "fix-dts-default-cjs-exports": "^1.0.1",
- "joycon": "^3.1.1",
+ "cac": "^7.0.1",
+ "defu": "^6.1.7",
+ "empathic": "^2.1.0",
+ "hookable": "^6.1.2",
+ "import-without-cache": "^0.4.1",
"obug": "^3.0.0",
- "picocolors": "^1.1.1",
- "postcss-load-config": "^6.0.1",
- "resolve-from": "^5.0.0",
- "rollup": "^4.64.6",
- "source-map-js": "^1.2.2",
- "sucrase": "^3.35.1",
+ "picomatch": "^4.0.7",
+ "rolldown": "~1.2.13",
+ "rolldown-plugin-dts": "^0.28.7",
"tinyexec": "^1.3.1",
"tinyglobby": "^0.2.17",
- "tree-kill": "^1.2.2"
+ "tree-kill": "^1.2.2",
+ "unconfig-core": "^7.5.0",
+ "verkit": "^0.5.0"
},
"bin": {
- "tsup": "dist/cli-default.js",
- "tsup-node": "dist/cli-node.js"
+ "tsdown": "dist/run.mjs"
},
"engines": {
"node": "^22.18.0 || ^24.11.0 || >=26.0.0"
},
+ "funding": {
+ "url": "https://github.com/sponsors/sxzz"
+ },
"peerDependencies": {
- "@microsoft/api-extractor": "^7.36.0",
- "@swc/core": "^1",
- "postcss": "^8.4.12",
- "typescript": ">=4.5.0"
+ "@arethetypeswrong/core": "^0.18.1",
+ "@tsdown/css": "0.23.1",
+ "@tsdown/exe": "0.23.1",
+ "@vitejs/devtools": "*",
+ "publint": "^0.3.8",
+ "tsx": "*",
+ "typescript": "^5.0.0 || ^6.0.0 || ^7.0.0",
+ "unplugin-unused": ">=0.5.0",
+ "unrun": "*"
},
"peerDependenciesMeta": {
- "@microsoft/api-extractor": {
+ "@arethetypeswrong/core": {
+ "optional": true
+ },
+ "@tsdown/css": {
"optional": true
},
- "@swc/core": {
+ "@tsdown/exe": {
"optional": true
},
- "postcss": {
+ "@vitejs/devtools": {
+ "optional": true
+ },
+ "publint": {
+ "optional": true
+ },
+ "tsx": {
"optional": true
},
"typescript": {
"optional": true
+ },
+ "unplugin-unused": {
+ "optional": true
+ },
+ "unrun": {
+ "optional": true
}
}
},
- "node_modules/tsup/node_modules/obug": {
+ "node_modules/tsdown/node_modules/obug": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/obug/-/obug-3.0.0.tgz",
"integrity": "sha512-5vvB5+W7ePv+p3uqxi+RcW1XAzLW0/hxt3/4X4Lc4qHudzOhmBiBwOY6DRob4WnanAEGvNcLjF+KNOufrUoEQw==",
@@ -8397,6 +8025,13 @@
"node": ">=12.20.0"
}
},
+ "node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "dev": true,
+ "license": "0BSD"
+ },
"node_modules/tsx": {
"version": "4.23.15",
"resolved": "https://registry.npmjs.org/tsx/-/tsx-4.23.15.tgz",
@@ -8509,13 +8144,6 @@
"typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/ufo": {
- "version": "1.6.4",
- "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.4.tgz",
- "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/unbzip2-stream": {
"version": "1.4.3",
"resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz",
@@ -8527,6 +8155,20 @@
"through": "^2.3.8"
}
},
+ "node_modules/unconfig-core": {
+ "version": "7.5.0",
+ "resolved": "https://registry.npmjs.org/unconfig-core/-/unconfig-core-7.5.0.tgz",
+ "integrity": "sha512-Su3FauozOGP44ZmKdHy2oE6LPjk51M/TRRjHv2HNCWiDvfvCoxC2lno6jevMA91MYAdCdwP05QnWdWpSbncX/w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@quansync/fs": "^1.0.0",
+ "quansync": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
"node_modules/undici-types": {
"version": "7.24.6",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz",
@@ -8572,6 +8214,19 @@
"uuid": "dist/bin/uuid"
}
},
+ "node_modules/verkit": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/verkit/-/verkit-0.5.0.tgz",
+ "integrity": "sha512-u4J1hr6Y+C/hit34GwL3eIcUf3wngT8TlYUjK7tk0jxydKLAq3sYvifjdTDA6U3KCKRcQCQDGf/srjxfZF3l7g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.12.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sxzz"
+ }
+ },
"node_modules/viem": {
"version": "2.57.4",
"resolved": "https://registry.npmjs.org/viem/-/viem-2.57.4.tgz",
@@ -9009,6 +8664,73 @@
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
+ },
+ "node_modules/yuku-ast": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/yuku-ast/-/yuku-ast-0.19.0.tgz",
+ "integrity": "sha512-PyCsiScaelhxBGzL8dyeJkLqvRZycoh78R31Vrt/WqYrm0hMFoKwIw/X7Dx5mBKLWAMlV9I9HEyBOHnj2gZVyw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@yuku-toolchain/types": "^0.19.0"
+ },
+ "engines": {
+ "node": ">=14.18.0"
+ }
+ },
+ "node_modules/yuku-codegen": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/yuku-codegen/-/yuku-codegen-0.19.0.tgz",
+ "integrity": "sha512-uymAKHjDuaP4BEpkXC/BSLz4DUEF5oArZ5AuD3888nb2miChjWSgpPdojEJxm3pjpXkgUaCRJQyNAbnMN33wHg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@yuku-toolchain/types": "^0.19.0"
+ },
+ "engines": {
+ "node": ">=14.18.0"
+ }
+ },
+ "node_modules/yuku-core": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/yuku-core/-/yuku-core-0.19.0.tgz",
+ "integrity": "sha512-kYK9e1XdfirNhkipzW0wmMcSWcVF/CWnuugodfVYRCUwvoBefweL9HzB96OiKEhsx78V5WbUxbJqlizMX869Qg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@yuku-toolchain/types": "^0.19.0"
+ },
+ "engines": {
+ "node": ">=14.18.0"
+ },
+ "optionalDependencies": {
+ "@yuku-core/binding-android-arm64": "0.19.0",
+ "@yuku-core/binding-darwin-arm64": "0.19.0",
+ "@yuku-core/binding-darwin-x64": "0.19.0",
+ "@yuku-core/binding-freebsd-x64": "0.19.0",
+ "@yuku-core/binding-linux-arm-gnu": "0.19.0",
+ "@yuku-core/binding-linux-arm-musl": "0.19.0",
+ "@yuku-core/binding-linux-arm64-gnu": "0.19.0",
+ "@yuku-core/binding-linux-arm64-musl": "0.19.0",
+ "@yuku-core/binding-linux-x64-gnu": "0.19.0",
+ "@yuku-core/binding-linux-x64-musl": "0.19.0",
+ "@yuku-core/binding-win32-arm64": "0.19.0",
+ "@yuku-core/binding-win32-x64": "0.19.0"
+ }
+ },
+ "node_modules/yuku-parser": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/yuku-parser/-/yuku-parser-0.19.0.tgz",
+ "integrity": "sha512-XrBh9ZiQK5mJVRxZBAvD6LwRyAYrK3MFtH3+onyuxFL5hFD44EC3QOmIC1FjTj6H2MMwq46/NAI+NZxLZPZgxg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@yuku-toolchain/types": "^0.19.0",
+ "yuku-core": "0.19.0"
+ },
+ "engines": {
+ "node": ">=14.18.0"
+ }
}
}
}
diff --git a/analytics/package.json b/analytics/package.json
index 2193e12e2..d320c0298 100644
--- a/analytics/package.json
+++ b/analytics/package.json
@@ -5,7 +5,7 @@
"type": "module",
"main": "dist/analytics.js",
"scripts": {
- "build": "tsup",
+ "build": "tsdown",
"test": "vitest run",
"test:watch": "vitest",
"test:coverage": "vitest run --coverage",
@@ -47,7 +47,7 @@
"eslint": "^10.0.0",
"prettier": "^3.0.0",
"serverless-scaleway-functions": ">=0.4.16",
- "tsup": "^9.0.0",
+ "tsdown": "^0.23.1",
"tsx": "^4.23.5",
"typescript": "^5.9.3",
"typescript-eslint": "^8.60.0",
diff --git a/analytics/tsdown.config.ts b/analytics/tsdown.config.ts
new file mode 100644
index 000000000..7fefe2c6c
--- /dev/null
+++ b/analytics/tsdown.config.ts
@@ -0,0 +1,39 @@
+import { defineConfig } from "tsdown";
+
+export default defineConfig({
+ entry: ["analytics.ts", "rollup.ts"],
+ format: "esm",
+ platform: "node",
+ target: "node22",
+ outDir: "dist",
+ // Emit .js, not .mjs — serverless.yml handlers reference dist/*.js.
+ fixedExtension: false,
+ // Nothing consumes a deployed handler's types; tsconfig's declaration: true
+ // would auto-enable dts, so keep the dist shape tsup produced.
+ dts: false,
+ sourcemap: true,
+ minify: false,
+ deps: {
+ // Dev-only local server (npm run dev / dev:live), dynamically imported and
+ // gated behind NODE_ENV==="test" in hit.ts — never reached in production.
+ // tsdown only auto-externalizes package.json `dependencies`, not
+ // `devDependencies`, so these two need listing explicitly or rolldown
+ // bundles them (and serveHandler's own fastify dependency) anyway.
+ neverBundle: ["dotenv", "@scaleway/serverless-functions"],
+ // Scaleway's deploy zip ships dist/** only (see serverless.yml) — no
+ // package.json, no node_modules, so nothing left as external can be
+ // resolved at runtime. Not a blanket [/.*/] like the other packages in this
+ // repo use, because the two dev-only packages above must stay external; every
+ // real dependency has to be listed here instead. `viem` is transitive (only
+ // @fretchen/chain-utils imports it directly) but tsdown's alwaysBundle
+ // doesn't bundle a package's own dependencies unless they're named too —
+ // omitting it here shipped a broken `import "viem"` straight to production.
+ alwaysBundle: ["@fretchen/s3-utils", "@fretchen/chain-utils", "viem", "isbot"],
+ },
+ // createRequire banner for packages that use dynamic require() (like pino).
+ // The import is aliased: rolldown's own runtime chunks import `createRequire`
+ // unaliased, and a bare re-import in the same file is a SyntaxError.
+ banner: {
+ js: `import { createRequire as __fretchenCr } from 'module'; const require = __fretchenCr(import.meta.url);`,
+ },
+});
diff --git a/analytics/tsup.config.js b/analytics/tsup.config.js
deleted file mode 100644
index c9d35183f..000000000
--- a/analytics/tsup.config.js
+++ /dev/null
@@ -1,37 +0,0 @@
-import { defineConfig } from "tsup";
-import { builtinModules } from "module";
-
-export default defineConfig({
- entry: ["analytics.ts", "rollup.ts"],
- format: ["esm"],
- platform: "node",
- target: "node22",
- outDir: "dist",
- splitting: false,
- clean: true,
- minify: false,
- sourcemap: true,
- external: [
- ...builtinModules,
- ...builtinModules.map((m) => `node:${m}`),
- // Dev-only local server (npm run dev / dev:live), dynamically imported and
- // gated behind NODE_ENV==="test" in hit.ts — never reached in production.
- // tsup only auto-externalizes package.json `dependencies`, not
- // `devDependencies`, so these two need listing explicitly or esbuild
- // bundles them (and serveHandler's own fastify dependency) anyway.
- "dotenv",
- "@scaleway/serverless-functions",
- ],
- // Scaleway's deploy zip ships dist/** only (see serverless.yml) — no
- // package.json, no node_modules, so nothing left as `external` can be
- // resolved at runtime. Not a blanket [/.*/] like the other packages in this
- // repo use, because two dev-only packages below must stay external; every
- // real dependency has to be listed here instead. `viem` is transitive (only
- // @fretchen/chain-utils imports it directly) but tsup's noExternal doesn't
- // bundle a package's own dependencies unless they're named too — omitting
- // it here shipped a broken `import "viem"` straight to production.
- noExternal: ["@fretchen/s3-utils", "@fretchen/chain-utils", "viem", "isbot"],
- banner: {
- js: `import { createRequire } from 'module'; const require = createRequire(import.meta.url);`,
- },
-});
diff --git a/comment_service/README.md b/comment_service/README.md
index 24d46f2d5..3084a9404 100644
--- a/comment_service/README.md
+++ b/comment_service/README.md
@@ -40,7 +40,7 @@ npm install
npm test # run tests (vitest)
npm run test:coverage # with coverage report
npm run lint # eslint
-npm run build # tsup → dist/
+npm run build # tsdown → dist/
```
## Deployment
diff --git a/comment_service/package-lock.json b/comment_service/package-lock.json
index f288ce3ce..cae5bc79c 100644
--- a/comment_service/package-lock.json
+++ b/comment_service/package-lock.json
@@ -19,7 +19,7 @@
"eslint": "^10.0.0",
"prettier": "^3.0.0",
"serverless-scaleway-functions": ">=0.4.16",
- "tsup": "^9.0.0",
+ "tsdown": "^0.23.1",
"typescript": "^5.9.3",
"typescript-eslint": "^8.60.0",
"vitest": "^4.1.11"
@@ -133,1329 +133,589 @@
"keyv": "^5.6.0"
}
},
- "node_modules/@esbuild/aix-ppc64": {
- "version": "0.28.2",
- "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz",
- "integrity": "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==",
- "cpu": [
- "ppc64"
- ],
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.10.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz",
+ "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==",
"dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "aix"
- ],
+ "dependencies": {
+ "eslint-visitor-keys": "^3.4.3"
+ },
"engines": {
- "node": ">=18"
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
}
},
- "node_modules/@esbuild/android-arm": {
- "version": "0.28.2",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.2.tgz",
- "integrity": "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==",
- "cpu": [
- "arm"
- ],
+ "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
"dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
+ "license": "Apache-2.0",
"engines": {
- "node": ">=18"
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
}
},
- "node_modules/@esbuild/android-arm64": {
- "version": "0.28.2",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz",
- "integrity": "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==",
- "cpu": [
- "arm64"
- ],
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.12.2",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz",
+ "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==",
"dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
"engines": {
- "node": ">=18"
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
}
},
- "node_modules/@esbuild/android-x64": {
- "version": "0.28.2",
- "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.2.tgz",
- "integrity": "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==",
- "cpu": [
- "x64"
- ],
+ "node_modules/@eslint/config-array": {
+ "version": "0.23.5",
+ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz",
+ "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==",
"dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/object-schema": "^3.0.5",
+ "debug": "^4.3.1",
+ "minimatch": "^10.2.4"
+ },
"engines": {
- "node": ">=18"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
}
},
- "node_modules/@esbuild/darwin-arm64": {
- "version": "0.28.2",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz",
- "integrity": "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==",
- "cpu": [
- "arm64"
- ],
+ "node_modules/@eslint/config-helpers": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.7.0.tgz",
+ "integrity": "sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==",
"dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^1.2.1"
+ },
"engines": {
- "node": ">=18"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
}
},
- "node_modules/@esbuild/darwin-x64": {
- "version": "0.28.2",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz",
- "integrity": "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==",
- "cpu": [
- "x64"
- ],
+ "node_modules/@eslint/core": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz",
+ "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==",
"dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@types/json-schema": "^7.0.15"
+ },
"engines": {
- "node": ">=18"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
}
},
- "node_modules/@esbuild/freebsd-arm64": {
- "version": "0.28.2",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz",
- "integrity": "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==",
- "cpu": [
- "arm64"
- ],
+ "node_modules/@eslint/js": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz",
+ "integrity": "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==",
"dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ],
"engines": {
- "node": ">=18"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ },
+ "peerDependencies": {
+ "eslint": "^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "eslint": {
+ "optional": true
+ }
}
},
- "node_modules/@esbuild/freebsd-x64": {
- "version": "0.28.2",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz",
- "integrity": "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==",
- "cpu": [
- "x64"
- ],
+ "node_modules/@eslint/object-schema": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz",
+ "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==",
"dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ],
+ "license": "Apache-2.0",
"engines": {
- "node": ">=18"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
}
},
- "node_modules/@esbuild/linux-arm": {
- "version": "0.28.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz",
- "integrity": "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==",
- "cpu": [
- "arm"
- ],
+ "node_modules/@eslint/plugin-kit": {
+ "version": "0.7.3",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.3.tgz",
+ "integrity": "sha512-IkO+/KEUvwbVpiURZg+P7zF74z5Jxe0UgJxVni+RtoHQ6IZieXaO02kmadomap/q+l6bc/jdPGGqTjhuZnuz1Q==",
"dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^1.2.1",
+ "levn": "^0.4.1"
+ },
"engines": {
- "node": ">=18"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
}
},
- "node_modules/@esbuild/linux-arm64": {
- "version": "0.28.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz",
- "integrity": "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==",
- "cpu": [
- "arm64"
- ],
+ "node_modules/@fastify/ajv-compiler": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-3.6.0.tgz",
+ "integrity": "sha512-LwdXQJjmMD+GwLOkP7TVC68qa+pSSogeWWmznRJ/coyTcfe9qA05AHFSe1eZFwK6q+xVRpChnvFUkf1iYaSZsQ==",
"dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "ajv": "^8.11.0",
+ "ajv-formats": "^2.1.1",
+ "fast-uri": "^2.0.0"
}
},
- "node_modules/@esbuild/linux-ia32": {
- "version": "0.28.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz",
- "integrity": "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==",
- "cpu": [
- "ia32"
- ],
+ "node_modules/@fastify/ajv-compiler/node_modules/ajv": {
+ "version": "8.20.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz",
+ "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==",
"dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
}
},
- "node_modules/@esbuild/linux-loong64": {
- "version": "0.28.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz",
- "integrity": "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==",
- "cpu": [
- "loong64"
- ],
+ "node_modules/@fastify/ajv-compiler/node_modules/ajv/node_modules/fast-uri": {
+ "version": "3.1.8",
+ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.8.tgz",
+ "integrity": "sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==",
"dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
],
- "engines": {
- "node": ">=18"
- }
+ "license": "BSD-3-Clause"
},
- "node_modules/@esbuild/linux-mips64el": {
- "version": "0.28.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz",
- "integrity": "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==",
- "cpu": [
- "mips64el"
- ],
+ "node_modules/@fastify/ajv-compiler/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
"dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
+ "license": "MIT"
},
- "node_modules/@esbuild/linux-ppc64": {
- "version": "0.28.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz",
- "integrity": "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==",
- "cpu": [
- "ppc64"
- ],
+ "node_modules/@fastify/error": {
+ "version": "3.4.1",
+ "resolved": "https://registry.npmjs.org/@fastify/error/-/error-3.4.1.tgz",
+ "integrity": "sha512-wWSvph+29GR783IhmvdwWnN4bUxTD01Vm5Xad4i7i1VuAOItLvbPAb69sb0IQ2N57yprvhNIwAP5B6xfKTmjmQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@fastify/fast-json-stringify-compiler": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-4.3.0.tgz",
+ "integrity": "sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==",
"dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-riscv64": {
- "version": "0.28.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz",
- "integrity": "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==",
- "cpu": [
- "riscv64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "fast-json-stringify": "^5.7.0"
}
},
- "node_modules/@esbuild/linux-s390x": {
- "version": "0.28.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz",
- "integrity": "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==",
- "cpu": [
- "s390x"
- ],
+ "node_modules/@fastify/merge-json-schemas": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@fastify/merge-json-schemas/-/merge-json-schemas-0.1.1.tgz",
+ "integrity": "sha512-fERDVz7topgNjtXsJTTW1JKLy0rhuLRcquYqNR9rF7OcVpCa2OVW49ZPDIhaRRCaUuvVxI+N416xUoF76HNSXA==",
"dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3"
}
},
- "node_modules/@esbuild/linux-x64": {
- "version": "0.28.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz",
- "integrity": "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==",
- "cpu": [
- "x64"
- ],
+ "node_modules/@fastify/url-data": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@fastify/url-data/-/url-data-5.4.0.tgz",
+ "integrity": "sha512-Ht8lAZnIGsBKdFu6yYwN98OH89fFziCMeCq3yyZbIUKl+lbK5njhmPrcxAwfwLW1QoVk6OO0BkUPu1E/3Js94A==",
"dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "fast-uri": "^2.2.0",
+ "fastify-plugin": "^4.0.0"
}
},
- "node_modules/@esbuild/netbsd-arm64": {
- "version": "0.28.2",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz",
- "integrity": "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "netbsd"
- ],
- "engines": {
- "node": ">=18"
- }
+ "node_modules/@fretchen/s3-utils": {
+ "resolved": "../shared/s3-utils",
+ "link": true
},
- "node_modules/@esbuild/netbsd-x64": {
- "version": "0.28.2",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz",
- "integrity": "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==",
- "cpu": [
- "x64"
- ],
+ "node_modules/@grpc/grpc-js": {
+ "version": "1.14.6",
+ "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.6.tgz",
+ "integrity": "sha512-SgC/B3/VZ8lTyOZ4Cwk6f1skWhmkNAaVfiX90qd5u1rRXGKk1//8FTUEN9GvOUq7rfWIqAYkA3CoyumYVpOS6g==",
"dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "netbsd"
- ],
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@grpc/proto-loader": "^0.8.0",
+ "@js-sdsl/ordered-map": "^4.4.2"
+ },
"engines": {
- "node": ">=18"
+ "node": ">=12.10.0"
}
},
- "node_modules/@esbuild/openbsd-arm64": {
- "version": "0.28.2",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz",
- "integrity": "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==",
- "cpu": [
- "arm64"
- ],
+ "node_modules/@grpc/grpc-js/node_modules/@grpc/proto-loader": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.8.1.tgz",
+ "integrity": "sha512-wtF6h+DY6M3YaDBPAmvuuA6jV8Sif9MjtOI5euKFWRgCDl5PeDpPsHR9u2l6St5ceY8AZgoNDww5+HvEsXFsGg==",
"dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "openbsd"
- ],
+ "license": "Apache-2.0",
+ "dependencies": {
+ "lodash.camelcase": "^4.3.0",
+ "long": "^5.0.0",
+ "protobufjs": "^7.5.5",
+ "yargs": "^17.7.2"
+ },
+ "bin": {
+ "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js"
+ },
"engines": {
- "node": ">=18"
+ "node": ">=6"
}
},
- "node_modules/@esbuild/openbsd-x64": {
- "version": "0.28.2",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz",
- "integrity": "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==",
- "cpu": [
- "x64"
- ],
+ "node_modules/@grpc/proto-loader": {
+ "version": "0.7.15",
+ "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.15.tgz",
+ "integrity": "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==",
"dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "openbsd"
- ],
+ "license": "Apache-2.0",
+ "dependencies": {
+ "lodash.camelcase": "^4.3.0",
+ "long": "^5.0.0",
+ "protobufjs": "^7.2.5",
+ "yargs": "^17.7.2"
+ },
+ "bin": {
+ "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js"
+ },
"engines": {
- "node": ">=18"
+ "node": ">=6"
}
},
- "node_modules/@esbuild/openharmony-arm64": {
- "version": "0.28.2",
- "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz",
- "integrity": "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==",
- "cpu": [
- "arm64"
- ],
+ "node_modules/@humanfs/core": {
+ "version": "0.19.2",
+ "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz",
+ "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==",
"dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "openharmony"
- ],
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@humanfs/types": "^0.15.0"
+ },
"engines": {
- "node": ">=18"
+ "node": ">=18.18.0"
}
},
- "node_modules/@esbuild/sunos-x64": {
- "version": "0.28.2",
- "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz",
- "integrity": "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==",
- "cpu": [
- "x64"
- ],
+ "node_modules/@humanfs/node": {
+ "version": "0.16.8",
+ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz",
+ "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==",
"dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "sunos"
- ],
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@humanfs/core": "^0.19.2",
+ "@humanfs/types": "^0.15.0",
+ "@humanwhocodes/retry": "^0.4.0"
+ },
"engines": {
- "node": ">=18"
+ "node": ">=18.18.0"
}
},
- "node_modules/@esbuild/win32-arm64": {
- "version": "0.28.2",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz",
- "integrity": "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==",
- "cpu": [
- "arm64"
- ],
+ "node_modules/@humanfs/types": {
+ "version": "0.15.0",
+ "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz",
+ "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==",
"dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
+ "license": "Apache-2.0",
"engines": {
- "node": ">=18"
+ "node": ">=18.18.0"
}
},
- "node_modules/@esbuild/win32-ia32": {
- "version": "0.28.2",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz",
- "integrity": "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==",
- "cpu": [
- "ia32"
- ],
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
"dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
+ "license": "Apache-2.0",
"engines": {
- "node": ">=18"
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
}
},
- "node_modules/@esbuild/win32-x64": {
- "version": "0.28.2",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz",
- "integrity": "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==",
- "cpu": [
- "x64"
- ],
+ "node_modules/@humanwhocodes/retry": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
+ "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
"dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
+ "license": "Apache-2.0",
"engines": {
- "node": ">=18"
+ "node": ">=18.18"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
}
},
- "node_modules/@eslint-community/eslint-utils": {
- "version": "4.10.1",
- "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz",
- "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==",
+ "node_modules/@inquirer/external-editor": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz",
+ "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "eslint-visitor-keys": "^3.4.3"
+ "chardet": "^2.1.1",
+ "iconv-lite": "^0.7.0"
},
"engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
+ "node": ">=18"
},
"peerDependencies": {
- "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
}
},
- "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
- "version": "3.4.3",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
- "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
"dev": true,
- "license": "Apache-2.0",
+ "license": "MIT",
"engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
+ "node": ">=6.0.0"
}
},
- "node_modules/@eslint-community/regexpp": {
- "version": "4.12.2",
- "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz",
- "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==",
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz",
+ "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.31",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
+ "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
"dev": true,
"license": "MIT",
- "engines": {
- "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
}
},
- "node_modules/@eslint/config-array": {
- "version": "0.23.5",
- "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz",
- "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==",
+ "node_modules/@js-sdsl/ordered-map": {
+ "version": "4.4.2",
+ "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz",
+ "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==",
"dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@eslint/object-schema": "^3.0.5",
- "debug": "^4.3.1",
- "minimatch": "^10.2.4"
- },
- "engines": {
- "node": "^20.19.0 || ^22.13.0 || >=24"
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/js-sdsl"
}
},
- "node_modules/@eslint/config-helpers": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.7.0.tgz",
- "integrity": "sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==",
+ "node_modules/@keyv/bigmap": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@keyv/bigmap/-/bigmap-1.3.1.tgz",
+ "integrity": "sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ==",
"dev": true,
- "license": "Apache-2.0",
+ "license": "MIT",
"dependencies": {
- "@eslint/core": "^1.2.1"
+ "hashery": "^1.4.0",
+ "hookified": "^1.15.0"
},
"engines": {
- "node": "^20.19.0 || ^22.13.0 || >=24"
+ "node": ">= 18"
+ },
+ "peerDependencies": {
+ "keyv": "^5.6.0"
}
},
- "node_modules/@eslint/core": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz",
- "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==",
+ "node_modules/@keyv/serialize": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.1.1.tgz",
+ "integrity": "sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==",
"dev": true,
- "license": "Apache-2.0",
+ "license": "MIT"
+ },
+ "node_modules/@mapbox/node-pre-gyp": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz",
+ "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==",
+ "dev": true,
+ "license": "BSD-3-Clause",
"dependencies": {
- "@types/json-schema": "^7.0.15"
+ "detect-libc": "^2.0.0",
+ "https-proxy-agent": "^5.0.0",
+ "make-dir": "^3.1.0",
+ "node-fetch": "^2.6.7",
+ "nopt": "^5.0.0",
+ "npmlog": "^5.0.1",
+ "rimraf": "^3.0.2",
+ "semver": "^7.3.5",
+ "tar": "^6.1.11"
},
- "engines": {
- "node": "^20.19.0 || ^22.13.0 || >=24"
+ "bin": {
+ "node-pre-gyp": "bin/node-pre-gyp"
}
},
- "node_modules/@eslint/js": {
- "version": "10.0.1",
- "resolved": "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz",
- "integrity": "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==",
+ "node_modules/@mapbox/node-pre-gyp/node_modules/make-dir": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+ "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
"dev": true,
"license": "MIT",
+ "dependencies": {
+ "semver": "^6.0.0"
+ },
"engines": {
- "node": "^20.19.0 || ^22.13.0 || >=24"
+ "node": ">=8"
},
"funding": {
- "url": "https://eslint.org/donate"
- },
- "peerDependencies": {
- "eslint": "^10.0.0"
- },
- "peerDependenciesMeta": {
- "eslint": {
- "optional": true
- }
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/@eslint/object-schema": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz",
- "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==",
+ "node_modules/@mapbox/node-pre-gyp/node_modules/make-dir/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": "^20.19.0 || ^22.13.0 || >=24"
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
}
},
- "node_modules/@eslint/plugin-kit": {
- "version": "0.7.3",
- "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.3.tgz",
- "integrity": "sha512-IkO+/KEUvwbVpiURZg+P7zF74z5Jxe0UgJxVni+RtoHQ6IZieXaO02kmadomap/q+l6bc/jdPGGqTjhuZnuz1Q==",
+ "node_modules/@oxc-project/types": {
+ "version": "0.153.0",
+ "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.153.0.tgz",
+ "integrity": "sha512-jSNrRIyvPVLL5E1z/tS5zLAprosGz/FuI1PWwEOz59j3E4TTTzSpqKb/RDGqJhhW0QHYISGXxq582wGx6T11Tw==",
"dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@eslint/core": "^1.2.1",
- "levn": "^0.4.1"
- },
- "engines": {
- "node": "^20.19.0 || ^22.13.0 || >=24"
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/oxc-project"
}
},
- "node_modules/@fastify/ajv-compiler": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-3.6.0.tgz",
- "integrity": "sha512-LwdXQJjmMD+GwLOkP7TVC68qa+pSSogeWWmznRJ/coyTcfe9qA05AHFSe1eZFwK6q+xVRpChnvFUkf1iYaSZsQ==",
+ "node_modules/@phc/format": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@phc/format/-/format-1.0.0.tgz",
+ "integrity": "sha512-m7X9U6BG2+J+R1lSOdCiITLLrxm+cWlNI3HUFA92oLO77ObGNzaKdh8pMLqdZcshtkKuV84olNNXDfMc4FezBQ==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "ajv": "^8.11.0",
- "ajv-formats": "^2.1.1",
- "fast-uri": "^2.0.0"
+ "engines": {
+ "node": ">=10"
}
},
- "node_modules/@fastify/ajv-compiler/node_modules/ajv": {
- "version": "8.20.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz",
- "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==",
+ "node_modules/@pinojs/redact": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@pinojs/redact/-/redact-0.4.0.tgz",
+ "integrity": "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==",
"dev": true,
- "license": "MIT",
- "dependencies": {
- "fast-deep-equal": "^3.1.3",
- "fast-uri": "^3.0.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
+ "license": "MIT"
},
- "node_modules/@fastify/ajv-compiler/node_modules/ajv/node_modules/fast-uri": {
- "version": "3.1.8",
- "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.8.tgz",
- "integrity": "sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==",
+ "node_modules/@protobufjs/aspromise": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
+ "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==",
"dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/fastify"
- },
- {
- "type": "opencollective",
- "url": "https://opencollective.com/fastify"
- }
- ],
"license": "BSD-3-Clause"
},
- "node_modules/@fastify/ajv-compiler/node_modules/json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "node_modules/@protobufjs/base64": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
+ "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==",
"dev": true,
- "license": "MIT"
+ "license": "BSD-3-Clause"
},
- "node_modules/@fastify/error": {
- "version": "3.4.1",
- "resolved": "https://registry.npmjs.org/@fastify/error/-/error-3.4.1.tgz",
- "integrity": "sha512-wWSvph+29GR783IhmvdwWnN4bUxTD01Vm5Xad4i7i1VuAOItLvbPAb69sb0IQ2N57yprvhNIwAP5B6xfKTmjmQ==",
+ "node_modules/@protobufjs/codegen": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz",
+ "integrity": "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==",
"dev": true,
- "license": "MIT"
+ "license": "BSD-3-Clause"
},
- "node_modules/@fastify/fast-json-stringify-compiler": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-4.3.0.tgz",
- "integrity": "sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==",
+ "node_modules/@protobufjs/eventemitter": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.1.tgz",
+ "integrity": "sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg==",
"dev": true,
- "license": "MIT",
- "dependencies": {
- "fast-json-stringify": "^5.7.0"
- }
+ "license": "BSD-3-Clause"
},
- "node_modules/@fastify/merge-json-schemas": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/@fastify/merge-json-schemas/-/merge-json-schemas-0.1.1.tgz",
- "integrity": "sha512-fERDVz7topgNjtXsJTTW1JKLy0rhuLRcquYqNR9rF7OcVpCa2OVW49ZPDIhaRRCaUuvVxI+N416xUoF76HNSXA==",
+ "node_modules/@protobufjs/fetch": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.1.tgz",
+ "integrity": "sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==",
"dev": true,
- "license": "MIT",
+ "license": "BSD-3-Clause",
"dependencies": {
- "fast-deep-equal": "^3.1.3"
+ "@protobufjs/aspromise": "^1.1.1"
}
},
- "node_modules/@fastify/url-data": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/@fastify/url-data/-/url-data-5.4.0.tgz",
- "integrity": "sha512-Ht8lAZnIGsBKdFu6yYwN98OH89fFziCMeCq3yyZbIUKl+lbK5njhmPrcxAwfwLW1QoVk6OO0BkUPu1E/3Js94A==",
+ "node_modules/@protobufjs/float": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
+ "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==",
"dev": true,
- "license": "MIT",
- "dependencies": {
- "fast-uri": "^2.2.0",
- "fastify-plugin": "^4.0.0"
- }
+ "license": "BSD-3-Clause"
},
- "node_modules/@fretchen/s3-utils": {
- "resolved": "../shared/s3-utils",
- "link": true
- },
- "node_modules/@grpc/grpc-js": {
- "version": "1.14.6",
- "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.6.tgz",
- "integrity": "sha512-SgC/B3/VZ8lTyOZ4Cwk6f1skWhmkNAaVfiX90qd5u1rRXGKk1//8FTUEN9GvOUq7rfWIqAYkA3CoyumYVpOS6g==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@grpc/proto-loader": "^0.8.0",
- "@js-sdsl/ordered-map": "^4.4.2"
- },
- "engines": {
- "node": ">=12.10.0"
- }
- },
- "node_modules/@grpc/grpc-js/node_modules/@grpc/proto-loader": {
- "version": "0.8.1",
- "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.8.1.tgz",
- "integrity": "sha512-wtF6h+DY6M3YaDBPAmvuuA6jV8Sif9MjtOI5euKFWRgCDl5PeDpPsHR9u2l6St5ceY8AZgoNDww5+HvEsXFsGg==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "lodash.camelcase": "^4.3.0",
- "long": "^5.0.0",
- "protobufjs": "^7.5.5",
- "yargs": "^17.7.2"
- },
- "bin": {
- "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/@grpc/proto-loader": {
- "version": "0.7.15",
- "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.15.tgz",
- "integrity": "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "lodash.camelcase": "^4.3.0",
- "long": "^5.0.0",
- "protobufjs": "^7.2.5",
- "yargs": "^17.7.2"
- },
- "bin": {
- "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/@humanfs/core": {
- "version": "0.19.2",
- "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz",
- "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@humanfs/types": "^0.15.0"
- },
- "engines": {
- "node": ">=18.18.0"
- }
- },
- "node_modules/@humanfs/node": {
- "version": "0.16.8",
- "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz",
- "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@humanfs/core": "^0.19.2",
- "@humanfs/types": "^0.15.0",
- "@humanwhocodes/retry": "^0.4.0"
- },
- "engines": {
- "node": ">=18.18.0"
- }
- },
- "node_modules/@humanfs/types": {
- "version": "0.15.0",
- "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz",
- "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=18.18.0"
- }
- },
- "node_modules/@humanwhocodes/module-importer": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
- "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=12.22"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/nzakas"
- }
- },
- "node_modules/@humanwhocodes/retry": {
- "version": "0.4.3",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
- "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=18.18"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/nzakas"
- }
- },
- "node_modules/@inquirer/external-editor": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz",
- "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "chardet": "^2.1.1",
- "iconv-lite": "^0.7.0"
- },
- "engines": {
- "node": ">=18"
- },
- "peerDependencies": {
- "@types/node": ">=18"
- },
- "peerDependenciesMeta": {
- "@types/node": {
- "optional": true
- }
- }
- },
- "node_modules/@jridgewell/gen-mapping": {
- "version": "0.3.13",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
- "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/sourcemap-codec": "^1.5.0",
- "@jridgewell/trace-mapping": "^0.3.24"
- }
- },
- "node_modules/@jridgewell/resolve-uri": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
- "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz",
- "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@jridgewell/trace-mapping": {
- "version": "0.3.31",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
- "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/resolve-uri": "^3.1.0",
- "@jridgewell/sourcemap-codec": "^1.4.14"
- }
- },
- "node_modules/@js-sdsl/ordered-map": {
- "version": "4.4.2",
- "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz",
- "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==",
- "dev": true,
- "license": "MIT",
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/js-sdsl"
- }
- },
- "node_modules/@keyv/bigmap": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/@keyv/bigmap/-/bigmap-1.3.1.tgz",
- "integrity": "sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "hashery": "^1.4.0",
- "hookified": "^1.15.0"
- },
- "engines": {
- "node": ">= 18"
- },
- "peerDependencies": {
- "keyv": "^5.6.0"
- }
- },
- "node_modules/@keyv/serialize": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.1.1.tgz",
- "integrity": "sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@mapbox/node-pre-gyp": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz",
- "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==",
- "dev": true,
- "license": "BSD-3-Clause",
- "dependencies": {
- "detect-libc": "^2.0.0",
- "https-proxy-agent": "^5.0.0",
- "make-dir": "^3.1.0",
- "node-fetch": "^2.6.7",
- "nopt": "^5.0.0",
- "npmlog": "^5.0.1",
- "rimraf": "^3.0.2",
- "semver": "^7.3.5",
- "tar": "^6.1.11"
- },
- "bin": {
- "node-pre-gyp": "bin/node-pre-gyp"
- }
- },
- "node_modules/@mapbox/node-pre-gyp/node_modules/make-dir": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
- "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "semver": "^6.0.0"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@mapbox/node-pre-gyp/node_modules/make-dir/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "dev": true,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/@napi-rs/lzma-linux-x64-gnu": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz",
- "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "libc": [
- "glibc"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^22.20 || ^24.12 || >=25"
- }
- },
- "node_modules/@oxc-project/types": {
- "version": "0.153.0",
- "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.153.0.tgz",
- "integrity": "sha512-jSNrRIyvPVLL5E1z/tS5zLAprosGz/FuI1PWwEOz59j3E4TTTzSpqKb/RDGqJhhW0QHYISGXxq582wGx6T11Tw==",
- "dev": true,
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/oxc-project"
- }
- },
- "node_modules/@phc/format": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/@phc/format/-/format-1.0.0.tgz",
- "integrity": "sha512-m7X9U6BG2+J+R1lSOdCiITLLrxm+cWlNI3HUFA92oLO77ObGNzaKdh8pMLqdZcshtkKuV84olNNXDfMc4FezBQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@pinojs/redact": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/@pinojs/redact/-/redact-0.4.0.tgz",
- "integrity": "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@protobufjs/aspromise": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
- "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==",
- "dev": true,
- "license": "BSD-3-Clause"
- },
- "node_modules/@protobufjs/base64": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
- "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==",
- "dev": true,
- "license": "BSD-3-Clause"
- },
- "node_modules/@protobufjs/codegen": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz",
- "integrity": "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==",
- "dev": true,
- "license": "BSD-3-Clause"
- },
- "node_modules/@protobufjs/eventemitter": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.1.tgz",
- "integrity": "sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg==",
- "dev": true,
- "license": "BSD-3-Clause"
- },
- "node_modules/@protobufjs/fetch": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.1.tgz",
- "integrity": "sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==",
- "dev": true,
- "license": "BSD-3-Clause",
- "dependencies": {
- "@protobufjs/aspromise": "^1.1.1"
- }
- },
- "node_modules/@protobufjs/float": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
- "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==",
- "dev": true,
- "license": "BSD-3-Clause"
- },
- "node_modules/@protobufjs/path": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
- "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==",
- "dev": true,
- "license": "BSD-3-Clause"
- },
- "node_modules/@protobufjs/pool": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
- "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==",
- "dev": true,
- "license": "BSD-3-Clause"
- },
- "node_modules/@protobufjs/utf8": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.2.tgz",
- "integrity": "sha512-b1UQwcEZ4yCnMCD8DAL1VlbvBJE9/IX4FTIp7BG1xYpf29SLazLSrqUkj4w7Y5y7cCVP6E5tcqqcI0xemPkHug==",
- "dev": true,
- "license": "BSD-3-Clause"
- },
- "node_modules/@rolldown/binding-android-arm-eabi": {
- "version": "1.2.13",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.13.tgz",
- "integrity": "sha512-Vu/NICrgdRvUOeaJZIyB2FP63s6fO/4ud5l8dXmxDx9yDyn+mN0y+gsvsVviSli+T361Aqo0h46EuMoobrwawA==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-android-arm64": {
- "version": "1.2.13",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.13.tgz",
- "integrity": "sha512-6LEoIrGy5vvCd2boNnv2soPSUZj/PRvhp8R/t9KlX+mIZxThIE/ZqxrGXxmuNX0FuvQFvLdZr7S4HrYpYBVhEQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-darwin-arm64": {
- "version": "1.2.13",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.13.tgz",
- "integrity": "sha512-CaJSRzlQ6Q+zkDMVA9OkVxBjVoPRCDEE3v0FSJ9kIQBgRjFApA3Si4ijhbNVUji7ZJt+PfO0e46qy4nPInHUPA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-darwin-x64": {
- "version": "1.2.13",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.13.tgz",
- "integrity": "sha512-e4r340I5hxSzJkD3YJBxgzq/rJ3wwxwdLLb2FPt1Zpyem20nrQPT11DDEEkazwxaHumH8wpglsp/Ozgj/wT6mw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-freebsd-x64": {
- "version": "1.2.13",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.13.tgz",
- "integrity": "sha512-hoBWDZ4/K/mJKVMbsgUd1jfpA2DiOrJ54mpegObU9TBHBBrtX4FLIXJJQRDPZ/2Dn91GvPob+Z2hwKJzf4E5SQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-linux-arm-gnueabihf": {
- "version": "1.2.13",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.13.tgz",
- "integrity": "sha512-oF9fZu3vTWnTiVAkDFxU9PJLt1nh20K9RRpuHsR7ZnE2L7XookBbDBVLojCVSLGbvtSlxeUNnjAj6DbNsKyzbg==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-linux-arm64-gnu": {
- "version": "1.2.13",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.13.tgz",
- "integrity": "sha512-DTpb/+jMiqWMPgphn4ksW1zW+XLJ6dJJ9FMvnIk9I291LhCctMPhMYJrP5t9p6C9qa3KXadDdUEZHBaPh3kNxQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "libc": [
- "glibc"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-linux-arm64-musl": {
- "version": "1.2.13",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.13.tgz",
- "integrity": "sha512-xU+Kvv9N2A3SY35zFh1FWWNjxbadE/BKeqnkXe7vScU4GZsw757BlVmDLITZEq8DPpk6m7uoDYkK7P+x/uU5Ow==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "libc": [
- "musl"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-linux-ppc64-gnu": {
- "version": "1.2.13",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.13.tgz",
- "integrity": "sha512-XMk/hnhh25oQ756Lclb1Q11h4ll0xC0Esa5w4Vzp+mAE2S3AGJgeM0SonrIgY8fHhjarb6hcoTuwoFG0VVP2ig==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
- "libc": [
- "glibc"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-linux-s390x-gnu": {
- "version": "1.2.13",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.13.tgz",
- "integrity": "sha512-U1BoTHYmlywE2n3HUWjzZ+8EQsKr+OwpxYuDWaubx42tUL8QSL7nOqRz/NVHanibbFP3M1Rxuprz/wNcbMKjqw==",
- "cpu": [
- "s390x"
- ],
- "dev": true,
- "libc": [
- "glibc"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-linux-x64-gnu": {
- "version": "1.2.13",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.13.tgz",
- "integrity": "sha512-J4cm80Pc6wEwV5AZ42o62sIQgDk+Y7R2s646jIwuvO+4V46QB58N4vVuMPWCBaNgursXLpmUWJV//WQAkPvHBQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "libc": [
- "glibc"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-linux-x64-musl": {
- "version": "1.2.13",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.13.tgz",
- "integrity": "sha512-W0euZS40U4V6JkmEnVCIX9mcsL6cbXQ4X8c2w+MMOIjFg68TXUW+u3RT+2e1t1pv9mg/EP3pDtK3POXdQ7Rxyw==",
- "cpu": [
- "x64"
- ],
+ "node_modules/@protobufjs/path": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
+ "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==",
"dev": true,
- "libc": [
- "musl"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
+ "license": "BSD-3-Clause"
},
- "node_modules/@rolldown/binding-openharmony-arm64": {
- "version": "1.2.13",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.13.tgz",
- "integrity": "sha512-do/AF/4n9MRshia3a5aXoy8xM2c6mgfT6D7H/dY6my5z+hfCIR4ab7mk4IRj++nsEQpKy39kd0DQnDq+r692tw==",
- "cpu": [
- "arm64"
- ],
+ "node_modules/@protobufjs/pool": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
+ "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==",
"dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "openharmony"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
+ "license": "BSD-3-Clause"
},
- "node_modules/@rolldown/binding-win32-arm64-msvc": {
- "version": "1.2.13",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.13.tgz",
- "integrity": "sha512-6FtUf2cJZobutJdxnGYX8z0vtbgqU0b2v8vfBhkXb9wp2MppMFtkunE+IaOntyi01rkIQoPW2GHABtfzsC0BRQ==",
- "cpu": [
- "arm64"
- ],
+ "node_modules/@protobufjs/utf8": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.2.tgz",
+ "integrity": "sha512-b1UQwcEZ4yCnMCD8DAL1VlbvBJE9/IX4FTIp7BG1xYpf29SLazLSrqUkj4w7Y5y7cCVP6E5tcqqcI0xemPkHug==",
"dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
+ "license": "BSD-3-Clause"
},
- "node_modules/@rolldown/binding-win32-x64-msvc": {
- "version": "1.2.13",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.13.tgz",
- "integrity": "sha512-UKhFaZTeTcbKrb3iU82m17jVcPEAoqDkCN5MBqgPyZSwp/cQmib21crTS0DdH7T1B7wZRWEI89YQAOJMet5yhg==",
- "cpu": [
- "x64"
- ],
+ "node_modules/@quansync/fs": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@quansync/fs/-/fs-1.1.0.tgz",
+ "integrity": "sha512-qAPG/t3HqML1TlN7sY/pTbEjzFVAKsMjNNMGheyDosro+kT4iw2KCUoHcVdmliwWjorm4elZbgNQyU2eD97eDg==",
"dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
+ "dependencies": {
+ "quansync": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sxzz"
}
},
- "node_modules/@rolldown/pluginutils": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz",
- "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@rollup/rollup-android-arm-eabi": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.64.7.tgz",
- "integrity": "sha512-GFF2tHk0NqYVObrK0+/ps/LEXsV/v2q6Lyiy7mZr+Ej24fpQScvqK2ziz9NHeEQYnKWKym38Ml7dZbPtC9tuAw==",
+ "node_modules/@rolldown/binding-android-arm-eabi": {
+ "version": "1.2.13",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.13.tgz",
+ "integrity": "sha512-Vu/NICrgdRvUOeaJZIyB2FP63s6fO/4ud5l8dXmxDx9yDyn+mN0y+gsvsVviSli+T361Aqo0h46EuMoobrwawA==",
"cpu": [
"arm"
],
@@ -1464,12 +724,15 @@
"optional": true,
"os": [
"android"
- ]
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
},
- "node_modules/@rollup/rollup-android-arm64": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.64.7.tgz",
- "integrity": "sha512-BOymcXJFYYXqluDidj6sLelNjXruC3u1BqVxLn2OPCXH9xaPSOTH+MS4uychsGI1NU7tJoiv9KvqijDHFe+hhQ==",
+ "node_modules/@rolldown/binding-android-arm64": {
+ "version": "1.2.13",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.13.tgz",
+ "integrity": "sha512-6LEoIrGy5vvCd2boNnv2soPSUZj/PRvhp8R/t9KlX+mIZxThIE/ZqxrGXxmuNX0FuvQFvLdZr7S4HrYpYBVhEQ==",
"cpu": [
"arm64"
],
@@ -1478,12 +741,15 @@
"optional": true,
"os": [
"android"
- ]
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
},
- "node_modules/@rollup/rollup-darwin-arm64": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.64.7.tgz",
- "integrity": "sha512-jgVpGweIbls2H5jfBB70tnX52abMd5pJr3xmtoDILx6JdmGl+Un+tMb9R+MbHPVB46tTBpY8emtn7M71SnQhEQ==",
+ "node_modules/@rolldown/binding-darwin-arm64": {
+ "version": "1.2.13",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.13.tgz",
+ "integrity": "sha512-CaJSRzlQ6Q+zkDMVA9OkVxBjVoPRCDEE3v0FSJ9kIQBgRjFApA3Si4ijhbNVUji7ZJt+PfO0e46qy4nPInHUPA==",
"cpu": [
"arm64"
],
@@ -1492,12 +758,15 @@
"optional": true,
"os": [
"darwin"
- ]
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
},
- "node_modules/@rollup/rollup-darwin-x64": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.64.7.tgz",
- "integrity": "sha512-AVMpt94mrXH7WjyWKmd9nT4RC5yM0AN3Lt6A89xVIsuLDi3dDX6dxMytLbW36FlppY9JsoqUoS3LUUpUrYxiMQ==",
+ "node_modules/@rolldown/binding-darwin-x64": {
+ "version": "1.2.13",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.13.tgz",
+ "integrity": "sha512-e4r340I5hxSzJkD3YJBxgzq/rJ3wwxwdLLb2FPt1Zpyem20nrQPT11DDEEkazwxaHumH8wpglsp/Ozgj/wT6mw==",
"cpu": [
"x64"
],
@@ -1506,26 +775,15 @@
"optional": true,
"os": [
"darwin"
- ]
- },
- "node_modules/@rollup/rollup-freebsd-arm64": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.64.7.tgz",
- "integrity": "sha512-Nje29c/MyajxRNFGU05oyeTDS6SWdMg/wWMSlZSBTBju5BKz2NVc0kFiFSQGzRELNiB+CBk/ZvAVsWsENgjGag==",
- "cpu": [
- "arm64"
],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ]
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
},
- "node_modules/@rollup/rollup-freebsd-x64": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.64.7.tgz",
- "integrity": "sha512-xxgN5/kMzCNz/NYJ4t49B0/WS6InNlWv6xvgwUQqNnWM9WJMMwMUGWrAxdNEgYWdHL0sMnuh8I87StGrIMTA+w==",
+ "node_modules/@rolldown/binding-freebsd-x64": {
+ "version": "1.2.13",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.13.tgz",
+ "integrity": "sha512-hoBWDZ4/K/mJKVMbsgUd1jfpA2DiOrJ54mpegObU9TBHBBrtX4FLIXJJQRDPZ/2Dn91GvPob+Z2hwKJzf4E5SQ==",
"cpu": [
"x64"
],
@@ -1534,84 +792,36 @@
"optional": true,
"os": [
"freebsd"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.64.7.tgz",
- "integrity": "sha512-5U/9gVn/X657I8+NHoHO9Wnfyd0lEXwqbslobRoB9TC8SwYzOitcIr6TLE7531Q/NWs3L4mb+YOGzlf3vHIeYw==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "libc": [
- "glibc"
],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
},
- "node_modules/@rollup/rollup-linux-arm-musleabihf": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.64.7.tgz",
- "integrity": "sha512-hcDS0a/Y8ggM3dcOfzH7UpSaogCViWTtNDSl0EXpWIj8g8/r86ITqptjil2hayTXS0Umzb+Yt3mjgpQVFVf2+A==",
+ "node_modules/@rolldown/binding-linux-arm-gnueabihf": {
+ "version": "1.2.13",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.13.tgz",
+ "integrity": "sha512-oF9fZu3vTWnTiVAkDFxU9PJLt1nh20K9RRpuHsR7ZnE2L7XookBbDBVLojCVSLGbvtSlxeUNnjAj6DbNsKyzbg==",
"cpu": [
"arm"
],
"dev": true,
- "libc": [
- "musl"
- ],
"license": "MIT",
"optional": true,
"os": [
"linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm64-gnu": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.64.7.tgz",
- "integrity": "sha512-awbAr4N7Qd/yjZAQBEEPzgcPveYG2Gi5L6gq1/Bp+3SMRjn5F68Wv1zKsntzvvoioBR6yKvhLtWqu11am1TsxA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "libc": [
- "glibc"
],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
},
- "node_modules/@rollup/rollup-linux-arm64-musl": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.64.7.tgz",
- "integrity": "sha512-Ut7xQJfeLhzu2yN3rHzVvL9ccyPJvN4aCdP1V7hJ5lGxX/eCzgB9SiMk/Md3J+rWWZgvoYsDW4BUFggJr32pBA==",
+ "node_modules/@rolldown/binding-linux-arm64-gnu": {
+ "version": "1.2.13",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.13.tgz",
+ "integrity": "sha512-DTpb/+jMiqWMPgphn4ksW1zW+XLJ6dJJ9FMvnIk9I291LhCctMPhMYJrP5t9p6C9qa3KXadDdUEZHBaPh3kNxQ==",
"cpu": [
"arm64"
],
"dev": true,
- "libc": [
- "musl"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-loong64-gnu": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.64.7.tgz",
- "integrity": "sha512-trqoni/vHkuM5oo5iQhoKPh6fjjD7E80pMgCXWgGxU8vSRPUlwvG8GeYvEEcB6eJAxNa99WH9iVHPHelgtKiHA==",
- "cpu": [
- "loong64"
- ],
- "dev": true,
"libc": [
"glibc"
],
@@ -1619,14 +829,17 @@
"optional": true,
"os": [
"linux"
- ]
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
},
- "node_modules/@rollup/rollup-linux-loong64-musl": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.64.7.tgz",
- "integrity": "sha512-gvlUy0XFIwtUWiQmhc+4GT2Knm3KosinpUVhr7CtTFA78gFDnE5NWwMPzHrJsYpKkh2LlY7yvBIboN1FAV6Xeg==",
+ "node_modules/@rolldown/binding-linux-arm64-musl": {
+ "version": "1.2.13",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.13.tgz",
+ "integrity": "sha512-xU+Kvv9N2A3SY35zFh1FWWNjxbadE/BKeqnkXe7vScU4GZsw757BlVmDLITZEq8DPpk6m7uoDYkK7P+x/uU5Ow==",
"cpu": [
- "loong64"
+ "arm64"
],
"dev": true,
"libc": [
@@ -1636,50 +849,19 @@
"optional": true,
"os": [
"linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-ppc64-gnu": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.64.7.tgz",
- "integrity": "sha512-8yS/kSXTJ/47Z62JW+C2AJ3vd/8zZw016vFjtNpZwmZlwJumLua4s1i78dkYuSSqQ+0aIMxJcBp/4uIwp2ehjA==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
- "libc": [
- "glibc"
],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
},
- "node_modules/@rollup/rollup-linux-ppc64-musl": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.64.7.tgz",
- "integrity": "sha512-mxVSKvvty0hOP1AFo/l4Kpv3i3HK0zx4rYUrirZDToYlWhS3xzmIkq3vUJ7rtrM2cPyXveDyDT6M1FfXZ9hTRA==",
+ "node_modules/@rolldown/binding-linux-ppc64-gnu": {
+ "version": "1.2.13",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.13.tgz",
+ "integrity": "sha512-XMk/hnhh25oQ756Lclb1Q11h4ll0xC0Esa5w4Vzp+mAE2S3AGJgeM0SonrIgY8fHhjarb6hcoTuwoFG0VVP2ig==",
"cpu": [
"ppc64"
],
"dev": true,
- "libc": [
- "musl"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-riscv64-gnu": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.64.7.tgz",
- "integrity": "sha512-lEse1zra1CagM+uHH2bl28GInDsZZ45NJzHei2OMaXQFzZWKBO1hFo07rS0xB6ayV4WU360UrSmPDSyCMpYsUQ==",
- "cpu": [
- "riscv64"
- ],
- "dev": true,
"libc": [
"glibc"
],
@@ -1687,29 +869,15 @@
"optional": true,
"os": [
"linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-riscv64-musl": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.64.7.tgz",
- "integrity": "sha512-d/cqCoiG9WMZ5VuJZ5Qdlv9g97QyoGwnmvHccvGhKSacTy7xFrAS+jMcJSBdMNOw1oacSkl6p7K6O/DRYTKL3g==",
- "cpu": [
- "riscv64"
- ],
- "dev": true,
- "libc": [
- "musl"
],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
},
- "node_modules/@rollup/rollup-linux-s390x-gnu": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.64.7.tgz",
- "integrity": "sha512-kVEA//CeDOZZP1XCH2JBgqXb9+ALlwuA/4civaazMVdgzaSQC9WM38w65zG/LLk0lA7F9Od19CSBZW7J9mCbNg==",
+ "node_modules/@rolldown/binding-linux-s390x-gnu": {
+ "version": "1.2.13",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.13.tgz",
+ "integrity": "sha512-U1BoTHYmlywE2n3HUWjzZ+8EQsKr+OwpxYuDWaubx42tUL8QSL7nOqRz/NVHanibbFP3M1Rxuprz/wNcbMKjqw==",
"cpu": [
"s390x"
],
@@ -1721,12 +889,15 @@
"optional": true,
"os": [
"linux"
- ]
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
},
- "node_modules/@rollup/rollup-linux-x64-gnu": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.64.7.tgz",
- "integrity": "sha512-14oLfDsOSr0TSntT/34jRg/V8B2XW/Jomh9zX9CjIM9gwwNlI1OCymS/GVn0DV32h67eRf7U0GGem0rvfXgNwQ==",
+ "node_modules/@rolldown/binding-linux-x64-gnu": {
+ "version": "1.2.13",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.13.tgz",
+ "integrity": "sha512-J4cm80Pc6wEwV5AZ42o62sIQgDk+Y7R2s646jIwuvO+4V46QB58N4vVuMPWCBaNgursXLpmUWJV//WQAkPvHBQ==",
"cpu": [
"x64"
],
@@ -1738,12 +909,15 @@
"optional": true,
"os": [
"linux"
- ]
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
},
- "node_modules/@rollup/rollup-linux-x64-musl": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.64.7.tgz",
- "integrity": "sha512-dFVtPfjZqAnUPpPY4Bfg+87yo1IBW9HiY8iCFtg49Pn46MfZTebSHZh8PL6SOsgyt9LQP8Nj/sE6jm3aWpySmQ==",
+ "node_modules/@rolldown/binding-linux-x64-musl": {
+ "version": "1.2.13",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.13.tgz",
+ "integrity": "sha512-W0euZS40U4V6JkmEnVCIX9mcsL6cbXQ4X8c2w+MMOIjFg68TXUW+u3RT+2e1t1pv9mg/EP3pDtK3POXdQ7Rxyw==",
"cpu": [
"x64"
],
@@ -1755,26 +929,15 @@
"optional": true,
"os": [
"linux"
- ]
- },
- "node_modules/@rollup/rollup-openbsd-x64": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.64.7.tgz",
- "integrity": "sha512-Dm9CZ2SM3u2NgvBj4awW/gGqkOwzH8f6MSYIJE6+bKcKLI+T0+LhpD6vtetTfrIIx+rLXDf5RJqBP6v7V5O+wg==",
- "cpu": [
- "x64"
],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "openbsd"
- ]
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
},
- "node_modules/@rollup/rollup-openharmony-arm64": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.64.7.tgz",
- "integrity": "sha512-oaxsvS2mL6+78741CT2HCORBvy1USg3Wqpt5qvZwy3aMXRMl4zxyDo8maeFRWJkF3dp0Wbi71fKH5Gr9YI3vYA==",
+ "node_modules/@rolldown/binding-openharmony-arm64": {
+ "version": "1.2.13",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.13.tgz",
+ "integrity": "sha512-do/AF/4n9MRshia3a5aXoy8xM2c6mgfT6D7H/dY6my5z+hfCIR4ab7mk4IRj++nsEQpKy39kd0DQnDq+r692tw==",
"cpu": [
"arm64"
],
@@ -1783,12 +946,15 @@
"optional": true,
"os": [
"openharmony"
- ]
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
},
- "node_modules/@rollup/rollup-win32-arm64-msvc": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.64.7.tgz",
- "integrity": "sha512-UKZz1Y4mxUqkWh60uH7B1aZn6UcAimPk4ipRktpb3wfZq7JrzZYyAXTwiafkb3T+kd5P3Sf+vzcRdsDks4WtjQ==",
+ "node_modules/@rolldown/binding-win32-arm64-msvc": {
+ "version": "1.2.13",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.13.tgz",
+ "integrity": "sha512-6FtUf2cJZobutJdxnGYX8z0vtbgqU0b2v8vfBhkXb9wp2MppMFtkunE+IaOntyi01rkIQoPW2GHABtfzsC0BRQ==",
"cpu": [
"arm64"
],
@@ -1797,26 +963,15 @@
"optional": true,
"os": [
"win32"
- ]
- },
- "node_modules/@rollup/rollup-win32-ia32-msvc": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.64.7.tgz",
- "integrity": "sha512-WWkSuC1J+mZJnsDh0mRaCAFSWfQdl6y3fDjZeWElI6zHo8CcOSG5lY3yurKJjEq+FrX0WD60sFrVVpbHqzMmrw==",
- "cpu": [
- "ia32"
],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ]
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
},
- "node_modules/@rollup/rollup-win32-x64-gnu": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.64.7.tgz",
- "integrity": "sha512-u9bp2yXCI3/BUjUxY6uWknAY32pfvvDCPysyUTySotx0dj3ydlFHrRQYfn/b/kZgnfjyEwySMtI7Ga054uiysQ==",
+ "node_modules/@rolldown/binding-win32-x64-msvc": {
+ "version": "1.2.13",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.13.tgz",
+ "integrity": "sha512-UKhFaZTeTcbKrb3iU82m17jVcPEAoqDkCN5MBqgPyZSwp/cQmib21crTS0DdH7T1B7wZRWEI89YQAOJMet5yhg==",
"cpu": [
"x64"
],
@@ -1825,21 +980,17 @@
"optional": true,
"os": [
"win32"
- ]
- },
- "node_modules/@rollup/rollup-win32-x64-msvc": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.64.7.tgz",
- "integrity": "sha512-EhX6N3XPMEnVU5cRfNgzPOKcSucsbu3nNNWuoAaEuKIqmddBKHN5b9d4rPe65T1I+FaOT176JKiZNsUBp3rqbA==",
- "cpu": [
- "x64"
],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/pluginutils": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz",
+ "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==",
"dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ]
+ "license": "MIT"
},
"node_modules/@scaleway/serverless-functions": {
"version": "1.1.2",
@@ -2434,6 +1585,199 @@
"url": "https://opencollective.com/vitest"
}
},
+ "node_modules/@yuku-core/binding-android-arm64": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/@yuku-core/binding-android-arm64/-/binding-android-arm64-0.19.0.tgz",
+ "integrity": "sha512-wdL2XmTiZixAOaHk9Z0JJZ8u9Qm8d333Zjpc6gaxXFX+UR5BlsfxZ7a2+2Rm71pamppsPYGUGFq2oVLbh6DISw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@yuku-core/binding-darwin-arm64": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/@yuku-core/binding-darwin-arm64/-/binding-darwin-arm64-0.19.0.tgz",
+ "integrity": "sha512-7sNJa6XJhyetnTy64jw3NEi4YgUcezHk1G5GH9FSvXAuC8wIlbaOwT9lgq5qo5sspjrZJQlBR1TWflP49uRpMw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@yuku-core/binding-darwin-x64": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/@yuku-core/binding-darwin-x64/-/binding-darwin-x64-0.19.0.tgz",
+ "integrity": "sha512-pTC7dYEc59isdyizc3nsuyFNBu2LU5wMYZ1be6UMr59PY/AJNtO1aBLWV0MgL/z7C1nv/2sX4TNjGgKLoeevJw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@yuku-core/binding-freebsd-x64": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/@yuku-core/binding-freebsd-x64/-/binding-freebsd-x64-0.19.0.tgz",
+ "integrity": "sha512-xrZjF6XOEwyLOiDIfrwDdRCS6ghxcJeirNC1KivQhVcUwlRonaU79S3/Uiyx3lBylPnT8qKJ3/aMT+H52nGTJQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@yuku-core/binding-linux-arm-gnu": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/@yuku-core/binding-linux-arm-gnu/-/binding-linux-arm-gnu-0.19.0.tgz",
+ "integrity": "sha512-0OyIH53C0I1CbADHn9FSdCfX5qbpeLwJhmOVhonFJNYheybOnkSJ50qGMfTJIb8y5zrwqvLs7FVBvz6Fk8maZg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@yuku-core/binding-linux-arm-musl": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/@yuku-core/binding-linux-arm-musl/-/binding-linux-arm-musl-0.19.0.tgz",
+ "integrity": "sha512-z/iPfkCOCSXE34VXNt0uP1ORSW+4mEa9b5CiJcWZeqZH08g49bFU/jRM2T04f+Wpw5mJ6HIzNBiojxeAbrHjeg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@yuku-core/binding-linux-arm64-gnu": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/@yuku-core/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.19.0.tgz",
+ "integrity": "sha512-jLNTi+gzaRwBJ+gwhCJ+rDb5dmx/8hEBx93UWd7hjMSqPTL1D1wvVSvXVAldV5kALvju7b0/m51EHEhs4+I1fA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@yuku-core/binding-linux-arm64-musl": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/@yuku-core/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.19.0.tgz",
+ "integrity": "sha512-YwyPIdW/rN2Fmv0MTFWi47FaB3F9g+2b+sJISyAw83Yd60RWH4T3Nx6XkAHHVN+uKJNBAd6So7/BVihSiFYvuQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@yuku-core/binding-linux-x64-gnu": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/@yuku-core/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.19.0.tgz",
+ "integrity": "sha512-/vskaAXVX3ESR43FiTdfiYS7z1b9uoQJwVQ/0RgUHgN2sWoAyCZs+aX4CgU7eKGIHTVfp9VFwv+c+2XchYiEtQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@yuku-core/binding-linux-x64-musl": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/@yuku-core/binding-linux-x64-musl/-/binding-linux-x64-musl-0.19.0.tgz",
+ "integrity": "sha512-FuXL5igeSKib9Rye02TdH+D6SQezTyGxIATMu1Qsn/QywrzwpGl35OLpS2C1x5vpGLeVE2XgiLd5mVPFHmIglQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@yuku-core/binding-win32-arm64": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/@yuku-core/binding-win32-arm64/-/binding-win32-arm64-0.19.0.tgz",
+ "integrity": "sha512-YuJAe7zEKT1Xa7LuHlhGJpPnYQeVtvo0rZvNjJRqkH0hQGOw4C8QeP30Tg5VKGzZfo2x8CjhjEhKt4TmLwfmdg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@yuku-core/binding-win32-x64": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/@yuku-core/binding-win32-x64/-/binding-win32-x64-0.19.0.tgz",
+ "integrity": "sha512-o8iY/mXwlRkedp0LNTr4+TEfXTPQwoNZmv6k+1WIAd1ZXEn8xJJTBCtB0osaVvdZo/x/cNmV16UrWrrGpM5Mvw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@yuku-toolchain/types": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/@yuku-toolchain/types/-/types-0.19.0.tgz",
+ "integrity": "sha512-tFkNbsP4WXX9UMUC5syJGdK9dPMLK0PPaIuXCcCYH75sZ8MrebfBZ2XvCILRTw8AgLivSSCfDa4R67iYBDa4Kg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/abbrev": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
@@ -2615,13 +1959,6 @@
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "node_modules/any-promise": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
- "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/aproba": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/aproba/-/aproba-2.1.0.tgz",
@@ -2935,22 +2272,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/bundle-require": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.1.0.tgz",
- "integrity": "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "load-tsconfig": "^0.2.3"
- },
- "engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
- },
- "peerDependencies": {
- "esbuild": ">=0.18"
- }
- },
"node_modules/cac": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/cac/-/cac-7.1.0.tgz",
@@ -3114,22 +2435,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/chokidar": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz",
- "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "readdirp": "^5.0.0"
- },
- "engines": {
- "node": ">= 20.19.0"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
- }
- },
"node_modules/chownr": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
@@ -3380,23 +2685,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/confbox": {
- "version": "0.1.8",
- "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz",
- "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/consola": {
- "version": "3.4.2",
- "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz",
- "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "^14.18.0 || >=16.10.0"
- }
- },
"node_modules/console-control-strings": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
@@ -3764,6 +3052,13 @@
"node": ">=8"
}
},
+ "node_modules/defu": {
+ "version": "6.1.7",
+ "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz",
+ "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
@@ -3841,6 +3136,27 @@
"uuid": "dist/bin/uuid"
}
},
+ "node_modules/dts-resolver": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/dts-resolver/-/dts-resolver-3.0.0.tgz",
+ "integrity": "sha512-1T1f+z+4tl9XD+m+0HBgWoL/nm0bOIffyWaUuUSBlFg/86IWvfx+wjNaO/ybU0AJzG9/Mi5hBUgGV6zCmWEN7Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^22.18.0 || >=24.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sxzz"
+ },
+ "peerDependencies": {
+ "oxc-resolver": ">=11.0.0"
+ },
+ "peerDependenciesMeta": {
+ "oxc-resolver": {
+ "optional": true
+ }
+ }
+ },
"node_modules/dunder-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
@@ -3874,6 +3190,16 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/empathic": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/empathic/-/empathic-2.1.0.tgz",
+ "integrity": "sha512-AnfC1ATldl49/cvZdLPDjBfrRNwbDO05aibiOtzQu3qtlbJtomNLhF30HEtn/7iBz50dlMECqATo3fG0LrdEgw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ }
+ },
"node_modules/end-of-stream": {
"version": "1.4.5",
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz",
@@ -4014,48 +3340,6 @@
"es6-symbol": "^3.1.1"
}
},
- "node_modules/esbuild": {
- "version": "0.28.2",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.2.tgz",
- "integrity": "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==",
- "dev": true,
- "hasInstallScript": true,
- "license": "MIT",
- "bin": {
- "esbuild": "bin/esbuild"
- },
- "engines": {
- "node": ">=18"
- },
- "optionalDependencies": {
- "@esbuild/aix-ppc64": "0.28.2",
- "@esbuild/android-arm": "0.28.2",
- "@esbuild/android-arm64": "0.28.2",
- "@esbuild/android-x64": "0.28.2",
- "@esbuild/darwin-arm64": "0.28.2",
- "@esbuild/darwin-x64": "0.28.2",
- "@esbuild/freebsd-arm64": "0.28.2",
- "@esbuild/freebsd-x64": "0.28.2",
- "@esbuild/linux-arm": "0.28.2",
- "@esbuild/linux-arm64": "0.28.2",
- "@esbuild/linux-ia32": "0.28.2",
- "@esbuild/linux-loong64": "0.28.2",
- "@esbuild/linux-mips64el": "0.28.2",
- "@esbuild/linux-ppc64": "0.28.2",
- "@esbuild/linux-riscv64": "0.28.2",
- "@esbuild/linux-s390x": "0.28.2",
- "@esbuild/linux-x64": "0.28.2",
- "@esbuild/netbsd-arm64": "0.28.2",
- "@esbuild/netbsd-x64": "0.28.2",
- "@esbuild/openbsd-arm64": "0.28.2",
- "@esbuild/openbsd-x64": "0.28.2",
- "@esbuild/openharmony-arm64": "0.28.2",
- "@esbuild/sunos-x64": "0.28.2",
- "@esbuild/win32-arm64": "0.28.2",
- "@esbuild/win32-ia32": "0.28.2",
- "@esbuild/win32-x64": "0.28.2"
- }
- },
"node_modules/escalade": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
@@ -4687,18 +3971,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/fix-dts-default-cjs-exports": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/fix-dts-default-cjs-exports/-/fix-dts-default-cjs-exports-1.0.1.tgz",
- "integrity": "sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "magic-string": "^0.30.17",
- "mlly": "^1.7.4",
- "rollup": "^4.34.8"
- }
- },
"node_modules/flat-cache": {
"version": "6.1.23",
"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.23.tgz",
@@ -4951,6 +4223,22 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/get-tsconfig": {
+ "version": "5.0.0-beta.6",
+ "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-5.0.0-beta.6.tgz",
+ "integrity": "sha512-X6fBC0pmImC70gvX2zm56go9hx0MyoGVdG0tUCkg/D+Xnh5TJsOZ7iDbOdI3PvmtrDxnu1YdDufpK2QJX1Meqw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "resolve-pkg-maps": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=20.20.0"
+ },
+ "funding": {
+ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1"
+ }
+ },
"node_modules/glob": {
"version": "7.2.3",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
@@ -5148,6 +4436,13 @@
"node": ">= 0.4"
}
},
+ "node_modules/hookable": {
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/hookable/-/hookable-6.1.2.tgz",
+ "integrity": "sha512-+abwxtiEA52GCVIsQqut3S/uKTbUwYIp4Pe/vv+6py5XiXBCqMZHg6pA6Y5qhgLSEys0/cYuPbO0z1QFj5ZCmg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/hookified": {
"version": "1.15.1",
"resolved": "https://registry.npmjs.org/hookified/-/hookified-1.15.1.tgz",
@@ -5245,6 +4540,19 @@
"node": ">= 4"
}
},
+ "node_modules/import-without-cache": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/import-without-cache/-/import-without-cache-0.4.1.tgz",
+ "integrity": "sha512-vXoV9PjKHEednCUu01e98TkImxy67e3BJXbTIOmIq4Hyzw3IAwYRcuPkfeTzJzwyyts4kjuA73x+pWJLc4f86A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^22.18.0 || >=24.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sxzz"
+ }
+ },
"node_modules/imurmurhash": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
@@ -5504,22 +4812,12 @@
"integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==",
"dev": true,
"license": "BSD-3-Clause",
- "dependencies": {
- "html-escaper": "^2.0.0",
- "istanbul-lib-report": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/joycon": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz",
- "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==",
- "dev": true,
- "license": "MIT",
+ "dependencies": {
+ "html-escaper": "^2.0.0",
+ "istanbul-lib-report": "^3.0.0"
+ },
"engines": {
- "node": ">=10"
+ "node": ">=8"
}
},
"node_modules/js-tokens": {
@@ -5899,36 +5197,6 @@
"url": "https://opencollective.com/parcel"
}
},
- "node_modules/lilconfig": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
- "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/sponsors/antonk52"
- }
- },
- "node_modules/lines-and-columns": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
- "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/load-tsconfig": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz",
- "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
- }
- },
"node_modules/locate-path": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
@@ -6255,19 +5523,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/mlly": {
- "version": "1.8.2",
- "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz",
- "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "acorn": "^8.16.0",
- "pathe": "^2.0.3",
- "pkg-types": "^1.3.1",
- "ufo": "^1.6.3"
- }
- },
"node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
@@ -6282,18 +5537,6 @@
"dev": true,
"license": "ISC"
},
- "node_modules/mz": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
- "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "any-promise": "^1.0.0",
- "object-assign": "^4.0.1",
- "thenify-all": "^1.0.0"
- }
- },
"node_modules/nan": {
"version": "2.29.0",
"resolved": "https://registry.npmjs.org/nan/-/nan-2.29.0.tgz",
@@ -6792,28 +6035,6 @@
],
"license": "MIT"
},
- "node_modules/pirates": {
- "version": "4.0.7",
- "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz",
- "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/pkg-types": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz",
- "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "confbox": "^0.1.8",
- "mlly": "^1.7.4",
- "pathe": "^2.0.1"
- }
- },
"node_modules/possible-typed-array-names": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz",
@@ -6853,49 +6074,6 @@
"node": "^10 || ^12 || >=14"
}
},
- "node_modules/postcss-load-config": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz",
- "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "lilconfig": "^3.1.1"
- },
- "engines": {
- "node": ">= 18"
- },
- "peerDependencies": {
- "jiti": ">=1.21.0",
- "postcss": ">=8.0.9",
- "tsx": "^4.8.1",
- "yaml": "^2.4.2"
- },
- "peerDependenciesMeta": {
- "jiti": {
- "optional": true
- },
- "postcss": {
- "optional": true
- },
- "tsx": {
- "optional": true
- },
- "yaml": {
- "optional": true
- }
- }
- },
"node_modules/prelude-ls": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
@@ -7055,6 +6233,23 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/quansync": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/quansync/-/quansync-1.0.0.tgz",
+ "integrity": "sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/antfu"
+ },
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/sxzz"
+ }
+ ],
+ "license": "MIT"
+ },
"node_modules/quick-format-unescaped": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz",
@@ -7149,20 +6344,6 @@
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
}
},
- "node_modules/readdirp": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz",
- "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 20.19.0"
- },
- "funding": {
- "type": "individual",
- "url": "https://paulmillr.com/funding/"
- }
- },
"node_modules/real-require": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz",
@@ -7200,14 +6381,14 @@
"dev": true,
"license": "MIT"
},
- "node_modules/resolve-from": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
- "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "node_modules/resolve-pkg-maps": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz",
+ "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==",
"dev": true,
"license": "MIT",
- "engines": {
- "node": ">=8"
+ "funding": {
+ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1"
}
},
"node_modules/responselike": {
@@ -7316,50 +6497,64 @@
"@rolldown/binding-win32-x64-msvc": "1.2.13"
}
},
- "node_modules/rollup": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.64.7.tgz",
- "integrity": "sha512-aCiJONoZp0lNGJ6sYqspLkh6UXaWEey/7Ko2TZyXQ4kgzAhDUxAgbt/oulXKmD+zFHXw1k+RF6ZZWOrjp7DZnQ==",
+ "node_modules/rolldown-plugin-dts": {
+ "version": "0.28.8",
+ "resolved": "https://registry.npmjs.org/rolldown-plugin-dts/-/rolldown-plugin-dts-0.28.8.tgz",
+ "integrity": "sha512-FVhfqxorCWcc20BVT5eVRfRjzLLl6mgzjcMR4gSBf0K4oQMXT0qoHhhzfXy0L7y83fQy7Ug5ZDNk90xM3/LiCQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@types/estree": "1.0.9"
- },
- "bin": {
- "rollup": "dist/bin/rollup"
+ "dts-resolver": "^3.0.0",
+ "get-tsconfig": "5.0.0-beta.6",
+ "obug": "^3.0.0",
+ "yuku-ast": "^0.19.0",
+ "yuku-codegen": "^0.19.0",
+ "yuku-parser": "^0.19.0"
},
"engines": {
- "node": ">=18.0.0",
- "npm": ">=8.0.0"
+ "node": "^22.18.0 || ^24.11.0 || >=26.0.0"
},
- "optionalDependencies": {
- "@napi-rs/lzma-linux-x64-gnu": "1.5.1",
- "@rollup/rollup-android-arm-eabi": "4.64.7",
- "@rollup/rollup-android-arm64": "4.64.7",
- "@rollup/rollup-darwin-arm64": "4.64.7",
- "@rollup/rollup-darwin-x64": "4.64.7",
- "@rollup/rollup-freebsd-arm64": "4.64.7",
- "@rollup/rollup-freebsd-x64": "4.64.7",
- "@rollup/rollup-linux-arm-gnueabihf": "4.64.7",
- "@rollup/rollup-linux-arm-musleabihf": "4.64.7",
- "@rollup/rollup-linux-arm64-gnu": "4.64.7",
- "@rollup/rollup-linux-arm64-musl": "4.64.7",
- "@rollup/rollup-linux-loong64-gnu": "4.64.7",
- "@rollup/rollup-linux-loong64-musl": "4.64.7",
- "@rollup/rollup-linux-ppc64-gnu": "4.64.7",
- "@rollup/rollup-linux-ppc64-musl": "4.64.7",
- "@rollup/rollup-linux-riscv64-gnu": "4.64.7",
- "@rollup/rollup-linux-riscv64-musl": "4.64.7",
- "@rollup/rollup-linux-s390x-gnu": "4.64.7",
- "@rollup/rollup-linux-x64-gnu": "4.64.7",
- "@rollup/rollup-linux-x64-musl": "4.64.7",
- "@rollup/rollup-openbsd-x64": "4.64.7",
- "@rollup/rollup-openharmony-arm64": "4.64.7",
- "@rollup/rollup-win32-arm64-msvc": "4.64.7",
- "@rollup/rollup-win32-ia32-msvc": "4.64.7",
- "@rollup/rollup-win32-x64-gnu": "4.64.7",
- "@rollup/rollup-win32-x64-msvc": "4.64.7",
- "fsevents": "~2.3.2"
+ "funding": {
+ "url": "https://github.com/sponsors/sxzz"
+ },
+ "peerDependencies": {
+ "@typescript/native-preview": "*",
+ "@volar/typescript": "~2.4.0",
+ "@vue/language-core": "~3.2.0 || ~3.3.0",
+ "rolldown": "^1.2.0",
+ "typescript": "^5.0.0 || ^6.0.0 || ~7.0.0",
+ "vue-tsc": "~3.2.0 || ~3.3.0"
+ },
+ "peerDependenciesMeta": {
+ "@typescript/native-preview": {
+ "optional": true
+ },
+ "@volar/typescript": {
+ "optional": true
+ },
+ "@vue/language-core": {
+ "optional": true
+ },
+ "typescript": {
+ "optional": true
+ },
+ "vue-tsc": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/rolldown-plugin-dts/node_modules/obug": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/obug/-/obug-3.0.0.tgz",
+ "integrity": "sha512-5vvB5+W7ePv+p3uqxi+RcW1XAzLW0/hxt3/4X4Lc4qHudzOhmBiBwOY6DRob4WnanAEGvNcLjF+KNOufrUoEQw==",
+ "dev": true,
+ "funding": [
+ "https://github.com/sponsors/sxzz",
+ "https://opencollective.com/debug"
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.20.0"
}
},
"node_modules/run-async": {
@@ -7745,39 +6940,6 @@
"url": "https://github.com/sponsors/Borewit"
}
},
- "node_modules/sucrase": {
- "version": "3.35.1",
- "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz",
- "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/gen-mapping": "^0.3.2",
- "commander": "^4.0.0",
- "lines-and-columns": "^1.1.6",
- "mz": "^2.7.0",
- "pirates": "^4.0.1",
- "tinyglobby": "^0.2.11",
- "ts-interface-checker": "^0.1.9"
- },
- "bin": {
- "sucrase": "bin/sucrase",
- "sucrase-node": "bin/sucrase-node"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
- }
- },
- "node_modules/sucrase/node_modules/commander": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
- "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 6"
- }
- },
"node_modules/supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
@@ -7917,29 +7079,6 @@
"safe-buffer": "~5.1.0"
}
},
- "node_modules/thenify": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
- "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "any-promise": "^1.0.0"
- }
- },
- "node_modules/thenify-all": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
- "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "thenify": ">= 3.1.0 < 4"
- },
- "engines": {
- "node": ">=0.8"
- }
- },
"node_modules/thread-stream": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.2.0.tgz",
@@ -8111,74 +7250,79 @@
"typescript": ">=4.8.4"
}
},
- "node_modules/ts-interface-checker": {
- "version": "0.1.13",
- "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
- "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
- "dev": true,
- "license": "Apache-2.0"
- },
- "node_modules/tslib": {
- "version": "2.8.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
- "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
- "dev": true,
- "license": "0BSD"
- },
- "node_modules/tsup": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/tsup/-/tsup-9.0.0.tgz",
- "integrity": "sha512-DHgb0bfo2gFKybOa8dRFMiHSqzWWhMkfNK0f902VVquWQtDBWExNgidHszjjDKaFd12pWPgzumpWf9nGr3gzFg==",
+ "node_modules/tsdown": {
+ "version": "0.23.1",
+ "resolved": "https://registry.npmjs.org/tsdown/-/tsdown-0.23.1.tgz",
+ "integrity": "sha512-MSC2WSOts3in95J334/VIS7KPfor3eCSvndJ6KdoVj9Aak9Kh1aNfz9ws5owhdukuTNSXRdfkPEzA/ihpDD6SA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "bundle-require": "^5.1.0",
- "cac": "^7.1.0",
- "chokidar": "^5.0.0",
- "consola": "^3.4.2",
- "esbuild": "^0.28.2",
- "fix-dts-default-cjs-exports": "^1.0.1",
- "joycon": "^3.1.1",
+ "cac": "^7.0.1",
+ "defu": "^6.1.7",
+ "empathic": "^2.1.0",
+ "hookable": "^6.1.2",
+ "import-without-cache": "^0.4.1",
"obug": "^3.0.0",
- "picocolors": "^1.1.1",
- "postcss-load-config": "^6.0.1",
- "resolve-from": "^5.0.0",
- "rollup": "^4.64.6",
- "source-map-js": "^1.2.2",
- "sucrase": "^3.35.1",
+ "picomatch": "^4.0.7",
+ "rolldown": "~1.2.13",
+ "rolldown-plugin-dts": "^0.28.7",
"tinyexec": "^1.3.1",
"tinyglobby": "^0.2.17",
- "tree-kill": "^1.2.2"
+ "tree-kill": "^1.2.2",
+ "unconfig-core": "^7.5.0",
+ "verkit": "^0.5.0"
},
"bin": {
- "tsup": "dist/cli-default.js",
- "tsup-node": "dist/cli-node.js"
+ "tsdown": "dist/run.mjs"
},
"engines": {
"node": "^22.18.0 || ^24.11.0 || >=26.0.0"
},
+ "funding": {
+ "url": "https://github.com/sponsors/sxzz"
+ },
"peerDependencies": {
- "@microsoft/api-extractor": "^7.36.0",
- "@swc/core": "^1",
- "postcss": "^8.4.12",
- "typescript": ">=4.5.0"
+ "@arethetypeswrong/core": "^0.18.1",
+ "@tsdown/css": "0.23.1",
+ "@tsdown/exe": "0.23.1",
+ "@vitejs/devtools": "*",
+ "publint": "^0.3.8",
+ "tsx": "*",
+ "typescript": "^5.0.0 || ^6.0.0 || ^7.0.0",
+ "unplugin-unused": ">=0.5.0",
+ "unrun": "*"
},
"peerDependenciesMeta": {
- "@microsoft/api-extractor": {
+ "@arethetypeswrong/core": {
+ "optional": true
+ },
+ "@tsdown/css": {
"optional": true
},
- "@swc/core": {
+ "@tsdown/exe": {
"optional": true
},
- "postcss": {
+ "@vitejs/devtools": {
+ "optional": true
+ },
+ "publint": {
+ "optional": true
+ },
+ "tsx": {
"optional": true
},
"typescript": {
"optional": true
+ },
+ "unplugin-unused": {
+ "optional": true
+ },
+ "unrun": {
+ "optional": true
}
}
},
- "node_modules/tsup/node_modules/obug": {
+ "node_modules/tsdown/node_modules/obug": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/obug/-/obug-3.0.0.tgz",
"integrity": "sha512-5vvB5+W7ePv+p3uqxi+RcW1XAzLW0/hxt3/4X4Lc4qHudzOhmBiBwOY6DRob4WnanAEGvNcLjF+KNOufrUoEQw==",
@@ -8192,6 +7336,13 @@
"node": ">=12.20.0"
}
},
+ "node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "dev": true,
+ "license": "0BSD"
+ },
"node_modules/tweetnacl": {
"version": "0.14.5",
"resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
@@ -8285,13 +7436,6 @@
"typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/ufo": {
- "version": "1.6.4",
- "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.4.tgz",
- "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/unbzip2-stream": {
"version": "1.4.3",
"resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz",
@@ -8303,6 +7447,20 @@
"through": "^2.3.8"
}
},
+ "node_modules/unconfig-core": {
+ "version": "7.5.0",
+ "resolved": "https://registry.npmjs.org/unconfig-core/-/unconfig-core-7.5.0.tgz",
+ "integrity": "sha512-Su3FauozOGP44ZmKdHy2oE6LPjk51M/TRRjHv2HNCWiDvfvCoxC2lno6jevMA91MYAdCdwP05QnWdWpSbncX/w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@quansync/fs": "^1.0.0",
+ "quansync": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
"node_modules/undici-types": {
"version": "7.24.6",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz",
@@ -8348,6 +7506,19 @@
"uuid": "dist/bin/uuid"
}
},
+ "node_modules/verkit": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/verkit/-/verkit-0.5.0.tgz",
+ "integrity": "sha512-u4J1hr6Y+C/hit34GwL3eIcUf3wngT8TlYUjK7tk0jxydKLAq3sYvifjdTDA6U3KCKRcQCQDGf/srjxfZF3l7g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.12.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sxzz"
+ }
+ },
"node_modules/vite": {
"version": "8.3.4",
"resolved": "https://registry.npmjs.org/vite/-/vite-8.3.4.tgz",
@@ -8734,6 +7905,73 @@
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
+ },
+ "node_modules/yuku-ast": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/yuku-ast/-/yuku-ast-0.19.0.tgz",
+ "integrity": "sha512-PyCsiScaelhxBGzL8dyeJkLqvRZycoh78R31Vrt/WqYrm0hMFoKwIw/X7Dx5mBKLWAMlV9I9HEyBOHnj2gZVyw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@yuku-toolchain/types": "^0.19.0"
+ },
+ "engines": {
+ "node": ">=14.18.0"
+ }
+ },
+ "node_modules/yuku-codegen": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/yuku-codegen/-/yuku-codegen-0.19.0.tgz",
+ "integrity": "sha512-uymAKHjDuaP4BEpkXC/BSLz4DUEF5oArZ5AuD3888nb2miChjWSgpPdojEJxm3pjpXkgUaCRJQyNAbnMN33wHg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@yuku-toolchain/types": "^0.19.0"
+ },
+ "engines": {
+ "node": ">=14.18.0"
+ }
+ },
+ "node_modules/yuku-core": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/yuku-core/-/yuku-core-0.19.0.tgz",
+ "integrity": "sha512-kYK9e1XdfirNhkipzW0wmMcSWcVF/CWnuugodfVYRCUwvoBefweL9HzB96OiKEhsx78V5WbUxbJqlizMX869Qg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@yuku-toolchain/types": "^0.19.0"
+ },
+ "engines": {
+ "node": ">=14.18.0"
+ },
+ "optionalDependencies": {
+ "@yuku-core/binding-android-arm64": "0.19.0",
+ "@yuku-core/binding-darwin-arm64": "0.19.0",
+ "@yuku-core/binding-darwin-x64": "0.19.0",
+ "@yuku-core/binding-freebsd-x64": "0.19.0",
+ "@yuku-core/binding-linux-arm-gnu": "0.19.0",
+ "@yuku-core/binding-linux-arm-musl": "0.19.0",
+ "@yuku-core/binding-linux-arm64-gnu": "0.19.0",
+ "@yuku-core/binding-linux-arm64-musl": "0.19.0",
+ "@yuku-core/binding-linux-x64-gnu": "0.19.0",
+ "@yuku-core/binding-linux-x64-musl": "0.19.0",
+ "@yuku-core/binding-win32-arm64": "0.19.0",
+ "@yuku-core/binding-win32-x64": "0.19.0"
+ }
+ },
+ "node_modules/yuku-parser": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/yuku-parser/-/yuku-parser-0.19.0.tgz",
+ "integrity": "sha512-XrBh9ZiQK5mJVRxZBAvD6LwRyAYrK3MFtH3+onyuxFL5hFD44EC3QOmIC1FjTj6H2MMwq46/NAI+NZxLZPZgxg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@yuku-toolchain/types": "^0.19.0",
+ "yuku-core": "0.19.0"
+ },
+ "engines": {
+ "node": ">=14.18.0"
+ }
}
}
}
diff --git a/comment_service/package.json b/comment_service/package.json
index 9fbcac546..45de29bb6 100644
--- a/comment_service/package.json
+++ b/comment_service/package.json
@@ -5,7 +5,7 @@
"type": "module",
"main": "dist/comments.js",
"scripts": {
- "build": "tsup",
+ "build": "tsdown",
"test": "vitest run",
"test:watch": "vitest",
"test:coverage": "vitest run --coverage",
@@ -39,7 +39,7 @@
"eslint": "^10.0.0",
"prettier": "^3.0.0",
"serverless-scaleway-functions": ">=0.4.16",
- "tsup": "^9.0.0",
+ "tsdown": "^0.23.1",
"typescript": "^5.9.3",
"typescript-eslint": "^8.60.0",
"vitest": "^4.1.11"
diff --git a/comment_service/tsdown.config.ts b/comment_service/tsdown.config.ts
new file mode 100644
index 000000000..9c12d767b
--- /dev/null
+++ b/comment_service/tsdown.config.ts
@@ -0,0 +1,24 @@
+import { defineConfig } from "tsdown";
+
+export default defineConfig({
+ entry: ["comments.ts"],
+ format: "esm",
+ platform: "node",
+ target: "node22",
+ outDir: "dist",
+ // Emit .js, not .mjs — serverless.yml and package.json reference dist/comments.js.
+ fixedExtension: false,
+ // tsconfig has declaration: true, which auto-enables dts; nothing consumes
+ // the types of a deployed handler, so keep the dist shape tsup produced.
+ dts: false,
+ sourcemap: true,
+ minify: false,
+ // Bundle all npm dependencies (Node built-ins are always external).
+ deps: { alwaysBundle: [/.*/] },
+ // createRequire banner for packages that use dynamic require() (like pino).
+ // The import is aliased: rolldown's own runtime chunks import `createRequire`
+ // unaliased, and a bare re-import in the same file is a SyntaxError.
+ banner: {
+ js: `import { createRequire as __fretchenCr } from 'module'; const require = __fretchenCr(import.meta.url);`,
+ },
+});
diff --git a/comment_service/tsup.config.js b/comment_service/tsup.config.js
deleted file mode 100644
index 71e8ffa6c..000000000
--- a/comment_service/tsup.config.js
+++ /dev/null
@@ -1,19 +0,0 @@
-import { defineConfig } from "tsup";
-import { builtinModules } from "module";
-
-export default defineConfig({
- entry: ["comments.ts"],
- format: ["esm"],
- platform: "node",
- target: "node22",
- outDir: "dist",
- splitting: false,
- clean: true,
- minify: false,
- sourcemap: true,
- external: [...builtinModules, ...builtinModules.map((m) => `node:${m}`)],
- noExternal: [/.*/],
- banner: {
- js: `import { createRequire } from 'module'; const require = createRequire(import.meta.url);`,
- },
-});
diff --git a/scw_js/dev_server_genimg.ts b/scw_js/dev_server_genimg.ts
index 8869cd0ed..9e638eae0 100644
--- a/scw_js/dev_server_genimg.ts
+++ b/scw_js/dev_server_genimg.ts
@@ -1,5 +1,5 @@
// Local dev server for the genimg x402 seller. Runs only via `npm run dev:x402`
-// (NODE_ENV=test npx tsx dev_server_genimg.ts) and is not in tsup's entry list, so it is
+// (NODE_ENV=test npx tsx dev_server_genimg.ts) and is not in tsdown's entry list, so it is
// never bundled or deployed. It serves handle() over fastify on port 8082, with the
// payment headers exposed for browser clients. Deployed handlers must stay free of
// fastify — enforced by test/handler_purity.test.ts.
diff --git a/scw_js/dev_server_llm.ts b/scw_js/dev_server_llm.ts
index 03a6641de..fc0d61ccc 100644
--- a/scw_js/dev_server_llm.ts
+++ b/scw_js/dev_server_llm.ts
@@ -1,5 +1,5 @@
// Local dev server for the LLM chat x402 seller. Runs only via `npm run dev:llmx402`
-// (NODE_ENV=test npx tsx dev_server_llm.ts) and is not in tsup's entry list, so it is
+// (NODE_ENV=test npx tsx dev_server_llm.ts) and is not in tsdown's entry list, so it is
// never bundled or deployed. It serves handle() over fastify on port 8085, with the
// payment headers exposed for browser clients. Deployed handlers must stay free of
// fastify — enforced by test/handler_purity.test.ts.
diff --git a/scw_js/dev_server_mcp.ts b/scw_js/dev_server_mcp.ts
index 3f036c49e..46645c0d7 100644
--- a/scw_js/dev_server_mcp.ts
+++ b/scw_js/dev_server_mcp.ts
@@ -1,5 +1,5 @@
// Local dev server for the MCP endpoint. Runs only via `npm run dev:mcp`
-// (NODE_ENV=test npx tsx dev_server_mcp.ts) and is not in tsup's entry list, so it is
+// (NODE_ENV=test npx tsx dev_server_mcp.ts) and is not in tsdown's entry list, so it is
// never bundled or deployed. It serves handle() over fastify on port 8086 — point the
// MCP inspector (npx @modelcontextprotocol/inspector) at http://127.0.0.1:8086/mcp to
// exercise initialize/tools/list/tools/call before any deploy. Deployed handlers must
diff --git a/scw_js/package-lock.json b/scw_js/package-lock.json
index 10a601fdc..eef5badf2 100644
--- a/scw_js/package-lock.json
+++ b/scw_js/package-lock.json
@@ -34,7 +34,7 @@
"fastify": "^5.12.1",
"prettier": "^3.6.2",
"serverless-scaleway-functions": ">=0.5.1",
- "tsup": "^8.5.1",
+ "tsdown": "^0.23.1",
"typescript": "^5.9.3",
"typescript-eslint": "^8.58.2",
"vitest": "^4.1.11"
@@ -172,448 +172,6 @@
"keyv": "^5.6.0"
}
},
- "node_modules/@esbuild/aix-ppc64": {
- "version": "0.27.7",
- "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz",
- "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "aix"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/android-arm": {
- "version": "0.27.7",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz",
- "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/android-arm64": {
- "version": "0.27.7",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz",
- "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/android-x64": {
- "version": "0.27.7",
- "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz",
- "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/darwin-arm64": {
- "version": "0.27.7",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz",
- "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/darwin-x64": {
- "version": "0.27.7",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz",
- "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/freebsd-arm64": {
- "version": "0.27.7",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz",
- "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/freebsd-x64": {
- "version": "0.27.7",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz",
- "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-arm": {
- "version": "0.27.7",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz",
- "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-arm64": {
- "version": "0.27.7",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz",
- "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-ia32": {
- "version": "0.27.7",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz",
- "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-loong64": {
- "version": "0.27.7",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz",
- "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==",
- "cpu": [
- "loong64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-mips64el": {
- "version": "0.27.7",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz",
- "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==",
- "cpu": [
- "mips64el"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-ppc64": {
- "version": "0.27.7",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz",
- "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-riscv64": {
- "version": "0.27.7",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz",
- "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==",
- "cpu": [
- "riscv64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-s390x": {
- "version": "0.27.7",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz",
- "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==",
- "cpu": [
- "s390x"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-x64": {
- "version": "0.27.7",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz",
- "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/netbsd-arm64": {
- "version": "0.27.7",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz",
- "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "netbsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/netbsd-x64": {
- "version": "0.27.7",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz",
- "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "netbsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/openbsd-arm64": {
- "version": "0.27.7",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz",
- "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "openbsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/openbsd-x64": {
- "version": "0.27.7",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz",
- "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "openbsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/openharmony-arm64": {
- "version": "0.27.7",
- "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz",
- "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "openharmony"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/sunos-x64": {
- "version": "0.27.7",
- "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz",
- "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "sunos"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/win32-arm64": {
- "version": "0.27.7",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz",
- "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/win32-ia32": {
- "version": "0.27.7",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz",
- "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/win32-x64": {
- "version": "0.27.7",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz",
- "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=18"
- }
- },
"node_modules/@eslint-community/eslint-utils": {
"version": "4.10.1",
"resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz",
@@ -1106,17 +664,6 @@
}
}
},
- "node_modules/@jridgewell/gen-mapping": {
- "version": "0.3.13",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
- "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/sourcemap-codec": "^1.5.0",
- "@jridgewell/trace-mapping": "^0.3.24"
- }
- },
"node_modules/@jridgewell/resolve-uri": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
@@ -1314,26 +861,6 @@
"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
"license": "MIT"
},
- "node_modules/@napi-rs/lzma-linux-x64-gnu": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz",
- "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "libc": [
- "glibc"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^22.20 || ^24.12 || >=25"
- }
- },
"node_modules/@noble/ciphers": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz",
@@ -1433,264 +960,72 @@
"integrity": "sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==",
"dev": true,
"license": "BSD-3-Clause",
- "dependencies": {
- "@protobufjs/aspromise": "^1.1.1"
- }
- },
- "node_modules/@protobufjs/float": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
- "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==",
- "dev": true,
- "license": "BSD-3-Clause"
- },
- "node_modules/@protobufjs/path": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
- "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==",
- "dev": true,
- "license": "BSD-3-Clause"
- },
- "node_modules/@protobufjs/pool": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
- "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==",
- "dev": true,
- "license": "BSD-3-Clause"
- },
- "node_modules/@protobufjs/utf8": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.2.tgz",
- "integrity": "sha512-b1UQwcEZ4yCnMCD8DAL1VlbvBJE9/IX4FTIp7BG1xYpf29SLazLSrqUkj4w7Y5y7cCVP6E5tcqqcI0xemPkHug==",
- "dev": true,
- "license": "BSD-3-Clause"
- },
- "node_modules/@rolldown/binding-android-arm-eabi": {
- "version": "1.2.13",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.13.tgz",
- "integrity": "sha512-Vu/NICrgdRvUOeaJZIyB2FP63s6fO/4ud5l8dXmxDx9yDyn+mN0y+gsvsVviSli+T361Aqo0h46EuMoobrwawA==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-android-arm64": {
- "version": "1.2.13",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.13.tgz",
- "integrity": "sha512-6LEoIrGy5vvCd2boNnv2soPSUZj/PRvhp8R/t9KlX+mIZxThIE/ZqxrGXxmuNX0FuvQFvLdZr7S4HrYpYBVhEQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-darwin-arm64": {
- "version": "1.2.13",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.13.tgz",
- "integrity": "sha512-CaJSRzlQ6Q+zkDMVA9OkVxBjVoPRCDEE3v0FSJ9kIQBgRjFApA3Si4ijhbNVUji7ZJt+PfO0e46qy4nPInHUPA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-darwin-x64": {
- "version": "1.2.13",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.13.tgz",
- "integrity": "sha512-e4r340I5hxSzJkD3YJBxgzq/rJ3wwxwdLLb2FPt1Zpyem20nrQPT11DDEEkazwxaHumH8wpglsp/Ozgj/wT6mw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-freebsd-x64": {
- "version": "1.2.13",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.13.tgz",
- "integrity": "sha512-hoBWDZ4/K/mJKVMbsgUd1jfpA2DiOrJ54mpegObU9TBHBBrtX4FLIXJJQRDPZ/2Dn91GvPob+Z2hwKJzf4E5SQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-linux-arm-gnueabihf": {
- "version": "1.2.13",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.13.tgz",
- "integrity": "sha512-oF9fZu3vTWnTiVAkDFxU9PJLt1nh20K9RRpuHsR7ZnE2L7XookBbDBVLojCVSLGbvtSlxeUNnjAj6DbNsKyzbg==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-linux-arm64-gnu": {
- "version": "1.2.13",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.13.tgz",
- "integrity": "sha512-DTpb/+jMiqWMPgphn4ksW1zW+XLJ6dJJ9FMvnIk9I291LhCctMPhMYJrP5t9p6C9qa3KXadDdUEZHBaPh3kNxQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "libc": [
- "glibc"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-linux-arm64-musl": {
- "version": "1.2.13",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.13.tgz",
- "integrity": "sha512-xU+Kvv9N2A3SY35zFh1FWWNjxbadE/BKeqnkXe7vScU4GZsw757BlVmDLITZEq8DPpk6m7uoDYkK7P+x/uU5Ow==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "libc": [
- "musl"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
+ "dependencies": {
+ "@protobufjs/aspromise": "^1.1.1"
}
},
- "node_modules/@rolldown/binding-linux-ppc64-gnu": {
- "version": "1.2.13",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.13.tgz",
- "integrity": "sha512-XMk/hnhh25oQ756Lclb1Q11h4ll0xC0Esa5w4Vzp+mAE2S3AGJgeM0SonrIgY8fHhjarb6hcoTuwoFG0VVP2ig==",
- "cpu": [
- "ppc64"
- ],
+ "node_modules/@protobufjs/float": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
+ "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==",
"dev": true,
- "libc": [
- "glibc"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
+ "license": "BSD-3-Clause"
},
- "node_modules/@rolldown/binding-linux-s390x-gnu": {
- "version": "1.2.13",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.13.tgz",
- "integrity": "sha512-U1BoTHYmlywE2n3HUWjzZ+8EQsKr+OwpxYuDWaubx42tUL8QSL7nOqRz/NVHanibbFP3M1Rxuprz/wNcbMKjqw==",
- "cpu": [
- "s390x"
- ],
+ "node_modules/@protobufjs/path": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
+ "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==",
"dev": true,
- "libc": [
- "glibc"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
+ "license": "BSD-3-Clause"
},
- "node_modules/@rolldown/binding-linux-x64-gnu": {
- "version": "1.2.13",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.13.tgz",
- "integrity": "sha512-J4cm80Pc6wEwV5AZ42o62sIQgDk+Y7R2s646jIwuvO+4V46QB58N4vVuMPWCBaNgursXLpmUWJV//WQAkPvHBQ==",
- "cpu": [
- "x64"
- ],
+ "node_modules/@protobufjs/pool": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
+ "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==",
+ "dev": true,
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@protobufjs/utf8": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.2.tgz",
+ "integrity": "sha512-b1UQwcEZ4yCnMCD8DAL1VlbvBJE9/IX4FTIp7BG1xYpf29SLazLSrqUkj4w7Y5y7cCVP6E5tcqqcI0xemPkHug==",
+ "dev": true,
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@quansync/fs": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@quansync/fs/-/fs-1.1.0.tgz",
+ "integrity": "sha512-qAPG/t3HqML1TlN7sY/pTbEjzFVAKsMjNNMGheyDosro+kT4iw2KCUoHcVdmliwWjorm4elZbgNQyU2eD97eDg==",
"dev": true,
- "libc": [
- "glibc"
- ],
"license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
+ "dependencies": {
+ "quansync": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sxzz"
}
},
- "node_modules/@rolldown/binding-linux-x64-musl": {
+ "node_modules/@rolldown/binding-android-arm-eabi": {
"version": "1.2.13",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.13.tgz",
- "integrity": "sha512-W0euZS40U4V6JkmEnVCIX9mcsL6cbXQ4X8c2w+MMOIjFg68TXUW+u3RT+2e1t1pv9mg/EP3pDtK3POXdQ7Rxyw==",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.13.tgz",
+ "integrity": "sha512-Vu/NICrgdRvUOeaJZIyB2FP63s6fO/4ud5l8dXmxDx9yDyn+mN0y+gsvsVviSli+T361Aqo0h46EuMoobrwawA==",
"cpu": [
- "x64"
+ "arm"
],
"dev": true,
- "libc": [
- "musl"
- ],
"license": "MIT",
"optional": true,
"os": [
- "linux"
+ "android"
],
"engines": {
"node": "^20.19.0 || >=22.12.0"
}
},
- "node_modules/@rolldown/binding-openharmony-arm64": {
+ "node_modules/@rolldown/binding-android-arm64": {
"version": "1.2.13",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.13.tgz",
- "integrity": "sha512-do/AF/4n9MRshia3a5aXoy8xM2c6mgfT6D7H/dY6my5z+hfCIR4ab7mk4IRj++nsEQpKy39kd0DQnDq+r692tw==",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.13.tgz",
+ "integrity": "sha512-6LEoIrGy5vvCd2boNnv2soPSUZj/PRvhp8R/t9KlX+mIZxThIE/ZqxrGXxmuNX0FuvQFvLdZr7S4HrYpYBVhEQ==",
"cpu": [
"arm64"
],
@@ -1698,16 +1033,16 @@
"license": "MIT",
"optional": true,
"os": [
- "openharmony"
+ "android"
],
"engines": {
"node": "^20.19.0 || >=22.12.0"
}
},
- "node_modules/@rolldown/binding-win32-arm64-msvc": {
+ "node_modules/@rolldown/binding-darwin-arm64": {
"version": "1.2.13",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.13.tgz",
- "integrity": "sha512-6FtUf2cJZobutJdxnGYX8z0vtbgqU0b2v8vfBhkXb9wp2MppMFtkunE+IaOntyi01rkIQoPW2GHABtfzsC0BRQ==",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.13.tgz",
+ "integrity": "sha512-CaJSRzlQ6Q+zkDMVA9OkVxBjVoPRCDEE3v0FSJ9kIQBgRjFApA3Si4ijhbNVUji7ZJt+PfO0e46qy4nPInHUPA==",
"cpu": [
"arm64"
],
@@ -1715,16 +1050,16 @@
"license": "MIT",
"optional": true,
"os": [
- "win32"
+ "darwin"
],
"engines": {
"node": "^20.19.0 || >=22.12.0"
}
},
- "node_modules/@rolldown/binding-win32-x64-msvc": {
+ "node_modules/@rolldown/binding-darwin-x64": {
"version": "1.2.13",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.13.tgz",
- "integrity": "sha512-UKhFaZTeTcbKrb3iU82m17jVcPEAoqDkCN5MBqgPyZSwp/cQmib21crTS0DdH7T1B7wZRWEI89YQAOJMet5yhg==",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.13.tgz",
+ "integrity": "sha512-e4r340I5hxSzJkD3YJBxgzq/rJ3wwxwdLLb2FPt1Zpyem20nrQPT11DDEEkazwxaHumH8wpglsp/Ozgj/wT6mw==",
"cpu": [
"x64"
],
@@ -1732,93 +1067,16 @@
"license": "MIT",
"optional": true,
"os": [
- "win32"
+ "darwin"
],
"engines": {
"node": "^20.19.0 || >=22.12.0"
}
},
- "node_modules/@rolldown/pluginutils": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz",
- "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@rollup/rollup-android-arm-eabi": {
- "version": "4.64.5",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.64.5.tgz",
- "integrity": "sha512-MrfgRQSpD5hkkRg6XI16B6EDLb+6+xp8xje6bpdSwkYw+qxrBKbUVrRAQu9h82UT+QumSIVQ8HXsXjPd2dlhqw==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ]
- },
- "node_modules/@rollup/rollup-android-arm64": {
- "version": "4.64.5",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.64.5.tgz",
- "integrity": "sha512-+uu2p/R9Tzn8GpoQyX1pAo5dmKT1DhXevfaCzqzmPFhnLjHLWw7uWkaVGlxmhwYoRiYYhsGfRcD5cTBpL7rgSw==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ]
- },
- "node_modules/@rollup/rollup-darwin-arm64": {
- "version": "4.64.5",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.64.5.tgz",
- "integrity": "sha512-17dys+YEmzwzzFVHQAVDONg5FALXY9kd99HFEpfk4gJVHYxoh5bGea3D4t1fXXnwkTcOe25wPyd6nWS0I8IdLQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ]
- },
- "node_modules/@rollup/rollup-darwin-x64": {
- "version": "4.64.5",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.64.5.tgz",
- "integrity": "sha512-wg0zQEKkEvFZf1UaaX1UELOoPs//OSKUG7D+yITuqOsAvza7LvHTv5Wu4nmMfzNG7EYI2jp2PJC7Id6OETmsYQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ]
- },
- "node_modules/@rollup/rollup-freebsd-arm64": {
- "version": "4.64.5",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.64.5.tgz",
- "integrity": "sha512-CoJmWcpEMuwin+TZ/ev/H9uDyF/uxUKQSWXdmIPn/UBx/uGV9+4ebMp0FwnlhWR9PE1AdzYsKf3bZevhif38+A==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ]
- },
- "node_modules/@rollup/rollup-freebsd-x64": {
- "version": "4.64.5",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.64.5.tgz",
- "integrity": "sha512-PxZnLAaTUAL5xG0W2BXLeYPKrK2b3LIASV2/e/Kf7PZvSLI1iAQIm9B9aJD+YyFIT7hc6qaMV3+OOO35R28LfA==",
+ "node_modules/@rolldown/binding-freebsd-x64": {
+ "version": "1.2.13",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.13.tgz",
+ "integrity": "sha512-hoBWDZ4/K/mJKVMbsgUd1jfpA2DiOrJ54mpegObU9TBHBBrtX4FLIXJJQRDPZ/2Dn91GvPob+Z2hwKJzf4E5SQ==",
"cpu": [
"x64"
],
@@ -1827,116 +1085,34 @@
"optional": true,
"os": [
"freebsd"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
- "version": "4.64.5",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.64.5.tgz",
- "integrity": "sha512-uPo3IvnONjhbFXwWgroBeFwOicuhT7ZwQrnzkzmOtBJzeQbkUJUE1SJDfDI31ijQ5+ZUIA6sPrdUMxTSnxUWAg==",
- "cpu": [
- "arm"
],
- "dev": true,
- "libc": [
- "glibc"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
},
- "node_modules/@rollup/rollup-linux-arm-musleabihf": {
- "version": "4.64.5",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.64.5.tgz",
- "integrity": "sha512-ywI8Jyuc4LyHYTjC0mw4yA1ulvZBkHusdpWnoiEBsmBuHvSnt90btTBGCZ+s/2y+YNNfVAEKy33nPo5UI9zTmg==",
+ "node_modules/@rolldown/binding-linux-arm-gnueabihf": {
+ "version": "1.2.13",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.13.tgz",
+ "integrity": "sha512-oF9fZu3vTWnTiVAkDFxU9PJLt1nh20K9RRpuHsR7ZnE2L7XookBbDBVLojCVSLGbvtSlxeUNnjAj6DbNsKyzbg==",
"cpu": [
"arm"
],
- "dev": true,
- "libc": [
- "musl"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm64-gnu": {
- "version": "4.64.5",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.64.5.tgz",
- "integrity": "sha512-tmuXJoQ/3ovSr637aykZMdQteU/CB2APAz2CrvsbibuoHZi1BS1Db13cVViBdEARGwXCLn1DSJ8wsjoThLJPGA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "libc": [
- "glibc"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm64-musl": {
- "version": "4.64.5",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.64.5.tgz",
- "integrity": "sha512-5FMjSYNcUOHx7oW8Qu9KB6jGPpvF/8sG7+BDHwU/Ihh1/6FMJ9ySmsFG4tJ1qbNRuP8OLzCBDso4sF0mQaLuFQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "libc": [
- "musl"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-loong64-gnu": {
- "version": "4.64.5",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.64.5.tgz",
- "integrity": "sha512-K8ZJ+neLDbUkIrL8dqF/5LtuVCrKwo27kREgOlxjBEjlOXwHvDnHLU8Z/UKv/B49qi7e8hsSDOyoJwhwqhvX4w==",
- "cpu": [
- "loong64"
- ],
- "dev": true,
- "libc": [
- "glibc"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-loong64-musl": {
- "version": "4.64.5",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.64.5.tgz",
- "integrity": "sha512-NlVxsq7PFPv0DBKGuNWRDKixQYQCjM53zl04mxEcKMBmJbCBIUm1JdPfIWDRHyOOFzzYPmLQzfeEwh4716ayQg==",
- "cpu": [
- "loong64"
- ],
- "dev": true,
- "libc": [
- "musl"
- ],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
- ]
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
},
- "node_modules/@rollup/rollup-linux-ppc64-gnu": {
- "version": "4.64.5",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.64.5.tgz",
- "integrity": "sha512-ARhRHJYs5eCFet5azfrHD97vOkD8OzNW2RSMlvo5CcBqXaTOLfp0OHDtUQh7/K5AL5fUYoFp2fgC9KDg4vVYMQ==",
+ "node_modules/@rolldown/binding-linux-arm64-gnu": {
+ "version": "1.2.13",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.13.tgz",
+ "integrity": "sha512-DTpb/+jMiqWMPgphn4ksW1zW+XLJ6dJJ9FMvnIk9I291LhCctMPhMYJrP5t9p6C9qa3KXadDdUEZHBaPh3kNxQ==",
"cpu": [
- "ppc64"
+ "arm64"
],
"dev": true,
"libc": [
@@ -1946,14 +1122,17 @@
"optional": true,
"os": [
"linux"
- ]
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
},
- "node_modules/@rollup/rollup-linux-ppc64-musl": {
- "version": "4.64.5",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.64.5.tgz",
- "integrity": "sha512-atSgreM5C7jpxd9aEXN+6vJ5wTd05iYw+S3FiQpw7VsoEl8B90llbq35ARON+GOHj5QlVQEq2vOKWCHTob/BSQ==",
+ "node_modules/@rolldown/binding-linux-arm64-musl": {
+ "version": "1.2.13",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.13.tgz",
+ "integrity": "sha512-xU+Kvv9N2A3SY35zFh1FWWNjxbadE/BKeqnkXe7vScU4GZsw757BlVmDLITZEq8DPpk6m7uoDYkK7P+x/uU5Ow==",
"cpu": [
- "ppc64"
+ "arm64"
],
"dev": true,
"libc": [
@@ -1963,14 +1142,17 @@
"optional": true,
"os": [
"linux"
- ]
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
},
- "node_modules/@rollup/rollup-linux-riscv64-gnu": {
- "version": "4.64.5",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.64.5.tgz",
- "integrity": "sha512-vmlmwBFGnjVWxSRoVabNkyYuscSmg52Pd0fM8jEbNT3Jmka4A6HcB84x4uAmuumznWfBVaxKOqU6jbEgomWKCA==",
+ "node_modules/@rolldown/binding-linux-ppc64-gnu": {
+ "version": "1.2.13",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.13.tgz",
+ "integrity": "sha512-XMk/hnhh25oQ756Lclb1Q11h4ll0xC0Esa5w4Vzp+mAE2S3AGJgeM0SonrIgY8fHhjarb6hcoTuwoFG0VVP2ig==",
"cpu": [
- "riscv64"
+ "ppc64"
],
"dev": true,
"libc": [
@@ -1980,29 +1162,15 @@
"optional": true,
"os": [
"linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-riscv64-musl": {
- "version": "4.64.5",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.64.5.tgz",
- "integrity": "sha512-hhJrP6S9WkbsbcHgUkvCBS5Cn8IdsG8XjlLZyxjnv9+NdoYfbbZE4TWJYr8apdaj1M5t5Y1id2StnEslxpNFyA==",
- "cpu": [
- "riscv64"
- ],
- "dev": true,
- "libc": [
- "musl"
],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
},
- "node_modules/@rollup/rollup-linux-s390x-gnu": {
- "version": "4.64.5",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.64.5.tgz",
- "integrity": "sha512-NNVCyN9pGrwFmQa4bf+Cnf5aVH3g6ZpnlOg1Cs/H9swIHT9bRixijfzUqyEIWm1WtiAuR1LJ+rJH6zpBm8kgQA==",
+ "node_modules/@rolldown/binding-linux-s390x-gnu": {
+ "version": "1.2.13",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.13.tgz",
+ "integrity": "sha512-U1BoTHYmlywE2n3HUWjzZ+8EQsKr+OwpxYuDWaubx42tUL8QSL7nOqRz/NVHanibbFP3M1Rxuprz/wNcbMKjqw==",
"cpu": [
"s390x"
],
@@ -2014,12 +1182,15 @@
"optional": true,
"os": [
"linux"
- ]
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
},
- "node_modules/@rollup/rollup-linux-x64-gnu": {
- "version": "4.64.5",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.64.5.tgz",
- "integrity": "sha512-dR9nd6OKnvSS60Ifz/L7Mj5zzYyoqyRn2NwTuaOONKaa3xsVGXyp8YusMbvFyEOR94DxnwgcbgsFqkHd29ZSzQ==",
+ "node_modules/@rolldown/binding-linux-x64-gnu": {
+ "version": "1.2.13",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.13.tgz",
+ "integrity": "sha512-J4cm80Pc6wEwV5AZ42o62sIQgDk+Y7R2s646jIwuvO+4V46QB58N4vVuMPWCBaNgursXLpmUWJV//WQAkPvHBQ==",
"cpu": [
"x64"
],
@@ -2031,12 +1202,15 @@
"optional": true,
"os": [
"linux"
- ]
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
},
- "node_modules/@rollup/rollup-linux-x64-musl": {
- "version": "4.64.5",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.64.5.tgz",
- "integrity": "sha512-1tzsMjaqhsh3bAO6SJiJqh8hIr9sSPRd+i2vPPxJHod8/XYnf9TEnK0z/u3r1z1AkI347X0KbRSg9dWcxeGahw==",
+ "node_modules/@rolldown/binding-linux-x64-musl": {
+ "version": "1.2.13",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.13.tgz",
+ "integrity": "sha512-W0euZS40U4V6JkmEnVCIX9mcsL6cbXQ4X8c2w+MMOIjFg68TXUW+u3RT+2e1t1pv9mg/EP3pDtK3POXdQ7Rxyw==",
"cpu": [
"x64"
],
@@ -2048,26 +1222,15 @@
"optional": true,
"os": [
"linux"
- ]
- },
- "node_modules/@rollup/rollup-openbsd-x64": {
- "version": "4.64.5",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.64.5.tgz",
- "integrity": "sha512-01mWMQblKoXXsmk28KXtpbA96w7g/aOWUoV3AC16fdHdqkykGalqyyM+5u8M7uP5/MEMiiPv69Hv7iv/hEH/dA==",
- "cpu": [
- "x64"
],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "openbsd"
- ]
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
},
- "node_modules/@rollup/rollup-openharmony-arm64": {
- "version": "4.64.5",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.64.5.tgz",
- "integrity": "sha512-trdnMPb/DNm4V/CgsaoGgr90HfQQ071wfK0KoIs4YpLvjBgVQGXhGabg2Z6nK4EcYNilrb9ZZPcsP6+zpJIdxQ==",
+ "node_modules/@rolldown/binding-openharmony-arm64": {
+ "version": "1.2.13",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.13.tgz",
+ "integrity": "sha512-do/AF/4n9MRshia3a5aXoy8xM2c6mgfT6D7H/dY6my5z+hfCIR4ab7mk4IRj++nsEQpKy39kd0DQnDq+r692tw==",
"cpu": [
"arm64"
],
@@ -2076,12 +1239,15 @@
"optional": true,
"os": [
"openharmony"
- ]
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
},
- "node_modules/@rollup/rollup-win32-arm64-msvc": {
- "version": "4.64.5",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.64.5.tgz",
- "integrity": "sha512-x2LxZlfdfsw99T6/qb9EqE/Qi84JWzibjyOJyhJsgFJy6CafaTiqIXCCnslCGrV5XWNh7fwrS3FbRENcuKnooA==",
+ "node_modules/@rolldown/binding-win32-arm64-msvc": {
+ "version": "1.2.13",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.13.tgz",
+ "integrity": "sha512-6FtUf2cJZobutJdxnGYX8z0vtbgqU0b2v8vfBhkXb9wp2MppMFtkunE+IaOntyi01rkIQoPW2GHABtfzsC0BRQ==",
"cpu": [
"arm64"
],
@@ -2090,26 +1256,15 @@
"optional": true,
"os": [
"win32"
- ]
- },
- "node_modules/@rollup/rollup-win32-ia32-msvc": {
- "version": "4.64.5",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.64.5.tgz",
- "integrity": "sha512-/Qd/9aDQIo0+jmItgBmPIs8195YVbDxRRApn47GyufgbutCDOh7eP5vSKKlI4QNFeaI+wKQAkSMsPnF3EuMpaA==",
- "cpu": [
- "ia32"
],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ]
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
},
- "node_modules/@rollup/rollup-win32-x64-gnu": {
- "version": "4.64.5",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.64.5.tgz",
- "integrity": "sha512-ngUJ/XvOWrqbd2IMsfXfh2xXFLTP3sY7sCKvxbGvYdBZ1KmXFd3ewDZ9n3/GNzAUgzRuhLT/UvJRivbNoAQRBw==",
+ "node_modules/@rolldown/binding-win32-x64-msvc": {
+ "version": "1.2.13",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.13.tgz",
+ "integrity": "sha512-UKhFaZTeTcbKrb3iU82m17jVcPEAoqDkCN5MBqgPyZSwp/cQmib21crTS0DdH7T1B7wZRWEI89YQAOJMet5yhg==",
"cpu": [
"x64"
],
@@ -2118,21 +1273,17 @@
"optional": true,
"os": [
"win32"
- ]
- },
- "node_modules/@rollup/rollup-win32-x64-msvc": {
- "version": "4.64.5",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.64.5.tgz",
- "integrity": "sha512-IhV6ew/DuzUWwHaYmlh7MrPCV3lKFUq/amTEwysi4r/mwNPAEfAMh5dYWeTSPTeMy2pFHGMEWYtPkHzfX3tG5A==",
- "cpu": [
- "x64"
],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/pluginutils": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz",
+ "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==",
"dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ]
+ "license": "MIT"
},
"node_modules/@scaleway/serverless-functions": {
"version": "1.1.2",
@@ -3242,62 +2393,255 @@
"url": "https://github.com/sponsors/epoberezkin"
}
},
- "node_modules/@x402/extensions/node_modules/fast-uri": {
- "version": "3.1.8",
- "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.8.tgz",
- "integrity": "sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/fastify"
- },
- {
- "type": "opencollective",
- "url": "https://opencollective.com/fastify"
- }
+ "node_modules/@x402/extensions/node_modules/fast-uri": {
+ "version": "3.1.8",
+ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.8.tgz",
+ "integrity": "sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ],
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@x402/extensions/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "license": "MIT"
+ },
+ "node_modules/@x402/extensions/node_modules/tweetnacl": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz",
+ "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==",
+ "license": "Unlicense"
+ },
+ "node_modules/@x402/extensions/node_modules/zod": {
+ "version": "3.25.76",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
+ "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
+ },
+ "node_modules/@x402/mcp": {
+ "version": "2.28.0",
+ "resolved": "https://registry.npmjs.org/@x402/mcp/-/mcp-2.28.0.tgz",
+ "integrity": "sha512-I84qbst4aazR8lqfcw/XRURjECxzKuFsNMWgELgD63OBK39Jqjz0dar9o0X7Vdm4FcsWA/QET+F1MFFEU4QmKQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@modelcontextprotocol/sdk": "^1.12.1",
+ "@x402/core": "~2.28.0",
+ "zod": "^3.24.2"
+ }
+ },
+ "node_modules/@x402/mcp/node_modules/zod": {
+ "version": "3.25.76",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
+ "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
+ },
+ "node_modules/@yuku-core/binding-android-arm64": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/@yuku-core/binding-android-arm64/-/binding-android-arm64-0.19.0.tgz",
+ "integrity": "sha512-wdL2XmTiZixAOaHk9Z0JJZ8u9Qm8d333Zjpc6gaxXFX+UR5BlsfxZ7a2+2Rm71pamppsPYGUGFq2oVLbh6DISw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@yuku-core/binding-darwin-arm64": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/@yuku-core/binding-darwin-arm64/-/binding-darwin-arm64-0.19.0.tgz",
+ "integrity": "sha512-7sNJa6XJhyetnTy64jw3NEi4YgUcezHk1G5GH9FSvXAuC8wIlbaOwT9lgq5qo5sspjrZJQlBR1TWflP49uRpMw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@yuku-core/binding-darwin-x64": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/@yuku-core/binding-darwin-x64/-/binding-darwin-x64-0.19.0.tgz",
+ "integrity": "sha512-pTC7dYEc59isdyizc3nsuyFNBu2LU5wMYZ1be6UMr59PY/AJNtO1aBLWV0MgL/z7C1nv/2sX4TNjGgKLoeevJw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@yuku-core/binding-freebsd-x64": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/@yuku-core/binding-freebsd-x64/-/binding-freebsd-x64-0.19.0.tgz",
+ "integrity": "sha512-xrZjF6XOEwyLOiDIfrwDdRCS6ghxcJeirNC1KivQhVcUwlRonaU79S3/Uiyx3lBylPnT8qKJ3/aMT+H52nGTJQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@yuku-core/binding-linux-arm-gnu": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/@yuku-core/binding-linux-arm-gnu/-/binding-linux-arm-gnu-0.19.0.tgz",
+ "integrity": "sha512-0OyIH53C0I1CbADHn9FSdCfX5qbpeLwJhmOVhonFJNYheybOnkSJ50qGMfTJIb8y5zrwqvLs7FVBvz6Fk8maZg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@yuku-core/binding-linux-arm-musl": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/@yuku-core/binding-linux-arm-musl/-/binding-linux-arm-musl-0.19.0.tgz",
+ "integrity": "sha512-z/iPfkCOCSXE34VXNt0uP1ORSW+4mEa9b5CiJcWZeqZH08g49bFU/jRM2T04f+Wpw5mJ6HIzNBiojxeAbrHjeg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@yuku-core/binding-linux-arm64-gnu": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/@yuku-core/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.19.0.tgz",
+ "integrity": "sha512-jLNTi+gzaRwBJ+gwhCJ+rDb5dmx/8hEBx93UWd7hjMSqPTL1D1wvVSvXVAldV5kALvju7b0/m51EHEhs4+I1fA==",
+ "cpu": [
+ "arm64"
],
- "license": "BSD-3-Clause"
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
},
- "node_modules/@x402/extensions/node_modules/json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
- "license": "MIT"
+ "node_modules/@yuku-core/binding-linux-arm64-musl": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/@yuku-core/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.19.0.tgz",
+ "integrity": "sha512-YwyPIdW/rN2Fmv0MTFWi47FaB3F9g+2b+sJISyAw83Yd60RWH4T3Nx6XkAHHVN+uKJNBAd6So7/BVihSiFYvuQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
},
- "node_modules/@x402/extensions/node_modules/tweetnacl": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz",
- "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==",
- "license": "Unlicense"
+ "node_modules/@yuku-core/binding-linux-x64-gnu": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/@yuku-core/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.19.0.tgz",
+ "integrity": "sha512-/vskaAXVX3ESR43FiTdfiYS7z1b9uoQJwVQ/0RgUHgN2sWoAyCZs+aX4CgU7eKGIHTVfp9VFwv+c+2XchYiEtQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
},
- "node_modules/@x402/extensions/node_modules/zod": {
- "version": "3.25.76",
- "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
- "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
+ "node_modules/@yuku-core/binding-linux-x64-musl": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/@yuku-core/binding-linux-x64-musl/-/binding-linux-x64-musl-0.19.0.tgz",
+ "integrity": "sha512-FuXL5igeSKib9Rye02TdH+D6SQezTyGxIATMu1Qsn/QywrzwpGl35OLpS2C1x5vpGLeVE2XgiLd5mVPFHmIglQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "libc": [
+ "musl"
+ ],
"license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/colinhacks"
- }
+ "optional": true,
+ "os": [
+ "linux"
+ ]
},
- "node_modules/@x402/mcp": {
- "version": "2.28.0",
- "resolved": "https://registry.npmjs.org/@x402/mcp/-/mcp-2.28.0.tgz",
- "integrity": "sha512-I84qbst4aazR8lqfcw/XRURjECxzKuFsNMWgELgD63OBK39Jqjz0dar9o0X7Vdm4FcsWA/QET+F1MFFEU4QmKQ==",
- "license": "Apache-2.0",
- "dependencies": {
- "@modelcontextprotocol/sdk": "^1.12.1",
- "@x402/core": "~2.28.0",
- "zod": "^3.24.2"
- }
+ "node_modules/@yuku-core/binding-win32-arm64": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/@yuku-core/binding-win32-arm64/-/binding-win32-arm64-0.19.0.tgz",
+ "integrity": "sha512-YuJAe7zEKT1Xa7LuHlhGJpPnYQeVtvo0rZvNjJRqkH0hQGOw4C8QeP30Tg5VKGzZfo2x8CjhjEhKt4TmLwfmdg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
},
- "node_modules/@x402/mcp/node_modules/zod": {
- "version": "3.25.76",
- "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
- "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
+ "node_modules/@yuku-core/binding-win32-x64": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/@yuku-core/binding-win32-x64/-/binding-win32-x64-0.19.0.tgz",
+ "integrity": "sha512-o8iY/mXwlRkedp0LNTr4+TEfXTPQwoNZmv6k+1WIAd1ZXEn8xJJTBCtB0osaVvdZo/x/cNmV16UrWrrGpM5Mvw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
"license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/colinhacks"
- }
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@yuku-toolchain/types": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/@yuku-toolchain/types/-/types-0.19.0.tgz",
+ "integrity": "sha512-tFkNbsP4WXX9UMUC5syJGdK9dPMLK0PPaIuXCcCYH75sZ8MrebfBZ2XvCILRTw8AgLivSSCfDa4R67iYBDa4Kg==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/abbrev": {
"version": "1.1.1",
@@ -3526,13 +2870,6 @@
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "node_modules/any-promise": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
- "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/apg-js": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/apg-js/-/apg-js-4.4.0.tgz",
@@ -3898,22 +3235,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/bundle-require": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.1.0.tgz",
- "integrity": "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "load-tsconfig": "^0.2.3"
- },
- "engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
- },
- "peerDependencies": {
- "esbuild": ">=0.18"
- }
- },
"node_modules/bytes": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
@@ -3923,16 +3244,6 @@
"node": ">= 0.8"
}
},
- "node_modules/cac": {
- "version": "6.7.14",
- "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
- "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/cacheable": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/cacheable/-/cacheable-2.5.0.tgz",
@@ -4084,22 +3395,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/chokidar": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
- "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "readdirp": "^4.0.1"
- },
- "engines": {
- "node": ">= 14.16.0"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
- }
- },
"node_modules/chownr": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
@@ -4350,23 +3645,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/confbox": {
- "version": "0.1.8",
- "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz",
- "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/consola": {
- "version": "3.4.2",
- "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz",
- "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "^14.18.0 || >=16.10.0"
- }
- },
"node_modules/console-control-strings": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
@@ -4771,6 +4049,13 @@
"node": ">=8"
}
},
+ "node_modules/defu": {
+ "version": "6.1.7",
+ "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz",
+ "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
@@ -4882,6 +4167,27 @@
"url": "https://dotenvx.com"
}
},
+ "node_modules/dts-resolver": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/dts-resolver/-/dts-resolver-3.0.0.tgz",
+ "integrity": "sha512-1T1f+z+4tl9XD+m+0HBgWoL/nm0bOIffyWaUuUSBlFg/86IWvfx+wjNaO/ybU0AJzG9/Mi5hBUgGV6zCmWEN7Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^22.18.0 || >=24.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sxzz"
+ },
+ "peerDependencies": {
+ "oxc-resolver": ">=11.0.0"
+ },
+ "peerDependenciesMeta": {
+ "oxc-resolver": {
+ "optional": true
+ }
+ }
+ },
"node_modules/dunder-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
@@ -4920,6 +4226,16 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/empathic": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/empathic/-/empathic-2.1.0.tgz",
+ "integrity": "sha512-AnfC1ATldl49/cvZdLPDjBfrRNwbDO05aibiOtzQu3qtlbJtomNLhF30HEtn/7iBz50dlMECqATo3fG0LrdEgw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ }
+ },
"node_modules/encodeurl": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
@@ -5066,48 +4382,6 @@
"es6-symbol": "^3.1.1"
}
},
- "node_modules/esbuild": {
- "version": "0.27.7",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz",
- "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==",
- "dev": true,
- "hasInstallScript": true,
- "license": "MIT",
- "bin": {
- "esbuild": "bin/esbuild"
- },
- "engines": {
- "node": ">=18"
- },
- "optionalDependencies": {
- "@esbuild/aix-ppc64": "0.27.7",
- "@esbuild/android-arm": "0.27.7",
- "@esbuild/android-arm64": "0.27.7",
- "@esbuild/android-x64": "0.27.7",
- "@esbuild/darwin-arm64": "0.27.7",
- "@esbuild/darwin-x64": "0.27.7",
- "@esbuild/freebsd-arm64": "0.27.7",
- "@esbuild/freebsd-x64": "0.27.7",
- "@esbuild/linux-arm": "0.27.7",
- "@esbuild/linux-arm64": "0.27.7",
- "@esbuild/linux-ia32": "0.27.7",
- "@esbuild/linux-loong64": "0.27.7",
- "@esbuild/linux-mips64el": "0.27.7",
- "@esbuild/linux-ppc64": "0.27.7",
- "@esbuild/linux-riscv64": "0.27.7",
- "@esbuild/linux-s390x": "0.27.7",
- "@esbuild/linux-x64": "0.27.7",
- "@esbuild/netbsd-arm64": "0.27.7",
- "@esbuild/netbsd-x64": "0.27.7",
- "@esbuild/openbsd-arm64": "0.27.7",
- "@esbuild/openbsd-x64": "0.27.7",
- "@esbuild/openharmony-arm64": "0.27.7",
- "@esbuild/sunos-x64": "0.27.7",
- "@esbuild/win32-arm64": "0.27.7",
- "@esbuild/win32-ia32": "0.27.7",
- "@esbuild/win32-x64": "0.27.7"
- }
- },
"node_modules/escalade": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
@@ -6058,18 +5332,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/fix-dts-default-cjs-exports": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/fix-dts-default-cjs-exports/-/fix-dts-default-cjs-exports-1.0.1.tgz",
- "integrity": "sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "magic-string": "^0.30.17",
- "mlly": "^1.7.4",
- "rollup": "^4.34.8"
- }
- },
"node_modules/flat-cache": {
"version": "6.1.23",
"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.23.tgz",
@@ -6326,6 +5588,22 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/get-tsconfig": {
+ "version": "5.0.0-beta.6",
+ "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-5.0.0-beta.6.tgz",
+ "integrity": "sha512-X6fBC0pmImC70gvX2zm56go9hx0MyoGVdG0tUCkg/D+Xnh5TJsOZ7iDbOdI3PvmtrDxnu1YdDufpK2QJX1Meqw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "resolve-pkg-maps": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=20.20.0"
+ },
+ "funding": {
+ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1"
+ }
+ },
"node_modules/glob": {
"version": "7.2.3",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
@@ -6529,6 +5807,13 @@
"node": ">=16.9.0"
}
},
+ "node_modules/hookable": {
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/hookable/-/hookable-6.1.2.tgz",
+ "integrity": "sha512-+abwxtiEA52GCVIsQqut3S/uKTbUwYIp4Pe/vv+6py5XiXBCqMZHg6pA6Y5qhgLSEys0/cYuPbO0z1QFj5ZCmg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/hookified": {
"version": "1.15.1",
"resolved": "https://registry.npmjs.org/hookified/-/hookified-1.15.1.tgz",
@@ -6645,6 +5930,19 @@
"node": ">= 4"
}
},
+ "node_modules/import-without-cache": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/import-without-cache/-/import-without-cache-0.4.1.tgz",
+ "integrity": "sha512-vXoV9PjKHEednCUu01e98TkImxy67e3BJXbTIOmIq4Hyzw3IAwYRcuPkfeTzJzwyyts4kjuA73x+pWJLc4f86A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^22.18.0 || >=24.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sxzz"
+ }
+ },
"node_modules/imurmurhash": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
@@ -6959,16 +6257,6 @@
"url": "https://github.com/sponsors/panva"
}
},
- "node_modules/joycon": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz",
- "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/js-tokens": {
"version": "10.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz",
@@ -7373,36 +6661,6 @@
"url": "https://opencollective.com/parcel"
}
},
- "node_modules/lilconfig": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
- "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/sponsors/antonk52"
- }
- },
- "node_modules/lines-and-columns": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
- "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/load-tsconfig": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz",
- "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
- }
- },
"node_modules/locate-path": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
@@ -7752,19 +7010,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/mlly": {
- "version": "1.8.2",
- "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz",
- "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "acorn": "^8.16.0",
- "pathe": "^2.0.3",
- "pkg-types": "^1.3.1",
- "ufo": "^1.6.3"
- }
- },
"node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
@@ -7775,20 +7020,8 @@
"version": "0.0.8",
"resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
"integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/mz": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
- "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "any-promise": "^1.0.0",
- "object-assign": "^4.0.1",
- "thenify-all": "^1.0.0"
- }
+ "dev": true,
+ "license": "ISC"
},
"node_modules/nan": {
"version": "2.29.0",
@@ -8373,16 +7606,6 @@
"integrity": "sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==",
"license": "MIT"
},
- "node_modules/pirates": {
- "version": "4.0.7",
- "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz",
- "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 6"
- }
- },
"node_modules/pkce-challenge": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz",
@@ -8392,18 +7615,6 @@
"node": ">=16.20.0"
}
},
- "node_modules/pkg-types": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz",
- "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "confbox": "^0.1.8",
- "mlly": "^1.7.4",
- "pathe": "^2.0.1"
- }
- },
"node_modules/possible-typed-array-names": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz",
@@ -8443,49 +7654,6 @@
"node": "^10 || ^12 || >=14"
}
},
- "node_modules/postcss-load-config": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz",
- "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "lilconfig": "^3.1.1"
- },
- "engines": {
- "node": ">= 18"
- },
- "peerDependencies": {
- "jiti": ">=1.21.0",
- "postcss": ">=8.0.9",
- "tsx": "^4.8.1",
- "yaml": "^2.4.2"
- },
- "peerDependenciesMeta": {
- "jiti": {
- "optional": true
- },
- "postcss": {
- "optional": true
- },
- "tsx": {
- "optional": true
- },
- "yaml": {
- "optional": true
- }
- }
- },
"node_modules/prelude-ls": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
@@ -8678,6 +7846,23 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/quansync": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/quansync/-/quansync-1.0.0.tgz",
+ "integrity": "sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/antfu"
+ },
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/sxzz"
+ }
+ ],
+ "license": "MIT"
+ },
"node_modules/quick-format-unescaped": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz",
@@ -8799,20 +7984,6 @@
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
}
},
- "node_modules/readdirp": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
- "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 14.18.0"
- },
- "funding": {
- "type": "individual",
- "url": "https://paulmillr.com/funding/"
- }
- },
"node_modules/real-require": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/real-require/-/real-require-1.0.0.tgz",
@@ -8880,14 +8051,14 @@
"dev": true,
"license": "MIT"
},
- "node_modules/resolve-from": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
- "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "node_modules/resolve-pkg-maps": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz",
+ "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==",
"dev": true,
"license": "MIT",
- "engines": {
- "node": ">=8"
+ "funding": {
+ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1"
}
},
"node_modules/responselike": {
@@ -8996,50 +8167,64 @@
"@rolldown/binding-win32-x64-msvc": "1.2.13"
}
},
- "node_modules/rollup": {
- "version": "4.64.5",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.64.5.tgz",
- "integrity": "sha512-EAP5ZHcz2ijbgCWwPkpI7zh6bfsri2Ez5FtCy2dCp1k62duXzfG7DLGGh7RU2QQXWwavT+u4qpvDF/TWOiiGTw==",
+ "node_modules/rolldown-plugin-dts": {
+ "version": "0.28.8",
+ "resolved": "https://registry.npmjs.org/rolldown-plugin-dts/-/rolldown-plugin-dts-0.28.8.tgz",
+ "integrity": "sha512-FVhfqxorCWcc20BVT5eVRfRjzLLl6mgzjcMR4gSBf0K4oQMXT0qoHhhzfXy0L7y83fQy7Ug5ZDNk90xM3/LiCQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@types/estree": "1.0.9"
- },
- "bin": {
- "rollup": "dist/bin/rollup"
+ "dts-resolver": "^3.0.0",
+ "get-tsconfig": "5.0.0-beta.6",
+ "obug": "^3.0.0",
+ "yuku-ast": "^0.19.0",
+ "yuku-codegen": "^0.19.0",
+ "yuku-parser": "^0.19.0"
},
"engines": {
- "node": ">=18.0.0",
- "npm": ">=8.0.0"
+ "node": "^22.18.0 || ^24.11.0 || >=26.0.0"
},
- "optionalDependencies": {
- "@napi-rs/lzma-linux-x64-gnu": "1.5.1",
- "@rollup/rollup-android-arm-eabi": "4.64.5",
- "@rollup/rollup-android-arm64": "4.64.5",
- "@rollup/rollup-darwin-arm64": "4.64.5",
- "@rollup/rollup-darwin-x64": "4.64.5",
- "@rollup/rollup-freebsd-arm64": "4.64.5",
- "@rollup/rollup-freebsd-x64": "4.64.5",
- "@rollup/rollup-linux-arm-gnueabihf": "4.64.5",
- "@rollup/rollup-linux-arm-musleabihf": "4.64.5",
- "@rollup/rollup-linux-arm64-gnu": "4.64.5",
- "@rollup/rollup-linux-arm64-musl": "4.64.5",
- "@rollup/rollup-linux-loong64-gnu": "4.64.5",
- "@rollup/rollup-linux-loong64-musl": "4.64.5",
- "@rollup/rollup-linux-ppc64-gnu": "4.64.5",
- "@rollup/rollup-linux-ppc64-musl": "4.64.5",
- "@rollup/rollup-linux-riscv64-gnu": "4.64.5",
- "@rollup/rollup-linux-riscv64-musl": "4.64.5",
- "@rollup/rollup-linux-s390x-gnu": "4.64.5",
- "@rollup/rollup-linux-x64-gnu": "4.64.5",
- "@rollup/rollup-linux-x64-musl": "4.64.5",
- "@rollup/rollup-openbsd-x64": "4.64.5",
- "@rollup/rollup-openharmony-arm64": "4.64.5",
- "@rollup/rollup-win32-arm64-msvc": "4.64.5",
- "@rollup/rollup-win32-ia32-msvc": "4.64.5",
- "@rollup/rollup-win32-x64-gnu": "4.64.5",
- "@rollup/rollup-win32-x64-msvc": "4.64.5",
- "fsevents": "~2.3.2"
+ "funding": {
+ "url": "https://github.com/sponsors/sxzz"
+ },
+ "peerDependencies": {
+ "@typescript/native-preview": "*",
+ "@volar/typescript": "~2.4.0",
+ "@vue/language-core": "~3.2.0 || ~3.3.0",
+ "rolldown": "^1.2.0",
+ "typescript": "^5.0.0 || ^6.0.0 || ~7.0.0",
+ "vue-tsc": "~3.2.0 || ~3.3.0"
+ },
+ "peerDependenciesMeta": {
+ "@typescript/native-preview": {
+ "optional": true
+ },
+ "@volar/typescript": {
+ "optional": true
+ },
+ "@vue/language-core": {
+ "optional": true
+ },
+ "typescript": {
+ "optional": true
+ },
+ "vue-tsc": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/rolldown-plugin-dts/node_modules/obug": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/obug/-/obug-3.0.0.tgz",
+ "integrity": "sha512-5vvB5+W7ePv+p3uqxi+RcW1XAzLW0/hxt3/4X4Lc4qHudzOhmBiBwOY6DRob4WnanAEGvNcLjF+KNOufrUoEQw==",
+ "dev": true,
+ "funding": [
+ "https://github.com/sponsors/sxzz",
+ "https://opencollective.com/debug"
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.20.0"
}
},
"node_modules/router": {
@@ -9443,16 +8628,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/source-map": {
- "version": "0.7.6",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz",
- "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==",
- "dev": true,
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">= 12"
- }
- },
"node_modules/source-map-js": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.2.tgz",
@@ -9622,39 +8797,6 @@
"url": "https://github.com/sponsors/Borewit"
}
},
- "node_modules/sucrase": {
- "version": "3.35.1",
- "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz",
- "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/gen-mapping": "^0.3.2",
- "commander": "^4.0.0",
- "lines-and-columns": "^1.1.6",
- "mz": "^2.7.0",
- "pirates": "^4.0.1",
- "tinyglobby": "^0.2.11",
- "ts-interface-checker": "^0.1.9"
- },
- "bin": {
- "sucrase": "bin/sucrase",
- "sucrase-node": "bin/sucrase-node"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
- }
- },
- "node_modules/sucrase/node_modules/commander": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
- "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 6"
- }
- },
"node_modules/supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
@@ -9807,29 +8949,6 @@
"safe-buffer": "~5.1.0"
}
},
- "node_modules/thenify": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
- "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "any-promise": "^1.0.0"
- }
- },
- "node_modules/thenify-all": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
- "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "thenify": ">= 3.1.0 < 4"
- },
- "engines": {
- "node": ">=0.8"
- }
- },
"node_modules/thread-stream": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-4.2.0.tgz",
@@ -9870,13 +8989,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/tinyexec": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz",
- "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/tinyglobby": {
"version": "0.2.17",
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz",
@@ -10009,73 +9121,119 @@
"typescript": ">=4.8.4"
}
},
- "node_modules/ts-interface-checker": {
- "version": "0.1.13",
- "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
- "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
- "dev": true,
- "license": "Apache-2.0"
- },
- "node_modules/tslib": {
- "version": "2.8.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
- "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
- "dev": true,
- "license": "0BSD"
- },
- "node_modules/tsup": {
- "version": "8.5.1",
- "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.5.1.tgz",
- "integrity": "sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing==",
+ "node_modules/tsdown": {
+ "version": "0.23.1",
+ "resolved": "https://registry.npmjs.org/tsdown/-/tsdown-0.23.1.tgz",
+ "integrity": "sha512-MSC2WSOts3in95J334/VIS7KPfor3eCSvndJ6KdoVj9Aak9Kh1aNfz9ws5owhdukuTNSXRdfkPEzA/ihpDD6SA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "bundle-require": "^5.1.0",
- "cac": "^6.7.14",
- "chokidar": "^4.0.3",
- "consola": "^3.4.0",
- "debug": "^4.4.0",
- "esbuild": "^0.27.0",
- "fix-dts-default-cjs-exports": "^1.0.0",
- "joycon": "^3.1.1",
- "picocolors": "^1.1.1",
- "postcss-load-config": "^6.0.1",
- "resolve-from": "^5.0.0",
- "rollup": "^4.34.8",
- "source-map": "^0.7.6",
- "sucrase": "^3.35.0",
- "tinyexec": "^0.3.2",
- "tinyglobby": "^0.2.11",
- "tree-kill": "^1.2.2"
+ "cac": "^7.0.1",
+ "defu": "^6.1.7",
+ "empathic": "^2.1.0",
+ "hookable": "^6.1.2",
+ "import-without-cache": "^0.4.1",
+ "obug": "^3.0.0",
+ "picomatch": "^4.0.7",
+ "rolldown": "~1.2.13",
+ "rolldown-plugin-dts": "^0.28.7",
+ "tinyexec": "^1.3.1",
+ "tinyglobby": "^0.2.17",
+ "tree-kill": "^1.2.2",
+ "unconfig-core": "^7.5.0",
+ "verkit": "^0.5.0"
},
"bin": {
- "tsup": "dist/cli-default.js",
- "tsup-node": "dist/cli-node.js"
+ "tsdown": "dist/run.mjs"
},
"engines": {
- "node": ">=18"
+ "node": "^22.18.0 || ^24.11.0 || >=26.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sxzz"
},
"peerDependencies": {
- "@microsoft/api-extractor": "^7.36.0",
- "@swc/core": "^1",
- "postcss": "^8.4.12",
- "typescript": ">=4.5.0"
+ "@arethetypeswrong/core": "^0.18.1",
+ "@tsdown/css": "0.23.1",
+ "@tsdown/exe": "0.23.1",
+ "@vitejs/devtools": "*",
+ "publint": "^0.3.8",
+ "tsx": "*",
+ "typescript": "^5.0.0 || ^6.0.0 || ^7.0.0",
+ "unplugin-unused": ">=0.5.0",
+ "unrun": "*"
},
"peerDependenciesMeta": {
- "@microsoft/api-extractor": {
+ "@arethetypeswrong/core": {
+ "optional": true
+ },
+ "@tsdown/css": {
+ "optional": true
+ },
+ "@tsdown/exe": {
+ "optional": true
+ },
+ "@vitejs/devtools": {
"optional": true
},
- "@swc/core": {
+ "publint": {
"optional": true
},
- "postcss": {
+ "tsx": {
"optional": true
},
"typescript": {
"optional": true
+ },
+ "unplugin-unused": {
+ "optional": true
+ },
+ "unrun": {
+ "optional": true
}
}
},
+ "node_modules/tsdown/node_modules/cac": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/cac/-/cac-7.1.0.tgz",
+ "integrity": "sha512-LMDU/U2yA4IPIY8KT0NsNPWEYZvAMkbgyspxJ6btJaYV+WMDOHAZCmB0lsTObiHaRS1V/ztKAl7+TSkTqXyeoA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=20.19.0"
+ }
+ },
+ "node_modules/tsdown/node_modules/obug": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/obug/-/obug-3.0.0.tgz",
+ "integrity": "sha512-5vvB5+W7ePv+p3uqxi+RcW1XAzLW0/hxt3/4X4Lc4qHudzOhmBiBwOY6DRob4WnanAEGvNcLjF+KNOufrUoEQw==",
+ "dev": true,
+ "funding": [
+ "https://github.com/sponsors/sxzz",
+ "https://opencollective.com/debug"
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.20.0"
+ }
+ },
+ "node_modules/tsdown/node_modules/tinyexec": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.3.1.tgz",
+ "integrity": "sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "dev": true,
+ "license": "0BSD"
+ },
"node_modules/tsx": {
"version": "4.23.15",
"resolved": "https://registry.npmjs.org/tsx/-/tsx-4.23.15.tgz",
@@ -10691,13 +9849,6 @@
"typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/ufo": {
- "version": "1.6.4",
- "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.4.tgz",
- "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/unbzip2-stream": {
"version": "1.4.3",
"resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz",
@@ -10709,6 +9860,20 @@
"through": "^2.3.8"
}
},
+ "node_modules/unconfig-core": {
+ "version": "7.5.0",
+ "resolved": "https://registry.npmjs.org/unconfig-core/-/unconfig-core-7.5.0.tgz",
+ "integrity": "sha512-Su3FauozOGP44ZmKdHy2oE6LPjk51M/TRRjHv2HNCWiDvfvCoxC2lno6jevMA91MYAdCdwP05QnWdWpSbncX/w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@quansync/fs": "^1.0.0",
+ "quansync": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
"node_modules/undici-types": {
"version": "8.9.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.9.0.tgz",
@@ -10772,6 +9937,19 @@
"node": ">= 0.8"
}
},
+ "node_modules/verkit": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/verkit/-/verkit-0.5.0.tgz",
+ "integrity": "sha512-u4J1hr6Y+C/hit34GwL3eIcUf3wngT8TlYUjK7tk0jxydKLAq3sYvifjdTDA6U3KCKRcQCQDGf/srjxfZF3l7g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.12.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sxzz"
+ }
+ },
"node_modules/viem": {
"version": "2.57.4",
"resolved": "https://registry.npmjs.org/viem/-/viem-2.57.4.tgz",
@@ -11218,6 +10396,73 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/yuku-ast": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/yuku-ast/-/yuku-ast-0.19.0.tgz",
+ "integrity": "sha512-PyCsiScaelhxBGzL8dyeJkLqvRZycoh78R31Vrt/WqYrm0hMFoKwIw/X7Dx5mBKLWAMlV9I9HEyBOHnj2gZVyw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@yuku-toolchain/types": "^0.19.0"
+ },
+ "engines": {
+ "node": ">=14.18.0"
+ }
+ },
+ "node_modules/yuku-codegen": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/yuku-codegen/-/yuku-codegen-0.19.0.tgz",
+ "integrity": "sha512-uymAKHjDuaP4BEpkXC/BSLz4DUEF5oArZ5AuD3888nb2miChjWSgpPdojEJxm3pjpXkgUaCRJQyNAbnMN33wHg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@yuku-toolchain/types": "^0.19.0"
+ },
+ "engines": {
+ "node": ">=14.18.0"
+ }
+ },
+ "node_modules/yuku-core": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/yuku-core/-/yuku-core-0.19.0.tgz",
+ "integrity": "sha512-kYK9e1XdfirNhkipzW0wmMcSWcVF/CWnuugodfVYRCUwvoBefweL9HzB96OiKEhsx78V5WbUxbJqlizMX869Qg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@yuku-toolchain/types": "^0.19.0"
+ },
+ "engines": {
+ "node": ">=14.18.0"
+ },
+ "optionalDependencies": {
+ "@yuku-core/binding-android-arm64": "0.19.0",
+ "@yuku-core/binding-darwin-arm64": "0.19.0",
+ "@yuku-core/binding-darwin-x64": "0.19.0",
+ "@yuku-core/binding-freebsd-x64": "0.19.0",
+ "@yuku-core/binding-linux-arm-gnu": "0.19.0",
+ "@yuku-core/binding-linux-arm-musl": "0.19.0",
+ "@yuku-core/binding-linux-arm64-gnu": "0.19.0",
+ "@yuku-core/binding-linux-arm64-musl": "0.19.0",
+ "@yuku-core/binding-linux-x64-gnu": "0.19.0",
+ "@yuku-core/binding-linux-x64-musl": "0.19.0",
+ "@yuku-core/binding-win32-arm64": "0.19.0",
+ "@yuku-core/binding-win32-x64": "0.19.0"
+ }
+ },
+ "node_modules/yuku-parser": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/yuku-parser/-/yuku-parser-0.19.0.tgz",
+ "integrity": "sha512-XrBh9ZiQK5mJVRxZBAvD6LwRyAYrK3MFtH3+onyuxFL5hFD44EC3QOmIC1FjTj6H2MMwq46/NAI+NZxLZPZgxg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@yuku-toolchain/types": "^0.19.0",
+ "yuku-core": "0.19.0"
+ },
+ "engines": {
+ "node": ">=14.18.0"
+ }
+ },
"node_modules/zod": {
"version": "4.6.6",
"resolved": "https://registry.npmjs.org/zod/-/zod-4.6.6.tgz",
diff --git a/scw_js/package.json b/scw_js/package.json
index 992bc9f31..6e2dc6092 100644
--- a/scw_js/package.json
+++ b/scw_js/package.json
@@ -8,7 +8,7 @@
"generate:openapi:llm": "tsx scripts/generate-openapi-llm.ts && prettier --write --log-level warn openapi.llm.json",
"generate:openapi:search": "tsx scripts/generate-openapi-search.ts && prettier --write --log-level warn openapi.search.json",
"generate:openapi": "npm run generate:openapi:genimg && npm run generate:openapi:llm && npm run generate:openapi:search",
- "build": "npm run generate:openapi && tsup",
+ "build": "npm run generate:openapi && tsdown",
"predeploy": "npm run fee-allowances",
"deploy": "npm run build && npx osls deploy",
"fee-allowances": "tsx scripts/fee_allowances.ts",
@@ -44,7 +44,7 @@
"fastify": "^5.12.1",
"prettier": "^3.6.2",
"serverless-scaleway-functions": ">=0.5.1",
- "tsup": "^8.5.1",
+ "tsdown": "^0.23.1",
"typescript": "^5.9.3",
"typescript-eslint": "^8.58.2",
"vitest": "^4.1.11"
diff --git a/scw_js/scripts/openapi-codegen.ts b/scw_js/scripts/openapi-codegen.ts
index 58555c49f..0075f2430 100644
--- a/scw_js/scripts/openapi-codegen.ts
+++ b/scw_js/scripts/openapi-codegen.ts
@@ -4,7 +4,7 @@
* Extracted once `openapi.llm.json` became the second spec generated this way (genimg was the
* first). Deliberately a **local module, not a `shared/` package**: the genuinely common surface is
* ~20 lines, and a `shared/` package would add a `file:` build-ordering dependency to this
- * package's deploy path — `build` runs the generators before `tsup`, so an unbuilt shared package
+ * package's deploy path — `build` runs the generators before `tsdown`, so an unbuilt shared package
* would break `npm run build` and `npm run deploy`. Promote it only when a third *package* needs it.
* See `genimg-openai-compat-migration.md` §3.
*
diff --git a/scw_js/test/handler_purity.test.ts b/scw_js/test/handler_purity.test.ts
index e3bed523a..b70752049 100644
--- a/scw_js/test/handler_purity.test.ts
+++ b/scw_js/test/handler_purity.test.ts
@@ -9,7 +9,7 @@ import { fileURLToPath } from "node:url";
* exists only for the local dev servers; when a handler imported it anyway (even inside
* a NODE_ENV=test block), Dependabot reported payment-endpoint CVEs that looked
* production-critical and every triage had to re-verify they were not. The local
- * servers live in dev_server_*.ts, which tsup never bundles.
+ * servers live in dev_server_*.ts, which tsdown never bundles.
*/
const TEST_DIR = path.dirname(fileURLToPath(import.meta.url));
diff --git a/scw_js/tsdown.config.ts b/scw_js/tsdown.config.ts
new file mode 100644
index 000000000..e12ac591d
--- /dev/null
+++ b/scw_js/tsdown.config.ts
@@ -0,0 +1,33 @@
+import { defineConfig } from "tsdown";
+
+export default defineConfig({
+ entry: [
+ "genimg_x402_token.ts",
+ "sc_llm_x402.ts",
+ "llm_x402_cron.ts",
+ "growth_api.ts",
+ "search_api.ts",
+ "mcp_server.ts",
+ ],
+ format: "esm",
+ platform: "node",
+ target: "node22",
+ outDir: "dist",
+ // Emit .js, not .mjs — serverless.yml handlers reference dist/*.js.
+ fixedExtension: false,
+ // Nothing consumes a deployed handler's types; tsconfig's declaration: true
+ // would auto-enable dts, so keep the dist shape tsup produced.
+ dts: false,
+ sourcemap: true,
+ // Minified for cold-start parse time; correlate production stack traces
+ // locally against the sourcemap of the same build (sourcemap: true above).
+ minify: true,
+ // Bundle all npm dependencies (Node built-ins are always external).
+ deps: { alwaysBundle: [/.*/] },
+ // createRequire banner for packages that use dynamic require() (like pino).
+ // The import is aliased: rolldown's own runtime chunks import `createRequire`
+ // unaliased, and a bare re-import in the same file is a SyntaxError.
+ banner: {
+ js: `import { createRequire as __fretchenCr } from 'module'; const require = __fretchenCr(import.meta.url);`,
+ },
+});
diff --git a/scw_js/tsup.config.js b/scw_js/tsup.config.js
deleted file mode 100644
index 1a6f842d5..000000000
--- a/scw_js/tsup.config.js
+++ /dev/null
@@ -1,31 +0,0 @@
-import { defineConfig } from "tsup";
-import { builtinModules } from "module";
-
-export default defineConfig({
- entry: [
- "genimg_x402_token.ts",
- "sc_llm_x402.ts",
- "llm_x402_cron.ts",
- "growth_api.ts",
- "search_api.ts",
- "mcp_server.ts",
- ],
- format: ["esm"],
- platform: "node",
- target: "node22",
- outDir: "dist",
- splitting: false,
- clean: true,
- // Minified for cold-start parse time; correlate production stack traces
- // locally against the sourcemap of the same build (sourcemap: true below).
- minify: true,
- sourcemap: true,
- // Node.js built-ins must be external (async_hooks, fs, path, etc.)
- external: [...builtinModules, ...builtinModules.map((m) => `node:${m}`)],
- // Bundle all npm dependencies
- noExternal: [/.*/],
- // Add createRequire banner for packages that use dynamic require() (like pino)
- banner: {
- js: `import { createRequire } from 'module'; const require = createRequire(import.meta.url);`,
- },
-});
diff --git a/x402_facilitator/package-lock.json b/x402_facilitator/package-lock.json
index 40cbb98cb..29c4498e2 100644
--- a/x402_facilitator/package-lock.json
+++ b/x402_facilitator/package-lock.json
@@ -25,7 +25,7 @@
"eslint": "^10.0.0",
"prettier": "^3.0.0",
"serverless-scaleway-functions": ">=0.4.16",
- "tsup": "^9.0.0",
+ "tsdown": "^0.23.1",
"tsx": "^4.23.13",
"typescript": "^5.9.3",
"typescript-eslint": "^8.60.0",
@@ -962,17 +962,6 @@
}
}
},
- "node_modules/@jridgewell/gen-mapping": {
- "version": "0.3.13",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
- "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/sourcemap-codec": "^1.5.0",
- "@jridgewell/trace-mapping": "^0.3.24"
- }
- },
"node_modules/@jridgewell/resolve-uri": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
@@ -1083,26 +1072,6 @@
"semver": "bin/semver.js"
}
},
- "node_modules/@napi-rs/lzma-linux-x64-gnu": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz",
- "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "libc": [
- "glibc"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^22.20 || ^24.12 || >=25"
- }
- },
"node_modules/@noble/ciphers": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz",
@@ -1234,6 +1203,19 @@
"dev": true,
"license": "BSD-3-Clause"
},
+ "node_modules/@quansync/fs": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@quansync/fs/-/fs-1.1.0.tgz",
+ "integrity": "sha512-qAPG/t3HqML1TlN7sY/pTbEjzFVAKsMjNNMGheyDosro+kT4iw2KCUoHcVdmliwWjorm4elZbgNQyU2eD97eDg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "quansync": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sxzz"
+ }
+ },
"node_modules/@rolldown/binding-android-arm-eabi": {
"version": "1.2.13",
"resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.13.tgz",
@@ -1509,396 +1491,41 @@
},
"node_modules/@rolldown/pluginutils": {
"version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz",
- "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@rollup/rollup-android-arm-eabi": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.64.7.tgz",
- "integrity": "sha512-GFF2tHk0NqYVObrK0+/ps/LEXsV/v2q6Lyiy7mZr+Ej24fpQScvqK2ziz9NHeEQYnKWKym38Ml7dZbPtC9tuAw==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ]
- },
- "node_modules/@rollup/rollup-android-arm64": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.64.7.tgz",
- "integrity": "sha512-BOymcXJFYYXqluDidj6sLelNjXruC3u1BqVxLn2OPCXH9xaPSOTH+MS4uychsGI1NU7tJoiv9KvqijDHFe+hhQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ]
- },
- "node_modules/@rollup/rollup-darwin-arm64": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.64.7.tgz",
- "integrity": "sha512-jgVpGweIbls2H5jfBB70tnX52abMd5pJr3xmtoDILx6JdmGl+Un+tMb9R+MbHPVB46tTBpY8emtn7M71SnQhEQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ]
- },
- "node_modules/@rollup/rollup-darwin-x64": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.64.7.tgz",
- "integrity": "sha512-AVMpt94mrXH7WjyWKmd9nT4RC5yM0AN3Lt6A89xVIsuLDi3dDX6dxMytLbW36FlppY9JsoqUoS3LUUpUrYxiMQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ]
- },
- "node_modules/@rollup/rollup-freebsd-arm64": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.64.7.tgz",
- "integrity": "sha512-Nje29c/MyajxRNFGU05oyeTDS6SWdMg/wWMSlZSBTBju5BKz2NVc0kFiFSQGzRELNiB+CBk/ZvAVsWsENgjGag==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ]
- },
- "node_modules/@rollup/rollup-freebsd-x64": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.64.7.tgz",
- "integrity": "sha512-xxgN5/kMzCNz/NYJ4t49B0/WS6InNlWv6xvgwUQqNnWM9WJMMwMUGWrAxdNEgYWdHL0sMnuh8I87StGrIMTA+w==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.64.7.tgz",
- "integrity": "sha512-5U/9gVn/X657I8+NHoHO9Wnfyd0lEXwqbslobRoB9TC8SwYzOitcIr6TLE7531Q/NWs3L4mb+YOGzlf3vHIeYw==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "libc": [
- "glibc"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm-musleabihf": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.64.7.tgz",
- "integrity": "sha512-hcDS0a/Y8ggM3dcOfzH7UpSaogCViWTtNDSl0EXpWIj8g8/r86ITqptjil2hayTXS0Umzb+Yt3mjgpQVFVf2+A==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "libc": [
- "musl"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm64-gnu": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.64.7.tgz",
- "integrity": "sha512-awbAr4N7Qd/yjZAQBEEPzgcPveYG2Gi5L6gq1/Bp+3SMRjn5F68Wv1zKsntzvvoioBR6yKvhLtWqu11am1TsxA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "libc": [
- "glibc"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm64-musl": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.64.7.tgz",
- "integrity": "sha512-Ut7xQJfeLhzu2yN3rHzVvL9ccyPJvN4aCdP1V7hJ5lGxX/eCzgB9SiMk/Md3J+rWWZgvoYsDW4BUFggJr32pBA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "libc": [
- "musl"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-loong64-gnu": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.64.7.tgz",
- "integrity": "sha512-trqoni/vHkuM5oo5iQhoKPh6fjjD7E80pMgCXWgGxU8vSRPUlwvG8GeYvEEcB6eJAxNa99WH9iVHPHelgtKiHA==",
- "cpu": [
- "loong64"
- ],
- "dev": true,
- "libc": [
- "glibc"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-loong64-musl": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.64.7.tgz",
- "integrity": "sha512-gvlUy0XFIwtUWiQmhc+4GT2Knm3KosinpUVhr7CtTFA78gFDnE5NWwMPzHrJsYpKkh2LlY7yvBIboN1FAV6Xeg==",
- "cpu": [
- "loong64"
- ],
- "dev": true,
- "libc": [
- "musl"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-ppc64-gnu": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.64.7.tgz",
- "integrity": "sha512-8yS/kSXTJ/47Z62JW+C2AJ3vd/8zZw016vFjtNpZwmZlwJumLua4s1i78dkYuSSqQ+0aIMxJcBp/4uIwp2ehjA==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
- "libc": [
- "glibc"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-ppc64-musl": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.64.7.tgz",
- "integrity": "sha512-mxVSKvvty0hOP1AFo/l4Kpv3i3HK0zx4rYUrirZDToYlWhS3xzmIkq3vUJ7rtrM2cPyXveDyDT6M1FfXZ9hTRA==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
- "libc": [
- "musl"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-riscv64-gnu": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.64.7.tgz",
- "integrity": "sha512-lEse1zra1CagM+uHH2bl28GInDsZZ45NJzHei2OMaXQFzZWKBO1hFo07rS0xB6ayV4WU360UrSmPDSyCMpYsUQ==",
- "cpu": [
- "riscv64"
- ],
- "dev": true,
- "libc": [
- "glibc"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-riscv64-musl": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.64.7.tgz",
- "integrity": "sha512-d/cqCoiG9WMZ5VuJZ5Qdlv9g97QyoGwnmvHccvGhKSacTy7xFrAS+jMcJSBdMNOw1oacSkl6p7K6O/DRYTKL3g==",
- "cpu": [
- "riscv64"
- ],
- "dev": true,
- "libc": [
- "musl"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-s390x-gnu": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.64.7.tgz",
- "integrity": "sha512-kVEA//CeDOZZP1XCH2JBgqXb9+ALlwuA/4civaazMVdgzaSQC9WM38w65zG/LLk0lA7F9Od19CSBZW7J9mCbNg==",
- "cpu": [
- "s390x"
- ],
- "dev": true,
- "libc": [
- "glibc"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-x64-gnu": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.64.7.tgz",
- "integrity": "sha512-14oLfDsOSr0TSntT/34jRg/V8B2XW/Jomh9zX9CjIM9gwwNlI1OCymS/GVn0DV32h67eRf7U0GGem0rvfXgNwQ==",
- "cpu": [
- "x64"
- ],
- "libc": [
- "glibc"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-x64-musl": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.64.7.tgz",
- "integrity": "sha512-dFVtPfjZqAnUPpPY4Bfg+87yo1IBW9HiY8iCFtg49Pn46MfZTebSHZh8PL6SOsgyt9LQP8Nj/sE6jm3aWpySmQ==",
- "cpu": [
- "x64"
- ],
- "libc": [
- "musl"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-openbsd-x64": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.64.7.tgz",
- "integrity": "sha512-Dm9CZ2SM3u2NgvBj4awW/gGqkOwzH8f6MSYIJE6+bKcKLI+T0+LhpD6vtetTfrIIx+rLXDf5RJqBP6v7V5O+wg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "openbsd"
- ]
- },
- "node_modules/@rollup/rollup-openharmony-arm64": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.64.7.tgz",
- "integrity": "sha512-oaxsvS2mL6+78741CT2HCORBvy1USg3Wqpt5qvZwy3aMXRMl4zxyDo8maeFRWJkF3dp0Wbi71fKH5Gr9YI3vYA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "openharmony"
- ]
- },
- "node_modules/@rollup/rollup-win32-arm64-msvc": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.64.7.tgz",
- "integrity": "sha512-UKZz1Y4mxUqkWh60uH7B1aZn6UcAimPk4ipRktpb3wfZq7JrzZYyAXTwiafkb3T+kd5P3Sf+vzcRdsDks4WtjQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@rollup/rollup-win32-ia32-msvc": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.64.7.tgz",
- "integrity": "sha512-WWkSuC1J+mZJnsDh0mRaCAFSWfQdl6y3fDjZeWElI6zHo8CcOSG5lY3yurKJjEq+FrX0WD60sFrVVpbHqzMmrw==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ]
+ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz",
+ "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==",
+ "dev": true,
+ "license": "MIT"
},
- "node_modules/@rollup/rollup-win32-x64-gnu": {
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
"version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.64.7.tgz",
- "integrity": "sha512-u9bp2yXCI3/BUjUxY6uWknAY32pfvvDCPysyUTySotx0dj3ydlFHrRQYfn/b/kZgnfjyEwySMtI7Ga054uiysQ==",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.64.7.tgz",
+ "integrity": "sha512-14oLfDsOSr0TSntT/34jRg/V8B2XW/Jomh9zX9CjIM9gwwNlI1OCymS/GVn0DV32h67eRf7U0GGem0rvfXgNwQ==",
"cpu": [
"x64"
],
- "dev": true,
+ "libc": [
+ "glibc"
+ ],
"license": "MIT",
"optional": true,
"os": [
- "win32"
+ "linux"
]
},
- "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "node_modules/@rollup/rollup-linux-x64-musl": {
"version": "4.64.7",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.64.7.tgz",
- "integrity": "sha512-EhX6N3XPMEnVU5cRfNgzPOKcSucsbu3nNNWuoAaEuKIqmddBKHN5b9d4rPe65T1I+FaOT176JKiZNsUBp3rqbA==",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.64.7.tgz",
+ "integrity": "sha512-dFVtPfjZqAnUPpPY4Bfg+87yo1IBW9HiY8iCFtg49Pn46MfZTebSHZh8PL6SOsgyt9LQP8Nj/sE6jm3aWpySmQ==",
"cpu": [
"x64"
],
- "dev": true,
+ "libc": [
+ "musl"
+ ],
"license": "MIT",
"optional": true,
"os": [
- "win32"
+ "linux"
]
},
"node_modules/@scaleway/serverless-functions": {
@@ -2568,6 +2195,199 @@
"url": "https://github.com/sponsors/colinhacks"
}
},
+ "node_modules/@yuku-core/binding-android-arm64": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/@yuku-core/binding-android-arm64/-/binding-android-arm64-0.19.0.tgz",
+ "integrity": "sha512-wdL2XmTiZixAOaHk9Z0JJZ8u9Qm8d333Zjpc6gaxXFX+UR5BlsfxZ7a2+2Rm71pamppsPYGUGFq2oVLbh6DISw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@yuku-core/binding-darwin-arm64": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/@yuku-core/binding-darwin-arm64/-/binding-darwin-arm64-0.19.0.tgz",
+ "integrity": "sha512-7sNJa6XJhyetnTy64jw3NEi4YgUcezHk1G5GH9FSvXAuC8wIlbaOwT9lgq5qo5sspjrZJQlBR1TWflP49uRpMw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@yuku-core/binding-darwin-x64": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/@yuku-core/binding-darwin-x64/-/binding-darwin-x64-0.19.0.tgz",
+ "integrity": "sha512-pTC7dYEc59isdyizc3nsuyFNBu2LU5wMYZ1be6UMr59PY/AJNtO1aBLWV0MgL/z7C1nv/2sX4TNjGgKLoeevJw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@yuku-core/binding-freebsd-x64": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/@yuku-core/binding-freebsd-x64/-/binding-freebsd-x64-0.19.0.tgz",
+ "integrity": "sha512-xrZjF6XOEwyLOiDIfrwDdRCS6ghxcJeirNC1KivQhVcUwlRonaU79S3/Uiyx3lBylPnT8qKJ3/aMT+H52nGTJQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@yuku-core/binding-linux-arm-gnu": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/@yuku-core/binding-linux-arm-gnu/-/binding-linux-arm-gnu-0.19.0.tgz",
+ "integrity": "sha512-0OyIH53C0I1CbADHn9FSdCfX5qbpeLwJhmOVhonFJNYheybOnkSJ50qGMfTJIb8y5zrwqvLs7FVBvz6Fk8maZg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@yuku-core/binding-linux-arm-musl": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/@yuku-core/binding-linux-arm-musl/-/binding-linux-arm-musl-0.19.0.tgz",
+ "integrity": "sha512-z/iPfkCOCSXE34VXNt0uP1ORSW+4mEa9b5CiJcWZeqZH08g49bFU/jRM2T04f+Wpw5mJ6HIzNBiojxeAbrHjeg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@yuku-core/binding-linux-arm64-gnu": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/@yuku-core/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.19.0.tgz",
+ "integrity": "sha512-jLNTi+gzaRwBJ+gwhCJ+rDb5dmx/8hEBx93UWd7hjMSqPTL1D1wvVSvXVAldV5kALvju7b0/m51EHEhs4+I1fA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@yuku-core/binding-linux-arm64-musl": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/@yuku-core/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.19.0.tgz",
+ "integrity": "sha512-YwyPIdW/rN2Fmv0MTFWi47FaB3F9g+2b+sJISyAw83Yd60RWH4T3Nx6XkAHHVN+uKJNBAd6So7/BVihSiFYvuQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@yuku-core/binding-linux-x64-gnu": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/@yuku-core/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.19.0.tgz",
+ "integrity": "sha512-/vskaAXVX3ESR43FiTdfiYS7z1b9uoQJwVQ/0RgUHgN2sWoAyCZs+aX4CgU7eKGIHTVfp9VFwv+c+2XchYiEtQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@yuku-core/binding-linux-x64-musl": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/@yuku-core/binding-linux-x64-musl/-/binding-linux-x64-musl-0.19.0.tgz",
+ "integrity": "sha512-FuXL5igeSKib9Rye02TdH+D6SQezTyGxIATMu1Qsn/QywrzwpGl35OLpS2C1x5vpGLeVE2XgiLd5mVPFHmIglQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@yuku-core/binding-win32-arm64": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/@yuku-core/binding-win32-arm64/-/binding-win32-arm64-0.19.0.tgz",
+ "integrity": "sha512-YuJAe7zEKT1Xa7LuHlhGJpPnYQeVtvo0rZvNjJRqkH0hQGOw4C8QeP30Tg5VKGzZfo2x8CjhjEhKt4TmLwfmdg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@yuku-core/binding-win32-x64": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/@yuku-core/binding-win32-x64/-/binding-win32-x64-0.19.0.tgz",
+ "integrity": "sha512-o8iY/mXwlRkedp0LNTr4+TEfXTPQwoNZmv6k+1WIAd1ZXEn8xJJTBCtB0osaVvdZo/x/cNmV16UrWrrGpM5Mvw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@yuku-toolchain/types": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/@yuku-toolchain/types/-/types-0.19.0.tgz",
+ "integrity": "sha512-tFkNbsP4WXX9UMUC5syJGdK9dPMLK0PPaIuXCcCYH75sZ8MrebfBZ2XvCILRTw8AgLivSSCfDa4R67iYBDa4Kg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/abbrev": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
@@ -2770,13 +2590,6 @@
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "node_modules/any-promise": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
- "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/aproba": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/aproba/-/aproba-2.1.0.tgz",
@@ -3089,22 +2902,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/bundle-require": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.1.0.tgz",
- "integrity": "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "load-tsconfig": "^0.2.3"
- },
- "engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
- },
- "peerDependencies": {
- "esbuild": ">=0.18"
- }
- },
"node_modules/cac": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/cac/-/cac-7.1.0.tgz",
@@ -3268,22 +3065,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/chokidar": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz",
- "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "readdirp": "^5.0.0"
- },
- "engines": {
- "node": ">= 20.19.0"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
- }
- },
"node_modules/chownr": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
@@ -3534,23 +3315,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/confbox": {
- "version": "0.1.8",
- "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz",
- "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/consola": {
- "version": "3.4.2",
- "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz",
- "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "^14.18.0 || >=16.10.0"
- }
- },
"node_modules/console-control-strings": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
@@ -3918,6 +3682,13 @@
"node": ">=8"
}
},
+ "node_modules/defu": {
+ "version": "6.1.7",
+ "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz",
+ "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
@@ -4007,6 +3778,27 @@
"url": "https://dotenvx.com"
}
},
+ "node_modules/dts-resolver": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/dts-resolver/-/dts-resolver-3.0.0.tgz",
+ "integrity": "sha512-1T1f+z+4tl9XD+m+0HBgWoL/nm0bOIffyWaUuUSBlFg/86IWvfx+wjNaO/ybU0AJzG9/Mi5hBUgGV6zCmWEN7Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^22.18.0 || >=24.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sxzz"
+ },
+ "peerDependencies": {
+ "oxc-resolver": ">=11.0.0"
+ },
+ "peerDependenciesMeta": {
+ "oxc-resolver": {
+ "optional": true
+ }
+ }
+ },
"node_modules/dunder-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
@@ -4040,6 +3832,16 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/empathic": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/empathic/-/empathic-2.1.0.tgz",
+ "integrity": "sha512-AnfC1ATldl49/cvZdLPDjBfrRNwbDO05aibiOtzQu3qtlbJtomNLhF30HEtn/7iBz50dlMECqATo3fG0LrdEgw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ }
+ },
"node_modules/end-of-stream": {
"version": "1.4.5",
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz",
@@ -4859,18 +4661,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/fix-dts-default-cjs-exports": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/fix-dts-default-cjs-exports/-/fix-dts-default-cjs-exports-1.0.1.tgz",
- "integrity": "sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "magic-string": "^0.30.17",
- "mlly": "^1.7.4",
- "rollup": "^4.34.8"
- }
- },
"node_modules/flat-cache": {
"version": "6.1.23",
"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.23.tgz",
@@ -5123,6 +4913,22 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/get-tsconfig": {
+ "version": "5.0.0-beta.6",
+ "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-5.0.0-beta.6.tgz",
+ "integrity": "sha512-X6fBC0pmImC70gvX2zm56go9hx0MyoGVdG0tUCkg/D+Xnh5TJsOZ7iDbOdI3PvmtrDxnu1YdDufpK2QJX1Meqw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "resolve-pkg-maps": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=20.20.0"
+ },
+ "funding": {
+ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1"
+ }
+ },
"node_modules/glob": {
"version": "7.2.3",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
@@ -5320,6 +5126,13 @@
"node": ">= 0.4"
}
},
+ "node_modules/hookable": {
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/hookable/-/hookable-6.1.2.tgz",
+ "integrity": "sha512-+abwxtiEA52GCVIsQqut3S/uKTbUwYIp4Pe/vv+6py5XiXBCqMZHg6pA6Y5qhgLSEys0/cYuPbO0z1QFj5ZCmg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/hookified": {
"version": "1.15.1",
"resolved": "https://registry.npmjs.org/hookified/-/hookified-1.15.1.tgz",
@@ -5417,6 +5230,19 @@
"node": ">= 4"
}
},
+ "node_modules/import-without-cache": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/import-without-cache/-/import-without-cache-0.4.1.tgz",
+ "integrity": "sha512-vXoV9PjKHEednCUu01e98TkImxy67e3BJXbTIOmIq4Hyzw3IAwYRcuPkfeTzJzwyyts4kjuA73x+pWJLc4f86A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^22.18.0 || >=24.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sxzz"
+ }
+ },
"node_modules/imurmurhash": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
@@ -5693,20 +5519,10 @@
"license": "BSD-3-Clause",
"dependencies": {
"html-escaper": "^2.0.0",
- "istanbul-lib-report": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/joycon": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz",
- "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==",
- "dev": true,
- "license": "MIT",
+ "istanbul-lib-report": "^3.0.0"
+ },
"engines": {
- "node": ">=10"
+ "node": ">=8"
}
},
"node_modules/js-tokens": {
@@ -6086,36 +5902,6 @@
"url": "https://opencollective.com/parcel"
}
},
- "node_modules/lilconfig": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
- "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/sponsors/antonk52"
- }
- },
- "node_modules/lines-and-columns": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
- "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/load-tsconfig": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz",
- "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
- }
- },
"node_modules/locate-path": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
@@ -6442,19 +6228,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/mlly": {
- "version": "1.8.2",
- "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz",
- "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "acorn": "^8.16.0",
- "pathe": "^2.0.3",
- "pkg-types": "^1.3.1",
- "ufo": "^1.6.3"
- }
- },
"node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
@@ -6469,18 +6242,6 @@
"dev": true,
"license": "ISC"
},
- "node_modules/mz": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
- "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "any-promise": "^1.0.0",
- "object-assign": "^4.0.1",
- "thenify-all": "^1.0.0"
- }
- },
"node_modules/nan": {
"version": "2.29.0",
"resolved": "https://registry.npmjs.org/nan/-/nan-2.29.0.tgz",
@@ -7004,28 +6765,6 @@
],
"license": "MIT"
},
- "node_modules/pirates": {
- "version": "4.0.7",
- "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz",
- "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/pkg-types": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz",
- "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "confbox": "^0.1.8",
- "mlly": "^1.7.4",
- "pathe": "^2.0.1"
- }
- },
"node_modules/possible-typed-array-names": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz",
@@ -7065,49 +6804,6 @@
"node": "^10 || ^12 || >=14"
}
},
- "node_modules/postcss-load-config": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz",
- "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "lilconfig": "^3.1.1"
- },
- "engines": {
- "node": ">= 18"
- },
- "peerDependencies": {
- "jiti": ">=1.21.0",
- "postcss": ">=8.0.9",
- "tsx": "^4.8.1",
- "yaml": "^2.4.2"
- },
- "peerDependenciesMeta": {
- "jiti": {
- "optional": true
- },
- "postcss": {
- "optional": true
- },
- "tsx": {
- "optional": true
- },
- "yaml": {
- "optional": true
- }
- }
- },
"node_modules/prelude-ls": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
@@ -7267,6 +6963,23 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/quansync": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/quansync/-/quansync-1.0.0.tgz",
+ "integrity": "sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/antfu"
+ },
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/sxzz"
+ }
+ ],
+ "license": "MIT"
+ },
"node_modules/quick-format-unescaped": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz",
@@ -7360,20 +7073,6 @@
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
}
},
- "node_modules/readdirp": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz",
- "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 20.19.0"
- },
- "funding": {
- "type": "individual",
- "url": "https://paulmillr.com/funding/"
- }
- },
"node_modules/real-require": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz",
@@ -7410,14 +7109,14 @@
"dev": true,
"license": "MIT"
},
- "node_modules/resolve-from": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
- "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "node_modules/resolve-pkg-maps": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz",
+ "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==",
"dev": true,
"license": "MIT",
- "engines": {
- "node": ">=8"
+ "funding": {
+ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1"
}
},
"node_modules/responselike": {
@@ -7526,50 +7225,64 @@
"@rolldown/binding-win32-x64-msvc": "1.2.13"
}
},
- "node_modules/rollup": {
- "version": "4.64.7",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.64.7.tgz",
- "integrity": "sha512-aCiJONoZp0lNGJ6sYqspLkh6UXaWEey/7Ko2TZyXQ4kgzAhDUxAgbt/oulXKmD+zFHXw1k+RF6ZZWOrjp7DZnQ==",
+ "node_modules/rolldown-plugin-dts": {
+ "version": "0.28.8",
+ "resolved": "https://registry.npmjs.org/rolldown-plugin-dts/-/rolldown-plugin-dts-0.28.8.tgz",
+ "integrity": "sha512-FVhfqxorCWcc20BVT5eVRfRjzLLl6mgzjcMR4gSBf0K4oQMXT0qoHhhzfXy0L7y83fQy7Ug5ZDNk90xM3/LiCQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@types/estree": "1.0.9"
- },
- "bin": {
- "rollup": "dist/bin/rollup"
+ "dts-resolver": "^3.0.0",
+ "get-tsconfig": "5.0.0-beta.6",
+ "obug": "^3.0.0",
+ "yuku-ast": "^0.19.0",
+ "yuku-codegen": "^0.19.0",
+ "yuku-parser": "^0.19.0"
},
"engines": {
- "node": ">=18.0.0",
- "npm": ">=8.0.0"
+ "node": "^22.18.0 || ^24.11.0 || >=26.0.0"
},
- "optionalDependencies": {
- "@napi-rs/lzma-linux-x64-gnu": "1.5.1",
- "@rollup/rollup-android-arm-eabi": "4.64.7",
- "@rollup/rollup-android-arm64": "4.64.7",
- "@rollup/rollup-darwin-arm64": "4.64.7",
- "@rollup/rollup-darwin-x64": "4.64.7",
- "@rollup/rollup-freebsd-arm64": "4.64.7",
- "@rollup/rollup-freebsd-x64": "4.64.7",
- "@rollup/rollup-linux-arm-gnueabihf": "4.64.7",
- "@rollup/rollup-linux-arm-musleabihf": "4.64.7",
- "@rollup/rollup-linux-arm64-gnu": "4.64.7",
- "@rollup/rollup-linux-arm64-musl": "4.64.7",
- "@rollup/rollup-linux-loong64-gnu": "4.64.7",
- "@rollup/rollup-linux-loong64-musl": "4.64.7",
- "@rollup/rollup-linux-ppc64-gnu": "4.64.7",
- "@rollup/rollup-linux-ppc64-musl": "4.64.7",
- "@rollup/rollup-linux-riscv64-gnu": "4.64.7",
- "@rollup/rollup-linux-riscv64-musl": "4.64.7",
- "@rollup/rollup-linux-s390x-gnu": "4.64.7",
- "@rollup/rollup-linux-x64-gnu": "4.64.7",
- "@rollup/rollup-linux-x64-musl": "4.64.7",
- "@rollup/rollup-openbsd-x64": "4.64.7",
- "@rollup/rollup-openharmony-arm64": "4.64.7",
- "@rollup/rollup-win32-arm64-msvc": "4.64.7",
- "@rollup/rollup-win32-ia32-msvc": "4.64.7",
- "@rollup/rollup-win32-x64-gnu": "4.64.7",
- "@rollup/rollup-win32-x64-msvc": "4.64.7",
- "fsevents": "~2.3.2"
+ "funding": {
+ "url": "https://github.com/sponsors/sxzz"
+ },
+ "peerDependencies": {
+ "@typescript/native-preview": "*",
+ "@volar/typescript": "~2.4.0",
+ "@vue/language-core": "~3.2.0 || ~3.3.0",
+ "rolldown": "^1.2.0",
+ "typescript": "^5.0.0 || ^6.0.0 || ~7.0.0",
+ "vue-tsc": "~3.2.0 || ~3.3.0"
+ },
+ "peerDependenciesMeta": {
+ "@typescript/native-preview": {
+ "optional": true
+ },
+ "@volar/typescript": {
+ "optional": true
+ },
+ "@vue/language-core": {
+ "optional": true
+ },
+ "typescript": {
+ "optional": true
+ },
+ "vue-tsc": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/rolldown-plugin-dts/node_modules/obug": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/obug/-/obug-3.0.0.tgz",
+ "integrity": "sha512-5vvB5+W7ePv+p3uqxi+RcW1XAzLW0/hxt3/4X4Lc4qHudzOhmBiBwOY6DRob4WnanAEGvNcLjF+KNOufrUoEQw==",
+ "dev": true,
+ "funding": [
+ "https://github.com/sponsors/sxzz",
+ "https://opencollective.com/debug"
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.20.0"
}
},
"node_modules/run-async": {
@@ -7952,39 +7665,6 @@
"url": "https://github.com/sponsors/Borewit"
}
},
- "node_modules/sucrase": {
- "version": "3.35.1",
- "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz",
- "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/gen-mapping": "^0.3.2",
- "commander": "^4.0.0",
- "lines-and-columns": "^1.1.6",
- "mz": "^2.7.0",
- "pirates": "^4.0.1",
- "tinyglobby": "^0.2.11",
- "ts-interface-checker": "^0.1.9"
- },
- "bin": {
- "sucrase": "bin/sucrase",
- "sucrase-node": "bin/sucrase-node"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
- }
- },
- "node_modules/sucrase/node_modules/commander": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
- "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 6"
- }
- },
"node_modules/supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
@@ -8124,29 +7804,6 @@
"safe-buffer": "~5.1.0"
}
},
- "node_modules/thenify": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
- "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "any-promise": "^1.0.0"
- }
- },
- "node_modules/thenify-all": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
- "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "thenify": ">= 3.1.0 < 4"
- },
- "engines": {
- "node": ">=0.8"
- }
- },
"node_modules/thread-stream": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.2.0.tgz",
@@ -8317,74 +7974,79 @@
"typescript": ">=4.8.4"
}
},
- "node_modules/ts-interface-checker": {
- "version": "0.1.13",
- "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
- "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
- "dev": true,
- "license": "Apache-2.0"
- },
- "node_modules/tslib": {
- "version": "2.8.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
- "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
- "dev": true,
- "license": "0BSD"
- },
- "node_modules/tsup": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/tsup/-/tsup-9.0.0.tgz",
- "integrity": "sha512-DHgb0bfo2gFKybOa8dRFMiHSqzWWhMkfNK0f902VVquWQtDBWExNgidHszjjDKaFd12pWPgzumpWf9nGr3gzFg==",
+ "node_modules/tsdown": {
+ "version": "0.23.1",
+ "resolved": "https://registry.npmjs.org/tsdown/-/tsdown-0.23.1.tgz",
+ "integrity": "sha512-MSC2WSOts3in95J334/VIS7KPfor3eCSvndJ6KdoVj9Aak9Kh1aNfz9ws5owhdukuTNSXRdfkPEzA/ihpDD6SA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "bundle-require": "^5.1.0",
- "cac": "^7.1.0",
- "chokidar": "^5.0.0",
- "consola": "^3.4.2",
- "esbuild": "^0.28.2",
- "fix-dts-default-cjs-exports": "^1.0.1",
- "joycon": "^3.1.1",
+ "cac": "^7.0.1",
+ "defu": "^6.1.7",
+ "empathic": "^2.1.0",
+ "hookable": "^6.1.2",
+ "import-without-cache": "^0.4.1",
"obug": "^3.0.0",
- "picocolors": "^1.1.1",
- "postcss-load-config": "^6.0.1",
- "resolve-from": "^5.0.0",
- "rollup": "^4.64.6",
- "source-map-js": "^1.2.2",
- "sucrase": "^3.35.1",
+ "picomatch": "^4.0.7",
+ "rolldown": "~1.2.13",
+ "rolldown-plugin-dts": "^0.28.7",
"tinyexec": "^1.3.1",
"tinyglobby": "^0.2.17",
- "tree-kill": "^1.2.2"
+ "tree-kill": "^1.2.2",
+ "unconfig-core": "^7.5.0",
+ "verkit": "^0.5.0"
},
"bin": {
- "tsup": "dist/cli-default.js",
- "tsup-node": "dist/cli-node.js"
+ "tsdown": "dist/run.mjs"
},
"engines": {
"node": "^22.18.0 || ^24.11.0 || >=26.0.0"
},
+ "funding": {
+ "url": "https://github.com/sponsors/sxzz"
+ },
"peerDependencies": {
- "@microsoft/api-extractor": "^7.36.0",
- "@swc/core": "^1",
- "postcss": "^8.4.12",
- "typescript": ">=4.5.0"
+ "@arethetypeswrong/core": "^0.18.1",
+ "@tsdown/css": "0.23.1",
+ "@tsdown/exe": "0.23.1",
+ "@vitejs/devtools": "*",
+ "publint": "^0.3.8",
+ "tsx": "*",
+ "typescript": "^5.0.0 || ^6.0.0 || ^7.0.0",
+ "unplugin-unused": ">=0.5.0",
+ "unrun": "*"
},
"peerDependenciesMeta": {
- "@microsoft/api-extractor": {
+ "@arethetypeswrong/core": {
+ "optional": true
+ },
+ "@tsdown/css": {
"optional": true
},
- "@swc/core": {
+ "@tsdown/exe": {
"optional": true
},
- "postcss": {
+ "@vitejs/devtools": {
+ "optional": true
+ },
+ "publint": {
+ "optional": true
+ },
+ "tsx": {
"optional": true
},
"typescript": {
"optional": true
+ },
+ "unplugin-unused": {
+ "optional": true
+ },
+ "unrun": {
+ "optional": true
}
}
},
- "node_modules/tsup/node_modules/obug": {
+ "node_modules/tsdown/node_modules/obug": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/obug/-/obug-3.0.0.tgz",
"integrity": "sha512-5vvB5+W7ePv+p3uqxi+RcW1XAzLW0/hxt3/4X4Lc4qHudzOhmBiBwOY6DRob4WnanAEGvNcLjF+KNOufrUoEQw==",
@@ -8398,6 +8060,13 @@
"node": ">=12.20.0"
}
},
+ "node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "dev": true,
+ "license": "0BSD"
+ },
"node_modules/tsx": {
"version": "4.23.15",
"resolved": "https://registry.npmjs.org/tsx/-/tsx-4.23.15.tgz",
@@ -8510,13 +8179,6 @@
"typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/ufo": {
- "version": "1.6.4",
- "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.4.tgz",
- "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/unbzip2-stream": {
"version": "1.4.3",
"resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz",
@@ -8528,6 +8190,20 @@
"through": "^2.3.8"
}
},
+ "node_modules/unconfig-core": {
+ "version": "7.5.0",
+ "resolved": "https://registry.npmjs.org/unconfig-core/-/unconfig-core-7.5.0.tgz",
+ "integrity": "sha512-Su3FauozOGP44ZmKdHy2oE6LPjk51M/TRRjHv2HNCWiDvfvCoxC2lno6jevMA91MYAdCdwP05QnWdWpSbncX/w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@quansync/fs": "^1.0.0",
+ "quansync": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
"node_modules/undici-types": {
"version": "7.24.6",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz",
@@ -8573,6 +8249,19 @@
"uuid": "dist/bin/uuid"
}
},
+ "node_modules/verkit": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/verkit/-/verkit-0.5.0.tgz",
+ "integrity": "sha512-u4J1hr6Y+C/hit34GwL3eIcUf3wngT8TlYUjK7tk0jxydKLAq3sYvifjdTDA6U3KCKRcQCQDGf/srjxfZF3l7g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.12.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sxzz"
+ }
+ },
"node_modules/viem": {
"version": "2.57.4",
"resolved": "https://registry.npmjs.org/viem/-/viem-2.57.4.tgz",
@@ -9011,6 +8700,73 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/yuku-ast": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/yuku-ast/-/yuku-ast-0.19.0.tgz",
+ "integrity": "sha512-PyCsiScaelhxBGzL8dyeJkLqvRZycoh78R31Vrt/WqYrm0hMFoKwIw/X7Dx5mBKLWAMlV9I9HEyBOHnj2gZVyw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@yuku-toolchain/types": "^0.19.0"
+ },
+ "engines": {
+ "node": ">=14.18.0"
+ }
+ },
+ "node_modules/yuku-codegen": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/yuku-codegen/-/yuku-codegen-0.19.0.tgz",
+ "integrity": "sha512-uymAKHjDuaP4BEpkXC/BSLz4DUEF5oArZ5AuD3888nb2miChjWSgpPdojEJxm3pjpXkgUaCRJQyNAbnMN33wHg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@yuku-toolchain/types": "^0.19.0"
+ },
+ "engines": {
+ "node": ">=14.18.0"
+ }
+ },
+ "node_modules/yuku-core": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/yuku-core/-/yuku-core-0.19.0.tgz",
+ "integrity": "sha512-kYK9e1XdfirNhkipzW0wmMcSWcVF/CWnuugodfVYRCUwvoBefweL9HzB96OiKEhsx78V5WbUxbJqlizMX869Qg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@yuku-toolchain/types": "^0.19.0"
+ },
+ "engines": {
+ "node": ">=14.18.0"
+ },
+ "optionalDependencies": {
+ "@yuku-core/binding-android-arm64": "0.19.0",
+ "@yuku-core/binding-darwin-arm64": "0.19.0",
+ "@yuku-core/binding-darwin-x64": "0.19.0",
+ "@yuku-core/binding-freebsd-x64": "0.19.0",
+ "@yuku-core/binding-linux-arm-gnu": "0.19.0",
+ "@yuku-core/binding-linux-arm-musl": "0.19.0",
+ "@yuku-core/binding-linux-arm64-gnu": "0.19.0",
+ "@yuku-core/binding-linux-arm64-musl": "0.19.0",
+ "@yuku-core/binding-linux-x64-gnu": "0.19.0",
+ "@yuku-core/binding-linux-x64-musl": "0.19.0",
+ "@yuku-core/binding-win32-arm64": "0.19.0",
+ "@yuku-core/binding-win32-x64": "0.19.0"
+ }
+ },
+ "node_modules/yuku-parser": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/yuku-parser/-/yuku-parser-0.19.0.tgz",
+ "integrity": "sha512-XrBh9ZiQK5mJVRxZBAvD6LwRyAYrK3MFtH3+onyuxFL5hFD44EC3QOmIC1FjTj6H2MMwq46/NAI+NZxLZPZgxg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@yuku-toolchain/types": "^0.19.0",
+ "yuku-core": "0.19.0"
+ },
+ "engines": {
+ "node": ">=14.18.0"
+ }
+ },
"node_modules/zod": {
"version": "4.5.4",
"resolved": "https://registry.npmjs.org/zod/-/zod-4.5.4.tgz",
diff --git a/x402_facilitator/package.json b/x402_facilitator/package.json
index 1cd28f3d8..eacbe0e40 100644
--- a/x402_facilitator/package.json
+++ b/x402_facilitator/package.json
@@ -6,7 +6,7 @@
"main": "dist/x402_facilitator.js",
"scripts": {
"generate:openapi": "tsx scripts/generate-openapi.ts && prettier --write --log-level warn openapi.json",
- "build": "npm run generate:openapi && tsup",
+ "build": "npm run generate:openapi && tsdown",
"predev": "npm run build",
"dev": "NODE_ENV=test node dist/x402_facilitator.js",
"test": "vitest run",
@@ -51,7 +51,7 @@
"eslint": "^10.0.0",
"prettier": "^3.0.0",
"serverless-scaleway-functions": ">=0.4.16",
- "tsup": "^9.0.0",
+ "tsdown": "^0.23.1",
"tsx": "^4.23.13",
"typescript": "^5.9.3",
"typescript-eslint": "^8.60.0",
diff --git a/x402_facilitator/serverless.yml b/x402_facilitator/serverless.yml
index 77c3c070d..9ed35927f 100644
--- a/x402_facilitator/serverless.yml
+++ b/x402_facilitator/serverless.yml
@@ -47,7 +47,7 @@ plugins:
package:
patterns:
# Exclude everything, then include ONLY the bundled runtime output.
- # (tsup inlines all deps into dist/*.js, so nothing else is needed at runtime.)
+ # (tsdown inlines all deps into dist/*.js, so nothing else is needed at runtime.)
# This is robust: it won't accidentally package new large dirs like
# notebooks/node_modules (created by Deno), which previously bloated the
# upload archive past Scaleway's limit.
diff --git a/x402_facilitator/test/no_stray_js.test.ts b/x402_facilitator/test/no_stray_js.test.ts
index b9f77ac12..768401c66 100644
--- a/x402_facilitator/test/no_stray_js.test.ts
+++ b/x402_facilitator/test/no_stray_js.test.ts
@@ -21,7 +21,6 @@ const SKIP = new Set(["node_modules", "dist", "coverage", ".serverless", "notebo
// The only `.js` files this package intentionally keeps, as paths relative to ROOT.
const ALLOWED_JS = new Set([
"eslint.config.js",
- "tsup.config.js",
"vitest.config.js",
"vitest.integration.config.js",
"x402_splitter_facilitator.js",
diff --git a/x402_facilitator/tsdown.config.ts b/x402_facilitator/tsdown.config.ts
new file mode 100644
index 000000000..51cf19438
--- /dev/null
+++ b/x402_facilitator/tsdown.config.ts
@@ -0,0 +1,28 @@
+import { defineConfig } from "tsdown";
+
+export default defineConfig({
+ // x402_splitter_facilitator.js is deliberately absent: the buyer-pays splitter is
+ // retired (see README → Fee model history). No function in serverless.yml routes to it,
+ // but `package: dist/**` means anything built here still ships in the deploy archive.
+ entry: ["x402_facilitator.ts", "wallet_report_cron.ts"],
+ format: "esm",
+ platform: "node",
+ target: "node22",
+ outDir: "dist",
+ // Emit .js, not .mjs — package.json main and the dev script reference dist/*.js.
+ fixedExtension: false,
+ // Nothing consumes a deployed handler's types; tsconfig's declaration: true
+ // would auto-enable dts, so keep the dist shape tsup produced.
+ dts: false,
+ sourcemap: true,
+ // Keep readable for debugging
+ minify: false,
+ // Bundle all npm dependencies (Node built-ins are always external).
+ deps: { alwaysBundle: [/.*/] },
+ // createRequire banner for packages that use dynamic require() (like pino).
+ // The import is aliased: rolldown's own runtime chunks import `createRequire`
+ // unaliased, and a bare re-import in the same file is a SyntaxError.
+ banner: {
+ js: `import { createRequire as __fretchenCr } from 'module'; const require = __fretchenCr(import.meta.url);`,
+ },
+});
diff --git a/x402_facilitator/tsup.config.js b/x402_facilitator/tsup.config.js
deleted file mode 100644
index dfab562eb..000000000
--- a/x402_facilitator/tsup.config.js
+++ /dev/null
@@ -1,26 +0,0 @@
-import { defineConfig } from "tsup";
-import { builtinModules } from "module";
-
-export default defineConfig({
- // x402_splitter_facilitator.js is deliberately absent: the buyer-pays splitter is
- // retired (see README → Fee model history). No function in serverless.yml routes to it,
- // but `package: dist/**` means anything built here still ships in the deploy archive.
- entry: ["x402_facilitator.ts", "wallet_report_cron.ts"],
- format: ["esm"],
- platform: "node",
- target: "node22",
- outDir: "dist",
- splitting: false,
- clean: true,
- // Keep readable for debugging
- minify: false,
- sourcemap: true,
- // Node.js built-ins must be external (async_hooks, fs, path, etc.)
- external: [...builtinModules, ...builtinModules.map((m) => `node:${m}`)],
- // Bundle all npm dependencies
- noExternal: [/.*/],
- // Add createRequire banner for packages that use dynamic require() (like pino)
- banner: {
- js: `import { createRequire } from 'module'; const require = createRequire(import.meta.url);`,
- },
-});
diff --git a/x402_facilitator/x402_splitter_facilitator.js b/x402_facilitator/x402_splitter_facilitator.js
index 53a0ed0e9..34cf4666c 100644
--- a/x402_facilitator/x402_splitter_facilitator.js
+++ b/x402_facilitator/x402_splitter_facilitator.js
@@ -9,7 +9,7 @@
* See README → "Fee model history" for why the merchant-pays model won.
*
* Not deployed and not built: no function in `serverless.yml` routes here, and it is
- * excluded from the tsup `entry` list so it does not ship in the deploy archive.
+ * excluded from the tsdown `entry` list so it does not ship in the deploy archive.
*
* Retained, not dead: this is a working implementation of the alternative, and the
* contract at 0x7e67bf96ADbf4a813DD7b0A3Ca3060a937018946 (Optimism Sepolia) is referenced
diff --git a/x402_facilitator/x402_splitter_settle.js b/x402_facilitator/x402_splitter_settle.js
index 86d6d9866..68c4461b1 100644
--- a/x402_facilitator/x402_splitter_settle.js
+++ b/x402_facilitator/x402_splitter_settle.js
@@ -9,7 +9,7 @@
* See README → "Fee model history" for why the merchant-pays model won.
*
* Not deployed and not built: no function in `serverless.yml` routes here, and it is
- * excluded from the tsup `entry` list so it does not ship in the deploy archive.
+ * excluded from the tsdown `entry` list so it does not ship in the deploy archive.
*
* Retained, not dead: this is a working implementation of the alternative, and the
* contract at 0x7e67bf96ADbf4a813DD7b0A3Ca3060a937018946 (Optimism Sepolia) is referenced
diff --git a/x402_facilitator/x402_splitter_supported.js b/x402_facilitator/x402_splitter_supported.js
index 52dcee871..1799b37d7 100644
--- a/x402_facilitator/x402_splitter_supported.js
+++ b/x402_facilitator/x402_splitter_supported.js
@@ -9,7 +9,7 @@
* See README → "Fee model history" for why the merchant-pays model won.
*
* Not deployed and not built: no function in `serverless.yml` routes here, and it is
- * excluded from the tsup `entry` list so it does not ship in the deploy archive.
+ * excluded from the tsdown `entry` list so it does not ship in the deploy archive.
*
* Retained, not dead: this is a working implementation of the alternative, and the
* contract at 0x7e67bf96ADbf4a813DD7b0A3Ca3060a937018946 (Optimism Sepolia) is referenced
diff --git a/x402_facilitator/x402_splitter_verify.js b/x402_facilitator/x402_splitter_verify.js
index f5eece758..20fa7dec3 100644
--- a/x402_facilitator/x402_splitter_verify.js
+++ b/x402_facilitator/x402_splitter_verify.js
@@ -9,7 +9,7 @@
* See README → "Fee model history" for why the merchant-pays model won.
*
* Not deployed and not built: no function in `serverless.yml` routes here, and it is
- * excluded from the tsup `entry` list so it does not ship in the deploy archive.
+ * excluded from the tsdown `entry` list so it does not ship in the deploy archive.
*
* Retained, not dead: this is a working implementation of the alternative, and the
* contract at 0x7e67bf96ADbf4a813DD7b0A3Ca3060a937018946 (Optimism Sepolia) is referenced