diff --git a/.changeset/nice-foxes-cheat.md b/.changeset/nice-foxes-cheat.md new file mode 100644 index 0000000000..2544bf09fe --- /dev/null +++ b/.changeset/nice-foxes-cheat.md @@ -0,0 +1,5 @@ +--- +"ensapi": patch +--- + +Add example responses to autogenerated openapi doc diff --git a/.changeset/smooth-foxes-boil.md b/.changeset/smooth-foxes-boil.md new file mode 100644 index 0000000000..a4db1c098a --- /dev/null +++ b/.changeset/smooth-foxes-boil.md @@ -0,0 +1,5 @@ +--- +"@ensnode/ensnode-sdk": patch +--- + +Moved examples to separate file to reuse them in ensapi, such that we can test examples in ensnode-sdk with schema parsing and show them in openapi docs diff --git a/apps/ensapi/src/handlers/api/explore/name-tokens-api.routes.ts b/apps/ensapi/src/handlers/api/explore/name-tokens-api.routes.ts index 01a1c773f4..e3b918f00a 100644 --- a/apps/ensapi/src/handlers/api/explore/name-tokens-api.routes.ts +++ b/apps/ensapi/src/handlers/api/explore/name-tokens-api.routes.ts @@ -1,9 +1,16 @@ import { createRoute, z } from "@hono/zod-openapi"; import { - ErrorResponseSchema, + errorResponseBadRequestExample, + errorResponseInternalServerErrorExample, + makeErrorResponseSchema, + makeNameTokensResponseErrorNameTokensNotIndexedSchema, + makeNameTokensResponseErrorSchema, makeNameTokensResponseSchema, makeNodeSchema, + nameTokensNotIndexedExample, + nameTokensResponseOkExample, + nameTokensServiceUnavailableExample, } from "@ensnode/ensnode-sdk/internal"; import { params } from "@/lib/handlers/params.schema"; @@ -42,7 +49,9 @@ export const getNameTokensRoute = createRoute({ description: "Name tokens known", content: { "application/json": { - schema: makeNameTokensResponseSchema("Name Tokens Response", true), + schema: makeNameTokensResponseSchema("Name Tokens Response", true).openapi({ + example: nameTokensResponseOkExample, + }), }, }, }, @@ -50,7 +59,7 @@ export const getNameTokensRoute = createRoute({ description: "Invalid input", content: { "application/json": { - schema: ErrorResponseSchema, + schema: makeErrorResponseSchema().openapi({ example: errorResponseBadRequestExample }), }, }, }, @@ -58,7 +67,9 @@ export const getNameTokensRoute = createRoute({ description: "Name tokens not indexed", content: { "application/json": { - schema: makeNameTokensResponseSchema("Name Tokens Response", true), + schema: makeNameTokensResponseErrorNameTokensNotIndexedSchema().openapi({ + example: nameTokensNotIndexedExample, + }), }, }, }, @@ -66,7 +77,9 @@ export const getNameTokensRoute = createRoute({ description: "Internal server error", content: { "application/json": { - schema: ErrorResponseSchema, + schema: makeErrorResponseSchema().openapi({ + example: errorResponseInternalServerErrorExample, + }), }, }, }, @@ -75,11 +88,11 @@ export const getNameTokensRoute = createRoute({ "Service unavailable - Name Tokens API prerequisites not met (indexing status not ready or required plugins not activated)", content: { "application/json": { - schema: makeNameTokensResponseSchema("Name Tokens Response", true), + schema: makeNameTokensResponseErrorSchema().openapi({ + example: nameTokensServiceUnavailableExample, + }), }, }, }, }, }); - -export const routes = [getNameTokensRoute]; diff --git a/apps/ensapi/src/handlers/api/explore/name-tokens-api.ts b/apps/ensapi/src/handlers/api/explore/name-tokens-api.ts index 7e5a733771..4c96521dcb 100644 --- a/apps/ensapi/src/handlers/api/explore/name-tokens-api.ts +++ b/apps/ensapi/src/handlers/api/explore/name-tokens-api.ts @@ -11,7 +11,9 @@ import { type NameTokensRequest, NameTokensResponseCodes, NameTokensResponseErrorCodes, + type NameTokensResponseErrorIndexingStatusUnsupported, type NameTokensResponseErrorNameTokensNotIndexed, + type NameTokensResponseOk, type PluginName, serializeNameTokensResponse, } from "@ensnode/ensnode-sdk"; @@ -59,7 +61,7 @@ app.openapi(getNameTokensRoute, async (c) => { details: "Indexing status has not yet reached the required state to enable the Name Tokens API.", }, - }), + } satisfies NameTokensResponseErrorIndexingStatusUnsupported), 503, ); } @@ -78,7 +80,7 @@ app.openapi(getNameTokensRoute, async (c) => { makeNameTokensNotIndexedResponse( `The 'name' param must not be ENS Root, no tokens exist for it.`, ), - ), + ) satisfies NameTokensResponseErrorNameTokensNotIndexed, 404, ); } @@ -95,7 +97,7 @@ app.openapi(getNameTokensRoute, async (c) => { makeNameTokensNotIndexedResponse( `This ENSNode instance has not been configured to index tokens for the requested name: '${name}'`, ), - ), + ) satisfies NameTokensResponseErrorNameTokensNotIndexed, 404, ); } @@ -125,7 +127,7 @@ app.openapi(getNameTokensRoute, async (c) => { makeNameTokensNotIndexedResponse( `No Name Tokens were indexed by this ENSNode instance for the requested ${errorMessageSubject}.`, ), - ), + ) satisfies NameTokensResponseErrorNameTokensNotIndexed, 404, ); } @@ -134,7 +136,7 @@ app.openapi(getNameTokensRoute, async (c) => { serializeNameTokensResponse({ responseCode: NameTokensResponseCodes.Ok, registeredNameTokens, - }), + } satisfies NameTokensResponseOk), 200, ); }); diff --git a/apps/ensapi/src/handlers/api/explore/registrar-actions-api.routes.ts b/apps/ensapi/src/handlers/api/explore/registrar-actions-api.routes.ts index 6c42f2823f..712fbb5017 100644 --- a/apps/ensapi/src/handlers/api/explore/registrar-actions-api.routes.ts +++ b/apps/ensapi/src/handlers/api/explore/registrar-actions-api.routes.ts @@ -6,10 +6,15 @@ import { RegistrarActionsOrders, } from "@ensnode/ensnode-sdk"; import { + errorResponseBadRequestExample, + makeErrorResponseSchema, makeNodeSchema, makeNormalizedAddressSchema, makePositiveIntegerSchema, + makeRegistrarActionsResponseErrorSchema, + makeSerializedRegistrarActionsResponseOkSchema, makeUnixTimestampSchema, + registrarActionsResponseOkExample, } from "@ensnode/ensnode-sdk/internal"; import { params } from "@/lib/handlers/params.schema"; @@ -59,12 +64,14 @@ export const registrarActionsQuerySchema = z .pipe(z.coerce.number()) .pipe(makeUnixTimestampSchema("beginTimestamp")) .optional() + .openapi({ type: "integer" }) .describe("Filter actions at or after this Unix timestamp"), endTimestamp: params.queryParam .pipe(z.coerce.number()) .pipe(makeUnixTimestampSchema("endTimestamp")) .optional() + .openapi({ type: "integer" }) .describe("Filter actions at or before this Unix timestamp"), }) .refine( @@ -96,12 +103,29 @@ export const getRegistrarActionsRoute = createRoute({ responses: { 200: { description: "Successfully retrieved registrar actions", + content: { + "application/json": { + schema: makeSerializedRegistrarActionsResponseOkSchema().openapi({ + example: registrarActionsResponseOkExample, + }), + }, + }, }, 400: { description: "Invalid query", + content: { + "application/json": { + schema: makeErrorResponseSchema().openapi({ example: errorResponseBadRequestExample }), + }, + }, }, 500: { description: "Internal server error", + content: { + "application/json": { + schema: makeRegistrarActionsResponseErrorSchema("Registrar Actions Error Response"), + }, + }, }, }, }); @@ -125,14 +149,33 @@ export const getRegistrarActionsByParentNodeRoute = createRoute({ responses: { 200: { description: "Successfully retrieved registrar actions", + content: { + "application/json": { + schema: makeSerializedRegistrarActionsResponseOkSchema( + "Registrar Actions By ParentNode Response", + ).openapi({ + example: registrarActionsResponseOkExample, + }), + }, + }, }, 400: { description: "Invalid input", + content: { + "application/json": { + schema: makeErrorResponseSchema().openapi({ example: errorResponseBadRequestExample }), + }, + }, }, 500: { description: "Internal server error", + content: { + "application/json": { + schema: makeRegistrarActionsResponseErrorSchema( + "Registrar Actions By ParentNode Error Response", + ), + }, + }, }, }, }); - -export const routes = [getRegistrarActionsRoute, getRegistrarActionsByParentNodeRoute]; diff --git a/apps/ensapi/src/handlers/api/explore/registrar-actions-api.ts b/apps/ensapi/src/handlers/api/explore/registrar-actions-api.ts index 5b0a48892b..89cd1414fa 100644 --- a/apps/ensapi/src/handlers/api/explore/registrar-actions-api.ts +++ b/apps/ensapi/src/handlers/api/explore/registrar-actions-api.ts @@ -122,6 +122,7 @@ app.openapi(getRegistrarActionsRoute, async (c) => { pageContext, accurateAsOf, } satisfies RegistrarActionsResponseOk), + 200, ); } catch (error) { const errorMessage = error instanceof Error ? error.message : "Unknown error"; @@ -196,6 +197,7 @@ app.openapi(getRegistrarActionsByParentNodeRoute, async (c) => { pageContext, accurateAsOf, } satisfies RegistrarActionsResponseOk), + 200, ); } catch (error) { const errorMessage = error instanceof Error ? error.message : "Unknown error"; diff --git a/apps/ensapi/src/handlers/api/meta/realtime-api.routes.ts b/apps/ensapi/src/handlers/api/meta/realtime-api.routes.ts index 91fc7f3cff..601752ee3c 100644 --- a/apps/ensapi/src/handlers/api/meta/realtime-api.routes.ts +++ b/apps/ensapi/src/handlers/api/meta/realtime-api.routes.ts @@ -46,5 +46,3 @@ export const realtimeGetMeta = createRoute({ }, }, }); - -export const routes = [realtimeGetMeta]; diff --git a/apps/ensapi/src/handlers/api/meta/status-api.routes.ts b/apps/ensapi/src/handlers/api/meta/status-api.routes.ts index 0b7b9970dc..370d9b4f2c 100644 --- a/apps/ensapi/src/handlers/api/meta/status-api.routes.ts +++ b/apps/ensapi/src/handlers/api/meta/status-api.routes.ts @@ -33,5 +33,3 @@ export const getIndexingStatusRoute = createRoute({ }, }, }); - -export const routes = [getIndexingStatusRoute]; diff --git a/apps/ensapi/src/handlers/api/resolution/resolution-api.routes.ts b/apps/ensapi/src/handlers/api/resolution/resolution-api.routes.ts index d22fd91d77..ea49de7b2b 100644 --- a/apps/ensapi/src/handlers/api/resolution/resolution-api.routes.ts +++ b/apps/ensapi/src/handlers/api/resolution/resolution-api.routes.ts @@ -1,9 +1,16 @@ import { createRoute, z } from "@hono/zod-openapi"; import { + errorResponseInternalServerErrorExample, + errorResponseInvalidAddressExample, + errorResponseInvalidNameExample, + makeErrorResponseSchema, makeResolvePrimaryNameResponseSchema, makeResolvePrimaryNamesResponseSchema, makeResolveRecordsResponseSchema, + resolvePrimaryNameResponseExample, + resolvePrimaryNamesResponseExample, + resolveRecordsResponseExample, } from "@ensnode/ensnode-sdk/internal"; import { params } from "@/lib/handlers/params.schema"; @@ -28,7 +35,27 @@ export const resolveRecordsRoute = createRoute({ description: "Successfully resolved records", content: { "application/json": { - schema: makeResolveRecordsResponseSchema(), + schema: makeResolveRecordsResponseSchema().openapi({ + example: resolveRecordsResponseExample, + }), + }, + }, + }, + 400: { + description: "Invalid name or query parameters", + content: { + "application/json": { + schema: makeErrorResponseSchema().openapi({ example: errorResponseInvalidNameExample }), + }, + }, + }, + 500: { + description: "Internal server error", + content: { + "application/json": { + schema: makeErrorResponseSchema().openapi({ + example: errorResponseInternalServerErrorExample, + }), }, }, }, @@ -57,7 +84,29 @@ export const resolvePrimaryNameRoute = createRoute({ description: "Successfully resolved name", content: { "application/json": { - schema: makeResolvePrimaryNameResponseSchema(), + schema: makeResolvePrimaryNameResponseSchema().openapi({ + example: resolvePrimaryNameResponseExample, + }), + }, + }, + }, + 400: { + description: "Invalid address or chain ID", + content: { + "application/json": { + schema: makeErrorResponseSchema().openapi({ + example: errorResponseInvalidAddressExample, + }), + }, + }, + }, + 500: { + description: "Internal server error", + content: { + "application/json": { + schema: makeErrorResponseSchema().openapi({ + example: errorResponseInternalServerErrorExample, + }), }, }, }, @@ -86,11 +135,31 @@ export const resolvePrimaryNamesRoute = createRoute({ description: "Successfully resolved records", content: { "application/json": { - schema: makeResolvePrimaryNamesResponseSchema(), + schema: makeResolvePrimaryNamesResponseSchema().openapi({ + example: resolvePrimaryNamesResponseExample, + }), + }, + }, + }, + 400: { + description: "Invalid address or chain IDs", + content: { + "application/json": { + schema: makeErrorResponseSchema().openapi({ + example: errorResponseInvalidAddressExample, + }), + }, + }, + }, + 500: { + description: "Internal server error", + content: { + "application/json": { + schema: makeErrorResponseSchema().openapi({ + example: errorResponseInternalServerErrorExample, + }), }, }, }, }, }); - -export const routes = [resolveRecordsRoute, resolvePrimaryNameRoute, resolvePrimaryNamesRoute]; diff --git a/apps/ensapi/src/handlers/api/resolution/resolution-api.ts b/apps/ensapi/src/handlers/api/resolution/resolution-api.ts index edfce56114..b864731b4e 100644 --- a/apps/ensapi/src/handlers/api/resolution/resolution-api.ts +++ b/apps/ensapi/src/handlers/api/resolution/resolution-api.ts @@ -64,7 +64,7 @@ app.openapi(resolveRecordsRoute, async (c) => { ...(showTrace && { trace }), } satisfies ResolveRecordsResponse; - return c.json(response); + return c.json(response, 200); }); /** @@ -96,7 +96,7 @@ app.openapi(resolvePrimaryNameRoute, async (c) => { ...(showTrace && { trace }), } satisfies ResolvePrimaryNameResponse; - return c.json(response); + return c.json(response, 200); }); /** @@ -112,7 +112,6 @@ app.openapi(resolvePrimaryNamesRoute, async (c) => { const { address } = c.req.valid("param"); const { chainIds, trace: showTrace, accelerate } = c.req.valid("query"); const canAccelerate = c.var.canAccelerate; - const { result, trace } = await runWithTrace(() => resolvePrimaryNames(address, chainIds, { accelerate, canAccelerate }), ); @@ -125,7 +124,7 @@ app.openapi(resolvePrimaryNamesRoute, async (c) => { ...(showTrace && { trace }), } satisfies ResolvePrimaryNamesResponse; - return c.json(response); + return c.json(response, 200); }); export default app; diff --git a/apps/ensapi/src/lib/handlers/params.schema.ts b/apps/ensapi/src/lib/handlers/params.schema.ts index 489ad728f4..a911128cc0 100644 --- a/apps/ensapi/src/lib/handlers/params.schema.ts +++ b/apps/ensapi/src/lib/handlers/params.schema.ts @@ -32,22 +32,68 @@ const stringarray = z const name = z .string() .refine(isNormalizedName, "Must be normalized, see https://docs.ens.domains/resolution/names/") - .transform((val) => val as Name); - -const trace = z.optional(boolstring).default(false).openapi({ default: false }); -const accelerate = z.optional(boolstring).default(false).openapi({ default: false }); -const address = makeNormalizedAddressSchema(); -const defaultableChainId = makeDefaultableChainIdStringSchema(); + .transform((val) => val as Name) + .describe("ENS name to resolve (e.g. 'vitalik.eth'). Must be normalized per ENSIP-15."); + +const trace = z + .optional(boolstring) + .default(false) + .describe( + "Include detailed OpenTelemetry trace information about the resolution in the response.", + ) + .openapi({ default: false }); + +const accelerate = z + .optional(boolstring) + .default(false) + .describe("Attempt Protocol Acceleration using indexed data.") + .openapi({ + default: false, + }); +const address = makeNormalizedAddressSchema().describe( + "EVM wallet address (e.g. '0xd8da6bf26964af9d7eed9e03e53415d37aa96045').", +); +const defaultableChainId = makeDefaultableChainIdStringSchema().describe( + "Chain ID as a string (e.g. '1' for Ethereum mainnet). Use '0' for the default EVM chain.", +); const coinType = makeCoinTypeStringSchema(); -const chainIdsWithoutDefaultChainId = z.optional( - stringarray.pipe(z.array(defaultableChainId.pipe(excludingDefaultChainId))), -); +const chainIdsWithoutDefaultChainId = z + .optional(stringarray.pipe(z.array(defaultableChainId.pipe(excludingDefaultChainId)))) + .describe("Comma-separated list of chain IDs to resolve primary names for (e.g. '1,10,8453')."); + +const nameParamDescription = + "Whether to include the reverse name record in the response," + + "see ENSIP-3 (https://docs.ens.domains/ensip/3#resolver-interface). " + + "Resolving the reverse 'name' resolver record is relevant as an internal implementation detail of the ENS reverse resolution process " + + "where the primary ENS name associated with an address is being determined through a multi-step resolution process. " + + "For example, querying the (unvalidated!) reverse 'name' resolver record for Vitalik's address (0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045) " + + "is achieved by resolving the reverse 'name' resolver record of the reverse name 'd8da6bf26964af9d7eed9e03e53415d37aa96045.addr.reverse' " + + "which (at the time of writing) returns 'vitalik.eth'. " + + "The ENS reverse resolution process requires that any reverse 'name' resolver record must also pass a forward-resolution validation " + + "to be represented as the primary name for an address. " + + "More details here: https://docs.ens.domains/web/reverse"; const rawSelectionParams = z.object({ - name: z.string().optional(), - addresses: z.string().optional(), - texts: z.string().optional(), + name: z + .string() + .optional() + .describe(nameParamDescription) + .openapi({ + enum: ["true", "false"], + }), + addresses: z + .string() + .optional() + .describe( + "Comma-separated list of coin types to resolve addresses for (e.g. '60' for ETH, '2147483658' for OP).", + ), + texts: z + .string() + .optional() + .describe( + "Comma-separated list of text record keys to resolve (e.g. 'avatar,description,url').", + ), }); const selectionFields = z.object({ diff --git a/docs/ensnode.io/ensapi-openapi.json b/docs/ensnode.io/ensapi-openapi.json index 0ee68499fb..1e73071d5f 100644 --- a/docs/ensnode.io/ensapi-openapi.json +++ b/docs/ensnode.io/ensapi-openapi.json @@ -1079,19 +1079,38 @@ "summary": "Resolve ENS Records", "description": "Resolves ENS records for a given name", "parameters": [ - { "schema": { "type": "string" }, "required": true, "name": "name", "in": "path" }, + { + "schema": { + "type": "string", + "description": "ENS name to resolve (e.g. 'vitalik.eth'). Must be normalized per ENSIP-15." + }, + "required": true, + "description": "ENS name to resolve (e.g. 'vitalik.eth'). Must be normalized per ENSIP-15.", + "name": "name", + "in": "path" + }, { "schema": { "type": "boolean" }, "required": false, "name": "name", "in": "query" }, { "schema": { "type": "string" }, "required": false, "name": "addresses", "in": "query" }, { "schema": { "type": "string" }, "required": false, "name": "texts", "in": "query" }, { - "schema": { "type": "boolean", "default": false }, + "schema": { + "type": "boolean", + "description": "Include detailed OpenTelemetry trace information about the resolution in the response.", + "default": false + }, "required": false, + "description": "Include detailed OpenTelemetry trace information about the resolution in the response.", "name": "trace", "in": "query" }, { - "schema": { "type": "boolean", "default": false }, + "schema": { + "type": "boolean", + "description": "Attempt Protocol Acceleration using indexed data.", + "default": false + }, "required": false, + "description": "Attempt Protocol Acceleration using indexed data.", "name": "accelerate", "in": "query" } @@ -1122,7 +1141,53 @@ "accelerationAttempted": { "type": "boolean" }, "trace": { "type": "array", "items": {} } }, - "required": ["records", "accelerationRequested", "accelerationAttempted"] + "required": ["records", "accelerationRequested", "accelerationAttempted"], + "example": { + "records": { + "addresses": { "60": "0xd8da6bf26964af9d7eed9e03e53415d37aa96045" }, + "texts": { "description": "mi pinxe lo crino tcati" } + }, + "accelerationRequested": false, + "accelerationAttempted": false + } + } + } + } + }, + "400": { + "description": "Invalid name or query parameters", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { "message": { "type": "string" }, "details": {} }, + "required": ["message"], + "example": { + "message": "Invalid Input", + "details": { + "errors": [], + "properties": { + "name": { + "errors": [ + "Must be normalized, see https://docs.ens.domains/resolution/names/" + ] + } + } + } + } + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { "message": { "type": "string" }, "details": {} }, + "required": ["message"], + "example": { "message": "Internal Server Error" } } } } @@ -1137,17 +1202,45 @@ "summary": "Resolve Primary Name", "description": "Resolves a primary name for a given `address` and `chainId`", "parameters": [ - { "schema": { "type": "string" }, "required": true, "name": "address", "in": "path" }, - { "schema": { "type": "string" }, "required": true, "name": "chainId", "in": "path" }, { - "schema": { "type": "boolean", "default": false }, + "schema": { + "type": "string", + "description": "EVM wallet address (e.g. '0xd8da6bf26964af9d7eed9e03e53415d37aa96045')." + }, + "required": true, + "description": "EVM wallet address (e.g. '0xd8da6bf26964af9d7eed9e03e53415d37aa96045').", + "name": "address", + "in": "path" + }, + { + "schema": { + "type": "string", + "description": "Chain ID as a string (e.g. '1' for Ethereum mainnet). Use '0' for the default EVM chain." + }, + "required": true, + "description": "Chain ID as a string (e.g. '1' for Ethereum mainnet). Use '0' for the default EVM chain.", + "name": "chainId", + "in": "path" + }, + { + "schema": { + "type": "boolean", + "description": "Include detailed OpenTelemetry trace information about the resolution in the response.", + "default": false + }, "required": false, + "description": "Include detailed OpenTelemetry trace information about the resolution in the response.", "name": "trace", "in": "query" }, { - "schema": { "type": "boolean", "default": false }, + "schema": { + "type": "boolean", + "description": "Attempt Protocol Acceleration using indexed data.", + "default": false + }, "required": false, + "description": "Attempt Protocol Acceleration using indexed data.", "name": "accelerate", "in": "query" } @@ -1165,7 +1258,46 @@ "accelerationAttempted": { "type": "boolean" }, "trace": { "type": "array", "items": {} } }, - "required": ["name", "accelerationRequested", "accelerationAttempted"] + "required": ["name", "accelerationRequested", "accelerationAttempted"], + "example": { + "name": "jesse.base.eth", + "accelerationRequested": false, + "accelerationAttempted": false + } + } + } + } + }, + "400": { + "description": "Invalid address or chain ID", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { "message": { "type": "string" }, "details": {} }, + "required": ["message"], + "example": { + "message": "Invalid Input", + "details": { + "errors": [], + "properties": { + "address": { "errors": ["EVM address must be a valid EVM address"] } + } + } + } + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { "message": { "type": "string" }, "details": {} }, + "required": ["message"], + "example": { "message": "Internal Server Error" } } } } @@ -1180,17 +1312,45 @@ "summary": "Resolve Primary Names", "description": "Resolves all primary names for a given address across multiple chains", "parameters": [ - { "schema": { "type": "string" }, "required": true, "name": "address", "in": "path" }, - { "schema": { "type": "string" }, "required": false, "name": "chainIds", "in": "query" }, { - "schema": { "type": "boolean", "default": false }, + "schema": { + "type": "string", + "description": "EVM wallet address (e.g. '0xd8da6bf26964af9d7eed9e03e53415d37aa96045')." + }, + "required": true, + "description": "EVM wallet address (e.g. '0xd8da6bf26964af9d7eed9e03e53415d37aa96045').", + "name": "address", + "in": "path" + }, + { + "schema": { + "type": "string", + "description": "Comma-separated list of chain IDs to resolve primary names for (e.g. '1,10,8453')." + }, + "required": false, + "description": "Comma-separated list of chain IDs to resolve primary names for (e.g. '1,10,8453').", + "name": "chainIds", + "in": "query" + }, + { + "schema": { + "type": "boolean", + "description": "Include detailed OpenTelemetry trace information about the resolution in the response.", + "default": false + }, "required": false, + "description": "Include detailed OpenTelemetry trace information about the resolution in the response.", "name": "trace", "in": "query" }, { - "schema": { "type": "boolean", "default": false }, + "schema": { + "type": "boolean", + "description": "Attempt Protocol Acceleration using indexed data.", + "default": false + }, "required": false, + "description": "Attempt Protocol Acceleration using indexed data.", "name": "accelerate", "in": "query" } @@ -1211,7 +1371,53 @@ "accelerationAttempted": { "type": "boolean" }, "trace": { "type": "array", "items": {} } }, - "required": ["names", "accelerationRequested", "accelerationAttempted"] + "required": ["names", "accelerationRequested", "accelerationAttempted"], + "example": { + "names": { + "1": "jesse.base.eth", + "10": null, + "8453": "jesse.base.eth", + "42161": null, + "59144": null, + "534352": null + }, + "accelerationRequested": false, + "accelerationAttempted": false + } + } + } + } + }, + "400": { + "description": "Invalid address or chain IDs", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { "message": { "type": "string" }, "details": {} }, + "required": ["message"], + "example": { + "message": "Invalid Input", + "details": { + "errors": [], + "properties": { + "address": { "errors": ["EVM address must be a valid EVM address"] } + } + } + } + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { "message": { "type": "string" }, "details": {} }, + "required": ["message"], + "example": { "message": "Internal Server Error" } } } } @@ -1438,7 +1644,36 @@ } ] } - ] + ], + "example": { + "responseCode": "ok", + "registeredNameTokens": { + "domainId": "0xee6c4522aab0003e8d14cd40a6af439055fd2577951148c14b6cea9a53475835", + "name": "vitalik.eth", + "tokens": [ + { + "token": { + "assetNamespace": "erc721", + "contract": { + "chainId": 1, + "address": "0x57f1887a8bf19b14fc0df6fd9b2acc9af147ea85" + }, + "tokenId": "0xaf2caa1c2ca1d027f1ac823b529d0a67cd144264b2789fa2ea4d63a67c7103cc" + }, + "ownership": { + "ownershipType": "fully-onchain", + "owner": { + "chainId": 1, + "address": "0x220866b1a2219f40e72f5c628b65d54268ca3a9d" + } + }, + "mintStatus": "minted" + } + ], + "expiresAt": 2461152330, + "accurateAsOf": 1700000000 + } + } } } } @@ -1450,13 +1685,56 @@ "schema": { "type": "object", "properties": { "message": { "type": "string" }, "details": {} }, - "required": ["message"] + "required": ["message"], + "example": { "message": "Invalid Input" } } } } }, "404": { "description": "Name tokens not indexed", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "responseCode": { "type": "string", "enum": ["error"] }, + "errorCode": { "type": "string", "enum": ["name-tokens-not-indexed"] }, + "error": { + "type": "object", + "properties": { "message": { "type": "string" }, "details": {} }, + "required": ["message"] + } + }, + "required": ["responseCode", "errorCode", "error"], + "additionalProperties": false, + "example": { + "responseCode": "error", + "errorCode": "name-tokens-not-indexed", + "error": { + "message": "No indexed Name Tokens found", + "details": "This ENSNode instance has not been configured to index tokens for the requested name: 'vitalik.eth'" + } + } + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { "message": { "type": "string" }, "details": {} }, + "required": ["message"], + "example": { "message": "Internal Server Error" } + } + } + } + }, + "503": { + "description": "Service unavailable - Name Tokens API prerequisites not met (indexing status not ready or required plugins not activated)", "content": { "application/json": { "schema": { @@ -1464,260 +1742,176 @@ { "type": "object", "properties": { - "responseCode": { "type": "string", "enum": ["ok"] }, - "registeredNameTokens": { + "responseCode": { "type": "string", "enum": ["error"] }, + "errorCode": { "type": "string", "enum": ["name-tokens-not-indexed"] }, + "error": { "type": "object", - "properties": { - "domainId": { "type": "string" }, - "name": { "type": "string" }, - "tokens": { - "type": "array", - "items": { - "type": "object", - "properties": { - "token": { - "type": "object", - "properties": { - "assetNamespace": { - "type": "string", - "enum": ["erc721", "erc1155"] - }, - "contract": { - "type": "object", - "properties": { - "chainId": { "type": "integer", "exclusiveMinimum": 0 }, - "address": { "type": "string" } - }, - "required": ["chainId", "address"], - "additionalProperties": false - }, - "tokenId": { "type": "string" } - }, - "required": ["assetNamespace", "contract", "tokenId"] - }, - "ownership": { - "oneOf": [ - { - "type": "object", - "properties": { - "ownershipType": { - "type": "string", - "enum": ["namewrapper"] - }, - "owner": { - "type": "object", - "properties": { - "chainId": { - "type": "integer", - "exclusiveMinimum": 0 - }, - "address": { "type": "string" } - }, - "required": ["chainId", "address"], - "additionalProperties": false - } - }, - "required": ["ownershipType", "owner"] - }, - { - "type": "object", - "properties": { - "ownershipType": { - "type": "string", - "enum": ["fully-onchain"] - }, - "owner": { - "type": "object", - "properties": { - "chainId": { - "type": "integer", - "exclusiveMinimum": 0 - }, - "address": { "type": "string" } - }, - "required": ["chainId", "address"], - "additionalProperties": false - } - }, - "required": ["ownershipType", "owner"] - }, - { - "type": "object", - "properties": { - "ownershipType": { "type": "string", "enum": ["burned"] }, - "owner": { - "type": "object", - "properties": { - "chainId": { - "type": "integer", - "exclusiveMinimum": 0 - }, - "address": { "type": "string" } - }, - "required": ["chainId", "address"], - "additionalProperties": false - } - }, - "required": ["ownershipType", "owner"] - }, - { - "type": "object", - "properties": { - "ownershipType": { - "type": "string", - "enum": ["unknown"] - }, - "owner": { - "type": "object", - "properties": { - "chainId": { - "type": "integer", - "exclusiveMinimum": 0 - }, - "address": { "type": "string" } - }, - "required": ["chainId", "address"], - "additionalProperties": false - } - }, - "required": ["ownershipType", "owner"] - } - ] - }, - "mintStatus": { "type": "string", "enum": ["minted", "burned"] } - }, - "required": ["token", "ownership", "mintStatus"] - }, - "minItems": 1 - }, - "expiresAt": { "type": "integer" }, - "accurateAsOf": { "type": "integer" } - }, - "required": ["domainId", "name", "tokens", "expiresAt", "accurateAsOf"] + "properties": { "message": { "type": "string" }, "details": {} }, + "required": ["message"] } }, - "required": ["responseCode", "registeredNameTokens"], + "required": ["responseCode", "errorCode", "error"], "additionalProperties": false }, { - "oneOf": [ - { - "type": "object", - "properties": { - "responseCode": { "type": "string", "enum": ["error"] }, - "errorCode": { "type": "string", "enum": ["name-tokens-not-indexed"] }, - "error": { - "type": "object", - "properties": { "message": { "type": "string" }, "details": {} }, - "required": ["message"] - } - }, - "required": ["responseCode", "errorCode", "error"], - "additionalProperties": false + "type": "object", + "properties": { + "responseCode": { "type": "string", "enum": ["error"] }, + "errorCode": { + "type": "string", + "enum": ["unsupported-ensindexer-config"] }, - { + "error": { "type": "object", - "properties": { - "responseCode": { "type": "string", "enum": ["error"] }, - "errorCode": { - "type": "string", - "enum": ["unsupported-ensindexer-config"] - }, - "error": { - "type": "object", - "properties": { "message": { "type": "string" }, "details": {} }, - "required": ["message"] - } - }, - "required": ["responseCode", "errorCode", "error"], - "additionalProperties": false - }, - { + "properties": { "message": { "type": "string" }, "details": {} }, + "required": ["message"] + } + }, + "required": ["responseCode", "errorCode", "error"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "responseCode": { "type": "string", "enum": ["error"] }, + "errorCode": { "type": "string", "enum": ["unsupported-indexing-status"] }, + "error": { "type": "object", - "properties": { - "responseCode": { "type": "string", "enum": ["error"] }, - "errorCode": { - "type": "string", - "enum": ["unsupported-indexing-status"] - }, - "error": { - "type": "object", - "properties": { "message": { "type": "string" }, "details": {} }, - "required": ["message"] - } - }, - "required": ["responseCode", "errorCode", "error"], - "additionalProperties": false + "properties": { "message": { "type": "string" }, "details": {} }, + "required": ["message"] } - ] + }, + "required": ["responseCode", "errorCode", "error"], + "additionalProperties": false + } + ], + "example": { + "responseCode": "error", + "errorCode": "unsupported-ensindexer-config", + "error": { + "message": "Name Tokens API is not available", + "details": "Connected ENSIndexer must have all following plugins active: registrars, tokenscope" } - ] + } } } } + } + } + } + }, + "/api/registrar-actions": { + "get": { + "operationId": "getRegistrarActions", + "tags": ["Explore"], + "summary": "Get Registrar Actions", + "description": "Returns all registrar actions with optional filtering and pagination", + "parameters": [ + { + "schema": { + "type": "string", + "enum": ["orderBy[timestamp]=desc"], + "default": "orderBy[timestamp]=desc", + "description": "Order of results" + }, + "required": false, + "description": "Order of results", + "name": "orderBy", + "in": "query" }, - "500": { - "description": "Internal server error", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { "message": { "type": "string" }, "details": {} }, - "required": ["message"] - } - } - } + { + "schema": { + "type": "integer", + "minimum": 1, + "default": 1, + "description": "Page number for pagination" + }, + "required": false, + "description": "Page number for pagination", + "name": "page", + "in": "query" }, - "503": { - "description": "Service unavailable - Name Tokens API prerequisites not met (indexing status not ready or required plugins not activated)", + { + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "default": 10, + "description": "Number of records per page" + }, + "required": false, + "description": "Number of records per page", + "name": "recordsPerPage", + "in": "query" + }, + { + "schema": { + "type": "boolean", + "description": "Filter to only include actions with referrals", + "default": false + }, + "required": false, + "description": "Filter to only include actions with referrals", + "name": "withReferral", + "in": "query" + }, + { + "schema": { "type": "string", "description": "Filter by decoded referrer address" }, + "required": false, + "description": "Filter by decoded referrer address", + "name": "decodedReferrer", + "in": "query" + }, + { + "schema": { + "type": "integer", + "description": "Filter actions at or after this Unix timestamp" + }, + "required": false, + "description": "Filter actions at or after this Unix timestamp", + "name": "beginTimestamp", + "in": "query" + }, + { + "schema": { + "type": "integer", + "description": "Filter actions at or before this Unix timestamp" + }, + "required": false, + "description": "Filter actions at or before this Unix timestamp", + "name": "endTimestamp", + "in": "query" + } + ], + "responses": { + "200": { + "description": "Successfully retrieved registrar actions", "content": { "application/json": { "schema": { - "oneOf": [ - { - "type": "object", - "properties": { - "responseCode": { "type": "string", "enum": ["ok"] }, - "registeredNameTokens": { - "type": "object", - "properties": { - "domainId": { "type": "string" }, - "name": { "type": "string" }, - "tokens": { - "type": "array", - "items": { + "type": "object", + "properties": { + "responseCode": { "type": "string", "enum": ["ok"] }, + "registrarActions": { + "type": "array", + "items": { + "type": "object", + "properties": { + "action": { + "oneOf": [ + { "type": "object", "properties": { - "token": { + "id": { "type": "string", "minLength": 1 }, + "incrementalDuration": { "type": "number" }, + "registrant": { "type": "string" }, + "registrationLifecycle": { "type": "object", "properties": { - "assetNamespace": { - "type": "string", - "enum": ["erc721", "erc1155"] - }, - "contract": { + "subregistry": { "type": "object", "properties": { - "chainId": { "type": "integer", "exclusiveMinimum": 0 }, - "address": { "type": "string" } - }, - "required": ["chainId", "address"], - "additionalProperties": false - }, - "tokenId": { "type": "string" } - }, - "required": ["assetNamespace", "contract", "tokenId"] - }, - "ownership": { - "oneOf": [ - { - "type": "object", - "properties": { - "ownershipType": { - "type": "string", - "enum": ["namewrapper"] - }, - "owner": { + "subregistryId": { "type": "object", "properties": { "chainId": { @@ -1728,37 +1922,125 @@ }, "required": ["chainId", "address"], "additionalProperties": false - } + }, + "node": { "type": "string" } }, - "required": ["ownershipType", "owner"] + "required": ["subregistryId", "node"] }, + "node": { "type": "string" }, + "expiresAt": { "type": "integer" } + }, + "required": ["subregistry", "node", "expiresAt"] + }, + "pricing": { + "anyOf": [ { "type": "object", "properties": { - "ownershipType": { - "type": "string", - "enum": ["fully-onchain"] + "baseCost": { + "type": "object", + "properties": { + "amount": { "type": "string", "pattern": "^\\d+$" }, + "currency": { "type": "string", "enum": ["ETH"] } + }, + "required": ["amount", "currency"], + "additionalProperties": false }, - "owner": { + "premium": { "type": "object", "properties": { - "chainId": { - "type": "integer", - "exclusiveMinimum": 0 - }, - "address": { "type": "string" } + "amount": { "type": "string", "pattern": "^\\d+$" }, + "currency": { "type": "string", "enum": ["ETH"] } }, - "required": ["chainId", "address"], + "required": ["amount", "currency"], + "additionalProperties": false + }, + "total": { + "type": "object", + "properties": { + "amount": { "type": "string", "pattern": "^\\d+$" }, + "currency": { "type": "string", "enum": ["ETH"] } + }, + "required": ["amount", "currency"], "additionalProperties": false } }, - "required": ["ownershipType", "owner"] + "required": ["baseCost", "premium", "total"] }, { "type": "object", "properties": { - "ownershipType": { "type": "string", "enum": ["burned"] }, - "owner": { + "baseCost": { "type": "null" }, + "premium": { "type": "null" }, + "total": { "type": "null" } + }, + "required": ["baseCost", "premium", "total"] + } + ] + }, + "referral": { + "anyOf": [ + { + "type": "object", + "properties": { + "encodedReferrer": { "type": "string" }, + "decodedReferrer": { "type": "string" } + }, + "required": ["encodedReferrer", "decodedReferrer"] + }, + { + "type": "object", + "properties": { + "encodedReferrer": { "type": "null" }, + "decodedReferrer": { "type": "null" } + }, + "required": ["encodedReferrer", "decodedReferrer"] + } + ] + }, + "block": { + "type": "object", + "properties": { + "timestamp": { "type": "integer" }, + "number": { "type": "integer", "minimum": 0 } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + }, + "transactionHash": { "type": "string" }, + "eventIds": { + "type": "array", + "items": { "type": "string", "minLength": 1 }, + "minItems": 1 + }, + "type": { "type": "string", "enum": ["registration"] } + }, + "required": [ + "id", + "incrementalDuration", + "registrant", + "registrationLifecycle", + "pricing", + "referral", + "block", + "transactionHash", + "eventIds", + "type" + ] + }, + { + "type": "object", + "properties": { + "id": { "type": "string", "minLength": 1 }, + "incrementalDuration": { "type": "number" }, + "registrant": { "type": "string" }, + "registrationLifecycle": { + "type": "object", + "properties": { + "subregistry": { + "type": "object", + "properties": { + "subregistryId": { "type": "object", "properties": { "chainId": { @@ -1769,190 +2051,260 @@ }, "required": ["chainId", "address"], "additionalProperties": false - } + }, + "node": { "type": "string" } }, - "required": ["ownershipType", "owner"] + "required": ["subregistryId", "node"] }, + "node": { "type": "string" }, + "expiresAt": { "type": "integer" } + }, + "required": ["subregistry", "node", "expiresAt"] + }, + "pricing": { + "anyOf": [ { "type": "object", "properties": { - "ownershipType": { - "type": "string", - "enum": ["unknown"] + "baseCost": { + "type": "object", + "properties": { + "amount": { "type": "string", "pattern": "^\\d+$" }, + "currency": { "type": "string", "enum": ["ETH"] } + }, + "required": ["amount", "currency"], + "additionalProperties": false }, - "owner": { + "premium": { "type": "object", "properties": { - "chainId": { - "type": "integer", - "exclusiveMinimum": 0 - }, - "address": { "type": "string" } + "amount": { "type": "string", "pattern": "^\\d+$" }, + "currency": { "type": "string", "enum": ["ETH"] } }, - "required": ["chainId", "address"], + "required": ["amount", "currency"], + "additionalProperties": false + }, + "total": { + "type": "object", + "properties": { + "amount": { "type": "string", "pattern": "^\\d+$" }, + "currency": { "type": "string", "enum": ["ETH"] } + }, + "required": ["amount", "currency"], "additionalProperties": false } }, - "required": ["ownershipType", "owner"] + "required": ["baseCost", "premium", "total"] + }, + { + "type": "object", + "properties": { + "baseCost": { "type": "null" }, + "premium": { "type": "null" }, + "total": { "type": "null" } + }, + "required": ["baseCost", "premium", "total"] } ] }, - "mintStatus": { "type": "string", "enum": ["minted", "burned"] } + "referral": { + "anyOf": [ + { + "type": "object", + "properties": { + "encodedReferrer": { "type": "string" }, + "decodedReferrer": { "type": "string" } + }, + "required": ["encodedReferrer", "decodedReferrer"] + }, + { + "type": "object", + "properties": { + "encodedReferrer": { "type": "null" }, + "decodedReferrer": { "type": "null" } + }, + "required": ["encodedReferrer", "decodedReferrer"] + } + ] + }, + "block": { + "type": "object", + "properties": { + "timestamp": { "type": "integer" }, + "number": { "type": "integer", "minimum": 0 } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + }, + "transactionHash": { "type": "string" }, + "eventIds": { + "type": "array", + "items": { "type": "string", "minLength": 1 }, + "minItems": 1 + }, + "type": { "type": "string", "enum": ["renewal"] } }, - "required": ["token", "ownership", "mintStatus"] - }, - "minItems": 1 - }, - "expiresAt": { "type": "integer" }, - "accurateAsOf": { "type": "integer" } + "required": [ + "id", + "incrementalDuration", + "registrant", + "registrationLifecycle", + "pricing", + "referral", + "block", + "transactionHash", + "eventIds", + "type" + ] + } + ] }, - "required": ["domainId", "name", "tokens", "expiresAt", "accurateAsOf"] - } - }, - "required": ["responseCode", "registeredNameTokens"], - "additionalProperties": false - }, - { - "oneOf": [ - { - "type": "object", - "properties": { - "responseCode": { "type": "string", "enum": ["error"] }, - "errorCode": { "type": "string", "enum": ["name-tokens-not-indexed"] }, - "error": { - "type": "object", - "properties": { "message": { "type": "string" }, "details": {} }, - "required": ["message"] - } - }, - "required": ["responseCode", "errorCode", "error"], - "additionalProperties": false + "name": { "type": "string" } }, + "required": ["action", "name"] + } + }, + "pageContext": { + "anyOf": [ { "type": "object", "properties": { - "responseCode": { "type": "string", "enum": ["error"] }, - "errorCode": { - "type": "string", - "enum": ["unsupported-ensindexer-config"] - }, - "error": { - "type": "object", - "properties": { "message": { "type": "string" }, "details": {} }, - "required": ["message"] + "totalRecords": { "type": "number", "enum": [0] }, + "totalPages": { "type": "number", "enum": [1] }, + "hasNext": { "type": "boolean", "enum": [false] }, + "hasPrev": { "type": "boolean", "enum": [false] }, + "page": { "type": "integer", "exclusiveMinimum": 0 }, + "recordsPerPage": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 100 } }, - "required": ["responseCode", "errorCode", "error"], - "additionalProperties": false + "required": [ + "totalRecords", + "totalPages", + "hasNext", + "hasPrev", + "page", + "recordsPerPage" + ] }, { "type": "object", "properties": { - "responseCode": { "type": "string", "enum": ["error"] }, - "errorCode": { - "type": "string", - "enum": ["unsupported-indexing-status"] - }, - "error": { - "type": "object", - "properties": { "message": { "type": "string" }, "details": {} }, - "required": ["message"] + "totalRecords": { "type": "integer", "exclusiveMinimum": 0 }, + "totalPages": { "type": "integer", "exclusiveMinimum": 0 }, + "hasNext": { "type": "boolean" }, + "hasPrev": { "type": "boolean" }, + "startIndex": { "type": "integer", "minimum": 0 }, + "endIndex": { "type": "integer", "minimum": 0 }, + "page": { "type": "integer", "exclusiveMinimum": 0 }, + "recordsPerPage": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 100 } }, - "required": ["responseCode", "errorCode", "error"], - "additionalProperties": false + "required": [ + "totalRecords", + "totalPages", + "hasNext", + "hasPrev", + "startIndex", + "endIndex", + "page", + "recordsPerPage" + ] } - ] - } - ] - } - } - } - } - } - } - }, - "/api/registrar-actions": { - "get": { - "operationId": "getRegistrarActions", - "tags": ["Explore"], - "summary": "Get Registrar Actions", - "description": "Returns all registrar actions with optional filtering and pagination", - "parameters": [ - { - "schema": { - "type": "string", - "enum": ["orderBy[timestamp]=desc"], - "default": "orderBy[timestamp]=desc", - "description": "Order of results" - }, - "required": false, - "description": "Order of results", - "name": "orderBy", - "in": "query" - }, - { - "schema": { - "type": "integer", - "minimum": 1, - "default": 1, - "description": "Page number for pagination" - }, - "required": false, - "description": "Page number for pagination", - "name": "page", - "in": "query" - }, - { - "schema": { - "type": "integer", - "minimum": 1, - "maximum": 100, - "default": 10, - "description": "Number of records per page" - }, - "required": false, - "description": "Number of records per page", - "name": "recordsPerPage", - "in": "query" - }, - { - "schema": { - "type": "boolean", - "description": "Filter to only include actions with referrals", - "default": false - }, - "required": false, - "description": "Filter to only include actions with referrals", - "name": "withReferral", - "in": "query" - }, - { - "schema": { "type": "string", "description": "Filter by decoded referrer address" }, - "required": false, - "description": "Filter by decoded referrer address", - "name": "decodedReferrer", - "in": "query" + ] + }, + "accurateAsOf": { "type": "integer" } + }, + "required": ["responseCode", "registrarActions", "pageContext", "accurateAsOf"], + "example": { + "responseCode": "ok", + "registrarActions": [ + { + "action": { + "type": "registration", + "id": "0x0000000000000000000000000000000000000000000000000000000000000001", + "incrementalDuration": 31536000, + "registrant": "0xd8da6bf26964af9d7eed9e03e53415d37aa96045", + "registrationLifecycle": { + "subregistry": { + "subregistryId": { + "chainId": 1, + "address": "0x253553366da8546fc250f225fe3d25d0c782303b" + }, + "node": "0x93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae" + }, + "node": "0xee6c4522aab0003e8d14cd40a6af439055fd2577951148c14b6cea9a53475835", + "expiresAt": 1893456000 + }, + "pricing": { + "baseCost": { "amount": "1000000000000000", "currency": "ETH" }, + "premium": { "amount": "0", "currency": "ETH" }, + "total": { "amount": "1000000000000000", "currency": "ETH" } + }, + "referral": { "encodedReferrer": null, "decodedReferrer": null }, + "block": { "timestamp": 1700000000, "number": 18500000 }, + "transactionHash": "0x0000000000000000000000000000000000000000000000000000000000000001", + "eventIds": [ + "0x0000000000000000000000000000000000000000000000000000000000000001" + ] + }, + "name": "vitalik.eth" + } + ], + "pageContext": { + "page": 1, + "recordsPerPage": 25, + "totalRecords": 1, + "totalPages": 1, + "hasNext": false, + "hasPrev": false, + "startIndex": 0, + "endIndex": 0 + }, + "accurateAsOf": 1700000000 + } + } + } + } }, - { - "schema": { "description": "Filter actions at or after this Unix timestamp" }, - "required": false, - "description": "Filter actions at or after this Unix timestamp", - "name": "beginTimestamp", - "in": "query" + "400": { + "description": "Invalid query", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { "message": { "type": "string" }, "details": {} }, + "required": ["message"], + "example": { "message": "Invalid Input" } + } + } + } }, - { - "schema": { "description": "Filter actions at or before this Unix timestamp" }, - "required": false, - "description": "Filter actions at or before this Unix timestamp", - "name": "endTimestamp", - "in": "query" + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "responseCode": { "type": "string", "enum": ["error"] }, + "error": { + "type": "object", + "properties": { "message": { "type": "string" }, "details": {} }, + "required": ["message"] + } + }, + "required": ["responseCode", "error"], + "additionalProperties": false + } + } + } } - ], - "responses": { - "200": { "description": "Successfully retrieved registrar actions" }, - "400": { "description": "Invalid query" }, - "500": { "description": "Internal server error" } } } }, @@ -2029,14 +2381,20 @@ "in": "query" }, { - "schema": { "description": "Filter actions at or after this Unix timestamp" }, + "schema": { + "type": "integer", + "description": "Filter actions at or after this Unix timestamp" + }, "required": false, "description": "Filter actions at or after this Unix timestamp", "name": "beginTimestamp", "in": "query" }, { - "schema": { "description": "Filter actions at or before this Unix timestamp" }, + "schema": { + "type": "integer", + "description": "Filter actions at or before this Unix timestamp" + }, "required": false, "description": "Filter actions at or before this Unix timestamp", "name": "endTimestamp", @@ -2044,9 +2402,427 @@ } ], "responses": { - "200": { "description": "Successfully retrieved registrar actions" }, - "400": { "description": "Invalid input" }, - "500": { "description": "Internal server error" } + "200": { + "description": "Successfully retrieved registrar actions", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "responseCode": { "type": "string", "enum": ["ok"] }, + "registrarActions": { + "type": "array", + "items": { + "type": "object", + "properties": { + "action": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { "type": "string", "minLength": 1 }, + "incrementalDuration": { "type": "number" }, + "registrant": { "type": "string" }, + "registrationLifecycle": { + "type": "object", + "properties": { + "subregistry": { + "type": "object", + "properties": { + "subregistryId": { + "type": "object", + "properties": { + "chainId": { + "type": "integer", + "exclusiveMinimum": 0 + }, + "address": { "type": "string" } + }, + "required": ["chainId", "address"], + "additionalProperties": false + }, + "node": { "type": "string" } + }, + "required": ["subregistryId", "node"] + }, + "node": { "type": "string" }, + "expiresAt": { "type": "integer" } + }, + "required": ["subregistry", "node", "expiresAt"] + }, + "pricing": { + "anyOf": [ + { + "type": "object", + "properties": { + "baseCost": { + "type": "object", + "properties": { + "amount": { "type": "string", "pattern": "^\\d+$" }, + "currency": { "type": "string", "enum": ["ETH"] } + }, + "required": ["amount", "currency"], + "additionalProperties": false + }, + "premium": { + "type": "object", + "properties": { + "amount": { "type": "string", "pattern": "^\\d+$" }, + "currency": { "type": "string", "enum": ["ETH"] } + }, + "required": ["amount", "currency"], + "additionalProperties": false + }, + "total": { + "type": "object", + "properties": { + "amount": { "type": "string", "pattern": "^\\d+$" }, + "currency": { "type": "string", "enum": ["ETH"] } + }, + "required": ["amount", "currency"], + "additionalProperties": false + } + }, + "required": ["baseCost", "premium", "total"] + }, + { + "type": "object", + "properties": { + "baseCost": { "type": "null" }, + "premium": { "type": "null" }, + "total": { "type": "null" } + }, + "required": ["baseCost", "premium", "total"] + } + ] + }, + "referral": { + "anyOf": [ + { + "type": "object", + "properties": { + "encodedReferrer": { "type": "string" }, + "decodedReferrer": { "type": "string" } + }, + "required": ["encodedReferrer", "decodedReferrer"] + }, + { + "type": "object", + "properties": { + "encodedReferrer": { "type": "null" }, + "decodedReferrer": { "type": "null" } + }, + "required": ["encodedReferrer", "decodedReferrer"] + } + ] + }, + "block": { + "type": "object", + "properties": { + "timestamp": { "type": "integer" }, + "number": { "type": "integer", "minimum": 0 } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + }, + "transactionHash": { "type": "string" }, + "eventIds": { + "type": "array", + "items": { "type": "string", "minLength": 1 }, + "minItems": 1 + }, + "type": { "type": "string", "enum": ["registration"] } + }, + "required": [ + "id", + "incrementalDuration", + "registrant", + "registrationLifecycle", + "pricing", + "referral", + "block", + "transactionHash", + "eventIds", + "type" + ] + }, + { + "type": "object", + "properties": { + "id": { "type": "string", "minLength": 1 }, + "incrementalDuration": { "type": "number" }, + "registrant": { "type": "string" }, + "registrationLifecycle": { + "type": "object", + "properties": { + "subregistry": { + "type": "object", + "properties": { + "subregistryId": { + "type": "object", + "properties": { + "chainId": { + "type": "integer", + "exclusiveMinimum": 0 + }, + "address": { "type": "string" } + }, + "required": ["chainId", "address"], + "additionalProperties": false + }, + "node": { "type": "string" } + }, + "required": ["subregistryId", "node"] + }, + "node": { "type": "string" }, + "expiresAt": { "type": "integer" } + }, + "required": ["subregistry", "node", "expiresAt"] + }, + "pricing": { + "anyOf": [ + { + "type": "object", + "properties": { + "baseCost": { + "type": "object", + "properties": { + "amount": { "type": "string", "pattern": "^\\d+$" }, + "currency": { "type": "string", "enum": ["ETH"] } + }, + "required": ["amount", "currency"], + "additionalProperties": false + }, + "premium": { + "type": "object", + "properties": { + "amount": { "type": "string", "pattern": "^\\d+$" }, + "currency": { "type": "string", "enum": ["ETH"] } + }, + "required": ["amount", "currency"], + "additionalProperties": false + }, + "total": { + "type": "object", + "properties": { + "amount": { "type": "string", "pattern": "^\\d+$" }, + "currency": { "type": "string", "enum": ["ETH"] } + }, + "required": ["amount", "currency"], + "additionalProperties": false + } + }, + "required": ["baseCost", "premium", "total"] + }, + { + "type": "object", + "properties": { + "baseCost": { "type": "null" }, + "premium": { "type": "null" }, + "total": { "type": "null" } + }, + "required": ["baseCost", "premium", "total"] + } + ] + }, + "referral": { + "anyOf": [ + { + "type": "object", + "properties": { + "encodedReferrer": { "type": "string" }, + "decodedReferrer": { "type": "string" } + }, + "required": ["encodedReferrer", "decodedReferrer"] + }, + { + "type": "object", + "properties": { + "encodedReferrer": { "type": "null" }, + "decodedReferrer": { "type": "null" } + }, + "required": ["encodedReferrer", "decodedReferrer"] + } + ] + }, + "block": { + "type": "object", + "properties": { + "timestamp": { "type": "integer" }, + "number": { "type": "integer", "minimum": 0 } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + }, + "transactionHash": { "type": "string" }, + "eventIds": { + "type": "array", + "items": { "type": "string", "minLength": 1 }, + "minItems": 1 + }, + "type": { "type": "string", "enum": ["renewal"] } + }, + "required": [ + "id", + "incrementalDuration", + "registrant", + "registrationLifecycle", + "pricing", + "referral", + "block", + "transactionHash", + "eventIds", + "type" + ] + } + ] + }, + "name": { "type": "string" } + }, + "required": ["action", "name"] + } + }, + "pageContext": { + "anyOf": [ + { + "type": "object", + "properties": { + "totalRecords": { "type": "number", "enum": [0] }, + "totalPages": { "type": "number", "enum": [1] }, + "hasNext": { "type": "boolean", "enum": [false] }, + "hasPrev": { "type": "boolean", "enum": [false] }, + "page": { "type": "integer", "exclusiveMinimum": 0 }, + "recordsPerPage": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 100 + } + }, + "required": [ + "totalRecords", + "totalPages", + "hasNext", + "hasPrev", + "page", + "recordsPerPage" + ] + }, + { + "type": "object", + "properties": { + "totalRecords": { "type": "integer", "exclusiveMinimum": 0 }, + "totalPages": { "type": "integer", "exclusiveMinimum": 0 }, + "hasNext": { "type": "boolean" }, + "hasPrev": { "type": "boolean" }, + "startIndex": { "type": "integer", "minimum": 0 }, + "endIndex": { "type": "integer", "minimum": 0 }, + "page": { "type": "integer", "exclusiveMinimum": 0 }, + "recordsPerPage": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 100 + } + }, + "required": [ + "totalRecords", + "totalPages", + "hasNext", + "hasPrev", + "startIndex", + "endIndex", + "page", + "recordsPerPage" + ] + } + ] + }, + "accurateAsOf": { "type": "integer" } + }, + "required": ["responseCode", "registrarActions", "pageContext", "accurateAsOf"], + "example": { + "responseCode": "ok", + "registrarActions": [ + { + "action": { + "type": "registration", + "id": "0x0000000000000000000000000000000000000000000000000000000000000001", + "incrementalDuration": 31536000, + "registrant": "0xd8da6bf26964af9d7eed9e03e53415d37aa96045", + "registrationLifecycle": { + "subregistry": { + "subregistryId": { + "chainId": 1, + "address": "0x253553366da8546fc250f225fe3d25d0c782303b" + }, + "node": "0x93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae" + }, + "node": "0xee6c4522aab0003e8d14cd40a6af439055fd2577951148c14b6cea9a53475835", + "expiresAt": 1893456000 + }, + "pricing": { + "baseCost": { "amount": "1000000000000000", "currency": "ETH" }, + "premium": { "amount": "0", "currency": "ETH" }, + "total": { "amount": "1000000000000000", "currency": "ETH" } + }, + "referral": { "encodedReferrer": null, "decodedReferrer": null }, + "block": { "timestamp": 1700000000, "number": 18500000 }, + "transactionHash": "0x0000000000000000000000000000000000000000000000000000000000000001", + "eventIds": [ + "0x0000000000000000000000000000000000000000000000000000000000000001" + ] + }, + "name": "vitalik.eth" + } + ], + "pageContext": { + "page": 1, + "recordsPerPage": 25, + "totalRecords": 1, + "totalPages": 1, + "hasNext": false, + "hasPrev": false, + "startIndex": 0, + "endIndex": 0 + }, + "accurateAsOf": 1700000000 + } + } + } + } + }, + "400": { + "description": "Invalid input", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { "message": { "type": "string" }, "details": {} }, + "required": ["message"], + "example": { "message": "Invalid Input" } + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "responseCode": { "type": "string", "enum": ["error"] }, + "error": { + "type": "object", + "properties": { "message": { "type": "string" }, "details": {} }, + "required": ["message"] + } + }, + "required": ["responseCode", "error"], + "additionalProperties": false + } + } + } + } } } }, diff --git a/packages/ensnode-sdk/src/ensnode/api/name-tokens/examples.ts b/packages/ensnode-sdk/src/ensnode/api/name-tokens/examples.ts new file mode 100644 index 0000000000..1c065956f0 --- /dev/null +++ b/packages/ensnode-sdk/src/ensnode/api/name-tokens/examples.ts @@ -0,0 +1,69 @@ +import type { InterpretedName } from "enssdk"; + +import type { + SerializedNameTokensResponseError, + SerializedNameTokensResponseOk, +} from "./serialized-response"; + +/** + * Example value for {@link SerializedNameTokensResponseOk}, for use in OpenAPI documentation. + * + * - domainId and tokenId correspond to "vitalik.eth" + * - contract is the ENS BaseRegistrar (ERC-721) on Ethereum mainnet + */ +export const nameTokensResponseOkExample = { + responseCode: "ok", + registeredNameTokens: { + domainId: "0xee6c4522aab0003e8d14cd40a6af439055fd2577951148c14b6cea9a53475835", + name: "vitalik.eth" as InterpretedName, + tokens: [ + { + token: { + assetNamespace: "erc721", + contract: { + chainId: 1, + address: "0x57f1887a8bf19b14fc0df6fd9b2acc9af147ea85", + }, + tokenId: "0xaf2caa1c2ca1d027f1ac823b529d0a67cd144264b2789fa2ea4d63a67c7103cc", + }, + ownership: { + ownershipType: "fully-onchain", + owner: { + chainId: 1, + address: "0x220866b1a2219f40e72f5c628b65d54268ca3a9d", + }, + }, + mintStatus: "minted", + }, + ], + expiresAt: 2461152330, + accurateAsOf: 1700000000, + }, +} satisfies SerializedNameTokensResponseOk; + +/** + * Example value for {@link SerializedNameTokensResponseError} representing a 503 Service Unavailable + * when the Name Tokens API prerequisites are not met, for use in OpenAPI documentation. + */ +export const nameTokensServiceUnavailableExample = { + responseCode: "error", + errorCode: "unsupported-ensindexer-config", + error: { + message: "Name Tokens API is not available", + details: "Connected ENSIndexer must have all following plugins active: registrars, tokenscope", + }, +} satisfies SerializedNameTokensResponseError; + +/** + * Example value for {@link NameTokensResponseErrorNameTokensNotIndexed} representing a 404 Not Found + * when no name tokens are indexed for the requested name or domainId, for use in OpenAPI documentation. + */ +export const nameTokensNotIndexedExample = { + responseCode: "error", + errorCode: "name-tokens-not-indexed", + error: { + message: "No indexed Name Tokens found", + details: + "This ENSNode instance has not been configured to index tokens for the requested name: 'vitalik.eth'", + }, +} satisfies SerializedNameTokensResponseError; diff --git a/packages/ensnode-sdk/src/ensnode/api/name-tokens/serialize.ts b/packages/ensnode-sdk/src/ensnode/api/name-tokens/serialize.ts index abf4bf8ff4..0bccf378bc 100644 --- a/packages/ensnode-sdk/src/ensnode/api/name-tokens/serialize.ts +++ b/packages/ensnode-sdk/src/ensnode/api/name-tokens/serialize.ts @@ -2,6 +2,8 @@ import { serializeNameToken } from "../../../tokenscope/name-token"; import { type NameTokensResponse, NameTokensResponseCodes, + type NameTokensResponseError, + type NameTokensResponseOk, type RegisteredNameTokens, } from "./response"; import type { @@ -26,6 +28,10 @@ export function serializeRegisteredNameTokens({ }; } +export function serializeNameTokensResponse( + response: NameTokensResponseOk, +): SerializedNameTokensResponseOk; +export function serializeNameTokensResponse(response: T): T; export function serializeNameTokensResponse( response: NameTokensResponse, ): SerializedNameTokensResponse { diff --git a/packages/ensnode-sdk/src/ensnode/api/name-tokens/zod-schemas.test.ts b/packages/ensnode-sdk/src/ensnode/api/name-tokens/zod-schemas.test.ts index 90e6ce9c7d..22c11fd00d 100644 --- a/packages/ensnode-sdk/src/ensnode/api/name-tokens/zod-schemas.test.ts +++ b/packages/ensnode-sdk/src/ensnode/api/name-tokens/zod-schemas.test.ts @@ -3,9 +3,14 @@ import { describe, expect, it } from "vitest"; import { NFTMintStatuses } from "../../../tokenscope/assets"; import { NameTokenOwnershipTypes } from "../../../tokenscope/name-token"; +import { + nameTokensNotIndexedExample, + nameTokensResponseOkExample, + nameTokensServiceUnavailableExample, +} from "./examples"; import { NameTokensResponseCodes, type NameTokensResponseOk } from "./response"; import type { SerializedNameTokensResponseOk } from "./serialized-response"; -import { makeNameTokensResponseSchema } from "./zod-schemas"; +import { makeNameTokensResponseErrorSchema, makeNameTokensResponseSchema } from "./zod-schemas"; const responseOk = { responseCode: NameTokensResponseCodes.Ok, @@ -56,6 +61,26 @@ const responseOk = { } satisfies SerializedNameTokensResponseOk; describe("Name Tokens: Zod Schemas", () => { + it("nameTokensServiceUnavailableExample passes error schema", () => { + expect( + makeNameTokensResponseErrorSchema().safeParse(nameTokensServiceUnavailableExample).success, + ).toBe(true); + }); + + it("nameTokensNotIndexedExample passes error schema", () => { + expect(makeNameTokensResponseErrorSchema().safeParse(nameTokensNotIndexedExample).success).toBe( + true, + ); + }); + + it("nameTokensResponseOkExample passes schema", () => { + expect( + makeNameTokensResponseSchema("Name Tokens Response", true).safeParse( + nameTokensResponseOkExample, + ).success, + ).toBe(true); + }); + it("can parse response OK correctly", () => { const schema = makeNameTokensResponseSchema(); const parsed = schema.safeParse(responseOk); diff --git a/packages/ensnode-sdk/src/ensnode/api/name-tokens/zod-schemas.ts b/packages/ensnode-sdk/src/ensnode/api/name-tokens/zod-schemas.ts index 9fc89551e4..bb69c5ddc3 100644 --- a/packages/ensnode-sdk/src/ensnode/api/name-tokens/zod-schemas.ts +++ b/packages/ensnode-sdk/src/ensnode/api/name-tokens/zod-schemas.ts @@ -8,7 +8,7 @@ import { } from "../../../shared/zod-schemas"; import { NameTokenOwnershipTypes } from "../../../tokenscope/name-token"; import { makeNameTokenSchema } from "../../../tokenscope/zod-schemas"; -import { ErrorResponseSchema } from "../shared/errors/zod-schemas"; +import { makeErrorResponseSchema } from "../shared/errors/zod-schemas"; import { NameTokensResponse, NameTokensResponseCodes, @@ -104,7 +104,7 @@ export const makeNameTokensResponseErrorNameTokensNotIndexedSchema = ( z.strictObject({ responseCode: z.literal(NameTokensResponseCodes.Error), errorCode: z.literal(NameTokensResponseErrorCodes.NameTokensNotIndexed), - error: ErrorResponseSchema, + error: makeErrorResponseSchema(), }); /** @@ -116,7 +116,7 @@ export const makeNameTokensResponseErrorEnsIndexerConfigUnsupported = ( z.strictObject({ responseCode: z.literal(NameTokensResponseCodes.Error), errorCode: z.literal(NameTokensResponseErrorCodes.EnsIndexerConfigUnsupported), - error: ErrorResponseSchema, + error: makeErrorResponseSchema(), }); /** * Schema for {@link NameTokensResponseErrorIndexingStatusUnsupported} @@ -127,7 +127,7 @@ export const makeNameTokensResponseErrorNameIndexingStatusUnsupported = ( z.strictObject({ responseCode: z.literal(NameTokensResponseCodes.Error), errorCode: z.literal(NameTokensResponseErrorCodes.IndexingStatusUnsupported), - error: ErrorResponseSchema, + error: makeErrorResponseSchema(), }); /** * Schema for {@link NameTokensResponseError} diff --git a/packages/ensnode-sdk/src/ensnode/api/registrar-actions/examples.ts b/packages/ensnode-sdk/src/ensnode/api/registrar-actions/examples.ts new file mode 100644 index 0000000000..188a517a16 --- /dev/null +++ b/packages/ensnode-sdk/src/ensnode/api/registrar-actions/examples.ts @@ -0,0 +1,56 @@ +import type { InterpretedName } from "enssdk"; + +import type { SerializedRegistrarActionsResponseOk } from "./serialized-response"; + +/** + * Example value for {@link SerializedRegistrarActionsResponseOk}, for use in OpenAPI documentation. + * + * - registrationLifecycle.node is namehash("vitalik.eth") + * - subregistry.node is namehash("eth") + * - subregistry.subregistryId is the ETH Registrar Controller on Ethereum mainnet + */ +export const registrarActionsResponseOkExample = { + responseCode: "ok", + registrarActions: [ + { + action: { + type: "registration", + id: "0x0000000000000000000000000000000000000000000000000000000000000001", + incrementalDuration: 31536000, + registrant: "0xd8da6bf26964af9d7eed9e03e53415d37aa96045", + registrationLifecycle: { + subregistry: { + subregistryId: { + chainId: 1, + address: "0x253553366da8546fc250f225fe3d25d0c782303b", + }, + node: "0x93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae", + }, + node: "0xee6c4522aab0003e8d14cd40a6af439055fd2577951148c14b6cea9a53475835", + expiresAt: 1893456000, + }, + pricing: { + baseCost: { amount: "1000000000000000", currency: "ETH" }, + premium: { amount: "0", currency: "ETH" }, + total: { amount: "1000000000000000", currency: "ETH" }, + }, + referral: { encodedReferrer: null, decodedReferrer: null }, + block: { timestamp: 1700000000, number: 18500000 }, + transactionHash: "0x0000000000000000000000000000000000000000000000000000000000000001", + eventIds: ["0x0000000000000000000000000000000000000000000000000000000000000001"], + }, + name: "vitalik.eth" as InterpretedName, + }, + ], + pageContext: { + page: 1, + recordsPerPage: 25, + totalRecords: 1, + totalPages: 1, + hasNext: false, + hasPrev: false, + startIndex: 0, + endIndex: 0, + }, + accurateAsOf: 1700000000, +} satisfies SerializedRegistrarActionsResponseOk; diff --git a/packages/ensnode-sdk/src/ensnode/api/registrar-actions/serialize.ts b/packages/ensnode-sdk/src/ensnode/api/registrar-actions/serialize.ts index 6b8287957a..11d8815f1d 100644 --- a/packages/ensnode-sdk/src/ensnode/api/registrar-actions/serialize.ts +++ b/packages/ensnode-sdk/src/ensnode/api/registrar-actions/serialize.ts @@ -3,10 +3,13 @@ import { type NamedRegistrarAction, type RegistrarActionsResponse, RegistrarActionsResponseCodes, + type RegistrarActionsResponseError, + type RegistrarActionsResponseOk, } from "./response"; import type { SerializedNamedRegistrarAction, SerializedRegistrarActionsResponse, + SerializedRegistrarActionsResponseError, SerializedRegistrarActionsResponseOk, } from "./serialized-response"; @@ -20,6 +23,12 @@ export function serializeNamedRegistrarAction({ }; } +export function serializeRegistrarActionsResponse( + response: RegistrarActionsResponseOk, +): SerializedRegistrarActionsResponseOk; +export function serializeRegistrarActionsResponse( + response: RegistrarActionsResponseError, +): SerializedRegistrarActionsResponseError; export function serializeRegistrarActionsResponse( response: RegistrarActionsResponse, ): SerializedRegistrarActionsResponse { diff --git a/packages/ensnode-sdk/src/ensnode/api/registrar-actions/zod-schemas.test.ts b/packages/ensnode-sdk/src/ensnode/api/registrar-actions/zod-schemas.test.ts index 33c6b868fa..ec6a5615b2 100644 --- a/packages/ensnode-sdk/src/ensnode/api/registrar-actions/zod-schemas.test.ts +++ b/packages/ensnode-sdk/src/ensnode/api/registrar-actions/zod-schemas.test.ts @@ -1,13 +1,17 @@ import { asInterpretedName } from "enssdk"; import { describe, expect, it } from "vitest"; +import { registrarActionsResponseOkExample } from "./examples"; import { RegistrarActionsResponseCodes, type RegistrarActionsResponseError } from "./response"; import type { SerializedNamedRegistrarAction, SerializedRegistrarActionsResponseError, SerializedRegistrarActionsResponseOk, } from "./serialized-response"; -import { makeRegistrarActionsResponseSchema } from "./zod-schemas"; +import { + makeRegistrarActionsResponseSchema, + makeSerializedRegistrarActionsResponseOkSchema, +} from "./zod-schemas"; describe("ENSNode API Schema", () => { describe("Registrar Actions API", () => { @@ -125,8 +129,22 @@ describe("ENSNode API Schema", () => { expect(() => makeRegistrarActionsResponseSchema().parse(validResponseOk)).not.toThrowError(); }); + it("registrarActionsResponseOkExample passes schema", () => { + expect( + makeRegistrarActionsResponseSchema().safeParse(registrarActionsResponseOkExample).success, + ).toBe(true); + }); + + it("can deserialize ResponseOk object via domain schema", () => { + const serialized = makeRegistrarActionsResponseSchema().parse( + registrarActionsResponseOkExample, + ); + expect(() => makeRegistrarActionsResponseSchema().parse(serialized)).not.toThrowError(); + }); + it("rejects ResponseOk object missing required accurateAsOf", () => { - const { accurateAsOf: _accurateAsOf, ...invalidResponseOk } = validResponseOk; + const { accurateAsOf: _accurateAsOf, ...invalidResponseOk } = + registrarActionsResponseOkExample; expect(() => makeRegistrarActionsResponseSchema().parse(invalidResponseOk)).toThrowError(); }); @@ -139,5 +157,24 @@ describe("ENSNode API Schema", () => { error: validResponseError.error, } satisfies RegistrarActionsResponseError); }); + + describe("makeSerializedRegistrarActionsResponseOkSchema", () => { + it("registrarActionsResponseOkExample passes schema", () => { + expect( + makeSerializedRegistrarActionsResponseOkSchema().safeParse( + registrarActionsResponseOkExample, + ).success, + ).toBe(true); + }); + + it("rejects ResponseOk object missing required accurateAsOf", () => { + const { accurateAsOf: _accurateAsOf, ...invalidResponseOk } = + registrarActionsResponseOkExample; + + expect( + makeSerializedRegistrarActionsResponseOkSchema().safeParse(invalidResponseOk).success, + ).toBe(false); + }); + }); }); }); diff --git a/packages/ensnode-sdk/src/ensnode/api/registrar-actions/zod-schemas.ts b/packages/ensnode-sdk/src/ensnode/api/registrar-actions/zod-schemas.ts index 0e4b45c82c..c315ac45e0 100644 --- a/packages/ensnode-sdk/src/ensnode/api/registrar-actions/zod-schemas.ts +++ b/packages/ensnode-sdk/src/ensnode/api/registrar-actions/zod-schemas.ts @@ -2,11 +2,18 @@ import { namehashInterpretedName } from "enssdk"; import { z } from "zod/v4"; import type { ParsePayload } from "zod/v4/core"; -import { makeRegistrarActionSchema } from "../../../registrars/zod-schemas"; +import { + makeRegistrarActionSchema, + makeSerializedRegistrarActionSchema, +} from "../../../registrars/zod-schemas"; import { makeReinterpretedNameSchema, makeUnixTimestampSchema } from "../../../shared/zod-schemas"; -import { ErrorResponseSchema } from "../shared/errors/zod-schemas"; +import { makeErrorResponseSchema } from "../shared/errors/zod-schemas"; import { makeResponsePageContextSchema } from "../shared/pagination/zod-schemas"; import { type NamedRegistrarAction, RegistrarActionsResponseCodes } from "./response"; +import { + SerializedNamedRegistrarAction, + SerializedRegistrarActionsResponseOk, +} from "./serialized-response"; function invariant_registrationLifecycleNodeMatchesName(ctx: ParsePayload) { const { name, action } = ctx.value; @@ -33,6 +40,17 @@ export const makeNamedRegistrarActionSchema = (valueLabel: string = "Named Regis }) .check(invariant_registrationLifecycleNodeMatchesName); +/** + * Schema for {@link SerializedNamedRegistrarAction}. + */ +const makeSerializedNamedRegistrarActionSchema = ( + valueLabel: string = "Serialized Named Registrar Action", +) => + z.object({ + action: makeSerializedRegistrarActionSchema(valueLabel), + name: makeReinterpretedNameSchema(valueLabel), + }); + /** * Schema for {@link RegistrarActionsResponseOk} */ @@ -54,7 +72,7 @@ export const makeRegistrarActionsResponseErrorSchema = ( ) => z.strictObject({ responseCode: z.literal(RegistrarActionsResponseCodes.Error), - error: ErrorResponseSchema, + error: makeErrorResponseSchema(), }); /** @@ -67,3 +85,16 @@ export const makeRegistrarActionsResponseSchema = ( makeRegistrarActionsResponseOkSchema(valueLabel), makeRegistrarActionsResponseErrorSchema(valueLabel), ]); + +/** + * Schema for {@link SerializedRegistrarActionsResponseOk} + */ +export const makeSerializedRegistrarActionsResponseOkSchema = ( + valueLabel: string = "Serialized Registrar Actions Response OK", +) => + z.object({ + responseCode: z.literal(RegistrarActionsResponseCodes.Ok), + registrarActions: z.array(makeSerializedNamedRegistrarActionSchema(valueLabel)), + pageContext: makeResponsePageContextSchema(`${valueLabel}.pageContext`), + accurateAsOf: makeUnixTimestampSchema(`${valueLabel}.accurateAsOf`), + }); diff --git a/packages/ensnode-sdk/src/ensnode/api/resolution/examples.ts b/packages/ensnode-sdk/src/ensnode/api/resolution/examples.ts new file mode 100644 index 0000000000..8d8aaf802c --- /dev/null +++ b/packages/ensnode-sdk/src/ensnode/api/resolution/examples.ts @@ -0,0 +1,45 @@ +import type { ResolverRecordsSelection } from "../../../resolution"; +import type { + ResolvePrimaryNameResponse, + ResolvePrimaryNamesResponse, + ResolveRecordsResponse, +} from "./types"; + +/** + * Example values for {@link ResolveRecordsResponse}, for use in OpenAPI documentation. + */ +export const resolveRecordsResponseExample = { + records: { + addresses: { "60": "0xd8da6bf26964af9d7eed9e03e53415d37aa96045" }, + texts: { + description: "mi pinxe lo crino tcati", + }, + }, + accelerationRequested: false, + accelerationAttempted: false, +} satisfies ResolveRecordsResponse; + +/** + * Example values for {@link ResolvePrimaryNameResponse}, for use in OpenAPI documentation. + */ +export const resolvePrimaryNameResponseExample = { + name: "jesse.base.eth", + accelerationRequested: false, + accelerationAttempted: false, +} satisfies ResolvePrimaryNameResponse; + +/** + * Example values for {@link ResolvePrimaryNamesResponse}, for use in OpenAPI documentation. + */ +export const resolvePrimaryNamesResponseExample = { + names: { + "1": "jesse.base.eth", + "10": null, + "8453": "jesse.base.eth", + "42161": null, + "59144": null, + "534352": null, + }, + accelerationRequested: false, + accelerationAttempted: false, +} satisfies ResolvePrimaryNamesResponse; diff --git a/packages/ensnode-sdk/src/ensnode/api/resolution/zod-schemas.test.ts b/packages/ensnode-sdk/src/ensnode/api/resolution/zod-schemas.test.ts new file mode 100644 index 0000000000..fdc3f99950 --- /dev/null +++ b/packages/ensnode-sdk/src/ensnode/api/resolution/zod-schemas.test.ts @@ -0,0 +1,32 @@ +import { describe, expect, it } from "vitest"; + +import { + resolvePrimaryNameResponseExample, + resolvePrimaryNamesResponseExample, + resolveRecordsResponseExample, +} from "./examples"; +import { + makeResolvePrimaryNameResponseSchema, + makeResolvePrimaryNamesResponseSchema, + makeResolveRecordsResponseSchema, +} from "./zod-schemas"; + +describe("Resolution: Zod Schemas", () => { + it("resolveRecordsResponseExample passes schema", () => { + expect( + makeResolveRecordsResponseSchema().safeParse(resolveRecordsResponseExample).success, + ).toBe(true); + }); + + it("resolvePrimaryNameResponseExample passes schema", () => { + expect( + makeResolvePrimaryNameResponseSchema().safeParse(resolvePrimaryNameResponseExample).success, + ).toBe(true); + }); + + it("resolvePrimaryNamesResponseExample passes schema", () => { + expect( + makeResolvePrimaryNamesResponseSchema().safeParse(resolvePrimaryNamesResponseExample).success, + ).toBe(true); + }); +}); diff --git a/packages/ensnode-sdk/src/ensnode/api/shared/errors/deserialize.ts b/packages/ensnode-sdk/src/ensnode/api/shared/errors/deserialize.ts index c96d00961d..a1c620e892 100644 --- a/packages/ensnode-sdk/src/ensnode/api/shared/errors/deserialize.ts +++ b/packages/ensnode-sdk/src/ensnode/api/shared/errors/deserialize.ts @@ -1,13 +1,13 @@ import { prettifyError } from "zod/v4"; import type { ErrorResponse } from "./response"; -import { ErrorResponseSchema } from "./zod-schemas"; +import { makeErrorResponseSchema } from "./zod-schemas"; /** * Deserialize a {@link ErrorResponse} object. */ export function deserializeErrorResponse(maybeErrorResponse: unknown): ErrorResponse { - const parsed = ErrorResponseSchema.safeParse(maybeErrorResponse); + const parsed = makeErrorResponseSchema().safeParse(maybeErrorResponse); if (parsed.error) { throw new Error(`Cannot deserialize ErrorResponse:\n${prettifyError(parsed.error)}\n`); diff --git a/packages/ensnode-sdk/src/ensnode/api/shared/errors/examples.ts b/packages/ensnode-sdk/src/ensnode/api/shared/errors/examples.ts new file mode 100644 index 0000000000..78b6546dc0 --- /dev/null +++ b/packages/ensnode-sdk/src/ensnode/api/shared/errors/examples.ts @@ -0,0 +1,41 @@ +import type { ErrorResponse } from "./response"; + +/** + * Example value for {@link ErrorResponse} representing a 400 Bad Request, for use in OpenAPI documentation. + */ +export const errorResponseBadRequestExample = { + message: "Invalid Input", +} satisfies ErrorResponse; + +/** + * Example value for {@link ErrorResponse} representing a 400 Bad Request for an invalid ENS name, + * for use in OpenAPI documentation. + */ +export const errorResponseInvalidNameExample = { + message: "Invalid Input", + details: { + errors: [], + properties: { + name: { errors: ["Must be normalized, see https://docs.ens.domains/resolution/names/"] }, + }, + }, +} satisfies ErrorResponse; + +/** + * Example value for {@link ErrorResponse} representing a 400 Bad Request for an invalid address, + * for use in OpenAPI documentation. + */ +export const errorResponseInvalidAddressExample = { + message: "Invalid Input", + details: { + errors: [], + properties: { address: { errors: ["EVM address must be a valid EVM address"] } }, + }, +} satisfies ErrorResponse; + +/** + * Example value for {@link ErrorResponse} representing a 500 Internal Server Error, for use in OpenAPI documentation. + */ +export const errorResponseInternalServerErrorExample = { + message: "Internal Server Error", +} satisfies ErrorResponse; diff --git a/packages/ensnode-sdk/src/ensnode/api/shared/errors/response.ts b/packages/ensnode-sdk/src/ensnode/api/shared/errors/response.ts index 20a7f1b223..5bd401e4d9 100644 --- a/packages/ensnode-sdk/src/ensnode/api/shared/errors/response.ts +++ b/packages/ensnode-sdk/src/ensnode/api/shared/errors/response.ts @@ -1,8 +1,8 @@ import type { z } from "zod/v4"; -import type { ErrorResponseSchema } from "./zod-schemas"; +import type { makeErrorResponseSchema } from "./zod-schemas"; /** * API Error Response Type */ -export type ErrorResponse = z.infer; +export type ErrorResponse = z.infer>; diff --git a/packages/ensnode-sdk/src/ensnode/api/shared/errors/zod-schemas.test.ts b/packages/ensnode-sdk/src/ensnode/api/shared/errors/zod-schemas.test.ts new file mode 100644 index 0000000000..3a68f9e3eb --- /dev/null +++ b/packages/ensnode-sdk/src/ensnode/api/shared/errors/zod-schemas.test.ts @@ -0,0 +1,20 @@ +import { describe, expect, it } from "vitest"; + +import { + errorResponseBadRequestExample, + errorResponseInternalServerErrorExample, + errorResponseInvalidAddressExample, + errorResponseInvalidNameExample, +} from "./examples"; +import { makeErrorResponseSchema } from "./zod-schemas"; + +describe("makeErrorResponseSchema", () => { + it.each([ + ["errorResponseBadRequestExample", errorResponseBadRequestExample], + ["errorResponseInvalidNameExample", errorResponseInvalidNameExample], + ["errorResponseInvalidAddressExample", errorResponseInvalidAddressExample], + ["errorResponseInternalServerErrorExample", errorResponseInternalServerErrorExample], + ])("%s passes schema", (_name, example) => { + expect(makeErrorResponseSchema().safeParse(example).success).toBe(true); + }); +}); diff --git a/packages/ensnode-sdk/src/ensnode/api/shared/errors/zod-schemas.ts b/packages/ensnode-sdk/src/ensnode/api/shared/errors/zod-schemas.ts index bdaddfdd22..50401fb9da 100644 --- a/packages/ensnode-sdk/src/ensnode/api/shared/errors/zod-schemas.ts +++ b/packages/ensnode-sdk/src/ensnode/api/shared/errors/zod-schemas.ts @@ -5,7 +5,8 @@ import type { ErrorResponse } from "./response"; /** * Schema for {@link ErrorResponse}. */ -export const ErrorResponseSchema = z.object({ - message: z.string(), - details: z.optional(z.unknown()), -}); +export const makeErrorResponseSchema = () => + z.object({ + message: z.string(), + details: z.optional(z.unknown()), + }); diff --git a/packages/ensnode-sdk/src/ensnode/api/shared/pagination/response.ts b/packages/ensnode-sdk/src/ensnode/api/shared/pagination/response.ts index 5f48dc4e24..56ca305223 100644 --- a/packages/ensnode-sdk/src/ensnode/api/shared/pagination/response.ts +++ b/packages/ensnode-sdk/src/ensnode/api/shared/pagination/response.ts @@ -24,12 +24,12 @@ export interface ResponsePageContextWithNoRecords extends Required { diff --git a/packages/ensnode-sdk/src/ensnode/api/shared/pagination/zod-schemas.ts b/packages/ensnode-sdk/src/ensnode/api/shared/pagination/zod-schemas.ts index 9e314e721b..fc90f0f2ab 100644 --- a/packages/ensnode-sdk/src/ensnode/api/shared/pagination/zod-schemas.ts +++ b/packages/ensnode-sdk/src/ensnode/api/shared/pagination/zod-schemas.ts @@ -36,8 +36,6 @@ export const makeResponsePageContextSchemaWithNoRecords = ( totalPages: z.literal(1), hasNext: z.literal(false), hasPrev: z.literal(false), - startIndex: z.undefined(), - endIndex: z.undefined(), }) .extend(makeRequestPageParamsSchema(valueLabel).shape); diff --git a/packages/ensnode-sdk/src/internal.ts b/packages/ensnode-sdk/src/internal.ts index e48bec775d..1e6dff8959 100644 --- a/packages/ensnode-sdk/src/internal.ts +++ b/packages/ensnode-sdk/src/internal.ts @@ -15,9 +15,13 @@ export * from "./ensapi/config/zod-schemas"; export * from "./ensindexer/config/zod-schemas"; export * from "./ensnode/api/indexing-status/zod-schemas"; +export * from "./ensnode/api/name-tokens/examples"; export * from "./ensnode/api/name-tokens/zod-schemas"; +export * from "./ensnode/api/registrar-actions/examples"; export * from "./ensnode/api/registrar-actions/zod-schemas"; +export * from "./ensnode/api/resolution/examples"; export * from "./ensnode/api/resolution/zod-schemas"; +export * from "./ensnode/api/shared/errors/examples"; export * from "./ensnode/api/shared/errors/zod-schemas"; export * from "./ensnode/api/shared/pagination/zod-schemas"; export * from "./omnigraph-api/example-queries"; diff --git a/packages/ensnode-sdk/src/registrars/zod-schemas.ts b/packages/ensnode-sdk/src/registrars/zod-schemas.ts index ff6cca19a2..319a6d2b3d 100644 --- a/packages/ensnode-sdk/src/registrars/zod-schemas.ts +++ b/packages/ensnode-sdk/src/registrars/zod-schemas.ts @@ -10,6 +10,7 @@ import { makeNodeSchema, makeNormalizedAddressSchema, makePriceEthSchema, + makeSerializedPriceEthSchema, makeTransactionHashSchema, makeUnixTimestampSchema, } from "../shared/zod-schemas"; @@ -22,6 +23,8 @@ import { type RegistrarActionPricingUnknown, type RegistrarActionReferralAvailable, RegistrarActionTypes, + SerializedRegistrarAction, + SerializedRegistrarActionPricing, } from "./registrar-action"; import type { RegistrationLifecycle } from "./registration-lifecycle"; import { Subregistry } from "./subregistry"; @@ -86,6 +89,27 @@ const makeRegistrarActionPricingSchema = (valueLabel: string = "Registrar Action .transform((v) => v as RegistrarActionPricingUnknown), ]); +/** + * Schema for parsing objects into {@link SerializedRegistrarActionPricing}. + */ +export const makeSerializedRegistrarActionPricingSchema = ( + valueLabel: string = "Serialized Registrar Action Pricing", +) => + z.union([ + // pricing available + z.object({ + baseCost: makeSerializedPriceEthSchema(`${valueLabel} Base Cost`), + premium: makeSerializedPriceEthSchema(`${valueLabel} Premium`), + total: makeSerializedPriceEthSchema(`${valueLabel} Total`), + }), + // pricing unknown + z.object({ + baseCost: z.null(), + premium: z.null(), + total: z.null(), + }), + ]); + /** Invariant: decodedReferrer is based on encodedReferrer */ function invariant_registrarActionDecodedReferrerBasedOnRawReferrer( ctx: ParsePayload, @@ -156,22 +180,25 @@ const EventIdsSchema = z .min(1) .transform((v) => v as [RegistrarActionEventId, ...RegistrarActionEventId[]]); +// Base schema without refinements - can be extended +const makeBaseRegistrarActionSchemaWithoutCheck = (valueLabel: string = "Base Registrar Action") => + z.object({ + id: EventIdSchema, + incrementalDuration: makeDurationSchema(`${valueLabel} Incremental Duration`), + registrant: makeNormalizedAddressSchema(`${valueLabel} Registrant`), + registrationLifecycle: makeRegistrationLifecycleSchema(`${valueLabel} Registration Lifecycle`), + pricing: makeRegistrarActionPricingSchema(`${valueLabel} Pricing`), + referral: makeRegistrarActionReferralSchema(`${valueLabel} Referral`), + block: makeBlockRefSchema(`${valueLabel} Block`), + transactionHash: makeTransactionHashSchema(`${valueLabel} Transaction Hash`), + eventIds: EventIdsSchema, + }); + +// Base schema with refinements - used for parsing/validation export const makeBaseRegistrarActionSchema = (valueLabel: string = "Base Registrar Action") => - z - .object({ - id: EventIdSchema, - incrementalDuration: makeDurationSchema(`${valueLabel} Incremental Duration`), - registrant: makeNormalizedAddressSchema(`${valueLabel} Registrant`), - registrationLifecycle: makeRegistrationLifecycleSchema( - `${valueLabel} Registration Lifecycle`, - ), - pricing: makeRegistrarActionPricingSchema(`${valueLabel} Pricing`), - referral: makeRegistrarActionReferralSchema(`${valueLabel} Referral`), - block: makeBlockRefSchema(`${valueLabel} Block`), - transactionHash: makeTransactionHashSchema(`${valueLabel} Transaction Hash`), - eventIds: EventIdsSchema, - }) - .check(invariant_eventIdsInitialElementIsTheActionId); + makeBaseRegistrarActionSchemaWithoutCheck(valueLabel).check( + invariant_eventIdsInitialElementIsTheActionId, + ); export const makeRegistrarActionRegistrationSchema = (valueLabel: string = "Registration ") => makeBaseRegistrarActionSchema(valueLabel).extend({ @@ -191,3 +218,33 @@ export const makeRegistrarActionSchema = (valueLabel: string = "Registrar Action makeRegistrarActionRegistrationSchema(`${valueLabel} Registration`), makeRegistrarActionRenewalSchema(`${valueLabel} Renewal`), ]); + +const makeSerializedBaseRegistrarActionSchema = ( + valueLabel: string = "Serialized Base Registrar Action", +) => + makeBaseRegistrarActionSchemaWithoutCheck(valueLabel).extend({ + pricing: makeSerializedRegistrarActionPricingSchema(`${valueLabel} Pricing`), + }); + +const makeSerializedRegistrarActionRegistrationSchema = ( + valueLabel: string = "Serialized Registration", +) => + makeSerializedBaseRegistrarActionSchema(valueLabel).extend({ + type: z.literal(RegistrarActionTypes.Registration), + }); + +const makeSerializedRegistrarActionRenewalSchema = (valueLabel: string = "Serialized Renewal") => + makeSerializedBaseRegistrarActionSchema(valueLabel).extend({ + type: z.literal(RegistrarActionTypes.Renewal), + }); + +/** + * Schema for {@link SerializedRegistrarAction} + */ +export const makeSerializedRegistrarActionSchema = ( + valueLabel: string = "Serialized Registrar Action", +) => + z.discriminatedUnion("type", [ + makeSerializedRegistrarActionRegistrationSchema(`${valueLabel} Registration`), + makeSerializedRegistrarActionRenewalSchema(`${valueLabel} Renewal`), + ]); diff --git a/packages/ensnode-sdk/src/shared/zod-schemas.ts b/packages/ensnode-sdk/src/shared/zod-schemas.ts index 92746e9618..d9a352f591 100644 --- a/packages/ensnode-sdk/src/shared/zod-schemas.ts +++ b/packages/ensnode-sdk/src/shared/zod-schemas.ts @@ -29,6 +29,7 @@ import { type PriceDai, type PriceEth, type PriceUsdc, + type SerializedPriceEth, } from "./currencies"; import type { BlockRef, Datetime } from "./types"; @@ -242,6 +243,11 @@ const makePriceAmountSchema = (valueLabel: string = "Amount") => error: `${valueLabel} must not be negative.`, }); +const makeSerializedCurrencyAmountSchema = (valueLabel: string = "Serialized Currency Amount") => + z.string({ error: `${valueLabel} must be a string.` }).regex(/^\d+$/, { + error: `${valueLabel} can only contain digits (0-9) and must represent a non-negative integer.`, + }); + export const makePriceCurrencySchema = ( currency: CurrencyId, valueLabel: string = "Price Currency", @@ -254,6 +260,18 @@ export const makePriceCurrencySchema = ( }), }); +export const makeSerializedPriceCurrencySchema = ( + currency: CurrencyId, + valueLabel: string = "Price Currency", +) => + z.strictObject({ + amount: makeSerializedCurrencyAmountSchema(`${valueLabel} amount`), + + currency: z.literal(currency, { + error: `${valueLabel} currency must be set to '${currency}'.`, + }), + }); + /** * Schema for {@link Price} type. */ @@ -274,6 +292,11 @@ export const makePriceSchema = (valueLabel: string = "Price") => export const makePriceEthSchema = (valueLabel: string = "Price ETH") => makePriceCurrencySchema(CurrencyIds.ETH, valueLabel).transform((v) => v as PriceEth); +export const makeSerializedPriceEthSchema = (valueLabel: string = "Serialized Price ETH") => + makeSerializedPriceCurrencySchema(CurrencyIds.ETH, valueLabel).transform( + (v) => v as SerializedPriceEth, + ); + /** * Schema for {@link PriceUsdc} type. */ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0caa9006c1..3b1eaa0da0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,7 +14,7 @@ catalogs: version: 6.0.2 '@hono/node-server': specifier: ^1.19.13 - version: 1.19.13 + version: 1.19.14 '@ponder/client': specifier: 0.16.6 version: 0.16.6 @@ -121,13 +121,13 @@ overrides: yauzl@<3.2.1: ^3.2.1 fast-xml-parser@>=5.0.0 <5.5.7: '>=5.5.7' kysely@>=0.26.0 <0.28.14: '>=0.28.14' + defu@<=6.1.4: ^6.1.5 h3@<1.15.9: '>=1.15.9' yaml@>=2.0.0 <2.8.3: '>=2.8.3' picomatch@<2.3.2: ^2.3.2 picomatch@>=4.0.0 <4.0.4: '>=4.0.4' smol-toml@<1.6.1: '>=1.6.1' brace-expansion@>=4.0.0 <5.0.5: '>=5.0.5' - defu@<=6.1.4: ^6.1.5 vite@>=5.0.0 <=6.4.1: ^6.4.2 axios@<1.15.0: '>=1.15.0' follow-redirects@<1.16.0: ^1.16.0 @@ -163,16 +163,16 @@ importers: version: 7.0.0-dev.20260128.1 jsdom: specifier: ^27.0.1 - version: 27.0.1(postcss@8.5.8) + version: 27.0.1(postcss@8.5.6) tsup: specifier: 'catalog:' - version: 8.5.0(jiti@2.6.1)(postcss@8.5.8)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.3) + version: 8.5.0(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.3) typescript: specifier: 'catalog:' version: 5.9.3 vitest: specifier: 'catalog:' - version: 4.0.5(@types/debug@4.1.12)(@types/node@24.10.9)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.8))(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.3) + version: 4.0.5(@types/debug@4.1.12)(@types/node@24.10.9)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.3) apps/ensadmin: dependencies: @@ -353,7 +353,7 @@ importers: version: link:../../packages/ponder-subgraph '@hono/node-server': specifier: 'catalog:' - version: 1.19.13(hono@4.12.14) + version: 1.19.14(hono@4.12.14) '@hono/otel': specifier: ^0.2.2 version: 0.2.2(hono@4.12.14) @@ -489,7 +489,7 @@ importers: version: 5.9.3 vitest: specifier: 'catalog:' - version: 4.0.5(@types/debug@4.1.12)(@types/node@24.10.9)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.8))(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.3) + version: 4.0.5(@types/debug@4.1.12)(@types/node@24.10.9)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.3) apps/ensindexer: dependencies: @@ -565,7 +565,7 @@ importers: version: 5.9.3 vitest: specifier: 'catalog:' - version: 4.0.5(@types/debug@4.1.12)(@types/node@24.10.9)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.8))(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.3) + version: 4.0.5(@types/debug@4.1.12)(@types/node@24.10.9)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.3) apps/ensrainbow: dependencies: @@ -580,7 +580,7 @@ importers: version: 5.0.5 '@hono/node-server': specifier: 'catalog:' - version: 1.19.13(hono@4.12.14) + version: 1.19.14(hono@4.12.14) classic-level: specifier: ^1.4.1 version: 1.4.1 @@ -632,7 +632,7 @@ importers: version: 5.9.3 vitest: specifier: 'catalog:' - version: 4.0.5(@types/debug@4.1.12)(@types/node@24.10.9)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.8))(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.3) + version: 4.0.5(@types/debug@4.1.12)(@types/node@24.10.9)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.3) apps/fallback-ensapi: dependencies: @@ -654,7 +654,7 @@ importers: version: link:../../packages/shared-configs '@hono/node-server': specifier: 'catalog:' - version: 1.19.13(hono@4.12.14) + version: 1.19.14(hono@4.12.14) '@types/node': specifier: 'catalog:' version: 24.10.9 @@ -669,7 +669,7 @@ importers: version: 5.9.3 vitest: specifier: 'catalog:' - version: 4.0.5(@types/debug@4.1.12)(@types/node@24.10.9)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.8))(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.3) + version: 4.0.5(@types/debug@4.1.12)(@types/node@24.10.9)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.3) docs/ensnode.io: dependencies: @@ -711,7 +711,7 @@ importers: version: 20.1.2 '@scalar/astro': specifier: ^0.2.4 - version: 0.2.4(astro@5.18.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.59.0)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.3)) + version: 0.2.9(astro@5.18.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.59.0)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.3)) '@tailwindcss/vite': specifier: ^4.1.15 version: 4.1.16(vite@7.3.2(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.3)) @@ -862,7 +862,7 @@ importers: version: 24.10.9 tsup: specifier: 'catalog:' - version: 8.5.0(jiti@2.6.1)(postcss@8.5.8)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.3) + version: 8.5.0(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.3) typescript: specifier: 'catalog:' version: 5.9.3 @@ -871,7 +871,7 @@ importers: version: 2.38.5(typescript@5.9.3)(zod@4.3.6) vitest: specifier: 'catalog:' - version: 4.0.5(@types/debug@4.1.12)(@types/node@24.10.9)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.8))(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.3) + version: 4.0.5(@types/debug@4.1.12)(@types/node@24.10.9)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.3) packages/ens-referrals: dependencies: @@ -893,7 +893,7 @@ importers: version: 24.10.9 tsup: specifier: ^8.3.6 - version: 8.5.0(jiti@2.6.1)(postcss@8.5.8)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.3) + version: 8.5.0(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.3) typescript: specifier: 'catalog:' version: 5.9.3 @@ -902,7 +902,7 @@ importers: version: 2.38.5(typescript@5.9.3)(zod@4.3.6) vitest: specifier: 'catalog:' - version: 4.0.5(@types/debug@4.1.12)(@types/node@24.10.9)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.8))(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.3) + version: 4.0.5(@types/debug@4.1.12)(@types/node@24.10.9)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.3) packages/enscli: {} @@ -935,7 +935,7 @@ importers: version: 0.16.6(@opentelemetry/api@1.9.0(patch_hash=4b2adeefaf7c22f9987d0a125d69cab900719bec7ed7636648bea6947107033a))(@types/node@24.10.9)(@types/pg@8.16.0)(hono@4.12.14)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(typescript@5.9.3)(viem@2.38.5(typescript@5.9.3)(zod@4.3.6))(yaml@2.8.3)(zod@4.3.6) tsup: specifier: 'catalog:' - version: 8.5.0(jiti@2.6.1)(postcss@8.5.8)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.3) + version: 8.5.0(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.3) typescript: specifier: 'catalog:' version: 5.9.3 @@ -944,7 +944,7 @@ importers: version: 2.38.5(typescript@5.9.3)(zod@4.3.6) vitest: specifier: 'catalog:' - version: 4.0.5(@types/debug@4.1.12)(@types/node@24.10.9)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.8))(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.3) + version: 4.0.5(@types/debug@4.1.12)(@types/node@24.10.9)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.3) packages/enskit: dependencies: @@ -978,7 +978,7 @@ importers: version: 19.2.1 tsup: specifier: 'catalog:' - version: 8.5.0(jiti@2.6.1)(postcss@8.5.8)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.3) + version: 8.5.0(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.3) typescript: specifier: 'catalog:' version: 5.9.3 @@ -987,7 +987,7 @@ importers: version: 2.38.5(typescript@5.9.3)(zod@4.3.6) vitest: specifier: 'catalog:' - version: 4.0.5(@types/debug@4.1.12)(@types/node@24.10.9)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.8))(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.3) + version: 4.0.5(@types/debug@4.1.12)(@types/node@24.10.9)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.3) packages/ensnode-react: dependencies: @@ -1018,13 +1018,13 @@ importers: version: 19.2.1 tsup: specifier: ^8.3.6 - version: 8.5.0(jiti@2.6.1)(postcss@8.5.8)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.3) + version: 8.5.0(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.3) typescript: specifier: 'catalog:' version: 5.9.3 vitest: specifier: 'catalog:' - version: 4.0.5(@types/debug@4.1.12)(@types/node@24.10.9)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.8))(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.3) + version: 4.0.5(@types/debug@4.1.12)(@types/node@24.10.9)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.3) packages/ensnode-sdk: dependencies: @@ -1055,7 +1055,7 @@ importers: version: 24.10.9 tsup: specifier: ^8.3.6 - version: 8.5.0(jiti@2.6.1)(postcss@8.5.8)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.3) + version: 8.5.0(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.3) typescript: specifier: 'catalog:' version: 5.9.3 @@ -1064,7 +1064,7 @@ importers: version: 2.38.5(typescript@5.9.3)(zod@4.3.6) vitest: specifier: 'catalog:' - version: 4.0.5(@types/debug@4.1.12)(@types/node@24.10.9)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.8))(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.3) + version: 4.0.5(@types/debug@4.1.12)(@types/node@24.10.9)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.3) packages/ensrainbow-sdk: dependencies: @@ -1083,13 +1083,13 @@ importers: version: link:../shared-configs tsup: specifier: 'catalog:' - version: 8.5.0(jiti@2.6.1)(postcss@8.5.8)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.3) + version: 8.5.0(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.3) typescript: specifier: 'catalog:' version: 5.9.3 vitest: specifier: 'catalog:' - version: 4.0.5(@types/debug@4.1.12)(@types/node@24.10.9)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.8))(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.3) + version: 4.0.5(@types/debug@4.1.12)(@types/node@24.10.9)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.3) packages/enssdk: dependencies: @@ -1117,7 +1117,7 @@ importers: version: 16.11.0 tsup: specifier: 'catalog:' - version: 8.5.0(jiti@2.6.1)(postcss@8.5.8)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.3) + version: 8.5.0(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.3) typescript: specifier: 'catalog:' version: 5.9.3 @@ -1126,7 +1126,7 @@ importers: version: 2.38.5(typescript@5.9.3)(zod@4.3.6) vitest: specifier: 'catalog:' - version: 4.0.5(@types/debug@4.1.12)(@types/node@24.10.9)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.8))(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.3) + version: 4.0.5(@types/debug@4.1.12)(@types/node@24.10.9)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.3) packages/ensskills: {} @@ -1265,7 +1265,7 @@ importers: version: 24.10.9 tsup: specifier: 'catalog:' - version: 8.5.0(jiti@2.6.1)(postcss@8.5.8)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.3) + version: 8.5.0(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.3) typescript: specifier: 'catalog:' version: 5.9.3 @@ -1274,7 +1274,7 @@ importers: version: 2.38.5(typescript@5.9.3)(zod@4.3.6) vitest: specifier: 'catalog:' - version: 4.0.5(@types/debug@4.1.12)(@types/node@24.10.9)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.8))(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.3) + version: 4.0.5(@types/debug@4.1.12)(@types/node@24.10.9)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.3) zod: specifier: 'catalog:' version: 4.3.6 @@ -1320,7 +1320,7 @@ importers: version: 4.12.14 tsup: specifier: 'catalog:' - version: 8.5.0(jiti@2.6.1)(postcss@8.5.8)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.3) + version: 8.5.0(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.3) typescript: specifier: 'catalog:' version: 5.9.3 @@ -1628,11 +1628,6 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - '@babel/parser@7.29.2': - resolution: {integrity: sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==} - engines: {node: '>=6.0.0'} - hasBin: true - '@babel/plugin-transform-react-jsx-self@7.27.1': resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} engines: {node: '>=6.9.0'} @@ -1653,10 +1648,6 @@ packages: resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} engines: {node: '>=6.9.0'} - '@babel/runtime@7.29.2': - resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} - engines: {node: '>=6.9.0'} - '@babel/template@7.27.2': resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} @@ -1669,10 +1660,6 @@ packages: resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} engines: {node: '>=6.9.0'} - '@babel/types@7.29.0': - resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} - engines: {node: '>=6.9.0'} - '@balena/dockerignore@1.0.2': resolution: {integrity: sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==} @@ -1950,8 +1937,8 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.27.7': - resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} + '@esbuild/aix-ppc64@0.27.4': + resolution: {integrity: sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] @@ -1968,8 +1955,8 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.27.7': - resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==} + '@esbuild/android-arm64@0.27.4': + resolution: {integrity: sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==} engines: {node: '>=18'} cpu: [arm64] os: [android] @@ -1986,8 +1973,8 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.27.7': - resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==} + '@esbuild/android-arm@0.27.4': + resolution: {integrity: sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==} engines: {node: '>=18'} cpu: [arm] os: [android] @@ -2004,8 +1991,8 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.27.7': - resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==} + '@esbuild/android-x64@0.27.4': + resolution: {integrity: sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==} engines: {node: '>=18'} cpu: [x64] os: [android] @@ -2022,8 +2009,8 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.27.7': - resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==} + '@esbuild/darwin-arm64@0.27.4': + resolution: {integrity: sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] @@ -2040,8 +2027,8 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.27.7': - resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==} + '@esbuild/darwin-x64@0.27.4': + resolution: {integrity: sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==} engines: {node: '>=18'} cpu: [x64] os: [darwin] @@ -2058,8 +2045,8 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.27.7': - resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==} + '@esbuild/freebsd-arm64@0.27.4': + resolution: {integrity: sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] @@ -2076,8 +2063,8 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.27.7': - resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==} + '@esbuild/freebsd-x64@0.27.4': + resolution: {integrity: sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] @@ -2094,8 +2081,8 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.27.7': - resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==} + '@esbuild/linux-arm64@0.27.4': + resolution: {integrity: sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==} engines: {node: '>=18'} cpu: [arm64] os: [linux] @@ -2112,8 +2099,8 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.27.7': - resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==} + '@esbuild/linux-arm@0.27.4': + resolution: {integrity: sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==} engines: {node: '>=18'} cpu: [arm] os: [linux] @@ -2130,8 +2117,8 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.27.7': - resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==} + '@esbuild/linux-ia32@0.27.4': + resolution: {integrity: sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==} engines: {node: '>=18'} cpu: [ia32] os: [linux] @@ -2148,8 +2135,8 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.27.7': - resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==} + '@esbuild/linux-loong64@0.27.4': + resolution: {integrity: sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==} engines: {node: '>=18'} cpu: [loong64] os: [linux] @@ -2166,8 +2153,8 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.27.7': - resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==} + '@esbuild/linux-mips64el@0.27.4': + resolution: {integrity: sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] @@ -2184,8 +2171,8 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.27.7': - resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==} + '@esbuild/linux-ppc64@0.27.4': + resolution: {integrity: sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] @@ -2202,8 +2189,8 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.27.7': - resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==} + '@esbuild/linux-riscv64@0.27.4': + resolution: {integrity: sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] @@ -2220,8 +2207,8 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.27.7': - resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==} + '@esbuild/linux-s390x@0.27.4': + resolution: {integrity: sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==} engines: {node: '>=18'} cpu: [s390x] os: [linux] @@ -2238,8 +2225,8 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.27.7': - resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==} + '@esbuild/linux-x64@0.27.4': + resolution: {integrity: sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA==} engines: {node: '>=18'} cpu: [x64] os: [linux] @@ -2256,8 +2243,8 @@ packages: cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-arm64@0.27.7': - resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==} + '@esbuild/netbsd-arm64@0.27.4': + resolution: {integrity: sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] @@ -2274,8 +2261,8 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.27.7': - resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==} + '@esbuild/netbsd-x64@0.27.4': + resolution: {integrity: sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] @@ -2292,8 +2279,8 @@ packages: cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-arm64@0.27.7': - resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==} + '@esbuild/openbsd-arm64@0.27.4': + resolution: {integrity: sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] @@ -2310,8 +2297,8 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.27.7': - resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==} + '@esbuild/openbsd-x64@0.27.4': + resolution: {integrity: sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] @@ -2328,8 +2315,8 @@ packages: cpu: [arm64] os: [openharmony] - '@esbuild/openharmony-arm64@0.27.7': - resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==} + '@esbuild/openharmony-arm64@0.27.4': + resolution: {integrity: sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] @@ -2346,8 +2333,8 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.27.7': - resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==} + '@esbuild/sunos-x64@0.27.4': + resolution: {integrity: sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g==} engines: {node: '>=18'} cpu: [x64] os: [sunos] @@ -2364,8 +2351,8 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.27.7': - resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==} + '@esbuild/win32-arm64@0.27.4': + resolution: {integrity: sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg==} engines: {node: '>=18'} cpu: [arm64] os: [win32] @@ -2382,8 +2369,8 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.27.7': - resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==} + '@esbuild/win32-ia32@0.27.4': + resolution: {integrity: sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw==} engines: {node: '>=18'} cpu: [ia32] os: [win32] @@ -2400,8 +2387,8 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.27.7': - resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==} + '@esbuild/win32-x64@0.27.4': + resolution: {integrity: sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -2614,8 +2601,8 @@ packages: peerDependencies: react: '>= 16 || ^19.0.0-rc' - '@hono/node-server@1.19.13': - resolution: {integrity: sha512-TsQLe4i2gvoTtrHje625ngThGBySOgSK3Xo2XRYOdqGN1teR8+I7vchQC46uLJi8OF62YTYA3AhSpumtkhsaKQ==} + '@hono/node-server@1.19.14': + resolution: {integrity: sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw==} engines: {node: '>=18.14.1'} peerDependencies: hono: ^4 @@ -2668,6 +2655,12 @@ packages: cpu: [arm64] os: [darwin] + '@img/sharp-darwin-arm64@0.34.4': + resolution: {integrity: sha512-sitdlPzDVyvmINUdJle3TNHl+AG9QcwiAMsXmccqsCOMZNIdW2/7S26w0LyU8euiLVzFBL3dXPwVCq/ODnf2vA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + '@img/sharp-darwin-arm64@0.34.5': resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -2680,6 +2673,12 @@ packages: cpu: [x64] os: [darwin] + '@img/sharp-darwin-x64@0.34.4': + resolution: {integrity: sha512-rZheupWIoa3+SOdF/IcUe1ah4ZDpKBGWcsPX6MT0lYniH9micvIU7HQkYTfrx5Xi8u+YqwLtxC/3vl8TQN6rMg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + '@img/sharp-darwin-x64@0.34.5': resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -2691,6 +2690,11 @@ packages: cpu: [arm64] os: [darwin] + '@img/sharp-libvips-darwin-arm64@1.2.3': + resolution: {integrity: sha512-QzWAKo7kpHxbuHqUC28DZ9pIKpSi2ts2OJnoIGI26+HMgq92ZZ4vk8iJd4XsxN+tYfNJxzH6W62X5eTcsBymHw==} + cpu: [arm64] + os: [darwin] + '@img/sharp-libvips-darwin-arm64@1.2.4': resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} cpu: [arm64] @@ -2701,6 +2705,11 @@ packages: cpu: [x64] os: [darwin] + '@img/sharp-libvips-darwin-x64@1.2.3': + resolution: {integrity: sha512-Ju+g2xn1E2AKO6YBhxjj+ACcsPQRHT0bhpglxcEf+3uyPY+/gL8veniKoo96335ZaPo03bdDXMv0t+BBFAbmRA==} + cpu: [x64] + os: [darwin] + '@img/sharp-libvips-darwin-x64@1.2.4': resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} cpu: [x64] @@ -2712,6 +2721,12 @@ packages: os: [linux] libc: [glibc] + '@img/sharp-libvips-linux-arm64@1.2.3': + resolution: {integrity: sha512-I4RxkXU90cpufazhGPyVujYwfIm9Nk1QDEmiIsaPwdnm013F7RIceaCc87kAH+oUB1ezqEvC6ga4m7MSlqsJvQ==} + cpu: [arm64] + os: [linux] + libc: [glibc] + '@img/sharp-libvips-linux-arm64@1.2.4': resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} cpu: [arm64] @@ -2724,12 +2739,24 @@ packages: os: [linux] libc: [glibc] + '@img/sharp-libvips-linux-arm@1.2.3': + resolution: {integrity: sha512-x1uE93lyP6wEwGvgAIV0gP6zmaL/a0tGzJs/BIDDG0zeBhMnuUPm7ptxGhUbcGs4okDJrk4nxgrmxpib9g6HpA==} + cpu: [arm] + os: [linux] + libc: [glibc] + '@img/sharp-libvips-linux-arm@1.2.4': resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} cpu: [arm] os: [linux] libc: [glibc] + '@img/sharp-libvips-linux-ppc64@1.2.3': + resolution: {integrity: sha512-Y2T7IsQvJLMCBM+pmPbM3bKT/yYJvVtLJGfCs4Sp95SjvnFIjynbjzsa7dY1fRJX45FTSfDksbTp6AGWudiyCg==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + '@img/sharp-libvips-linux-ppc64@1.2.4': resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} cpu: [ppc64] @@ -2748,6 +2775,12 @@ packages: os: [linux] libc: [glibc] + '@img/sharp-libvips-linux-s390x@1.2.3': + resolution: {integrity: sha512-RgWrs/gVU7f+K7P+KeHFaBAJlNkD1nIZuVXdQv6S+fNA6syCcoboNjsV2Pou7zNlVdNQoQUpQTk8SWDHUA3y/w==} + cpu: [s390x] + os: [linux] + libc: [glibc] + '@img/sharp-libvips-linux-s390x@1.2.4': resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} cpu: [s390x] @@ -2760,6 +2793,12 @@ packages: os: [linux] libc: [glibc] + '@img/sharp-libvips-linux-x64@1.2.3': + resolution: {integrity: sha512-3JU7LmR85K6bBiRzSUc/Ff9JBVIFVvq6bomKE0e63UXGeRw2HPVEjoJke1Yx+iU4rL7/7kUjES4dZ/81Qjhyxg==} + cpu: [x64] + os: [linux] + libc: [glibc] + '@img/sharp-libvips-linux-x64@1.2.4': resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} cpu: [x64] @@ -2772,6 +2811,12 @@ packages: os: [linux] libc: [musl] + '@img/sharp-libvips-linuxmusl-arm64@1.2.3': + resolution: {integrity: sha512-F9q83RZ8yaCwENw1GieztSfj5msz7GGykG/BA+MOUefvER69K/ubgFHNeSyUu64amHIYKGDs4sRCMzXVj8sEyw==} + cpu: [arm64] + os: [linux] + libc: [musl] + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} cpu: [arm64] @@ -2784,6 +2829,12 @@ packages: os: [linux] libc: [musl] + '@img/sharp-libvips-linuxmusl-x64@1.2.3': + resolution: {integrity: sha512-U5PUY5jbc45ANM6tSJpsgqmBF/VsL6LnxJmIf11kB7J5DctHgqm0SkuXzVWtIY90GnJxKnC/JT251TDnk1fu/g==} + cpu: [x64] + os: [linux] + libc: [musl] + '@img/sharp-libvips-linuxmusl-x64@1.2.4': resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} cpu: [x64] @@ -2797,6 +2848,13 @@ packages: os: [linux] libc: [glibc] + '@img/sharp-linux-arm64@0.34.4': + resolution: {integrity: sha512-YXU1F/mN/Wu786tl72CyJjP/Ngl8mGHN1hST4BGl+hiW5jhCnV2uRVTNOcaYPs73NeT/H8Upm3y9582JVuZHrQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + '@img/sharp-linux-arm64@0.34.5': resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -2811,6 +2869,13 @@ packages: os: [linux] libc: [glibc] + '@img/sharp-linux-arm@0.34.4': + resolution: {integrity: sha512-Xyam4mlqM0KkTHYVSuc6wXRmM7LGN0P12li03jAnZ3EJWZqj83+hi8Y9UxZUbxsgsK1qOEwg7O0Bc0LjqQVtxA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + libc: [glibc] + '@img/sharp-linux-arm@0.34.5': resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -2818,6 +2883,13 @@ packages: os: [linux] libc: [glibc] + '@img/sharp-linux-ppc64@0.34.4': + resolution: {integrity: sha512-F4PDtF4Cy8L8hXA2p3TO6s4aDt93v+LKmpcYFLAVdkkD3hSxZzee0rh6/+94FpAynsuMpLX5h+LRsSG3rIciUQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + '@img/sharp-linux-ppc64@0.34.5': resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -2839,6 +2911,13 @@ packages: os: [linux] libc: [glibc] + '@img/sharp-linux-s390x@0.34.4': + resolution: {integrity: sha512-qVrZKE9Bsnzy+myf7lFKvng6bQzhNUAYcVORq2P7bDlvmF6u2sCmK2KyEQEBdYk+u3T01pVsPrkj943T1aJAsw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + '@img/sharp-linux-s390x@0.34.5': resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -2853,6 +2932,13 @@ packages: os: [linux] libc: [glibc] + '@img/sharp-linux-x64@0.34.4': + resolution: {integrity: sha512-ZfGtcp2xS51iG79c6Vhw9CWqQC8l2Ot8dygxoDoIQPTat/Ov3qAa8qpxSrtAEAJW+UjTXc4yxCjNfxm4h6Xm2A==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + libc: [glibc] + '@img/sharp-linux-x64@0.34.5': resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -2867,6 +2953,13 @@ packages: os: [linux] libc: [musl] + '@img/sharp-linuxmusl-arm64@0.34.4': + resolution: {integrity: sha512-8hDVvW9eu4yHWnjaOOR8kHVrew1iIX+MUgwxSuH2XyYeNRtLUe4VNioSqbNkB7ZYQJj9rUTT4PyRscyk2PXFKA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + libc: [musl] + '@img/sharp-linuxmusl-arm64@0.34.5': resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -2881,6 +2974,13 @@ packages: os: [linux] libc: [musl] + '@img/sharp-linuxmusl-x64@0.34.4': + resolution: {integrity: sha512-lU0aA5L8QTlfKjpDCEFOZsTYGn3AEiO6db8W5aQDxj0nQkVrZWmN3ZP9sYKWJdtq3PWPhUNlqehWyXpYDcI9Sg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + libc: [musl] + '@img/sharp-linuxmusl-x64@0.34.5': resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -2893,11 +2993,22 @@ packages: engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [wasm32] + '@img/sharp-wasm32@0.34.4': + resolution: {integrity: sha512-33QL6ZO/qpRyG7woB/HUALz28WnTMI2W1jgX3Nu2bypqLIKx/QKMILLJzJjI+SIbvXdG9fUnmrxR7vbi1sTBeA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + '@img/sharp-wasm32@0.34.5': resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [wasm32] + '@img/sharp-win32-arm64@0.34.4': + resolution: {integrity: sha512-2Q250do/5WXTwxW3zjsEuMSv5sUU4Tq9VThWKlU2EYLm4MB7ZeMwF+SFJutldYODXF6jzc6YEOC+VfX0SZQPqA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [win32] + '@img/sharp-win32-arm64@0.34.5': resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -2910,6 +3021,12 @@ packages: cpu: [ia32] os: [win32] + '@img/sharp-win32-ia32@0.34.4': + resolution: {integrity: sha512-3ZeLue5V82dT92CNL6rsal6I2weKw1cYu+rGKm8fOCCtJTR2gYeUfY3FqUnIJsMUPIH68oS5jmZ0NiJ508YpEw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + '@img/sharp-win32-ia32@0.34.5': resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -2922,6 +3039,12 @@ packages: cpu: [x64] os: [win32] + '@img/sharp-win32-x64@0.34.4': + resolution: {integrity: sha512-xIyj4wpYs8J18sVN3mSQjwrw7fKUqRw+Z5rnHNCy5fYTxigBz81u5mOMPmFumwjcn8+ld1ppptMBCLic1nz6ig==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + '@img/sharp-win32-x64@0.34.5': resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -4065,22 +4188,22 @@ packages: cpu: [x64] os: [win32] - '@scalar/astro@0.2.4': - resolution: {integrity: sha512-5nlUsC6tbR6bOq+WT2NDbc6yOVmysZE2L9Vq9t3YgV0Q6m96sCmfmdTsWKEM82ZrqMSTVZPnOMYvPZZTXVothA==} + '@scalar/astro@0.2.9': + resolution: {integrity: sha512-KOmQMAolj3vkvHXnLmKY3kL8q2/yml2gsY0s6Mn3Wr372xPIiF+CTuWoog3z4BU+VlvEgTdpltq0cIl53yyEHg==} engines: {node: '>=22'} peerDependencies: astro: ^4.0.0 || ^5.0.0 - '@scalar/core@0.4.4': - resolution: {integrity: sha512-eXIG0opyQn45FzpTp0dAWFP1Vjcx+helgUAsa0uN36tyUR7DSmz2kRwHqqedzvPWryeRCKPz7/vwzKpETZp5lg==} + '@scalar/client-side-rendering@0.1.2': + resolution: {integrity: sha512-gX2QIc+lpErO9RWkJmt02sBZoCOjyZ7EiLLEyGj7x9UKkk7E4zj6Wbk1eUPo6i3oIwhtZ+Vybj/xzexCK2bxwA==} engines: {node: '>=22'} - '@scalar/helpers@0.4.2': - resolution: {integrity: sha512-IrgrGVSahCfYDNWITazz4Q1BOndp5eEzlimRkfxiYn++KqeWyLfALyym1omqcdKGYtiSx1KIbKaUJL9vkjaN7w==} + '@scalar/helpers@0.5.1': + resolution: {integrity: sha512-9VvPfv8b+YZVIFwR3SWeq4Y8ij/kU3/kf2M6NKcbf2iVyh63d8s0ssap5m/nOhiz/Puidv/29MAJlJCA0LRssA==} engines: {node: '>=22'} - '@scalar/types@0.7.4': - resolution: {integrity: sha512-1o9uf42lZ9YD0XP/HMWrwXN0unx6vFTTgtduA1F28Yloea9Pfv9N2R/t0wO91iSIzw4+NubEFolunbdb2QcgHA==} + '@scalar/types@0.9.1': + resolution: {integrity: sha512-3EbkhtQc+XuDE8Ur1MPosM3YTACFIFNba4M3vGulqv8jcvhMXT+KWPvGUJxq0CDvySqjGa8cE6w85v8T+MjDng==} engines: {node: '>=22'} '@scure/base@1.2.6': @@ -6179,8 +6302,8 @@ packages: engines: {node: '>=18'} hasBin: true - esbuild@0.27.7: - resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} + esbuild@0.27.4: + resolution: {integrity: sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==} engines: {node: '>=18'} hasBin: true @@ -6302,8 +6425,8 @@ packages: fast-xml-builder@1.1.4: resolution: {integrity: sha512-f2jhpN4Eccy0/Uz9csxh3Nu6q4ErKxf0XIsasomfOihuSUa3/xw6w8dnOtCDgEItQFJG8KyXPzQXzcODDrrbOg==} - fast-xml-parser@5.5.9: - resolution: {integrity: sha512-jldvxr1MC6rtiZKgrFnDSvT8xuH+eJqxqOBThUVjYrxssYTo1avZLGql5l0a0BAERR01CadYzZ83kVEkbyDg+g==} + fast-xml-parser@5.5.8: + resolution: {integrity: sha512-Z7Fh2nVQSb2d+poDViM063ix2ZGt9jmY1nWhPfHBOK2Hgnb/OW3P4Et3P/81SEej0J7QbWtJqxO05h8QYfK7LQ==} hasBin: true fastq@1.19.1: @@ -7468,8 +7591,8 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - nanoid@5.1.7: - resolution: {integrity: sha512-ua3NDgISf6jdwezAheMOk4mbE1LXjm1DfMUDMuJf4AqxLFK3ccGpgWizwa5YV7Yz9EpXwEaWoRXSb/BnV0t5dQ==} + nanoid@5.1.9: + resolution: {integrity: sha512-ZUvP7KeBLe3OZ1ypw6dI/TzYJuvHP77IM4Ry73waSQTLn8/g8rpdjfyVAh7t1/+FjBtG4lCP42MEbDxOsRpBMw==} engines: {node: ^18 || >=20} hasBin: true @@ -7960,10 +8083,6 @@ packages: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} - postcss@8.5.8: - resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==} - engines: {node: ^10 || ^12 || >=14} - postgres-array@2.0.0: resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} engines: {node: '>=4'} @@ -8433,6 +8552,10 @@ packages: resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + sharp@0.34.4: + resolution: {integrity: sha512-FUH39xp3SBPnxWvd5iib1X8XY7J0K0X7d93sie9CJg2PO8/7gmg89Nve6OjItK53/MlAushNNxteBYfM6DEuoA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + sharp@0.34.5: resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -8636,8 +8759,8 @@ packages: resolution: {integrity: sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==} engines: {node: '>=14.16'} - strnum@2.2.2: - resolution: {integrity: sha512-DnR90I+jtXNSTXWdwrEy9FakW7UX+qUZg28gj5fk2vxxl7uS/3bpI4fjFYVmdK9etptYBPNkpahuQnEwhwECqA==} + strnum@2.2.0: + resolution: {integrity: sha512-Y7Bj8XyJxnPAORMZj/xltsfo55uOiyHcU2tnAVzHUnSJR/KsEX+9RoDeXEnsXtl/CX4fAcrt64gZ13aGaWPeBg==} stubborn-fs@2.0.0: resolution: {integrity: sha512-Y0AvSwDw8y+nlSNFXMm2g6L51rBGdAQT20J3YSOqxC53Lo3bjWRtr2BKcfYoAf352WYpsZSTURrA0tqhfgudPA==} @@ -8932,8 +9055,8 @@ packages: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} - type-fest@5.5.0: - resolution: {integrity: sha512-PlBfpQwiUvGViBNX84Yxwjsdhd1TUlXr6zjX7eoirtCPIr08NAmxwa+fcYBTeRQxHo9YC9wwF3m9i700sHma8g==} + type-fest@5.6.0: + resolution: {integrity: sha512-8ZiHFm91orbSAe2PSAiSVBVko18pbhbiB3U9GglSzF/zCGkR+rxpHx6sEMCUm4kxY4LjDIUGgCfUMtwfZfjfUA==} engines: {node: '>=20'} typesafe-path@0.2.2: @@ -9884,9 +10007,9 @@ snapshots: '@astrojs/tailwind@6.0.2(astro@5.18.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.59.0)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.3))(tailwindcss@4.1.5)(ts-node@10.9.2(@types/node@24.10.9)(typescript@5.9.3))': dependencies: astro: 5.18.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.59.0)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.3) - autoprefixer: 10.4.21(postcss@8.5.8) - postcss: 8.5.8 - postcss-load-config: 4.0.2(postcss@8.5.8)(ts-node@10.9.2(@types/node@24.10.9)(typescript@5.9.3)) + autoprefixer: 10.4.21(postcss@8.5.6) + postcss: 8.5.6 + postcss-load-config: 4.0.2(postcss@8.5.6)(ts-node@10.9.2(@types/node@24.10.9)(typescript@5.9.3)) tailwindcss: 4.1.5 transitivePeerDependencies: - ts-node @@ -10226,7 +10349,7 @@ snapshots: '@aws-sdk/xml-builder@3.972.9': dependencies: '@smithy/types': 4.13.0 - fast-xml-parser: 5.5.9 + fast-xml-parser: 5.5.8 tslib: 2.8.1 '@aws/lambda-invoke-store@0.2.3': {} @@ -10310,10 +10433,6 @@ snapshots: dependencies: '@babel/types': 7.28.5 - '@babel/parser@7.29.2': - dependencies: - '@babel/types': 7.29.0 - '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -10328,8 +10447,6 @@ snapshots: '@babel/runtime@7.28.6': {} - '@babel/runtime@7.29.2': {} - '@babel/template@7.27.2': dependencies: '@babel/code-frame': 7.29.0 @@ -10353,11 +10470,6 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 - '@babel/types@7.29.0': - dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 - '@balena/dockerignore@1.0.2': {} '@biomejs/biome@2.3.2': @@ -10607,11 +10719,6 @@ snapshots: '@csstools/css-syntax-patches-for-csstree@1.0.14(postcss@8.5.6)': dependencies: postcss: 8.5.6 - optional: true - - '@csstools/css-syntax-patches-for-csstree@1.0.14(postcss@8.5.8)': - dependencies: - postcss: 8.5.8 '@csstools/css-tokenizer@3.0.4': {} @@ -10735,7 +10842,7 @@ snapshots: '@esbuild/aix-ppc64@0.27.2': optional: true - '@esbuild/aix-ppc64@0.27.7': + '@esbuild/aix-ppc64@0.27.4': optional: true '@esbuild/android-arm64@0.25.11': @@ -10744,7 +10851,7 @@ snapshots: '@esbuild/android-arm64@0.27.2': optional: true - '@esbuild/android-arm64@0.27.7': + '@esbuild/android-arm64@0.27.4': optional: true '@esbuild/android-arm@0.25.11': @@ -10753,7 +10860,7 @@ snapshots: '@esbuild/android-arm@0.27.2': optional: true - '@esbuild/android-arm@0.27.7': + '@esbuild/android-arm@0.27.4': optional: true '@esbuild/android-x64@0.25.11': @@ -10762,7 +10869,7 @@ snapshots: '@esbuild/android-x64@0.27.2': optional: true - '@esbuild/android-x64@0.27.7': + '@esbuild/android-x64@0.27.4': optional: true '@esbuild/darwin-arm64@0.25.11': @@ -10771,7 +10878,7 @@ snapshots: '@esbuild/darwin-arm64@0.27.2': optional: true - '@esbuild/darwin-arm64@0.27.7': + '@esbuild/darwin-arm64@0.27.4': optional: true '@esbuild/darwin-x64@0.25.11': @@ -10780,7 +10887,7 @@ snapshots: '@esbuild/darwin-x64@0.27.2': optional: true - '@esbuild/darwin-x64@0.27.7': + '@esbuild/darwin-x64@0.27.4': optional: true '@esbuild/freebsd-arm64@0.25.11': @@ -10789,7 +10896,7 @@ snapshots: '@esbuild/freebsd-arm64@0.27.2': optional: true - '@esbuild/freebsd-arm64@0.27.7': + '@esbuild/freebsd-arm64@0.27.4': optional: true '@esbuild/freebsd-x64@0.25.11': @@ -10798,7 +10905,7 @@ snapshots: '@esbuild/freebsd-x64@0.27.2': optional: true - '@esbuild/freebsd-x64@0.27.7': + '@esbuild/freebsd-x64@0.27.4': optional: true '@esbuild/linux-arm64@0.25.11': @@ -10807,7 +10914,7 @@ snapshots: '@esbuild/linux-arm64@0.27.2': optional: true - '@esbuild/linux-arm64@0.27.7': + '@esbuild/linux-arm64@0.27.4': optional: true '@esbuild/linux-arm@0.25.11': @@ -10816,7 +10923,7 @@ snapshots: '@esbuild/linux-arm@0.27.2': optional: true - '@esbuild/linux-arm@0.27.7': + '@esbuild/linux-arm@0.27.4': optional: true '@esbuild/linux-ia32@0.25.11': @@ -10825,7 +10932,7 @@ snapshots: '@esbuild/linux-ia32@0.27.2': optional: true - '@esbuild/linux-ia32@0.27.7': + '@esbuild/linux-ia32@0.27.4': optional: true '@esbuild/linux-loong64@0.25.11': @@ -10834,7 +10941,7 @@ snapshots: '@esbuild/linux-loong64@0.27.2': optional: true - '@esbuild/linux-loong64@0.27.7': + '@esbuild/linux-loong64@0.27.4': optional: true '@esbuild/linux-mips64el@0.25.11': @@ -10843,7 +10950,7 @@ snapshots: '@esbuild/linux-mips64el@0.27.2': optional: true - '@esbuild/linux-mips64el@0.27.7': + '@esbuild/linux-mips64el@0.27.4': optional: true '@esbuild/linux-ppc64@0.25.11': @@ -10852,7 +10959,7 @@ snapshots: '@esbuild/linux-ppc64@0.27.2': optional: true - '@esbuild/linux-ppc64@0.27.7': + '@esbuild/linux-ppc64@0.27.4': optional: true '@esbuild/linux-riscv64@0.25.11': @@ -10861,7 +10968,7 @@ snapshots: '@esbuild/linux-riscv64@0.27.2': optional: true - '@esbuild/linux-riscv64@0.27.7': + '@esbuild/linux-riscv64@0.27.4': optional: true '@esbuild/linux-s390x@0.25.11': @@ -10870,7 +10977,7 @@ snapshots: '@esbuild/linux-s390x@0.27.2': optional: true - '@esbuild/linux-s390x@0.27.7': + '@esbuild/linux-s390x@0.27.4': optional: true '@esbuild/linux-x64@0.25.11': @@ -10879,7 +10986,7 @@ snapshots: '@esbuild/linux-x64@0.27.2': optional: true - '@esbuild/linux-x64@0.27.7': + '@esbuild/linux-x64@0.27.4': optional: true '@esbuild/netbsd-arm64@0.25.11': @@ -10888,7 +10995,7 @@ snapshots: '@esbuild/netbsd-arm64@0.27.2': optional: true - '@esbuild/netbsd-arm64@0.27.7': + '@esbuild/netbsd-arm64@0.27.4': optional: true '@esbuild/netbsd-x64@0.25.11': @@ -10897,7 +11004,7 @@ snapshots: '@esbuild/netbsd-x64@0.27.2': optional: true - '@esbuild/netbsd-x64@0.27.7': + '@esbuild/netbsd-x64@0.27.4': optional: true '@esbuild/openbsd-arm64@0.25.11': @@ -10906,7 +11013,7 @@ snapshots: '@esbuild/openbsd-arm64@0.27.2': optional: true - '@esbuild/openbsd-arm64@0.27.7': + '@esbuild/openbsd-arm64@0.27.4': optional: true '@esbuild/openbsd-x64@0.25.11': @@ -10915,7 +11022,7 @@ snapshots: '@esbuild/openbsd-x64@0.27.2': optional: true - '@esbuild/openbsd-x64@0.27.7': + '@esbuild/openbsd-x64@0.27.4': optional: true '@esbuild/openharmony-arm64@0.25.11': @@ -10924,7 +11031,7 @@ snapshots: '@esbuild/openharmony-arm64@0.27.2': optional: true - '@esbuild/openharmony-arm64@0.27.7': + '@esbuild/openharmony-arm64@0.27.4': optional: true '@esbuild/sunos-x64@0.25.11': @@ -10933,7 +11040,7 @@ snapshots: '@esbuild/sunos-x64@0.27.2': optional: true - '@esbuild/sunos-x64@0.27.7': + '@esbuild/sunos-x64@0.27.4': optional: true '@esbuild/win32-arm64@0.25.11': @@ -10942,7 +11049,7 @@ snapshots: '@esbuild/win32-arm64@0.27.2': optional: true - '@esbuild/win32-arm64@0.27.7': + '@esbuild/win32-arm64@0.27.4': optional: true '@esbuild/win32-ia32@0.25.11': @@ -10951,7 +11058,7 @@ snapshots: '@esbuild/win32-ia32@0.27.2': optional: true - '@esbuild/win32-ia32@0.27.7': + '@esbuild/win32-ia32@0.27.4': optional: true '@esbuild/win32-x64@0.25.11': @@ -10960,7 +11067,7 @@ snapshots: '@esbuild/win32-x64@0.27.2': optional: true - '@esbuild/win32-x64@0.27.7': + '@esbuild/win32-x64@0.27.4': optional: true '@escape.tech/graphql-armor-max-aliases@2.6.2': @@ -11305,7 +11412,7 @@ snapshots: dependencies: react: 19.2.1 - '@hono/node-server@1.19.13(hono@4.12.14)': + '@hono/node-server@1.19.14(hono@4.12.14)': dependencies: hono: 4.12.14 @@ -11389,6 +11496,11 @@ snapshots: '@img/sharp-libvips-darwin-arm64': 1.0.4 optional: true + '@img/sharp-darwin-arm64@0.34.4': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.2.3 + optional: true + '@img/sharp-darwin-arm64@0.34.5': optionalDependencies: '@img/sharp-libvips-darwin-arm64': 1.2.4 @@ -11399,6 +11511,11 @@ snapshots: '@img/sharp-libvips-darwin-x64': 1.0.4 optional: true + '@img/sharp-darwin-x64@0.34.4': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.2.3 + optional: true + '@img/sharp-darwin-x64@0.34.5': optionalDependencies: '@img/sharp-libvips-darwin-x64': 1.2.4 @@ -11407,27 +11524,42 @@ snapshots: '@img/sharp-libvips-darwin-arm64@1.0.4': optional: true + '@img/sharp-libvips-darwin-arm64@1.2.3': + optional: true + '@img/sharp-libvips-darwin-arm64@1.2.4': optional: true '@img/sharp-libvips-darwin-x64@1.0.4': optional: true + '@img/sharp-libvips-darwin-x64@1.2.3': + optional: true + '@img/sharp-libvips-darwin-x64@1.2.4': optional: true '@img/sharp-libvips-linux-arm64@1.0.4': optional: true + '@img/sharp-libvips-linux-arm64@1.2.3': + optional: true + '@img/sharp-libvips-linux-arm64@1.2.4': optional: true '@img/sharp-libvips-linux-arm@1.0.5': optional: true + '@img/sharp-libvips-linux-arm@1.2.3': + optional: true + '@img/sharp-libvips-linux-arm@1.2.4': optional: true + '@img/sharp-libvips-linux-ppc64@1.2.3': + optional: true + '@img/sharp-libvips-linux-ppc64@1.2.4': optional: true @@ -11437,24 +11569,36 @@ snapshots: '@img/sharp-libvips-linux-s390x@1.0.4': optional: true + '@img/sharp-libvips-linux-s390x@1.2.3': + optional: true + '@img/sharp-libvips-linux-s390x@1.2.4': optional: true '@img/sharp-libvips-linux-x64@1.0.4': optional: true + '@img/sharp-libvips-linux-x64@1.2.3': + optional: true + '@img/sharp-libvips-linux-x64@1.2.4': optional: true '@img/sharp-libvips-linuxmusl-arm64@1.0.4': optional: true + '@img/sharp-libvips-linuxmusl-arm64@1.2.3': + optional: true + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': optional: true '@img/sharp-libvips-linuxmusl-x64@1.0.4': optional: true + '@img/sharp-libvips-linuxmusl-x64@1.2.3': + optional: true + '@img/sharp-libvips-linuxmusl-x64@1.2.4': optional: true @@ -11463,6 +11607,11 @@ snapshots: '@img/sharp-libvips-linux-arm64': 1.0.4 optional: true + '@img/sharp-linux-arm64@0.34.4': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.2.3 + optional: true + '@img/sharp-linux-arm64@0.34.5': optionalDependencies: '@img/sharp-libvips-linux-arm64': 1.2.4 @@ -11473,11 +11622,21 @@ snapshots: '@img/sharp-libvips-linux-arm': 1.0.5 optional: true + '@img/sharp-linux-arm@0.34.4': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.2.3 + optional: true + '@img/sharp-linux-arm@0.34.5': optionalDependencies: '@img/sharp-libvips-linux-arm': 1.2.4 optional: true + '@img/sharp-linux-ppc64@0.34.4': + optionalDependencies: + '@img/sharp-libvips-linux-ppc64': 1.2.3 + optional: true + '@img/sharp-linux-ppc64@0.34.5': optionalDependencies: '@img/sharp-libvips-linux-ppc64': 1.2.4 @@ -11493,6 +11652,11 @@ snapshots: '@img/sharp-libvips-linux-s390x': 1.0.4 optional: true + '@img/sharp-linux-s390x@0.34.4': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.2.3 + optional: true + '@img/sharp-linux-s390x@0.34.5': optionalDependencies: '@img/sharp-libvips-linux-s390x': 1.2.4 @@ -11503,6 +11667,11 @@ snapshots: '@img/sharp-libvips-linux-x64': 1.0.4 optional: true + '@img/sharp-linux-x64@0.34.4': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.2.3 + optional: true + '@img/sharp-linux-x64@0.34.5': optionalDependencies: '@img/sharp-libvips-linux-x64': 1.2.4 @@ -11513,6 +11682,11 @@ snapshots: '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 optional: true + '@img/sharp-linuxmusl-arm64@0.34.4': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.2.3 + optional: true + '@img/sharp-linuxmusl-arm64@0.34.5': optionalDependencies: '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 @@ -11523,6 +11697,11 @@ snapshots: '@img/sharp-libvips-linuxmusl-x64': 1.0.4 optional: true + '@img/sharp-linuxmusl-x64@0.34.4': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.2.3 + optional: true + '@img/sharp-linuxmusl-x64@0.34.5': optionalDependencies: '@img/sharp-libvips-linuxmusl-x64': 1.2.4 @@ -11533,23 +11712,37 @@ snapshots: '@emnapi/runtime': 1.6.0 optional: true + '@img/sharp-wasm32@0.34.4': + dependencies: + '@emnapi/runtime': 1.6.0 + optional: true + '@img/sharp-wasm32@0.34.5': dependencies: '@emnapi/runtime': 1.9.2 optional: true + '@img/sharp-win32-arm64@0.34.4': + optional: true + '@img/sharp-win32-arm64@0.34.5': optional: true '@img/sharp-win32-ia32@0.33.5': optional: true + '@img/sharp-win32-ia32@0.34.4': + optional: true + '@img/sharp-win32-ia32@0.34.5': optional: true '@img/sharp-win32-x64@0.33.5': optional: true + '@img/sharp-win32-x64@0.34.4': + optional: true + '@img/sharp-win32-x64@0.34.5': optional: true @@ -12768,22 +12961,22 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.59.0': optional: true - '@scalar/astro@0.2.4(astro@5.18.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.59.0)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.3))': + '@scalar/astro@0.2.9(astro@5.18.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.59.0)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.3))': dependencies: - '@scalar/core': 0.4.4 + '@scalar/client-side-rendering': 0.1.2 astro: 5.18.1(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.59.0)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.3) - '@scalar/core@0.4.4': + '@scalar/client-side-rendering@0.1.2': dependencies: - '@scalar/types': 0.7.4 + '@scalar/types': 0.9.1 - '@scalar/helpers@0.4.2': {} + '@scalar/helpers@0.5.1': {} - '@scalar/types@0.7.4': + '@scalar/types@0.9.1': dependencies: - '@scalar/helpers': 0.4.2 - nanoid: 5.1.7 - type-fest: 5.5.0 + '@scalar/helpers': 0.5.1 + nanoid: 5.1.9 + type-fest: 5.6.0 zod: 4.3.6 '@scure/base@1.2.6': {} @@ -13314,7 +13507,7 @@ snapshots: '@testing-library/dom@10.4.1': dependencies: '@babel/code-frame': 7.29.0 - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.28.6 '@types/aria-query': 5.0.4 aria-query: 5.3.0 dom-accessibility-api: 0.5.16 @@ -13324,7 +13517,7 @@ snapshots: '@testing-library/react@16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.28.6 '@testing-library/dom': 10.4.1 react: 19.2.1 react-dom: 19.2.1(react@19.2.1) @@ -14061,7 +14254,7 @@ snapshots: dlv: 1.1.3 dset: 3.1.4 es-module-lexer: 1.7.0 - esbuild: 0.27.7 + esbuild: 0.27.4 estree-walker: 3.0.3 flattie: 1.1.1 fontace: 0.4.1 @@ -14102,7 +14295,7 @@ snapshots: zod-to-json-schema: 3.25.2(zod@3.25.76) zod-to-ts: 1.2.0(typescript@5.9.3)(zod@3.25.76) optionalDependencies: - sharp: 0.34.5 + sharp: 0.34.4 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -14151,14 +14344,14 @@ snapshots: stubborn-fs: 2.0.0 when-exit: 2.1.5 - autoprefixer@10.4.21(postcss@8.5.8): + autoprefixer@10.4.21(postcss@8.5.6): dependencies: browserslist: 4.27.0 caniuse-lite: 1.0.30001751 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 - postcss: 8.5.8 + postcss: 8.5.6 postcss-value-parser: 4.2.0 axios@1.15.0: @@ -14654,15 +14847,6 @@ snapshots: css-tree: 3.1.0 transitivePeerDependencies: - postcss - optional: true - - cssstyle@5.3.1(postcss@8.5.8): - dependencies: - '@asamuzakjp/css-color': 4.0.5 - '@csstools/css-syntax-patches-for-csstree': 1.0.14(postcss@8.5.8) - css-tree: 3.1.0 - transitivePeerDependencies: - - postcss csstype@3.1.3: {} @@ -15161,34 +15345,34 @@ snapshots: '@esbuild/win32-ia32': 0.27.2 '@esbuild/win32-x64': 0.27.2 - esbuild@0.27.7: + esbuild@0.27.4: 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 + '@esbuild/aix-ppc64': 0.27.4 + '@esbuild/android-arm': 0.27.4 + '@esbuild/android-arm64': 0.27.4 + '@esbuild/android-x64': 0.27.4 + '@esbuild/darwin-arm64': 0.27.4 + '@esbuild/darwin-x64': 0.27.4 + '@esbuild/freebsd-arm64': 0.27.4 + '@esbuild/freebsd-x64': 0.27.4 + '@esbuild/linux-arm': 0.27.4 + '@esbuild/linux-arm64': 0.27.4 + '@esbuild/linux-ia32': 0.27.4 + '@esbuild/linux-loong64': 0.27.4 + '@esbuild/linux-mips64el': 0.27.4 + '@esbuild/linux-ppc64': 0.27.4 + '@esbuild/linux-riscv64': 0.27.4 + '@esbuild/linux-s390x': 0.27.4 + '@esbuild/linux-x64': 0.27.4 + '@esbuild/netbsd-arm64': 0.27.4 + '@esbuild/netbsd-x64': 0.27.4 + '@esbuild/openbsd-arm64': 0.27.4 + '@esbuild/openbsd-x64': 0.27.4 + '@esbuild/openharmony-arm64': 0.27.4 + '@esbuild/sunos-x64': 0.27.4 + '@esbuild/win32-arm64': 0.27.4 + '@esbuild/win32-ia32': 0.27.4 + '@esbuild/win32-x64': 0.27.4 escalade@3.2.0: {} @@ -15327,11 +15511,11 @@ snapshots: dependencies: path-expression-matcher: 1.2.0 - fast-xml-parser@5.5.9: + fast-xml-parser@5.5.8: dependencies: fast-xml-builder: 1.1.4 path-expression-matcher: 1.2.0 - strnum: 2.2.2 + strnum: 2.2.0 fastq@1.19.1: dependencies: @@ -16057,35 +16241,6 @@ snapshots: - postcss - supports-color - utf-8-validate - optional: true - - jsdom@27.0.1(postcss@8.5.8): - dependencies: - '@asamuzakjp/dom-selector': 6.7.3 - cssstyle: 5.3.1(postcss@8.5.8) - data-urls: 6.0.0 - decimal.js: 10.6.0 - html-encoding-sniffer: 4.0.0 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 - is-potential-custom-element-name: 1.0.1 - parse5: 8.0.0 - rrweb-cssom: 0.8.0 - saxes: 6.0.0 - symbol-tree: 3.2.4 - tough-cookie: 6.0.0 - w3c-xmlserializer: 5.0.0 - webidl-conversions: 8.0.0 - whatwg-encoding: 3.1.1 - whatwg-mimetype: 4.0.0 - whatwg-url: 15.1.0 - ws: 8.18.3 - xml-name-validator: 5.0.0 - transitivePeerDependencies: - - bufferutil - - postcss - - supports-color - - utf-8-validate jsesc@3.1.0: {} @@ -16276,8 +16431,8 @@ snapshots: magicast@0.5.1: dependencies: - '@babel/parser': 7.29.2 - '@babel/types': 7.29.0 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 source-map-js: 1.2.1 make-error@1.3.6: @@ -16889,7 +17044,7 @@ snapshots: nanoid@3.3.11: {} - nanoid@5.1.7: {} + nanoid@5.1.9: {} napi-macros@2.2.2: {} @@ -17309,7 +17464,7 @@ snapshots: '@escape.tech/graphql-armor-max-aliases': 2.6.2 '@escape.tech/graphql-armor-max-depth': 2.4.2 '@escape.tech/graphql-armor-max-tokens': 2.5.1 - '@hono/node-server': 1.19.13(hono@4.12.14) + '@hono/node-server': 1.19.14(hono@4.12.14) '@ponder/utils': 0.2.18(typescript@5.9.3)(viem@2.38.5(typescript@5.9.3)(zod@4.3.6)) abitype: 0.10.3(typescript@5.9.3)(zod@4.3.6) ansi-escapes: 7.1.1 @@ -17404,12 +17559,12 @@ snapshots: - jiti - tsx - postcss-load-config@4.0.2(postcss@8.5.8)(ts-node@10.9.2(@types/node@24.10.9)(typescript@5.9.3)): + postcss-load-config@4.0.2(postcss@8.5.6)(ts-node@10.9.2(@types/node@24.10.9)(typescript@5.9.3)): dependencies: lilconfig: 3.1.3 yaml: 2.8.3 optionalDependencies: - postcss: 8.5.8 + postcss: 8.5.6 ts-node: 10.9.2(@types/node@24.10.9)(typescript@5.9.3) postcss-load-config@5.1.0(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0): @@ -17430,15 +17585,6 @@ snapshots: tsx: 4.21.0 yaml: 2.8.3 - postcss-load-config@6.0.1(jiti@2.6.1)(postcss@8.5.8)(tsx@4.21.0)(yaml@2.8.3): - dependencies: - lilconfig: 3.1.3 - optionalDependencies: - jiti: 2.6.1 - postcss: 8.5.8 - tsx: 4.21.0 - yaml: 2.8.3 - postcss-nested@6.2.0(postcss@8.5.6): dependencies: postcss: 8.5.6 @@ -17469,12 +17615,6 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - postcss@8.5.8: - dependencies: - nanoid: 3.3.11 - picocolors: 1.1.1 - source-map-js: 1.2.1 - postgres-array@2.0.0: {} postgres-bytea@1.0.0: {} @@ -18080,6 +18220,36 @@ snapshots: '@img/sharp-win32-ia32': 0.33.5 '@img/sharp-win32-x64': 0.33.5 + sharp@0.34.4: + dependencies: + '@img/colour': 1.0.0 + detect-libc: 2.1.2 + semver: 7.7.3 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.34.4 + '@img/sharp-darwin-x64': 0.34.4 + '@img/sharp-libvips-darwin-arm64': 1.2.3 + '@img/sharp-libvips-darwin-x64': 1.2.3 + '@img/sharp-libvips-linux-arm': 1.2.3 + '@img/sharp-libvips-linux-arm64': 1.2.3 + '@img/sharp-libvips-linux-ppc64': 1.2.3 + '@img/sharp-libvips-linux-s390x': 1.2.3 + '@img/sharp-libvips-linux-x64': 1.2.3 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.3 + '@img/sharp-libvips-linuxmusl-x64': 1.2.3 + '@img/sharp-linux-arm': 0.34.4 + '@img/sharp-linux-arm64': 0.34.4 + '@img/sharp-linux-ppc64': 0.34.4 + '@img/sharp-linux-s390x': 0.34.4 + '@img/sharp-linux-x64': 0.34.4 + '@img/sharp-linuxmusl-arm64': 0.34.4 + '@img/sharp-linuxmusl-x64': 0.34.4 + '@img/sharp-wasm32': 0.34.4 + '@img/sharp-win32-arm64': 0.34.4 + '@img/sharp-win32-ia32': 0.34.4 + '@img/sharp-win32-x64': 0.34.4 + optional: true + sharp@0.34.5: dependencies: '@img/colour': 1.0.0 @@ -18331,7 +18501,7 @@ snapshots: strip-json-comments@5.0.3: {} - strnum@2.2.2: {} + strnum@2.2.0: {} stubborn-fs@2.0.0: dependencies: @@ -18632,34 +18802,6 @@ snapshots: - tsx - yaml - tsup@8.5.0(jiti@2.6.1)(postcss@8.5.8)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.3): - dependencies: - bundle-require: 5.1.0(esbuild@0.25.11) - cac: 6.7.14 - chokidar: 4.0.3 - consola: 3.4.2 - debug: 4.4.3 - esbuild: 0.25.11 - fix-dts-default-cjs-exports: 1.0.1 - joycon: 3.1.1 - picocolors: 1.1.1 - postcss-load-config: 6.0.1(jiti@2.6.1)(postcss@8.5.8)(tsx@4.21.0)(yaml@2.8.3) - resolve-from: 5.0.0 - rollup: 4.59.0 - source-map: 0.8.0-beta.0 - sucrase: 3.35.0 - tinyexec: 0.3.2 - tinyglobby: 0.2.15 - tree-kill: 1.2.2 - optionalDependencies: - postcss: 8.5.8 - typescript: 5.9.3 - transitivePeerDependencies: - - jiti - - supports-color - - tsx - - yaml - tsx@4.20.6: dependencies: esbuild: 0.25.11 @@ -18686,7 +18828,7 @@ snapshots: type-fest@4.41.0: {} - type-fest@5.5.0: + type-fest@5.6.0: dependencies: tagged-tag: 1.0.0 @@ -18929,7 +19071,7 @@ snapshots: esbuild: 0.25.11 fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 - postcss: 8.5.8 + postcss: 8.5.6 rollup: 4.59.0 tinyglobby: 0.2.15 optionalDependencies: @@ -18945,7 +19087,7 @@ snapshots: esbuild: 0.25.11 fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 - postcss: 8.5.8 + postcss: 8.5.6 rollup: 4.59.0 tinyglobby: 0.2.15 optionalDependencies: @@ -18958,10 +19100,10 @@ snapshots: vite@7.3.2(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.3): dependencies: - esbuild: 0.27.7 + esbuild: 0.27.4 fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 - postcss: 8.5.8 + postcss: 8.5.6 rollup: 4.59.0 tinyglobby: 0.2.15 optionalDependencies: @@ -18976,47 +19118,7 @@ snapshots: optionalDependencies: vite: 6.4.2(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.3) - vitest@4.0.5(@types/debug@4.1.12)(@types/node@24.10.9)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.3): - dependencies: - '@vitest/expect': 4.0.5 - '@vitest/mocker': 4.0.5(vite@6.4.2(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.3)) - '@vitest/pretty-format': 4.0.5 - '@vitest/runner': 4.0.5 - '@vitest/snapshot': 4.0.5 - '@vitest/spy': 4.0.5 - '@vitest/utils': 4.0.5 - debug: 4.4.3 - es-module-lexer: 1.7.0 - expect-type: 1.2.2 - magic-string: 0.30.21 - pathe: 2.0.3 - picomatch: 4.0.4 - std-env: 3.10.0 - tinybench: 2.9.0 - tinyexec: 0.3.2 - tinyglobby: 0.2.15 - tinyrainbow: 3.0.3 - vite: 6.4.2(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.3) - why-is-node-running: 2.3.0 - optionalDependencies: - '@types/debug': 4.1.12 - '@types/node': 24.10.9 - jsdom: 27.0.1(postcss@8.5.6) - transitivePeerDependencies: - - jiti - - less - - lightningcss - - msw - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - - vitest@4.0.5(@types/debug@4.1.12)(@types/node@24.10.9)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.8))(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.3): + vitest@4.0.5(@types/debug@4.1.12)(@types/node@24.10.9)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.3): dependencies: '@vitest/expect': 4.0.5 '@vitest/mocker': 4.0.5(vite@6.4.2(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.3)) @@ -19041,7 +19143,7 @@ snapshots: optionalDependencies: '@types/debug': 4.1.12 '@types/node': 24.10.9 - jsdom: 27.0.1(postcss@8.5.8) + jsdom: 27.0.1(postcss@8.5.6) transitivePeerDependencies: - jiti - less @@ -19056,7 +19158,7 @@ snapshots: - tsx - yaml - vitest@4.0.5(@types/debug@4.1.12)(@types/node@24.10.9)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.8))(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.3): + vitest@4.0.5(@types/debug@4.1.12)(@types/node@24.10.9)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.3): dependencies: '@vitest/expect': 4.0.5 '@vitest/mocker': 4.0.5(vite@6.4.2(@types/node@24.10.9)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.3)) @@ -19081,7 +19183,7 @@ snapshots: optionalDependencies: '@types/debug': 4.1.12 '@types/node': 24.10.9 - jsdom: 27.0.1(postcss@8.5.8) + jsdom: 27.0.1(postcss@8.5.6) transitivePeerDependencies: - jiti - less