From 402f28211d0ed5bd9041fcd98116223f1a6a8de0 Mon Sep 17 00:00:00 2001 From: satyakwok <119509589+satyakwok@users.noreply.github.com> Date: Sun, 10 May 2026 22:49:26 +0200 Subject: [PATCH] feat(api): GraphQL surface at /graphql via mercurius MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Tier 3 deferred item lands. Schema mirrors the REST shape with proper typed bindings — dApp devs that prefer GraphQL (subgraph muscle memory, join-heavy queries that would otherwise be 3+ REST round-trips) hit /graphql instead of stitching routes client-side. Resolvers delegate to the same Drizzle queries the REST routes use, so behaviour stays in lock-step across both surfaces. Custom BigInt scalar — block heights, fees, u256 values overflow JavaScript Number. Serialiser emits a string; parser accepts string or numeric literals. Same convention every modern EVM client follows (Etherscan, Alchemy, Infura). Initial query coverage: - block(height): Block (with .transactions sub-resolver) - blocks(limit, before): cursor-paginated [Block] - tx(hash): Tx (with .logs sub-resolver) - address(address): Address (with .txs and .transfers sub-resolvers) Address.txs uses the (from_addr|to_addr, block_height) composite indexes from migration 0004 — filter + sort served in one index scan. GraphiQL playground enabled in non-production for self-serve schema exploration. Production deploys flip it off via NODE_ENV. No subscriptions yet — push surface lives in chain node's gRPC StreamEvents; adding GraphQL subscriptions here would duplicate state and risk drift. Revisit when sdk-ts demand surfaces. --- apps/api/package.json | 2 + apps/api/src/graphql.ts | 284 ++++++++++++++++++++++++ apps/api/src/index.ts | 2 + pnpm-lock.yaml | 467 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 755 insertions(+) create mode 100644 apps/api/src/graphql.ts diff --git a/apps/api/package.json b/apps/api/package.json index c373c52..4fe2c1a 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -17,6 +17,8 @@ "@fastify/cors": "^11.2.0", "@fastify/rate-limit": "^10.2.0", "fastify": "^5.2.0", + "mercurius": "^16.0.0", + "graphql": "^16.9.0", "pino": "^9.5.0", "drizzle-orm": "^0.45.2", "viem": "^2.48.8" diff --git a/apps/api/src/graphql.ts b/apps/api/src/graphql.ts new file mode 100644 index 0000000..378f93a --- /dev/null +++ b/apps/api/src/graphql.ts @@ -0,0 +1,284 @@ +// GraphQL surface — Mercurius plugin mirroring the REST shape with a +// proper typed schema. dApp devs that prefer GraphQL (subgraph muscle +// memory, join-heavy queries) can hit /graphql instead of stitching +// multiple REST round-trips client-side. +// +// Design notes: +// +// - Schema-first via SDL. Resolvers stay tiny — most just delegate to +// the same Drizzle queries the REST routes use, so behaviour stays +// in lock-step across the two surfaces. +// +// - Custom BigInt scalar — block heights / wei amounts overflow +// JavaScript Number. The serializer emits a string; the parser +// accepts string or numeric literals. Same convention every modern +// EVM client follows (Etherscan API, Alchemy, Infura). +// +// - GraphiQL playground enabled in non-production for self-serve +// schema exploration. Production deploys can flip it off via env. +// +// - No subscriptions yet. The push surface lives in the chain node's +// gRPC StreamEvents; adding a GraphQL subscription tier here would +// duplicate state and risk drift. Revisit when sdk-ts demand +// emerges. + +import mercurius from "mercurius"; +import { GraphQLScalarType, Kind } from "graphql"; +import type { FastifyInstance } from "fastify"; +import { and, asc, desc, eq, lte, or } from "drizzle-orm"; + +import { + addresses, + blocks, + logs, + tokenTransfers, + transactions, + type DbClient, +} from "@sentriscloud/indexer-db"; + +const MAX_PAGE = 100; + +const SCHEMA = /* GraphQL */ ` + scalar BigInt + + type Block { + height: BigInt! + hash: String! + parentHash: String! + timestamp: BigInt! + validator: String! + gasUsed: BigInt! + gasLimit: BigInt! + baseFee: String + txCount: Int! + stateRoot: String + round: Int! + transactions: [Tx!]! + } + + type Tx { + hash: String! + blockHeight: BigInt! + txIndex: Int! + from: String! + to: String + value: String! + fee: String! + nonce: BigInt! + data: String + status: Int! + contractAddress: String + txType: String! + logs: [Log!]! + } + + type Log { + blockHeight: BigInt! + txHash: String! + logIndex: Int! + address: String! + topics: [String!]! + data: String + } + + type Transfer { + blockHeight: BigInt! + txHash: String! + logIndex: Int! + contract: String! + standard: String! + from: String! + to: String! + tokenId: String + amount: String! + } + + type Address { + address: String! + firstSeenBlock: BigInt! + lastSeenBlock: BigInt! + isContract: Boolean! + codeHash: String + txs(limit: Int = 25): [Tx!]! + transfers(limit: Int = 25, standard: String): [Transfer!]! + } + + type Query { + block(height: BigInt!): Block + blocks(limit: Int = 25, before: BigInt): [Block!]! + tx(hash: String!): Tx + address(address: String!): Address + } +`; + +// Custom BigInt scalar — serialises to string (clients parse via +// BigInt()), accepts integer or string input on the parse side. +const BigIntScalar = new GraphQLScalarType({ + name: "BigInt", + description: + "Arbitrary-precision integer; serialised as a base-10 string so values larger than 2^53 survive the JSON round-trip.", + serialize(value) { + if (typeof value === "bigint") return value.toString(); + if (typeof value === "number") return Math.trunc(value).toString(); + if (typeof value === "string") return value; + throw new TypeError(`BigInt cannot serialize ${typeof value}`); + }, + parseValue(value) { + if (typeof value === "string" || typeof value === "number") return BigInt(value); + throw new TypeError(`BigInt cannot parse ${typeof value}`); + }, + parseLiteral(ast) { + if (ast.kind === Kind.INT || ast.kind === Kind.STRING) return BigInt(ast.value); + throw new TypeError(`BigInt cannot parse literal ${ast.kind}`); + }, +}); + +function clampLimit(raw: number | undefined): number { + const n = raw ?? 25; + if (!Number.isFinite(n) || n <= 0) return 25; + return Math.min(n, MAX_PAGE); +} + +interface Ctx { + db: DbClient; +} + +// Resolver shapes mirror the REST serialisers in routes/native.ts so +// the two surfaces never disagree on field names or formatting (fee / +// value as decimal-string for u256 fits, hashes lowercase, etc). +const resolvers = { + BigInt: BigIntScalar, + Query: { + async block(_root: unknown, args: { height: bigint }, ctx: Ctx) { + const row = await ctx.db + .select() + .from(blocks) + .where(eq(blocks.height, args.height)) + .limit(1); + return row[0] ?? null; + }, + async blocks( + _root: unknown, + args: { limit?: number; before?: bigint }, + ctx: Ctx, + ) { + const limit = clampLimit(args.limit); + const where = args.before !== undefined ? lte(blocks.height, args.before) : undefined; + return ctx.db + .select() + .from(blocks) + .where(where) + .orderBy(desc(blocks.height)) + .limit(limit); + }, + async tx(_root: unknown, args: { hash: string }, ctx: Ctx) { + const row = await ctx.db + .select() + .from(transactions) + .where(eq(transactions.hash, args.hash.toLowerCase())) + .limit(1); + return row[0] ?? null; + }, + async address(_root: unknown, args: { address: string }, ctx: Ctx) { + const row = await ctx.db + .select() + .from(addresses) + .where(eq(addresses.address, args.address.toLowerCase())) + .limit(1); + return row[0] ?? null; + }, + }, + Block: { + async transactions( + parent: typeof blocks.$inferSelect, + _args: unknown, + ctx: Ctx, + ) { + return ctx.db + .select() + .from(transactions) + .where(eq(transactions.blockHeight, parent.height)) + .orderBy(asc(transactions.txIndex)); + }, + }, + Tx: { + from: (parent: typeof transactions.$inferSelect) => parent.fromAddr, + to: (parent: typeof transactions.$inferSelect) => parent.toAddr, + async logs(parent: typeof transactions.$inferSelect, _args: unknown, ctx: Ctx) { + const rows = await ctx.db + .select() + .from(logs) + .where(eq(logs.txHash, parent.hash)) + .orderBy(asc(logs.logIndex)); + return rows.map((l) => ({ + ...l, + topics: [l.topic0, l.topic1, l.topic2, l.topic3].filter( + (t): t is string => Boolean(t), + ), + })); + }, + }, + Address: { + async txs( + parent: typeof addresses.$inferSelect, + args: { limit?: number }, + ctx: Ctx, + ) { + const limit = clampLimit(args.limit); + const a = parent.address; + // Composite (from_addr, block_height) + (to_addr, block_height) + // indexes from migration 0004 serve filter + sort in one scan. + return ctx.db + .select() + .from(transactions) + .where(or(eq(transactions.fromAddr, a), eq(transactions.toAddr, a))) + .orderBy(desc(transactions.blockHeight)) + .limit(limit); + }, + async transfers( + parent: typeof addresses.$inferSelect, + args: { limit?: number; standard?: string }, + ctx: Ctx, + ) { + const limit = clampLimit(args.limit); + const a = parent.address; + const where = args.standard + ? and( + or(eq(tokenTransfers.fromAddr, a), eq(tokenTransfers.toAddr, a)), + eq(tokenTransfers.standard, args.standard), + ) + : or(eq(tokenTransfers.fromAddr, a), eq(tokenTransfers.toAddr, a)); + const rows = await ctx.db + .select() + .from(tokenTransfers) + .where(where) + .orderBy(desc(tokenTransfers.blockHeight)) + .limit(limit); + return rows.map((t) => ({ + blockHeight: t.blockHeight, + txHash: t.txHash, + logIndex: t.logIndex, + contract: t.contract, + standard: t.standard, + from: t.fromAddr, + to: t.toAddr, + tokenId: t.tokenId, + amount: t.amount, + })); + }, + }, +}; + +export async function registerGraphql(app: FastifyInstance, ctx: { db: DbClient }) { + await app.register(mercurius, { + schema: SCHEMA, + // Mercurius types resolvers loosely on purpose — the SDL above + the + // typed Drizzle helpers are the real contract. + resolvers: resolvers as unknown as mercurius.IResolvers, + context: () => ({ db: ctx.db }), + graphiql: process.env.NODE_ENV !== "production", + // Fastify 5 needs the path explicit; default would collide with the + // root Caddy redirect logic on some deployments. + path: "/graphql", + }); +} diff --git a/apps/api/src/index.ts b/apps/api/src/index.ts index 9d53b15..fce28dc 100644 --- a/apps/api/src/index.ts +++ b/apps/api/src/index.ts @@ -11,6 +11,7 @@ import { registerEtherscanCompat } from "./routes/etherscan.js"; import { registerHealthRoutes } from "./routes/health.js"; import { registerCoinblastRoutes } from "./routes/coinblast.js"; import { registerCacheControl } from "./cache-control.js"; +import { registerGraphql } from "./graphql.js"; const PORT = Number(process.env.API_PORT ?? 8081); const HOST = process.env.API_HOST ?? "0.0.0.0"; @@ -55,6 +56,7 @@ async function main() { registerNativeRoutes(app, { db, chain }); registerEtherscanCompat(app, { db, chain }); registerCoinblastRoutes(app, { db, chain }); + await registerGraphql(app, { db }); await app.listen({ host: HOST, port: PORT }); app.log.info({ port: PORT, network: NETWORK }, "indexer api up"); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ef299bf..884a435 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -41,6 +41,12 @@ importers: fastify: specifier: ^5.2.0 version: 5.8.5 + graphql: + specifier: ^16.9.0 + version: 16.14.0 + mercurius: + specifier: ^16.0.0 + version: 16.9.0(graphql@16.14.0) pino: specifier: ^9.5.0 version: 9.14.0 @@ -590,6 +596,9 @@ packages: cpu: [x64] os: [win32] + '@fastify/accept-negotiator@2.0.1': + resolution: {integrity: sha512-/c/TW2bO/v9JeEgoD/g1G5GxGeCF1Hafdf79WPmUlgYiBXummY0oX3VVq4yFkKKVBKDNlaDUYoab7g38RpPqCQ==} + '@fastify/ajv-compiler@4.0.5': resolution: {integrity: sha512-KoWKW+MhvfTRWL4qrhUwAAZoaChluo0m0vbiJlGMt2GXvL4LVPQEjt8kSpHI3IBq5Rez8fg+XeH3cneztq+C7A==} @@ -605,6 +614,9 @@ packages: '@fastify/forwarded@3.0.1': resolution: {integrity: sha512-JqDochHFqXs3C3Ml3gOY58zM7OqO9ENqPo0UqAjAjH8L01fRZqwX9iLeX34//kiJubF7r2ZQHtBRU36vONbLlw==} + '@fastify/merge-json-schemas@0.1.1': + resolution: {integrity: sha512-fERDVz7topgNjtXsJTTW1JKLy0rhuLRcquYqNR9rF7OcVpCa2OVW49ZPDIhaRRCaUuvVxI+N416xUoF76HNSXA==} + '@fastify/merge-json-schemas@0.2.1': resolution: {integrity: sha512-OA3KGBCy6KtIvLf8DINC5880o5iBlDX4SxzLQS8HorJAbqluzLRn80UXU0bxZn7UOFhFgpRJDasfwn9nG4FG4A==} @@ -614,6 +626,20 @@ packages: '@fastify/rate-limit@10.3.0': resolution: {integrity: sha512-eIGkG9XKQs0nyynatApA3EVrojHOuq4l6fhB4eeCk4PIOeadvOJz9/4w3vGI44Go17uaXOWEcPkaD8kuKm7g6Q==} + '@fastify/send@4.1.0': + resolution: {integrity: sha512-TMYeQLCBSy2TOFmV95hQWkiTYgC/SEx7vMdV+wnZVX4tt8VBLKzmH8vV9OzJehV0+XBfg+WxPMt5wp+JBUKsVw==} + + '@fastify/static@9.1.3': + resolution: {integrity: sha512-aXrYtsiryLhRxRNaxNqsn7FUISeb7rB9q4eHUPIot5aeQBLNahnz1m6thzm7JWC1poSGXS9XrX8DvuMivp2hkQ==} + + '@fastify/websocket@11.2.0': + resolution: {integrity: sha512-3HrDPbAG1CzUCqnslgJxppvzaAZffieOVbLp1DAy1huCSynUWPifSvfdEDUR8HlJLp3sp1A36uOM2tJogADS8w==} + + '@graphql-typed-document-node/core@3.2.0': + resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==} + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + '@grpc/grpc-js@1.14.3': resolution: {integrity: sha512-Iq8QQQ/7X3Sac15oB6p0FmUg/klxQvXLeileoqrTRGJYLV+/9tubbr9ipz0GKHjmXVsgFPo/+W+2cA8eNcR+XA==} engines: {node: '>=12.10.0'} @@ -728,9 +754,17 @@ packages: zod: optional: true + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + abstract-logging@2.0.1: resolution: {integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==} + aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + ajv-formats@3.0.1: resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} peerDependencies: @@ -757,9 +791,27 @@ packages: avvio@9.2.0: resolution: {integrity: sha512-2t/sy01ArdHHE0vRH5Hsay+RtCZt3dLPji7W7/MMOCEgze5b7SNDC4j5H6FnVgPkI1MTNFGzHdHrVXDDl7QSSQ==} + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + brace-expansion@5.0.6: + resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==} + engines: {node: 18 || 20 || >=22} + buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} @@ -771,10 +823,18 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + content-disposition@1.1.0: + resolution: {integrity: sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==} + engines: {node: '>=18'} + cookie@1.1.1: resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} engines: {node: '>=18'} + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} @@ -875,9 +935,15 @@ packages: sqlite3: optional: true + duplexify@4.1.3: + resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} + emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + esbuild@0.18.20: resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} engines: {node: '>=12'} @@ -897,21 +963,38 @@ packages: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + fast-decode-uri-component@1.0.1: resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-json-stringify@5.16.1: + resolution: {integrity: sha512-KAdnLvy1yu/XrRtP+LJnxbBGrhN+xXu+gt3EUvZhYGKCr3lFHq/7UFJHHFgmJKoqlh6B40bZLEv7w46B0mqn1g==} + fast-json-stringify@6.3.0: resolution: {integrity: sha512-oRCntNDY/329HJPlmdNLIdogNtt6Vyjb1WuT01Soss3slIdyUp8kAcDU3saQTOquEK8KFVfwIIF7FebxUAu+yA==} fast-querystring@1.1.2: resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==} + fast-uri@2.4.0: + resolution: {integrity: sha512-ypuAmmMKInk5q7XcepxlnUWDLWv4GFtaJqAzWKqn62IpQ3pejtr5dTVbt3vwqVaMKmkNR55sTT+CqUKIaT21BA==} + fast-uri@3.1.0: resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} @@ -921,6 +1004,9 @@ packages: fastify@5.8.5: resolution: {integrity: sha512-Yqptv59pQzPgQUSIm87hMqHJmdkb1+GPxdE6vW6FRyVE9G86mt7rOghitiU4JHRaTyDUk9pfeKmDeu70lAwM4Q==} + fastparallel@2.4.1: + resolution: {integrity: sha512-qUmhxPgNHmvRjZKBFUNI0oZuuH9OlSIOXmJ98lhKPxMZZ7zS/Fi0wRHOihDSz0R1YiIOjxzOY4bq65YTcdBi2Q==} + fastq@1.20.1: resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} @@ -933,6 +1019,9 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] + generate-function@2.3.1: + resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==} + get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} @@ -940,6 +1029,33 @@ packages: get-tsconfig@4.14.0: resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} + glob@13.0.6: + resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==} + engines: {node: 18 || 20 || >=22} + + graphql-jit@0.8.7: + resolution: {integrity: sha512-KGzCrsxQPfEiXOUIJCexWKiWF6ycjO89kAO6SdO8OWRGwYXbG0hsLuTnbFfMq0gj7d7/ib/Gh7jtst7FHZEEjw==} + peerDependencies: + graphql: '>=15' + + graphql@16.14.0: + resolution: {integrity: sha512-BBvQ/406p+4CZbTpCbVPSxfzrZrbnuWSP1ELYgyS6B+hNeKzgrdB4JczCa5VZUBQrDa9hUngm0KnexY6pJRN5Q==} + engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} + + http-errors@2.0.1: + resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} + engines: {node: '>= 0.8'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + ipaddr.js@2.3.0: resolution: {integrity: sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==} engines: {node: '>= 10'} @@ -948,11 +1064,17 @@ packages: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} + is-property@1.0.2: + resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==} + isows@1.0.7: resolution: {integrity: sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg==} peerDependencies: ws: '*' + json-schema-ref-resolver@1.0.1: + resolution: {integrity: sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw==} + json-schema-ref-resolver@3.0.0: resolution: {integrity: sha512-hOrZIVL5jyYFjzk7+y7n5JDzGlU8rfWDuYyHwGa2WA8/pcmMHezp2xsVwxrebD/Q9t8Nc5DboieySDpCp4WG4A==} @@ -965,13 +1087,52 @@ packages: lodash.camelcase@4.3.0: resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.mergewith@4.6.2: + resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} + long@5.3.2: resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} + lru-cache@11.3.6: + resolution: {integrity: sha512-Gf/KoL3C/MlI7Bt0PGI9I+TeTC/I6r/csU58N4BSNc4lppLBeKsOdFYkK+dX0ABDUMJNfCHTyPpzwwO21Awd3A==} + engines: {node: 20 || >=22} + + mercurius@16.9.0: + resolution: {integrity: sha512-3td+e+SZyA7Gp/Tb51ncYdOGD5OsXh6zK4FjUJx+2pSHbJJEWE11EjKAAqhf3Xrp2JjMlg6dBrmRWsdM9E5G1Q==} + engines: {node: ^20.9.0 || >=22.0.0} + peerDependencies: + graphql: ^16.0.0 + + mime@3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true + + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + engines: {node: 18 || 20 || >=22} + + minipass@7.1.3: + resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} + engines: {node: '>=16 || 14 >=14.17'} + + mqemitter@7.1.0: + resolution: {integrity: sha512-GnBDNz3lxmllW201ne0mrmdy5tPOTnc79jjVcsfUa2LG2pUGeyGWVeiae6ZysfC/64XrYOqCKRAQYrB7pGyBVQ==} + engines: {node: '>=20'} + on-exit-leak-free@2.1.2: resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} engines: {node: '>=14.0.0'} + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + ox@0.14.20: resolution: {integrity: sha512-rby38C3nDn8eQkf29Zgw4hkCZJ64Qqi0zRPWL8ENUQ7JVuoITqrVtwWQgM/He19SCMUEc7hS/Sjw0jIOSLJhOw==} peerDependencies: @@ -980,6 +1141,14 @@ packages: typescript: optional: true + p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + + path-scurry@2.0.2: + resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} + engines: {node: 18 || 20 || >=22} + pino-abstract-transport@2.0.0: resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==} @@ -1005,13 +1174,33 @@ packages: process-warning@5.0.0: resolution: {integrity: sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==} + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + protobufjs@7.5.6: resolution: {integrity: sha512-M71sTMB146U3u0di3yup8iM+zv8yPRNQVr1KK4tyBitl3qFvEGucq/rGDRShD2rsJhtN02RJaJ7j5X5hmy8SJg==} engines: {node: '>=12.0.0'} + qlobber@8.0.1: + resolution: {integrity: sha512-O+Wd1chXj5YE1DwmD+ae0bXiSLehmnS3czlC1R9FL/Nt/3q8uMS1bIHmg2lJfCoiimCxClWM8AAuJrF0EvNiog==} + engines: {node: '>= 16'} + quick-format-unescaped@4.0.4: resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + quick-lru@7.3.0: + resolution: {integrity: sha512-k9lSsjl36EJdK7I06v7APZCbyGT2vMTsYSRX1Q2nbYmnkBqgUhRkAuzH08Ciotteu/PLJmIF2+tti7o3C/ts2g==} + engines: {node: '>=18'} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readable-stream@4.7.0: + resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + real-require@0.2.0: resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} engines: {node: '>= 12.13.0'} @@ -1038,6 +1227,9 @@ packages: rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + safe-regex2@5.1.1: resolution: {integrity: sha512-mOSBvHGDZMuIEZMdOz/aCEYDCv0E7nfcNsIhUF+/P+xC7Hyf3FkvymqgPbg9D1EdSGu+uKbJgy09K/RKKc7kJA==} hasBin: true @@ -1057,6 +1249,12 @@ packages: set-cookie-parser@2.7.2: resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==} + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + single-user-cache@2.1.0: + resolution: {integrity: sha512-Wmu+uIEkabMoQPpJTOYhEsE6h/XjnjIhtuB1+tynxeO/hQxwQD0hIDq/ad65P1Tw9wt9f5SKnUe+63m6TMB4Uw==} + sonic-boom@4.2.1: resolution: {integrity: sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q==} @@ -1071,10 +1269,20 @@ packages: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + + stream-shift@1.0.3: + resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -1082,10 +1290,18 @@ packages: thread-stream@3.1.0: resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} + tiny-lru@11.4.7: + resolution: {integrity: sha512-w/Te7uMUVeH0CR8vZIjr+XiN41V+30lkDdK+NRIDCUYKKuL9VcmaUEmaPISuwGhLlrTGh5yu18lENtR9axSxYw==} + engines: {node: '>=12'} + toad-cache@3.7.0: resolution: {integrity: sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==} engines: {node: '>=12'} + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + tsx@4.21.0: resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} engines: {node: '>=18.0.0'} @@ -1103,6 +1319,9 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + viem@2.48.8: resolution: {integrity: sha512-Xj3Nrt66SKtn06kczU91ELn9Difr84ZM5A62BTlaisT5lpgt058i2mBkfMZCXHGb1ocOLjzC2ztPhD0Lvky7uQ==} peerDependencies: @@ -1115,6 +1334,9 @@ packages: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + ws@8.18.3: resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} engines: {node: '>=10.0.0'} @@ -1127,6 +1349,10 @@ packages: utf-8-validate: optional: true + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -1377,6 +1603,8 @@ snapshots: '@esbuild/win32-x64@0.27.7': optional: true + '@fastify/accept-negotiator@2.0.1': {} + '@fastify/ajv-compiler@4.0.5': dependencies: ajv: 8.20.0 @@ -1396,6 +1624,10 @@ snapshots: '@fastify/forwarded@3.0.1': {} + '@fastify/merge-json-schemas@0.1.1': + dependencies: + fast-deep-equal: 3.1.3 + '@fastify/merge-json-schemas@0.2.1': dependencies: dequal: 2.0.3 @@ -1411,6 +1643,36 @@ snapshots: fastify-plugin: 5.1.0 toad-cache: 3.7.0 + '@fastify/send@4.1.0': + dependencies: + '@lukeed/ms': 2.0.2 + escape-html: 1.0.3 + fast-decode-uri-component: 1.0.1 + http-errors: 2.0.1 + mime: 3.0.0 + + '@fastify/static@9.1.3': + dependencies: + '@fastify/accept-negotiator': 2.0.1 + '@fastify/send': 4.1.0 + content-disposition: 1.1.0 + fastify-plugin: 5.1.0 + fastq: 1.20.1 + glob: 13.0.6 + + '@fastify/websocket@11.2.0': + dependencies: + duplexify: 4.1.3 + fastify-plugin: 5.1.0 + ws: 8.18.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@graphql-typed-document-node/core@3.2.0(graphql@16.14.0)': + dependencies: + graphql: 16.14.0 + '@grpc/grpc-js@1.14.3': dependencies: '@grpc/proto-loader': 0.8.0 @@ -1499,8 +1761,17 @@ snapshots: optionalDependencies: typescript: 5.9.3 + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + abstract-logging@2.0.1: {} + aggregate-error@3.1.0: + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + ajv-formats@3.0.1(ajv@8.20.0): optionalDependencies: ajv: 8.20.0 @@ -1525,8 +1796,23 @@ snapshots: '@fastify/error': 4.2.0 fastq: 1.20.1 + balanced-match@4.0.4: {} + + base64-js@1.5.1: {} + + brace-expansion@5.0.6: + dependencies: + balanced-match: 4.0.4 + buffer-from@1.1.2: {} + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + clean-stack@2.2.0: {} + cliui@8.0.1: dependencies: string-width: 4.2.3 @@ -1539,8 +1825,12 @@ snapshots: color-name@1.1.4: {} + content-disposition@1.1.0: {} + cookie@1.1.1: {} + depd@2.0.0: {} + dequal@2.0.3: {} drizzle-kit@0.31.10: @@ -1554,8 +1844,19 @@ snapshots: optionalDependencies: postgres: 3.4.9 + duplexify@4.1.3: + dependencies: + end-of-stream: 1.4.5 + inherits: 2.0.4 + readable-stream: 3.6.2 + stream-shift: 1.0.3 + emoji-regex@8.0.0: {} + end-of-stream@1.4.5: + dependencies: + once: 1.4.0 + esbuild@0.18.20: optionalDependencies: '@esbuild/android-arm': 0.18.20 @@ -1641,12 +1942,28 @@ snapshots: escalade@3.2.0: {} + escape-html@1.0.3: {} + + event-target-shim@5.0.1: {} + eventemitter3@5.0.1: {} + events@3.3.0: {} + fast-decode-uri-component@1.0.1: {} fast-deep-equal@3.1.3: {} + fast-json-stringify@5.16.1: + dependencies: + '@fastify/merge-json-schemas': 0.1.1 + ajv: 8.20.0 + ajv-formats: 3.0.1(ajv@8.20.0) + fast-deep-equal: 3.1.3 + fast-uri: 2.4.0 + json-schema-ref-resolver: 1.0.1 + rfdc: 1.4.1 + fast-json-stringify@6.3.0: dependencies: '@fastify/merge-json-schemas': 0.2.1 @@ -1660,6 +1977,8 @@ snapshots: dependencies: fast-decode-uri-component: 1.0.1 + fast-uri@2.4.0: {} + fast-uri@3.1.0: {} fastify-plugin@5.1.0: {} @@ -1682,6 +2001,11 @@ snapshots: semver: 7.7.4 toad-cache: 3.7.0 + fastparallel@2.4.1: + dependencies: + reusify: 1.1.0 + xtend: 4.0.2 + fastq@1.20.1: dependencies: reusify: 1.1.0 @@ -1695,20 +2019,62 @@ snapshots: fsevents@2.3.3: optional: true + generate-function@2.3.1: + dependencies: + is-property: 1.0.2 + get-caller-file@2.0.5: {} get-tsconfig@4.14.0: dependencies: resolve-pkg-maps: 1.0.0 + glob@13.0.6: + dependencies: + minimatch: 10.2.5 + minipass: 7.1.3 + path-scurry: 2.0.2 + + graphql-jit@0.8.7(graphql@16.14.0): + dependencies: + '@graphql-typed-document-node/core': 3.2.0(graphql@16.14.0) + fast-json-stringify: 5.16.1 + generate-function: 2.3.1 + graphql: 16.14.0 + lodash.memoize: 4.1.2 + lodash.merge: 4.6.2 + lodash.mergewith: 4.6.2 + + graphql@16.14.0: {} + + http-errors@2.0.1: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.2 + toidentifier: 1.0.1 + + ieee754@1.2.1: {} + + indent-string@4.0.0: {} + + inherits@2.0.4: {} + ipaddr.js@2.3.0: {} is-fullwidth-code-point@3.0.0: {} + is-property@1.0.2: {} + isows@1.0.7(ws@8.18.3): dependencies: ws: 8.18.3 + json-schema-ref-resolver@1.0.1: + dependencies: + fast-deep-equal: 3.1.3 + json-schema-ref-resolver@3.0.0: dependencies: dequal: 2.0.3 @@ -1723,10 +2089,56 @@ snapshots: lodash.camelcase@4.3.0: {} + lodash.memoize@4.1.2: {} + + lodash.merge@4.6.2: {} + + lodash.mergewith@4.6.2: {} + long@5.3.2: {} + lru-cache@11.3.6: {} + + mercurius@16.9.0(graphql@16.14.0): + dependencies: + '@fastify/error': 4.2.0 + '@fastify/static': 9.1.3 + '@fastify/websocket': 11.2.0 + fastify-plugin: 5.1.0 + graphql: 16.14.0 + graphql-jit: 0.8.7(graphql@16.14.0) + mqemitter: 7.1.0 + p-map: 4.0.0 + quick-lru: 7.3.0 + readable-stream: 4.7.0 + safe-stable-stringify: 2.5.0 + secure-json-parse: 4.1.0 + single-user-cache: 2.1.0 + tiny-lru: 11.4.7 + ws: 8.18.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + mime@3.0.0: {} + + minimatch@10.2.5: + dependencies: + brace-expansion: 5.0.6 + + minipass@7.1.3: {} + + mqemitter@7.1.0: + dependencies: + fastparallel: 2.4.1 + qlobber: 8.0.1 + on-exit-leak-free@2.1.2: {} + once@1.4.0: + dependencies: + wrappy: 1.0.2 + ox@0.14.20(typescript@5.9.3): dependencies: '@adraffy/ens-normalize': 1.11.1 @@ -1742,6 +2154,15 @@ snapshots: transitivePeerDependencies: - zod + p-map@4.0.0: + dependencies: + aggregate-error: 3.1.0 + + path-scurry@2.0.2: + dependencies: + lru-cache: 11.3.6 + minipass: 7.1.3 + pino-abstract-transport@2.0.0: dependencies: split2: 4.2.0 @@ -1770,6 +2191,8 @@ snapshots: process-warning@5.0.0: {} + process@0.11.10: {} + protobufjs@7.5.6: dependencies: '@protobufjs/aspromise': 1.1.2 @@ -1785,8 +2208,26 @@ snapshots: '@types/node': 22.19.17 long: 5.3.2 + qlobber@8.0.1: {} + quick-format-unescaped@4.0.4: {} + quick-lru@7.3.0: {} + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readable-stream@4.7.0: + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + real-require@0.2.0: {} require-directory@2.1.1: {} @@ -1801,6 +2242,8 @@ snapshots: rfdc@1.4.1: {} + safe-buffer@5.2.1: {} + safe-regex2@5.1.1: dependencies: ret: 0.5.0 @@ -1813,6 +2256,12 @@ snapshots: set-cookie-parser@2.7.2: {} + setprototypeof@1.2.0: {} + + single-user-cache@2.1.0: + dependencies: + safe-stable-stringify: 2.5.0 + sonic-boom@4.2.1: dependencies: atomic-sleep: 1.0.0 @@ -1826,12 +2275,20 @@ snapshots: split2@4.2.0: {} + statuses@2.0.2: {} + + stream-shift@1.0.3: {} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -1840,8 +2297,12 @@ snapshots: dependencies: real-require: 0.2.0 + tiny-lru@11.4.7: {} + toad-cache@3.7.0: {} + toidentifier@1.0.1: {} + tsx@4.21.0: dependencies: esbuild: 0.27.7 @@ -1862,6 +2323,8 @@ snapshots: undici-types@6.21.0: {} + util-deprecate@1.0.2: {} + viem@2.48.8(typescript@5.9.3): dependencies: '@noble/curves': 1.9.1 @@ -1885,8 +2348,12 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 + wrappy@1.0.2: {} + ws@8.18.3: {} + xtend@4.0.2: {} + y18n@5.0.8: {} yargs-parser@21.1.1: {}