enskit 1.10.0 → 1.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -28,8 +28,8 @@ import { introspection } from "enssdk/omnigraph";
28
28
 
29
29
  // src/react/omnigraph/_lib/by-id-lookup-resolvers.ts
30
30
  import {
31
+ makeConcreteRegistryId,
31
32
  makePermissionsId,
32
- makeRegistryId,
33
33
  makeResolverId
34
34
  } from "enssdk";
35
35
  var passthrough = (args, cache, info) => cache.resolve(info.parentTypeName, info.fieldName, args);
@@ -53,8 +53,17 @@ var byIdLookupResolvers = {
53
53
  },
54
54
  registry(parent, args, cache, info) {
55
55
  const by = args.by;
56
- if (by.id) return { __typename: "Registry", id: by.id };
57
- if (by.contract) return { __typename: "Registry", id: makeRegistryId(by.contract) };
56
+ if (by.id) {
57
+ const virtualKey = cache.keyOfEntity({ __typename: "ENSv1VirtualRegistry", id: by.id });
58
+ if (virtualKey && cache.resolve(virtualKey, "id")) return virtualKey;
59
+ }
60
+ const id = by.id ?? (by.contract ? makeConcreteRegistryId(by.contract) : void 0);
61
+ if (id) {
62
+ const v1Key = cache.keyOfEntity({ __typename: "ENSv1Registry", id });
63
+ if (v1Key && cache.resolve(v1Key, "id")) return v1Key;
64
+ const v2Key = cache.keyOfEntity({ __typename: "ENSv2Registry", id });
65
+ if (v2Key && cache.resolve(v2Key, "id")) return v2Key;
66
+ }
58
67
  return passthrough(args, cache, info);
59
68
  },
60
69
  resolver(parent, args, cache, info) {
@@ -150,6 +159,11 @@ var omnigraphCacheExchange = cacheExchange({
150
159
  if (!data.chainId) return null;
151
160
  return stringifyAccountId(data);
152
161
  },
162
+ // Accounts are keyable by just `address` if `id` is not provided
163
+ Account: (data) => {
164
+ const key = data.id ?? data.address;
165
+ return typeof key === "string" ? key : null;
166
+ },
153
167
  // These entities are Embedded Data and don't have a relevant key
154
168
  Label: EMBEDDED_DATA,
155
169
  WrappedBaseRegistrarRegistration: EMBEDDED_DATA
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/react/omnigraph/graphql.ts","../../../src/react/omnigraph/hooks.ts","../../../src/react/omnigraph/provider.tsx","../../../src/react/omnigraph/client.ts","../../../src/react/omnigraph/_lib/cache-exchange.ts","../../../src/react/omnigraph/_lib/by-id-lookup-resolvers.ts","../../../src/react/omnigraph/_lib/introspection-helpers.ts","../../../src/react/omnigraph/_lib/local-bigint-resolvers.ts","../../../src/react/omnigraph/_lib/local-connection-resolvers.ts","../../../src/react/omnigraph/_lib/merge-resolver-maps.ts"],"sourcesContent":["import type { introspection, OmnigraphScalars } from \"enssdk/omnigraph\";\nimport { initGraphQLTada } from \"gql.tada\";\n\nexport const graphql = initGraphQLTada<{\n introspection: typeof introspection;\n scalars: Omit<OmnigraphScalars, \"BigInt\"> & {\n // override the default Omnigraph Scalar definitions to include a deserialized BigInt (see cache-exchange.ts)\n BigInt: bigint;\n };\n}>();\n\nexport type { FragmentOf, ResultOf, VariablesOf } from \"gql.tada\";\nexport { readFragment } from \"gql.tada\";\n","\"use client\";\n\nimport type { AnyVariables, OperationContext } from \"@urql/core\";\nimport type { TadaDocumentNode } from \"gql.tada\";\nimport type { DocumentNode } from \"graphql\";\nimport { type UseQueryResponse, useQuery } from \"urql\";\n\nexport type UseOmnigraphQueryArgs<Data = unknown, Variables extends AnyVariables = AnyVariables> = {\n query: DocumentNode | TadaDocumentNode<Data, Variables> | string;\n variables?: Variables;\n pause?: boolean;\n context?: Partial<OperationContext>;\n};\n\nexport type UseOmnigraphQueryResult<\n Data = unknown,\n Variables extends AnyVariables = AnyVariables,\n> = UseQueryResponse<Data, Variables>;\n\nexport function useOmnigraphQuery<Data = unknown, Variables extends AnyVariables = AnyVariables>(\n args: UseOmnigraphQueryArgs<Data, Variables>,\n): UseOmnigraphQueryResult<Data, Variables> {\n return useQuery<Data, Variables>({\n query: args.query as DocumentNode,\n variables: args.variables as Variables,\n pause: args.pause,\n context: args.context,\n });\n}\n","\"use client\";\n\nimport type { EnsNodeClient } from \"enssdk/core\";\nimport { createElement, type ReactElement, type ReactNode, useMemo } from \"react\";\nimport { Provider } from \"urql\";\n\nimport { createOmnigraphUrqlClient } from \"./client\";\n\nexport interface OmnigraphProviderProps {\n client: EnsNodeClient;\n children?: ReactNode;\n}\n\nexport function OmnigraphProvider({ client, children }: OmnigraphProviderProps): ReactElement {\n const urqlClient = useMemo(() => createOmnigraphUrqlClient(client.config), [client]);\n\n return createElement(Provider, { value: urqlClient }, children);\n}\n","import { Client, fetchExchange } from \"@urql/core\";\nimport type { EnsNodeClientConfig } from \"enssdk/core\";\n\nimport { omnigraphCacheExchange } from \"./_lib/cache-exchange\";\n\nexport function createOmnigraphUrqlClient(config: EnsNodeClientConfig) {\n return new Client({\n url: new URL(\"/api/omnigraph\", config.url).href,\n fetch: config.fetch,\n exchanges: [omnigraphCacheExchange, fetchExchange],\n });\n}\n","import { cacheExchange } from \"@urql/exchange-graphcache\";\nimport type { AccountId } from \"enssdk\";\nimport { stringifyAccountId } from \"enssdk\";\nimport { introspection } from \"enssdk/omnigraph\";\n\nimport { byIdLookupResolvers } from \"./by-id-lookup-resolvers\";\nimport { localBigIntResolvers } from \"./local-bigint-resolvers\";\nimport { localConnectionResolvers } from \"./local-connection-resolvers\";\nimport { mergeResolverMaps } from \"./merge-resolver-maps\";\n\n/**\n * Entities without keys are 'Embedded Data', and we tell graphcache about them to avoid warnings\n * about the inability to normalize them.\n *\n * @see https://nearform.com/open-source/urql/docs/graphcache/normalized-caching/#custom-keys-and-non-keyable-entities\n */\nconst EMBEDDED_DATA = () => null;\n\nexport const omnigraphCacheExchange = cacheExchange({\n schema: introspection,\n keys: {\n // by default, all Entities are assumed to match the Relay spec, and graphcache treats\n // them as keyable by `id`. if it encounters an Entity with no `id` field and no other\n // special handling here in the cacheExchange.keys definitions, it will issue a warning.\n\n // AccountIds are keyable by stringifying them\n AccountId: (data) => {\n if (!data.address) return null;\n if (!data.chainId) return null;\n\n return stringifyAccountId(data as unknown as AccountId);\n },\n\n // These entities are Embedded Data and don't have a relevant key\n Label: EMBEDDED_DATA,\n WrappedBaseRegistrarRegistration: EMBEDDED_DATA,\n },\n resolvers: mergeResolverMaps(\n // produce relayPagination() local resolvers for each t.connection in the schema\n localConnectionResolvers(introspection),\n\n // produce local resolvers that parse BigInt scalar fields from cached strings into native bigint\n localBigIntResolvers(introspection),\n\n // produce local cache resolvers for the Query.entity(by: { }) lookups\n byIdLookupResolvers,\n ),\n});\n","import type { Cache, ResolveInfo, Resolver, Variables } from \"@urql/exchange-graphcache\";\nimport {\n type AccountId,\n type Address,\n makePermissionsId,\n makeRegistryId,\n makeResolverId,\n type PermissionsId,\n type RegistryId,\n type ResolverId,\n} from \"enssdk\";\n\n/**\n * This local resolver delegates to graphcache's built-in cache resolution with the full argument set,\n * effectively telling urql 'not found locally' and to fetch from the network.\n */\nconst passthrough = (args: Variables, cache: Cache, info: ResolveInfo) =>\n cache.resolve(info.parentTypeName, info.fieldName, args);\n\nexport const byIdLookupResolvers: Record<string, Record<string, Resolver>> = {\n Query: {\n domain(parent, args, cache, info) {\n const by = args.by as { id?: string; name?: string };\n\n if (by.id) {\n const v1Key = cache.keyOfEntity({ __typename: \"ENSv1Domain\", id: by.id });\n if (v1Key && cache.resolve(v1Key, \"id\")) return v1Key;\n\n const v2Key = cache.keyOfEntity({ __typename: \"ENSv2Domain\", id: by.id });\n if (v2Key && cache.resolve(v2Key, \"id\")) return v2Key;\n }\n\n return passthrough(args, cache, info);\n },\n account(parent, args, cache, info) {\n const by = args.by as { id?: Address; address?: Address };\n\n if (by.id) return { __typename: \"Account\", id: by.id };\n if (by.address) return { __typename: \"Account\", id: by.address };\n\n return passthrough(args, cache, info);\n },\n registry(parent, args, cache, info) {\n const by = args.by as { id?: RegistryId; contract?: AccountId };\n\n if (by.id) return { __typename: \"Registry\", id: by.id };\n if (by.contract) return { __typename: \"Registry\", id: makeRegistryId(by.contract) };\n\n return passthrough(args, cache, info);\n },\n resolver(parent, args, cache, info) {\n const by = args.by as { id?: ResolverId; contract?: AccountId };\n\n if (by.id) return { __typename: \"Resolver\", id: by.id };\n if (by.contract) return { __typename: \"Resolver\", id: makeResolverId(by.contract) };\n\n return passthrough(args, cache, info);\n },\n permissions(parent, args, cache, info) {\n const by = args.by as { id?: PermissionsId; contract?: AccountId };\n\n if (by.id) return { __typename: \"Permissions\", id: by.id };\n if (by.contract) return { __typename: \"Permissions\", id: makePermissionsId(by.contract) };\n\n return passthrough(args, cache, info);\n },\n },\n};\n","export interface IntrospectionTypeRef {\n readonly kind: string;\n readonly name?: string;\n readonly ofType?: IntrospectionTypeRef | null;\n}\n\nexport interface IntrospectionField {\n readonly name: string;\n readonly type: IntrospectionTypeRef;\n}\n\nexport interface IntrospectionType {\n readonly kind: string;\n readonly name: string;\n readonly fields?: readonly IntrospectionField[] | null;\n}\n\nexport interface IntrospectionSchema {\n readonly __schema: {\n readonly types: readonly IntrospectionType[];\n };\n}\n\nexport function unwrapType(type: IntrospectionTypeRef): IntrospectionTypeRef {\n return type.ofType ? unwrapType(type.ofType) : type;\n}\n","import type { Resolver, ScalarObject } from \"@urql/exchange-graphcache\";\n\nimport {\n type IntrospectionSchema,\n type IntrospectionTypeRef,\n unwrapType,\n} from \"./introspection-helpers\";\n\n// graphcache's ResolverResult type doesn't include bigint, but the value is stored\n// in the normalized cache and returned to the consumer as-is, so bigint works at runtime\n// the load-bearing piece of type inference is in packages/enskit/src/react/omnigraph/graphql.ts where\n// the GraphQL BigInt Scalar is mapped to the `bigint` primitive, which is only supported by these\n// runtime local resolvers.\nconst toBigInt: Resolver = (parent, args, cache, info) => {\n const value = parent[info.fieldName];\n if (value == null) return value;\n return BigInt(value as string) as unknown as ScalarObject;\n};\n\nconst toBigIntList: Resolver = (parent, args, cache, info) => {\n const value = parent[info.fieldName];\n if (value == null) return value;\n\n // now we know value is a (string | null)[], so map to a (bigint | null)[]\n return (value as readonly (string | null)[]).map((v) => (v == null ? v : BigInt(v)));\n};\n\nfunction isBigIntType(type: IntrospectionTypeRef) {\n return unwrapType(type).name === \"BigInt\";\n}\n\n// NOTE: the recursion is to handle not-null-wrapped lists\nfunction isListType(type: IntrospectionTypeRef): boolean {\n if (type.kind === \"LIST\") return true;\n return type.ofType ? isListType(type.ofType) : false;\n}\n\n/**\n * Derives local resolvers that parse BigInt scalar fields from cached strings into native bigint.\n */\nexport function localBigIntResolvers(\n schema: IntrospectionSchema,\n): Record<string, Record<string, Resolver>> {\n const resolvers: Record<string, Record<string, Resolver>> = {};\n\n for (const type of schema.__schema.types) {\n if (type.kind !== \"OBJECT\" || type.name.startsWith(\"__\")) continue;\n\n for (const field of type.fields ?? []) {\n if (!isBigIntType(field.type)) continue;\n\n resolvers[type.name] ??= {};\n resolvers[type.name][field.name] = isListType(field.type) ? toBigIntList : toBigInt;\n }\n }\n\n return resolvers;\n}\n","import type { Resolver } from \"@urql/exchange-graphcache\";\nimport { relayPagination } from \"@urql/exchange-graphcache/extras\";\n\nimport { type IntrospectionSchema, unwrapType } from \"./introspection-helpers\";\n\n/**\n * Derives `relayPagination()` local resolvers for all connection fields in the schema.\n */\nexport function localConnectionResolvers(\n schema: IntrospectionSchema,\n): Record<string, Record<string, Resolver>> {\n const resolvers: Record<string, Record<string, Resolver>> = {};\n\n for (const type of schema.__schema.types) {\n if (type.kind !== \"OBJECT\" || type.name.startsWith(\"__\")) continue;\n\n for (const field of type.fields ?? []) {\n const leaf = unwrapType(field.type);\n if (leaf.name?.endsWith(\"Connection\")) {\n resolvers[type.name] ??= {};\n resolvers[type.name][field.name] = relayPagination();\n }\n }\n }\n\n return resolvers;\n}\n","import type { Resolver } from \"@urql/exchange-graphcache\";\n\n/**\n * deep-merge resolver maps so types appearing in both get all their field resolvers\n */\nexport function mergeResolverMaps<RESOLVER extends Resolver>(\n ...maps: Record<string, Record<string, RESOLVER>>[]\n): Record<string, Record<string, RESOLVER>> {\n const result: Record<string, Record<string, RESOLVER>> = {};\n for (const map of maps) {\n for (const [typeName, fields] of Object.entries(map)) {\n result[typeName] = { ...result[typeName], ...fields };\n }\n }\n return result;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/react/omnigraph/graphql.ts","../../../src/react/omnigraph/hooks.ts","../../../src/react/omnigraph/provider.tsx","../../../src/react/omnigraph/client.ts","../../../src/react/omnigraph/_lib/cache-exchange.ts","../../../src/react/omnigraph/_lib/by-id-lookup-resolvers.ts","../../../src/react/omnigraph/_lib/introspection-helpers.ts","../../../src/react/omnigraph/_lib/local-bigint-resolvers.ts","../../../src/react/omnigraph/_lib/local-connection-resolvers.ts","../../../src/react/omnigraph/_lib/merge-resolver-maps.ts"],"sourcesContent":["import type { introspection, OmnigraphScalars } from \"enssdk/omnigraph\";\nimport { initGraphQLTada } from \"gql.tada\";\n\nexport const graphql = initGraphQLTada<{\n introspection: typeof introspection;\n scalars: Omit<OmnigraphScalars, \"BigInt\"> & {\n // override the default Omnigraph Scalar definitions to include a deserialized BigInt (see cache-exchange.ts)\n BigInt: bigint;\n };\n}>();\n\nexport type { FragmentOf, ResultOf, VariablesOf } from \"gql.tada\";\nexport { readFragment } from \"gql.tada\";\n","\"use client\";\n\nimport type { AnyVariables, OperationContext } from \"@urql/core\";\nimport type { TadaDocumentNode } from \"gql.tada\";\nimport type { DocumentNode } from \"graphql\";\nimport { type UseQueryResponse, useQuery } from \"urql\";\n\nexport type UseOmnigraphQueryArgs<Data = unknown, Variables extends AnyVariables = AnyVariables> = {\n query: DocumentNode | TadaDocumentNode<Data, Variables> | string;\n variables?: Variables;\n pause?: boolean;\n context?: Partial<OperationContext>;\n};\n\nexport type UseOmnigraphQueryResult<\n Data = unknown,\n Variables extends AnyVariables = AnyVariables,\n> = UseQueryResponse<Data, Variables>;\n\nexport function useOmnigraphQuery<Data = unknown, Variables extends AnyVariables = AnyVariables>(\n args: UseOmnigraphQueryArgs<Data, Variables>,\n): UseOmnigraphQueryResult<Data, Variables> {\n return useQuery<Data, Variables>({\n query: args.query as DocumentNode,\n variables: args.variables as Variables,\n pause: args.pause,\n context: args.context,\n });\n}\n","\"use client\";\n\nimport type { EnsNodeClient } from \"enssdk/core\";\nimport { createElement, type ReactElement, type ReactNode, useMemo } from \"react\";\nimport { Provider } from \"urql\";\n\nimport { createOmnigraphUrqlClient } from \"./client\";\n\nexport interface OmnigraphProviderProps {\n client: EnsNodeClient;\n children?: ReactNode;\n}\n\nexport function OmnigraphProvider({ client, children }: OmnigraphProviderProps): ReactElement {\n const urqlClient = useMemo(() => createOmnigraphUrqlClient(client.config), [client]);\n\n return createElement(Provider, { value: urqlClient }, children);\n}\n","import { Client, fetchExchange } from \"@urql/core\";\nimport type { EnsNodeClientConfig } from \"enssdk/core\";\n\nimport { omnigraphCacheExchange } from \"./_lib/cache-exchange\";\n\nexport function createOmnigraphUrqlClient(config: EnsNodeClientConfig) {\n return new Client({\n url: new URL(\"/api/omnigraph\", config.url).href,\n fetch: config.fetch,\n exchanges: [omnigraphCacheExchange, fetchExchange],\n });\n}\n","import { cacheExchange } from \"@urql/exchange-graphcache\";\nimport type { AccountId } from \"enssdk\";\nimport { stringifyAccountId } from \"enssdk\";\nimport { introspection } from \"enssdk/omnigraph\";\n\nimport { byIdLookupResolvers } from \"./by-id-lookup-resolvers\";\nimport { localBigIntResolvers } from \"./local-bigint-resolvers\";\nimport { localConnectionResolvers } from \"./local-connection-resolvers\";\nimport { mergeResolverMaps } from \"./merge-resolver-maps\";\n\n/**\n * Entities without keys are 'Embedded Data', and we tell graphcache about them to avoid warnings\n * about the inability to normalize them.\n *\n * @see https://nearform.com/open-source/urql/docs/graphcache/normalized-caching/#custom-keys-and-non-keyable-entities\n */\nconst EMBEDDED_DATA = () => null;\n\nexport const omnigraphCacheExchange = cacheExchange({\n schema: introspection,\n keys: {\n // by default, all Entities are assumed to match the Relay spec, and graphcache treats\n // them as keyable by `id`. if it encounters an Entity with no `id` field and no other\n // special handling here in the cacheExchange.keys definitions, it will issue a warning.\n\n // AccountIds are keyable by stringifying them\n AccountId: (data) => {\n if (!data.address) return null;\n if (!data.chainId) return null;\n\n return stringifyAccountId(data as unknown as AccountId);\n },\n\n // Accounts are keyable by just `address` if `id` is not provided\n Account: (data) => {\n const key = data.id ?? data.address;\n return typeof key === \"string\" ? key : null;\n },\n\n // These entities are Embedded Data and don't have a relevant key\n Label: EMBEDDED_DATA,\n WrappedBaseRegistrarRegistration: EMBEDDED_DATA,\n },\n resolvers: mergeResolverMaps(\n // produce relayPagination() local resolvers for each t.connection in the schema\n localConnectionResolvers(introspection),\n\n // produce local resolvers that parse BigInt scalar fields from cached strings into native bigint\n localBigIntResolvers(introspection),\n\n // produce local cache resolvers for the Query.entity(by: { }) lookups\n byIdLookupResolvers,\n ),\n});\n","import type { Cache, ResolveInfo, Resolver, Variables } from \"@urql/exchange-graphcache\";\nimport {\n type AccountId,\n type Address,\n makeConcreteRegistryId,\n makePermissionsId,\n makeResolverId,\n type PermissionsId,\n type RegistryId,\n type ResolverId,\n} from \"enssdk\";\n\n/**\n * This local resolver delegates to graphcache's built-in cache resolution with the full argument set,\n * effectively telling urql 'not found locally' and to fetch from the network.\n */\nconst passthrough = (args: Variables, cache: Cache, info: ResolveInfo) =>\n cache.resolve(info.parentTypeName, info.fieldName, args);\n\nexport const byIdLookupResolvers: Record<string, Record<string, Resolver>> = {\n Query: {\n domain(parent, args, cache, info) {\n const by = args.by as { id?: string; name?: string };\n\n if (by.id) {\n const v1Key = cache.keyOfEntity({ __typename: \"ENSv1Domain\", id: by.id });\n if (v1Key && cache.resolve(v1Key, \"id\")) return v1Key;\n\n const v2Key = cache.keyOfEntity({ __typename: \"ENSv2Domain\", id: by.id });\n if (v2Key && cache.resolve(v2Key, \"id\")) return v2Key;\n }\n\n return passthrough(args, cache, info);\n },\n account(parent, args, cache, info) {\n const by = args.by as { id?: Address; address?: Address };\n\n if (by.id) return { __typename: \"Account\", id: by.id };\n if (by.address) return { __typename: \"Account\", id: by.address };\n\n return passthrough(args, cache, info);\n },\n registry(parent, args, cache, info) {\n const by = args.by as { id?: RegistryId; contract?: AccountId };\n\n // see if we have an ENSv1VirtualRegistry by id\n if (by.id) {\n const virtualKey = cache.keyOfEntity({ __typename: \"ENSv1VirtualRegistry\", id: by.id });\n if (virtualKey && cache.resolve(virtualKey, \"id\")) return virtualKey;\n }\n\n // otherwise, fall back to concrete by id or contract\n const id = by.id ?? (by.contract ? makeConcreteRegistryId(by.contract) : undefined);\n if (id) {\n const v1Key = cache.keyOfEntity({ __typename: \"ENSv1Registry\", id });\n if (v1Key && cache.resolve(v1Key, \"id\")) return v1Key;\n\n const v2Key = cache.keyOfEntity({ __typename: \"ENSv2Registry\", id });\n if (v2Key && cache.resolve(v2Key, \"id\")) return v2Key;\n }\n\n return passthrough(args, cache, info);\n },\n resolver(parent, args, cache, info) {\n const by = args.by as { id?: ResolverId; contract?: AccountId };\n\n if (by.id) return { __typename: \"Resolver\", id: by.id };\n if (by.contract) return { __typename: \"Resolver\", id: makeResolverId(by.contract) };\n\n return passthrough(args, cache, info);\n },\n permissions(parent, args, cache, info) {\n const by = args.by as { id?: PermissionsId; contract?: AccountId };\n\n if (by.id) return { __typename: \"Permissions\", id: by.id };\n if (by.contract) return { __typename: \"Permissions\", id: makePermissionsId(by.contract) };\n\n return passthrough(args, cache, info);\n },\n },\n};\n","export interface IntrospectionTypeRef {\n readonly kind: string;\n readonly name?: string;\n readonly ofType?: IntrospectionTypeRef | null;\n}\n\nexport interface IntrospectionField {\n readonly name: string;\n readonly type: IntrospectionTypeRef;\n}\n\nexport interface IntrospectionType {\n readonly kind: string;\n readonly name: string;\n readonly fields?: readonly IntrospectionField[] | null;\n}\n\nexport interface IntrospectionSchema {\n readonly __schema: {\n readonly types: readonly IntrospectionType[];\n };\n}\n\nexport function unwrapType(type: IntrospectionTypeRef): IntrospectionTypeRef {\n return type.ofType ? unwrapType(type.ofType) : type;\n}\n","import type { Resolver, ScalarObject } from \"@urql/exchange-graphcache\";\n\nimport {\n type IntrospectionSchema,\n type IntrospectionTypeRef,\n unwrapType,\n} from \"./introspection-helpers\";\n\n// graphcache's ResolverResult type doesn't include bigint, but the value is stored\n// in the normalized cache and returned to the consumer as-is, so bigint works at runtime\n// the load-bearing piece of type inference is in packages/enskit/src/react/omnigraph/graphql.ts where\n// the GraphQL BigInt Scalar is mapped to the `bigint` primitive, which is only supported by these\n// runtime local resolvers.\nconst toBigInt: Resolver = (parent, args, cache, info) => {\n const value = parent[info.fieldName];\n if (value == null) return value;\n return BigInt(value as string) as unknown as ScalarObject;\n};\n\nconst toBigIntList: Resolver = (parent, args, cache, info) => {\n const value = parent[info.fieldName];\n if (value == null) return value;\n\n // now we know value is a (string | null)[], so map to a (bigint | null)[]\n return (value as readonly (string | null)[]).map((v) => (v == null ? v : BigInt(v)));\n};\n\nfunction isBigIntType(type: IntrospectionTypeRef) {\n return unwrapType(type).name === \"BigInt\";\n}\n\n// NOTE: the recursion is to handle not-null-wrapped lists\nfunction isListType(type: IntrospectionTypeRef): boolean {\n if (type.kind === \"LIST\") return true;\n return type.ofType ? isListType(type.ofType) : false;\n}\n\n/**\n * Derives local resolvers that parse BigInt scalar fields from cached strings into native bigint.\n */\nexport function localBigIntResolvers(\n schema: IntrospectionSchema,\n): Record<string, Record<string, Resolver>> {\n const resolvers: Record<string, Record<string, Resolver>> = {};\n\n for (const type of schema.__schema.types) {\n if (type.kind !== \"OBJECT\" || type.name.startsWith(\"__\")) continue;\n\n for (const field of type.fields ?? []) {\n if (!isBigIntType(field.type)) continue;\n\n resolvers[type.name] ??= {};\n resolvers[type.name][field.name] = isListType(field.type) ? toBigIntList : toBigInt;\n }\n }\n\n return resolvers;\n}\n","import type { Resolver } from \"@urql/exchange-graphcache\";\nimport { relayPagination } from \"@urql/exchange-graphcache/extras\";\n\nimport { type IntrospectionSchema, unwrapType } from \"./introspection-helpers\";\n\n/**\n * Derives `relayPagination()` local resolvers for all connection fields in the schema.\n */\nexport function localConnectionResolvers(\n schema: IntrospectionSchema,\n): Record<string, Record<string, Resolver>> {\n const resolvers: Record<string, Record<string, Resolver>> = {};\n\n for (const type of schema.__schema.types) {\n if (type.kind !== \"OBJECT\" || type.name.startsWith(\"__\")) continue;\n\n for (const field of type.fields ?? []) {\n const leaf = unwrapType(field.type);\n if (leaf.name?.endsWith(\"Connection\")) {\n resolvers[type.name] ??= {};\n resolvers[type.name][field.name] = relayPagination();\n }\n }\n }\n\n return resolvers;\n}\n","import type { Resolver } from \"@urql/exchange-graphcache\";\n\n/**\n * deep-merge resolver maps so types appearing in both get all their field resolvers\n */\nexport function mergeResolverMaps<RESOLVER extends Resolver>(\n ...maps: Record<string, Record<string, RESOLVER>>[]\n): Record<string, Record<string, RESOLVER>> {\n const result: Record<string, Record<string, RESOLVER>> = {};\n for (const map of maps) {\n for (const [typeName, fields] of Object.entries(map)) {\n result[typeName] = { ...result[typeName], ...fields };\n }\n }\n return result;\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "enskit",
3
- "version": "1.10.0",
3
+ "version": "1.11.0",
4
4
  "type": "module",
5
5
  "description": "The ENS toolkit for React applications",
6
6
  "license": "MIT",
@@ -37,7 +37,7 @@
37
37
  "@urql/core": "^6.0.0",
38
38
  "@urql/exchange-graphcache": "^9.0.0",
39
39
  "urql": "^5.0.1",
40
- "enssdk": "1.10.0"
40
+ "enssdk": "1.11.0"
41
41
  },
42
42
  "peerDependencies": {
43
43
  "gql.tada": "^1.8.10",
@@ -54,7 +54,7 @@
54
54
  "typescript": "^5.7.3",
55
55
  "viem": "^2.22.13",
56
56
  "vitest": "^4.0.2",
57
- "@ensnode/shared-configs": "1.10.0"
57
+ "@ensnode/shared-configs": "1.11.0"
58
58
  },
59
59
  "scripts": {
60
60
  "prepublish": "tsup",